+
Main viewport 960 × 540 CSS · 1920 × 1080 · 120Hz
- {top}
+
{top}
AYN THOR
Context display 620 × 540 CSS · 1240 × 1080 · 60Hz
- {bottom}
+
{bottom}
+
setActiveSurface(activeSurfaceRef.current === "top" ? "bottom" : "top")}
+ aria-label={activeSurface === "top" ? "Open tactical display" : "Return to main display"}
+ >
+ {activeSurface === "top" ? "Tactical" : "Main"} SELECT / TAB
+
);
}
diff --git a/src/components/FrontEnd.tsx b/src/components/FrontEnd.tsx
index 55db5ce..981fc63 100644
--- a/src/components/FrontEnd.tsx
+++ b/src/components/FrontEnd.tsx
@@ -7,6 +7,7 @@ import { useMenuController, type MenuAction } from "../input/useMenuController";
import { HEALER_CLASSES, HEALER_CLASS_ORDER } from "../game/healers";
import { BOSS_DEFINITIONS, BOSS_ORDER } from "../game/bossCatalog";
import type { BossId } from "../game/types";
+import { requestDisplaySurface } from "../platform/displayRouting";
import { DualDisplayFrame } from "./DualDisplayFrame";
function FocusButton({
@@ -151,6 +152,11 @@ function SaveScreen() {
const openCreation = () => {
setHunterName("");
setDialog("create");
+ requestDisplaySurface("top");
+ };
+ const openSaveDialog = (nextDialog: "copy" | "delete") => {
+ setDialog(nextDialog);
+ requestDisplaySurface("top");
};
const actions = useMemo
(() => dialog === "create"
@@ -170,8 +176,8 @@ function SaveScreen() {
{ id: hasLocal ? "play" : "create", run: () => hasLocal ? playSlot(selectedSlotId) : openCreation() },
{ id: "upload", run: () => uploadSlot(selectedSlotId), enabled: hasLocal && Boolean(accountId) },
{ id: "download", run: () => downloadSlot(selectedSlotId), enabled: hasOnline && Boolean(accountId) },
- { id: "copy", run: () => setDialog("copy"), enabled: hasLocal },
- { id: "delete", run: () => setDialog("delete"), enabled: hasLocal },
+ { id: "copy", run: () => openSaveDialog("copy"), enabled: hasLocal },
+ { id: "delete", run: () => openSaveDialog("delete"), enabled: hasLocal },
{ id: "back", run: () => navigate("login") },
], [accountId, copySlot, createSlot, deleteSlot, dialog, downloadSlot, hasLocal, hasOnline, hunterName, navigate, playSlot, selectSlot, selectedSlotId, slots, uploadSlot]);
const controller = useMenuController(actions, { onBack: () => dialog ? setDialog(null) : navigate("login") });
@@ -261,8 +267,8 @@ function SaveScreen() {
downloadSlot(selectedSlotId)}>↓ Overwrite with online