Живая оболочка MOffice Write (Qt 6.8, прототип фазы 0)
Снимки настоящего окна
shell/(Qt 6.8.3, macOS, сборка 2026-10-04) — не макеты. Страницы рисует настоящее ядро (рендер A6,meridian-ffi): открыты реальные docx из корпуса — GovDocs1, общественное достояние (docs/shell/samples/). Задача B3 сессии «Платформа», веха M0.5. Сборки с Qt никому не распространяются до покупки коммерческой лицензии Qt (решение владельца № 36); используются только модули из LGPL-набора (Core, Gui, Qml, Quick, Quick Controls, Quick Dialogs, Svg), модули только под GPL не подключены.
Что на снимках
Каркас окна — по библии §5.3 и дизайн-системе §5: полоса заголовка 36
px с вкладками документов (P0), командной палитрой по центру и аватаром;
лента 34 + 92 px; холст с линейкой и страницами из ядра; боковые панели
«Навигация» (240 px) и «Стили» (300 px); строка состояния 24 px с
режимами просмотра и масштабом. Все цвета, размеры, радиусы и шрифты
берутся из spec/design-tokens.json через сгенерированный
синглтон Mds.qml — в QML нет литералов цветов
дизайн-системы. Тема переключается на лету (Вид → Тема интерфейса, Файл
→ Параметры или палитра).
Светлая тема, 1440 × 900 — реальный docx (7 страниц)

Тёмная тема — docx с табуляциями и заполнителями

Новый документ — пустая страница A4 из ядра

Командная
палитра Ctrl+Shift+P / ⌘⇧P (псевдоним
Alt+Q)
Нечёткий поиск по командам ленты с путём «Вкладка › Группа» и
сочетанием; Ctrl+K остаётся гиперссылкой (решение 1).

Backstage (вкладка «Файл»), тёмная тема

Узкое окно 1024 × 700: адаптивная лента
Группы ленты сворачиваются в кнопку с меню по возрастанию приоритета (справа налево при равенстве), галерея стилей — эластичная (показывает столько карточек, сколько помещается), боковые панели скрываются на ширине меньше 1180/1280 px. Вкладки документов сжимаются как в браузере: активная держит имя, остальные — до точки с крестиком.

Что работает
| Область | Состояние |
|---|---|
| Вкладки документов | новые (Ctrl+N, «+»), закрытие (Ctrl+W,
средняя кнопка), переключение (Ctrl+Tab); точка —
несохранённые изменения |
| Лента | 8 вкладок (Главная по макету WR-01, Вставка, Дизайн, Макет, Ссылки,
Рецензирование, Вид, Скрипты); сворачивание Ctrl+F1,
двойной щелчок по вкладке, «подсмотреть» поверх документа; адаптивность
групп; лаунчеры диалогов |
| Холст | страницы из ядра через QQuickAsyncImageProvider в пуле
потоков, рендер под реальный devicePixelRatio; масштаб
25–500 % (строка состояния, Ctrl+колесо,
Ctrl+=/Ctrl+-/Ctrl+0); линейка в
сантиметрах; прокрутка по обеим осям |
| Панели | «Навигация» (заголовки, миниатюры страниц, поиск), «Стили»; скрытие и показ из «Вида» и палитры |
| Backstage | «Создать» (шаблоны), «Открыть» (системный диалог файлов), «Сведения», «Параметры» (4 темы: светлая, тёмная, высокий контраст, как в системе), «Аккаунт» |
| Платформа | macOS — прозрачный нативный заголовок, контент на всю высоту окна, перетаскивание окна за полосу заголовка; Windows/Linux — пока системная рамка (своя полоса CSD — следующий шаг) |
| Доступность | роли и имена Accessible у кнопок, вкладок, панелей,
ленты, строки состояния; qmllint без предупреждений |
Правка текста ещё не работает: модель документа и операции появятся в фазе 1.
Связь с ядром (B4)
С 2026-10-04 холст рисует страницы настоящим ядром:
контракт FFI v0.2 сессии A
(kernel/crates/meridian-ffi/include/meridian.h —
meridian_doc_open, meridian_doc_new,
meridian_doc_page_count,
meridian_doc_page_size в EMU,
meridian_doc_render_page в буфер RGBA8888 premultiplied под
реальный devicePixelRatio,
meridian_last_error). Ядро линкуется статически
(meridian-ffi — staticlib, шрифты Liberation и Carlito
вшиты), рендер идёт в пуле потоков
QQuickAsyncImageProvider. Пока открывается docx (MOP — с
кодеком MOP сессии A). Точность раскладки — отчёт A5:
tests/corpus/stats/render-compare.md.
Заглушка meridian_render_stub.cpp оставлена для отладки
интерфейса без ядра: -DMERIDIAN_KERNEL_STUB=ON (тогда
строка состояния подписана «рендер: заглушка»). Вкладка «Заголовки»
панели навигации пока перечисляет страницы: оглавления в FFI v0.2 нет
(запрос во «Входящих» A).
Как собрать и запустить локально
python3 -m venv ~/Qt/.aqt-venv && ~/Qt/.aqt-venv/bin/pip install aqtinstall~/Qt/.aqt-venv/bin/aqt install-qt mac desktop 6.8.3 clang_64 --outputdir ~/Qtjust build-shellshell/build/meridian-shell.app/Contents/MacOS/meridian-shell --theme dark docs/shell/samples/420596.docxСнимки этой страницы пересоздаются командой
just shell-shots (параметры --screenshot,
--theme, --size, --scene).
Особенность macOS SDK 27: в нём нет AGL.framework, который
требует CMake-конфиг Qt 6.8.3; shell/CMakeLists.txt заранее
объявляет цель WrapOpenGL::WrapOpenGL без AGL.
Устройство
| Путь | Что внутри |
|---|---|
scripts/gen_shell_assets.py |
генератор: spec/design-tokens.json →
shell/mds/Mds.qml + shell/mds/tokens/*.qml
(типизированные группы токенов), спрайт
mockups/assets/icons.svg →
shell/mds/icons/*.svg; --check в CI |
shell/mds/ |
QML-модуль Meridian.Mds: токены, MdsIcon
(SVG с подстановкой currentColor, растр под DPR),
компоненты каркаса — TitleBar, DocumentTab,
PaletteField, Ribbon, RibbonPage,
RibbonGroup, RibbonLargeButton,
RibbonSmallButton, RibbonToggle,
RibbonCombo, StyleCard,
SidePanel, StatusBar,
ZoomControl, MdsButton |
shell/qml/ |
модуль Meridian.Shell: Main (окно),
WriteRibbon, DocumentCanvas,
NavigationPanel, StylesPanel,
Backstage, CommandPalette |
shell/src/ |
main.cpp (параметры, шрифты, провайдеры, снимок окна),
DocumentStore (вкладки, синглтон Documents),
PageImageProvider (image://page),
IconProvider (image://icon),
platform/windowstyle_* |
Лента написана с нуля на QML; от SARibbon (MIT) взяты только идеи адаптивного сворачивания групп по приоритетам, код и виджеты не переносились.