Файл theme.json
Единственный обязательный файл темы. Обязательное поле в нём одно — version; всё остальное можно опустить, и оно возьмётся из дефолта.
{
"version": 1,
"name": "Академия данных",
"scheme": "auto",
"brand": {
"title": "Академия данных",
"subtitle": "модуль 3 · запросы к базе",
"logo": "assets/logo.svg",
"logoText": "АД",
"favicon": "assets/favicon.png",
"footer": "по вопросам — куратор группы"
},
"fonts": [
{ "family": "Nunito", "src": "assets/nunito.woff2", "weight": "400 800", "style": "normal" }
],
"tokens": {
"dark": { "accent": "#c2660f", "bg": "#1a1512" },
"light": { "accent": "#a8560c", "bg": "#fbf7f1", "radius-card": "14px" }
},
"css": "theme.css"
}
Поля
| Поле | Тип | Что делает |
|---|---|---|
version | число | версия контракта темы; сейчас 1 |
name | строка | имя темы для людей, в интерфейсе не показывается |
scheme | auto | light | dark | auto — выбор у студента; иначе схема зафиксирована, переключатель скрыт |
brand | объект | строки и картинки курса, см. ниже |
fonts | массив | шрифты из theme/assets, подключаются как @font-face |
tokens | объект | переопределения по схемам: dark и light |
css | строка | имя файла со своим CSS, обычно theme.css |
brand
| Ключ | Где видно |
|---|---|
title | крупная строка над списком заданий и в заголовке вкладки браузера |
subtitle | строка под названием; если не задана, показывается число заданий |
logo | картинка слева от названия; путь внутри theme/ |
logoText | 2–3 буквы в квадрате, если картинки нет |
favicon | значок вкладки |
footer | строка внизу боковой полосы: к кому идти с вопросами |
fonts
"fonts": [
{ "family": "Nunito", "src": "assets/nunito.woff2", "weight": "400 800", "style": "normal" }
]
src — только путь внутри theme/assets; абсолютные адреса отбрасываются, а CSP всё равно не выпустит запрос наружу. Чтобы шрифт применился, назначьте его токеном:
"tokens": { "dark": { "font-body": "\"Nunito\", system-ui, sans-serif" } }
Допустимые расширения ассетов: woff2, woff, ttf, otf, svg, png, webp, jpg, jpeg, ico.
tokens
Ключи — имена токенов без префикса --. Неизвестное имя игнорируется с записью в лог сервера, поэтому опечатка не ломает тему, но и не работает. Значение не может закрыть CSS-правило: символы { } ; < >, @import и внешние url() отклоняются.
Задавайте оба набора, если scheme: "auto" — иначе одна из схем останется дефолтной, и переключатель будет выглядеть как поломка.
Проверка темы
Раннер пишет проблемы темы в свой лог при старте:
docker compose logs runner | grep -i theme
Пустой вывод означает, что тема принята целиком.