Rotate-only Tool. Owns the rotation-handle affordance render layer; the
gesture itself flows through rotateAction (declarative binding in
useSelectTool.bindings keyed on the rotate-handle affordance hit
kind) → dispatcher → preview surface → scene commit.
The legacy useRotate hook is removed — the affordance no
longer wraps each region's drag channel; the unwrapped affordance is
used purely for the paint + hit-test surface. The dispatcher's
affordanceAt pipeline produces rotate-handle hits independently
(see src/canvas/affordanceAt.ts), which the useSelectTool rotate
binding then routes to rotateAction.
Rotate-only Tool. Owns the rotation-handle affordance render layer; the gesture itself flows through
rotateAction(declarative binding inuseSelectTool.bindingskeyed on therotate-handleaffordance hit kind) → dispatcher → preview surface → scene commit.The legacy
useRotatehook is removed — the affordance no longer wraps each region's drag channel; the unwrapped affordance is used purely for the paint + hit-test surface. The dispatcher'saffordanceAtpipeline producesrotate-handlehits independently (seesrc/canvas/affordanceAt.ts), which theuseSelectToolrotate binding then routes torotateAction.