r221 introduces a new `TimelineR221` component that renders one row per layer in the VSIL Editor, with full bidirectional sync to the Canvas. The new Timeline sits below the keyframe Timeline in the editor panel.
**Five core requirements all shipped**:
1. **Row rendering**: each layer has a row showing visibility, lock, and name. Updates when editor layers change.
2. **Selection sync**: click row → Canvas selected; Canvas select → row state. Shift+click multi-select is stable across both surfaces.
3. **Hover sync**: hover row → Canvas hover outline; hover canvas region → row hover state. Uses a new single-slot chained listener (`setHoveredLayerListener` / `fireHoveredLayer`) following the r218 `setReorderListener` pattern.
4. **Reorder sync**: `[/]` keys + timeline drag-reorder call the same `selection.reorderSelected` path. Snapshot includes the canonical order via the r220 `SelectionSnapshot.layers` field.
5. **Snapshot integration**: visibility/lock toggles push snapshots. `r214:history-applied` listener restores order + visibility/lock on undo.
**Architecture**: pure chained-listener pattern, no new state, no new events. The selection singleton is the single source of truth. Surfaces register their listeners in mount effects, chain with any pre-existing listener, restore on unmount.
**Files**:
**Verification: 466/466 total** (413 unit + 53 Playwright). r221: 44 unit (sections 1-43) + 22 Playwright (sections 1-15). Build clean — 0 iframes, 0 postMessage, bundle `main-Cjt4-moM.js` (820KB).
**Shipped**: `feat/id9-r221-timeline-integration` @ `f9bbfce` → merged to main @ `6462d6a` (--no-ff). Tag `r221-shipped` at the merge commit. Awaiting operator prod deploy (id 44).