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 Словесный знак
- Написание: Meridian Office — только латиницей, два слова, с заглавных. Кириллица «Меридиан Офис» — лишь в тексте, никогда в знаке.
- Шрифт: Inter SemiBold (600), трекинг −1 %
(
letter-spacing: -0.01em), без капители, без курсива. - Названия приложений: «Meridian» — Inter Medium (500) цвета
ink, имя приложения — Inter SemiBold (600) цвета приложения: Meridian Write. В тексте интерфейса (заголовок окна, меню) — обычный текст без цветов. - Горизонтальная композиция: логотип слева, зазор = 0,5 высоты заглавной буквы, высота заглавной буквы = 0,5 диаметра кольца. Базовая линия текста — на экваторе логотипа.
- Вертикальная композиция: логотип над текстом, зазор = 1 m (при 64 — 4 px, при 128 — 8 px), выключка по центру.
- Запрещены: написание «MeridianOffice», «Meridian office», «MERIDIAN», переносы между словами, замена шрифта.
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 | color.apps.pdf |
#C92A2A |
лист с загнутым углом и двумя строками | |
| 7 | Math | color.apps.math |
#495057 |
знак суммы ∑ |
| 8 | Notes | color.apps.notes |
#7048E8 |
закладка |
| 9 | 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 Принципы
- Цвета задаются токенами-ролями
(
color.text.primary,color.apps.write), а не значениями; в коде и макетах литералы запрещены (единственное исключение — палитра документа, которая принадлежит документу, а не интерфейсу). - Три темы интерфейса — светлая, тёмная, высококонтрастная — переключаются подменой набора нейтральных и акцентных значений при тех же именах ролей. Тема документа («тёмная страница») — отдельный переключатель (см. 6.11).
- Акцент = цвет приложения (
--appв CSS,Mds.appв QML): фокус, активные вкладки, первичные кнопки, переключатели. В Hub и общих диалогах —ink. Пользователь может выбрать «Цвет системы» или «Нейтральный» (тогда акцент —ink). - Шкалы 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 отсекается уменьшением хромы. Базовый цвет библии занимает ближайшую по светлоте ступень без изменения значения.
- Тёмная тема берёт акценты светлее: ступень
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 Кириллица и письменности
- Интерфейс: Inter покрывает латиницу (расширенную), кириллицу
(включая расширенную — казахский, сербский, башкирский), греческий.
Остальное — через резерв по письменности (Qt
QFont::setFamiliesсо списком:Inter, Noto Sans <Script>, <system>). - Документы: цепочка резерва строится по Unicode-скрипту каждого
прогона (
unicode-script): латиница/кириллица → запрошенный шрифт; арабский → Noto Naskh Arabic (текст) / Noto Sans Arabic (UI); иврит → Noto Sans Hebrew; деванагари → Noto Sans Devanagari; CJK — по языку документа илиlangпрогона (SC/TC/JP/KR), по умолчанию — по локали ОС; эмодзи → Noto Color Emoji; математика → STIX Two Math. - Кириллические особенности: болгарская и сербская формы — через
loclприlang=bg/sr; буква «ё» никогда не заменяется на «е» автозаменой; кавычки по умолчанию «ёлочки» для ru и „лапки“ для вложенных; типографские правила (неразрывный пробел после коротких предлогов, тире «—» с пробелами) — в Lingo, не в шрифте. - Локализованный интерфейс допускает длину строки +30 % (de, fi, ru против en), кегль не уменьшается; при нехватке места текст кнопки переносится на 2 строки только в ribbon-больших кнопках (это их норма), в остальных — усекается с «…» и полным текстом в подсказке.
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 Буфер обмена и специальная вставка
- Копирование кладёт все представления: свой XML-фрагмент,
text/html(с инлайн-стилями, совместимый с Office),text/rtf,text/plain,image/png(для объектов и диапазонов),text/csv(диапазоны). Большие (> 10 МБ) — отложенное предоставление (delayed rendering) на Windows/macOS. - Вставка
Ctrl+V— по параметру «Вставка по умолчанию»: Сохранить исходное форматирование / Объединить форматирование (по умолчанию для текста из других программ) / Только текст. После вставки — кнопка «Параметры вставки» (Ctrl) у конца вставленного: чип 24 px с иконкой, раскрывается в ряд из 3–5 иконок с подсказками и живым предпросмотром; исчезает при следующем действии. - Специальная вставка
Ctrl+Alt+V— диалог S: список форматов из буфера с описанием («Таблица Meridian», «HTML», «Текст», «Рисунок (PNG)», «Связать»), предпросмотр; в Sheets — матрица «Что вставить» (всё/формулы/значения/форматы/ширины) × «Операция» × «Транспонировать» × «Пропускать пустые». - Буфер пакета (история): до 24 последних элементов
(
Ctrl+Shift+V— панель с миниатюрами, закрепление, очистка); хранится в брокере Hub, не переживает выход, если не закреплён; чувствительные данные (пароли из полей) не попадают. - Вырезание объектов — объект исчезает сразу; текст — помечается
полупрозрачным до завершения в Sheets («марширующая» пунктирная рамка 1
px для диапазона,
Escснимает).
6.4 Отмена и повтор
| Правило | Значение |
|---|---|
| Глубина | не ограничена в рамках сеанса (журнал операций, память ~ 1 % документа на шаг; при превышении 200 МБ — сброс самых старых с предупреждением в журнале) |
| Группировка | ввод текста — по словам (пауза 1 с или пробел завершает группу);
форматирование из диалога — один шаг; перетаскивание — один шаг;
автозамена — отдельный шаг (первый Ctrl+Z отменяет
автозамену, второй — ввод) |
| История | кнопка Отменить ▾ показывает список до 20 шагов с
описаниями («Ввод «Договор»», «Полужирный», «Вставка таблицы 3 × 4»);
выбор — откат до шага включительно; панель «История версий» — снимки по
времени (автосохранение) с восстановлением как новой версии |
| Повтор | Ctrl+Y/Ctrl+Shift+Z — повтор отменённого;
F4 (Office) — повторить последнее действие на новом
выделении |
| Совместная работа | отменяются только свои операции (CRDT undo-manager), чужие — нет; если своя операция затронута чужой, отмена применяется к остатку |
| Границы | сохранение не очищает историю; переключение листов/слайдов — не шаг; изменения параметров программы — не в истории документа |
6.5 Клавиатура
- Модель фокуса. Один фокусный элемент на окно;
области по
F6/Shift+F6(заголовок → лента/компактная панель → холст → боковые панели слева направо → строка состояния → область уведомлений);Tab— внутри области;Escвсегда ведёт «назад»: закрыть popover → свернуть ленту-popover → вернуть фокус в документ. Фокус-кольцо показывается только после клавиатурного ввода (:focus-visible; в Qt —Qt::TabFocusReason/BacktabFocusReason). - KeyTips.
AltилиF10показывает над вкладками ленты и панелью быстрого доступа чипы 18 px (surface, рамка 1 px, радиус 4, Inter 11 600) с буквами: ФайлФ/F, ГлавнаяЯ/H, ВставкаС/N, МакетМ/P, СсылкиК/S, РецензированиеР/R, ВидВ/W, СкриптыТ/Y; затем — буквы команд внутри вкладки (1–2 символа, назначаются детерминированно изribbon.json, пользовательские — в настройке ленты). Раскладка: KeyTips принимают и русскую, и латинскую букву одной клавиши (сопоставление по скан-коду).Esc— на уровень вверх,Altповторно — выход. - Схемы горячих клавиш. «Microsoft Office» (по
умолчанию:
Ctrl+B/I/U,Ctrl+E/L/R/J,Ctrl+Shift+>/<размер,F7орфография,F12сохранить как,Shift+F3регистр,Ctrl+Alt+Mкомментарий), «LibreOffice», «Meridian» (своя: без конфликтов с системой,Ctrl+Kпалитра) — переключаются в параметрах; на macOSCtrl→⌘, аAlt-мнемоники заменяются палитрой и меню «Справка → Поиск». Любое сочетание переназначается в «Параметры → Горячие клавиши» (поиск по команде, конфликты подсвечиваютсяwarn, экспортkeys.json). - Правила. Все команды доступны с клавиатуры (ленту
можно обойти целиком с
Alt); однобуквенные клавиши без модификатора — только в режимах инструментов (Paint/Draw:Vвыделение,Bкисть,Eластик — как в графических редакторах) и отключаются в текстовых полях;Enterв таблицах — переход вниз (параметр),Tab— вправо/новая строка в конце; сочетания показываются в подсказках и меню в нотации ОС (Ctrl+S/⌘S).
6.6 Контекстные меню
Правила содержимого (сверху вниз): 1) действия с выделением (Вырезать/Копировать/Вставить/Параметры вставки); 2) свойства объекта («Абзац…», «Шрифт…», «Таблица ▸», «Рисунок…»); 3) создание в контексте («Комментарий», «Ссылка», «Закладка»); 4) поиск и инструменты («Искать «…»», «Перевести», «Синонимы ▸», «Assist ▸»); 5) не более 12 пунктов верхнего уровня, подменю ≤ 2 уровней; опасные действия («Удалить таблицу») — в конце, отделены разделителем, не красным. Контекстное меню никогда не единственный путь к команде. На сенсоре — вызов долгим нажатием (500 мс) с хаптикой; на пере — кнопка пера.
6.7 Ввод IME
- Composition-текст (хангыль, пиньинь, кана, также диакритика через
dead keys) рисуется в документе на месте каретки подчёркиванием 1 px
text(Windows/macOS) или по стилю системы; кандидаты — системное окно IME, позиционируемое поQInputMethod::cursorRectangle(окно у каретки, ниже строки, учитывает масштаб и прокрутку холста). - Поддерживаемые атрибуты:
TextFormat(подчёркивание сегментов, выбранный сегмент —selection.bg),Cursor,Selection. В Sheets ввод IME открывает редактор ячейки сразу; в полях ленты — стандартный Qt. Escво время композиции — отменяет композицию, не закрывает диалог. Горячие клавиши блокируются до завершения композиции.- Проверка: тесты с MS-IME (яп.), Microsoft Pinyin, macOS
Pinyin/Hiragana, ibus/fcitx5 (Linux, X11 и Wayland
text-input-v3), переключение раскладки RU/EN (Alt+Shift/Ctrl+Space) не ломает KeyTips.
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); Hub — отдельное окно; «Окно → Новое окно» открывает второе представление того же документа (общая модель, своя прокрутка/масштаб/выделение), заголовок «Договор.mwx:2».
- Окна одного приложения показываются в «Окно → список» и в
переключателе задач ОС по отдельности; на macOS — стандартное меню
«Окно» с «Собрать все в одном окне» (вкладки документов — системные
NSWindowtabbing, параметр). - Положение/размер/монитор/масштаб запоминаются на документ (settings.xml, не синхронизируются) и на приложение для новых; окно, открытое на отсутствующем мониторе, переносится на основной.
- Диалоги привязаны к своему окну; палитры (Стили, Поиск) — к окну; панель «Буфер» и «Центр задач» — к Hub (общие).
- Перетаскивание вкладки листа/слайда в другое окно того же приложения — перенос/копия (как в браузерах).
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 Тёмная тема интерфейса и «тёмная страница»
- Тема интерфейса (светлая/тёмная/как в системе/HC)
красит хром: ленту, панели, диалоги, холст вокруг страницы
(
canvas), но не страницу документа: страница остаётся белой (#FFFFFF) с цветами документа — то, что пойдёт на печать. - Тёмная страница — отдельный переключатель «Вид →
Тёмная страница» (
Ctrl+Shift+D): страница рисуется наpageтемы (#24272D), текст документа инвертируется по правилу: цвета с яркостью L < 0,3 →#E6E8EB, L > 0,85 →#24272D, остальные — без изменения; картинки без инверсии; фон страницы из документа (если задан) — без изменения (режим не применяется, показывается подсказка). Это только представление: печать, PDF и сохранение не меняются. - Sheets в тёмной странице: сетка
#2E3238, ячейки#24272D, заливки ячеек — как есть; условное форматирование — как есть. - Slides: слайды не инвертируются никогда (это и есть продукт); тёмная тема — только хром; «тёмная страница» недоступна.
- В «Параметрах → Внешний вид» — предпросмотр обоих переключателей на одной картинке.
6.12 Печать и предпросмотр
Ctrl+P→ backstage «Печать»: слева параметры (принтер — системный список с иконкой состояния, копии, страницы, двусторонняя, ориентация, размер бумаги, поля, масштаб «по ширине», разбор по копиям), справа — предпросмотр (страницы в масштабе, навигация ‹ 3 / 12 ›, масштаб предпросмотра), кнопка «Печать» первичная сверху; «Системный диалог…» — нативный (macOS всегда черезNSPrintPanelс нашей панелью аксессуаров).- Предпросмотр использует тот же список отображения, что и печать (Meridian Render), поэтому WYSIWYG; непечатаемые элементы (комментарии, правки — по параметру «Печатать пометки», сетка, границы полей) исключаются.
- Быстрая печать (панель быстрого доступа) — на принтер по умолчанию без диалога, с toast «Отправлено на печать — Отменить».
- Экспорт в PDF — тот же экран с переключателем «PDF»: PDF/A-2b, PDF/UA (структурные теги из модели документа), закладки из заголовков, шрифты встраиваются подмножеством (кроме запрещённых лицензией — предупреждение).
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 %
- Интерфейс масштабируется от DPI ОС (Windows per-monitor v2, macOS
backing scale, Wayland
fractional-scale-v1, X11Xft.dpi) и параметром «Масштаб интерфейса» 100–400 % с шагом 25 (отдельно от масштаба документа). - Раскладка — относительная (anchors/Layouts), без фиксированных ширин, кроме минимумов; при 200 %+ и окне < 1280 px лента сворачивает группы, панели переходят в overlay; при 400 % — компактная панель принудительно; текст не усекается, а переносится.
- Текст интерфейса масштабируется с системным «Размер текста» (Windows) — отдельно от DPI (до 225 %), размеры контролов растут по высоте строки (1.4.4, 1.4.12).
- Все растры заменены SVG; растровые превью (шаблоны, миниатюры) — рендер по требованию в нужном масштабе.
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
- Нативная строка меню: Meridian Write (О программе, Настройки
⌘,, Службы, Скрыть, Завершить), Файл, Правка, Вид, Вставка, Формат, Инструменты, Окно, Справка (с полем поиска, которое ищет по меню и по палитре). Пункты с горячими клавишами в нотации ⌘⌥⇧⌃. Лента остаётся (как в Office для Mac); опция «Только строка меню + компактная панель». - Заголовок:
NSWindowс прозрачным заголовком иfullSizeContentView; светофоры слева, наш контент отступает 78 px; на унифицированной панели (52 px) — поиск и аватар; значок документа-прокси (proxy icon) с перетаскиванием и⌘-клик по имени — путь файла; имя документа редактируется по клику (Sonoma+ поведение). - Полноэкранный режим — системный (
⌃⌘F, зелёная кнопка), лента автоскрывается вместе со строкой меню; Split View поддерживается (минимум 600 px ширины). - Параметры — окно «Настройки» с тулбаром-вкладками (не backstage),
⌘,; «О программе» — стандартное. - Прокрутка — инерционная с резинкой у краёв холста; полосы —
системные overlay;
⌘-клик — множественный выбор; трекпад поворот/масштаб; Force Touch — не используется. - Touch Bar — не поддерживается (устройств больше нет);
Handoff/Continuity — не цель; Quick Look-плагин для
.mwx/.msx/.mpx(превью изthumbnail.png+ рендер первой страницы) — да; Spotlight-импортёр метаданных (meta.xml) — да. - Sandbox App Store не цель 1.0 (DMG + нотаризация); security-scoped bookmarks для недавних файлов всё равно используются.
9.3 Windows 11 (и 10)
- CSD-заголовок с кнопками системного вида
(свернуть/развернуть/закрыть 46 × 32, hover
state.hover, закрыть —#C42B1Cпри наведении), snap layouts при наведении на «развернуть» (WM_NCHITTEST→HTMAXBUTTON), перетаскивание иWin+стрелки; скругление окна — системное (DWMWA_WINDOW_CORNER_PREFERENCE), тень — DWM. - Mica (Windows 11) — по опции «Прозрачность системы» для фона окна
Hub и заголовка (
DWMWA_SYSTEMBACKDROP_TYPE), при выключенной прозрачности в системе — сплошнойbg; Acrylic — для всплывающих меню/палитры по той же опции. По умолчанию выключено (производительность, читаемость). - Jump list в панели задач: «Недавние» (до 10), «Задачи» (Новый
документ, Открыть Hub); значок прогресса на кнопке таскбара
(
ITaskbarList3::SetProgressValue) для экспорта/печати; оверлей-значок при ошибке синхронизации; миниатюры окон — системные. - Ассоциации файлов — через MSIX-манифест
(
FileTypeAssociation) и «Приложения по умолчанию»; превью в проводнике —IThumbnailProviderизthumbnail.png; свойства —IPropertyStore(автор, заголовок, страницы). - Акцент системы (опция):
UISettings.GetColorValue(Accent)→accentпри выборе «Цвет системы» в параметрах; тёмная тема —Apps mode. - Windows 10: без Mica/snap layouts, скругления отключены, остальное идентично; минимальная версия 1809.
9.4 Linux
- Среды: GNOME (HIG: CSD-заголовок приемлем, кнопки окна по
org.gnome.desktop.wm.preferences button-layout), KDE Plasma (SSD по умолчанию, при CSD —KDecorationцвета), прочие (XFCE, Cinnamon — SSD). Определение поXDG_CURRENT_DESKTOP; переключение CSD/SSD — в параметрах, по умолчанию: GNOME → CSD, иначе → SSD. - Wayland — основной (
xdg-decorationдля SSD,fractional-scale-v1,text-input-v3,xdg-activationдля фокуса окон из Hub); X11 — полный паритет кроме дробного масштаба (целочисленный + масштаб текста). - Темы системы: следуем светлой/тёмной через портал
org.freedesktop.portal.Settings(color-scheme); акцент —accent-color(GNOME 47+/KDE) по опции; GTK/Qt-темы (Breeze, Adwaita) не применяются к MDS-контролам (стиль свой), только к нативным диалогам. - Flatpak (основной канал): порталы для файлов
(
FileChooser), печати (Print), пипетки (Screenshot.PickColor), уведомлений, автозапуска Hub-брокера (Background), шрифтов хоста через--filesystem=xdg-data/fonts:roиfontconfig;app-id=org.meridian.Office, приложения — какorg.meridian.Writeи т. д. в одном пакете с несколькими.desktop. - Иконки hicolor + symbolic (1.4); MIME-типы в
share/mime/packages/org.meridian.Office.xml; миниатюры —thumbnailerдля.mwxи др. (org.meridian.Office.thumbnailer); AppStreammetainfo.xmlс скриншотами в светлой и тёмной теме. - Клавиатура:
Superне используется;Ctrl+Alt+…избегаем (конфликты с переключением рабочих столов); compose-клавиша иCtrl+Shift+U— поддерживаются как у GTK.
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 Правила строк
- Не склеивать строки из частей; плейсхолдеры именованные:
%{count},%{name}(черезQString::argс индексами, порядок меняется переводом). - Формы множественного числа — ICU
plural(one/few/many/otherдля ru: «1 файл, 2 файла, 5 файлов»);Qt::tr(..., n)используется только для простых случаев. - Род и падежи: не подставлять имена в середину фразы, где нужен падеж («Удалить «%{name}»?» — именительный в кавычках); для имени документа — всегда в кавычках «ёлочках».
- Длина: макеты проверяются псевдолокализацией (+30 % длины,
диакритика:
[Šåvé ţhé fíłé…]), немецкие и финские строки — эталон максимума; подписи ribbon-больших кнопок — 2 строки по 11 px до 64 px ширины; при нехватке — сокращение из.ts(//~ short). - Заглавные: предложения с заглавной первой буквы, остальное строчными («Сохранить как», не «Сохранить Как»); английский — sentence case (не Title Case), кроме названий продуктов.
- Знаки: русская типографика в интерфейсе — «ёлочки», тире «—» с
пробелами, многоточие «…» (один символ), неразрывный пробел перед
единицами (
12 МБ,100 %). - Клавиши: названия в нотации ОС (
Ctrl,Shift,Alt; macOS — символы), названия клавиш не переводятся кроме «Пробел», «Ввод», «Стрелка вверх» в тексте подсказок.
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
- Хранение — всегда английские канонические имена
(
SUM,VLOOKUP,XLOOKUP) с разделителем аргументов,и десятичной точкой (как в OOXML); отображение — по локали функций документа (параметр: «как интерфейс» / «английские»). - Русская локаль: имена как в Excel (
СУММ,ВПР,ПРОСМОТРX,ЕСЛИ,СЦЕПИТЬ,ТЕКСТ), разделитель аргументов;, десятичная запятая; таблица соответствия —spec/sheets-functions-ru.json(500+ функций), источник — официальный список Excel; функции без принятого перевода — английские. - Автодополнение принимает оба имени (
SUMиСУММ), показывает локализованное; подсказка сигнатуры — локализованная с английским именем в скобках; ошибка#ИМЯ?↔︎#NAME?— локализуется, как в Excel; при вставке формулы из другой локали — автоопределение по разделителям с подтверждением. - Имена листов, именованные диапазоны, структурированные ссылки
(
Таблица1[Сумма]) — не переводятся.
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}, и пишет:
shell/mds/Mds.qml—pragma Singleton, объектыcolor,space,radius,font,shadow,duration,easing; цветовые группы с темами — как функцииtheme.light/dark/hcи текущие свойства вMdsTheme;mockups/assets/mds.css(блок:rootи темы — только секция токенов, компоненты остаются ручными; собирается с маркерами/* @tokens:start */ … /* @tokens:end */);shell/mds/cpp/MdsPalette.cpp—QPaletteдля виджетов и нативных диалогов;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
- Шрифты в qrc (
:/fonts/Inter[opsz,wght].ttf,:/fonts/JetBrainsMono[wght].ttf), регистрацияQFontDatabase::addApplicationFontпри старте до создания окон;QGuiApplication::setFont(QFont("Inter", 13 px))— черезsetPixelSize(13); хинтингQFont::PreferNoHintingна macOS/Wayland,PreferVerticalHintingна Windows при масштабе < 150 %; сглаживание — субпиксельное на Windows (ClearType), серое на macOS. Qt::AA_EnableHighDpiScalingпо умолчанию в Qt 6; политика округленияQGuiApplication::setHighDpiScaleFactorRoundingPolicy(PassThrough)— дробные масштабы честно (125 %, 150 %); линии 1 px выравниваются (MdsLineэлемент сMath.round(x * dpr) / dpr); иконки растрируются под реальныйdevicePixelRatioокна (перерастрирование при переносе на другой монитор).- Холст документа: текстура Skia в
QQuickItemчерез QRhi, рендер в физических пикселях с учётом dpr; масштаб документа и масштаб интерфейса не смешиваются (документ знает только свой zoom × dpr).
12.7 Кэширование и производительность
- Кэш иконок (
QPixmapCache, 64 МБ), кэш шрифтовых глифов — у Qt; кэш превью шаблонов/недавних — на диске (~/.cache/meridian/thumbs, WebP 2 × размер карточки, инвалидация по mtime). - Лента создаёт содержимое вкладок лениво (
Loaderна вкладку, активная + соседние), галереи —ListViewсcacheBuffer; меню — по открытию; боковые панели — при первом показе. - Цель: холодный старт Write < 1,5 с до интерактивного окна (SSD), переключение темы < 100 мс на 3 открытых окнах, 60 FPS прокрутки документа на интегрированной графике, память оболочки < 150 МБ на окно.
- Профилирование:
QML Profiler,Tracy(ядро), бюджет на компонент — ≤ 1 мс создания; «тяжёлые» диалоги (Параметры) — предсоздание в фоне после старта.
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) |