Maia AI-агенты для бизнеса

Стеклянный люкс

Дизайн-система Maia. Полупрозрачные панели над живым цветным фоном: глубина строится материалом, а не рамками. Одна система на кабинет, лендинг и виджет.

Направление Spatial UI (VisionOS) Шрифт Inter, самохостинг Тем 2, равноправны Версия 1.0 · 3 августа 2026

Основание

Пять правил, из которых выводится всё остальное. Спор о конкретном элементе решается возвращением сюда, а не голосованием.

Фон живёт, панели плавают

Фон — три цветных пятна на градиенте. Он зафиксирован и не скроллится вместе с содержимым. Панели над ним размывают то, что под ними, и потому меняются на глазах при прокрутке.

Стекло — материал, не украшение

Панель, карточка, первичная кнопка, поле — стекло. Разделитель, текст, иконка — нет. Если светится каждый элемент, не светится ни один.

Иерархию держит цвет

Первичная кнопка — изумрудное стекло, вторичная — нейтральное стекло того же материала. Разница в цвете, а не в наличии материала.

Две темы равноправны

Ни одна не «основная». Набор токенов один, значения разные. Тема ставится атрибутом data-theme на <html>.

Материал отключаем

Пользователь просит систему убрать прозрачность — стекло становится плотной панелью, и дизайн не разваливается. Это работает сейчас, а не «заложено на будущее».

Где система не работает. Направление VisionOS прямо предупреждает: не для текстовых документов и не там, где требуется высокий контраст. Юридические страницы и длинные статьи набираются на плотной подложке --solid-panel, а не на стекле.

Знак

Буква M на изумрудном градиенте в квадрате со скруглением. Знак несёт тот же стеклянный объём, что и первичная кнопка: светлая верхняя кромка, глянец сверху, цветная тень снизу.

Размеры

Радиус скругления растёт вместе со знаком — примерно 30% стороны. Ниже 24px внутренний глянец не читается и убирается.

M
64 · обложка
M
40 · шапка
M
32 · компакт
M
24 · строка
M
16 · favicon

Блок бренда и охранное поле

Знак плюс название плюс необязательный подзаголовок. Отступ между знаком и текстом — --s3. Свободное поле вокруг блока — половина высоты знака с каждой стороны.

M Maia Кабинет агентства M Maia

Так

  • Буква набрана Inter 700. Начертание должно быть загружено — иначе браузер рисует поддельный жирный.
  • Глиф опущен на 1px: наклонный глянец тянет оптический центр вверх.
  • На чужом фоне знак кладётся на плашку --brand-plate.

Не так

  • Не перекрашивать градиент под контекст — он часть узнавания.
  • Не растягивать: знак всегда квадратный.
  • Не класть на фотографию без плашки — стеклянная тень пропадает.
  • Не набирать «Maia» капсом и не разряжать трекингом.

Цвет

Клик по образцу копирует имя токена. Значения меняются вместе с темой — переключите её в шапке и сравните. Цифра в углу — контрастность к той базе, на которой токен реально лежит: текст меряется к фону, --on-accent — к акценту. Красная означает, что порог не взят. Где сравнение бессмысленно — градиент, полупрозрачная поверхность — цифры нет.

Бренд

Акцент инвертируется по яркости: на тёмном фоне светлый изумруд, на светлом — глубокий. Поэтому текст на акценте тоже разный.

Ловушка. Белый текст на акценте работает только в светлой теме. В тёмной акцент яркий, и белый по нему нечитаем — там --on-accent почти чёрный. Брать #fff вслепую нельзя.

Текст

Правило третичного. Прозрачность поднята до .47 в тёмной теме и .60 в светлой — на прежних .42 и .52 контраст был 3.9 и 3.53 при пороге 4.5, а токеном набраны плейсхолдеры и подписи, то есть текст. Порог теперь взят, но правило остаётся: --txt-3 для того, что можно не прочитать. Всё, что несёт смысл, — минимум --txt-2.

Поверхности

Полупрозрачные слои. Контрастность для них не считается — она зависит от того, что оказалось под панелью.

Статусы

Четыре семейства по четыре токена: фон, рамка, текст, точка. Цвет никогда не единственный носитель смысла — рядом всегда точка и слово. Ниже измерены текстовые токены: именно они несут смысл. Точка декоративна и порогом не связана.

Работает Пробный период На паузе Ошибка оплаты

Фон

Три радиальных пятна одинаковой геометрии в обеих темах, разной светлоты, поверх диагонального градиента. При prefers-reduced-transparency заменяется плотным --solid-bg.

Типографика

Inter — и заголовки, и текст. Один шрифт вместо пары: направление VisionOS требует нейтральной системной ясности, а контраст засечки против гротеска добавил бы характера там, где он мешает читать данные.

