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

+17 -6
View File
@@ -400,17 +400,28 @@ export function ClientView({
boxShadow: "inset 0 1px 0 rgba(255,255,255,0.20)",
}}
role="status"
aria-label={
emulatorOk === null
? tToolbar("emulatorUnknown")
: emulatorOk
? tToolbar("emulatorOnline")
: tToolbar("emulatorOffline")
}
title={
emulatorOk === false
? tToolbar("emulatorOffline")
: tToolbar("emulatorOnline")
emulatorOk === null
? tToolbar("emulatorUnknown")
: emulatorOk
? tToolbar("emulatorOnline")
: tToolbar("emulatorOffline")
}
>
<span className="relative flex h-2.5 w-2.5">
{emulatorOk === false ? (
<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)]" />
) : (
{emulatorOk === null ? (
<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-destructive ring-2 ring-destructive/30 shadow-[0_0_8px_rgba(239,68,68,0.8)]" />
)}
</span>
</div>
+2 -1
View File
@@ -21,6 +21,7 @@
"dragToMove": "اسحب للتحريك",
"hide": "إخفاء الشريط",
"fullscreenExit": "الخروج من ملء الشاشة",
"show": "إظهار الشريط"
"show": "إظهار الشريط",
"emulatorUnknown": "حالة المحاكي غير معروفة"
}
}
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Влачете за преместване",
"hide": "Скрий лентата",
"fullscreenExit": "Изход от цял екран",
"show": "Покажи лентата"
"show": "Покажи лентата",
"emulatorUnknown": "Състоянието на емулатора е неизвестно"
}
}
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Přetažením přesunete",
"hide": "Skrýt lištu",
"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",
"hide": "Skjul værktøjslinje",
"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",
"hide": "Leiste ausblenden",
"fullscreenExit": "Vollbild beenden",
"show": "Leiste anzeigen"
"show": "Leiste anzeigen",
"emulatorUnknown": "Emulatorstatus unbekannt"
}
}
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Σύρετε για μετακίνηση",
"hide": "Απόκρυψη γραμμής",
"fullscreenExit": "Έξοδος από πλήρη οθόνη",
"show": "Εμφάνιση γραμμής"
"show": "Εμφάνιση γραμμής",
"emulatorUnknown": "Άγνωστη κατάσταση εξομοιωτή"
}
}
+2 -1
View File
@@ -3333,6 +3333,7 @@
"dragToMove": "Drag to move",
"hide": "Hide toolbar",
"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",
"hide": "Ocultar barra",
"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",
"hide": "Piilota työkalupalkki",
"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",
"hide": "Masquer la barre",
"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",
"hide": "Sakrij traku",
"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",
"hide": "Sáv elrejtése",
"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",
"hide": "Nascondi barra",
"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": "ドラッグして移動",
"hide": "ツールバーを隠す",
"fullscreenExit": "全画面を終了",
"show": "ツールバーを表示"
"show": "ツールバーを表示",
"emulatorUnknown": "エミュレータの状態が不明です"
}
}
+2 -1
View File
@@ -3277,6 +3277,7 @@
"dragToMove": "Sleep om te verplaatsen",
"hide": "Werkbalk verbergen",
"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",
"hide": "Skjul verktøylinje",
"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ść",
"hide": "Ukryj pasek",
"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",
"hide": "Ocultar barra",
"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",
"hide": "Ascunde bara",
"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": "Перетащите, чтобы переместить",
"hide": "Скрыть панель",
"fullscreenExit": "Выйти из полноэкранного режима",
"show": "Показать панель"
"show": "Показать панель",
"emulatorUnknown": "Состояние эмулятора неизвестно"
}
}
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Potiahnite na presun",
"hide": "Skryť panel",
"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": "Превуците да померите",
"hide": "Сакриј траку",
"fullscreenExit": "Изађи из целог екрана",
"show": "Прикажи траку"
"show": "Прикажи траку",
"emulatorUnknown": "Статус емулатора непознат"
}
}
+2 -1
View File
@@ -3274,6 +3274,7 @@
"dragToMove": "Dra för att flytta",
"hide": "Dölj verktygsfält",
"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",
"hide": "Araç çubuğunu gizle",
"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": "Перетягніть, щоб перемістити",
"hide": "Сховати панель",
"fullscreenExit": "Вийти з повноекранного режиму",
"show": "Показати панель"
"show": "Показати панель",
"emulatorUnknown": "Стан емулятора невідомий"
}
}