mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-22 08:02:24 +00:00
* feat(settings): add interface font family configuration in appearance typography * fix(settings): let the interface font go back to the system face Three things the new **Interface font family** row spelled once and needed twice. `apply_theme` only wrote `Theme.font_family` when the setting was `Some`, and `Theme::change` never puts it back — it rewrites the field only when a theme config names a face, and none of ours does. So picking a font worked, and picking **Default** back saved `None`, redrew every window in the font the user had just cleared, and only came true at the next launch: a setting that looked like it had applied instantly and had not. The face is now assigned in both directions, against the stock value read once before anything overrode it. The dropdown's first row borrowed the bold/italic label, "Default (match primary)" — which promises the *terminal's* primary family. The interface falls back to the system UI font instead, so the row said the chrome would come out in Hack while the description beside it said the opposite. It gets its own label in all three locales. `ui_font_family` was also the one key in `config.json` that disappeared when unset; every other optional key is written as `null`. Dropped the `skip_serializing_if` so the file still lists it, and documented the key in the two tables that enumerate the typography settings. --------- Co-authored-by: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com>
86 lines
3.2 KiB
Plaintext
86 lines
3.2 KiB
Plaintext
---
|
||
title: "Fonts"
|
||
description: "The bundled default, fallback chains, ligatures, and why CJK needs a word."
|
||
---
|
||
|
||
**Settings → Appearance → Typography** covers the everyday choices; the rest is
|
||
`config.json`.
|
||
|
||
| Setting | Default | |
|
||
|---|---|---|
|
||
| **Font family** | Hack | Picked from fonts installed on your system |
|
||
| **Font size** | 15 px | The terminal grid |
|
||
| **Interface font size** | 16 px | Everything outside the grid (12–24) |
|
||
| **Interface font family** | system UI font | The face for everything outside the grid |
|
||
| **Line height** | 1.4 | A multiple of the font size |
|
||
| **Bold font** / **Italic font** | — | Distinct faces, when you want them |
|
||
| **Font ligatures** | off | Contextual alternates stay off unless you ask |
|
||
|
||
## Hack is bundled
|
||
|
||
The default font ships inside the binary. It renders identically on every
|
||
machine without relying on a system install, so a fresh laptop looks like the
|
||
one you set up last year.
|
||
|
||
## Fallbacks
|
||
|
||
`font_family` is the primary face; `font_fallbacks` is an ordered list tried in
|
||
turn for anything the primary lacks.
|
||
|
||
```json
|
||
{
|
||
"font_family": "JetBrains Mono",
|
||
"font_fallbacks": ["Maple Mono NF CN", "PingFang SC", "Apple Color Emoji"]
|
||
}
|
||
```
|
||
|
||
Leave `font_fallbacks` out and you get the platform's default chain:
|
||
|
||
| | Default fallbacks, in order |
|
||
|---|---|
|
||
| **macOS** | Menlo · Hasklug Nerd Font Mono · Maple Mono NF CN · PingFang SC · Apple Color Emoji |
|
||
| **Windows** | Maple Mono NF CN · Cascadia Mono · Microsoft YaHei · Segoe UI Emoji |
|
||
| **Linux** | Maple Mono NF CN · DejaVu Sans Mono · Noto Sans CJK SC · Noto Color Emoji |
|
||
|
||
Each ends in faces the host OS actually ships, and those stock names are
|
||
appended to whatever list you write yourself — so a `config.json` copied from
|
||
another platform still resolves.
|
||
|
||
## OpenType features
|
||
|
||
`font_features` passes tags straight through to the shaper:
|
||
|
||
```json
|
||
{
|
||
"font_features": { "calt": true, "liga": 1, "ss01": true, "zero": false }
|
||
}
|
||
```
|
||
|
||
A tag must be four alphanumeric characters; `true`/`false` map to `1`/`0`.
|
||
Anything malformed is skipped with a log line rather than failing the whole
|
||
config.
|
||
|
||
## CJK and the two-column grid
|
||
|
||
<Info>
|
||
A cell is one advance of the primary face, and a wide (CJK) character is
|
||
pinned to exactly two of them. A CJK fallback sits flush in its slot only if
|
||
its ideographs advance **twice** the primary's Latin advance.
|
||
</Info>
|
||
|
||
Bundled Hack advances 0.60205em, so a two-column slot is 1.2041em — while every
|
||
stock CJK face (Microsoft YaHei, PingFang SC, Noto Sans CJK) advances 1.0em.
|
||
Those glyphs get left-aligned in the slot, leaving a ~0.2em gap on the right of
|
||
every character.
|
||
|
||
[Maple Mono NF CN](https://github.com/subframe7536/maple-font) is in every
|
||
platform's default chain for exactly this reason: 0.6em Latin, 1.2em CJK, an
|
||
exact two-cell fit against Hack. It leads the chain on Windows and Linux, and on
|
||
macOS sits behind Menlo and Hasklug, which cover Latin and Nerd Font glyphs
|
||
first. It is referenced by name only, never bundled (~20 MB per weight) —
|
||
install it and tty7 picks it up with no config change.
|
||
|
||
If you want CJK set *tight* rather than merely even, change the **primary** face
|
||
instead. One that advances 0.5em — Sarasa Mono SC, say — makes two columns
|
||
exactly 1.0em.
|