MOffice

Живая оболочка 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 страниц)

MOffice Write, светлая тема

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

MOffice Write, тёмная тема

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

Новый документ

Командная палитра Ctrl+Shift+P / ⌘⇧P (псевдоним Alt+Q)

Нечёткий поиск по командам ленты с путём «Вкладка › Группа» и сочетанием; Ctrl+K остаётся гиперссылкой (решение 1).

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

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

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 ~/Qt
just build-shell
shell/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) взяты только идеи адаптивного сворачивания групп по приоритетам, код и виджеты не переносились.