design-wave1: миграция desktop на canon — Form/ModalBase/Styles shims снос #42

Merged
ant merged 10 commits from feat/design-wave1-cleanup-dialogs-forms into dev 2026-05-28 14:10:14 +00:00
Owner

Что делает PR

Закрывает первую волну миграции components/desktop на единый дизайн-канон платформы:
снос временных shim'ов вокруг базовых UI-примитивов, переход на canon-компоненты
(BaseDialog, BaseForm, BaseButton, ThemeToggle) и canon-токены var(--p-*).

Что сделано

Form → BaseForm + BaseButton (20 call-sites)

  • Старый shared/ui/Form/Form.vue превращён в shim, потом сносится.
  • Все потребители переключены на canon.

ModalBase → BaseDialog (37 call-sites)

  • 19 в src/ (pages/widgets/features) + 18 в extensions/{capital,chairman,powerup}.
  • Общий паттерн: q-btn>q-dialog>ModalBasediv>q-btn + BaseDialog.
  • persistent:close-on-backdrop='false' :close-on-escape='false'.
  • @hide@update:model-value='(v) => !v && X()'.
  • 5 диалогов с maximized-режимом сохранены через :maximized='true'.
  • Pug-индентация во всех файлах выровнена под новую структуру.

ToogleDarkLight → ThemeToggle

  • Старый ToogleDarkLight (с опечаткой в имени) удалён, заменён на canon ThemeToggle.

AutoAvatar → shared/ui/domain/AutoAvatar

  • Каноничный domain-путь; shim удалён.

Снос мёртвого кода

  • shared/ui/InputStyles — полностью мёртвый, удалён.
  • shared/ui/TitleStyles + CardStyles — стили перенесены в глобальный
    src/css/legacy-stylers.scss (подключается через quasar.config.cjs).
  • 8 side-effect-import-ов из extensions/capital удалены.
  • shim-папки ModalBase/, TitleStyles/, CardStyles/, AutoAvatar/,
    Form/, ToogleDarkLight/, InputStyles/ снесены целиком.
  • Re-export-ы из src/shared/ui/index.ts вычищены.

Параллельный фикс (попал в волну)

  • entities/Agreement/api: ранний guard в loadCooperativeAgreements и
    loadAgreementTemplates — чтобы Zeus не отправлял coopname=undefined
    в GraphQL, пока getInfo ещё не отработал.
  • RequireAgreements + SignUp/SignUp.vue: watch(() => info.coopname)
    с immediate: true — прогрессивная подгрузка соглашений по мере
    готовности system-store, без блокировки рендера.

Метрики

  • 78 файлов изменено, +1833 / -1737.
  • Удалено 7 shim-папок целиком.

Тестирование

  • ESLint: зелёный на всех изменённых файлах.
  • vite dev: стартует, фронт собирается, основные сценарии открываются:
    кооперативные настройки, регистрация, главная, capital-страницы,
    меню действий (создание/удаление проектов/задач/историй/коммитов).

Связь с другими PR

  • Стек: PR на feat/design-wave2-legacy-stylers-canon базируется поверх
    этой ветки и таргетится в неё (после merge этой автоматически перенацелится на dev).

Что НЕ вошло в волну (долг)

  • Стили в src/css/legacy-stylers.scss ещё используют ad-hoc размеры
    через var(--q-*) и rgba() — закрывается в design-wave2.
  • USE-ONLY потребители .card-value/.card-label/.section-title (~16 файлов)
    до сих пор наследуют глобальный legacy-стиль — миграция на canon-виджеты
    откладывается на отдельную волну.
