Decompose Scene.vue into focused components and composables
## Description Scene.vue is 635 lines and acts as a god component — it owns stage configuration, map lifecycle, drag-and-drop, grid management, token events, and modal orchestration simultaneously. Break it into focused composables and sub-components. ## Background The component has grown organically as features were added. It is hard to test in isolation, difficult to reason about, and a common source of merge conflicts. Most of its logic belongs in composables or dedicated child components. ## Approach Identify logical slices and extract them one at a time: - **`useStage()`** — Konva stage config, scale, pan/zoom - **`useMapLifecycle()`** — active map, map add/save/delete handlers - **`useDragDrop()`** — `dragOver`/`drop` handlers - **`useGridSync()`** — grid finder position, grid config updates - Scene.vue itself becomes a thin orchestrator: mounts sub-components, wires composables, owns no business logic directly Each extraction should leave the test suite green before moving to the next. ## Acceptance Criteria - Scene.vue reduced to an orchestrator (target: under 150 lines) - Extracted composables each have unit tests - No functional regression in existing Scene.spec.js - No change to public component interface (props/events) ## Related - Pairs well with: #731 (Composition API migration — composables require `<script setup>`)
issue