mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-07 21:59:50 +01:00
Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
88c774339d | ||
|
|
962e6e576c | ||
|
|
07a28c0841 | ||
|
|
1e7ef54c05 | ||
|
|
701270b020 | ||
|
|
84f142683f | ||
|
|
7033652508 | ||
|
|
6c3489aa3d | ||
|
|
82f18c7cff | ||
|
|
875eefe71f | ||
|
|
1972f2b6db | ||
|
|
dd080d9a04 | ||
|
|
933414934c | ||
|
|
dec25762f0 | ||
|
|
a2c9754560 | ||
|
|
0f107d8648 | ||
|
|
1b7b6af84d | ||
|
|
5e38e71229 | ||
|
|
83983d772d | ||
|
|
3e133c10d2 | ||
|
|
6a67873c10 | ||
|
|
588ea9b04e | ||
|
|
68b7fe2b35 | ||
|
|
5643af9845 | ||
|
|
ad3752650b | ||
|
|
8718b4bcee | ||
|
|
f29154cfa4 | ||
|
|
da948f83a1 | ||
|
|
84bb98b007 | ||
|
|
c3a623c329 | ||
|
|
1249724f8a | ||
|
|
4503612bf0 | ||
|
|
9c7a9eb326 | ||
|
|
07e99768e6 | ||
|
|
a63f71d3ee | ||
|
|
76f6b3a4a7 | ||
|
|
7052951a43 | ||
|
|
09b4de08e3 | ||
|
|
82b490c524 | ||
|
|
e0bc45f37e | ||
|
|
6e2197a254 |
71
README.md
71
README.md
@@ -1,12 +1,19 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<br>
|
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="images/homepage-dark.png">
|
<source media="(prefers-color-scheme: dark)" srcset="images/homepage-dark.png">
|
||||||
<img src="images/homepage-light.png" width="65%">
|
<img src="images/homepage-light.png" width="65%">
|
||||||
</picture>
|
</picture>
|
||||||
<br><br>
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
A modern <em>(fully static, fast)</em>, secure <em>(fully proxied)</em>, highly customizable application dashboard with integrations for more than 25 services and translations for 15 languages. Easily configured via YAML files (or discovery via docker labels).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
<img src="images/1.png" />
|
<img src="images/1.png" />
|
||||||
<br>
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
<img src="images/2.png" width="19%" />
|
<img src="images/2.png" width="19%" />
|
||||||
<img src="images/3.png" width="19%" />
|
<img src="images/3.png" width="19%" />
|
||||||
<img src="images/4.png" width="19%" />
|
<img src="images/4.png" width="19%" />
|
||||||
@@ -20,17 +27,18 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img src="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg" alt="Docker"></a>
|
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img src="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg" alt="Docker"></a>
|
||||||
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
|
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Fast! The entire site is statically generated at build time, so you can expect instant load times
|
- **Fast!** The entire site is statically generated at build time, so you can expect instant load times
|
||||||
|
- **Secure!** Every API request to backend services goes through a proxy server, so your API keys are never exposed to the frontend client.
|
||||||
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
|
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
|
||||||
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
|
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
|
||||||
- Full i18n support with automatic language detection
|
- Full i18n support with automatic language detection
|
||||||
- Translations for Chinese, Dutch, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Russian, Spanish and Swedish
|
- Translantions for Chinese, Dutch, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romainian, Russian, Spanish, Swedish and Yue
|
||||||
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
|
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
|
||||||
- Service & Web Bookmarks
|
- Service & Web Bookmarks
|
||||||
- Docker Integration
|
- Docker Integration
|
||||||
@@ -39,17 +47,17 @@
|
|||||||
- Service Integration
|
- Service Integration
|
||||||
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
|
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
|
||||||
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
|
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
|
||||||
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server
|
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentic
|
||||||
- Information Providers
|
- Information Providers
|
||||||
- Coin Market Cap, Mastodon
|
- Coin Market Cap, Mastodon
|
||||||
- Information & Utility Widgets
|
- Information & Utility Widgets
|
||||||
- System Stats (Disk, CPU, Memory)
|
- System Stats (Disk, CPU, Memory)
|
||||||
- Weather via WeatherAPI.com or OpenWeatherMap
|
- Weather via WeatherAPI.com or OpenWeatherMap
|
||||||
- Automatic location detection (with HTTPS), or manual location selection
|
|
||||||
- Search Bar
|
- Search Bar
|
||||||
- Customizable
|
- Customizable
|
||||||
- 21 theme colors with light and dark mode support
|
- 21 theme colors with light and dark mode support
|
||||||
- Background image support
|
- Background image support
|
||||||
|
- Column and Row layout options
|
||||||
|
|
||||||
## Support & Suggestions
|
## Support & Suggestions
|
||||||
|
|
||||||
@@ -140,26 +148,41 @@ Huge thanks to the all the contributors who have helped make this project what i
|
|||||||
|
|
||||||
- [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget
|
- [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget
|
||||||
- [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget
|
- [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget
|
||||||
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish Translation
|
|
||||||
- [andrii-kryvoviaz](https://github.com/benphelps/homepage/commits?author=andrii-kryvoviaz) - Background opacity option
|
- [andrii-kryvoviaz](https://github.com/benphelps/homepage/commits?author=andrii-kryvoviaz) - Background opacity option
|
||||||
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German Translation
|
|
||||||
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål Translation
|
|
||||||
- Daniel Varga - German & Hungarian Translation
|
|
||||||
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch Translation
|
|
||||||
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian Translation
|
|
||||||
- [DevPGSV](https://github.com/benphelps/homepage/commits?author=DevPGSV) - Syncthing Relay Server & Mastodon widgets
|
- [DevPGSV](https://github.com/benphelps/homepage/commits?author=DevPGSV) - Syncthing Relay Server & Mastodon widgets
|
||||||
- [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration
|
- [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration
|
||||||
- [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
|
- [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
|
||||||
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese Translation
|
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission, qBittorrent Integrations & countless more improvements
|
||||||
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission & qBittorrent Integrations
|
- [josways](https://github.com/benphelps/homepage/commits?author=josways) - Baidu search provider
|
||||||
- [juanmanuelbc](https://github.com/benphelps/homepage/commits?author=juanmanuelbc) - Spanish and Catalan Translations
|
- [mauricio-kalil](https://github.com/benphelps/homepage/commits?author=mauricio-kalil) - Portuguese (Brazil)
|
||||||
- [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image
|
- [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image
|
||||||
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese Translation
|
|
||||||
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French Translation
|
|
||||||
- [pacoculebras](https://github.com/benphelps/homepage/commits?author=pacoculebras) - Catalan Translation
|
|
||||||
- [psychodracon](https://github.com/benphelps/homepage/commits?author=psychodracon) - Polish Translation
|
|
||||||
- [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
|
- [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
|
||||||
- [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
|
- [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
|
||||||
- [ShlomiPorush](https://github.com/benphelps/homepage/commits?author=ShlomiPorush) - Hebrew Translation
|
|
||||||
- [SuperDOS](https://github.com/benphelps/homepage/commits?author=SuperDOS) - Swedish Translation
|
|
||||||
- [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration
|
- [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration
|
||||||
|
|
||||||
|
### Translators
|
||||||
|
|
||||||
|
- [3vilson](https://github.com/benphelps/homepage/commits?author=3vilson) - German
|
||||||
|
- [4lenz1](https://github.com/benphelps/homepage/commits?author=4lenz1) - Chinese
|
||||||
|
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish
|
||||||
|
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German
|
||||||
|
- [brunoccr](https://github.com/benphelps/homepage/commits?author=brunoccr) - Portuguese (Brazil)
|
||||||
|
- [C8opmBM](https://github.com/benphelps/homepage/commits?author=C8opmBM) - Romainian
|
||||||
|
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål
|
||||||
|
- Daniel Varga - German & Hungarian
|
||||||
|
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch
|
||||||
|
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian
|
||||||
|
- [ericlokz](https://github.com/benphelps/homepage/commits?author=ericlokz) - Yue
|
||||||
|
- [FunsKiTo](https://github.com/benphelps/homepage/commits?author=FunsKiTo) - Spanish
|
||||||
|
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese
|
||||||
|
- [juanmanuelbc](https://github.com/benphelps/homepage/commits?author=juanmanuelbc) - Spanish and Catalan
|
||||||
|
- [ling0412](https://github.com/benphelps/homepage/commits?author=ling0412) - Chinese
|
||||||
|
- [milotype](https://github.com/benphelps/homepage/commits?author=milotype) - Croatian
|
||||||
|
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese
|
||||||
|
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French
|
||||||
|
- [pacoculebras](https://github.com/benphelps/homepage/commits?author=pacoculebras) - Catalan
|
||||||
|
- [Prilann](https://github.com/benphelps/homepage/commits?author=Prilann) - German
|
||||||
|
- [psychodracon](https://github.com/benphelps/homepage/commits?author=psychodracon) - Polish
|
||||||
|
- Sascha Jelinek - German
|
||||||
|
- [ShlomiPorush](https://github.com/benphelps/homepage/commits?author=ShlomiPorush) - Hebrew
|
||||||
|
- [SuperDOS](https://github.com/benphelps/homepage/commits?author=SuperDOS) - Swedish
|
||||||
|
|||||||
@@ -33,13 +33,14 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Lliure",
|
"free": "Lliure",
|
||||||
"used": "Usat",
|
"used": "Usat",
|
||||||
"load": "Càrrega"
|
"load": "Càrrega",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "Rebut",
|
||||||
"tx": "TX",
|
"tx": "Transmès",
|
||||||
"mem": "MEM",
|
"mem": "Memòria",
|
||||||
"cpu": "CPU",
|
"cpu": "Processador",
|
||||||
"offline": "Fora de línia"
|
"offline": "Fora de línia"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
@@ -170,8 +171,8 @@
|
|||||||
"transferRate": "Velocitat"
|
"transferRate": "Velocitat"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Usuaris",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Inicis de sessió (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,8 @@
|
|||||||
"total": "Gesamt",
|
"total": "Gesamt",
|
||||||
"free": "Frei",
|
"free": "Frei",
|
||||||
"used": "Gebraucht",
|
"used": "Gebraucht",
|
||||||
"load": "Belastung"
|
"load": "Belastung",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
"placeholder": "Search…"
|
"placeholder": "Search…"
|
||||||
},
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
|
"cpu": "CPU",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
|
|||||||
@@ -11,13 +11,14 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Libre",
|
"free": "Libre",
|
||||||
"used": "Usado",
|
"used": "Usado",
|
||||||
"load": "Carga"
|
"load": "Carga",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "Recibido",
|
||||||
"tx": "TX",
|
"tx": "Transmitido",
|
||||||
"mem": "MEM",
|
"mem": "Memoria",
|
||||||
"cpu": "CPU",
|
"cpu": "Procesador",
|
||||||
"offline": "Desconectado"
|
"offline": "Desconectado"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
@@ -171,7 +172,7 @@
|
|||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Usuarios",
|
"users": "Usuarios",
|
||||||
"loginsLast24H": "Accesos (24h)",
|
"loginsLast24H": "Inicios de sesión (24h)",
|
||||||
"failedLoginsLast24H": "Accesos Fallidos (24h)"
|
"failedLoginsLast24H": "Inicios de sesión fallidos (24h)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
178
public/locales/fi/common.json
Normal file
178
public/locales/fi/common.json
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Missing Widget Type: {{type}}",
|
||||||
|
"api_error": "API Error",
|
||||||
|
"status": "Status"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Current Location",
|
||||||
|
"allow": "Click to allow",
|
||||||
|
"updating": "Updating",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Search…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"total": "Total",
|
||||||
|
"free": "Free",
|
||||||
|
"used": "Used",
|
||||||
|
"load": "Load"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Rate",
|
||||||
|
"remaining": "Remaining",
|
||||||
|
"downloaded": "Downloaded"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Rate",
|
||||||
|
"queue": "Queue",
|
||||||
|
"timeleft": "Time Left"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Active",
|
||||||
|
"upload": "Upload",
|
||||||
|
"download": "Download"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"series": "Series"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"movies": "Movies"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"books": "Books"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Upload",
|
||||||
|
"download": "Download",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Routers",
|
||||||
|
"services": "Services",
|
||||||
|
"middleware": "Middleware"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"30days": "30 Days"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Applications",
|
||||||
|
"clients": "Clients",
|
||||||
|
"messages": "Messages"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,7 +11,8 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Libre",
|
"free": "Libre",
|
||||||
"used": "Utilisé",
|
"used": "Utilisé",
|
||||||
"load": "Charge"
|
"load": "Charge",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
|
|||||||
@@ -17,7 +17,8 @@
|
|||||||
"total": "סה\"כ",
|
"total": "סה\"כ",
|
||||||
"free": "פנוי",
|
"free": "פנוי",
|
||||||
"used": "בשימוש",
|
"used": "בשימוש",
|
||||||
"load": "עומס"
|
"load": "עומס",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
"total": "Ukupno",
|
"total": "Ukupno",
|
||||||
"free": "Slobodno",
|
"free": "Slobodno",
|
||||||
"used": "Korišteno",
|
"used": "Korišteno",
|
||||||
"load": "Opterećenje"
|
"load": "Opterećenje",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Stopa",
|
"rate": "Stopa",
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
"total": "Összes",
|
"total": "Összes",
|
||||||
"free": "Szabad",
|
"free": "Szabad",
|
||||||
"used": "Használt",
|
"used": "Használt",
|
||||||
"load": "Terhelés"
|
"load": "Terhelés",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
|
|||||||
@@ -45,7 +45,8 @@
|
|||||||
"total": "Totale",
|
"total": "Totale",
|
||||||
"free": "Libero",
|
"free": "Libero",
|
||||||
"used": "In utilizzo",
|
"used": "In utilizzo",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Attivo",
|
"active": "Attivo",
|
||||||
|
|||||||
@@ -11,7 +11,8 @@
|
|||||||
"total": "Totalt",
|
"total": "Totalt",
|
||||||
"free": "Ledig",
|
"free": "Ledig",
|
||||||
"used": "Brukt",
|
"used": "Brukt",
|
||||||
"load": "Last inn"
|
"load": "Last inn",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Mottatt",
|
"rx": "Mottatt",
|
||||||
|
|||||||
@@ -8,7 +8,8 @@
|
|||||||
"total": "Totaal",
|
"total": "Totaal",
|
||||||
"free": "Vrij",
|
"free": "Vrij",
|
||||||
"used": "Gebruikt",
|
"used": "Gebruikt",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
"used": "Użyte",
|
"used": "Użyte",
|
||||||
"load": "Obciążenie",
|
"load": "Obciążenie",
|
||||||
"total": "Całkowite",
|
"total": "Całkowite",
|
||||||
"free": "Wolne"
|
"free": "Wolne",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"no_active": "Brak aktywnych strumieni",
|
"no_active": "Brak aktywnych strumieni",
|
||||||
|
|||||||
@@ -45,7 +45,8 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Livre",
|
"free": "Livre",
|
||||||
"used": "Usado",
|
"used": "Usado",
|
||||||
"load": "Carregamento"
|
"load": "Carregamento",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
|
|||||||
@@ -11,7 +11,8 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Livre",
|
"free": "Livre",
|
||||||
"used": "Usado",
|
"used": "Usado",
|
||||||
"load": "Carregar"
|
"load": "Carregar",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
"used": "Utilizați",
|
"used": "Utilizați",
|
||||||
"load": "Sarcină",
|
"load": "Sarcină",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Disponibili"
|
"free": "Disponibili",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
|
|||||||
@@ -11,7 +11,8 @@
|
|||||||
"total": "Всего",
|
"total": "Всего",
|
||||||
"free": "Свободно",
|
"free": "Свободно",
|
||||||
"used": "Использовано",
|
"used": "Использовано",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
"load": "Laddar",
|
"load": "Laddar",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Ledigt",
|
"free": "Ledigt",
|
||||||
"used": "Använt"
|
"used": "Använt",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
|
|||||||
@@ -11,7 +11,8 @@
|
|||||||
"total": "Tổng",
|
"total": "Tổng",
|
||||||
"free": "Dư",
|
"free": "Dư",
|
||||||
"used": "Đã dùng",
|
"used": "Đã dùng",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
|
|||||||
@@ -35,7 +35,8 @@
|
|||||||
"total": "全部",
|
"total": "全部",
|
||||||
"free": "剩餘",
|
"free": "剩餘",
|
||||||
"used": "用咗",
|
"used": "用咗",
|
||||||
"load": "負荷"
|
"load": "負荷",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "接收",
|
"rx": "接收",
|
||||||
|
|||||||
@@ -11,7 +11,8 @@
|
|||||||
"total": "共",
|
"total": "共",
|
||||||
"free": "空闲",
|
"free": "空闲",
|
||||||
"used": "已用",
|
"used": "已用",
|
||||||
"load": "负载"
|
"load": "负载",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "接收",
|
"rx": "接收",
|
||||||
|
|||||||
@@ -41,7 +41,8 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "Rate",
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
import ErrorBoundary from "components/errorboundry";
|
||||||
import List from "components/bookmarks/list";
|
import List from "components/bookmarks/list";
|
||||||
|
|
||||||
export default function BookmarksGroup({ group }) {
|
export default function BookmarksGroup({ group }) {
|
||||||
return (
|
return (
|
||||||
<div key={group.name} className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1 p-1">
|
<div key={group.name} className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1 p-1">
|
||||||
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
|
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
|
||||||
<List bookmarks={group.bookmarks} />
|
<ErrorBoundary><List bookmarks={group.bookmarks} /></ErrorBoundary>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
41
src/components/errorboundry.jsx
Normal file
41
src/components/errorboundry.jsx
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
export default class ErrorBoundary extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = { error: null, errorInfo: null };
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidCatch(error, errorInfo) {
|
||||||
|
// Catch errors in any components below and re-render with error message
|
||||||
|
this.setState({
|
||||||
|
error,
|
||||||
|
errorInfo
|
||||||
|
})
|
||||||
|
|
||||||
|
// You can also log error messages to an error reporting service here
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(error, errorInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { error, errorInfo } = this.state;
|
||||||
|
if (errorInfo) {
|
||||||
|
// Error path
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h2>Something went wrong.</h2>
|
||||||
|
<details style={{ whiteSpace: 'pre-wrap' }}>
|
||||||
|
{error && error.toString()}
|
||||||
|
<br />
|
||||||
|
{errorInfo.componentStack}
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normally, just render children
|
||||||
|
const { children } = this.props;
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
|
|
||||||
|
import ErrorBoundary from "components/errorboundry";
|
||||||
import List from "components/services/list";
|
import List from "components/services/list";
|
||||||
|
|
||||||
export default function ServicesGroup({ services, layout }) {
|
export default function ServicesGroup({ services, layout }) {
|
||||||
@@ -12,7 +13,7 @@ export default function ServicesGroup({ services, layout }) {
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
|
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
|
||||||
<List services={services.services} layout={layout} />
|
<ErrorBoundary><List services={services.services} layout={layout} /></ErrorBoundary>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { SettingsContext } from "utils/contexts/settings";
|
|||||||
|
|
||||||
function resolveIcon(icon) {
|
function resolveIcon(icon) {
|
||||||
if (icon.startsWith("http")) {
|
if (icon.startsWith("http")) {
|
||||||
return `/api/proxy?url=${encodeURIComponent(icon)}`;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (icon.startsWith("/")) {
|
if (icon.startsWith("/")) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
|
|
||||||
|
import ErrorBoundary from "components/errorboundry";
|
||||||
import Item from "components/services/item";
|
import Item from "components/services/item";
|
||||||
|
|
||||||
const columnMap = [
|
const columnMap = [
|
||||||
@@ -23,7 +24,7 @@ export default function List({ services, layout }) {
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{services.map((service) => (
|
{services.map((service) => (
|
||||||
<Item key={service.name} service={service} />
|
<ErrorBoundary key={service.name}><Item key={service.name} service={service} /></ErrorBoundary>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export default function Cpu({ expanded }) {
|
|||||||
<div className="flex flex-col ml-3 text-left min-w-[85px]">
|
<div className="flex flex-col ml-3 text-left min-w-[85px]">
|
||||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
<div className="pl-0.5">-</div>
|
<div className="pl-0.5">-</div>
|
||||||
<div className="pr-1">{t("docker.cpu")}</div>
|
<div className="pr-1">{t("resources.cpu")}</div>
|
||||||
</div>
|
</div>
|
||||||
{expanded && (
|
{expanded && (
|
||||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
@@ -59,7 +59,7 @@ export default function Cpu({ expanded }) {
|
|||||||
maximumFractionDigits: 0,
|
maximumFractionDigits: 0,
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
<div className="pr-1">{t("docker.cpu")}</div>
|
<div className="pr-1">{t("resources.cpu")}</div>
|
||||||
</div>
|
</div>
|
||||||
{expanded && (
|
{expanded && (
|
||||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
import https from "https";
|
|
||||||
|
|
||||||
import getRawBody from "raw-body";
|
|
||||||
|
|
||||||
import { httpRequest, httpsRequest } from "utils/proxy/http";
|
|
||||||
|
|
||||||
export const config = {
|
|
||||||
api: {
|
|
||||||
bodyParser: false,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default async function handler(req, res) {
|
|
||||||
const headers = ["X-API-Key", "Authorization"].reduce((obj, key) => {
|
|
||||||
if (req.headers && Object.prototype.hasOwnProperty.call(req.headers, key.toLowerCase())) {
|
|
||||||
// eslint-disable-next-line no-param-reassign
|
|
||||||
obj[key] = req.headers[key.toLowerCase()];
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
}, {});
|
|
||||||
|
|
||||||
const url = new URL(req.query.url);
|
|
||||||
|
|
||||||
if (url.protocol === "https:") {
|
|
||||||
// this agent allows us to bypass the certificate check
|
|
||||||
// which is required for most self-signed certificates
|
|
||||||
const httpsAgent = new https.Agent({
|
|
||||||
rejectUnauthorized: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
const [status, contentType, data] = await httpsRequest(url, {
|
|
||||||
agent: httpsAgent,
|
|
||||||
method: req.method,
|
|
||||||
headers,
|
|
||||||
body:
|
|
||||||
req.method === "GET" || req.method === "HEAD"
|
|
||||||
? null
|
|
||||||
: await getRawBody(req, {
|
|
||||||
encoding: "utf8",
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
res.setHeader("Content-Type", contentType);
|
|
||||||
return res.status(status).send(data);
|
|
||||||
}
|
|
||||||
const [status, contentType, data] = await httpRequest(url, {
|
|
||||||
method: req.method,
|
|
||||||
headers,
|
|
||||||
body:
|
|
||||||
req.method === "GET" || req.method === "HEAD"
|
|
||||||
? null
|
|
||||||
: await getRawBody(req, {
|
|
||||||
encoding: "utf8",
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
res.setHeader("Content-Type", contentType);
|
|
||||||
return res.status(status).send(data);
|
|
||||||
}
|
|
||||||
@@ -8,6 +8,7 @@ import { useEffect, useContext, useState } from "react";
|
|||||||
import { BiError } from "react-icons/bi";
|
import { BiError } from "react-icons/bi";
|
||||||
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
|
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
|
||||||
|
|
||||||
|
import ErrorBoundary from "components/errorboundry";
|
||||||
import ServicesGroup from "components/services/group";
|
import ServicesGroup from "components/services/group";
|
||||||
import BookmarksGroup from "components/bookmarks/group";
|
import BookmarksGroup from "components/bookmarks/group";
|
||||||
import Widget from "components/widgets/widget";
|
import Widget from "components/widgets/widget";
|
||||||
@@ -191,14 +192,14 @@ function Home({ initialSettings }) {
|
|||||||
{widgets
|
{widgets
|
||||||
.filter((widget) => !rightAlignedWidgets.includes(widget.type))
|
.filter((widget) => !rightAlignedWidgets.includes(widget.type))
|
||||||
.map((widget, i) => (
|
.map((widget, i) => (
|
||||||
<Widget key={i} widget={widget} />
|
<ErrorBoundary key={i}><Widget key={i} widget={widget} /></ErrorBoundary>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
<div className="ml-4 flex flex-wrap basis-full grow sm:basis-auto justify-between md:justify-end mt-2 md:mt-0">
|
<div className="ml-4 flex flex-wrap basis-full grow sm:basis-auto justify-between md:justify-end mt-2 md:mt-0">
|
||||||
{widgets
|
{widgets
|
||||||
.filter((widget) => rightAlignedWidgets.includes(widget.type))
|
.filter((widget) => rightAlignedWidgets.includes(widget.type))
|
||||||
.map((widget, i) => (
|
.map((widget, i) => (
|
||||||
<Widget key={i} widget={widget} />
|
<ErrorBoundary key={i}><Widget key={i} widget={widget} /></ErrorBoundary>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
@@ -208,7 +209,7 @@ function Home({ initialSettings }) {
|
|||||||
{services && (
|
{services && (
|
||||||
<div className="flex flex-wrap p-8 items-start">
|
<div className="flex flex-wrap p-8 items-start">
|
||||||
{services.map((group) => (
|
{services.map((group) => (
|
||||||
<ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} />
|
<ErrorBoundary key={group.name}><ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} /></ErrorBoundary>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -216,7 +217,7 @@ function Home({ initialSettings }) {
|
|||||||
{bookmarks && (
|
{bookmarks && (
|
||||||
<div className="grow flex flex-wrap pt-0 p-8">
|
<div className="grow flex flex-wrap pt-0 p-8">
|
||||||
{bookmarks.map((group) => (
|
{bookmarks.map((group) => (
|
||||||
<BookmarksGroup key={group.name} group={group} />
|
<ErrorBoundary key={group.name}><BookmarksGroup key={group.name} group={group} /></ErrorBoundary>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
BIN
src/styles/font/Manrope.ttf
Normal file
BIN
src/styles/font/Manrope.ttf
Normal file
Binary file not shown.
@@ -13,6 +13,9 @@ html,
|
|||||||
body {
|
body {
|
||||||
font-family: Manrope, "Manrope-Fallback", Arial, sans-serif;
|
font-family: Manrope, "Manrope-Fallback", Arial, sans-serif;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
#page_wrapper {
|
#page_wrapper {
|
||||||
|
|||||||
@@ -13,49 +13,16 @@
|
|||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Manrope";
|
font-family: "Manrope";
|
||||||
font-weight: 200;
|
font-weight: 200 800;
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
font-style: normal;
|
||||||
|
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2"), url("./font/Manrope.ttf") format("ttf");
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Manrope";
|
font-family: "Manrope";
|
||||||
font-weight: 300;
|
font-weight: 200 800;
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
fint-style: italic;
|
||||||
font-display: swap;
|
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2"), url("./font/Manrope.ttf") format("ttf");
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 400;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 500;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 600;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 700;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Manrope";
|
|
||||||
font-weight: 800;
|
|
||||||
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
|
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
const { data: speedtestData, error: speedtestError } = useWidgetAPI(widget, "speedtest/latest");
|
const { data: speedtestData, error: speedtestError } = useWidgetAPI(widget, "speedtest/latest");
|
||||||
|
|
||||||
if (speedtestError) {
|
if (speedtestError || (speedtestData && !speedtestData.data)) {
|
||||||
return <Container error={t("widget.api_error")} />;
|
return <Container error={t("widget.api_error")} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,10 +31,7 @@ export default function Component({ service }) {
|
|||||||
label="speedtest.download"
|
label="speedtest.download"
|
||||||
value={t("common.bitrate", { value: speedtestData.data.download * 1024 * 1024 })}
|
value={t("common.bitrate", { value: speedtestData.data.download * 1024 * 1024 })}
|
||||||
/>
|
/>
|
||||||
<Block
|
<Block label="speedtest.upload" value={t("common.bitrate", { value: speedtestData.data.upload * 1024 * 1024 })} />
|
||||||
label="speedtest.upload"
|
|
||||||
value={t("common.bitrate", { value: speedtestData.data.upload * 1024 * 1024 })}
|
|
||||||
/>
|
|
||||||
<Block
|
<Block
|
||||||
label="speedtest.ping"
|
label="speedtest.ping"
|
||||||
value={t("common.ms", {
|
value={t("common.ms", {
|
||||||
|
|||||||
Reference in New Issue
Block a user