Meridian Office

Meridian Design System (MDS) — дизайн-система и фирменный стиль

Раскрывает и дополняет раздел 5 библии (docs/00-foundation.md). Исходные токены библии не меняются: здесь они получают шкалы, состояния, размеры и правила применения. Источник значений для кода — spec/design-tokens.json (W3C DTCG); макеты используют mockups/assets/mds.css, иконки — mockups/assets/icons.svg. Версия 0.1 · 2026-10-03 · язык — русский; идентификаторы, токены, код — английский.

Содержание: 1. Бренд · 2. Цвет · 3. Типографика · 4. Сетка, геометрия, иконография · 5. Компоненты · 6. Паттерны взаимодействия · 7. Движение · 8. Доступность · 9. Платформенные адаптации · 10. Локализация · 11. Голос и тон · 12. Реализация в Qt · 13. Вопросы к библии и макетам.


1. Бренд

1.1 Идея и характер

Меридиан — линия отсчёта. От меридиана считают долготу; от Meridian Office пользователь считает рабочий день. Метафоры: карта, компас, штурманский стол. Три слова характера и что они значат на практике:

Характер Делаем Не делаем
Инженерный прямые линии, точные числа, сетка 4/8 px, монохромные иконки, табличные цифры декоративные градиенты, «стеклянные» эффекты, маскоты, иллюстрации-мультфильмы
Спокойный глубокие холодные цвета, один тёплый акцент, тени ≤ 24 px размытия, движение ≤ 200 мс мигание, пульсация, разноцветные бейджи, звуки без запроса
Точный текст без лишних слов, сетка выравнивания, состояния элементов различимы без цвета «примерно», «вроде», скруглённые «пузыри», неопределённые иконки

Палитра бренда: ink #0B3C5D (глубокий, карта ночью) и sun #F2A541 (тёплая точка на компасе). Соотношение на любом носителе: ink ≥ 80 % площади акцентов, sun ≤ 20 % — только «засечка», выделение, звёзды избранного, прогресс.

1.2 Логотип пакета

Конструкция на сетке 64 × 64 (модуль m = 4 px; все координаты кратны m или m/2):

Элемент Геометрия (при 64 px) Штрих Цвет
Кольцо (глобус) центр (32, 34), r = 22 (диаметр 44 = 11 m) 4 px (1 m) ink
Меридиан вертикаль x = 32, от y = 12 до y = 56 (выходит за кольцо на 1 m сверху и снизу) 4 px, концы круглые ink
Экватор горизонталь y = 34, от x = 12 до 52 2 px ink, непрозрачность 45 %
Внутренний меридиан эллипс центр (32, 34), rx = 10, ry = 22 2 px ink, непрозрачность 45 %
Засечка компаса круг центр (32, 8), r = 4 заливка sun

Эталонный файл — mockups/assets/logo.svg. Полная форма:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
  <circle cx="32" cy="34" r="22" fill="none" stroke="#0B3C5D" stroke-width="4"/>
  <path d="M32 12v44" stroke="#0B3C5D" stroke-width="4" stroke-linecap="round"/>
  <path d="M12 34h40" stroke="#0B3C5D" stroke-width="2" stroke-linecap="round" opacity=".45"/>
  <ellipse cx="32" cy="34" rx="10" ry="22" fill="none" stroke="#0B3C5D" stroke-width="2" opacity=".45"/>
  <circle cx="32" cy="8" r="4" fill="#F2A541"/>
</svg>

Монохромная форма (один цвет, без полупрозрачности — печать в одну краску, тиснение, лазер):

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
  <circle cx="32" cy="34" r="22" fill="none" stroke="currentColor" stroke-width="4"/>
  <path d="M32 12v44" stroke="currentColor" stroke-width="4" stroke-linecap="round"/>
  <circle cx="32" cy="8" r="4" fill="currentColor"/>
</svg>

Упрощённая форма для 16–20 px (фавикон, строка состояния, трей): кольцо r = 6, штрих 1,5, меридиан, точка r = 1,5.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
  <circle cx="8" cy="9" r="5.5" fill="none" stroke="currentColor" stroke-width="1.5"/>
  <path d="M8 3v12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
  <circle cx="8" cy="2" r="1.5" fill="#F2A541"/>
</svg>

Правила:

