← Back to Product Feed

Hacker News Show HN: React hooks that predict text height before render, using font metrics

A solution to prevent layout shift and improve animation quality by accurately predicting text height using font metrics, eliminating the need for render-then-measure cycles or CSS hacks.

8
Traction Score
2
Discussions
Apr 4, 2026
Launch Date

Product Positioning & Context

AI Executive Synthesis
A solution to prevent layout shift and improve animation quality by accurately predicting text height using font metrics, eliminating the need for render-then-measure cycles or CSS hacks.
@pretext-studio/core addresses a fundamental UI development pain point: the browser's asynchronous text rendering and its impact on layout stability and animation quality. By enabling pre-render text height prediction using font metrics, this library offers a significant improvement in user experience by eliminating layout shifts and enabling precise animations. This solution targets a pervasive problem in modern web development, particularly for dynamic content and complex layouts (e.g., virtualized lists). The focus on performance (sub-millisecond calculations, caching) and developer experience (React hooks) positions it as a valuable utility. This project highlights the ongoing demand for specialized frontend libraries that optimize rendering performance and visual consistency.
I built @pretext-studio/core to solve a specific annoyance: the browser won't tell you how tall a text block is until after it renders. This forces you into either a render-then-measure cycle (which causes layout shift) or hacks like max-height: 9999px for accordion animations (which makes easing look wrong because the animation runs over 9999px, not the actual content height).The library wraps @chenglou/pretext, a pure-JS text layout engine that replicates the browser's line-breaking. algorithm using font metrics loaded once via the Font Metrics API. From there, computing height is arithmetic — no DOM, no getBoundingClientRect, no reflow. A prepare() call runs in ~0.03ms; a layout() call in under 0.01ms. Results are cached in a module-level LRU map so repeated calls for the same font/size pair are nearly free.The main hooks are useTextLayout (height + line count for a block at a given width), useBubbleMetrics (finds the tightest width that preserves line count, which eliminates the dead space you get from CSS fit-content), and useStableList (pre-computes heights for a list of items before paint, useful for virtualized lists and masonry layouts). There's also a MeasuredText drop-in component with a debug overlay that draws predicted line boundaries over actual rendered text so you can see where predictions diverge.The honest limitation: it only works with fonts you can load metrics for, so arbitrary system fonts or poorly-behaved variable fonts may drift. The isReady flag on every hook is false until font metrics load, so you need to gate renders on it when using web fonts. It also doesn't handle white-space: pre-wrap yet. Feedback welcome — especially if you've hit edge cases with font loading or non-Latin scripts.GitHub: https://github.com/ahmadparizaad/pretext-studio-core — npm: @pretext-studio/core
React hooks text height prediction font metrics render layout shift accordion animations @chenglou/pretext pure-JS text layout engine

Community Voice & Feedback

No active discussions extracted yet.

Related Early-Stage Discoveries

Discovery Source

Hacker News Hacker News

Aggregated via automated community intelligence tracking.

Tech Stack Dependencies

No direct open-source NPM package mentions detected in the product documentation.

Media Tractions & Mentions

No mainstream media stories specifically mentioning this product name have been intercepted yet.

Deep Research & Science

No direct peer-reviewed scientific literature matched with this product's architecture.