Mystery Map Maker

A playful micro-app for creating "treasure maps" with draggable landmarks, doodle-style paths, and hidden clues revealed via click-to-flip note cards. Users can place icons (caves, towers, forests), draw routes with a simple pen tool, and attach short riddle hints to each landmark, then export the map as a PNG and save/load drafts via localStorage. The UI is split into clear panels (canvas, toolbar, landmark/clue editor, and map gallery) so multiple agents can build features in parallel without overlap.

To Do29
Scaffold app stack

Run: npm create vite@latest . -- --template react-ts && npm i && npm i -D tailwindcss postcss autoprefixer && npx tailwindcss init -p && npm i lucide-react class-variance-authority tailwind-merge clsx && npx shadcn@latest init

by system

Add Tailwind globals

Configure Tailwind content paths and add @tailwind directives in src/index.css.

by system

Create base layout

Implement App.tsx with a 4-panel responsive grid (toolbar, canvas, editor, gallery).

by system

Define app types

Create src/types/map.ts with Landmark, PathStroke, MapDraft, and GalleryItem types.

by system

Create app store

Add src/state/useMapStore.ts implementing reducer-style state for landmarks, strokes, selection, and drafts.

by system

Seed landmark icons

Create src/data/landmarkCatalog.ts exporting icon metadata (cave, tower, forest, etc.) using lucide-react.

by system

Toolbar UI shell

Build src/components/ToolbarPanel.tsx with shadcn buttons/toggles for Select, Pen, and Add Landmark.

by system

Tool mode toggle

Wire toolbar tool selection to global state (select/pen/add) without implementing behaviors.

by system

Canvas panel shell

Create src/components/MapCanvasPanel.tsx containing the canvas stage wrapper and size handling.

by system

Landmark renderer

Implement src/components/LandmarkNode.tsx to render a positioned landmark icon + label from state.

by system

Add landmark placement

Implement click-to-place landmark behavior on the canvas when tool mode is Add.

by system

Landmark selection logic

Implement click-to-select and deselect-on-empty-canvas behavior for landmarks.

by system

Landmark dragging

Add pointer-based dragging for LandmarkNode with snap-to-canvas bounds clamping.

by system

Delete selected landmark

Add a Delete action (toolbar button or keypress) to remove the currently selected landmark.

by system

Pen tool stroke model

Implement stroke creation data updates (points array) in state when pen tool is active.

by system

Stroke SVG renderer

Create src/components/StrokeLayer.tsx to render doodle-style strokes as SVG paths.

by system

Pen pointer interactions

Implement pointer down/move/up on canvas to draw strokes and commit them to state.

by system

Stroke style controls

Add simple UI controls in ToolbarPanel for stroke color and width.

by system

Clue editor panel

Build src/components/LandmarkEditorPanel.tsx showing selected landmark fields (name + riddle hint).

by system

Edit landmark fields

Wire editor inputs to update selected landmark name and hint in state.

by system

Flip clue card

Create src/components/ClueFlipCard.tsx that flips on click between landmark summary and riddle hint.

by system

Canvas clue popover

Show ClueFlipCard near a landmark when it is clicked/selected on the canvas.

by system

Map gallery panel

Build src/components/MapGalleryPanel.tsx listing saved drafts with thumbnail placeholder and actions.

by system

LocalStorage persistence

Implement src/state/persistence.ts to save/load drafts and active draft id via localStorage.

by system

Save draft action

Add a Save button that writes the current map state into localStorage drafts.

by system

Load draft action

Implement selecting a gallery item to load its saved map state into the editor.

by system

Duplicate and delete drafts

Add gallery actions to duplicate a draft and delete a draft from localStorage.

by system

PNG export utility

Create src/utils/exportPng.ts to export the map canvas DOM/SVG to a downloadable PNG.

by system

Export button wiring

Add an Export PNG button in ToolbarPanel that calls exportPng for the current map.

by system

In Progress0
In Review0
Done0