+ {#each BOARD_IDS as id (id)}
+
+ handleSquare(id, sq)}
+ />
+
+ {/each}
+
+
NORTH
+
SOUTH
+
EAST
+
WEST
+
+
+
+```
+
+- [ ] **Step 2: Typecheck**
+
+Run: `pnpm exec svelte-check --tsconfig ./tsconfig.json`
+Expected: 0 errors.
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add src/lib/Compass.svelte
+git commit -m "feat(ui): Compass component — pinwheel layout, click-to-move wiring"
+```
+
+---
+
+## Task 12: Panel component
+
+**Files:**
+- Create: `src/lib/Panel.svelte`
+
+Turn indicator, coordinate move log, legend, and controls.
+
+- [ ] **Step 1: Write `src/lib/Panel.svelte`**
+
+```svelte
+
+
+ gameStore.cancelPromotion()}
+ role="presentation">
+
e.stopPropagation()} role="presentation">
+
Promote pawn ({pending.from}→{pending.to})
+
+ {#each PIECES as p}
+
+ {/each}
+
+
+
+{/if}
+
+
+```
+
+- [ ] **Step 2: Typecheck**
+
+Run: `pnpm exec svelte-check --tsconfig ./tsconfig.json`
+Expected: 0 errors.
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add src/lib/PromotionDialog.svelte
+git commit -m "feat(ui): promotion dialog"
+```
+
+---
+
+## Task 14: Assemble the app and smoke-test
+
+**Files:**
+- Modify: `src/App.svelte`, `src/app.css`
+- Create: nothing new
+
+- [ ] **Step 1: Write `src/App.svelte`**
+
+```svelte
+
+
+