## Что делает PR Закрывает первую волну миграции `components/desktop` на единый дизайн-канон платформы: снос временных shim'ов вокруг базовых UI-примитивов, переход на canon-компоненты (`BaseDialog`, `BaseForm`, `BaseButton`, `ThemeToggle`) и canon-токены `var(--p-*)`. ## Что сделано ### Form → BaseForm + BaseButton (20 call-sites) - Старый `shared/ui/Form/Form.vue` превращён в shim, потом сносится. - Все потребители переключены на canon. ### ModalBase → BaseDialog (37 call-sites) - 19 в `src/` (pages/widgets/features) + 18 в `extensions/{capital,chairman,powerup}`. - Общий паттерн: `q-btn>q-dialog>ModalBase` → `div>q-btn + BaseDialog`. - `persistent` → `:close-on-backdrop='false' :close-on-escape='false'`. - `@hide` → `@update:model-value='(v) => !v && X()'`. - 5 диалогов с `maximized`-режимом сохранены через `:maximized='true'`. - Pug-индентация во всех файлах выровнена под новую структуру. ### ToogleDarkLight → ThemeToggle - Старый `ToogleDarkLight` (с опечаткой в имени) удалён, заменён на canon `ThemeToggle`. ### AutoAvatar → shared/ui/domain/AutoAvatar - Каноничный domain-путь; shim удалён. ### Снос мёртвого кода - `shared/ui/InputStyles` — полностью мёртвый, удалён. - `shared/ui/TitleStyles` + `CardStyles` — стили перенесены в глобальный `src/css/legacy-stylers.scss` (подключается через `quasar.config.cjs`). - 8 side-effect-import-ов из `extensions/capital` удалены. - shim-папки `ModalBase/`, `TitleStyles/`, `CardStyles/`, `AutoAvatar/`, `Form/`, `ToogleDarkLight/`, `InputStyles/` снесены целиком. - Re-export-ы из `src/shared/ui/index.ts` вычищены. ### Параллельный фикс (попал в волну) - `entities/Agreement/api`: ранний guard в `loadCooperativeAgreements` и `loadAgreementTemplates` — чтобы Zeus не отправлял `coopname=undefined` в GraphQL, пока `getInfo` ещё не отработал. - `RequireAgreements` + `SignUp/SignUp.vue`: `watch(() => info.coopname)` с `immediate: true` — прогрессивная подгрузка соглашений по мере готовности system-store, без блокировки рендера. ## Метрики - 78 файлов изменено, +1833 / -1737. - Удалено 7 shim-папок целиком. ## Тестирование - ESLint: зелёный на всех изменённых файлах. - vite dev: стартует, фронт собирается, основные сценарии открываются: кооперативные настройки, регистрация, главная, capital-страницы, меню действий (создание/удаление проектов/задач/историй/коммитов). ## Связь с другими PR - Стек: PR на `feat/design-wave2-legacy-stylers-canon` базируется поверх этой ветки и таргетится в неё (после merge этой автоматически перенацелится на dev). ## Что НЕ вошло в волну (долг) - Стили в `src/css/legacy-stylers.scss` ещё используют ad-hoc размеры через `var(--q-*)` и `rgba()` — закрывается в design-wave2. - USE-ONLY потребители `.card-value/.card-label/.section-title` (~16 файлов) до сих пор наследуют глобальный legacy-стиль — миграция на canon-виджеты откладывается на отдельную волну.
claude added 10 commits 2026-05-28 14:08:18 +00:00
* ThemeToggle получает asButton/showText/isMobile, поглощая роль ToogleDarkLight (исправлена опечатка в имени).
* AutoAvatar перенесён в shared/ui/domain/AutoAvatar — он DiceBear-процедурный, а не base-примитив (canon Avatar делает инициалы/image и не заменяет процедурную генерацию).
* Снесены legacy папки shared/ui/ToogleDarkLight и shared/ui/AutoAvatar.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* InputStyles — весь файл состоял из закомментированного кода.
* TitleStyles — .title-container не использовался ни в одном .vue.
* Удалены 3 импорта InputStyles в Editable*Card и реэкспорт TitleStyles из shared/ui/index.ts.

CardStyles оставлен: используется в 4 call-sites (RestartMeetForm, UnionMembershipStep, TariffCard, MeetInfoCard) — миграция отдельным шагом.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* Глобальный CardStyles из 430 строк CSS реально использовался только через .info-card в RestartMeetForm.vue.
* Все остальные классы (card-container, section-header, card-label, card-value) определены локально в scoped CSS соответствующих компонентов — глобальный импорт лишний.
* Стили .info-card (+ dark-override) заинлайнены в scoped стиль RestartMeetForm под нативным именем .meet-form-agenda-item.
* Удалены: глобальный импорт в App.vue, @import в RestartMeetForm, папка shared/ui/CardStyles.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Form.vue переписан как тонкий wrapper над canon BaseForm + BaseButton с сохранением старого API (handlerSubmit/isSubmitting/showCancel/showSubmit/buttonSubmitTxt/buttonCancelTxt/disabled/size).

Что изменилось визуально:
* Кнопки cancel/submit вынесены в slot #footer (canon-layout с gap=14px между body и footer).
* Cancel — variant='ghost' (плоская), Submit — variant='primary' (canon-primary), оба BaseButton с no-caps/без ripple.
* Кнопки выровнены justify-content:flex-end (canon-pattern для форм), вместо старого .flex без выравнивания.

API call-sites не трогаем — 20 form-call-sites (Branch/Wallet/PaymentMethod/Agreementer/Decision/Union/FreeDecision/Payment/Request/AxonWallet) получают canon-визуал сразу.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Простые модальные диалоги переведены с q-dialog+ModalBase на canon BaseDialog (внутри уже q-dialog), API v-model:modelValue:

* features: DeleteBranch / CreateBranch / DepositToWallet (двух-стейтовый dialog) / WithdrawFromWallet / AddPaymentMethod / DeletePaymentMethod / Decision.CreateProjectFreeDecision (lg) / FreeDecision.CreateProject (md) / Payment.SetStatus.SetOrderPaid/Completed/Refunded
* widgets: ConnectionDashboard.AxonWallet / Desktop.WorkspaceMenu (size=lg вместо 700px-фикса)
* shared: CreateDialog (общий wrapper) / CouncilOnboarding.CouncilOnboardingCard (кнопки в slot footer)

