diff --git a/frontend/src/components/maps/LocationMapCanvas.jsx b/frontend/src/components/maps/LocationMapCanvas.jsx index 9cb6e21..9b0f167 100644 --- a/frontend/src/components/maps/LocationMapCanvas.jsx +++ b/frontend/src/components/maps/LocationMapCanvas.jsx @@ -146,6 +146,13 @@ export default function LocationMapCanvas({ }; const handleObjectKeyDown = (event, object) => { + if (event.key === "Escape" && (mode === "view" || canEditObjects)) { + event.stopPropagation(); + event.preventDefault(); + setSelectedObjectKey(null); + return; + } + if (["Enter", " ", "Spacebar"].includes(event.key)) { event.stopPropagation(); event.preventDefault(); diff --git a/frontend/tests/location-map-manager.spec.ts b/frontend/tests/location-map-manager.spec.ts index 9fad3bd..6d613af 100644 --- a/frontend/tests/location-map-manager.spec.ts +++ b/frontend/tests/location-map-manager.spec.ts @@ -2541,6 +2541,12 @@ test("viewer map areas are keyboard selectable", async ({ page }) => { await expect(bakeryArea).toHaveAttribute("aria-pressed", "false"); await expect(page.locator(".location-map-sheet-header strong")).toHaveText("Frozen Foods"); await expect(page.locator(".location-map-sheet-count")).toHaveText("0 shown"); + + await page.keyboard.press("Escape"); + await expect(frozenArea).toBeFocused(); + await expect(frozenArea).toHaveAttribute("aria-pressed", "false"); + await expect(page.locator(".location-map-sheet-header strong")).toHaveText("Map Details"); + await expect(page.getByLabel("Map summary")).toBeVisible(); }); test("mobile fit zoom fits the map into the visible canvas", async ({ page }) => {