Начертания

400 Regular — основной текст, длинные абзацы
500 Medium — навигация, ячейки таблиц, метки
600 Semibold — кнопки, заголовки экранов, акценты в тексте
700 Bold — заголовки лендинга, знак M
Доставка. Файлы лежат в проекте: @fontsource/inter в кабинете, woff2 в бандле лендинга. Google Fonts не подключается — под РФ внешний CDN может отдать таймаут, страница молча упадёт на системный стек, и это будет другой дизайн, о котором никто не узнает.

Шкала

Правила набора

Так

  • Трекинг заголовков -.02em: крупный Inter без сжатия выглядит рыхло.
  • Межстрочный 1.6 в тексте, 1.05–1.2 в заголовках.
  • Строка текста 65–75 символов. Шире — глаз теряет начало следующей.
  • Числа в таблицах и метриках — класс .tnum, моноширинные цифры. Иначе колонка дёргается при обновлении.
  • Над заголовком воздуха больше, чем под ним.

Не так

  • Не набирать заголовок градиентом. Выделение делают вес и размер.
  • Не ставить надзаголовок-рубрику над заголовком: заголовок несёт себя сам.
  • Не использовать моноширинный шрифт «для технологичности» — только для кода, данных и измерений.
  • Не вводить размеры вне шкалы.
  • Не набирать интерфейсный текст капсом длиннее двух слов.

Ритм и форма

Одна шкала отступов с шагом 4px на весь продукт. Значений вне шкалы в коде быть не должно — кроме оптических поправок в 1–2px, и каждая такая поправка объясняется комментарием на месте.

Отступы

Радиусы

Радиус растёт вместе с элементом. Маленький радиус на большой карточке читается как обрезанный угол, большой на кнопке — как капсула.

--radius-xs
9px · чипы, ползунки
--radius-sm
11px · поля, меню
--radius
13px · кнопки
--radius-md
16px · панели
--radius-lg
20px · карточки
--radius-pill
999px · статусы
Одно исключение. Скругление знака M и логотипа клиента пропорционально стороне — около 30% — и меняется вместе с размером. Там литерал с комментарием, а не шаг шкалы: иначе знак 16px и знак 64px получили бы одинаковый угол и выглядели бы разными фигурами.

Размеры

ЧтоКабинетЛендингПочему
Высота кнопки и поля42px46pxплотность против пальца на телефоне
Ширина содержимогово всю ширину1180pxтаблицы шире экрана не бывают лишними
Боковая панель264 / 216 / 64pxполная, узкая, только иконки
Строка таблицы68pxпомещается логотип клиента 36px с полями
Ряды выравниваются по сетке, а не по содержимому. Карточки в ряду — одной высоты (grid-auto-rows:1fr). Разнобой читается как небрежность раньше, чем читается содержание.

Материал

Стеклянная панель — четыре слоя, и все четыре обязательны. Убрать любой значит получить полупрозрачный прямоугольник вместо стекла.

1 · Размытие подложки

backdrop-filter: blur() saturate(). Насыщенность выше 100% обязательна — иначе размытый фон сереет и стекло выглядит грязным.

2 · Заливка и рамка

Полупрозрачная --panel-bg и рамка --panel-border в 1px. Заливка нужна, чтобы текст поверх читался.

3 · Верхняя кромка

Внутренняя тень inset 0 1px 0. Именно она даёт ощущение толщины — свет ложится на верхнее ребро.

4 · Блик

Радиальный градиент из правого верхнего угла в ::after. Один источник света на всю страницу — блики не спорят между собой.

Плюс внешняя тень 0 20px 50px — со смещением и мягким размытием. Цветное свечение без смещения — декорация, а не глубина.

Два веса стекла

.glass

Размытие 22–26px, блик, внешняя тень. Верхнеуровневые поверхности: карточки, модальные окна, боковая панель, шапка.

.glass-lite

Размытие 16px, без блика и без внешней тени. Вложенное: поля ввода, вторичные кнопки, ячейки, сегментные переключатели.

Стекло в стекле не вкладывается глубже двух уровней. Третий слой размытия даёт мутное пятно, в котором не читается ничего.

Где стекло запрещено

Контекстное меню и выпадающие списки — плотная подложка --solid-panel, размытие выключено. Меню всплывает поверх произвольного содержимого: под ним может оказаться таблица, картинка или другое меню, и стекло сделает его нечитаемым.

Компоненты

Готовый набор. Новый экран собирается отсюда; компонента нет в брендбуке — сначала он появляется здесь, потом в коде.

Кнопки

Первичная — изумрудное стекло, на экране она одна. Вторичная — нейтральное стекло того же материала. Опасная — красное стекло, только для необратимого.

