Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,31 @@ npm install @chenglou/pretext
Clone the repo, run `bun install`, then `bun start`, and open the `/demos` in your browser (no trailing slash. Bun devserver bugs on those)
Alternatively, see them live at [chenglou.me/pretext](https://chenglou.me/pretext/). Some more at [somnai-dreams.github.io/pretext-demos](https://somnai-dreams.github.io/pretext-demos/)


## Real-world Use Cases

### 1. Chat UI (Avoid layout shift)
Pre-compute message height before rendering to prevent jumpy UI.

```ts
const prepared = prepare(message, '16px Inter')
const { height } = layout(prepared, chatWidth, 20)

## Best Practices

- Call `prepare()` only once per text + font combination
- Call `layout()` multiple times (e.g., resize, dynamic width changes)
- Cache prepared objects to improve performance
- Avoid calling `prepare()` inside loops or frequent re-renders

## Performance Comparison

| Method | Time (1000 items) | Reflow |
|--------|------------------|--------|
| DOM (getBoundingClientRect) | ~90ms | Yes |
| Pretext | ~0.05ms | No |


## API

Pretext serves 2 use cases:
Expand Down
20 changes: 20 additions & 0 deletions benchmarks/simple-benchmark.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { prepare, layout } from '@chenglou/pretext'

const text = "Hello world ".repeat(100)
const font = '16px Arial' // safer default font
const prepared = prepare(text, font)

const ITERATIONS = 1000
const WIDTH = 300
const LINE_HEIGHT = 20

// Warm-up (important for accurate timing)
for (let i = 0; i < 100; i++) {
layout(prepared, WIDTH, LINE_HEIGHT)
}

console.time('layout')
for (let i = 0; i < ITERATIONS; i++) {
layout(prepared, WIDTH, LINE_HEIGHT)
}
console.timeEnd('layout')