Язык и оформление

Настройки задаются при создании каждого экземпляра админки. API одинаков для FastAPI и Litestar:

from quite_admin import Admin, Theme

admin = Admin(
    auth=auth_backend,
    secret_key=session_secret,
    title="Управление магазином",
    description="Товары, клиенты и заказы в одном месте.",
    language="ru",
    logo="assets/logo.svg",
    theme=Theme(
        primary="#2563eb",
        background="#f8fafc",
        surface="#ffffff",
        text="#0f172a",
        muted="#64748b",
        border="#e2e8f0",
        danger="#dc2626",
        on_primary="#ffffff",
        on_danger="#ffffff",
    ),
)

Все настройки необязательны. По умолчанию используются title="Quite Admin",
description="", language="en" и нейтральная тёмно-серая тема с ярким синим акцентом.

Язык

language="en" включает английский, language="ru" — русский. Другие значения вызывают ValueError.
Переведены все встроенные экраны: вход, навигация, действия CRUD, пустые состояния,
пагинация, подписи логических значений, ошибки валидации и стандартные сообщения библиотеки.
Счётчики записей, таблиц и полей учитывают русские формы множественного числа.
Атрибут HTML lang соответствует выбранному языку.

Язык выбирается в конфигурации приложения. Автоматического определения по браузеру,
настроек языка пользователя и встроенного переключателя нет.
Несколько экземпляров админки в одном приложении могут иметь разные языки и темы.
При их размещении на одном хосте задавайте разные имена session_cookie.

Названия моделей и полей, подсказки, варианты enum, ошибки собственных адаптеров,
тексты своих страниц и значения записей задаёт приложение. Они не переводятся автоматически.
Для подписей используйте ModelOptions(label=...) и FieldOptions(label=..., help_text=...).
Переводятся только известные сообщения библиотеки; неизвестные ошибки показываются как переданы.
В формы по-прежнему отправляются true / false. Данные, URL и имена событий логирования не меняются.

В обоих языках интерфейса зарегистрированные модели называются таблицами: одинаковые
названия используются в навигации, на главной, в фильтрах истории и ссылках схемы. Для
просмотра записей выберите Список таблиц на главной или нажмите Найти таблицу. Существующие
собственные шаблоны могут продолжать использовать ключи t('Collections'),
t('Open collection') и tn('collection', 'collections', count); они показывают новые названия.
Python-идентификаторы, например Admin.configure(collection, ...), поля истории и параметры
фильтров с именем collection, а также URL /models/<slug>/ сохраняют совместимость.

Название и описание

title задаёт имя админки в заголовке браузера и основном заголовке главной
и страницы входа. На остальных страницах после входа логотип и название админки
показаны справа в шапке; хлебные крошки начинаются с текста Главная.
Версия библиотеки показывается в меню профиля.

description — обычный текст под названием на странице входа и под заголовком главной.
Он также попадает в HTML-метаданные описания. При пустом описании meta-тег и текст
описания под названием на главной не добавляются. Оба значения экранируются как текст.

logo — путь к существующему локальному SVG, PNG, JPEG, WebP или GIF.
Относительные пути вычисляются от рабочего каталога приложения. Изображение доступно по
маршруту /logo с учётом mount/proxy и показывается рядом с названием на главной,
на странице входа и справа в шапке остальных страниц после входа.
По умолчанию используется встроенный синий знак q, он же — favicon. Отсутствующий файл или неподдерживаемое расширение вызывают
ValueError. Свои шаблоны получают logo_url; внешние хосты и изменение CSP не нужны.

Цвета

Theme принимает цвета в шестнадцатеричном формате #RGB или #RRGGBB в любом регистре.
Некорректное значение вызывает ValueError при создании темы.

По умолчанию используется нейтральная тёмно-серая палитра с яркими синими акцентами.
Интерфейс сохраняет компактные контролы и карточку входа; логотип расположен рядом с названием. Обложка для GitHub —
отдельный файл репозитория; на странице входа она не отображается.

Параметр По умолчанию Применение
primary #3395fd Основные действия, выбранная навигация, активные поиск и сортировка
background #181818 Основной фон страниц
surface #202020 Полоса значков, шапка, карточки, поля ввода и панели
text #fefefe Основной текст
muted #b7b2bf Вторичный текст и подсказки
border #3b3b45 Рамки и разделители
danger #ff8798 Удаление и ошибки
on_primary #111111 Текст основных кнопок
on_danger #111111 Текст кнопок удаления

Цвета наведения и тонированные фоны вычисляются из палитры. Подбирайте читаемые сочетания
текста и фона, в том числе on_primary и on_danger. Пример тёмной палитры:

