feat(wc): tier 2 density auto-fit, pure JS prediction master
Density tiers now pick from a JS-side spec that mirrors the CSS density rules in slide-styles.eta. predictContentHeight() walks the slotted children and runs pretext against each text element using the tier's font-size, line-height, and margins derived from cqi tokens — no setAttribute, no per-tier reflow. One DOM read per fit pass, one DOM write at the end. The cq basis for descendants is the section's content-box (not its border-box), so snapshotSectionBox() subtracts the section's own padding before exposing cqInline/cqBlock. Without this, predicted font sizes ran ~10% larger than what the browser renders. A small FIT_SLACK (8%) compensates for pretext's wrap predictions running stricter than the browser's CSS `text-wrap: pretty`. Empirical matches Recursive at these sizes; tuneable per-deck if needed. Trade: the JS spec duplicates CSS rules. Every density-aware CSS rule needs a matching entry. The trade is paint-independent prediction that can also feed build-time precomputation later. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>