SIGN IN SIGN UP

feat(ui): rebuild the workspace as the C2 floating instrument panel

Replaces the docked three-column shell with a full-bleed canvas and floating
instrument modules, per DESIGN.md v2 (direction C2).

- canvas: app bar, footer, resizable columns and the pipeline strip removed;
  modules float over the part, drag / collapse / re-stack, 全览 · 调参 · 看模型
  density presets, `Space` hides everything but the composer
- viewport: ViewCube with 26 ray-picked regions mirroring the camera, keyboard
  standard views (1-6, 0, F), no snap on release; the image path stays the fallback
- modules: 零件槽位 rows, 尺寸 steppers with drafts and undo, 检验 verdicts and
  outputs, 要你定一下 for a pending clarification, 读数, 源码 / 记录 sheet
- one action per state: the composer owns it, with the staleness line moved into
  the hint row and a circular action button; plain Enter still never submits
- brand module owns the only two utility surfaces (settings sheet, notification
  drawer)

Review fixes (2026-09-18), each reproduced against the running app first:

- the slots rail is no longer hidden below 1024px by leftover docked-layout CSS
- part rows are keyboard-selectable (`role=option`, Enter/Space) and the
  hover-only utilities reveal on focus-within
- Space and the digits have exactly one owner; the retired inspector-tab
  bindings are gone
- OrbitControls' polar limit (0.96pi) stopped 下 7 degrees short; the camera
  guard is now symmetric with the ViewCube stop table, so 3 and 6 report 上/下
- 读数 marks a declared parameter as 目标 instead of dressing it as measured
- the module plate and the focus colour each have a single definition
- the composer no longer covers 读数 between 960px and 1100px
- `bun run lint` is green again (notification drawer detects the client with
  useSyncExternalStore instead of setState in an effect)

Gates: bun run test (355 pass / 0 fail), typecheck, lint, build.
K
Kevoyuan committed
6c88dd71332c02af7dbe2e14d80ccb3ea6bc4e17
Parent: d485be0