theme = Theme(
    primary="#93c5fd",
    background="#0f172a",
    surface="#172033",
    text="#e2e8f0",
    muted="#94a3b8",
    border="#334155",
    danger="#fca5a5",
    on_primary="#0f172a",
    on_danger="#450a0a",
)

Тема загружается с собственного маршрута админки /theme.css после основного CSS.
Префиксы монтирования и reverse proxy учитываются автоматически.
Встроенные стили, внешний CDN и JavaScript не нужны; политика style-src 'self' сохраняется.

Общая система интерфейса

Встроенные экраны используют общие компактную типографику, токены отступов и компоненты.
Сохранён системный стек шрифтов; скачивать шрифт не требуется. Скругления — 4 px у меток,
6 px у элементов управления и 8 px у панелей. Поверхности близки к фону страницы
и отделены рамками 1 px. Всплывающие панели отделяются от страницы тёмной тенью.

Высота строк таблицы задаётся токенами плотности; числовые столбцы выровнены вправо и используют табличные цифры.
Выбранная сортировка отмечена стрелкой направления и aria-sort; первый выбор столбца
сортирует по возрастанию. Панель поиска расположена над таблицей, а число записей — рядом с заголовком страницы.
SVG-звёздочка рядом с названием таблицы и звёздочки глобального поиска используют
общее состояние закрепления на главной. Кнопка × в недавних таблицах удаляет только
этот недавний переход; повторное открытие таблицы возвращает его. Ограничения
хранения в браузере и навигация описаны в обзоре интерфейса.
Активный поисковый запрос показан под панелью поиска. Сброс
возвращает на первую страницу, сохраняя сортировку и размер страницы. Ссылка на запись
доступна с клавиатуры, удаление открывает отдельное подтверждение. Наведение и фокус
выделяют текущую строку. Флажки выбирают записи текущей страницы; компактная иконка справа
открывает массовые действия. Логические значения показаны нейтральным
текстом: «Да» и «Нет» не означают успех и ошибку. Акцент обозначает действия
и выбор; красный — опасные действия и ошибки.

В форме обычные изменяемые поля, JSON, неизменяемые значения и связи разделены на секции
внутри одной поверхности. Кнопки сохранения и отмены остаются видимыми при прокрутке.
Встроенные элементы связывают подсказки и ошибки через aria-describedby, ошибочные поля
отмечены aria-invalid. Собственным шаблонам полей следует соблюдать тот же подход.
Пользовательские действия записи вынесены в секцию «Действия». На узких экранах форма
становится одноколоночной, полоса значков остаётся узкой, таблицы сохраняют
горизонтальную прокрутку для сравнения данных.

В собственных стилях с того же origin можно использовать общие токены:

Токены Назначение
--text-xs, --text-sm, --text-base, --text-section, --text-title Шкала типографики
--space-1 … --space-6, --space-8, --space-10 Отступы 3, 6, 10, 13, 16, 19, 26 и 32 px
--radius-sm, --radius-control, --radius Скругления меток, элементов управления и поверхностей
--bg, --paper, --subtle, --hover Фон страницы, поверхность, вложенный фон и состояние строки
--line, --border, --control-height Рамки и общая высота элементов управления 31 px

Существующие шаблоны, наследующие базовый, получают палитру и общие стили.
Для секций формы оберните каждый .form-grid в .form-section с подписанным заголовком.
.record-form задаёт внешние отступы поверхности, .form-footer — закреплённую область
кнопок. Свои переопределения можно сверить со встроенным form.html.

Свои шаблоны

Шаблоны, наследующие quite_admin/base.html, получают выбранные название, язык и цвета.
В общем контексте доступны title, description, language, theme, t и tn:

{% extends "quite_admin/base.html" %}
{% block content %}
  <h1>{{ 'Отчёты' if language == 'ru' else 'Reports' }}</h1>
  <p>{{ t('Save changes') }}</p>
  <p>{{ total }} {{ tn('record', 'records', total) }}</p>
{% endblock %}

t(message, **values) и tn(singular, plural, count) используют встроенный словарь.
Для своих текстов нужен перевод приложения, как в заголовке выше.
В Python те же функции доступны через admin.gettext(...) и admin.ngettext(...).

В собственном CSS с того же origin используйте var(--accent), var(--paper), var(--text),
var(--muted), var(--line) и var(--danger), чтобы соблюдать выбранную палитру.
Регистрация описана в разделе своих страниц и шаблонов.

Подключение своего CSS, примеры плотности и границы замены шаблонов описаны
в разделе кастомизации оформления.