From f920ff8a59909ff7771ddc0db90dc95100ab6268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 8 Oct 2026 07:04:25 +0500 Subject: [PATCH] Fix the stray window scrollbar, the Overview button overflow and show one card per realm - The main area and the console log are now positioning contexts, so screen-reader-only text inside them can no longer extend the whole window (the second scrollbar in the update dialog and the window scroll on the Console database tab). - The client button group on the server card wraps instead of leaving the card. - With both worlds starting together, each realm gets its own card. Co-Authored-By: Claude Sonnet 5.5 --- src/screens/ConsolePage.tsx | 2 +- src/screens/Overview.tsx | 40 ++++++++++++++++++++++++++++++++++--- src/screens/Shell.tsx | 2 +- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/screens/ConsolePage.tsx b/src/screens/ConsolePage.tsx index dfcef3d..945930d 100644 --- a/src/screens/ConsolePage.tsx +++ b/src/screens/ConsolePage.tsx @@ -103,7 +103,7 @@ export function ConsolePage({ serverId }: { serverId: string }) { -
+
{missing ?

{missing}

: lines.length === 0 ?

{t("con.empty")}

: lines.map((l, i) => (
{l.level !== "info" && {l.level}: } diff --git a/src/screens/Overview.tsx b/src/screens/Overview.tsx index a288bb7..ee3ebac 100644 --- a/src/screens/Overview.tsx +++ b/src/screens/Overview.tsx @@ -68,6 +68,19 @@ export function Overview({ server, companions = true, onForget, onOpenUpdates, o const t = useT(); const human = useHuman(); const [status, setStatus] = useState(null); + // With both worlds started together, each realm gets its own card; the first realm owns the database and auth. + const [realms, setRealms] = useState<{ first: string; second: string } | null>(null); + const bothWorlds = !!status?.observed.secondary_world; + useEffect(() => { + if (!bothWorlds) { setRealms(null); return; } + let alive = true; + void api.realmProfiles(server.id).then((r) => { + if (!alive) return; + const name = (m: "coa" | "wildcard") => (m === "coa" ? "Conquest of Azeroth" : "Wildcard"); + setRealms({ first: name(r.active), second: name(r.active === "coa" ? "wildcard" : "coa") }); + }).catch(() => { if (alive) setRealms(null); }); + return () => { alive = false; }; + }, [bothWorlds, server.id]); const [action, setAction] = useState(null); const [realmBusy, setRealmBusy] = useState(false); const [failure, setFailure] = useState(null); @@ -220,7 +233,7 @@ export function Overview({ server, companions = true, onForget, onOpenUpdates, o { onRealmChanged(); void poll(); }} /> -
{t("overview.server")}
+
{realms ? `${realms.first} · ${t("overview.server")}` : t("overview.server")}
- {secondary_world && }
@@ -301,7 +313,7 @@ export function Overview({ server, companions = true, onForget, onOpenUpdates, o {t("btn.stopSmall")} )} -
+
{client && } {client && jobBusy ? (
+ {secondary_world && ( + +
{realms ? `${realms.second} · ${t("overview.server")}` : t("realm.secondWorld")}
+
+ + {secondary_world.state === "running" ? t("status.online") : secondary_world.state === "starting" ? t("status.starting") : t("status.offline")} +
+
+ +
+
+
{t("overview.uptime")}
+
{secondary_world.state === "running" ? formatUptime(secondary_world.uptime_secs) : "—"}
+
+

{t("realm.bothRunning")}

+
+ )} + {conflict && !anyUp && (

{t("overview.portTitle")}

diff --git a/src/screens/Shell.tsx b/src/screens/Shell.tsx index 4a6b134..cf3fcfb 100644 --- a/src/screens/Shell.tsx +++ b/src/screens/Shell.tsx @@ -125,7 +125,7 @@ export function Shell(props: {
-
+
{page === "overview" ? ( props.onForget(server.id)} onOpenUpdates={() => setPage("settings")} onRealmChanged={reloadModules} onReport={() => setPage("report")} /> ) : page === "bots" || page === "server" ? (