Темы
Цветовые режимы TUI, семантические токены и создание пользовательских тем.
Темы определяют цветовую палитру TUI через семантические токены. Вместо того чтобы задавать
конкретные ANSI-цвета для каждого элемента, вы конфигурируете высокоуровневые смысловые токены
(accent, text, error, border, и т.д.). SOBA сама применяет их к соответствующим элементам
интерфейса.
1. Концепция семантических токенов
В отличие от классического подхода («задай 10 конкретных цветов»), SOBA использует семантические токены. Это означает, что вы не думаете о том, «какой цвет у рамки» или «какой цвет у подсказки». Вместо этого вы определяете смысловые роли:
accent → основной акцентный цвет (заголовки, выделение)
text → основной текст
muted → второстепенный текст
dim → третичный текст / плейсхолдеры
success → успешные операции
error → ошибки
warning → предупреждения
info → информационные сообщения
border → рамки и разделителиКаждый токен — это HEX-цвет (например, #7ee787), который преобразуется в TrueColor ANSI.
Преимущества:
- Не нужно помнить, какой цвет за что отвечает — имена говорят сами за себя
- Одна тема работает во всех элементах TUI консистентно
- Легко создавать новые темы — просто скопируйте набор токенов и измените цвета
- Тёмный и светлый режимы используют одни и те же имена токенов
2. Встроенные темы
SOBA поставляется с тремя цветовыми режимами:
| Имя | Режим | Описание |
|---|---|---|
| Graphite | dark | Тёмная тема в стиле GitHub Dark. Зелёный акцент (#7ee787), мягкий текст. Тема по умолчанию |
| Paper | light | Светлая тема для хорошо освещённых помещений. Синий акцент (#2e6edf), чёткий контраст |
| Forest | forest | «Тёмная в лесу» — глубокие природные цвета. Мохово-зелёный акцент (#6AAC7D), тёплый текст (#C2CBB8). Низкая нагрузка на глаза в темноте |
Дополнительные имена тем из конфигурации (ember, aurora, synthwave, highContrast, clay, operator, ink) зарезервированы для будущих встроенных тем. Сейчас они отображаются как алиасы базовых режимов:
| Имя темы | Маппится на режим |
|---|---|
graphite | dark |
ember | dark |
aurora | dark |
synthwave | dark |
paper | light |
highContrast | light |
clay | light |
operator | dark |
ink | dark |
forest | forest |
3. Список токенов
3.1. Основные токены
| Токен | Dark (Graphite) | Light (Paper) | Forest | Назначение |
|---|---|---|---|---|
accent | #7ee787 | #2e6edf | #6AAC7D | Акцентный цвет: заголовки, кнопки, выделение |
text | #c9d1d9 | #1a1a2e | #C2CBB8 | Основной текст |
muted | #8b949e | #6b7280 | #6C7B66 | Второстепенный текст |
dim | #6e7681 | #9ca3af | #41503E | Третичный текст, плейсхолдеры |
success | #3fb950 | #16a34a | #5A9E60 | Успешные операции |
error | #f85149 | #dc2626 | #C5615A | Ошибки |
warning | #e3b341 | #d97706 | #C3A14E | Предупреждения |
info | #58a6ff | #0284c7 | #6E9EB8 | Информационные сообщения |
3.2. Фоновые токены
| Токен | Dark (Graphite) | Light (Paper) | Forest | Назначение |
|---|---|---|---|---|
userBg | #161b22 | #f3f4f6 | #121A14 | Фон сообщений пользователя |
agentBg | #0d1117 | #ffffff | #0D130F | Основной фон (сообщения агента) |
toolBg | #161b22 | #f9fafb | #121A14 | Фон блоков инструментов |
toolPending | #30363d | #e5e7eb | #1A261D | Фон ожидающих инструментов |
thinkingBg | #161b22 | #e5e7eb | #121A14 | Фон thinking-блоков |
panelBg | #161b22 | #f6f8fa | #121A14 | Фон панелей |
sidebarBg | #0d1117 | #ffffff | #0D130F | Фон боковой панели |
headerBg | #0d1117 | #ffffff | #0D130F | Фон заголовка |
inputBg | #0d1117 | #f6f8fa | #0D130F | Фон строки ввода |
3.3. Специальные токены
| Токен | Dark (Graphite) | Light (Paper) | Forest | Назначение |
|---|---|---|---|---|
thinkingFg | #a371f7 | #8250df | #8BA877 | Цвет текста thinking |
thinkingTitle | #a371f7 | #8250df | #8BA877 | Цвет заголовка THINKING |
toolsTitle | #e3b341 | #9a6700 | #C3A14E | Цвет заголовка TOOLS |
summaryTitle | #7ee787 | #1a7f37 | #6AAC7D | Цвет заголовка SUMMARY |
sectionTitle | #58a6ff | #0969da | #6AAC7D | Цвет заголовков секций |
diffAdded | #3fb950 | #16a34a | #5A9E60 | Цвет добавленных строк в диффе |
diffRemoved | #f85149 | #dc2626 | #C5615A | Цвет удалённых строк в диффе |
border | #30363d | #d1d5db | #1A261D | Рамки и разделители |
statusBarBg | #0d1117 | #1f2937 | #0D130F | Фон статус-бара |
statusBarFg | #8b949e | #f9fafb | #6C7B66 | Текст статус-бара |
inputBorder | #30363d | #d1d5db | #1A261D | Рамка строки ввода |
keyHint | #6e7681 | #8c959f | #4A5A45 | Подсказки клавиш |
activeDot | #3fb950 | #1a7f37 | #6AAC7D | Индикатор активности |
idleDot | #3fb950 | #1a7f37 | #5A9E60 | Индикатор ожидания |
4. Выбор и переключение тем
4.1. В конфигурации
{
"theme": "graphite"
}4.2. Через CLI
soba --theme forest4.3. В TUI (на лету)
/theme forest
/theme graphite
/theme paper4.4. Просмотр текущей темы
/theme
# Вывод:
# Current theme: Graphite (dark)
# Available themes: graphite, ember, aurora, synthwave, paper,
# forest, highContrast, clay, operator, ink
# Use /theme <name> to switch5. Создание пользовательской темы
На данный момент создание пользовательских тем через конфигурационные файлы находится в разработке. В будущем будет поддерживаться следующий формат:
{
"customThemes": {
"ocean": {
"mode": "dark",
"tokens": {
"accent": "#00bcd4",
"text": "#e0f7fa",
"muted": "#80deea",
"dim": "#4dd0e1",
"success": "#69f0ae",
"error": "#ff5252",
"warning": "#ffd740",
"info": "#40c4ff",
"userBg": "#001f3f",
"agentBg": "#001a33",
"toolBg": "#001f3f",
"border": "#004d66",
"statusBarBg": "#001a33",
"statusBarFg": "#80deea",
"thinkingBg": "#001f3f",
"thinkingFg": "#00bcd4",
"diffAdded": "#69f0ae",
"diffRemoved": "#ff5252",
"panelBg": "#001f3f",
"sidebarBg": "#001a33",
"headerBg": "#001a33",
"sectionTitle": "#00bcd4",
"thinkingTitle": "#00bcd4",
"toolsTitle": "#ffd740",
"summaryTitle": "#00bcd4",
"inputBg": "#001a33",
"inputBorder": "#004d66",
"keyHint": "#4dd0e1",
"activeDot": "#69f0ae",
"idleDot": "#69f0ae"
}
}
}
}6. Тёмный и светлый режимы
6.1. Как определяется режим
Тема содержит поле mode, которое может быть:
"dark"— тёмный режим (по умолчанию: graphite)"light"— светлый режим (paper)"forest"— специальный тёмный режим с природными цветами (forest)
Режим влияет на то, как ThemeManager инициализирует цвета. При переключении тем все элементы TUI немедленно обновляются.
6.2. Отключение цветов
# Полное отключение цветов (plain text mode)
soba --no-color
# Или в TUI
# (отключение цветов делает вывод совместимым с любой консолью)7. Лучшие практики
7.1. Выбор темы под условия
| Условия | Рекомендуемая тема |
|---|---|
| Тёмное помещение, ночь | forest — минимальная нагрузка на глаза |
| Обычное освещение, день | graphite — хороший тёмный контраст |
| Яркое освещение, улица | paper — высокий контраст на светлом фоне |
| Презентация / скриншот | paper — лучше выглядит на проекторе |
| Проблемы со зрением | paper — максимальная читаемость |
7.2. Создание своей темы
- Контраст текста: убедитесь что
textхорошо читается наagentBg - Не перебарщивайте с яркостью:
accentдолжен выделяться, но не резать глаз - Согласованность:
success,error,warningдолжны быть интуитивно понятны - Тестируйте оба режима: тёмный и светлый по-разному воспринимаются