Свои темы оформления в Typhon
Цвета, скругления, отступы и шрифт — в одном небольшом файле. Как его написать, импортировать и вернуть оформление по умолчанию.
Обновлено 10 октября 2026 г.
Где это в лаунчере
Все темы живут в разделе Настройки → Оформление. Там же:
- выбор темы — нажмите на карточку. «Системная» переключает встроенные светлую и тёмную вслед за настройками системы;
- импорт — кнопка «Импорт» загружает файл темы с диска (расширение
.typhonthemeили.json); - редактор — открывается под выбранной темой: название, значения токенов с палитрой для цветов и поле «Пользовательский CSS» под кнопкой «Дополнительно». Рядом — живое превью;
- экспорт — сохраняет выбранную тему в файл
.typhontheme, чтобы перенести её на другой компьютер или отдать кому-то; - удаление — только для своих тем. Встроенные «Тёмная», «Светлая» и «Высокий контраст» не удаляются и не перезаписываются: если отредактировать встроенную тему, изменения сохранятся как новая тема рядом с ней.
Свои темы хранятся в файле themes.json в папке данных Typhon: %APPDATA%\Typhon\ на Windows и ~/Library/Application Support/Typhon/ на macOS. Править его руками не нужно — для переноса есть импорт и экспорт.
Быстрый старт
Сохраните текст ниже в файл dusk.typhontheme (подойдёт и расширение .json), затем в лаунчере откройте Настройки → Оформление → Импорт и выберите этот файл. Тема появится в списке с пометкой «своя» — нажмите на неё, чтобы применить.
{
"version": 1,
"theme": {
"id": "dusk",
"name": "Сумерки",
"base": "dark",
"tokens": {
"--bg": "#0d1117",
"--bg-sidebar": "#0b0e13",
"--surface": "#131922",
"--surface-2": "#18202b",
"--surface-3": "#202a37",
"--surface-4": "#293444",
"--border": "rgba(255, 255, 255, 0.08)",
"--border-strong": "rgba(255, 255, 255, 0.14)",
"--hover": "rgba(255, 255, 255, 0.05)",
"--hover-strong": "rgba(255, 255, 255, 0.08)",
"--text": "#e8edf3",
"--text-2": "#a0abb8",
"--text-3": "#6b7785",
"--accent": "#2fb3a3",
"--accent-hover": "#3cc4b3",
"--accent-subtle": "rgba(47, 179, 163, 0.15)",
"--accent-text": "#6fd6c8",
"--accent-ring": "rgba(47, 179, 163, 0.5)",
"--radius-md": "1rem",
"--radius-lg": "1.4rem"
},
"css": ".sidebar { border-right: 1px solid var(--border); }"
}
}
Дальше тему удобно доводить прямо в редакторе лаунчера: выберите её, поменяйте значения, посмотрите на превью и нажмите «Сохранить».
Формат файла
Файл темы — JSON с двумя полями верхнего уровня: version (сейчас всегда 1) и theme. Любое лишнее поле — ошибка импорта, поэтому опечатка в имени поля не пройдёт незамеченной.
| Поле | Что это | Правила |
|---|---|---|
id | Идентификатор темы | Строчные латинские буквы, цифры и дефис, до 64 символов, начинается с буквы или цифры |
name | Название в списке тем | От 1 до 64 символов, без управляющих символов; повторные пробелы схлопываются |
base | Базовая палитра | dark или light |
tokens | Значения переменных интерфейса | Только имена из таблиц ниже |
css | Свой CSS | Необязательно, до 32 КиБ |
Весь файл — не больше 256 КиБ. Поля builtIn и updatedAt, которые появляются в экспортированном файле, при импорте допустимы, но лаунчер выставляет их сам.
Повторный импорт. Если своя тема с таким же id уже есть, импорт заменит её — так удобно обновлять тему, которую вы правите во внешнем редакторе. Если id совпадает со встроенной темой (dark, light, contrast), тема сохранится под новым идентификатором вроде dark-2, а встроенная останется как была.
Что делает base. Лаунчер по нему понимает, светлая тема или тёмная, и подбирает под неё оттенки личного акцента. Недостающих цветов base не подставляет: токен, которого нет в теме, берётся из встроенной тёмной палитры. Поэтому светлая тема должна задать все цвета из таблицы, иначе часть интерфейса останется тёмной.
Токены
Токен — это CSS-переменная, на которой построен интерфейс. Тема может задать любую их часть, остальные остаются встроенными. Размеры указываются в rem: при размере интерфейса 100% (Настройки → Общие → Размер интерфейса) 1rem равен 11 пикселям, и всё, что задано в rem, масштабируется вместе с этой настройкой.
Цвета
| Токен | Где используется |
|---|---|
--bg | Фон окна |
--bg-sidebar | Фон боковой панели |
--surface | Карточки и панели первого уровня |
--surface-2 | Поверхности второго уровня: поля ввода, вложенные блоки |
--surface-3 | Поверхности третьего уровня |
--surface-4 | Самые приподнятые элементы: кнопки, всплывающие панели |
--border | Обычные рамки и разделители |
--border-strong | Заметные рамки |
--hover | Подсветка при наведении |
--hover-strong | Усиленная подсветка при наведении и нажатии |
--text | Основной текст |
--text-2 | Второстепенный текст |
--text-3 | Приглушённый текст: подписи, подсказки |
--accent | Акцентный цвет: главные кнопки, выделение |
--accent-hover | Акцент при наведении |
--accent-subtle | Бледный акцентный фон |
--accent-text | Акцентный текст и ссылки |
--accent-ring | Рамка фокуса и активных полей |
--success, --success-subtle | Успех и его бледный фон |
--warning, --warning-subtle | Предупреждение и его бледный фон |
--danger, --danger-subtle | Ошибка, опасное действие и их бледный фон |
Скругления и отступы
| Токен | Встроенное значение |
|---|---|
--radius-xs, --radius-sm, --radius-md, --radius-lg, --radius-xl | 0.4rem, 0.6rem, 0.8rem, 1.2rem, 1.6rem |
--cut | 0.2rem — скругление метки активного пункта боковой панели |
--space-1 … --space-6 | 0.4rem … 2.4rem с шагом 0.4rem |
--space-8, --space-10, --space-12 | 3.2rem, 4rem, 4.8rem |
Раскладка
| Токен | Встроенное значение |
|---|---|
--page-x | 3.6rem — боковые поля страницы |
--page-max | 232rem — максимальная ширина содержимого |
--prose-max | 76rem — максимальная ширина длинного текста |
--sidebar-w | 23.2rem — ширина боковой панели |
--topbar-h | 5.6rem — высота верхней панели |
--control-sm, --control-md, --control-lg | 3.2rem, 3.8rem, 4.4rem — высота кнопок и полей |
Текст
| Токен | Встроенное значение |
|---|---|
--font-sans | Inter Tight Variable, Inter, Segoe UI, system-ui, sans-serif |
--font-xs, --font-sm, --font-md, --font-lg, --font-xl | 1.3rem, 1.4rem, 1.5rem, 1.7rem, 1.9rem |
--font-title | 3.2rem — заголовки страниц |
--font-hero | clamp(3.6rem, 2.6vw, 4.4rem) — сейчас в интерфейсе не используется |
--tracking-title, --tracking-heading | -0.024em, -0.012em — межбуквенный интервал заголовков |
Шрифт берётся только из установленных в системе: загрузить свой файл шрифта тема не может. Названия шрифтов в --font-sans пишутся без кавычек, через запятую: Segoe UI, sans-serif.
Анимации и тени
| Токен | Встроенное значение |
|---|---|
--ease | cubic-bezier(0.2, 0.8, 0.2, 1) — кривая всех переходов |
--dur, --dur-fast, --dur-panel | 160ms, 120ms, 180ms — длительность переходов |
--shadow-pop | Тень всплывающих меню и подсказок |
--shadow-modal | Тень модальных окон |
--ui-scale в тему не входит: размером интерфейса управляет отдельная настройка, и тема не может её перебить.
Какие значения допустимы
Значение токена — от 1 до 120 символов из этого набора: латинские буквы, цифры, пробел и # . , % ( ) / + * -. Этого хватает на цвета (#1a2b3c, rgb(26 43 60 / 80%), hsl(210 40% 16%), color-mix(in srgb, #fff 8%, transparent)), размеры, calc(...), clamp(...) и ссылки на другие токены через var(--accent).
Нельзя: кавычки, точка с запятой, фигурные скобки, !important, url(, expression( и /*.
Свой CSS
Токены покрывают почти всё, но иногда хочется поменять то, что переменной не вынесено. Для этого у темы есть поле css, в редакторе — «Пользовательский CSS» под кнопкой «Дополнительно». Лаунчер добавляет этот CSS на страницу поверх встроенных стилей, пока тема активна.
Ограничения:
- не больше 32 КиБ;
- запрещены
@import,url(,expression(,javascript:,behavior:,-moz-bindingи</style— тема не может ничего загрузить из сети или с диска, поэтому ни картинок, ни своих шрифтов через CSS тоже не будет. Редактор лаунчера проверяет CSS вместе с комментариями, так что не пишите эти слова и там; --ui-scaleв CSS запрещён по той же причине, что и в токенах;- фигурные скобки должны быть парными, вложенность — не глубже четырёх уровней.
@mediaи@keyframesработают.
Специфичность. Стили компонентов лаунчера привязаны к самим компонентам, поэтому правило .sidebar { background: ... } проиграет встроенному, если оно меняет то же свойство. Свойства, которые компонент не задаёт, применяются как есть; чтобы перебить заданное, добавьте !important.
Классы — не договор. Токены из таблиц выше — стабильный интерфейс тем. Имена классов в разметке — внутреннее устройство лаунчера: они могут поменяться в любой версии, и CSS, опирающийся на них, после обновления может перестать работать.
Пример для светлой темы: полоса прокрутки во встроенных стилях рассчитана на тёмный фон и на светлом почти не видна.
::-webkit-scrollbar-thumb {
background: rgba(0, 0, 0, 0.14);
background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(0, 0, 0, 0.24);
background-clip: padding-box;
}
В JSON-файле CSS записывается одной строкой, переносы — как \n. Удобнее вставить его в поле «Пользовательский CSS» в редакторе и затем экспортировать тему — лаунчер сам запишет его правильно.
Личный акцент
В разделе «Оформление» есть ещё «Личный акцент» — цвет, который применяется поверх любой темы и сам подстраивает оттенки под читаемость. Пока он выбран, акцентные токены темы (--accent, --accent-hover, --accent-subtle, --accent-text, --accent-ring) не видны. Чтобы увидеть акцент самой темы, выберите в личном акценте вариант «Цвет темы». Личный акцент — ваша локальная настройка, в экспортированный файл темы он не попадает.
Если тема сломала окно
Неудачный CSS может спрятать или перекрыть интерфейс так, что до настроек не добраться. На этот случай есть три способа вернуть оформление по умолчанию:
- Кнопка «Сбросить оформление» в правом нижнем углу окна. Она видна всегда, пока активна своя тема или тема со своим CSS, и CSS темы её не оформляет.
- Сочетание Ctrl+Shift+Alt+T в окне лаунчера.
- Настройки → Оформление → Сброс, если до настроек добраться можно: кнопка «Сбросить» там просит подтверждения.
Кроме того, новая тема первые пять секунд считается пробной. Если за это время лаунчер закрылся или упал, при следующем запуске он вернётся к теме, которая была до неё.
Сброс удаляет все свои темы, а заодно личный акцент и окраску значка, и возвращает встроенную тёмную тему. Кнопка в углу и сочетание клавиш срабатывают сразу, без вопроса. Поэтому тему, над которой вы работаете, стоит время от времени экспортировать в файл — после сброса её можно будет импортировать обратно и поправить то, что сломало окно.
Ошибки импорта
| Сообщение | Что проверить |
|---|---|
| недопустимый путь к файлу темы | У файла не то расширение: нужно .typhontheme или .json |
| файл темы превышает допустимый размер | Файл больше 256 КиБ |
| неподдерживаемая версия файла темы | version должен быть 1 |
| недопустимый идентификатор темы | id: строчные латинские буквы, цифры и дефис |
| недопустимое имя темы | name пустое, длиннее 64 символов или содержит управляющие символы |
| недопустимая базовая палитра темы | base — только dark или light |
| неизвестное имя токена темы | Токена нет в таблицах выше, или это --ui-scale |
| недопустимое значение токена темы | Пустое значение, длиннее 120 символов или символ вне допустимого набора — чаще всего кавычки |
| пользовательский CSS превышает допустимый размер | CSS больше 32 КиБ |
| пользовательский CSS содержит запрещённую конструкцию | В CSS есть @import, url( или другое слово из списка выше |
| непарные или слишком глубоко вложенные фигурные скобки в CSS | Лишняя или незакрытая скобка, либо вложенность глубже четырёх уровней |
| Не удалось выполнить действие с темой | Файл не читается как JSON или в нём лишнее поле |
Если лаунчер пишет «Не удалось выполнить действие с темой», чаще всего файл не читается как JSON или в нём лишнее поле. Проверьте запятые, кавычки вокруг имён полей и названия полей верхнего уровня.