- Add ui/spatial.html: Three.js 3D renderer for spatial dashboard
- COCO-17 keypoint definitions inline; 18 bone pairs (STANDING_KEYPOINTS)
- Three pose variants: standing (green), sitting (yellow), lying (blue)
- Persistent figure map (no recreate-on-every-frame) via FigureState class
- Position lerp (factor 0.1) for smooth interpolation between ticks
- Posture-transition keypoint blending over ~1s (poseBlend 0->1 at +0.03/frame)
- Breathing animation: torso Y-scale at detected BR rate from /api/v1/vital-signs
- Activity-based sway: still=0.01m, moderate=0.03m, active=0.08m
- Opacity fadeout for disappearing bodies (quality field decrements at -0.05/tick)
- WS subscription to spatial_update + body_cluster_update; falls back to polling
- Fallback: single standing figure from voxel centroid when no cluster data
Depends on /api/v1/spatial/clusters endpoint from body tracking PR (#487).