y83 code / инструмент

Тема

Инструмент «Тема» — экран внешнего вида приложения: режим светлая/тёмная/системная, шрифт чата и семь независимых размеров текста (ответ агента, реплики пользователя, рассуждения, события, подписи, код, планы). Каждый размер настраивается отдельно, поэтому можно, например, оставить мелкие подписи, но увеличить код.

раздел реестра
Приложение
код
1 147 строк в 8 файлах
документ
32-theme.md
Раздел: App
Идентификатор: theme · Экран: ui/theme/ThemeSettingsScreen.kt
Снимок: 2026-10-11

1. Зачем и что это

Экран сделан в стиле терминала: шапка TerminalHeader с приглашением y83@theme :~$, а секции пронумерованы как «01 / APPEARANCE», «02 / FONT» и т. д. Так же оформлены экраны настроек Codex — см. ../codex-chat.md.

Отдельного «экрана цветов» нет: палитра (ui/theme/Color.kt, SemanticColors.kt) зашита в приложение, пользователь меняет только режим свет/тьма и типографику. Правило палитры: цвета только токенами MaterialTheme.colorScheme, контраст WCAG AA (скилл y83-ux).

2. Как попасть

Хаб инструментов → секция App → карточка «Тема» (hub_theme_title = «Тема», подпись hub_theme_subtitle = «Цвета, шрифты и размер текста»).

Откуда ещёПуть
Главнаятайл «Тема» (если не скрыт в Настройках главной)
Мостapp_navigate с screen: "theme" (bridge/BridgeScreenCatalog.kt)

Маршрут: Screen.kt:144 ("theme" -> Screen.Theme) → MainRouter.kt:184 (ThemeSettingsScreen(onBack = …)).

3. Экран: элементы и действия

ЭлементЧто делаетГде в коде
Шапка y83@theme :~$Терминальная шапка, кнопка «назад»ThemeSettingsScreen, TerminalHeader
Секция 01 / APPEARANCEТри карточки режима: Dark / Light / SystemThemeModeSection
Секция 02 / FONTСетка из 9 семейств шрифтовFontSection, FontCard
Секция 03 / SIZES7 строк размеров со слайдерамиSizeSection, SizeCard
Секция 04 / LIVE PREVIEWЖивой предпросмотр баблов чата EN + RUChatPreviewSection
Секция сбросаКнопка «Reset appearance» + диалог подтвержденияResetSection

Карточка режима выбрана, если у неё бордер primary 2.dp и фон surfaceContainerLow; невыбранная — бордер outlineVariant 1.dp и фон surfaceContainerLowest. Цвет анимируется через animateColorAsState.

4. Возможности подробно

Режим темы

Три режима (themeModeOptions, ThemeSettingsScreen.kt:74):

idПодписьИконка
darkDarkDarkMode
lightLightLightMode
systemSystemPhoneAndroid

Тап по карточке сразу пишет App.saveThemeMode(id) — пересоздания активности не требуется, потому что режим читается как Flow (App.themeModeFlow) и Theme.kt:92 подставляет его в MaterialTheme.

Шрифты чата

Девять семейств (fontOptions, ThemeSettingsScreen.kt:87):

idНазваниеХарактер
systemSystemсистемный шрифт Android
interInterUI
golosGolos Textкириллица
manropeManropeгеометрический
nunitoNunitoскруглённый
comfortaaComfortaaдисплейный
ptsansnarrowPT Sans Narrowузкий
literataLiterataс засечками
jetbrainsJetBrains Monoмоноширинный

Семейства объявлены в ui/theme/Type.kt (Inter, GolosText, Manrope, Nunito, Comfortaa, PTSansNarrow, Literata, JetBrainsMono), файлы шрифтов лежат в app/src/main/res/font/ (20 .ttf, включая Raleway — он используется в UI, но не в списке чата).

Размеры текста

Семь независимых параметров (ChatFontConfig, ui/theme/Type.kt:60), каждый со слайдером:

ТипСмыслДефолт
Agentответы агента14
Userреплики пользователя14
Reasoning«размышления»14
Eventсобытия ленты14
Metaподписи и метки11
Codeблоки кода14
Planстроки плана14

Диапазон общий: MIN_SIZE = 11, MAX_SIZE = 20. Значение читается функцией ChatFontConfig.sizeOf(ChatTextType), записывается — withSize(type, size).

