Шрифты
Шрифты декларативны: макрос font() времени компиляции устанавливает шрифт и возвращает имя
его семейства — использовать шрифт и значит объявить его. Нечего загружать, ждать или гейтить;
начертания едут вместе с приложением (бандлятся локально или префетчатся хостом до первой
отрисовки), и текст просто рендерится ими. Системным семействам установка не нужна: "serif",
"sans-serif", "monospaced" работают как значения fontFamily из коробки.
Обзор
theme({ fontFamily: font("manrope") }) // дефолтный шрифт текста на всё приложение
UIScreen(
UIText("Display").style({ fontFamily: font("unbounded"), fontSize: 32 }),
UIText("Body text"), // дефолт темы — Manrope
).open() // никакого Promise.all, никакого гейтинга — никогдаfont(id) — реестр
font("manrope") резолвится по курируемому реестру шрифтов (~26 OFL-семейств, с поддержкой
кириллицы, если не отмечено иное) и компилируется в строку имени семейства "Manrope";
подразумеваемые им начертания регистрируются автоматически до запуска твоего кода.
font(id: string, opts?: { weights?: number[], italic?: boolean }): string- По умолчанию устанавливает стандартные веса семейства (обычно 400/500/700).
{ weights: [400, 600] }сужает или расширяет набор — ставь веса, которые реально используешь (fontWeight: 600хочет начертание 600; иначе хосты подставляют ближайшее). { italic: true }добавляет курсивные начертания рядом с прямыми (ошибка компиляции называет семейства/веса, у которых курсива нет).- Аргумент должен быть строковым литералом — неизвестный id это ошибка компиляции со списком валидных.
Id реестра по категориям:
| категория | id |
|---|---|
| sans-serif | inter manrope golos-text onest rubik nunito montserrat ibm-plex-sans pt-sans jost exo-2 |
| display | unbounded russo-one oswald comfortaa space-grotesk (только латиница) |
| serif | playfair-display lora pt-serif cormorant literata |
| monospace | jetbrains-mono fira-code ibm-plex-mono |
| handwriting | caveat pacifico |
font("./path.ttf") — свои файлы шрифтов
Аргумент в форме пути устанавливает файл шрифта проекта. Компилятор сам читает файл — настоящее
имя семейства из его таблицы name, вес и курсив из OS/2 — так что нет никаких конвенций
именования и никаких опций:
theme({ fontFamily: font("./fonts/Brand.ttf") }) // → "Brand" (из файла)
font("./fonts/Brand-Bold.ttf") // то же семейство, добавляет жирное начертаниеТолько .ttf/.otf (конвертируй экспорты WOFF/WOFF2); путь относителен вызывающему файлу, как
у asset().
Системные шрифты
Три обобщённых семейства — просто строки fontFamily: без font(), ничего не устанавливается и
не скачивается (вызов font("serif") — ошибка компиляции, указывающая сюда):
UIText("Quote").style({ fontFamily: "serif" })
UIText("SKU-10442").style({ fontFamily: "monospaced" }) // CSS-овский "monospace" тоже принимаетсяКаждая платформа резолвит их в своё нативное начертание (serif на iOS — New York, на Windows —
Times New Roman, и так далее) — используй их, когда хочешь платформенный вид, и шрифт из реестра,
когда нужно одно и то же начертание везде. Снапшоты дизайн-борда и lecodes render пришпиливают
их к бандленным конкретным начертаниям, чтобы headless-вывод был детерминированным: serif →
PT Serif, monospaced → JetBrains Mono, sans-serif → Roboto (дефолтный шрифт UI).
Как это загружается (и почему ты никогда не ждёшь)
Объявленные начертания известны на компиляции: локальные/standalone-сборки бандлят их рядом с приложением (они регистрируются синхронно на старте — вообще без мигания), а платформенные сборки запекают CDN-URL, которые хост префетчит параллельно запуску приложения, ненадолго придерживая первый кадр, чтобы текст с самого начала появлялся в правильном шрифте. Если начертание опаздывает (плохая сеть), текст подменяется, когда оно доедет — это запасной путь, а не нормальный.
Выбор шрифта на элемент
fontFamily задаётся на каждый UIText (или через дефолт theme({ fontFamily }) на всё
приложение) — не полагайся на установку на контейнере. Для повторяющейся кастомной стилизации
вынеси общий Style<UIText>.
registerFont — рантайм-лазейка
registerFont(fontFamily: string, url: string, options?: { weight?: number, style?: "normal" | "italic" }): Promise<void>Только для URL, вычисляемых в рантайме (пикер шрифтов, шрифты от пользователя). Один вызов на
начертание; промис разрешается, когда начертание пригодно, но раз font() покрывает и реестр,
и файлы проекта, это почти никогда не нужно — и ждать его не нужно никогда.
Смотрите также
- Текст и элементы контента —
UIText, стилиfontFamily/fontWeight. - Тема —
theme({ fontFamily }), механизм дефолтного текста.