Files
suaveplan/openspec/changes/enterprise-gaming-react-game-map/proposal.md
2026-05-27 23:29:53 +01:00

2.7 KiB

OpenSpec Change: enterprise-gaming-react-game-map

  • Change ID: enterprise-gaming-react-game-map
  • Package: @suaveplan/react-game-map
  • Category: gaming/react
  • Target path: gaming/react/react-game-map
  • Status: PROPOSED
  • Date: 2026-04-24
  • Reference spec: /mnt/s/web/suaveplan/enterprise/react-game-map.md

Summary

Deliver @suaveplan/react-game-map on the genesis branch from scratch at enterprise quality. The package provides headless state management for 2D world maps in games. A MapStateManager tracks the world-space viewport, entity marker positions, fog-of-war revealed cells, custom icons, and overlays; useGameMap() exposes it via useSyncExternalStore. Canvas rendering helpers paint the background tile layer, entity markers, and fog-of-war cells. Storybook stories demonstrate a scrollable interactive map with entity tracking. Genesis adds typed schemas, structured errors, and 100% coverage.


Current-state audit (genesis)

Package does not exist on genesis yet — fresh build.


Available workspace deps on genesis

Package Role
@suaveplan/error (workspace:^) GameMapError
@suaveplan/events (workspace:^) Entity position update subscriptions
react (catalog:react) React 18

Public API surface

interface MapState {
  viewport: { x: number; y: number; zoom: number }
  markers: MapMarker[]
  fogCells: Set<string>   // "cx,cy" revealed cell keys
  overlays: MapOverlay[]
}

interface MapMarker {
  id: string
  x: number; y: number
  icon: string
  label?: string
  color?: string
}

function createMapStateManager(options: MapStateOptions): MapStateManager
function useGameMap(): MapState

// Components
function GameMapCanvas(props: GameMapCanvasProps): JSX.Element
function MapMarkerLayer(props: MapMarkerLayerProps): JSX.Element
function FogOfWarLayer(props: FogOfWarLayerProps): JSX.Element
function MiniMap(props: MiniMapProps): JSX.Element

File layout

gaming/react/react-game-map/
  package.json
  tsconfig.json
  vitest.config.ts
  src/
    index.ts
    types/common.ts
    types/common.md
    state/
      map-state-manager.ts
      map-state-manager.md
      map-state-manager.test.ts
    hooks/
      use-game-map.ts
      use-game-map.md
      use-game-map.test.ts
    components/
      game-map-canvas/
        game-map-canvas.tsx
        game-map-canvas.md
        game-map-canvas.test.tsx
        game-map-canvas.stories.tsx
        index.ts
      mini-map/
        mini-map.tsx
        mini-map.md
        mini-map.test.tsx
        mini-map.stories.tsx
        index.ts

Impact

Downstream: composed with @suaveplan/r3f-minimap for 3D map overlay. Prerequisites: @suaveplan/error, @suaveplan/events, react.