Образцы текста в строках размеров намеренно двуязычные («как выглядит агентский текст / мой / плана»), поэтому лежат в ресурсах с translatable="false" (R.string.theme_sample_*), а список sizeRows — это getter: строки берутся в момент показа, чтобы примерка шрифта не ломалась о мёртвый контекст.

Живой предпросмотр

ChatPreviewSection рисует настоящие баблы чата теми же стилями, что и лента: бабл пользователя справа (primaryContainer/onPrimaryContainer, скругление 16,16,4,16), бабл агента слева (surface/onSurface, 16,16,16,4), оба разными выбранными размерами. Текст — английский и русский одновременно: так видно, не ломает ли шрифт кириллицу.

Сброс

Кнопка «Reset appearance» открывает AlertDialog и по подтверждению делает App.saveThemeMode("system") + App.saveChatFonts(DefaultChatFonts) — то есть возвращает системный режим, system и заводские размеры. Отмена ничего не меняет.

5. Данные: БД, файлы, настройки

Всё в SharedPreferences (App.PREFS_NAME), без БД.

ЧтоКлючТипДефолт
Режим темыtheme_modeStringdark
Семейство шрифтаchat_font_familyStringsystem
Размер agentchat_size_agentInt14
Размер userchat_size_userInt14
Размер reasoningchat_size_reasoningInt14
Размер eventchat_size_eventInt14
Размер metachat_size_metaInt11
Размер codechat_size_codeInt14
Размер planchat_size_planInt14

Чтение — App.loadDisplayPrefs() при App.init, запись — App.saveChatFonts(cfg) и App.saveThemeMode(mode) (обе с .apply()), актуальное значение — App.chatFonts: MutableStateFlow<ChatFontConfig> и App.themeModeFlow.

6. Backend: REST/роуты

Неприменимо: экран работает целиком на устройстве, обращений к бэкенду нет.

7. Мост и MCP

ЧтоКакПримечание
Открыть экранapp_navigate / app_ui_*, screen: "theme"BridgeScreenCatalog.kt

Отдельной bridge-команды «прочитать тему» нет; агент читает настройки только из prefs-файла приложения (в коде моста такой команды не найдено).

8. Настройки, конфиг, квоты и лимиты

ПараметрЗначениеГде задаётся
Размер шрифта11…20Экран, слайдер
Число размеров7 (ChatTextType)Код: ui/theme/Type.kt
Число шрифтов9Код: ThemeSettingsScreen.fontOptions
Сетка отступов4dp (16/12/8)Скилл y83-ux

Квот и лимитов, требующих сервера, нет.

9. Ловушки и ограничения

  • Сброс необратим: Reset appearance возвращает и режим, и шрифт, и все семь размеров к заводским — отдельного сброса только размеров нет.
  • Тёмный дефолт, а не системный: при первом запуске theme_mode = dark, хотя в диалоге сброса написано «restore the system appearance mode» — то есть после сброса поведение отличается от исходного.
  • Тексты экрана частично на английском (01 / APPEARANCE, Font, Reset appearance): экран не проходит стадию i18n ворот как чистый файл, в отличие от строк в res/values*.
  • Размеры чата не применяются к UI — только к тексту ленты Codex; подписи интерфейса живут по теме Material.
  • Живой предпросмотр показывает только два бабла: стили остальных пяти типов видно лишь в строке образцов.

10. Источники правды

  • app/src/main/java/com/y83/ws/ui/theme/ThemeSettingsScreen.kt — экран.
  • app/src/main/java/com/y83/ws/ui/theme/Type.kt — ChatFontConfig, семейства, chatStyle.
  • app/src/main/java/com/y83/ws/ui/theme/Theme.kt — подстановка режима и шрифтов.
  • app/src/main/java/com/y83/ws/ui/theme/Color.kt, SemanticColors.kt — палитра.
  • app/src/main/java/com/y83/ws/App.kt — ключи PREF_THEME_MODE, PREF_CHAT_*, save*.
  • app/src/main/res/font/ — файлы шрифтов; app/src/main/res/values/strings.xml — theme_sample_*.
  • app/src/main/java/com/y83/ws/data/InstrumentCatalog.kt — карточка хаба.

Источник: docs/project/hub/32-theme.md · Приложение · 1 147 строк в 8 файлах. Страница собирается из документации проекта при сборке сайта.