Loading...
Loading...
Fast, accurate, and comprehensive multiline text measurement and layout library for JavaScript/TypeScript — without DOM reflow. Use when the user needs to calculate paragraph heights, line counts, manual line layouts (text flowing around floated images), or rich text rendering (emoji, CJK, RTL) on DOM, Canvas, or SVG targets. Covers npm install, core API (prepare/layout, prepareWithSegments/layoutWithLines), and options (whiteSpace, wordBreak, letterSpacing). Triggers on: pretext, text measurement, text layout, paragraph height, line layout, text reflow, canvas text measurement, DOM reflow.
npx skill4agent add akillness/oh-my-skills pretextNo DOM reflow. Pure arithmetic on cached font metrics.
pretextgetBoundingClientRectoffsetHeightclaude plugin marketplace add chenglou/pretextnpm install @chenglou/pretextnpx skills add https://github.com/akillness/oh-my-skills --skill pretextIntl.Segmenterprepare()import { prepare, layout } from '@chenglou/pretext'
// One-time analysis + font measurement (cached)
const prepared = prepare('AGI 春天到了. بدأت الرحلة 🚀', '16px Inter')
// Pure arithmetic — no DOM interaction
const { height, lineCount } = layout(prepared, 320, 20)
// width: 320px container, lineHeight: 20pximport { prepareWithSegments, layoutWithLines } from '@chenglou/pretext'
const prepared = prepareWithSegments('Text here', '18px "Helvetica Neue"')
const { lines } = layoutWithLines(prepared, 320, 26)
for (const line of lines) {
// line.text, line.y, line.width, line.segments
}import { prepare, shrinkWrap } from '@chenglou/pretext'
const prepared = prepare('Hello world', '14px system-ui')
const { width } = shrinkWrap(prepared, 26)| Option | Type | Values | Description |
|---|---|---|---|
| string | | |
| string | | |
| number | pixels | CSS-equivalent letter-spacing |
const prepared = prepare(text, font, {
whiteSpace: 'pre-wrap',
wordBreak: 'keep-all',
letterSpacing: 1.5,
})Intl.SegmenterCanvasRenderingContext2D.measureText| Target | Notes |
|---|---|
| DOM | Use |
| Canvas | Use |
| SVG | Use |
| SSR | Heights computed server-side; hydrate positions client-side |
prepare()prepareWithSegments()preparedlayout()layoutWithLines()Intl.SegmentershrinkWrapprepareWithSegmentsprepareimport { prepare, layout, prepareWithSegments, layoutWithLines } from '@chenglou/pretext'
// Basic height check
const p = prepare('Hello, 世界! 🌏', '16px sans-serif')
console.log(layout(p, 200, 20)) // { height: 20, lineCount: 1 }
// Variable-width layout (text around floated image)
const ps = prepareWithSegments('Long article text...', '16px Georgia')
const { lines } = layoutWithLines(ps, (lineIndex) => {
return lineIndex < 5 ? 200 : 320 // narrower for first 5 lines
}, 24)