Дмитрий
|
d8c33b4cd6
|
feat(dev-indices): DevIndexOverlay (hover badge + click-copy + Esc + AppShell mount)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-05-12 12:02:38 +03:00 |
|
Дмитрий
|
da65cf4bf7
|
phase2(admin): AdminLayout + AdminTenantsView - админка SaaS (12/13 концептов)
- AdminLayout: отдельный sidebar теало-нуар с под-брендом ADMIN (red error
10px JBM uppercase) + 4 nav (Тенанты 142 / Биллинг / Инциденты 3 / Система) +
topbar с crumb «Админка → currentPage» + admin-user-chip с error-color avatar.
- AdminTenantsView (/admin/tenants): page-head + 5-stats + Экспорт +
search/Статус/Тариф фильтры + v-data-table 7 колонок (Тенант с двухстрочным
name+inn / Статус-chip 4 цвета / Тариф / Баланс ₽ с error-color при <0 /
Желаем×факт / MRR с «—» / Активность).
- mockTenants.ts соответствует schema v8.7 §3: 4 статуса × 5 тарифов, 7 mock
с разнообразием (active/trial/overdue/suspended) + AdminStats (142/128/9/5/
1 248 600 ₽).
- AdminPlaceholderView универсальный для Биллинг/Инциденты/Система с
описаниями ссылающимися на schema v8.7 (incidents_log §9 / system_settings §10).
- AppShell расширен meta.layout='admin'. Router: /admin redirect на /tenants +
4 admin-route'а с lazy-imports. Web.php fallback покрывает /admin/*.
- cspell-words.txt: Екб.
Vitest +11 (всего 129/129 за 10.02s):
- заголовок + 5 stats (regex nbsp в 1 248 600 ₽) + 7 columns + 7 rows +
Окна Москва ИНН + overdue −1 200 + trial 4 дня + suspended + search filter
«Натяжные» → 1 row + Экспорт/Статус/Тариф кнопки.
Регресс: lint+type+format OK; vitest 129/129; vite build (admin views
в lazy-chunks; main 104.99 KB); story:build 21/28 за 30.32s; Pest 48/48 за 4.89s.
CLAUDE.md v1.30->v1.31, реестр Открытых_вопросов v1.39->v1.40.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 19:23:28 +03:00 |
|
Дмитрий
|
034657788d
|
phase2(errors): ErrorView 404/403/500 + Laravel fallback
- ErrorView универсальный с конфигурацией через route.meta.errorCode
(404/403/500). По v8_errors.html: full-bleed теало-нуар bg, top-brand,
err-code 96px JBM с accent на средней цифре, title/desc, 2 actions,
опциональные status-list (500) и err-id с copy-btn (403/500).
- AppShell: meta.layout='error' → RouterView напрямую (ErrorView сам
предоставляет v-app).
- Router: /403, /500, catch-all /:pathMatch(.*)* → ErrorView с meta.errorCode.
- web.php: явные Route::view + Route::fallback (срабатывает после Pest
runtime-routes, не ломает SetTenantContextTest).
- cspell-words.txt: резолвится, роуты.
Vitest +8 (всего 118/118 за 9.39s):
- 404 default + 403 с REQ-ID + 500 с INC-ID + status-list (API/Telegram/YooKassa) +
404 actions (На дашборд + Назад) + 403 mailto-link + 500 status-link +
brand-блок + 404 НЕ содержит REQ/INC/status-list (regression-guard).
- stubs:{VApp/VMain} как passthrough — обходим Vuetify layout-injection в jsdom.
Регресс: lint+type+format OK; vitest 118/118; vite build (ErrorView lazy-chunk;
main app-chunk 101.01KB упал на 7KB благодаря shared chunk'ам); story:build
19/26 за 30.96s; Pest 48/48 за 4.88s (fallback не сломал runtime-routes).
CLAUDE.md v1.29->v1.30, реестр Открытых_вопросов v1.38->v1.39.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 19:11:09 +03:00 |
|
Дмитрий
|
1e233a70c8
|
phase2(dashboard): AppLayout + DashboardView - default-layout приложения
- AppLayout: v-navigation-drawer (теало-нуар sidebar 240px) + brand-block
+ nav-tree из 8 пунктов в 3 группах (Работа/Финансы/Команда), v-app-bar
с crumb «Рабочая область → currentPage» + search ⌘K + bell + user-chip.
Mobile (md<): drawer toggleable.
- DashboardView: page-head «Доброе утро, Иван» + page-meta + range-toggle
4 опции (Сегодня/7д/30д/Период). KPI-row из 4 cards: 3 outlined (получено
лидов/конверсия/активные проекты) + 1 hero balance с runway-bar 4/7
заполненных сегментов teal #32C8A9.
- AppShell упрощён до layout-mapper (route.meta.layout 'app'/'auth').
- Маршрут /dashboard (meta.layout='app') в router + web.php.
- histoire.setup расширен 8 app-stub-маршрутами для AppLayout.
- Vitest +11 тестов: AppLayout 6 (brand+3 группы+8 пунктов+счётчики+crumb),
DashboardView 5, AppShell.spec.ts переписан под layout-mapper.
- cspell-words.txt: JBM.
Регресс: lint+type-check+format OK; vitest 35/35 за 4.92s; vite build
DashboardView lazy-chunk 14.9KB; story:build 8/8 за 28.97s; Pest 48/48 за 4.88s.
CLAUDE.md v1.20->v1.21, реестр Открытых_вопросов v1.29->v1.30.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 17:21:19 +03:00 |
|
Дмитрий
|
e909a95a8d
|
phase2(login): vue-router 4 + AuthLayout + LoginView - первый реальный экран
- vue-router@^4.6.4 (--legacy-peer-deps из-за Histoire vs Vite 8 peerDep).
- resources/js/router/index.ts: createWebHistory + lazy-imports + meta.layout.
Маршрут / -> /login, /login -> LoginView (meta.layout=auth).
- resources/js/layouts/AuthLayout.vue: двухпанельный (brand-pane тёмный с
radial-gradient акцентами + form-pane warm ivory). На mobile brand-pane скрыт.
- resources/js/views/auth/LoginView.vue: форма Vuetify по v8_login.html
секция #form-login - email/password (autocomplete + eye-icon), primary submit,
Yandex 360 SSO, RouterLink на /register и /forgot.
- AppShell.vue: layout-mapper по route.meta.layout (default/auth).
- routes/web.php: явные Route::view для 6 SPA-путей (НЕ catch-all - он перехватывал
/_test/* в Pest beforeEach и валил 5 SetTenantContextTest).
- Vitest: +LoginView.spec.ts (5), +router.spec.ts (2), AppShell.spec.ts переписан (3).
Vitest 10/10 за 3.01s.
- LoginView.story.vue для Histoire. Setup расширен memory-router'ом.
- cspell-words.txt: рендерят, коммиты, Лидерру.
- Регресс: lint:vue OK, type-check OK, format:check OK, vitest 10/10,
vite build 212 модулей за 383ms (LoginView lazy-chunk 43.5KB JS / 51.7KB CSS),
story:build 2/2 за 29.94s, Pest 48/48 за 4.86s.
CLAUDE.md v1.18->v1.19, реестр Открытых_вопросов v1.27->v1.28.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 16:59:00 +03:00 |
|
Дмитрий
|
952373fce5
|
phase2(trigger): Vue 3 + Vuetify 3 + ESLint+Prettier+Vue + vue-tsc + Vitest
Триггер фазы 2 выполнен — первый коммит в app/resources/js/. Активирует
5 из 6 инструментов фазы 2 (CLAUDE.md §3.3) — без Histoire (отдельно).
Tailwind удалён (правило CLAUDE.md §5 п.2).
Стек:
- vue@3.5, vuetify@3.12, @vitejs/plugin-vue@6 (для Vite 8 совместимости —
@vitejs/plugin-vue@5 поддерживает только Vite 5/6), vite-plugin-vuetify@2
(auto-import), sass-embedded
- eslint@10 (flat-config), eslint-plugin-vue@10,
@vue/eslint-config-typescript@14, eslint-config-prettier, prettier@3.8
- typescript@6, vue-tsc@3.2
- vitest@4.1, @vue/test-utils, jsdom, @vitest/coverage-v8
Конфиги:
- app/vite.config.js — vue + vuetify auto-import
- app/vitest.config.ts — jsdom + setup file для ResizeObserver/
IntersectionObserver/matchMedia/CSS.supports stubs (без них Vuetify
падает в JSDOM)
- app/eslint.config.js — flat-config
- app/.prettierrc.json, app/tsconfig.json
Frontend-структура:
- resources/js/app.ts — точка входа
- resources/js/plugins/vuetify.ts — палитра Forest (Teal/ivory/теало-нуар
из BRANDBOOK_v2 §3)
- resources/js/components/AppShell.vue — первый компонент: v-app +
v-app-bar + v-card
- resources/css/app.css — Inter (UI, opsz axis), JetBrains Mono
(.numeric, tnum)
- resources/views/welcome.blade.php — упрощён под Vue mount
Smoke-тесты Vitest 3/3 за 2.8 сек:
- монтируется без ошибок
- содержит «Лидерра.»
- рендерит chip с фазой 2
Build: 158 модулей за 386 ms (184 KB JS / 295 KB CSS gzipped).
npm-scripts: lint:vue, format, format:check, type-check, test:vue.
lefthook job #8 (ESLint на staged .ts/.vue) добавлен в pre-commit.
Полный type-check (vue-tsc) и Vitest — отдельно вручную (медленно для
pre-commit: ~3 сек на каждый).
CLAUDE.md v1.16 → v1.17 (фаза 1 → фаза 2 в §6).
Реестр Открытые_вопросы v1.25 → v1.26.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 16:07:14 +03:00 |
|