Правило Значение
Охранное поле не менее 0,5 диаметра кольца (22 px при 64) со всех сторон; внутрь поля не заходят текст, другие знаки, край носителя
Минимальный размер, экран 16 px — упрощённая форма; 24 px — полная без внутреннего меридиана и экватора; ≥ 32 px — полная
Минимальный размер, печать 6 мм (монохромная), 10 мм (полная)
Цветовые варианты ink + sun на светлом (#F5F6F8…#FFFFFF); белый + sun на ink, на цвете приложения и на фото с затемнением ≥ 40 %; чёрный однокрасочный; белый однокрасочный
Фон только ровный; на фото — через подложку-плашку ink с радиусом 22 % или затемнение
Недопустимо поворот (кроме 0°), непропорциональное масштабирование, градиент, тень, обводка кольца вторым цветом, перенос засечки, замена sun на другой цвет, добавление текста внутрь кольца, «3D», анимация вращения кольца (допустима только анимация засечки в сплэше, см. 1.6)

1.3 Словесный знак

1.4 Значки приложений

Единая сетка 64 × 64: скруглённый квадрат, радиус 22 % стороны = 14 px, заливка — базовый цвет приложения, глиф белый, контурный, штрих 4 px, концы и соединения круглые, активная область глифа 32 × 32 (поля по 16 px), допустимый выход за область — 2 px. Глиф — знак сути, не буква. Второй цвет допустим только у Hub (засечка sun).

# Приложение Токен Цвет Глиф
0 Hub color.apps.hub #0B3C5D логотип: кольцо + меридиан + засечка sun
1 Write color.apps.write #3B5BDB перо под 45° над строкой
2 Sheets color.apps.sheets #1E8E5A сетка 2 × 2
3 Slides color.apps.slides #E25C3D широкий прямоугольник с треугольником «play»
4 Draw color.apps.draw #0E8A8A два узла (квадрат, круг), соединённые коннектором
5 Paint color.apps.paint #C2309B капля-кисть с бликом
6 PDF color.apps.pdf #C92A2A лист с загнутым углом и двумя строками
7 Math color.apps.math #495057 знак суммы ∑
8 Notes color.apps.notes #7048E8 закладка
9 Mail color.apps.mail #1C7ED6 конверт
10 Base color.apps.base #A61E4D цилиндр (две секции)
11 Forms color.apps.forms #5C940D список: галочка + строка, квадрат + строка
12 Publisher color.apps.publisher #D6336C разворот из двух страниц с полосами вёрстки
13 Plan color.apps.plan #E67700 три бруска диаграммы Ганта ступенькой

SVG каждого глифа (общая подложка <rect width="64" height="64" rx="14" fill="{цвет}"/>, стиль глифа fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" — ниже обозначен G):

<!-- Hub -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#0B3C5D"/>
  <circle cx="32" cy="35" r="13" fill="none" stroke="#fff" stroke-width="4"/>
  <path d="M32 22v26" stroke="#fff" stroke-width="4" stroke-linecap="round"/>
  <circle cx="32" cy="15" r="3.5" fill="#F2A541"/></svg>

<!-- Write -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#3B5BDB"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <path d="M41 17l6 6-19 19-8 2 2-8z"/><path d="M18 47h28"/></g></svg>

<!-- Sheets -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#1E8E5A"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <rect x="18" y="18" width="28" height="28" rx="3"/><path d="M32 18v28M18 32h28"/></g></svg>

<!-- Slides -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#E25C3D"/>
  <rect x="16" y="20" width="32" height="24" rx="3" fill="none" stroke="#fff" stroke-width="4" stroke-linejoin="round"/>
  <path d="M29 26v12l10-6z" fill="#fff"/></svg>

<!-- Draw -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#0E8A8A"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <rect x="16" y="16" width="12" height="12" rx="2"/><circle cx="42" cy="42" r="6"/>
    <path d="M28 22h8a4 4 0 0 1 4 4v10"/></g></svg>

<!-- Paint -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#C2309B"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <path d="M32 16c7 9 12 15 12 22a12 12 0 0 1-24 0c0-7 5-13 12-22z"/><path d="M26 38a6 6 0 0 0 4 5"/></g></svg>

<!-- PDF -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#C92A2A"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <path d="M20 16h16l10 10v22H20z"/><path d="M36 16v10h10"/><path d="M27 34h10M27 41h10"/></g></svg>

<!-- Math -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#495057"/>
  <path d="M22 18h20l-12 14 12 14H22" fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>

<!-- Notes -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#7048E8"/>
  <path d="M22 16h20v32l-10-7-10 7z" fill="none" stroke="#fff" stroke-width="4" stroke-linejoin="round"/></svg>

<!-- Mail -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#1C7ED6"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <rect x="16" y="20" width="32" height="24" rx="3"/><path d="M16 25l16 11 16-11"/></g></svg>

<!-- Base -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#A61E4D"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <ellipse cx="32" cy="20" rx="14" ry="5"/><path d="M18 20v24c0 3 6 5 14 5s14-2 14-5V20"/><path d="M18 32c0 3 6 5 14 5s14-2 14-5"/></g></svg>

<!-- Forms -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#5C940D"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <path d="M17 24l4 4 7-8"/><path d="M34 24h13"/><rect x="18" y="36" width="8" height="8" rx="2"/><path d="M34 40h13"/></g></svg>

<!-- Publisher -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#D6336C"/>
  <g fill="none" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
    <path d="M16 18h14v28H16zM34 18h14v28H34z"/><path d="M22 26v12M39 26h4M39 32h4M39 38h4"/></g></svg>

<!-- Plan -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#E67700"/>
  <path d="M17 21h16M24 32h22M31 43h14" fill="none" stroke="#fff" stroke-width="6" stroke-linecap="round"/></svg>

Платформенные варианты (все собираются скриптом tools/icons/build.py из одного источника brand/app-icons/*.svg):

Платформа Форма Размеры Особенности
macOS системный сквиркл (суперэллипс macOS 11+); исходник 1024 × 1024, видимая область 824 × 824 (поля 100), глиф в области 412 × 412 .icns 16…1024 (@1x/@2x), подаётся как Icon Composer .icon для macOS 26 светлый — как базовый; тёмный — фон градиент apps.<x>.800 → 900 (сверху вниз), глиф цвета apps.<x>.300; тонированный (tinted) — монохромный глиф на нейтральной подложке, оттенок задаёт система; прозрачный (clear) — глиф белый со встроенной тенью 0 1 2 / 0,3. Радиус скругления не рисуем — его задаёт маска ОС
Windows 11 скруглённый квадрат 22 % с прозрачностью вокруг (без белой подложки) .ico: 16, 20, 24, 32, 40, 48, 64, 256 (256 — PNG внутри ICO); плюс Square44x44Logo, Square150x150Logo, Wide310x150Logo, StoreLogo для MSIX с масштабами 100–400 % на 16–24 px — упрощённый глиф (штрих 2 px при 24, без мелких деталей: у Paint нет блика, у PDF нет строк, у Base одна секция); плитка MSIX — глиф на прозрачном фоне, цвет плитки = цвет приложения (BackgroundColor в манифесте)
Linux hicolor: скруглённый квадрат 22 %; symbolic — монохром /usr/share/icons/hicolor/{16,22,24,32,48,64,128,256,512}x…/apps/org.meridian.Write.png + scalable/apps/org.meridian.Write.svg; symbolic/apps/org.meridian.Write-symbolic.svg (16 × 16, fill="#bebebe", классы class="success"/warning/error не используются) имена по reverse-DNS org.meridian.<App> совпадают с app-id Flatpak и .desktop; symbolic — только глиф, без подложки, заливкой (не штрихом), чтобы GTK/KDE перекрасили его

Общие требования: контраст белого глифа к заливке ≥ 3:1 на всех 14 (минимум — Plan #E67700, 3,00:1; Sun как фон значка не используется); на тёмной теме ОС значок не меняется (кроме macOS-варианта «тёмный»); значок не содержит текста и номера версии.

1.5 Значки типов файлов

Единая основа — лист с загнутым углом (64 × 64: лист 40 × 52 с углом 14 px, обводка border-strong 2 px, заливка surface), глиф приложения цветом приложения (штрих 3 px, область 24 × 24 в нижней части листа). Так документ отличается от значка приложения (цветной квадрат) с первого взгляда, а принадлежность читается по глифу и цвету.

Тип Расширения Отличие
Документ .mwx .msx .mpx .mvx .mpi .meq .mnx .mmx .mbx .mfx .mpub .mpln базовая форма
Шаблон .mwt .mst .mpt .mvt .mft .mpubt обводка листа пунктирная (4/3), в загнутом углу — маленькая звезда sun
Плоский XML .mwxf .msxf .mpxf .mvxf вместо загнутого угла — угловые скобки < > в верхнем правом углу
Чужие форматы .docx .xlsx .pptx .odt .ods .odp .pdf … та же форма, глиф приложения-обработчика, в правом нижнем углу бейдж 18 × 12 с текстом формата (DOCX, ODT) — Inter 600, 8 px, белый на text-2
Бейджи состояния — { } — содержит скрипты; «печать» (кольцо с галочкой) — подписан; замок — зашифрован; облако — только в облаке. Бейдж 20 × 20 в правом нижнем углу, поверх обводки
<!-- .mwx: документ Write -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
  <path d="M13 5h26l12 12v42H13z" fill="#FFFFFF" stroke="#C9CED6" stroke-width="2" stroke-linejoin="round"/>
  <path d="M39 5v12h12" fill="#EEF0F3" stroke="#C9CED6" stroke-width="2" stroke-linejoin="round"/>
  <g fill="none" stroke="#3B5BDB" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="translate(20 28)">
    <path d="M18 2l4 4-13 13-6 2 2-6z"/><path d="M2 23h20"/></g>
</svg>

Размеры и форматы — те же, что у значков приложений (ICO 16–256 на Windows, ICNS на macOS, hicolor mimetypes/application-vnd.meridian-write.png на Linux + *.xml в share/mime/packages/meridian.xml). На 16 px остаётся лист + цветной прямоугольник 6 × 6 вместо глифа.

1.6 Заставка (splash) и «О программе»

Заставка показывается только если холодный старт превышает 400 мс (иначе окно появляется сразу), и исчезает по готовности окна документа (плавное растворение 160 мс).

Параметр Значение
Размер 480 × 300 логических px, без рамки, скругление 14 px, тень уровня 4 (см. 4.4), по центру экрана запуска
Фон surface темы (светлая #FFFFFF, тёмная #1F2228), без картинок
Содержимое логотип 64 px (слева, x = 40, y = 40); «Meridian» 24 px 500 ink + «Write» 24 px 600 цвет приложения (x = 120, базовая линия y = 76); под ним версия 1.2.0 (build 4213) · stable 12 px text-2
Прогресс линия 2 px цвета приложения по нижнему краю, растёт по этапам (ядро → шрифты → документ); неопределённый прогресс — бегущий отрезок 120 px, 1,2 с цикл
Анимация засечка логотипа «мигает» яркостью 100 → 60 % раз в 1,2 с; при «уменьшить движение» — статична
Текст никаких «загрузка модулей…», только версия; редакция и ключ не показываются

«О программе» — диалог размера S (420 × ~360), вызывается из «Справка → О Meridian Write» (Windows/Linux) и из меню приложения (macOS, стандартный пункт «О Meridian Write»): логотип 48 px; «Meridian Write» 18 px 600; строки kv 12 px: Версия, Сборка (хэш, дата), Канал обновлений, Ядро (версия Meridian Kernel), Qt, Редакция (из лицензии: «Pro · подписка до 12.05.2027 · Александр М.»); кнопки: «Копировать сведения», «Лицензии третьих сторон» (открывает окно со списком и текстами лицензий), «Проверить обновления»; внизу — строка «© 2026 Meridian Software» 11 px text-3 (декоративная, продублирована в сведениях).


2. Цвет

2.1 Принципы

  1. Цвета задаются токенами-ролями (color.text.primary, color.apps.write), а не значениями; в коде и макетах литералы запрещены (единственное исключение — палитра документа, которая принадлежит документу, а не интерфейсу).
  2. Три темы интерфейса — светлая, тёмная, высококонтрастная — переключаются подменой набора нейтральных и акцентных значений при тех же именах ролей. Тема документа («тёмная страница») — отдельный переключатель (см. 6.11).
  3. Акцент = цвет приложения (--app в CSS, Mds.app в QML): фокус, активные вкладки, первичные кнопки, переключатели. В Hub и общих диалогах — ink. Пользователь может выбрать «Цвет системы» или «Нейтральный» (тогда акцент — ink).
  4. Шкалы 50…900 построены в OKLCH: фиксированный тон и хрома базового цвета, светлота по ступеням L = 0,975 / 0,945 / 0,895 / 0,825 / 0,735 / 0,645 / 0,565 / 0,495 / 0,425 / 0,345; хрома на светлых ступенях спадает (до 15 % на 50), на тёмных — до 65 %; выход за sRGB отсекается уменьшением хромы. Базовый цвет библии занимает ближайшую по светлоте ступень без изменения значения.
  5. Тёмная тема берёт акценты светлее: ступень 500 для всех приложений (для Slides и Plan, чья база уже 500, — 400). Это выполняет требование библии «на ступень светлее» и даёт контраст к поверхности #1F2228 ≥ 4,4:1 (худшие — Paint 500 #D25AAD и Publisher 500 #E1557F, 4,41:1).

Запись в spec/design-tokens.json (DTCG): группа приложения содержит шкалу и три ссылки-роли; потребители берут только роли.

{
  "color": {
    "$type": "color",
    "apps": {
      "sheets": {
        "50": { "$value": "#EAFCF0" }, "100": { "$value": "#DCF4E4" }, "200": { "$value": "#C5E6D1" },
        "300": { "$value": "#A5D3B6" }, "400": { "$value": "#7BBA94" }, "500": { "$value": "#4EA173" },
        "600": { "$value": "#1E8E5A" }, "700": { "$value": "#007546" }, "800": { "$value": "#005E37" }, "900": { "$value": "#004627" },
        "base":       { "$value": "{color.apps.sheets.600}" },
        "accentDark": { "$value": "{color.apps.sheets.500}" },
        "accentText": { "$value": "{color.apps.sheets.700}", "$description": "white text 5.78:1" }
      }
    }
  }
}

2.2 Цвета бренда

Ступень ink sun
50 #F0F8FF #FFF5EA
100 #E4EEF8 #FFE9D1
200 #D1DEEA #FFD4A4
300 #B7C8D7 #F2A541 (база)
400 #96ACC0 #E29734
500 #7691A8 #C27C13
600 #5A7A94 #A46600
700 #436682 #895500
800 #2B5271 #6F4300
900 #0B3C5D (база) #523100

Применение: ink — Hub, backstage-навигация, заголовки маркетинга, словесный знак; ink.500 — акцент Hub в тёмной теме; sun — засечка логотипа, звёзды избранного, индикатор обновления, подсветка найденного, прогресс в Hub; текст на sun всегда #1A1D21 (8,24:1), белый текст на sun запрещён (2,05:1).

2.3 Цвета приложений — шкалы 50…900

Жирным — базовое значение из библии (ступень указана в скобках). Светлая тема использует базу, тёмная — ступень 500 (Slides, Plan — 400).

Приложение 50 100 200 300 400 500 600 700 800 900
Hub (900) #F0F8FF #E4EEF8 #D1DEEA #B7C8D7 #96ACC0 #7691A8 #5A7A94 #436682 #2B5271 #0B3C5D
Write (700) #F3F7FF #E5EDFF #CEDCFF #ADC4FF #88A6F8 #6587EC #486AE1 #3B5BDB #263DB2 #172692
Sheets (600) #EAFCF0 #DCF4E4 #C5E6D1 #A5D3B6 #7BBA94 #4EA173 #1E8E5A #007546 #005E37 #004627
Slides (500) #FFF4F1 #FFE7E1 #FFD0C4 #FFAF9B #F2876E #E25C3D #C44629 #A93315 #8F1E00 #6B1300
Draw (600) #E9FBFB #DBF2F2 #C3E4E3 #A2D0CF #77B7B6 #489D9D #0E8A8A #007071 #005B5B #004343
Paint (600) #FFF3FA #FFE4F4 #FFCAEB #F4ABDA #E483C3 #D25AAD #C2309B #A51782 #8A006B #670050
PDF (600) #FFF4F2 #FFE6E3 #FFCFC9 #FDAFA6 #EE887E #DE6057 #C92A2A #B5181D #97000E #710007
Math (800) #F5F7F8 #EBEDEF #DADDDF #C3C6C9 #A5AAAE #898E94 #71777D #5C6369 #495057 #343A40
Notes (600) #F6F6FF #EBEAFF #DAD8FF #C2BDFF #A599FF #8B76F5 #7048E8 #633AD4 #5124B7 #3E0097
Mail (600) #F1F8FF #E0EFFF #C3E0FF #9FCAF9 #73AEED #4591DF #1C7ED6 #0063B1 #004F90 #003A6C
Base (700) #FFF3F5 #FFE5E9 #FECED6 #F1B2BD #DF8E9F #CC6B81 #BA4967 #A61E4D #91093F #6E002D
Forms (600) #EFFCE5 #E2F3D5 #CEE5BC #B2D298 #8EB969 #6C9F34 #5C940D #447100 #355B00 #264300
Publisher (600) #FFF3F5 #FFE5EA #FFCDD7 #FFAABC #F1819D #E1557F #D6336C #B11253 #930041 #6E002F
Plan (500) #FFF4EE #FFE8D9 #FFD2B4 #FBB483 #EE8E44 #E67700 #B35B00 #954B00 #793B00 #5A2A00

Роли внутри шкалы (светлая тема → тёмная тема):

Роль Светлая Тёмная Применение
apps.<x>.accent база 500 (Slides/Plan — 400) значки, активные вкладки, обводка фокуса, ползунки, переключатели, ссылки
apps.<x>.accentText база, если контраст с белым ≥ 4,5:1, иначе 700 та же логика к #1A1D21: 400/300 фон первичных кнопок и других элементов с мелким белым текстом
apps.<x>.subtle 100 база с α 0,16 фон подсветки, выделенный пункт списка приложения, бейдж
apps.<x>.subtleText 800 300 текст на subtle
apps.<x>.border 300 700 рамки активных элементов без заливки

Контраст белого текста на базовых цветах (WCAG 2.x): Hub 11,55 · Write 5,67 · Sheets 4,14 · Slides 3,60 · Draw 4,18 · Paint 5,01 · PDF 5,46 · Math 8,18 · Notes 5,55 · Mail 4,20 · Base 7,21 · Forms 3,69 · Publisher 4,62 · Plan 3,00. Следовательно accentText = база для Hub, Write, Paint, PDF, Math, Notes, Base, Publisher; и 700 для Sheets #007546 (5,78), Slides #A93315 (6,62), Draw #007071 (5,91), Mail #0063B1 (6,14), Forms #447100 (5,82), Plan #954B00 (6,39). Значки приложений (крупная графика, ≥ 3:1) остаются на базовом цвете.

2.4 Семантические цвета

Роль База 50 100 200 300 400 500 600 700 800 900
ok (успех) #2F9E44 (500) #E9FDEA #DBF5DC #C3E8C5 #A1D6A4 #74BE7B #2F9E44 #1E8D37 #007725 #00601C #004712
warn (предупреждение) #E8590C (500) #FFF4F0 #FFE7DE #FFD1BF #FFB091 #F68659 #E8590C #C44800 #A43A00 #862E00 #642000
err (ошибка) #C92A2A (600) #FFF4F2 #FFE6E3 #FFCFC9 #FDAFA6 #EE887E #DE6057 #C92A2A #B5181D #97000E #710007
info (информация) #1C7ED6 (600) #F1F8FF #E0EFFF #C3E0FF #9FCAF9 #73AEED #4591DF #1C7ED6 #0063B1 #004F90 #003A6C

Роли: semantic.<x>.icon = база (светлая) / 400 (тёмная); semantic.<x>.text = 700 / 400; semantic.<x>.bg = 100 / база с α 0,16; semantic.<x>.border = 300 / 700; кнопка danger = err база с белым текстом (5,46:1), в тёмной — err.500 с #1A1D21. Семантический цвет никогда не единственный носитель смысла: рядом всегда иконка (ico-check, ico-warning, ico-error, ico-info) или текст.

2.5 Нейтральные цвета — три темы

Роль Токен Светлая Тёмная Высокий контраст
Фон окна neutral.bg #F5F6F8 #16181D #000000
Поверхность (панели, карточки, лента) neutral.surface #FFFFFF #1F2228 #000000
Поверхность 2 (вложенная, наведение) neutral.surface2 #EEF0F3 #262A31 #1A1A1A
Холст вокруг страницы neutral.canvas #E9EBEF #111317 #000000
Страница документа (интерфейсная тема) neutral.page #FFFFFF #24272D #000000
Граница neutral.border #E1E4E8 #2E3238 #FFFFFF
Граница сильная (поля, кнопки) neutral.borderStrong #C9CED6 #3C4149 #FFFFFF
Текст основной neutral.text #1A1D21 #E6E8EB #FFFFFF
Текст вторичный neutral.text2 #5C636E #9AA1AB #FFFFFF
Текст третичный (декоративный) neutral.text3 #8A919C #6F7680 #FFFFFF
Выключенный текст neutral.textDisabled #8A919C (α 0,7 на элементах) #6F7680 #A0A0A0
Акцент (все приложения) hc.accent — — #FFD400
Выделение hc.selection / текст — — #FFD400 / #000000
Ссылка hc.link — — #80D4FF
Ошибка hc.error — — #FF7A7A

Проверенные контрасты (светлая / тёмная): text на bg 15,64 / 14,47; text на surface 16,91 / 12,98; text2 на bg 5,60 / 6,82; text2 на surface 6,06 / 6,12; text3 на surface 3,18 / 3,47. Правило: text3 допустим только для нетекстовых и декоративных элементов (разделители «·», плейсхолдеры при наличии видимой подписи, номера строк сетки, шевроны) или текста ≥ 18 px/600; любой читаемый мелкий текст — text2 и выше (см. вопрос В-4).

Высококонтрастная тема на Windows подчиняется системным цветам (SystemColors: Window, WindowText, Highlight, HighlightText, ButtonFace, ButtonText, GrayText, Hotlight) — собственные значения из таблицы используются только на macOS/Linux при включённой пользователем HC-теме в параметрах. В HC: тени отключены, все границы 1 px #FFFFFF, фокус — 2 px #FFD400 + 1 px #000000 внутри, значки монохромные.

2.6 Выделение, фокус, подсветки

Роль Токен Светлая Тёмная Примечание
Выделение текста/ячеек/пунктов selection.bg rgba(59,91,219,.18) (= #DCE1F9 на белом) rgba(96,128,255,.28) (= #313C64 на поверхности) единое для всех приложений — indigo, не цвет приложения (см. В-5)
Рамка выделения, курсор ячейки selection.border #3B5BDB #6587EC 2 px внутрь ячейки (outline-offset:-2px)
Неактивное выделение (окно без фокуса) selection.inactive rgba(26,29,33,.10) rgba(230,232,235,.12)
Кольцо фокуса focus.ring цвет приложения accent, 2 px, отступ 2 px то же только при навигации с клавиатуры (:focus-visible), поля ввода — всегда
Наведение (оверлей) state.hover rgba(26,29,33,.06) rgba(230,232,235,.08) поверх любой поверхности
Нажатие state.pressed rgba(26,29,33,.12) rgba(230,232,235,.14)
Перетаскивание (цель) state.dropTarget apps.<x>.100 + пунктир 2 px accent accent α 0,16
Найденное (все совпадения) highlight.find rgba(242,165,65,.35) rgba(242,165,65,.40) sun
Текущее совпадение highlight.findCurrent rgba(242,165,65,.75) + рамка 1 px sun.600 то же
Орфография underline.spelling волна 1 px err err.400
Грамматика underline.grammar волна 1 px info info.400
Стиль/ассистент underline.suggest пунктир 1 px notes notes.400
Вставка (правки) track.insert цвет автора, подчёркивание 1 px + текст цветом автора то же
Удаление (правки) track.delete цвет автора, зачёркивание 1 px, текст цветом автора α 0,7 то же
Изменение формата (правки) track.format пунктир 1 px notes.600 под текстом, пометка в поле notes.400
Комментарий (якорь) comment.anchor rgba(242,165,65,.22) rgba(242,165,65,.26) активный — α 0,45 + рамка карточки sun
Решённый комментарий comment.resolved rgba(26,29,33,.06) rgba(230,232,235,.08)
Поле (field) в документе field.bg rgba(26,29,33,.08) (по наведению/в режиме «показать поля») rgba(230,232,235,.10)

Фиксированный режим цветов правок (параметр «Цвета правок: фиксированные»): вставка ok.600, удаление err, формат notes.600, перемещение draw.

2.7 Цвета авторов (совместная работа)

Назначаются по порядку присоединения к сеансу; локальный пользователь всегда получает цвет 1 для себя, но другие видят его по общему порядку. 9-й и далее участники получают цвет hash(userId) mod 8 и инициалы на ярлыке.

№ Токен Значение Текст на ярлыке Подсветка (α)
1 author.1 #3B5BDB белый 0,18
2 author.2 #E25C3D #1A1D21 0,18
3 author.3 #1E8E5A #1A1D21 0,18
4 author.4 #C2309B белый 0,18
5 author.5 #8B76F5 #1A1D21 0,20
6 author.6 #CC6B81 #1A1D21 0,20
7 author.7 #489D9D #1A1D21 0,20
8 author.8 #B35B00 белый 0,18

Набор проверен симуляцией (Machado 2009, протанопия/дейтеранопия/тританопия): минимальное расстояние ΔE(OKLab) между любыми двумя цветами — 4,9, поэтому цвет никогда не единственный признак: курсор другого автора всегда несёт ярлык с именем, а в списке участников — аватар с инициалами.

2.8 Палитра диаграмм (Meridian Chart)

Категориальная, 10 цветов, порядок использования фиксирован; светлая и тёмная темы — разные наборы (в тёмной — светлее):

№ Светлая тема Источник Тёмная тема Источник
1 #3B5BDB write #6587EC write.500
2 #F2A541 sun #F2A541 sun
3 #1E8E5A sheets #4EA173 sheets.500
4 #0B3C5D ink #ADC4FF write.300
5 #D25AAD paint.500 #C2309B paint
6 #6F4300 sun.800 #C27C13 sun.500
7 #8B76F5 notes.500 #88A6F8 write.400
8 #B35B00 plan.600 #A5AAAE math.400
9 #5C6369 math.700 #A46600 sun.600
10 #263DB2 write.800 #486AE1 write.600

Проверка на дальтонизм (минимальное ΔE OKLab × 100 между парами после симуляции):

Набор Норма Протанопия Дейтеранопия Тританопия
Светлая, цвета 1–6 18,8 10,7 11,3 6,9
Светлая, цвета 1–10 10,1 9,1 7,9 6,9
Тёмная, цвета 1–6 13,5 10,0 9,6 4,4
Тёмная, цвета 1–10 8,1 7,6 8,2 4,4

Правила: при 7 и более рядах — дополнительно различать формой маркера (круг, квадрат, ромб, треугольник, крест) и штриховкой заливок (hatch 45°, 2 px); всегда есть легенда и подписи; заливки площадей получают обводку 1 px chart.outline (rgba(26,29,33,.25) / rgba(230,232,235,.25)) — она обеспечивает 3:1 для светлых цветов (sun на белом — 2,05:1 без обводки). Сетка диаграммы — border, оси — borderStrong, подписи — text2 11 px, заголовок — text 13 px 600.

Последовательные (7 ступеней, интерполяция в OKLab):

Имя 1 2 3 4 5 6 7
seq.indigo #EDF2FF #ADC2F7 #7190EA #3B5BDB #304AB4 #253A8F #1B2A6B
seq.teal #E6FCF5 #A8D5D0 #68AFAD #0E8A8A #0D6F7B #0C556C #0B3C5D
seq.warm #FFF4E6 #FACD9A #F2A541 #E06E36 #C92A2A #912423 #5C1B1B
seq.ink #F5F6F8 #D6D9DE #B7BDC4 #9AA1AB #6B7E91 #3E5D77 #0B3C5D

Расходящиеся (7 ступеней, нейтральная середина #F5F6F8; в тёмной теме середина #2E3238):

Имя −3 −2 −1 0 +1 +2 +3
div.coralIndigo #C92A2A #DA4D37 #EE937D #F5F6F8 #7392E9 #304AB4 #1B2A6B
div.sunTeal #E67700 #EE9632 #F5C187 #F5F6F8 #6FAEAD #0D6F7B #0B3C5D
div.magentaGreen #C2309B #E482C5 #F5C1E5 #F5F6F8 #B2EEBA #6ACA84 #1E8E5A

Тепловые карты и условное форматирование Sheets используют те же шкалы; «красный-жёлтый-зелёный» из Excel при импорте отображается как есть (цвета принадлежат документу), новые правила по умолчанию предлагают div.coralIndigo (различима при дейтеранопии, в отличие от красно-зелёной).

2.9 Правила контраста (WCAG 2.2)

Элемент Минимум Уровень Как проверяем
Основной текст интерфейса (13 px) 7:1 AAA (1.4.6) text на bg/surface/surface2
Вторичный текст (11–12 px) 4,5:1 AA (1.4.3) text2 на любой поверхности
Крупный текст (≥ 18 px или ≥ 15 px 600) 3:1 AA заголовки, числа масштаба
Иконки, рамки полей, индикаторы состояния, ручки 3:1 AA (1.4.11) к ближайшему фону
Фокус 3:1 к соседним цветам, площадь ≥ периметр × 2 px AA (2.4.11/2.4.13) кольцо 2 px снаружи элемента
Текст на акценте (кнопки) 4,5:1 AA потому accentText для шести приложений — ступень 700
Выключенные элементы не нормируются, но ≥ 2,5:1 целевое — text α 0,45 поверх фона
Диаграммы 3:1 к фону или обводка AA см. 2.8

Инструменты: tools/tokens/check_contrast.py считает все пары из design-tokens.json на каждом CI-прогоне; падение ниже порога — ошибка сборки документации.

2.10 Палитра цветов документа по умолчанию (тема «Meridian»)

Структура как в темах Office (<a:clrScheme>): 2 тёмных + 2 светлых + 6 акцентов, у каждого 5 оттенков (как в выборе цвета Office: светлее 80/60/40 %, темнее 25/50 % — через lumMod/lumOff в HSL, для текстовых/фоновых — своя лестница). При сохранении в .docx/.xlsx/.pptx тема записывается как есть, Office показывает ту же палитру.

Роль (OOXML) Имя в UI База Оттенок 1 Оттенок 2 Оттенок 3 Оттенок 4 Оттенок 5
dk1 Текст 1 #1A1D21 #818C9C (+50 %) #606B79 (+35 %) #4C5460 (+25 %) #383E47 (+15 %) #24282E (+5 %)
lt1 Фон 1 #FFFFFF #F2F2F2 (−5 %) #D9D9D9 (−15 %) #BFBFBF (−25 %) #A6A6A6 (−35 %) #808080 (−50 %)
dk2 Текст 2 #0B3C5D #B6DDF6 (+80 %) #6EBAEE (+60 %) #2598E5 (+40 %) #082D46 (−25 %) #061E2E (−50 %)
lt2 Фон 2 #E9EBEF #CED2DB (−10 %) #A5ADBD (−25 %) #637089 (−50 %) #323844 (−75 %) #14161B (−90 %)
accent1 Акцент 1 #3B5BDB #D8DEF8 #B1BDF1 #899DE9 #203DB0 #162975
accent2 Акцент 2 #F2A541 #FCEDD9 #FADBB3 #F7C98D #D8800F #90550A
accent3 Акцент 3 #1E8E5A #C7F3DF #8FE7BF #58DC9E #176A44 #0F472D
accent4 Акцент 4 #E25C3D #F9DED8 #F3BEB1 #EE9D8B #BB3A1C #7D2713
accent5 Акцент 5 #0E8A8A #BEF8F8 #7DF2F2 #3CEBEB #0B6767 #074545
accent6 Акцент 6 #7048E8 #E2DAFA #C6B6F6 #A991F1 #4619CB #2E1187

Ссылки (hlink) — #3B5BDB, посещённые (folHlink) — #7048E8. В галерее тем документа кроме «Meridian» есть «Office» (точная копия темы Office 2013+: 000000 FFFFFF 44546A E7E6E6 4472C4 ED7D31 A5A5A5 FFC000 5B9BD5 70AD47) — для документов, которые должны выглядеть «как из Word», «Графит» (нейтральная: ink-шкала + math) и «Север» (холодная: hub/draw/mail). Шрифты темы: заголовки — Carlito 600, текст — Carlito; «Классика» — Caladea/Carlito; «Русская» — PT Serif/PT Sans.

2.11 Стандартные цвета

Второй ряд в выборе цвета — 10 фиксированных цветов, не зависящих от темы документа (аналог Standard Colors Office, но в характере MDS — глубже и без неона):

Тёмно-красный Красный Оранжевый Жёлтый Светло-зелёный Зелёный Голубой Синий Тёмно-синий Фиолетовый
#8F1E00 #C92A2A #E67700 #F2C94C #8CE99A #1E8E5A #4DABF7 #1C7ED6 #0B3C5D #7048E8

При импорте документов Office стандартные цвета Office (C00000 FF0000 FFC000 FFFF00 92D050 00B050 00B0F0 0070C0 002060 7030A0) сохраняются в документе как явные RGB — наш ряд касается только новых выборов.


3. Типографика

3.1 Шрифт интерфейса — Inter

Inter (SIL OFL 1.1) поставляется в ресурсах приложения (переменный шрифт Inter[opsz,wght].ttf, подмножества латиница + кириллица + греческий; остальные письменности — системный резерв). Включённые OpenType-функции по умолчанию: tnum (табличные цифры) — везде, где числа выравниваются (сетки, строка состояния, числовые поля, масштаб); cv11 (однозначная «I»), ss03 (r с скруглением) — не включаются; calt — включён; liga — выключен в полях ввода кода.

Роль Токен Размер Межстрочный Насыщенность Трекинг Где
Подпись (caption) font.size.xs 11 px 14 px (1,27) 400 / 500 0 подписи групп ленты, строка состояния, подсказки hint, бейджи (10 px — только в бейдже)
Малый (small) font.size.s 12 px 16 px (1,33) 400 / 500 0 заголовок окна, пункты ribbon-строк, подписи полей, kv, вкладки боковой панели, меню macOS-подобные
Основной (body) font.size.m 13 px 18 px (1,38; в CSS 1.45 для многострочного) 400 / 500 (кнопки) / 600 (активная вкладка) 0 весь текст контролов, меню, списки, диалоги
Подзаголовок (h3) font.size.l 15 px 20 px (1,33) 600 −0,5 % заголовки секций панелей, h3
Заголовок (h2) font.size.xl 18 px 24 px (1,33) 600 −1 % заголовки диалогов (14 px 600 в компактных), разделы backstage
Крупный (h1) font.size.2xl 24 px 30 px (1,25) 600 −1 % приветствие Hub, заголовки backstage
Дисплейный (display) font.size.3xl 32 px 38 px (1,19) 600 −1,5 % онбординг, пустые состояния крупных экранов, «О программе» (имя)

Насыщенности: 400 regular, 500 medium, 600 semibold, 700 bold (только в бейджах и в «жирном» внутри документа — не в UI). Курсив в интерфейсе не используется (кроме fx в строке формул). Цвета: text для основного, text2 для подписей и описаний, запрещено осветлять текст прозрачностью (кроме состояния «выключено»).

Межстрочные в однострочных контролах не задаются — высота строки = высота контрола; текст центрируется по cap-height (в QML — verticalAlignment: Text.AlignVCenter с коррекцией -1 px для Inter на 13 px).

3.2 Системные резервы

ОС Резервный интерфейсный шрифт Когда
Windows 10/11 Segoe UI (Segoe UI Variable на 11) письменности вне подмножества Inter; при параметре «Шрифт интерфейса: системный»
macOS 13+ SF Pro Text / SF Pro Display (≥ 20 px) то же; в нативном меню macOS — всегда системный
Linux Cantarell (GNOME), Noto Sans (KDE/прочие), затем sans-serif из fontconfig то же
Все Noto Sans (в комплекте) письменности, которых нет в системном шрифте

Порядок в CSS/QML: Inter, "Segoe UI", "SF Pro Text", Cantarell, Roboto, system-ui, sans-serif (как в mds.css). Моноширинный: JetBrains Mono (OFL) → Menlo → Consolas → monospace; 12 px / 16 px, liga выключен, используется в строке формул, редакторе скриптов, полях с кодом, kbd, именах ячеек и в «Сведениях» для хэшей.

3.3 Шрифты документов в комплекте

Семейство Начертания Лицензия Назначение
Carlito Regular, Bold, Italic, Bold Italic SIL OFL 1.1 шрифт по умолчанию (11 pt), метрическая замена Calibri
Caladea 4 SIL OFL 1.1 замена Cambria
Liberation Sans / Serif / Mono (2.1) по 4 SIL OFL 1.1 замена Arial / Times New Roman / Courier New
Liberation Sans Narrow 4 GPLv2 + font exception (отдельный пакет, по согласию) замена Arial Narrow
Gelasio 4 SIL OFL 1.1 замена Georgia
Selawik Regular, Semilight, Light, Semibold, Bold SIL OFL 1.1 замена Segoe UI в документах (Microsoft, метрически совместим)
PT Sans, PT Serif, PT Mono 4 / 4 / 1 SIL OFL 1.1 русские шаблоны, ГОСТ-оформление
Noto Sans / Noto Serif (+ CJK SC/TC/JP/KR, Arabic, Hebrew, Devanagari, Bengali, Thai, Armenian, Georgian, Symbols, Math) Regular, Bold (+ Italic для латиницы/кириллицы) SIL OFL 1.1 все письменности, резерв в документах
Noto Color Emoji 1 (COLRv1 + CBDT) SIL OFL 1.1 эмодзи
Inter переменный SIL OFL 1.1 интерфейс; доступен и в документах
JetBrains Mono переменный SIL OFL 1.1 код в документах, скрипты
STIX Two Text / STIX Two Math 4 / 1 SIL OFL 1.1 формулы (Math), научные тексты
TeX Gyre: Termes, Heros, Cursor, Pagella, Schola, Bonum, Adventor, Chorus по 4 GUST Font License (свободная, совместима с OFL по смыслу) замены Times / Helvetica / Courier / Palatino / Century Schoolbook / Bookman / Avant Garde / Zapf Chancery
Comic Neue 6 SIL OFL 1.1 визуальная замена Comic Sans MS (не метрическая)
OpenSymbol 1 MPL 2.0 / LGPL 3 замена Symbol/Wingdings при импорте маркеров списков
Source Sans 3, Source Serif 4, Source Code Pro переменные SIL OFL 1.1 дополнительные шрифты шаблонов

Все лицензии перечислены в «О программе → Лицензии третьих сторон» и в THIRD_PARTY_FONTS.md; шрифты с OFL не продаются отдельно и не переименовываются; шрифты с Reserved Font Name не модифицируются (подмножество — только для интерфейсного Inter, в формате, допустимом OFL, с сохранением имени не требуется — используем полное имя Inter).

3.4 Правила подмены шрифтов

Шрифт, отсутствующий в системе, заменяется по таблице (сначала метрическая замена — та же ширина глифов, документ не «поплывёт»; затем визуальная — похожая по стилю; затем общая по классификации PANOSE/OS/2 из метаданных документа). Замена показывается в строке состояния («Шрифт Calibri заменён на Carlito») и в диалоге «Шрифты документа» с кнопками «Встроить», «Заменить везде», «Оставить».

Запрошен Метрическая замена Визуальная (если метрической нет) Класс
Arial, Helvetica Liberation Sans (= Arimo) Inter гротеск
Arial Narrow Liberation Sans Narrow Inter (wdth 85) узкий гротеск
Times New Roman, Times Liberation Serif (= Tinos), TeX Gyre Termes PT Serif антиква
Courier New, Courier Liberation Mono (= Cousine), TeX Gyre Cursor JetBrains Mono моно
Calibri Carlito — гуманистический гротеск
Calibri Light Carlito (Regular, синтетическое Light запрещено) Source Sans 3 Light
Cambria Caladea — переходная антиква
Cambria Math STIX Two Math — математический
Georgia Gelasio — антиква для экрана
Segoe UI Selawik (Microsoft, OFL, метрически совместим) Inter гуманистический гротеск
Segoe UI Symbol / Emoji Noto Sans Symbols 2 / Noto Color Emoji — символы
Verdana — (метрической нет) DejaVu Sans (ширина близка, OFL-совместимая Bitstream Vera licence) широкий гротеск
Tahoma — DejaVu Sans Condensed
Trebuchet MS — Fira Sans
Palatino Linotype, Book Antiqua TeX Gyre Pagella — антиква
Century Schoolbook TeX Gyre Schola —
Bookman Old Style TeX Gyre Bonum —
Garamond — EB Garamond старостильная антиква
Consolas — Inconsolata, JetBrains Mono моно
Comic Sans MS — Comic Neue рукописный
Symbol, Wingdings, Webdings OpenSymbol (таблица соответствия кодов) — символьный
Microsoft YaHei, SimSun, SimHei — Noto Sans CJK SC / Noto Serif CJK SC китайский упрощённый
PMingLiU, Microsoft JhengHei — Noto Sans/Serif CJK TC китайский традиционный
MS Gothic, MS Mincho, Meiryo, Yu Gothic — Noto Sans/Serif CJK JP японский
Malgun Gothic, Batang — Noto Sans/Serif CJK KR корейский
Arial Unicode MS — Noto Sans универсальный

Алгоритм: fontdb ищет точное имя → псевдонимы (fontconfig <alias> на Linux, своя таблица на всех ОС) → таблица выше → по PANOSE (серифность, пропорция, вес) → Noto Sans/Serif по письменности. Результат кэшируется на документ; подмена не записывается в файл при сохранении (сохраняется исходное имя).

3.5 Кириллица и письменности


4. Сетка, геометрия, иконография

4.1 Сетка и отступы

Токен Значение Применение
space.0 0 —
space.1 4 px между иконкой и текстом в малых кнопках, внутренние зазоры ribbon-строк
space.2 8 px стандартный зазор между контролами в ряду, между полем и подписью (4), внутренние поля карточек малых
space.3 12 px поля меню и панелей, зазор карточек в сетках
space.4 16 px внутренние поля диалога (16–18), секции панелей
space.5 20 px —
space.6 24 px крупные секции backstage, пустые состояния
space.8 32 px поля Hub (28–36)
space.10 40 px отступы онбординга
space.12 48 px —

Компоненты строятся на сетке 4 px, раскладка экранов — на 8 px. Колонки Hub/backstage: 12 колонок, желоб 16 px, поля 36 px при ширине ≥ 1280; 24 px при < 1280. Минимальный размер окна приложения: 960 × 600; ниже 1100 px ширины лента переходит в сжатый режим (группы сворачиваются в кнопки-меню), ниже 800 — в компактную панель.

4.2 Радиусы

Токен Значение Применение
radius.xs 4 px малые кнопки ленты, пункты дерева/списка внутри панелей, kbd, ячейки-бейджи, миниатюры
radius.s 6 px кнопки, поля ввода, вкладки ленты (верхние углы), пункты меню, чипы в списках
radius.m 10 px карточки, панели, меню, мини-панель, toast
radius.l 14 px всплывающие окна (popover), диалоги, окно CSD, сплэш
radius.pill 999 px теги, бейджи-счётчики, переключатель (switch), навигация галереи макетов
radius.circle 50 % аватары, точки цвета, маркеры

Вложенный радиус = внешний − отступ (карточка 10 px с полем 4 → содержимое 6 px). Значки приложений — 22 % стороны (не из этой шкалы).

4.3 Обводки

Токен Значение Применение
border.thin 1 px border разделители, рамки карточек, панелей, сетки
border.strong 1 px borderStrong поля ввода, вторичные кнопки, выпадающие списки
border.accent 1 px accent активная вкладка листа, выбранная карточка, поле в фокусе (плюс кольцо)
border.thick 2 px подчёркивание активной вкладки ленты, курсор ячейки, рамка миниатюры слайда
border.focus 2 px accent, отступ 2 px кольцо фокуса (снаружи элемента, outline)
border.dashed 1 px пунктир 4/3 borderStrong цели перетаскивания, пустые плейсхолдеры, шаблоны

На HiDPI обводки остаются в логических пикселях (1 px → 2 физических при 200 %); на дробных масштабах (125/150 %) 1 px линии выравниваются по физическому пикселю (QQuickItem c antialiasing: false для горизонтальных/вертикальных линий).

4.4 Тени и возвышения

Пять уровней плюс нулевой; цвет тени — #101828 (светлая) / #000000 (тёмная). В HC-теме тени не рисуются (вместо них 1 px граница).

Уровень Токен Светлая тема Тёмная тема Применение
0 shadow.0 нет нет лента, панели, строка состояния — всё встроенное
1 shadow.1 0 1px 2px rgba(16,24,40,.06) 0 1px 2px rgba(0,0,0,.4) кнопки по наведению (необязательно), чипы при перетаскивании-начале
2 shadow.2 0 1px 2px rgba(16,24,40,.06), 0 4px 12px rgba(16,24,40,.08) (= --shadow) 0 1px 2px rgba(0,0,0,.4), 0 4px 12px rgba(0,0,0,.4) страница на холсте, карточка по наведению, подсказка (tooltip), мини-панель
3 shadow.3 0 2px 4px rgba(16,24,40,.08), 0 6px 16px rgba(16,24,40,.12) 0 2px 4px rgba(0,0,0,.45), 0 6px 16px rgba(0,0,0,.5) меню, контекстные меню, выпадающие списки, галереи, календарь-пикер
4 shadow.4 0 8px 24px rgba(16,24,40,.16) (= --shadow-lg) 0 8px 24px rgba(0,0,0,.6) всплывающие окна, диалоги, toast, командная палитра, плавающие панели
5 shadow.5 0 16px 48px rgba(16,24,40,.24) 0 16px 48px rgba(0,0,0,.7) окно CSD (Windows/Linux без системной тени), превью при перетаскивании между окнами

Тень никогда не заменяет границу: у всех всплывающих поверхностей есть 1 px border. Внутренние тени не используются. Затемнение под модальным диалогом — rgba(16,24,40,.35) (светлая) / rgba(0,0,0,.5) (тёмная).

Переменные для mds.css (генерируются из токенов; существующие --shadow/--shadow-lg остаются псевдонимами уровней 2 и 4):

:root{
  --shadow-1:0 1px 2px rgba(16,24,40,.06);
  --shadow-2:0 1px 2px rgba(16,24,40,.06),0 4px 12px rgba(16,24,40,.08);
  --shadow-3:0 2px 4px rgba(16,24,40,.08),0 6px 16px rgba(16,24,40,.12);
  --shadow-4:0 8px 24px rgba(16,24,40,.16);
  --shadow-5:0 16px 48px rgba(16,24,40,.24);
  --shadow:var(--shadow-2); --shadow-lg:var(--shadow-4);
  --overlay:rgba(16,24,40,.35);
}
:root[data-theme="dark"]{
  --shadow-1:0 1px 2px rgba(0,0,0,.4);
  --shadow-2:0 1px 2px rgba(0,0,0,.4),0 4px 12px rgba(0,0,0,.4);
  --shadow-3:0 2px 4px rgba(0,0,0,.45),0 6px 16px rgba(0,0,0,.5);
  --shadow-4:0 8px 24px rgba(0,0,0,.6);
  --shadow-5:0 16px 48px rgba(0,0,0,.7);
  --overlay:rgba(0,0,0,.5);
}
:root[data-theme="hc"]{ --shadow-1:none; --shadow-2:none; --shadow-3:none; --shadow-4:none; --shadow-5:none; }

4.5 Иконография — Meridian Glyphs

Параметр Значение
Сетка 20 × 20, активная область 16 × 16 (поля по 2 px), ключевые линии: круг ∅ 16, квадрат 14 × 14, горизонтальный прямоугольник 16 × 12, вертикальный 12 × 16
Штрих 1,5 px, stroke-linecap="round", stroke-linejoin="round", fill="none", stroke="currentColor"
Скругления углов 2 px (rx="1.5"…"2" у прямоугольников), внутренние углы фигур — 1 px
Координаты кратны 0,5; горизонтальные и вертикальные линии проходят по x.5 / y.5 при нечётной ширине, по целым — при чётной (чтобы 1,5 px штрих ложился на 2 физических пикселя при 200 %)
Минимальный зазор 2 px между элементами, 1,5 px между параллельными штрихами
Размеры применения 16 px (меню, деревья, строка состояния — тот же SVG, масштаб 0,8), 20 px (кнопки, поля, малые кнопки ленты), 24 px (боковые панели, Hub), 32 px (большие кнопки ленты — отдельный набор)
Цвет currentColor: text2 в покое, text при наведении, accent в активном/выбранном, text α 0,45 выключен; на цветном фоне — белый
Активное состояние залитая версия (-filled): те же контуры, заливка currentColor, внутренние линии — цвет фона (stroke="var(--surface)")
Семантика у каждой иконки есть имя ico-<name>, подпись для доступности (aria-label/Accessible.name берётся из команды, не из иконки), RTL-зеркалирование по флагу mirror (стрелки, отступы, undo/redo)

Ribbon-набор 32 px: сетка 32 × 32, область 28 × 28, штрих 2 px, скругления 2,5 px; допускается второй цвет — заливка accent α 0,2 внутри формы (например, бумага таблицы) и акцентная деталь sun или accent (галочка, плюс); стандартная иконка 20 px масштабируется в 32 только как временная заглушка.

Как рисовать SVG:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"
     fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <!-- ico-save: дискета; внешняя форма по ключевому квадрату 14×14, внутренние детали с зазором ≥ 2 px -->
  <path d="M4 3.5h9.5L16 6v10.5H4z"/>
  <path d="M6.5 3.5V8h6V3.5"/>
  <path d="M6.5 16.5v-5h7v5"/>
</svg>

Правила файла: один <svg> на иконку в brand/icons/20/<name>.svg, без id, style, трансформаций и width/height (их задаёт потребитель); спрайт для макетов mockups/assets/icons.svg собирается скриптом (<symbol id="ico-<name>">); Qt получает SVG через QIconEngine с перекраской (см. 12.4). Запрещены: растровые вставки, градиенты, непарные полупрозрачности, текстовые элементы, штрих ≠ 1,5 (кроме 32-набора).

Стандартные иконки команд (имена ico-*; «З» — есть залитая версия, «R» — зеркалится в RTL):

Группа Иконки
Файл new open R save save-as save-all print print-preview export export-pdf share download upload close history info properties recent folder folder-open R cloud cloud-off sync sync-error
Правка undo R redo R cut copy paste paste-special select-all find replace trash duplicate clear rename
Шрифт bold italic underline strikethrough superscript subscript font font-size font-size-up font-size-down font-color highlight clear-format case text-direction R
Абзац align-left R align-center align-right R align-justify align-top align-middle align-bottom list-bullets R list-numbers R list-check R indent R outdent R line-spacing paragraph-spacing columns pilcrow tab-stop R wrap-text
Вставка table image chart link comment shape text-box equation symbol page-break section-break header footer footnote bookmark cross-reference date field toc caption watermark attachment
Вид zoom-in zoom-out zoom-fit zoom-100 grid ruler sidebar-left R sidebar-right R fullscreen fullscreen-exit split-view layout-print layout-web layout-outline dark-page focus-mode navigation thumbnails
Объекты rotate-left R rotate-right R flip-h flip-v group ungroup bring-front send-back bring-forward send-backward align-objects distribute-h distribute-v crop lock unlock layers transparency wrap-square wrap-tight anchor
Таблица row-insert-above row-insert-below col-insert-left R col-insert-right R row-delete col-delete merge-cells split-cells table-delete autosum function freeze pivot filter filter-off sort-asc sort-desc data-validation conditional-format named-range cell-borders cell-fill number-format percent currency decimal-add decimal-remove
Слайды slide-new slide-duplicate slide-layout play play-from-start presenter transition animation notes rehearse record
Рецензирование track-changes accept reject accept-all reject-all compare spellcheck thesaurus translate word-count protect restrict signature
Навигация chevron-up chevron-down chevron-left R chevron-right R chevron-double-left R chevron-double-right R arrow-up arrow-down arrow-left R arrow-right R home back R forward R refresh more-horizontal more-vertical menu expand collapse external R drag-handle
Статус и действия check З close plus minus info З warning З error З help З question lock З unlock star З pin З bell З bell-off user З users settings search key shield З clock calendar tag flag З eye eye-off mic camera wifi-off battery update sparkle (Assist) З
Файлы и приложения file file-text file-table file-slides file-pdf file-image file-archive app-write app-sheets app-slides app-draw app-paint app-pdf app-math app-notes app-mail app-base app-forms app-publisher app-plan app-hub
Почта и календарь mail mail-open send R reply R reply-all R forward-mail R archive spam inbox contact event todo recurring reminder
Рисование pen pencil brush eraser fill eyedropper select-rect select-lasso select-magic move hand text-tool line rect ellipse polygon connector bezier node-edit

Итого 285 уникальных имён; первые 40 реализованы в mockups/assets/icons.svg, остальные — по мере прототипирования (до своего набора используются Lucide с переименованием в ico-*, см. библию 5.2).

4.6 Курсоры

Системные курсоры предпочтительны (Qt::CursorShape): ArrowCursor, IBeamCursor (текст), PointingHandCursor (ссылки и только ссылки — не кнопки), SizeAllCursor (перемещение объекта), SizeFDiagCursor/SizeBDiagCursor/SizeHorCursor/ SizeVerCursor (ручки), SplitHCursor/SplitVCursor (разделители панелей, границы столбцов/строк), CrossCursor (рисование фигур, пипетка — свой курсор), OpenHandCursor/ClosedHandCursor (панорамирование холста, пробел), ForbiddenCursor (нельзя бросить), BusyCursor (ожидание < 1 с; дольше — индикатор прогресса, курсор обычный). Собственные курсоры (SVG → 32 × 32, @2x 64): поворот (круглая стрелка), обрезка, пипетка, кисть с размером (кольцо диаметра кисти, 1 px инверсный), заливка, лассо, «добавить к выделению» (+), «вычесть» (−), выделение столбца/строки в Sheets (стрелка вниз/вправо), перетаскивание с копированием (стрелка с «+»). Горячая точка указывается в метаданных cursors/<name>.json.


5. Компоненты

5.0 Единая модель состояний

Все интерактивные компоненты поддерживают один набор состояний с едиными визуальными правилами; ниже у компонентов описаны только отличия.

Состояние Визуал Переход
Обычное (rest) фон компонента, текст text, иконка text2 —
Наведение (hover) оверлей state.hover поверх фона; у кнопок с рамкой — рамка borderStrong → text3 120 мс ease-out; на сенсоре не используется
Нажатие (pressed) оверлей state.pressed; без смещения, без «вдавливания» мгновенно
Фокус (focus-visible) кольцо 2 px accent с отступом 2 px снаружи; у полей ввода — рамка accent + кольцо selection.bg 3 px без отступа мгновенно
Выключено (disabled) непрозрачность 0,45 всего компонента, курсор обычный, подсказка объясняет причину (если известна) —
Выбрано (selected / checked / on) фон selection.bg, иконка и текст text; у переключателей — заливка accent 120 мс
Ошибка (error) рамка err 1 px, под компонентом сообщение 12 px semantic.err.text с ico-error 16 px —
Загрузка (busy) содержимое заменяется спиннером 16 px или скелетом; компонент не принимает ввод, но сохраняет размер после 300 мс ожидания

Те же состояния в CSS макетов (дополнение к mds.css; классы .hover/.pressed/.focus/.disabled — для статических макетов, псевдоклассы — для интерактивных прототипов):

.btn:hover,.btn.hover{background-image:linear-gradient(var(--state-hover),var(--state-hover))}
.btn:active,.btn.pressed{background-image:linear-gradient(var(--state-pressed),var(--state-pressed))}
.btn:focus-visible,.focus-ring{outline:2px solid var(--app);outline-offset:2px}
.input:focus-within,.input.focus{border-color:var(--app);box-shadow:0 0 0 3px var(--sel)}
.btn:disabled,.disabled{opacity:.45;pointer-events:none}
.btn.on,.selected{background:var(--sel);color:var(--text)}
.input.error{border-color:var(--err)} .field .error-text{font-size:12px;color:var(--err-text)}
:root{--state-hover:rgba(26,29,33,.06);--state-pressed:rgba(26,29,33,.12);--err-text:#B5181D}
:root[data-theme="dark"]{--state-hover:rgba(230,232,235,.08);--state-pressed:rgba(230,232,235,.14);--err-text:#EE887E}

Минимальная цель для указателя — 24 × 24 px (WCAG 2.5.8), для сенсорного ввода — 44 × 44 (режим «Сенсор», см. 6.9). Размеры контролов: control.xs 22 px (строки ленты, ячейки), control.s 24 px (малые кнопки, комбо ленты), control.m 30 px (стандарт: кнопки, поля, списки), control.l 36 px (заголовки панелей, крупные поля Hub), control.xl 44 px (сенсор).

5.1 Заголовок окна

Параметр Значение
Анатомия [элементы управления окном (macOS слева)] [значок приложения 18 px, радиус 4] [имя документа — Meridian Write (12 px; имя 500, суффикс text3)] [индикатор «●» несохранённых изменений / «☁ Синхронизировано»] [поле поиска-палитры 320 × 26 по центру, Ctrl/⌘+K] [облако] [аватар 24 px] [кнопки окна (Windows/Linux справа)]
Размеры высота 36 px; поля 12 px; зазор 10 px; на macOS высота определяется системой (28/52 px при унифицированном тулбаре)
Реализация macOS — нативный заголовок (NSWindow с titlebarAppearsTransparent), наш контент — как NSToolbar-подобная область; Windows 10/11 и Linux — CSD: своя полоса, перетаскивание окна за пустые области, двойной щелчок — развернуть; Windows 11 — snap layouts при наведении на «развернуть» (через WM_NCHITTEST HTMAXBUTTON); Linux — SSD по требованию среды (KDE по умолчанию — SSD, GNOME — CSD)
Состояния активное окно — текст text; неактивное — текст text2, значок α 0,6
Клавиатура Alt+Space — системное меню окна (Windows); F6 переводит фокус между областями: заголовок → лента → холст → панели → строка состояния
Доступность роль TitleBar/Window; имя = «Имя документа — Meridian Write»; индикатор несохранённого — текст «Не сохранено» в имени для диктора

5.2 Лента (ribbon)

Параметр Значение
Анатомия полоса вкладок 34 px (кнопка «Файл» цвета приложения 5 × 14 px поля, радиус 6; вкладки 13 px, активная — 600 + подчёркивание 2 px accent; контекстные вкладки — цвет accent, группа контекстных вкладок подписана над полосой) → тело 92 px: группы, разделённые 1 px border, подпись группы 11 px text3-визуал (text2 для a11y) снизу по центру; справа внизу — кнопка сворачивания ico-chevron-up
Большая кнопка 44 × 84 min, иконка 32 px в плашке 28 × 28 радиус 6, подпись 11 px до 2 строк по центру; с раскрытием — шеврон под подписью (split: верх — действие, низ — меню)
Малая кнопка строка 22 px: иконка 16 + подпись 12 px, радиус 4; три строки в группе; комбо в строке — 24 px (rcombo), кнопки-переключатели 26 × 24 (tb), образец цвета — полоса 3 px снизу (swatch)
Галерея в ленте 3 строки × N ячеек с прокруткой ↑/↓ и кнопкой «развернуть»; развёрнутая — popover с сеткой, заголовками категорий, предпросмотром при наведении (live preview в документе, откат при уходе)
Лаунчер диалога 12 × 12 стрелка «↘» в правом нижнем углу группы, открывает полный диалог; подсказка «Параметры абзаца (Ctrl+Alt+P)»
Сворачивание Ctrl+F1 или двойной щелчок по вкладке: остаются только вкладки (34 px); щелчок по вкладке раскрывает тело как popover поверх документа до клика вне; режимы: «Всегда показывать», «Только вкладки», «Автоскрытие» (в полноэкранном)
Адаптивность при сужении окна группы сворачиваются по приоритетам (справа налево, кроме «Буфер обмена» и «Шрифт»): большая кнопка → малая → группа в одну кнопку с меню; ширина < 800 — переход в компактную панель
Настройка «Параметры → Настройка ленты»: дерево вкладок/групп/команд, своя вкладка/группа, экспорт/импорт ribbon.json, сброс; ПКМ на команде → «Добавить на панель быстрого доступа»
Клавиатура Alt/F10 — KeyTips (см. 6.5), ←/→ по вкладкам, Tab по командам внутри тела, Esc — выход; Ctrl+F1 — свернуть
Доступность роль ToolBar для тела, TabList/Tab для вкладок; каждая группа — Group с именем; команда с меню объявляет haspopup; KeyTips озвучиваются как «клавиша доступа»

5.3 Компактная панель

Параметр Значение
Анатомия одна строка 40 px: [Файл ▾] [Отменить/Повторить] [стиль ▾][шрифт ▾][размер ▾] [Ж К Ч] [цвет] [выравнивание ▾] [списки ▾] [Вставка ▾] [Вид ▾] … [⋯ переполнение] [поиск]
Поведение те же команды, что в ленте, сгруппированные в меню по вкладкам; переполнение в ⋯; настраивается перетаскиванием при зажатом Alt
Переключение Вид → Плотность или Ctrl+Shift+F1 циклически: Лента → Компактная → Фокус
Доступность ToolBar, имя «Панель инструментов»

5.4 Панель быстрого доступа

Параметр Значение
Анатомия ряд кнопок 24 × 24 (иконки 16) в заголовке окна (слева от имени документа) или под лентой (параметр); по умолчанию: Сохранить, Отменить ▾ (история), Повторить, Печать-предпросмотр
Поведение добавление через ПКМ на команде ленты; порядок — перетаскиванием в параметрах; экспорт в quickaccess.json; на macOS размещается в нативном тулбаре
Клавиатура KeyTips Alt+1…9 по порядку
Доступность ToolBar «Быстрый доступ»; каждая кнопка — Button с именем команды

5.5 Backstage (вкладка «Файл»)

Параметр Значение
Анатомия на весь клиентский размер окна: слева навигация 220 px цвета accent (в тёмной — apps.<x>.900), белый текст 14 px, активный пункт — фон rgba(255,255,255,.18) 600; стрелка «←» 20 px сверху; пункты: Создать, Открыть, Сохранить, Сохранить как, Экспорт, Печать, Поделиться, Сведения, Параметры, Аккаунт; справа — область bg с полями 28 × 36, заголовок 24 px
Поведение открытие 160 мс сдвигом слева; Esc или «←» — возврат; документ под backstage не перерисовывается (снимок)
Клавиатура ↑/↓ по навигации, Tab в контент, Esc закрыть
Доступность роль Dialog без модальности (Pane), навигация — List с ListItem; при открытии фокус на активный пункт, при закрытии — обратно в документ

5.6 Командная палитра

Параметр Значение
Анатомия окно 640 × до 480 по центру верхней трети, радиус 14, тень 4: поле ввода 44 px (иконка search, плейсхолдер «Скажите, что нужно сделать»), список результатов (строка 36 px: иконка 20, имя, путь «Главная › Абзац» 12 px text2, горячая клавиша справа моно 11 px), подвал 28 px с подсказками ↑↓ выбрать · ↵ выполнить · Tab действия
Источники команды (с синонимами ru/en), стили, функции Sheets, файлы (недавние + индекс), настройки, справка, скрипты; префиксы: > команды, @ стили, # переход (страница/ячейка/слайд), = формула, ? справка
Поведение нечёткий поиск с ранжированием (частота использования × совпадение), результаты обновляются < 50 мс, не более 12 строк, группы с заголовками 11 px; Enter — выполнить и закрыть; Shift+Enter — выполнить и оставить
Клавиатура Ctrl/⌘+K открыть; Esc закрыть; ↑/↓, PgUp/PgDn, Tab — вторичные действия строки (например «Добавить на панель быстрого доступа»)
Доступность Dialog + ComboBox с ListBox; aria-activedescendant на выбранной строке; число результатов объявляется (live polite)

5.7 Меню и контекстные меню

Параметр Значение
Анатомия поверхность surface, рамка 1 px border, радиус 10, поля 6 px, тень 3; пункт 30 px (6 × 10 поля, радиус 6): [иконка 16 или место под неё 16] [текст 13 px] … [горячая клавиша 11 px text3-визуал] [шеврон подменю]; разделитель 1 px border с полями 5 × 4; заголовок секции 11 px 600 text2 верхний регистр не используется
Виды меню команды (кнопка ▾), контекстное (ПКМ/Shift+F10/клавиша Menu), подменю (открывается через 160 мс наведения или сразу по →), меню с флажками/радио (галочка/точка слева в колонке иконки), меню с галереей (встроенный блок образцов)
Контекстное меню документа первая секция — контекст (Вырезать/Копировать/Вставить/Специальная вставка), вторая — объект (Абзац…, Таблица ▸), третья — дополнительно (Комментарий, Ссылка, Поиск в интернете); при выделении текста над меню показывается мини-панель (5.8)
Поведение позиционирование: ниже/справа от якоря, при нехватке места — переворот; максимум высоты — экран − 16 px, затем прокрутка со стрелками; закрытие по Esc, клику вне, потере фокуса окна; подсказка пункта — через 1 с в строке состояния (не tooltip)
Клавиатура ↑/↓ с зацикливанием, → открыть подменю, ← закрыть, Home/End, буквы — переход по мнемонике (подчёркнутая при Alt), Enter/Space — выполнить
Доступность Menu/MenuItem/MenuItemCheckable; на macOS — нативное NSMenu (строка меню и контекстные), визуал системный

5.8 Мини-панель

Параметр Значение
Анатомия плавающая панель 4 px поля, радиус 10, тень 2, рамка 1 px: [стиль ▾ 120] [шрифт ▾ 120] [размер 52]
Поведение появляется при выделении мышью через 150 мс над выделением (ниже — если не помещается), непрозрачность 0 → 1 за 120 мс; скрывается при движении мыши > 60 px от панели, при наборе текста, по Esc; при выделении клавиатурой — не появляется (вызов Ctrl+Shift+F10); параметр отключения
Контексты текст, таблица (+строки/столбцы), изображение (обтекание, обрезка, замена), фигура (заливка/линия/порядок), ячейка Sheets (формат числа, объединение), слайд (макет), формула (вид)
Доступность ToolBar «Мини-панель форматирования»; фокус в неё — только явным вызовом, иначе она не отнимает фокус у документа

5.9 Боковые панели

Параметр Значение
Анатомия ширина 240 (левая, навигация) / 300 (правая, свойства), 200–560 изменяемая; заголовок 36 px (имя 12 px 600, кнопки: отстыковать, свернуть, закрыть ✕ text3); вкладки панели (12 px, активная — accent + подчёркивание 2 px); тело с полями 10 × 12, секции с заголовками-аккордеонами 28 px (шеврон + имя 12 px 600)
Докинг стороны: слева, справа, снизу (Sheets — только снизу для «Запросы»); панели одной стороны — вкладками или стопкой (перетаскивание заголовка показывает цели-зоны state.dropTarget); отстыкованная — отдельное окно-инструмент с тенью 5, поверх основного, запоминает положение на монитор
Полоса панелей при закрытии панель сворачивается в вертикальную полосу 36 px с иконками 20 px (вертикальные подписи не используются); клик — раскрыть поверх (overlay) или закрепить (pin)
Стандартные панели Навигация (структура/страницы/результаты поиска), Стили, Свойства, Комментарии, Правки, Слои (Paint/Draw), Библиотека фигур, Медиа, Ассистент, Скрипты, История версий
Клавиатура F6 между областями; Ctrl+F6 следующая панель; Esc — фокус обратно в документ; Ctrl+Shift+S — панель стилей (как в Office Ctrl+Alt+Shift+S, схема настраивается)
Доступность Pane с именем панели; вкладки — TabList; аккордеоны — Button с expanded; при закрытии фокус возвращается на команду, которая открыла

5.10 Строка состояния

Параметр Значение
Анатомия 24 px, фон surface, верхняя граница 1 px: слева — контекст (Стр. 3 из 12 · 1 254 слова · Русский · [Правки: вкл]), центр — пусто/подсказка пункта меню, справа — [режимы просмотра: сегмент 3 кнопок] [масштаб: − ──●── + 100 %] ; текст 11 px text2
Поведение каждый сегмент — кнопка (щелчок открывает соответствующий диалог: язык → выбор языка, слова → статистика, масштаб → диалог масштаба); ПКМ — меню «Настроить строку состояния» с флажками; Sheets добавляет «Сумма · Среднее · Количество» выделения
Доступность StatusBar; изменения (например «Сохранено 19:12») объявляются live polite; кнопки имеют имена с значениями («Масштаб 100 %, кнопка»)

5.11 Кнопки (6 видов)

Вид Фон / рамка / текст Применение
Первичная (primary) accentText / нет / белый 500 одно главное действие на экран/диалог («Готово», «Создать документ»)
Вторичная (secondary, по умолчанию) surface / 1 px borderStrong / text 500 остальные действия диалогов, «Отмена»
Прозрачная (ghost) нет / нет / text 500 действия в панелях, тулбарах, «← Назад», «Пропустить»
Опасная (danger) err / нет / белый необратимые действия («Удалить», «Отозвать»); никогда — кнопка по умолчанию
Иконка (icon) как ghost, квадрат 30 × 30 (24 × 24 sm, 26 × 24 в ленте) команда с понятной иконкой, обязательна подсказка и Accessible.name
Раскрывающаяся (dropdown / split) как secondary/ghost + шеврон 16 px; split — разделитель 1 px между действием и шевроном команда с вариантами («Вставить ▾», «Сохранить

Размеры: высота 30 px (sm 24 px, lg 36 px), поля 14 px (sm 10), радиус 6, текст 13 px 500 (sm 12), иконка 16/20 с зазором 6 px; минимальная ширина текстовой кнопки 72 px; кнопки в подвале диалога — одинаковой ширины по самой широкой. Порядок в диалогах: Windows/Linux — [Отмена] [ОК] справа, первичная последняя; macOS — та же раскладка (первичная справа). Клавиатура: Space/Enter — нажать; Enter в диалоге — кнопка по умолчанию (первичная, выделена рамкой accent), Esc — Отмена; у split ↓ открывает меню. Доступность: Button; у dropdown — haspopup=menu; у кнопки-иконки имя = текст подсказки; состояние pressed для кнопок-переключателей (Ж/К/Ч).

5.12 Поля ввода

Параметр Значение
Анатомия подпись 12 px text2 над полем (зазор 4) или слева (формы «ключ-значение», 120 px колонка); поле 30 px, поля 10 px, радиус 6, рамка 1 px borderStrong, фон surface; плейсхолдер text3-визуал (не заменяет подпись); слева иконка 16 (опц.), справа — кнопка очистки ✕ (появляется при тексте) или счётчик; под полем — подсказка/ошибка 12 px
Варианты текст, пароль (кнопка «показать»), поиск (иконка + очистка, Esc очищает), многострочное (авто-рост до 6 строк, затем прокрутка; изменяемая высота), с префиксом/суффиксом (единица, https://), с маской (телефон, дата)
Состояния фокус: рамка accent + кольцо 3 px selection.bg; ошибка: рамка err, иконка ico-error в поле, сообщение; только чтение: фон surface2, текст выделяется; выключено: 0,45
Поведение валидация — при потере фокуса или по Enter, не на каждый символ (кроме счётчика длины); ошибка снимается при исправлении; Ctrl+Z работает внутри поля отдельно от документа; автозаполнение из истории (вниз список)
Клавиатура стандартная правка текста; Ctrl+A, Home/End; Esc в диалоге — отмена диалога (если поле не поглощает: поиск поглощает первый Esc для очистки)
Доступность EditableText; имя = подпись (labelFor), описание = подсказка, invalid=true + сообщение связано как describedby; маска объявляется в описании

5.13 Числовые поля с единицами

Параметр Значение
Анатомия поле 30 px (24 в ленте) с суффиксом единицы (см, pt, %, px) справа внутри поля text2; стрелки ▲▼ 16 px справа (появляются при наведении/фокусе; на сенсоре — всегда); ширина 72–96 px
Поведение принимает ввод с единицей («2,5 cm», «12pt», «1in») и конвертирует в единицу поля; разделитель дробной части — по локали, принимает оба (, и .); шаг стрелок — 0,1 см / 0,5 pt / 1 % / 1 px, с Shift ×10, с Ctrl ×0,1; колёсико при фокусе; перетаскивание по подписи (drag-to-adjust) при зажатой ЛКМ на подписи с курсором ↔︎; диапазон и шаг в подсказке; значение применяется к документу живьём с откатом по Esc
Единицы по умолчанию из локали (см для ru/de, дюймы для en-US) и параметров; типографские — pt; экранные — px; угол — °; время — с
Клавиатура ↑/↓ ± шаг, PgUp/PgDn ±10 шагов, Enter применить, Esc откат
Доступность SpinBox с value/min/max/step, имя с единицей («Отступ слева, сантиметры»)

5.14 Выпадающие списки и комбо

Параметр Значение
Анатомия как поле 30 px (24 в ленте), справа шеврон text3-визуал; список — меню (5.7) шириной ≥ поля, до 12 строк, затем прокрутка; строка 30 px (28 в компактных); группы с заголовками; текущий пункт отмечен галочкой слева или фоном selection.bg
Виды select (только выбор), combo (ввод + выбор с фильтрацией по вводу), с иконками, с образцами (шрифты — предпросмотр начертанием; цвета — квадрат 16), с «недавними» секцией, с поиском (поле в шапке списка при > 20 пунктов)
Поведение открытие: клик, Alt+↓, Space (select), F4; выбор применяется сразу (без «ОК»); живой предпросмотр при наведении на пункт (шрифт, стиль) — опционально по компоненту; закрытие по Esc возвращает прежнее
Клавиатура ↑/↓ без открытия меняют значение (select) — в документе отключено во избежание случайных изменений: только после открытия; набор букв — переход; Home/End
Доступность ComboBox с expanded, список ListBox, активный элемент через activedescendant; у combo с вводом — EditableText внутри

5.15 Флажки, переключатели, радио

Параметр Значение
Флажок квадрат 16 × 16, радиус 4, рамка 1 px borderStrong, фон surface; включён — фон accent, галочка белая 2 px; неопределённое — тире 2 px белое на accent; подпись 13 px справа с зазором 8, вся строка кликабельна; в списках/деревьях — 16 px, в таблицах — по центру ячейки
Радио круг 16 × 16, включён — рамка accent 5 px (точка 6 px видимой поверхности); группа — по вертикали зазор 8 или по горизонтали 16; карточки-радио (как в HUB-04): карточка с радио внутри, выбранная — рамка accent
Переключатель (switch) 34 × 20, дорожка borderStrong / accent, бегунок 16 px белый с тенью 1; подпись слева (формы) или справа (списки); применяется немедленно — для настроек, которые действуют сразу; флажок — для выбора, который подтверждается кнопкой
Состояния наведение — рамка text3; фокус — кольцо; ошибка — рамка err у группы + сообщение; выключено — 0,45
Клавиатура Space переключить; радио — ↑/↓/←/→ внутри группы (один Tab-стоп на группу); switch — Space/Enter
Доступность CheckBox (checked/mixed), RadioButton в RadioGroup с именем группы, Switch (на платформах без роли — CheckBox с описанием «переключатель»)

5.16 Ползунки

Параметр Значение
Анатомия дорожка 2 px borderStrong (заполненная часть accent), бегунок 14 px круг accent с белой рамкой 2 px (в строке состояния — 10 px без рамки); риски делений 1 × 4 px border; подпись значения — всплывающая над бегунком при перетаскивании (24 px, моно 11) или поле 56 px справа
Виды одиночный, диапазон (два бегунка, заполнение между), вертикальный (панели инструментов Paint), с полем ввода, дискретный (привязка к делениям, 100 % у масштаба)
Поведение клик по дорожке — переход (не страницей); колесо при наведении + фокусе; Shift — точный режим ×0,1; двойной клик по бегунку — значение по умолчанию
Клавиатура ←/→ ±шаг, PgUp/PgDn ±10 %, Home/End min/max; ↑/↓ для вертикального
Доступность Slider с value/min/max/step/valueText («100 процентов»), ориентация

5.17 Вкладки

Параметр Значение
Виды ленты (5.2); панелей — текст 12 px, поля 8 × 10, активная — accent 600 + подчёркивание 2 px; документов (Hub, диалоги) — 13 px, поля 8 × 12, подчёркивание 2 px accent, margin-bottom:-1px над границей 1 px; листов Sheets — 28 px полоса снизу, вкладка 4 × 12, активная — фон bg, рамка 1 px без низа, текст accent 600, цветной индикатор 3 px (цвет листа) снизу; закрываемые (несколько документов в окне — не используется: окно на документ)
Поведение листы Sheets: двойной клик — переименовать, перетаскивание — порядок (с Ctrl — копия), ПКМ — меню (вставить, удалить, скрыть, цвет, защитить); переполнение — кнопки прокрутки ‹ › и список ▾; «+» — новый лист
Клавиатура ←/→ по вкладкам с автоактивацией (панели) или Enter (ленты — активация по фокусу через 300 мс для совместимости с Office); Ctrl+PgUp/PgDn — листы/слайды/страницы
Доступность TabList/Tab с selected; панель содержимого TabPanel связана controls

5.18 Деревья

Параметр Значение
Анатомия строка 26 px (24 компактно), отступ уровня 16 px, треугольник раскрытия 10 px text3-визуал в колонке 16 px, иконка 16, текст 13 px, справа — счётчик/кнопки при наведении; линии уровней не рисуются; выбранная — фон selection.bg, радиус 4
Виды структура документа (заголовки с уровнями, перетаскивание меняет порядок разделов), папки Hub, слои (с флажками видимости и замками), объекты Draw, таблицы/запросы Base, папки Mail (с непрочитанными 600 + счётчик)
Поведение раскрытие по треугольнику или двойному клику; ленивая загрузка — спиннер 12 px вместо треугольника; множественный выбор Ctrl/Shift; редактирование имени F2/двойной клик с задержкой; перетаскивание с автораскрытием через 600 мс наведения
Клавиатура ↑/↓, → раскрыть/вглубь, ← свернуть/к родителю, * раскрыть всё, Home/End, набор текста — поиск, Space — флажок
Доступность Tree/TreeItem с level, expanded, setsize/posinset; имя — текст строки + счётчик

5.19 Списки

Параметр Значение
Анатомия строка 32 px (поля 7 × 10, радиус 6): иконка-плашка 22 × 22 (fico, цвет приложения, радиус 5) или аватар, основной текст 13 px, вторичный 12 px text2, справа мета 11 px text3-визуал / бейдж; разделители не рисуются (зазор 0, фон при наведении); секции с заголовком 11 px 600 text2 с полями 12 × 10
Виды навигация (Hub слева), файлы (недавние — с тегами «☁ Облако», «Этот Mac»), уведомления (многострочные с временем), результаты (поиск, палитра), выбор с флажками, упорядочиваемые (ручка drag-handle слева)
Поведение один клик — выбор, двойной/Enter — открыть (файлы); ПКМ — меню; «пустой список» — пустое состояние (5.27); виртуализация при > 200 строк; группировка по дате («Сегодня», «Вчера», «На этой неделе»)
Клавиатура ↑/↓, Home/End, PgUp/PgDn, набор текста — переход, Space — отметить, Delete — удалить (с подтверждением/отменой в toast)
Доступность List/ListItem (selected), многострочное имя = «имя файла, Облако, 20 минут назад, 1,2 МБ»

5.20 Таблицы-сетки (data grid)

Параметр Значение
Анатомия заголовки столбцов/строк 22 px (Sheets: высота строки 22 px при 100 %, ширина столбца 64 px = 8,43 символа Carlito 11), фон surface2, текст 11 px text2 Inter, выбранный заголовок — selection.bg 600; ячейки — границы 1 px border, текст 12–14,6 px шрифтом документа, числа — вправо, табличные цифры; текущая ячейка — рамка 2 px accent внутрь + маркер заполнения 6 × 6 в углу; выделение — selection.bg с рамкой 1 px accent по контуру диапазона; угол «выделить всё»
Виды Sheets (бесконечная сетка, объединения, заморозка строк/столбцов с линией 2 px borderStrong, группировка строк с полосой уровней слева), Base (таблица записей: строка-«новая запись» с «*», ширины столбцов из метаданных, типизированные редакторы), списки-таблицы интерфейса (файлы в режиме «Таблица», ответы Forms: сортировка по клику заголовка с индикатором ▲▼, изменение ширины за границу заголовка, перестановка столбцов перетаскиванием, выбор столбцов в меню ПКМ)
Поведение редактирование по F2/Enter/вводу символа (Sheets: ввод заменяет, F2 — в конец); автодополнение из столбца; проверка данных — рамка err + подсказка; подсказка-предпросмотр при наведении на усечённый текст; Ctrl+колесо — масштаб; выделение «мёртвой зоны» (за пределами данных) — обычное
Клавиатура стрелки, Tab/Shift+Tab, Enter (вниз, настраиваемо), Ctrl+стрелка — к краю данных, Shift+ — расширение, Ctrl+Space/Shift+Space — столбец/строка, Ctrl+A — область/всё, F4 — абсолютные ссылки при вводе формулы
Доступность Table/Row/Cell с rowIndex/columnIndex, заголовки объявляются (rowHeader/columnHeader), текущая ячейка — focused; имя ячейки = «B3, 1 254, число»

5.21 Карточки

Параметр Значение
Анатомия surface, 1 px border, радиус 10, поля 14 (0 для карточек с медиа — картинка/превью сверху 140 px, подпись в блоке 10 px); заголовок 13 px 600, подпись 11 px text2; действия — ghost-кнопки внизу или «⋯» в углу при наведении
Виды действие («Документ — пустой или из шаблона», с плашкой приложения 36 px радиус 8), шаблон (превью + название + «Write · Бизнес»), файл (сетка файлов), выбор (радио-карточка, тема, формат), информационная (облако с прогрессом)
Состояния наведение — рамка accent + тень 2; выбранная — рамка accent 1 px + фон apps.<x>.50 (тёмная: accent α 0,12); фокус — кольцо; перетаскиваемая — тень 4, наклон 0
Поведение вся карточка — одна цель клика (одно действие); дополнительные — через «⋯»/ПКМ; сетка карточек repeat(auto-fill, minmax(180px, 1fr)) зазор 12–14
Клавиатура Tab на карточку, Enter — действие, Menu/Shift+F10 — меню, стрелки в сетке (grid navigation)
Доступность Button или ListItem (в сетке — Grid/GridItem) с именем «Коммерческое предложение, шаблон, Write, Бизнес»

5.22 Диалоги

Параметр Значение
Размеры S 420 × до 360 (подтверждения, переименование, «О программе»), M 560 × до 600 (большинство: Абзац, Шрифт, Параметры страницы, Гиперссылка), L 860 × до 680 (Параметры, Настройка ленты, Печать с предпросмотром, Мастер первого запуска 900); высота — по содержимому, прокрутка внутри тела при нехватке; минимум 320 × 200
Анатомия заголовок 14 px 600 (поля 14 × 18, граница снизу 1 px), ✕ справа (text3-визуал); тело поля 16 × 18, зазор 12 между полями; подвал (поля 12 × 18, фон bg, граница сверху 1 px): слева — ссылка-справка/флажок «Больше не спрашивать», справа — кнопки; радиус 14, тень 4, рамка 1 px
Модальность оконная (блокирует своё окно-документ; другие окна работают — так как процесс на документ), приложенческая (только активация/лицензия/крах), немодальная (Поиск/Замена, Стили, Макросы — остаются поверх, не блокируют); модальные показываются по центру родителя с затемнением rgba(16,24,40,.35); на macOS простые модальные (сохранить/не сохранять) — как sheet
Поведение открытие 160 мс (масштаб 0,96 → 1 + прозрачность); первый фокус — первое поле или кнопка по умолчанию; Enter — кнопка по умолчанию (кроме многострочных полей), Esc — Отмена; изменения в диалоге с предпросмотром применяются к документу живьём и откатываются по Отмене; диалог запоминает размер (если изменяемый) и вкладку
Текст заголовок — существительное или вопрос («Сохранить изменения в «Договор.mwx»?»), кнопки — глаголы («Сохранить», «Не сохранять», «Отмена»; никаких «Да/Нет»)
Доступность Dialog (modal=true), имя = заголовок, описание = первый абзац; фокус-ловушка внутри модального; при закрытии фокус возвращается на вызвавший элемент

5.23 Всплывающие окна (popover)

Параметр Значение
Анатомия surface, рамка 1 px, радиус 14, тень 4, поля 12; стрелка-указатель не рисуется (выравнивание по краю якоря); ширина 240–480
Применение выбор цвета, выбор даты, параметры команды из ленты (например «Поля страницы»: галерея + «Настраиваемые поля…»), сведения о пользователе (аватар), фильтр столбца, карточка комментария при наведении
Поведение открывается у якоря (снизу слева, переворот при нехватке), «лёгкое закрытие» по клику вне/Esc/прокрутке документа; может содержать поля ввода (тогда фокус внутри); не вложенные более 1 уровня (вложенный открывает диалог)
Клавиатура фокус переходит внутрь при открытии клавиатурой; Tab зациклен; Esc — закрыть и вернуть фокус
Доступность Dialog немодальный или Group с именем; haspopup=dialog у якоря

5.24 Подсказки (tooltip)

Параметр Значение
Анатомия surface, рамка 1 px, радиус 6, тень 2, поля 6 × 8; текст 12 px text: имя команды (500) + горячая клавиша text2; расширенная (ribbon): до 280 px, заголовок + описание 2–3 строки + иллюстрация 32 px (опц.) + «Нажмите F1 для справки»
Поведение появление через 600 мс наведения (0 мс, если другая подсказка видна < 500 мс назад — «быстрый режим»), исчезновение при уходе/нажатии/через 10 с; при фокусе с клавиатуры — через 600 мс после остановки; не перекрывает курсор (смещение 16 px вниз), не выходит за экран; никогда не содержит интерактивных элементов
Доступность ToolTip; текст дублирует Accessible.description элемента; Esc скрывает (WCAG 1.4.13)

5.25 Уведомления: toast и баннеры

Параметр Значение
Toast внизу справа над строкой состояния (отступ 16 × 40), ширина 320–420, surface, рамка 1 px, левая полоса 3 px (цвет: accent — информация/успех действия, ok, warn, err), радиус 10, тень 4, поля 10 × 14; текст 12 px, иконка 16; до 1 кнопки-действия («Отменить», «Открыть») и ✕; стопка до 3, новые сверху; авто-скрытие 6 с (с действием — 10 с; при наведении таймер стоит); ошибки — без автоскрытия
Баннер полоса под лентой во всю ширину, 36 px (многострочный — до 56), фон semantic.<x>.bg, иконка 16, текст 12 px semantic.<x>.text / text, кнопки ghost справа, ✕ если закрываемый; применение: «Защищённый просмотр — файл из интернета [Разрешить редактирование]», «Документ содержит скрипты [Включить] [Подробнее]», «Подписка истекает через 5 дней [Продлить]», «Нет подключения — изменения сохраняются локально», «Доступно обновление»
Поведение toast — для результата действия (сохранено в облако, экспорт готов, отправлено) и отмены («Удалено 3 файла — Отменить»); баннер — для состояния, которое длится; критичное (потеря данных) — диалог, не toast
Доступность toast — live polite (ошибка — assertive), фокус не отнимает; F6/Ctrl+Shift+N переводит фокус в область уведомлений; баннер — Alert/Status

5.26 Индикаторы прогресса

Параметр Значение
Линейный 6 px дорожка surface2, заполнение accent, радиус 3; определённый (с процентом справа 12 px моно или подписью «3 из 12») и неопределённый (бегущий отрезок 30 %, 1,2 с цикл); 2 px — в сплэше и под заголовком панели при фоновой операции
Кольцевой (спиннер) 16/20/32 px, штрих 2 px, дуга 270°, вращение 0,9 с linear; accent на светлом, белый на цветном; при «уменьшить движение» — пульсация непрозрачности вместо вращения
Скелет блоки surface2 с мерцанием (shimmer 1,6 с, в reduce-motion — статично) для списков файлов и галерей, показывается после 300 мс ожидания, минимум 500 мс
Длительные операции > 2 с — диалог/панель «Выполняется…» с именем задачи, прогрессом, «Отмена», оценка времени после 20 % (не раньше); фоновые задачи (экспорт, индексация, загрузка в облако) — в «Центре задач» (иконка в строке состояния с кольцевым индикатором)
Доступность ProgressBar с value/min/max или busy; изменения объявляются не чаще раза в 5 с («Экспорт 40 процентов»)

5.27 Пустые состояния

Параметр Значение
Анатомия по центру области, иллюстрация 64–96 px (контурная, 1,5 px, text3-визуал с акцентной деталью accent; без мультяшности), заголовок 15 px 600 text, описание 13 px text2 ≤ 2 строки, первичное или вторичное действие (одна кнопка), ссылка «Узнать больше» (опц.); ширина блока ≤ 360
Тексты говорят, что здесь будет и как начать: «Пока нет комментариев — Выделите текст и нажмите Ctrl+Alt+M» ; «Нет недавних файлов — Начните с шаблона или откройте файл» ; поиск без результатов: «Ничего не найдено по запросу «…» — Проверьте написание или ищите по всем приложениям»
Доступность заголовок — Heading, блок — Group с именем; фокус на действие при появлении не переводится

5.28 Выбор цвета

Параметр Значение
Анатомия (popover 268 px) «Автоматически» (строка 28 px с образцом по теме) → Цвета темы: 10 столбцов × (база + 5 оттенков) образцов 20 × 20 зазор 4 → Стандартные цвета: 10 образцов → Недавние: до 10 → «Другие цвета…» (диалог) · «Пипетка» · «Нет цвета/Нет заливки»
Образец 20 × 20 радиус 3, рамка 1 px rgba(0,0,0,.12) (белый/светлый — всегда видим); текущий — рамка 2 px text + внутренняя белая 1 px; наведение — увеличение рамки до accent; подсказка «Акцент 1, светлее 60 %» и hex
Диалог «Другие цвета» (M) вкладки «Палитра» (HSV-квадрат + полоса тона + альфа при поддержке), «Числа» (RGB/HSL/CMYK (конверсия sRGB) /hex — поля с единицами), «Образцы» (документная палитра, системная, Pantone-не-включаем); старый/новый цвет рядом; «Добавить в свои»
Пипетка захватывает цвет с любой точки экрана (Windows/macOS — системное API, Linux Wayland — через портал org.freedesktop.portal.Screenshot/PickColor); лупа 9 × 9 пикселей, Esc отмена
Поведение живой предпросмотр при наведении на образец (откат при уходе); split-кнопка цвета в ленте хранит последний цвет (полоса 3 px) и применяет его по клику
Клавиатура сетка образцов — стрелки, Enter выбрать, Tab между секциями; поля чисел — обычные
Доступность Grid/GridItem с именем цвета («Синий, акцент 1, светлее 40 %»); hex в описании; пипетка объявляет выбранный цвет

5.29 Выбор шрифта

Параметр Значение
Анатомия combo 120–160 px с вводом и фильтрацией; список 320 px: секции Шрифты темы (Заголовки/Текст), Недавние (до 8), Все шрифты (алфавит, с заголовками-буквами по вводу); строка 30 px: имя шрифта самим шрифтом 14 px (для символьных/CJK — имя Inter + образец «Абв AaBb» справа), справа значки: «в комплекте», «встроен в документ», «замена» (⚠ с подсказкой «Calibri → Carlito»)
Поведение ввод фильтрует по подстроке и транслиту («ариал» → Arial); живой предпросмотр в документе при наведении (параметр); отсутствующие шрифты документа — вверху секцией «В документе» с пометкой замены; варианты начертания — отдельный combo (Regular/Bold/Light…) с реальными начертаниями семейства; размер — combo 52 px с списком 8…72 и вводом (pt, с десятичными)
Клавиатура набор — фильтр, ↑/↓, Enter; Ctrl+Shift+F — фокус в поле шрифта (как в Office)
Доступность ComboBox; имя пункта = имя шрифта (не рендерится шрифтом для диктора), описание — «в комплекте»/«замена для Calibri»

5.30 Галереи стилей

Параметр Значение
Анатомия в ленте — 3 ряда (компактно 1 ряд) ячеек 96 × 28 с образцом стиля («Заголовок 1» в его оформлении, ограниченном по высоте) и именем 11 px под ним (или только образец при нехватке); текущий стиль — рамка accent + selection.bg; развёрнутая галерея — popover 3 × N с прокруткой, секциями («Рекомендованные», «Все», «Свои») и подвалом («Создать стиль…», «Очистить формат», «Применить стили…» — панель)
Виды стили абзацев/символов (Write), стили ячеек и таблиц (Sheets), макеты и темы слайдов (Slides, образцы 16:9 112 × 63), стили фигур (Draw, образцы 48 × 32), темы документа (все: образцы с 4 цветами и 2 буквами шрифтов)
Поведение живой предпросмотр при наведении (всё выделение), применение по клику; ПКМ — «Изменить», «Обновить по выделению», «Удалить из галереи», «Переименовать»; Alt-перетаскивание — порядок
Клавиатура стрелки по сетке, Enter применить, Esc закрыть; Ctrl+Shift+S — панель «Применить стили» с полем ввода имени
Доступность List/ListItem с именем стиля, описание — «абзацный стиль, Carlito 16 полужирный»; образцы не озвучиваются

5.31 Масштаб

Параметр Значение
Анатомия (строка состояния) [−] [ползунок 120 px с риской 100 %] [+] [100 % — кнопка] ; шаги кнопок: 10 % до 100, 25 % выше; диапазон 10–500 % (Sheets 10–400, Paint 1–3200 %)
Диалог «Масштаб» (S) радио: 200 / 100 / 75 / По ширине страницы / По ширине текста / Целая страница / Несколько страниц / Произвольно [поле %]; предпросмотр
Поведение Ctrl+колесо — масштаб к курсору (плавный, шаг 10 %), жест щипка — непрерывно; Ctrl+0 — 100 %, Ctrl+1 — по ширине, Ctrl+2 — целая страница; масштаб запоминается в документе (settings.xml) и в приложении для новых; индикатор в подсказке при жесте (24 px чип «125 %» по центру, 400 мс)
Доступность Slider + кнопки; текущее значение объявляется после остановки изменения

5.32 Поиск и замена

Параметр Значение
Быстрый поиск Ctrl+F — полоса 36 px в правом верхнем углу холста (не панель): поле 240 с счётчиком «3 из 17», [▲][▼], [Aa][.*][Слово], [⋯ → Замена/Расширенный], ✕; результаты подсвечиваются (highlight.find), текущий — findCurrent с прокруткой к нему; поиск по мере ввода (debounce 150 мс)
Замена Ctrl+H — та же полоса с второй строкой: поле «Заменить на», кнопки «Заменить», «Все»; после «Все» — toast «Заменено 17 вхождений — Отменить»
Расширенный панель «Навигация → Результаты»: список совпадений с контекстом (строка 32 px: фрагмент с выделением 600, место «Стр. 4»), фильтры: область (документ/выделение/все открытые/папка в Hub), формат (шрифт/стиль/цвет — через «Формат ▾»), спецсимволы (^p, ^t, регулярные выражения ICU с подсказкой), направление, с учётом диакритики/ширины
Sheets дополнительно: искать в формулах/значениях/примечаниях, по строкам/столбцам, во всей книге, «Перейти к» (F5)
Клавиатура Enter/Shift+Enter — следующий/предыдущий, Esc — закрыть и оставить выделение на текущем, Alt+R — переключить замену, F3/Shift+F3 — повтор
Доступность полоса — ToolBar «Поиск»; счётчик — live polite («3 из 17»); результаты — List

5.33 Календарь-пикер

Параметр Значение
Анатомия (popover 280 px) шапка: [‹] «Октябрь 2026 ▾» (клик — выбор месяца/года сеткой 3 × 4) [›]; строка дней недели 11 px text2 с началом по локали (пн для ru); сетка 7 × 6 ячеек 32 × 32: сегодня — рамка 1 px accent, выбранная — фон accent белый текст, диапазон — selection.bg между концами, соседние месяцы — text3-визуал, недоступные — 0,45; подвал: «Сегодня», «Очистить», поле времени (при datetime) со шагом 5 мин, часовой пояс (Mail)
Виды дата, диапазон (два месяца рядом ≥ 560 px), месяц, неделя (строки-кнопки), дата-время; поле с маской по локали (дд.мм.гггг) и иконкой календаря; поддержка календарей ICU (григорианский по умолчанию; хиджра/буддийский — по локали)
Клавиатура стрелки по дням, PgUp/PgDn месяц, Shift+PgUp/PgDn год, Home/End неделя, Enter выбрать, T сегодня, Esc
Доступность Grid «Календарь, октябрь 2026», ячейки GridItem с полным именем даты («среда, 7 октября 2026»), заголовок — live при смене месяца

5.34 Загрузчик файлов

Параметр Значение
Анатомия зона 1 px пунктир borderStrong радиус 10, поля 24, по центру иконка upload 32 + «Перетащите файлы сюда или [Выбрать файлы]» + ограничения 12 px text2 («PNG, JPG, SVG до 50 МБ»); список загружаемых: строка 44 px с миниатюрой 32, имя, размер, прогресс 2 px, ✕/повтор
Поведение при перетаскивании над зоной — фон apps.<x>.50, рамка accent сплошная; над всем окном — подсветка допустимых зон; Выбрать файлы — нативный диалог ОС (портал на Flatpak); ошибка типа/размера — строка с err и причиной, остальные продолжаются; вставка из буфера (Ctrl+V с картинкой) — тоже загрузка
Применение вставка изображений/вложений, импорт данных (Sheets/Base), шаблоны, шрифты в параметрах, вложения Mail/Notes/Forms
Доступность кнопка Button «Выбрать файлы» — единственный обязательный путь; зона — Group с инструкцией; прогресс и результат — live polite

5.35 Онбординг-подсказки (coach marks)

Параметр Значение
Анатомия подсветка целевого элемента (вырез в затемнении rgba(16,24,40,.45) с радиусом 8 и полем 4) + карточка 320 px (surface, радиус 14, тень 4, поля 16): заголовок 15 px 600, текст 13 px ≤ 3 строк, картинка/GIF 288 × 160 (опц.), шаги «2 из 4» 11 px text2, кнопки [Пропустить всё] … [Назад] [Далее]/[Готово]; указатель — стрелка 8 px к элементу
Поведение запускаются один раз на событие (первый запуск приложения, первое открытие ленты в компактном режиме, новая функция после обновления — максимум 1 на сессию); никогда во время ввода текста; Esc = Пропустить всё; все туры повторяемы из «Справка → Советы»; состояние — в профиле (синхронизируется)
Контент 3–5 шагов, каждый — один элемент и одно действие («Нажмите Ctrl+K — и ищите любую команду»); «пузыри-намёки» (hint dot 8 px sun с пульсацией) на новых командах ленты — исчезают после первого клика
Доступность карточка — Dialog немодальный с фокусом внутри; затемнение не блокирует диктора; при «уменьшить движение» пульсация выключена

5.36 Значок «замок» для функций редакции выше

Параметр Значение
Где команды ленты/меню/панелей, недоступные в текущей редакции (Features::has(Feature::X) == false): команда видна, иконка остаётся, в правом нижнем углу иконки — бейдж замка 10 × 10 (ico-lock-filled, text2 на кружке surface с рамкой 1 px); в меню — замок справа вместо горячей клавиши; у карточек приложений Hub — тег «Pro» (tag, фон apps.hub.100, текст ink)
Поведение клик открывает popover «Доступно в редакции Pro» (280 px): иконка функции 32, заголовок, 1–2 предложения пользы, [Попробовать 30 дней] (если пробный не использован) [Сравнить редакции] [Позже]; попытка через горячую клавишу — тот же popover у строки состояния; после активации замки исчезают без перезапуска
Правила не более одного напоминания о подписке в день (баннер); замок — только на командах, которые реально будут работать после покупки в этой же версии; документы с «запертыми» объектами открываются и печатаются всегда (объект редактируется как картинка)
Доступность имя команды дополняется «, требуется редакция Pro»; popover — Dialog; кнопка «Попробовать» — первичная, остальные — ghost

6. Паттерны взаимодействия

6.1 Выделение и манипуляторы

Элемент Спецификация
Выделение текста фон selection.bg без скругления, построчно; при потере фокуса окна — selection.inactive; выделение сохраняется при открытии диалогов; тройной клик — абзац, Ctrl+клик — предложение, двойной — слово (с учётом знаков по ICU)
Рамка объекта 1 px accent по границе объекта + 8 ручек 8 × 8 (белый, рамка 1 px accent, радиус 2; угловые — масштаб с сохранением пропорций при Shift, боковые — одна ось); ручка поворота — круг 10 px на выносе 20 px над верхним центром с линией 1 px; при наведении ручки увеличиваются до 10
Множественное выделение рамки объектов accent 1 px, общая рамка пунктир 1 px, ручки только у общей; Shift+клик добавить, Ctrl+клик переключить; выделение рамкой (marquee) — прямоугольник selection.bg + рамка 1 px accent, объекты выделяются при полном попадании (Draw: при частичном — с Alt)
Обрезка (crop) режим по кнопке «Обрезать»: ручки превращаются в угловые/боковые скобки 3 px text чёрно-белые (видимы на любом фоне), область вне кадра — затемнение 50 %; Enter/клик вне — применить, Esc — отмена; соотношение сторон из меню; обрезка по фигуре
Поворот перетаскивание ручки — свободно, с Shift — шаги 15°; подсказка-чип угла «32°» у курсора; поворот вокруг центра (с Ctrl — вокруг противоположного угла)
Привязки умные направляющие 1 px paint (magenta) с подписью расстояния при совпадении центров/краёв/равных интервалов; привязка к сетке по Alt временно отключается; порог 6 px
Таблицы выделение ячеек — заливка selection.bg; маркер перемещения таблицы (крест 16 px в левом верхнем углу при наведении) и маркер размера (квадрат 8 px в правом нижнем); границы столбцов перетаскиваются с подсказкой ширины
Сетка Sheets курсор ячейки 2 px accent, маркер заполнения 6 × 6 (курсор «+» тонкий); выделенный диапазон — selection.bg + рамка 1 px; ссылки формул при редактировании — цветные рамки по порядку chart.cat с ручками

6.2 Drag-and-drop

Сценарий Поведение
Внутри документа текст/объекты — перетаскивание после 4 px движения с зажатой кнопкой; превью — полупрозрачный снимок (α 0,7) со смещением 8 × 8 от курсора; целевая позиция — каретка 2 px accent (текст) или рамка (объекты); Ctrl — копия (курсор с «+»), Shift — перемещение; Esc — отмена; автопрокрутка у краёв (зона 24 px, скорость пропорциональна)
Между приложениями Meridian по общему MIME (application/vnd.meridian.<app>+xml фрагмент) + запасные (text/html, text/plain, image/png, text/csv для диапазонов); таблица из Sheets в Write — таблица Write (с опцией «связать»), фигура из Draw в Slides — фигура, слайд в Write — картинка + ссылка
Из ОС файлы на холст — вставка (картинка/вложение) или открытие в новом окне (если бросить на заголовок/ленту/Hub); несколько файлов — все; папка — не принимается (toast); текст из других программ — text/html с очисткой стилей по параметру «Вставка по умолчанию»
Из приложения в ОС выделение текста/объектов можно перетащить в проводник/Finder как файл («Сорванный фрагмент» .mwx/.png) и в другие программы (text/html, image/png, text/rtf)
Панели и вкладки перетаскивание заголовка панели — докинг (см. 5.9); листов — порядок; слайдов — порядок в миниатюрах (с индикатором-линией 2 px accent); файлов в списках Hub — в папки/избранное
Отклонение курсор Forbidden; причина — в строке состояния («Нельзя вставить папку»)
Клавиатурная альтернатива каждое перетаскивание имеет команду: «Переместить в…», «Вырезать/Вставить», Alt+Shift+↑/↓ (абзацы/строки), Ctrl+Shift+PgUp/PgDn (слайды/листы)

6.3 Буфер обмена и специальная вставка

6.4 Отмена и повтор

Правило Значение
Глубина не ограничена в рамках сеанса (журнал операций, память ~ 1 % документа на шаг; при превышении 200 МБ — сброс самых старых с предупреждением в журнале)
Группировка ввод текста — по словам (пауза 1 с или пробел завершает группу); форматирование из диалога — один шаг; перетаскивание — один шаг; автозамена — отдельный шаг (первый Ctrl+Z отменяет автозамену, второй — ввод)
История кнопка Отменить ▾ показывает список до 20 шагов с описаниями («Ввод «Договор»», «Полужирный», «Вставка таблицы 3 × 4»); выбор — откат до шага включительно; панель «История версий» — снимки по времени (автосохранение) с восстановлением как новой версии
Повтор Ctrl+Y/Ctrl+Shift+Z — повтор отменённого; F4 (Office) — повторить последнее действие на новом выделении
Совместная работа отменяются только свои операции (CRDT undo-manager), чужие — нет; если своя операция затронута чужой, отмена применяется к остатку
Границы сохранение не очищает историю; переключение листов/слайдов — не шаг; изменения параметров программы — не в истории документа

6.5 Клавиатура

6.6 Контекстные меню

Правила содержимого (сверху вниз): 1) действия с выделением (Вырезать/Копировать/Вставить/Параметры вставки); 2) свойства объекта («Абзац…», «Шрифт…», «Таблица ▸», «Рисунок…»); 3) создание в контексте («Комментарий», «Ссылка», «Закладка»); 4) поиск и инструменты («Искать «…»», «Перевести», «Синонимы ▸», «Assist ▸»); 5) не более 12 пунктов верхнего уровня, подменю ≤ 2 уровней; опасные действия («Удалить таблицу») — в конце, отделены разделителем, не красным. Контекстное меню никогда не единственный путь к команде. На сенсоре — вызов долгим нажатием (500 мс) с хаптикой; на пере — кнопка пера.

6.7 Ввод IME

6.8 Сенсор и перо

Параметр Значение
Режим «Сенсор» включается автоматически при касании (и выключается мышью через 5 мин) или вручную в строке состояния: высота строк ленты 44 px, пункты меню 40, зазоры ×1,5, ручки объектов 14 px, полосы прокрутки 12 px; остальные размеры неизменны
Жесты прокрутка — 1 палец; масштаб — щипок к центру жеста; поворот объекта — 2 пальца (в Draw/Slides); долгое нажатие — контекстное меню/выделение слова с «лупой» 60 px над касанием; перетаскивание выделения за ручки-капли (12 px accent)
Перо рукописный ввод в Notes/Paint/Draw/рецензирование («Рисование» вкладка во всех приложениях): давление → толщина, наклон → форма (Paint), ластик кнопкой/обратным концом; палец при пере — панорамирование (параметр); рукописный ввод текста — через системную панель (Windows Ink, macOS Scribble не поддерживается — поле ввода), распознавание формул (Math) — своё
Платформы Windows: WM_POINTER, Ink; macOS: трекпад-жесты (NSEvent magnify/rotate), Apple Pencil — нет (нет iPad); Linux: libinput, планшеты Wacom через Qt QTabletEvent

6.9 Многооконность

6.10 Режимы плотности

Режим Высота хрома над документом Что видно Переключение
Лента 36 (заголовок) + 34 (вкладки) + 92 (тело) = 162 px всё по умолчанию
Лента свёрнутая 36 + 34 = 70 px вкладки; тело — по клику как popover Ctrl+F1, двойной клик по вкладке
Компактная панель 36 + 40 = 76 px одна строка команд с меню параметры / Ctrl+Shift+F1
Фокус 0 (заголовок автоскрыт, появляется при наведении к верху на 4 px) только холст, страница по центру, строка состояния автоскрыта Ctrl+Shift+F1 / «Вид → Фокус» / F11 (полноэкранный на Win/Linux; macOS — ⌃⌘F)

Выбор запоминается на приложение; документ не меняет режим; все панели сохраняют состояние между режимами.

6.11 Тёмная тема интерфейса и «тёмная страница»

6.12 Печать и предпросмотр


7. Движение

Токен Значение Применение
duration.instant 0 мс нажатие, фокус, выделение, изменение значений полей
duration.fast 120 мс наведение, переключатели, флажки, подсветка, появление мини-панели, tooltip (появление)
duration.base 160 мс меню, popover, диалоги (появление), backstage, сворачивание ленты, вкладки
duration.slow 200 мс панели (докинг, сворачивание в полосу), toast (вход), переходы режимов плотности
duration.slower 300 мс прокрутка к результату поиска, «перелёт» к ячейке/странице, раскрытие аккордеона с большим содержимым
easing.out cubic-bezier(0, 0, 0.2, 1) появление, раскрытие (по умолчанию — ease-out из библии)
easing.in cubic-bezier(0.4, 0, 1, 1) исчезновение (длительность ×0,75)
easing.inOut cubic-bezier(0.4, 0, 0.2, 1) перемещение между позициями (панели, прокрутка)
easing.standard cubic-bezier(0.2, 0, 0, 1) крупные поверхности (backstage, полноэкранный)

Что анимируется: непрозрачность, положение (≤ 24 px сдвиг при появлении), масштаб 0,96 → 1 (диалоги/popover), высота (аккордеон, лента), цвет (120 мс). Что не анимируется: содержимое документа (каретка мигает системным интервалом, прокрутка — без инерции на колесе, с инерцией на сенсоре), размер окна, перетаскивание (следует за курсором без сглаживания), текст. Слайд-анимации Slides — часть документа, не интерфейса.

«Уменьшить движение» (Windows «Эффекты анимации», macOS «Уменьшить движение», GNOME enable-animations): все длительности → 0 (кроме прогресса и спиннера — заменяются на пульсацию), переходы — мгновенная смена; параметр «Анимация» в настройках переопределяет. Частота — 60 Гц минимум, анимации на QQuickItem через Behavior/NumberAnimation в сцене, без таймеров.


8. Доступность

8.1 Уровень и принципы

Цель — WCAG 2.2 AA для всего интерфейса (с AAA по контрасту основного текста) и EN 301 549 / ГОСТ Р 52872 для госсектора. Каждый компонент из раздела 5 имеет строки «Клавиатура» и «Доступность»; PR без них для нового компонента не принимается. Пользовательские документы — отдельно (8.6).

8.2 Экранные дикторы

ОС API Реализация
Windows UI Automation (UIA) Qt Accessibility → QAccessibleInterface для каждого QML-элемента стиля Meridian (роли, имена, состояния, valueInterface, tableInterface, textInterface для холста); проверка в Narrator, NVDA, JAWS
macOS NSAccessibility через Qt; холст документа — своё дерево NSAccessibilityElement (страницы → абзацы → прогоны), VoiceOver-ротор по заголовкам/ссылкам/таблицам
Linux AT-SPI2 (через D-Bus) Qt Accessibility (QT_LINUX_ACCESSIBILITY_ALWAYS_ON не требуется — включаем при обнаружении Orca); проверка в Orca

Холст документа — не одна картинка: ядро отдаёт дерево доступности (a11y-tree из Meridian Kernel: документ → секции → абзацы/таблицы/объекты → текст с атрибутами, позиция каретки, выделение), оболочка публикует его через QAccessibleTextInterface /QAccessibleTableInterface; обновления инкрементальные (события TextInserted/Removed, SelectionChanged, CaretMoved). Строка состояния, toast, счётчики поиска — live области. Все иконки-кнопки имеют имя; декоративные — Accessible.ignored.

8.3 Клавиатура

Все компоненты — по таблицам раздела 5; дополнительно: видимый фокус везде (2.4.7), нет ловушек (2.1.2) кроме модальных диалогов с Esc, однобуквенные сочетания отключаемы (2.1.4), порядок фокуса = визуальный порядок (слева направо, сверху вниз; RTL — зеркально), F6 между областями, Ctrl+F6 между панелями, Alt+Shift+F10 (Windows) — кнопка параметров вставки/автозамены, сенсорные альтернативы перетаскиванию (2.5.7), цель ≥ 24 px (2.5.8), помощь по доступности в одном месте «Справка → Доступность» (3.2.6).

8.4 Высокий контраст

Windows: при SPI_GETHIGHCONTRAST — тема «Высокий контраст» (2.5) с цветами из SystemColors, все изображения-иконки перекрашиваются в WindowText, фокус — Highlight 2 px, выделение — Highlight/HighlightText, тени и полупрозрачности выключены, selection.bg → Highlight сплошной; документ: страница — Window, текст — WindowText (как «тёмная страница» с системными цветами), по параметру «Цвета документа в HC: системные / документа». macOS «Увеличить контраст»: рамки → borderStrong → text2, 1 px границы у всех кнопок (включая ghost), цвета без изменений. GNOME high-contrast: собственная HC-тема (2.5). Проверка: все состояния различимы без цвета (иконки, подчёркивания, рамки) — требование для HC и для дальтонизма.

8.5 Масштаб 100–400 %

8.6 Проверка документов на доступность

Панель «Рецензирование → Доступность» (аналог Accessibility Checker): список проблем по категориям — ошибки (нет альтернативного текста у изображений, таблица без заголовков, контраст текста < 4,5:1, пустые заголовки, ссылки «здесь», порядок чтения слайдов, объединённые ячейки в таблицах данных), предупреждения (повторяющиеся пробелы, таблицы-макеты, малый кегль < 9 pt), советы. Клик — переход к объекту с подсветкой, панель свойств открывает нужное поле; «Исправить» — для автоматических (генерация alt через Assist по согласию). Статус в строке состояния: «Доступность: 2 ошибки» (кликабельно). Экспорт в PDF/UA требует «0 ошибок» или явного подтверждения. Автор видит индикатор во время работы (параметр «Проверять при вводе»).


9. Платформенные адаптации

9.1 Что одинаково, что по-платформенному

Аспект Одинаково По-платформенному
Лента, панели, строка состояния, диалоги параметров да, MDS —
Заголовок окна содержимое (имя, поиск, аватар) macOS — нативный; Win/Linux — CSD/SSD (5.1)
Строка меню нет меню на Windows/Linux (лента) macOS — обязательная нативная строка меню с полным набором команд (дублирует ленту), меню приложения, «Окно», «Справка» с поиском
Диалоги файлов — всегда нативные: IFileDialog (Windows), NSOpenPanel/NSSavePanel (macOS, с аксессуаром «Формат»), GTK/KDE портал org.freedesktop.portal.FileChooser (Linux, обязателен в Flatpak)
Печать backstage «Печать» наш системный диалог по кнопке; macOS — NSPrintPanel с нашей панелью
Шрифты список и подмены — наши источник — DirectWrite / CoreText / fontconfig; системные шрифты по ОС
Уведомления вне окна тексты/иконки Windows — toast-центр (WinRT ToastNotification), macOS — UNUserNotificationCenter, Linux — org.freedesktop.Notifications
Сочетания клавиш схема команд Ctrl ↔︎ ⌘, Alt ↔︎ ⌥, мнемоники только Win/Linux; macOS — ⌘, параметры, ⌘Q выход, ⌘W закрыть окно, ⌘H скрыть
Хранение токенов — DPAPI / Keychain / Secret Service
Темы MDS-цвета следование системной светлой/тёмной и акценту (опция); HC по ОС
Иконки приложений и файлов глифы формы и размеры (1.4)
Жесты — трекпад macOS (magnify/rotate/swipe назад), сенсор Windows, libinput Linux

9.2 macOS

9.3 Windows 11 (и 10)

9.4 Linux


10. Локализация

10.1 Языки

Волна Языки Срок
1 ru, en (en-US; en-GB — вариант орфографии) фаза 1 (Write 1.0)
2 de, fr, es, it, pt-BR, pl, tr, uk, kk, be фаза 2
3 nl, sv, da, nb, fi, cs, sk, hu, ro, bg, sr, hr, el, he, ar, fa, hi, id, vi, th, ja, ko, zh-Hans, zh-Hant фазы 3–5

Исходный язык строк — английский (ключи и контекст в коде), русский — первый перевод с тем же приоритетом (оба проверяются вручную перед релизом). Формат — Qt .ts с контекстом и комментариями для переводчиков (//: Button in Save dialog), сборка в .qm; строки документных шаблонов и справки — отдельно (Markdown + gettext). Платформа перевода — Weblate (свой экземпляр).

10.2 Правила строк

10.3 Форматы (ICU4X)

Данные Правило Примеры (ru / en-US)
Числа разделители групп и дробной части по локали; в Sheets — локаль документа (может отличаться от интерфейса) 1 254,5 / 1,254.5
Даты short в списках (03.10.2026 / 10/3/2026), medium в карточках («3 окт. 2026 г.»), относительные в недавних («20 минут назад», «вчера», ≤ 7 дней; далее дата)
Время 24/12 часов по локали и системной настройке 19:12 / 7:12 PM
Валюты currency с символом локали, ISO-код по требованию; Sheets — формат ячейки хранит код валюты, не символ 1 254,50 ₽ / $1,254.50
Единицы метрические/дюймы по локали (ru, de — см; en-US — in), переопределяется в параметрах
Сортировка ICU collation с локалью интерфейса (в списках файлов — natural sort: файл2 < файл10)
Имена файлов не локализуются; расширения показываются по параметру ОС
Первый день недели, нумерация недель по локали (ru — понедельник, ISO-недели)

10.4 RTL

Для ar, he, fa интерфейс зеркалится целиком (Qt::RightToLeft на приложении): лента (вкладки справа налево, «Файл» справа), панели (навигация справа, свойства слева), порядок кнопок диалогов (первичная слева), шевроны и стрелки навигации (иконки с флагом mirror отражаются; undo/redo, indent/outdent, align-left/right — зеркалятся; check, search, clock, медиа-play, логотипы — нет), выравнивание текста по умолчанию в документе — по направлению языка абзаца (bidi по Unicode UAX #9, явный переключатель «Направление абзаца» в ленте). Числа и коды остаются LTR внутри RTL-строк (ICU bidi). Горячие клавиши не зеркалятся. Макеты проверяются в псевдо-RTL.

10.5 Письменности и шрифты

См. 3.5: Inter для латиницы/кириллицы/греческого, Noto по письменности для остального, CJK по языку интерфейса. Высота строк интерфейса для CJK/тайского/деванагари увеличивается до 1,5 (из метрик шрифта), контролы растут. Интерфейс на японском/китайском использует системный шрифт по умолчанию (Yu Gothic UI / PingFang / Noto Sans CJK) — Inter остаётся для латиницы в смешанном тексте.

10.6 Перевод названий функций Sheets


11. Голос и тон

11.1 Правила текста интерфейса

Правило Да Нет
Глаголы в командах, инфинитив «Сохранить», «Открыть», «Удалить лист» «Сохранение», «ОК», «Да»
Второе лицо, вежливое «вы» без заглавной; обращение только там, где нужно «Выберите папку», «Файл сохранён» «Пользователь должен выбрать…», «Вы»
Коротко: ≤ 6 слов в кнопке, ≤ 2 строк в сообщении «Нет подключения. Изменения сохраняются локально.» «К сожалению, в данный момент отсутствует подключение к сети…»
Без восклицаний и эмоций «Готово», «Экспорт завершён» «Отлично!», «Ура, готово!»
Без жаргона и внутренних терминов «Открыть документ», «Таблица» «Загрузить модель», «Грид»
Конкретика вместо «что-то пошло не так» «Не удалось сохранить: нет доступа к папке «Договоры»» «Произошла ошибка»
Единые термины из словаря (11.2) «Боковая панель» «Сайдбар», «панель сбоку»
Заголовки — существительные, кнопки — глаголы, флажки — утверждения «Параметры страницы» / «Применить» / «Показывать линейку» «Применить параметры страницы?» в заголовке
Числа — цифрами, единицы с неразрывным пробелом «3 файла», «12 МБ» «три файла», «12МБ»
Не обвинять пользователя «Пароль не подошёл» «Вы ввели неверный пароль»

11.2 Словарь терминов (ru / en)

Русский English Примечание
Лента Ribbon не «риббон»
Вкладка ленты Ribbon tab
Группа команд Group
Компактная панель Compact toolbar режим плотности
Режим «Фокус» Focus mode
Панель быстрого доступа Quick Access Toolbar
Командная палитра Command palette Ctrl+K
Backstage (вкладка «Файл») Backstage не переводится
Боковая панель Sidebar не «сайдбар»
Панель навигации Navigation pane левая
Мини-панель Mini toolbar
Строка состояния Status bar
Холст Canvas область вокруг страницы/объектов
Страница Page Write/PDF/Publisher
Лист Sheet Sheets
Книга Workbook файл Sheets
Слайд / Макет слайда / Образец Slide / Layout / Master Slides
Правки (режим «Запись правок») Track changes не «отслеживание изменений»
Принять / Отклонить правку Accept / Reject
Комментарий / Ответ / Решено Comment / Reply / Resolved
Стиль (абзаца, символа, ячейки) Style
Тема документа Document theme цвета + шрифты
Шаблон Template .mwt
Поле (подстановка) Field дата, номер страницы
Сноска / Концевая сноска Footnote / Endnote
Оглавление Table of contents не «содержание»
Разрыв страницы / раздела Page break / Section break
Колонтитул (верхний/нижний) Header / Footer
Ячейка / Диапазон / Именованный диапазон Cell / Range / Named range
Формула / Функция / Аргумент Formula / Function / Argument
Сводная таблица Pivot table
Условное форматирование Conditional formatting
Проверка данных Data validation
Фильтр / Сортировка Filter / Sort
Диаграмма / Ряд / Ось / Легенда Chart / Series / Axis / Legend
Фигура / Коннектор / Узел Shape / Connector Draw
Слой Layer Paint/Draw
Выделение / Выделить Selection / Select не «выбор» для текста
Выбрать (из списка) Choose / Select в диалогах
Отменить / Повторить Undo / Redo
Вырезать / Копировать / Вставить / Специальная вставка Cut / Copy / Paste / Paste special
Сохранить / Сохранить как / Экспорт Save / Save as / Export «Экспорт» — в другой формат
Поделиться Share
Облако (Meridian Cloud) Cloud
Аккаунт (Meridian ID) Account не «учётная запись» в UI (допустимо в справке)
Лицензия / Ключ / Редакция License / Key / Edition
Активация Activation
Подписка Subscription
Скрипт Script не «макрос» (кроме импорта VBA)
Ассистент (Assist) Assistant
Параметры Settings Windows/Linux; macOS — «Настройки»
Масштаб Zoom
Тёмная страница Dark page
Высокий контраст High contrast
Печать / Предпросмотр Print / Print preview
Защищённый просмотр Protected view
Восстановление документа Document recovery

11.3 Сообщения об ошибках

Структура: что случилось (заголовок, без кода) → почему / что сделать (1–2 предложения) → действия (кнопки) → код ошибки и «Подробнее» (сворачиваемый блок, копируется).

Элемент Правило Пример
Заголовок факт, без «Ошибка:» «Не удалось открыть «Бюджет 2027.xlsx»»
Тело причина и путь решения; если причина неизвестна — честно: «Причина неизвестна» + что уже сделано («Создана резервная копия») «Файл открыт в другой программе. Закройте его и повторите попытку или откройте копию только для чтения.»
Кнопки конкретные глаголы, первичная — безопасный вариант [Открыть копию] [Повторить] [Отмена]
Код в сером тексте под сворачиваемым «Подробнее»: E-IO-0032 · codecs/ooxml
Куда диалог — если нужен выбор или потеряны данные; баннер — состояние; toast — результат; поле — ошибка ввода
Запрещено «Что-то пошло не так», «Неизвестная ошибка» без контекста, «Обратитесь к администратору» без того, что ему сказать, «Фатальная ошибка», восклицания, обвинения

Падение документа: диалог «Документ восстановлен» со списком версий (автосохранение каждые 2 с), кнопки [Открыть восстановленный] [Открыть последний сохранённый], отчёт о сбое — отдельным флажком «Отправить отчёт (без содержимого документа)».

11.4 Пустые состояния и подсказки

Формула: что здесь будет + как начать (одно действие). Тон нейтральный, без извинений («Пока нет комментариев» — не «Увы, здесь пусто»). Плейсхолдеры полей — пример значения, а не инструкция («например, Договор поставки» — не «Введите название»). Подсказки (tooltip) — имя команды + горячая клавиша, расширенные — что произойдёт («Записывать правки — все изменения будут отмечены цветом автора»).


12. Реализация в Qt

12.1 Структура

shell/
  mds/                                  ← библиотека дизайн-системы (QML-модуль org.meridian.mds)
    qmldir
    Mds.qml                             ← синглтон: токены (генерируется), тема, плотность, платформа
    MdsTheme.qml                        ← текущая палитра (light/dark/hc) как свойства, переключение на лету
    style/                              ← стиль Qt Quick Controls «Meridian» (QQC2 custom style)
      qmldir                            ← module org.meridian.mds.style
      Button.qml  CheckBox.qml  ComboBox.qml  Dialog.qml  Menu.qml  MenuItem.qml  Popup.qml
      RadioButton.qml  ScrollBar.qml  Slider.qml  SpinBox.qml  Switch.qml  TabBar.qml  TabButton.qml
      TextField.qml  TextArea.qml  ToolButton.qml  ToolTip.qml  TreeViewDelegate.qml  Frame.qml ...
    components/                         ← компоненты сверх QQC2 (раздел 5)
      Ribbon.qml  RibbonTab.qml  RibbonGroup.qml  RibbonButton.qml  RibbonGallery.qml  KeyTipOverlay.qml
      CompactBar.qml  QuickAccessBar.qml  Backstage.qml  CommandPalette.qml  MiniToolbar.qml
      SidePanel.qml  PanelDock.qml  StatusBar.qml  TitleBar.qml  Toast.qml  Banner.qml  EmptyState.qml
      ColorPicker.qml  FontPicker.qml  StyleGallery.qml  ZoomControl.qml  FindBar.qml  DatePicker.qml
      FileDropZone.qml  CoachMark.qml  FeatureLock.qml  NumberField.qml  ProgressRing.qml  Card.qml
    icons/                              ← MdsIcon.qml + QIconEngine (C++), SVG из brand/icons
    fonts/                              ← Inter, JetBrains Mono (qrc), регистрация в QFontDatabase
    cpp/                                ← MdsPlatform (DPI, тема ОС, акцент, reduce-motion), MdsPalette (QPalette)
spec/design-tokens.json                 ← источник истины
tools/tokens/build.py                   ← JSON → Mds.qml (синглтон), mds.css, MdsPalette.cpp, tokens.rs (для рендера)

12.2 Генерация токенов

tools/tokens/build.py читает spec/design-tokens.json (DTCG), разрешает ссылки {color.apps.write.700}, и пишет:

  1. shell/mds/Mds.qml — pragma Singleton, объекты color, space, radius, font, shadow, duration, easing; цветовые группы с темами — как функции theme.light/dark/hc и текущие свойства в MdsTheme;
  2. mockups/assets/mds.css (блок :root и темы — только секция токенов, компоненты остаются ручными; собирается с маркерами /* @tokens:start */ … /* @tokens:end */);
  3. shell/mds/cpp/MdsPalette.cpp — QPalette для виджетов и нативных диалогов;
  4. kernel/crates/meridian-render/src/tokens.rs — константы для рендера выделений/подсветок в документе (цвета авторов, find).

Правила генератора: ссылки {a.b.c} разрешаются до значений (в QML — до привязок на Mds.*, чтобы тема переключалась); цвета с альфой #RRGGBBAA → rgba() в CSS и Qt.rgba() в QML; dimension px → целые логические px; составные shadow → box-shadow / MultiEffect параметры; typography → font в CSS и объект {family,pixelSize,weight} в QML. Фрагмент выхода для mds.css:

/* @tokens:start — сгенерировано tools/tokens/build.py из spec/design-tokens.json, не править вручную */
:root{
  --m-ink:#0B3C5D; --m-sun:#F2A541;
  --app-hub:#0B3C5D; --app-write:#3B5BDB; --app-sheets:#1E8E5A; --app-slides:#E25C3D; --app-draw:#0E8A8A;
  --app-paint:#C2309B; --app-pdf:#C92A2A; --app-math:#495057; --app-notes:#7048E8; --app-mail:#1C7ED6;
  --app-base:#A61E4D; --app-forms:#5C940D; --app-publisher:#D6336C; --app-plan:#E67700;
  --app-write-text:#3B5BDB; --app-sheets-text:#007546; --app-slides-text:#A93315; --app-draw-text:#007071;
  --app-mail-text:#0063B1; --app-forms-text:#447100; --app-plan-text:#954B00;
  --bg:#F5F6F8; --surface:#FFFFFF; --surface-2:#EEF0F3; --border:#E1E4E8; --border-strong:#C9CED6;
  --text:#1A1D21; --text-2:#5C636E; --text-3:#8A919C; --canvas:#E9EBEF; --page:#FFFFFF;
  --ok:#2F9E44; --warn:#E8590C; --err:#C92A2A; --info:#1C7ED6;
  --sel:rgba(59,91,219,.18); --sel-border:#3B5BDB;
  --r-xs:4px; --r-s:6px; --r-m:10px; --r-l:14px; --r-pill:999px;
  --space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px; --space-6:24px;
  --h-xs:22px; --h-s:24px; --h-m:30px; --h-l:36px; --h-xl:44px;
  --font:Inter,"Segoe UI","SF Pro Text",Cantarell,Roboto,system-ui,sans-serif; --mono:"JetBrains Mono",Menlo,Consolas,monospace;
  --dur-fast:120ms; --dur-base:160ms; --dur-slow:200ms; --ease-out:cubic-bezier(0,0,.2,1);
}
:root[data-theme="dark"]{
  --app-write:#6587EC; --app-sheets:#4EA173; --app-slides:#F2876E; --app-draw:#489D9D; --app-paint:#D25AAD; --app-pdf:#DE6057;
  --app-math:#898E94; --app-notes:#8B76F5; --app-mail:#4591DF; --app-base:#CC6B81; --app-forms:#6C9F34; --app-publisher:#E1557F;
  --app-plan:#EE8E44; --app-hub:#7691A8;
  /* …нейтральные и тени тёмной темы… */
}
@media (prefers-reduced-motion: reduce){ :root{ --dur-fast:0ms; --dur-base:0ms; --dur-slow:0ms; } }
/* @tokens:end */
// shell/mds/Mds.qml — сгенерировано tools/tokens/build.py, не править / generated, do not edit
pragma Singleton
import QtQuick

QtObject {
    id: mds
    // Тема и плотность / theme & density
    property string theme: MdsPlatform.systemTheme      // "light" | "dark" | "hc"
    property string density: "ribbon"                   // "ribbon" | "compact" | "focus"
    property bool touch: MdsPlatform.touchMode
    property real scale: 1.0                            // пользовательский масштаб 1.0–4.0

    // Цвет приложения / per-app accent (set by the app shell)
    property color app: color.apps.write.accent
    property color appText: color.apps.write.accentText

    readonly property QtObject color: QtObject {
        readonly property color bg:          theme === "dark" ? "#16181D" : theme === "hc" ? "#000000" : "#F5F6F8"
        readonly property color surface:     theme === "dark" ? "#1F2228" : theme === "hc" ? "#000000" : "#FFFFFF"
        readonly property color surface2:    theme === "dark" ? "#262A31" : theme === "hc" ? "#1A1A1A" : "#EEF0F3"
        readonly property color border:      theme === "dark" ? "#2E3238" : theme === "hc" ? "#FFFFFF" : "#E1E4E8"
        readonly property color borderStrong:theme === "dark" ? "#3C4149" : theme === "hc" ? "#FFFFFF" : "#C9CED6"
        readonly property color text:        theme === "dark" ? "#E6E8EB" : theme === "hc" ? "#FFFFFF" : "#1A1D21"
        readonly property color text2:       theme === "dark" ? "#9AA1AB" : theme === "hc" ? "#FFFFFF" : "#5C636E"
        readonly property color text3:       theme === "dark" ? "#6F7680" : theme === "hc" ? "#FFFFFF" : "#8A919C"
        readonly property color selection:   theme === "dark" ? "#6080FF47" : theme === "hc" ? "#FFD400" : "#3B5BDB2E"
        readonly property QtObject apps: QtObject {
            readonly property QtObject write: QtObject {
                readonly property color accent:     theme === "dark" ? "#6587EC" : "#3B5BDB"
                readonly property color accentText: theme === "dark" ? "#88A6F8" : "#3B5BDB"
                readonly property color subtle:     theme === "dark" ? "#3B5BDB29" : "#E5EDFF"
                readonly property var scale: ["#F3F7FF","#E5EDFF","#CEDCFF","#ADC4FF","#88A6F8","#6587EC","#486AE1","#3B5BDB","#263DB2","#172692"]
            }
            // … остальные 13 приложений / other apps
        }
    }
    readonly property QtObject space: QtObject { readonly property int s1: 4; readonly property int s2: 8; readonly property int s3: 12; readonly property int s4: 16; readonly property int s6: 24 }
    readonly property QtObject radius: QtObject { readonly property int xs: 4; readonly property int s: 6; readonly property int m: 10; readonly property int l: 14; readonly property int pill: 999 }
    readonly property QtObject font: QtObject {
        readonly property string family: "Inter"
        readonly property string mono: "JetBrains Mono"
        readonly property int xs: 11; readonly property int s: 12; readonly property int m: 13; readonly property int l: 15; readonly property int xl: 18; readonly property int xxl: 24; readonly property int xxxl: 32
    }
    readonly property QtObject duration: QtObject { readonly property int fast: 120; readonly property int base: 160; readonly property int slow: 200; readonly property int slower: 300 }
    readonly property var easingOut: [0, 0, 0.2, 1]
    function ms(d) { return MdsPlatform.reduceMotion ? 0 : d }   // уважение к «уменьшить движение» / reduce motion
}

Переключение темы на лету: Mds.theme — обычное свойство, все цвета — привязки (bindings), поэтому смена перекрашивает все окна без перезапуска (как в HUB-03: «изменения применяются сразу»); MdsPlatform слушает ОС (QStyleHints::colorScheme, Windows UISettings, портал Settings) и обновляет systemTheme, если выбран режим «Как в системе». Акцент приложения — Mds.app, выставляется оболочкой приложения при старте (Mds.app = Mds.color.apps.sheets.accent).

12.3 Стиль Qt Quick Controls «Meridian»

Стиль задаётся QQuickStyle::setStyle("Meridian") (модуль org.meridian.mds.style, путь через QT_QUICK_CONTROLS_STYLE_PATH не нужен — встроен в qrc). Каждый контрол реализует contentItem и background по разделу 5; состояния через свойства QQC2 (hovered, pressed, checked, visualFocus, enabled) и единые helper-элементы MdsFocusRing, MdsStateOverlay.

// shell/mds/style/Button.qml — кнопка MDS / MDS button (secondary by default)
import QtQuick
import QtQuick.Templates as T
import org.meridian.mds

T.Button {
    id: control
    property string variant: "secondary"     // primary | secondary | ghost | danger | icon
    implicitHeight: Mds.touch ? 44 : 30
    leftPadding: variant === "icon" ? 0 : 14; rightPadding: leftPadding
    implicitWidth: Math.max(variant === "icon" ? implicitHeight : 72, implicitContentWidth + leftPadding + rightPadding)
    font.family: Mds.font.family; font.pixelSize: Mds.font.m; font.weight: Font.Medium
    hoverEnabled: !Mds.touch

    background: Rectangle {
        radius: Mds.radius.s
        color: variant === "primary" ? Mds.appText
             : variant === "danger"  ? Mds.color.err
             : variant === "secondary" ? Mds.color.surface : "transparent"
        border.width: variant === "secondary" ? 1 : 0
        border.color: control.hovered ? Mds.color.text3 : Mds.color.borderStrong
        Behavior on border.color { ColorAnimation { duration: Mds.ms(Mds.duration.fast); easing.bezierCurve: Mds.easingOut } }
        MdsStateOverlay { hovered: control.hovered; pressed: control.down; radius: parent.radius }   // state.hover / state.pressed
        MdsFocusRing { visible: control.visualFocus; radius: parent.radius + 2 }                  // 2 px accent, offset 2
    }
    contentItem: Row {
        spacing: 6
        MdsIcon { name: control.icon.name; size: 16; visible: name !== ""; color: label.color; anchors.verticalCenter: parent.verticalCenter }
        Text {
            id: label
            text: control.text; font: control.font; visible: control.text !== ""
            color: (control.variant === "primary" || control.variant === "danger") ? "#FFFFFF" : Mds.color.text
            verticalAlignment: Text.AlignVCenter; anchors.verticalCenter: parent.verticalCenter
        }
    }
    opacity: enabled ? 1 : 0.45
    Accessible.role: Accessible.Button
    Accessible.name: text !== "" ? text : ToolTip.text
}

Правила стиля: никаких литералов цветов в QML компонентов (только Mds.*); все размеры — целые логические px; Behavior только через Mds.ms(); Accessible.* обязательны; каждый компонент имеет tests/qml/tst_<Component>.qml (состояния, клавиатура) и снимок (tests/snapshots/<Component>-<theme>-<state>.png) для трёх тем.

12.4 Иконки

MdsIcon { name: "save"; size: 20 } — элемент, рисующий SVG через QIconEngine «Meridian»: загружает brand/icons/20/<name>.svg из qrc, подставляет currentColor → цвет (color свойство; по умолчанию Mds.color.text2, в активном состоянии — Mds.app), растрирует в кэш по ключу (name, size × devicePixelRatio, color, mirrored) (QPixmapCache, лимит 64 МБ); для 32-набора — brand/icons/32/; флаг mirror из icons/manifest.json для RTL. Виджетные (QIcon) потребители — тот же движок через QIcon(new MdsIconEngine(name)), состояния QIcon::Mode отображаются на цвета (Disabled → α 0,45, Selected → app).

12.5 QPalette для виджетов и нативных диалогов

Роль QPalette Светлая Тёмная Примечание
Window bg bg
WindowText, Text, ButtonText text text
Base surface surface поля ввода, списки
AlternateBase surface2 surface2
Button surface surface
Highlight #3B5BDB (selection.border) #6587EC сплошной — виджеты не умеют полупрозрачное
HighlightedText #FFFFFF #1A1D21
Link / LinkVisited app / notes app (500) / notes.400
Mid, Dark borderStrong, text3 рамки/разделители
PlaceholderText text3 text3
ToolTipBase / ToolTipText surface / text
Disabled группа те же цвета с α 0,45

Нативные диалоги (QFileDialog с DontUseNativeDialog=false) палитрой не управляются — тема берётся из ОС.

12.6 Шрифты и HiDPI

12.7 Кэширование и производительность


13. Вопросы к библии и макетам

№ Где Противоречие / пробел Предложение
В-1 Библия 5.2 ↔︎ mds.css .input.focus Библия: фокус — кольцо 2 px цвета приложения с отступом 2 px. CSS: рамка --app + box-shadow 0 0 0 3px var(--sel) (3 px полупрозрачного indigo, без отступа) принять в MDS два варианта: для полей ввода — вариант CSS (рамка + мягкое кольцо, всегда), для остальных элементов — кольцо 2 px с отступом 2 px только при focus-visible (раздел 5.0). Добавить в CSS класс .focus-ring
В-2 Библия 5.2 ↔︎ mds.css тёмная тема Библия: в тёмной теме цвета приложений «на 1 ступень светлее». CSS: --app-* в тёмной теме не переопределяются добавить в mds.css блок тёмной темы со ступенью 500 (Slides/Plan — 400) из таблицы 2.3; «на ступень светлее» для Hub (900 → 800 = #2B5271) даёт контраст 1,9:1 — потому единое правило «500»
В-3 Библия 5.3 «лента 92 px» ↔︎ mds.css 92 px — тело ленты; с полосой вкладок 34 px лента занимает 126 px. Компактный режим: .ribbon.compact .ribbon-body 40 px + вкладки 34 = 74 px, при этом есть отдельный .compactbar 40 px уточнить в библии: «тело ленты 92 px + вкладки 34 px»; «компактная панель 40 px без вкладок» (.compactbar); .ribbon.compact — промежуточный вид (одна строка команд под вкладками) либо удалить
В-4 mds.css --text-3 / .hint #8A919C на белом — 3,18:1, на --bg — 2,94:1; тёмный #6F7680 на поверхности — 3,47:1. .hint (11 px) и .notes используют его как читаемый текст — ниже AA 4,5:1 .hint и любой читаемый текст → --text-2; --text-3 оставить только декоративным. Либо поднять --text-3 до #6F7680 (светлая, 4,59:1 на белом) и #8A919C (тёмная, 5,02:1) — тогда текущие значения просто меняются местами по темам
В-5 mds.css --sel Цвет выделения rgba(59,91,219,.18) — indigo (Write) во всех приложениях; в Sheets/Slides выделение не совпадает с цветом приложения решение MDS (2.6): выделение — единое indigo во всех приложениях (узнаваемость, отсутствие конфликта с семантикой), акцент — цвет приложения. Зафиксировать в библии
В-6 Библия 5.2 ↔︎ mds.css тени Библия тени не описывает; CSS — 2 уровня (--shadow, --shadow-lg) принять 5 уровней (4.4); в CSS --shadow = --shadow-2, --shadow-lg = --shadow-4, добавить --shadow-1/3/5
В-7 mds.css радиусы Используются 4 px (kbd, .tb, .tree .ti, .rsmall .sb), 5 px (.fico), 8 px (карточки Hub), 999 px — вне шкалы 6/10/14 добавить токены --r-xs: 4px и --r-pill: 999px; 5 px → 4, 8 px → 6 (или 10 для 36 px плашек)
В-8 mds.css высоты Кнопки/поля 30 px, переключатель 34 × 20 — не кратны сетке 4 px (библия: 4 px) оставить 30 (совпадает с Office/Fluent, уже в макетах) и зафиксировать в библии исключение; либо перейти на 32 — требует правки всех макетов. Переключатель — 36 × 20
В-9 Библия 5.1 ↔︎ hub.html Значки приложений в макетах — буквы («W», «S», «PDF»), библия: глиф, не буква заменить плашки .fico/.appicon на глифы из 1.4 (символы ico-app-* из спрайта); в макете PDF-плашка с текстом «PDF» не влезает в 22 px
В-10 hub.html Иконки — эмодзи и Unicode-символы (🔍, ☁, ⚙, ★): разный вид по ОС, цвет не управляется использовать mockups/assets/icons.svg (<svg><use href="assets/icons.svg#ico-search"/></svg>)
В-11 mds.css семантика ↔︎ приложения --err = --app-pdf (#C92A2A), --info = --app-mail (#1C7ED6): в PDF кнопки primary и danger неразличимы, в Mail — акцент и информационный баннер для PDF — accentText = pdf.700 (#B5181D), danger остаётся #C92A2A; либо сдвинуть --err к err.700. Для Mail достаточно иконки у баннера. Решение владельца: менять ли цвет PDF
В-12 Библия 5.2 иконки «активное состояние — залитая версия» для всех иконок удваивает набор залитые версии только для иконок статуса/переключателей (помечены «З» в 4.5); кнопки-переключатели форматирования (Ж/К/Ч) показывают активность фоном --sel, как в mds.css
В-13 Библия 5.2 типографика Размеры 11/12/13/15/18/24; в Hub и онбординге нужен 32 px (приветствие, «Добро пожаловать» 22 px в HUB-04) добавить 32 px (display); 22 px в HUB-04 → 24
В-14 hub.html HUB-03 Карточка темы «Высокий контраст» — чёрный фон с жёлтой рамкой #FFD400; этот цвет нигде не токен принять hc.accent = #FFD400 (2.5), добавить в mds.css блок [data-theme="hc"]
В-15 Библия 5.2 шрифты документов Carlito 11 pt по умолчанию; mds.css .page-sheet — 14,6 px (= 11 pt при 96 dpi) и line-height 1.35; Office по умолчанию — 1,08 + 8 pt после абзаца зафиксировать в шаблоне «Обычный»: Carlito 11 pt, межстрочный 1,15, интервал после 8 pt (как Word 2013+), в макете поправить
В-16 Библия 5.3 Высота заголовка окна не задана (CSS — 36 px); минимальный размер окна не задан 36 px CSD (5.1); минимум окна 960 × 600 (4.1)