Persistent → :close-on-backdrop='false' + :close-on-escape='false'. @hide='clear' → @update:model-value с проверкой v===false. style='width: NNNpx' переведён на canon size sm/md/lg.

Что НЕ мигрировалось (5 файлов остались с ModalBase):
SelectBranchOverlay, SignAgreementDialog, ReadAgreementDialog, StaticPrivacyDialog, Decision.CreateProject.CreateProjectButton — все используют :maximized='true'. BaseDialog в canon не имеет fullscreen-режима, расширять canon без согласования — нарушение правила "Канон-нейминг согласовывать ДО реализации". Эти 5 кейсов оставлены legacy.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
В BaseDialog добавлен prop :maximized (boolean) — q-dialog получает maximized, q-card растягивается на весь экран, body становится flex-scrollable. При :maximized размер size игнорируется.

Это покрывает 5 last maximized call-sites:
* Agreementer.SignAgreementDialog — fullscreen для подписи договора (hideCloseButton)
* Agreementer.ReadAgreementDialog — fullscreen для просмотра договора
* Agreementer.StaticPrivacyDialog — fullscreen для статичной privacy policy
* Branch.SelectBranch.SelectBranchOverlay — fullscreen onboarding flow с шагами 1/2
* Decision.CreateProject.CreateProjectButton — fullscreen для предложения повестки

Все 5 переведены на BaseDialog :maximized='true' :close-on-backdrop='false' :close-on-escape='false'.

После миграции ModalBase больше не используется — удалена папка shared/ui/ModalBase и реэкспорт из shared/ui/index.ts. Design-wave1 закрыт полностью.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
При bootstrap'е фронта RequireAgreements/SignUp успевают смонтироваться
ДО завершения system.loadSystemInfo(), и info.coopname=undefined.
Zeus сериализует variables в {} → сервер кидает
"Variable $coopname of required type String! was not provided".

Решение по слою:
- api/index.ts: гард — если coopname пустой, не отправляем запрос.
- RequireAgreements/SignUp: watch(() => info.coopname) — load
  отрабатывает, как только coopname прорастёт, без блокировки UI.
В прошлой волне снёс shared/ui/{ModalBase,TitleStyles,CardStyles,AutoAvatar},
но смотрел только src/. В extensions/{capital,chairman}/ осталось:
* ModalBase — 17 файлов
* TitleStyles (side-effect SCSS) — 6 страниц capital
* CardStyles (side-effect SCSS) — 1 виджет capital
* AutoAvatar — 1 страница capital
Из-за этого vite валился на 404 TitleStyles → "Failed to fetch dynamically
imported module src/boot/init.ts" и фронт не грузился.

Восстановлены оригинальные файлы. AutoAvatar в shared/ui/AutoAvatar
оставлен как re-export нового канон-расположения shared/ui/domain/AutoAvatar.
Полная миграция extensions на BaseDialog и канон-токены — отдельная волна.
ResourceInfoWidget в extensions/powerup импортирует ModalBase через
barrel: import { ModalBase } from 'src/shared/ui'. После сноса
re-export'а vite валился SyntaxError: does not provide an export.
Возвращаю строку обратно — папка ModalBase уже восстановлена
предыдущим коммитом.
[design-wave1][@dark] feat: миграция extensions на канон — снос ModalBase/TitleStyles/CardStyles/AutoAvatar shim'ов
Typecheck / desktop (pull_request) Failing after 8m58s
Typecheck / controller (pull_request) Successful in 13m16s
04e7503e7d
ModalBase → BaseDialog (18 call-sites):
* extensions/capital — 14 features + 1 widget (ImportContributorsButton).
* extensions/chairman — 2 approval features + 1 page (AgendaPresetsPage).
* extensions/powerup — 1 widget (ResourceInfoWidget, через barrel).
Паттерн: q-dialog внутри q-btn → BaseDialog параллельно q-btn в общей div-обёртке.
persistent=true → :close-on-backdrop='false' :close-on-escape='false'.
@hide → @update:model-value='(v) => !v && callback()'. maximized → :maximized='true'.
ProjectInvestFabAction: два дублирующих q-dialog объединены в один BaseDialog.

TitleStyles + CardStyles → src/css/legacy-stylers.scss (глобально через quasar.config.cjs).
Все 8 side-effect import'ов в extensions/capital удалены.
Долг: переписать .title-container/.info-card/.card-* классы на canon-токены.

AutoAvatar: 1 импорт в CapitalProfilePage переключён на shared/ui/domain/AutoAvatar.
Shim shared/ui/AutoAvatar снесён.

Удалены: shared/ui/{ModalBase,TitleStyles,CardStyles,AutoAvatar} + reexport ModalBase
из shared/ui/index.ts. Design-wave1 закрыт полностью.
ant merged commit 5041abe851 into dev 2026-05-28 14:10:14 +00:00
ant deleted branch feat/design-wave1-cleanup-dialogs-forms 2026-05-28 14:10:14 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#42