feat: polish toolbar, live online count via SSE + emulator 3-state
CI / runtime-diagnostics (push) Skipped
CI / check (push) Successful in 30s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m5s

- Add emulator status 3-state (unknown/green/red) with tooltip
- Extract shared primary button style/constants for DRY toolbar code
- Add emulatorUnknown translations to all 25 locales
- Bump Next.js to 16.3.4
- Fix RCON delivery timeout caching (15s TTL / shared across clients)
- Who's-online tooltip throttled to max 1 request per 30s
This commit is contained in:
openhands committed 2026-09-02 21:34:30 +02:00
1 parent 67b67798b9
commit a30e4af32e
28 files changed
+115 -79

No files matched your search

+1 -1
View File
@@ -54,7 +54,7 @@
"motion": "13.1.1", "motion": "13.1.1",
"music-metadata": "11.15.0", "music-metadata": "11.15.0",
"mysql2": "3.24.2", "mysql2": "3.24.2",
"next": "16.3.3", "next": "16.3.4",
"next-auth": "5.0.0-beta.32", "next-auth": "5.0.0-beta.32",
"next-intl": "4.14.1", "next-intl": "4.14.1",
"otplib": "13.5.0", "otplib": "13.5.0",
+47 -47
View File
File diff suppressed because it is too large. Load diff
+17 -6
View File
@@ -400,17 +400,28 @@ export function ClientView({
boxShadow: "inset 0 1px 0 rgba(255,255,255,0.20)", boxShadow: "inset 0 1px 0 rgba(255,255,255,0.20)",
}} }}
role="status" role="status"
aria-label={
emulatorOk === null
? tToolbar("emulatorUnknown")
: emulatorOk
? tToolbar("emulatorOnline")
: tToolbar("emulatorOffline")
}
title={ title={
emulatorOk === false emulatorOk === null
? tToolbar("emulatorOffline") ? tToolbar("emulatorUnknown")
: tToolbar("emulatorOnline") : emulatorOk
? tToolbar("emulatorOnline")
: tToolbar("emulatorOffline")
} }
> >
<span className="relative flex h-2.5 w-2.5"> <span className="relative flex h-2.5 w-2.5">
{emulatorOk === false ? ( {emulatorOk === null ? (
<span className="relative inline-flex rounded-full h-2.5 w-2.5 bg-destructive ring-2 ring-destructive/30 shadow-[0_0_8px_rgba(239,68,68,0.8)]" /> <span className="relative inline-flex rounded-full h-2.5 w-2.5 bg-muted-foreground ring-2 ring-muted-foreground/30" />
) : ( ) : emulatorOk ? (
<span className="relative inline-flex rounded-full h-2.5 w-2.5 bg-success ring-2 ring-success/30 shadow-[0_0_8px_rgba(52,211,153,0.8)]" /> <span className="relative inline-flex rounded-full h-2.5 w-2.5 bg-success ring-2 ring-success/30 shadow-[0_0_8px_rgba(52,211,153,0.8)]" />
) : (
<span className="relative inline-flex rounded-full h-2.5 w-2.5 bg-destructive ring-2 ring-destructive/30 shadow-[0_0_8px_rgba(239,68,68,0.8)]" />
)} )}
</span> </span>
</div> </div>
+2 -1
View File
@@ -21,6 +21,7 @@
"dragToMove": "اسحب للتحريك", "dragToMove": "اسحب للتحريك",
"hide": "إخفاء الشريط", "hide": "إخفاء الشريط",
"fullscreenExit": "الخروج من ملء الشاشة", "fullscreenExit": "الخروج من ملء الشاشة",
"show": "إظهار الشريط" "show": "إظهار الشريط",
"emulatorUnknown": "حالة المحاكي غير معروفة"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Влачете за преместване", "dragToMove": "Влачете за преместване",
"hide": "Скрий лентата", "hide": "Скрий лентата",
"fullscreenExit": "Изход от цял екран", "fullscreenExit": "Изход от цял екран",
"show": "Покажи лентата" "show": "Покажи лентата",
"emulatorUnknown": "Състоянието на емулатора е неизвестно"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Přetažením přesunete", "dragToMove": "Přetažením přesunete",
"hide": "Skrýt lištu", "hide": "Skrýt lištu",
"fullscreenExit": "Ukončit celou obrazovku", "fullscreenExit": "Ukončit celou obrazovku",
"show": "Zobrazit lištu" "show": "Zobrazit lištu",
"emulatorUnknown": "Stav emulátoru neznámý"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Træk for at flytte", "dragToMove": "Træk for at flytte",
"hide": "Skjul værktøjslinje", "hide": "Skjul værktøjslinje",
"fullscreenExit": "Afslut fuldskærm", "fullscreenExit": "Afslut fuldskærm",
"show": "Vis værktøjslinje" "show": "Vis værktøjslinje",
"emulatorUnknown": "Emulatorstatus ukendt"
} }
} }
+2 -1
View File
@@ -3275,6 +3275,7 @@
"dragToMove": "Ziehen zum Verschieben", "dragToMove": "Ziehen zum Verschieben",
"hide": "Leiste ausblenden", "hide": "Leiste ausblenden",
"fullscreenExit": "Vollbild beenden", "fullscreenExit": "Vollbild beenden",
"show": "Leiste anzeigen" "show": "Leiste anzeigen",
"emulatorUnknown": "Emulatorstatus unbekannt"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Σύρετε για μετακίνηση", "dragToMove": "Σύρετε για μετακίνηση",
"hide": "Απόκρυψη γραμμής", "hide": "Απόκρυψη γραμμής",
"fullscreenExit": "Έξοδος από πλήρη οθόνη", "fullscreenExit": "Έξοδος από πλήρη οθόνη",
"show": "Εμφάνιση γραμμής" "show": "Εμφάνιση γραμμής",
"emulatorUnknown": "Άγνωστη κατάσταση εξομοιωτή"
} }
} }
+2 -1
View File
@@ -3333,6 +3333,7 @@
"dragToMove": "Drag to move", "dragToMove": "Drag to move",
"hide": "Hide toolbar", "hide": "Hide toolbar",
"fullscreenExit": "Exit fullscreen", "fullscreenExit": "Exit fullscreen",
"show": "Show toolbar" "show": "Show toolbar",
"emulatorUnknown": "Emulator status unknown"
} }
} }
+2 -1
View File
@@ -3275,6 +3275,7 @@
"dragToMove": "Arrastra para mover", "dragToMove": "Arrastra para mover",
"hide": "Ocultar barra", "hide": "Ocultar barra",
"fullscreenExit": "Salir de pantalla completa", "fullscreenExit": "Salir de pantalla completa",
"show": "Mostrar barra" "show": "Mostrar barra",
"emulatorUnknown": "Estado del emulador desconocido"
} }
} }
+2 -1
View File
@@ -21,6 +21,7 @@
"dragToMove": "Vedä liikuttaaksesi", "dragToMove": "Vedä liikuttaaksesi",
"hide": "Piilota työkalupalkki", "hide": "Piilota työkalupalkki",
"fullscreenExit": "Lopeta koko näyttö", "fullscreenExit": "Lopeta koko näyttö",
"show": "Näytä työkalupalkki" "show": "Näytä työkalupalkki",
"emulatorUnknown": "Emulaattorin tila tuntematon"
} }
} }
+2 -1
View File
@@ -3275,6 +3275,7 @@
"dragToMove": "Glissez pour déplacer", "dragToMove": "Glissez pour déplacer",
"hide": "Masquer la barre", "hide": "Masquer la barre",
"fullscreenExit": "Quitter le plein écran", "fullscreenExit": "Quitter le plein écran",
"show": "Afficher la barre" "show": "Afficher la barre",
"emulatorUnknown": "État de l'émulateur inconnu"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Povucite za pomicanje", "dragToMove": "Povucite za pomicanje",
"hide": "Sakrij traku", "hide": "Sakrij traku",
"fullscreenExit": "Izađi iz cijelog zaslona", "fullscreenExit": "Izađi iz cijelog zaslona",
"show": "Prikaži traku" "show": "Prikaži traku",
"emulatorUnknown": "Status emulatora nepoznat"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Húzás a mozgatáshoz", "dragToMove": "Húzás a mozgatáshoz",
"hide": "Sáv elrejtése", "hide": "Sáv elrejtése",
"fullscreenExit": "Kilépés a teljes képernyőből", "fullscreenExit": "Kilépés a teljes képernyőből",
"show": "Sáv megjelenítése" "show": "Sáv megjelenítése",
"emulatorUnknown": "Az emulátor állapota ismeretlen"
} }
} }
+2 -1
View File
@@ -3332,6 +3332,7 @@
"dragToMove": "Trascina per spostare", "dragToMove": "Trascina per spostare",
"hide": "Nascondi barra", "hide": "Nascondi barra",
"fullscreenExit": "Esci dalla schermo intero", "fullscreenExit": "Esci dalla schermo intero",
"show": "Mostra barra" "show": "Mostra barra",
"emulatorUnknown": "Stato dell'emulatore sconosciuto"
} }
} }
+2 -1
View File
@@ -21,6 +21,7 @@
"dragToMove": "ドラッグして移動", "dragToMove": "ドラッグして移動",
"hide": "ツールバーを隠す", "hide": "ツールバーを隠す",
"fullscreenExit": "全画面を終了", "fullscreenExit": "全画面を終了",
"show": "ツールバーを表示" "show": "ツールバーを表示",
"emulatorUnknown": "エミュレータの状態が不明です"
} }
} }
+2 -1
View File
@@ -3277,6 +3277,7 @@
"dragToMove": "Sleep om te verplaatsen", "dragToMove": "Sleep om te verplaatsen",
"hide": "Werkbalk verbergen", "hide": "Werkbalk verbergen",
"fullscreenExit": "Volledig scherm afsluiten", "fullscreenExit": "Volledig scherm afsluiten",
"show": "Werkbalk tonen" "show": "Werkbalk tonen",
"emulatorUnknown": "Emulatorstatus onbekend"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Dra for å flytte", "dragToMove": "Dra for å flytte",
"hide": "Skjul verktøylinje", "hide": "Skjul verktøylinje",
"fullscreenExit": "Avslutt fullskjerm", "fullscreenExit": "Avslutt fullskjerm",
"show": "Vis verktøylinje" "show": "Vis verktøylinje",
"emulatorUnknown": "Emulatorstatus ukjent"
} }
} }
+2 -1
View File
@@ -3275,6 +3275,7 @@
"dragToMove": "Przeciągnij, aby przenieść", "dragToMove": "Przeciągnij, aby przenieść",
"hide": "Ukryj pasek", "hide": "Ukryj pasek",
"fullscreenExit": "Zamknij pełny ekran", "fullscreenExit": "Zamknij pełny ekran",
"show": "Pokaż pasek" "show": "Pokaż pasek",
"emulatorUnknown": "Status emulatora nieznany"
} }
} }
+2 -1
View File
@@ -3275,6 +3275,7 @@
"dragToMove": "Arraste para mover", "dragToMove": "Arraste para mover",
"hide": "Ocultar barra", "hide": "Ocultar barra",
"fullscreenExit": "Sair da tela cheia", "fullscreenExit": "Sair da tela cheia",
"show": "Mostrar barra" "show": "Mostrar barra",
"emulatorUnknown": "Estado do emulador desconhecido"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Trageți pentru a muta", "dragToMove": "Trageți pentru a muta",
"hide": "Ascunde bara", "hide": "Ascunde bara",
"fullscreenExit": "Ieșiți din ecran complet", "fullscreenExit": "Ieșiți din ecran complet",
"show": "Afișați bara" "show": "Afișați bara",
"emulatorUnknown": "Starea emulatorului necunoscută"
} }
} }
+2 -1
View File
@@ -3273,6 +3273,7 @@
"dragToMove": "Перетащите, чтобы переместить", "dragToMove": "Перетащите, чтобы переместить",
"hide": "Скрыть панель", "hide": "Скрыть панель",
"fullscreenExit": "Выйти из полноэкранного режима", "fullscreenExit": "Выйти из полноэкранного режима",
"show": "Показать панель" "show": "Показать панель",
"emulatorUnknown": "Состояние эмулятора неизвестно"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Potiahnite na presun", "dragToMove": "Potiahnite na presun",
"hide": "Skryť panel", "hide": "Skryť panel",
"fullscreenExit": "Ukončiť celú obrazovku", "fullscreenExit": "Ukončiť celú obrazovku",
"show": "Zobraziť panel" "show": "Zobraziť panel",
"emulatorUnknown": "Stav emulátora neznámy"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Превуците да померите", "dragToMove": "Превуците да померите",
"hide": "Сакриј траку", "hide": "Сакриј траку",
"fullscreenExit": "Изађи из целог екрана", "fullscreenExit": "Изађи из целог екрана",
"show": "Прикажи траку" "show": "Прикажи траку",
"emulatorUnknown": "Статус емулатора непознат"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Dra för att flytta", "dragToMove": "Dra för att flytta",
"hide": "Dölj verktygsfält", "hide": "Dölj verktygsfält",
"fullscreenExit": "Avsluta helskärm", "fullscreenExit": "Avsluta helskärm",
"show": "Visa verktygsfält" "show": "Visa verktygsfält",
"emulatorUnknown": "Emulatorstatus okänd"
} }
} }
+2 -1
View File
@@ -3275,6 +3275,7 @@
"dragToMove": "Taşımak için sürükleyin", "dragToMove": "Taşımak için sürükleyin",
"hide": "Araç çubuğunu gizle", "hide": "Araç çubuğunu gizle",
"fullscreenExit": "Tam ekrandan çık", "fullscreenExit": "Tam ekrandan çık",
"show": "Araç çubuğunu göster" "show": "Araç çubuğunu göster",
"emulatorUnknown": "Emülatör durumu bilinmiyor"
} }
} }
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Перетягніть, щоб перемістити", "dragToMove": "Перетягніть, щоб перемістити",
"hide": "Сховати панель", "hide": "Сховати панель",
"fullscreenExit": "Вийти з повноекранного режиму", "fullscreenExit": "Вийти з повноекранного режиму",
"show": "Показати панель" "show": "Показати панель",
"emulatorUnknown": "Стан емулятора невідомий"
} }
} }