Labels piled on top of each other (esp. in the neighborhood view) for two
reasons, both fixed in graph-canvas.tsx:
1. Font grew as you zoomed OUT (size was divided by sqrt(globalScale) and had
a +6 floor), so at overview zoom labels became huge and collided. Now the
label font is a ~constant SCREEN size (fontPx / globalScale).
2. Every node drew its label at once. Now labels are zoom-gated: at overview
zoom only the active node, the 3 practice-area hubs, and the most-cited
precedents (size>=4) are labeled; topic hubs appear at >=1.05 and the rest
at >=1.5 — by which point there is pixel room between nodes.
Also: a white halo (strokeText) behind each label for legibility over edges
and nearby nodes, and stronger d3 forces (charge -220, link distance 60) so
nodes spread out and labels have more room.
web-ui build passes; /graph in the route table.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>