Apply beacon checkbox changes at runtime and keep the aggregate status chip synchronized. Improve explicit station-map navigation, spatial filter overlays, overlay legend, selected-path contrast, and the documented map screenshot.
5.8 KiB
Map Overlay Legend and Screenshot Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Add a responsive, localized map-overlay legend and document the spatial QRB overlay with the supplied screenshot.
Architecture: A focused Compose legend consumes the same red antenna and theme-aware blue filter colours as the canvas. StationMapWindow derives visibility from the effective antenna and spatial-filter state and places the legend in the existing header FlowRow. Documentation receives a new immutable screenshot asset without repurposing the path-analysis image.
Tech Stack: Kotlin, Compose Multiplatform, generated properties-based i18n, JUnit 5 Compose UI tests, Markdown, Eleventy
Spec: docs/superpowers/specs/2026-11-04-map-overlay-legend-and-screenshot-design.md
Global Constraints
- Preserve map filtering, station selection, antenna heading, rotor control and overlay geometry.
- Reuse existing design tokens and exact overlay colours; add no dependency.
- Keep German and English strings and documentation semantically aligned.
- Keep all changes ungestaged and uncommitted.
Review Focus
- A map with no drawable overlay must not reserve an empty legend area; Task 1 tests both items absent.
- A QRB-only filter must show the blue item without implying QTF is active; Task 1 tests the generic Active filters wording.
- Invalid spatial values must not show the blue item; Task 1 uses
hasRenderableValuesas the gate. - Narrow windows must wrap rather than clip controls; Task 1 retains the existing
FlowRowand adds a narrow rendering assertion. - The screenshot must not replace an image whose caption promises visible path-analysis panels; Task 2 checks all asset references.
Task 1: Localized responsive overlay legend
Files:
- Create:
app-desktop/src/main/kotlin/kst4contest/view/compose/map/MapOverlayLegend.kt - Modify:
app-desktop/src/main/kotlin/kst4contest/view/compose/map/ComposeStationMap.kt - Modify:
app-desktop/src/main/kotlin/kst4contest/view/compose/map/SpatialFilterOverlay.kt - Modify:
app-desktop/src/main/kotlin/kst4contest/view/compose/map/StationMapWindow.kt - Modify:
app-desktop/src/main/i18n/strings_en.properties - Modify:
app-desktop/src/main/i18n/strings_de.properties - Test:
app-desktop/src/test/kotlin/kst4contest/view/compose/map/StationMapWindowScreenTest.kt - Test: existing i18n-generator and translation tests
Interfaces:
-
Consumes: antenna-sector visibility,
SpatialFilterOverlayState.isActive,SpatialFilterOverlayState.hasRenderableValues, current theme. -
Produces:
MapOverlayLegend(showAntenna: Boolean, showSpatialFilters: Boolean, darkMode: Boolean)and shared overlay-colour accessors. -
Step 1: Add failing Compose tests
Assert that the red item appears for a drawable antenna sector, the blue item appears only for an active valid spatial filter, both disappear with neither overlay, and the header remains laid out at a narrow test width.
- Step 2: Run the focused screen test and confirm the missing legend fails
Run: ./gradlew.bat :app-desktop:test --tests kst4contest.view.compose.map.StationMapWindowScreenTest --console=plain
- Step 3: Add localized labels and tooltip text
Add English Antenna, Active filters and the two-colour explanation, with equivalent German strings Antenne, Aktive Filter and its explanation.
- Step 4: Implement the legend with shared colours
Expose the existing antenna colour and theme-aware spatial-filter line colour within the map package. Implement compact colour swatches and labels in MapOverlayLegend.kt, and add the component to the existing header FlowRow with dynamic visibility.
- Step 5: Run focused Compose and i18n tests
Expected: all selected tests pass in both languages; existing map interactions remain unchanged.
Task 2: Replace the outdated general map screenshot
Files:
- Create:
github_docs/station_map_spatial_filters.png - Modify:
github_docs/de-Benutzeroberflaeche.md - Modify:
github_docs/en-User-Interface.md - Modify:
website/src/features/station-map.md - Modify when the durable UI invariant changes:
docs/PROJECT_CONTEXT.md
Interfaces:
-
Consumes: supplied 1257×1016 PNG showing
QRB > 500 kmandQRB ≤ 666 km. -
Produces: one shared manual/website asset copied by Eleventy to
/manual/assets/. -
Step 1: Copy the supplied PNG without resampling
Verify its dimensions and file hash after copying.
- Step 2: Update targeted DE/EN manual references
Use captions that describe the selected path, red antenna sector and blue QRB ring. Remove only the obsolete screenshot note attached to the replaced general map image.
- Step 3: Update the Station Map website feature page
Reference /manual/assets/station_map_spatial_filters.png and retain the older path-analysis image for manual sections where the analysis panels are explicitly described.
- Step 4: Verify asset references and website output
Run: npm.cmd test and npm.cmd run build in website; verify the generated image path exists.
Task 3: Final verification
Files:
- Review all files from Tasks 1 and 2.
Interfaces:
-
Consumes: completed legend, translations and screenshot references.
-
Produces: verified uncommitted working tree.
-
Step 1: Run focused map and translation tests
-
Step 2: Run
./gradlew.bat build --console=plainand inspect test XML plus PMD/SpotBugs reports -
Step 3: Run
git diff --checkand inspectgit status --short --branch -
Step 4: Report native visual checks separately from automated rendering evidence