d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
136 lines
3.7 KiB
Markdown
136 lines
3.7 KiB
Markdown
# Typography
|
|
|
|
Typography rendering details that make interfaces feel better.
|
|
|
|
## Text Wrapping
|
|
|
|
### text-wrap: balance
|
|
|
|
Distributes text evenly across lines, preventing orphaned words on headings and short text blocks. **Only works on blocks of 6 lines or fewer** (Chromium) or 10 lines or fewer (Firefox) — the balancing algorithm is computationally expensive, so browsers limit it to short text.
|
|
|
|
```css
|
|
/* Good — even line lengths on short text */
|
|
h1, h2, h3 {
|
|
text-wrap: balance;
|
|
}
|
|
```
|
|
|
|
```css
|
|
/* Bad — default wrapping leaves orphans */
|
|
h1 {
|
|
/* no text-wrap rule → "Read our
|
|
blog" instead of balanced lines */
|
|
}
|
|
```
|
|
|
|
```css
|
|
/* Bad — balance on long paragraphs (silently ignored, wastes intent) */
|
|
.article-body p {
|
|
text-wrap: balance;
|
|
}
|
|
```
|
|
|
|
**Tailwind:** `text-balance`
|
|
|
|
### text-wrap: pretty
|
|
|
|
Prevents orphaned words (a single word dangling on the last line) by adjusting line breaks throughout the paragraph. Unlike `balance`, it doesn't try to equalize line lengths — it just ensures the last line isn't embarrassingly short. Works on text of any length with no line-count limit.
|
|
|
|
This should be your **default for short-to-medium text** — paragraphs, descriptions, captions, list items, card text. For very long text (10+ lines), skip both `pretty` and `balance` — the browser's default wrapping is fine and you avoid unnecessary layout cost.
|
|
|
|
```css
|
|
/* Good — descriptions, captions, short paragraphs */
|
|
p, li, figcaption, blockquote {
|
|
text-wrap: pretty;
|
|
}
|
|
```
|
|
|
|
```tsx
|
|
// Tailwind
|
|
<p className="text-pretty">
|
|
A short paragraph that won't leave an orphan on the last line.
|
|
</p>
|
|
```
|
|
|
|
**Tailwind:** `text-pretty`
|
|
|
|
### When to Use Which
|
|
|
|
| Scenario | Use |
|
|
| --- | --- |
|
|
| Headings, titles where even distribution matters | `text-wrap: balance` |
|
|
| Short-to-medium text — paragraphs, descriptions, captions, UI text | `text-wrap: pretty` |
|
|
| Long text (10+ lines), code blocks, pre-formatted text | Neither — leave default |
|
|
|
|
## Font Smoothing (macOS)
|
|
|
|
On macOS, text renders heavier than intended by default. Apply antialiased smoothing to the root layout so all text renders crisper and thinner.
|
|
|
|
```css
|
|
/* CSS */
|
|
html {
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
}
|
|
```
|
|
|
|
```tsx
|
|
// Tailwind — apply to root layout
|
|
<html className="antialiased">
|
|
```
|
|
|
|
### Good vs. Bad
|
|
|
|
```css
|
|
/* Good — applied once at the root */
|
|
html {
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
|
|
/* Bad — applied per-element, inconsistent */
|
|
.heading {
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
.body {
|
|
/* no smoothing → heavier than heading */
|
|
}
|
|
```
|
|
|
|
**Note:** This only affects macOS rendering. Other platforms ignore these properties, so it's safe to apply universally.
|
|
|
|
## Tabular Numbers
|
|
|
|
When numbers update dynamically (counters, prices, timers, table columns), use tabular-nums to make all digits equal width. This prevents layout shift as values change.
|
|
|
|
```css
|
|
/* CSS */
|
|
.counter {
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
```
|
|
|
|
```tsx
|
|
// Tailwind
|
|
<span className="tabular-nums">{count}</span>
|
|
```
|
|
|
|
### When to Use
|
|
|
|
| Use tabular-nums | Don't use tabular-nums |
|
|
| --- | --- |
|
|
| Counters and timers | Static display numbers |
|
|
| Prices that update | Decorative large numbers |
|
|
| Table columns with numbers | Phone numbers, zip codes |
|
|
| Animated number transitions | Version numbers (v2.1.0) |
|
|
| Scoreboards, dashboards | |
|
|
|
|
### Caveat
|
|
|
|
Some fonts (like Inter) change the visual appearance of numerals with this property — specifically, the digit `1` becomes wider and centered. This is expected behavior and usually desirable for alignment, but verify it looks right in your specific font.
|
|
|
|
```css
|
|
/* With Inter font:
|
|
Default: 1234 → proportional, "1" is narrow
|
|
Tabular: 1234 → all digits equal width, "1" centered */
|
|
```
|