Completely reworked feature placement UX:
- Tile palette in sidebar shows 7 pattern types (dead-end, straight,
wide curve, sharp bend, Y-split, Y-wide, crossroads) for each
linear terrain (road, river, coastline) with small hex previews
- Click pattern to select, click hex to place — no more edge-clicking
- Q/E keys or scroll wheel to rotate selected pattern before placing
- Each placed feature has independent rotation controls (arrows) and
remove button in the hex inspector panel
- Edge constraint enforcement still runs automatically on placement
Also added: core/tile-patterns.ts with canonical pattern definitions
and rotation math (accounting for symmetry).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix: move terrainPickerUI declaration before createToolbar to avoid
"can't access lexical declaration before initialization" error
- Hex size is now fixed per map (not adjustable at runtime)
- Client-side first: localStorage for persistence, no server needed
for editing. Added Export/Import JSON buttons in sidebar.
- Removed server dependency from main.ts init flow
- Coastline rework: routes edge-to-edge like road/river (bezier),
fills one side with water color (the side away from hex center).
No longer draws along hex edges — it's a proper dividing curve.
- Simplified map-settings to just grid toggle + opacity slider
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- server/db.ts: sql.js with migration system (hex_maps, hexes, hex_features)
- server/routes/maps.ts: CRUD for hex maps
- server/routes/hexes.ts: Bulk hex upsert, region load, sparse storage
- server/index.ts: Express 5, CORS, tile serving, SPA fallback
- src/data/api-client.ts: Frontend HTTP client for all API endpoints
- src/main.ts: Auto-save with 1s debounce, load map state on startup
- Port 3002 (Kiepenkerl uses 3001)
- Graceful fallback when API unavailable (works without server too)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- svg/renderer.ts: Full Canvas rendering engine with terrain textures
(trees for forest, waves for water, peaks for mountains, contour
lines for hills, hatch for farmland, buildings for settlements)
- Linear features: paired-edge bezier routing (straight-through,
curves, dead-ends), river wobble, proper coastline along hex edges
- Drag-paint: click-and-drag in Paint mode paints multiple hexes,
disables map panning during paint gesture
- NGINX reverse proxy + Let's Encrypt cert for hexifyer.davoryn.de
- Refactored hex-layer.ts to delegate rendering to renderer module
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>