Надпись называет действие. «Добавить клиента», а не «ОК». «Отмена», а не «Назад», если ничего не сохраняется.

Поля ввода

Не хватает домена после @
Ошибка называет проблему и способ выйти из неё. «Не хватает домена после @», а не «Неверный формат».

Переключатели

Индикатор скользит к выбранному сегменту, а не мигает. Ширина измеряется по факту — сегменты разной длины. При prefers-reduced-motion скольжение выключается.

Навигация

Активный пункт — нейтральный стеклянный чип со светлой кромкой, иконка перекрашивается в акцент. Активность не отмечается цветной полосой слева: она спорит с материалом.

Таблица

КлиентСтатусДиалоговЛидов
Пекарня на Мясницкой Работает 1 28496
Автосервис «Ветер» Пробный 31221
Стоматология «Дента» На паузе 00
Шапка зафиксирована, прокручивается только тело. Числа — .tnum. Логотип клиента несёт тот же стеклянный объём поверх произвольного цвета: светлая кромка, глянец, мягкая тень.

Состояния

Экран не готов, пока не нарисованы все шесть. Пустой список и ошибка сети встречаются пользователю чаще, чем идеальный сценарий, — и почти всегда остаются недорисованными.

СостояниеКак выглядитПравило
Обычноематериал по рецепту
Наведениеподложка --hover, кнопка поднимается на 1px0.2s, кривая проекта
Фокусизумрудное кольцо 2px, отступ 2pxтолько с клавиатуры, от мыши не показывается
Нажатиеscale(.975)без тени — элемент «уходит» вглубь
Отключенопрозрачность 0.5, тень снятакурсор обычный, не «запрещено»
Загрузкакольцо в кнопке, серые полосы в спискезаглушка повторяет форму будущих данных

Пусто, грузится, сломалось

Клиентов пока нет
Добавьте первого — бот заработает через 10 минут
Загружаем диалоги
Не удалось загрузить диалоги

Сервер не ответил за 30 секунд. Данные не потеряны — попробуйте ещё раз.

Пустое состояние продаёт следующий шаг. Не «Нет данных», а что сделать и что из этого выйдет.

Иконки

Контурные SVG на сетке 24×24, толщина линии 1.6, скругления на концах. Заливок нет. Цвет наследуется от текста, поэтому иконка сама перекрашивается вместе с темой.

дом
аналитика
диалоги
клиенты
оплата
база знаний
добавить
поиск
править
удалить
готово
внимание

Так

  • Размеры в интерфейсе: 20px в навигации, 18px в кнопках и полях, 17px в контекстном меню.
  • stroke="currentColor" — иконка следует за цветом текста.
  • Иконка сопровождает слово. В одиночку — только там, где действие общеизвестно.
  • Одиночная иконка-кнопка получает aria-label.

Не так

  • Эмодзи вместо иконки — никогда. Они рисуются системным шрифтом, выглядят по-разному на Windows, Mac и Android и не подчиняются теме.
  • Не смешивать толщины: сейчас в кабинете гуляет 1.5–2, это ошибка, а не вариативность.
  • Не заливать контурную иконку цветом «для акцента».

Движение

Одна кривая на весь продукт: резкий старт, долгий выход. Так двигаются физические предметы, которые тормозятся сопротивлением.

ТокенЗначениеДля чего
--easecubic-bezier(.22,1,.36,1)всё без исключения
--dur-fast.12sпоявление меню, подсветка пункта
--dur.2sцвет, фон, рамка
--dur-slow.28sсдвиг, тень, масштаб

Что двигается

  • Подъём кнопки на 1px при наведении и уход в scale(.975) при нажатии.
  • Скольжение индикатора в сегментном фильтре и переключателе тем.
  • Появление контекстного меню — 0.12s, сдвиг на 4px вверх.
  • Проявление блоков лендинга при прокрутке — по одному разу, из уже видимого положения.

Что не двигается

  • Смена экрана. Кабинет открывают ежедневно: анимация, милая на первом запуске, на сотом становится задержкой.
  • Появление данных в таблице.
  • Переключение темы — мгновенно, иначе видно, как перекрашиваются слои.
  • Одинаковый въезд у каждой секции подряд. Один авторский момент, а не эффект на всём.
При prefers-reduced-motion длительности сокращаются до 0.01ms. Не до нуля — нулевая длительность ломает переходы, завязанные на событие окончания анимации.

Доступность

Стекло и прозрачность — самая рискованная часть системы. Поэтому контрастность посчитана, а не оценена на глаз, и всё лишнее отключается системными настройками пользователя.

Что уже сделано

МеханизмЧто происходит
prefers-reduced-transparencyстекло становится плотным, блик убирается, фон — сплошной цвет
prefers-reduced-motionвсе переходы 0.01ms, скольжение индикаторов выключено
color-schemeсистемные попапы <select> и автозаполнение приходят в тон темы
:focus-visibleкольцо только при навигации с клавиатуры; клик мышью рамку не рисует
Точка у статусасмысл не кодируется одним цветом — рядом форма и слово

Контрастность, измерено

Отношение к плотному фону темы. Порог WCAG AA: 4.5 для текста, 3.0 для крупного и для элементов управления.

ТокенТёмнаяСветлаяВердикт
--txt17.6315.97проходит
--txt-28.028.30проходит
--txt-34.584.52проходит
--accent9.864.51проходит
--on-accent на акценте9.895.08проходит
Текст на первичной кнопке5.495.49проходит
Текст на опасной кнопке5.535.53проходит
--danger6.494.99проходит
Пять провалов найдено замером и закрыто. --txt-3 поднят с .42/.52 до .47/.60. Стопы обеих цветных кнопок затемнены — тень под текстом контраст не заменяет. Светлый --danger сдвинут с #C4443E на #B93B35. Для кнопок взят худший случай: белый текст на самом светлом стопе градиента поверх самой светлой подложки.

Голос

Maia продаёт результат, а не технологию. Клиент агентства покупает отвеченные заявки, а не векторный поиск.

ВместоПишем
Осуществите активацию ботаВключите бота
Данные успешно сохраненыСохранили
Ошибка 500. Что-то пошло не такСервер не ответил. Данные не потеряны, попробуйте ещё раз
Инновационная AI-платформа нового поколенияБот отвечает клиентам за секунды и приводит заявки круглосуточно
Нет данныхКлиентов пока нет. Добавьте первого — бот заработает через 10 минут
Неверный форматНе хватает домена после @
Кнопка называет своё действие. Ошибка называет проблему и способ выйти из неё. Обращение к пользователю — на «вы» со строчной. Редактура русского текста в интерфейсе — по инфостилю, скилл pishi.

Расхождения

Лендинг портирован из кабинета. Двенадцать мест разошлись — все сведены 3 августа 2026. Таблица оставлена как история решений: она объясняет, почему высота кнопки различается намеренно, а всё остальное нет.

ЧтоБыло в кабинетеБыло на лендингеСтало
Базовый размер текста15px16px16px везде, таблицы на --t-table
Шкала отступовs1…s10s1…s20 с пропускамиполная сплошная в обоих
Токены радиусовнет, литералычастичнолестница xs…pill в обоих
Высота кнопки42px46pxоставлено намеренно: плотность против пальца
Класс .pillметка статусаакцентная плашкана лендинге это .tag
--divider, тёмная.07.09.09
Статусные цветаестьнетдобавлены на лендинг
--card-solid, --accent-2нетестьдобавлены в кабинет
Inter 700не загружалсязагружалсязагружается в обоих
Толщина линии иконок1.5 – 21.8 – 2.51.6 везде, 30 иконок
Полоса прокруткистекляннаясистемная плоскаястеклянная в обоих
Нажатая кнопкаtranslateY(1px)scale(.975)scale(.975)
Заодно вскрылось. Цвет первичной кнопки был вписан числами прямо в правило .btn мимо токена --btn-grad: правка цвета из одного места не работала, хотя токен существовал. Теперь кнопка красится токеном.

Применение

Как этим пользоваться и что считается нарушением.

ФайлЧто в нём
DESIGN.mdконтракт системы, источник истины. Правка начинается здесь
brand/tokens.jsonвсе токены машиночитаемо, плюс рецепты и замеры контраста
brand/brandbook.htmlэта страница
prototype/src/index.cssреализация в кабинете
maia24-site/src/styles/theme.cssреализация на лендинге

Четыре правила

Компонент берётся отсюда

Новый экран собирается из готового. Своего не изобретаем.

Значение — только токеном

Цвет, отступ, радиус вписанные числом в правило — ошибка, а не мелочь.

Нового компонента нет — сначала сюда

Он появляется в брендбуке, потом в коде. Обратный порядок даёт два набора кнопок.

Токен правится в трёх местах

tokens.json и оба CSS-файла. Расхождение между ними означает, что продукт распался на два.

Чек-лист перед сдачей экрана

Обе темы проверены глазами, не рассуждением
Нарисованы шесть состояний, включая пустое и ошибку
Экран пройден клавиатурой — фокус видно везде
Смысловой текст не набран --txt-3
Карточки в ряду одной высоты
Реальный текст, не «Lorem ipsum» — на всех ширинах
Стекло не вложено глубже двух уровней
Всплывающие слои на плотной подложке