← Все сессии Дата: 2026-05-22
Часов: 1.5
Кто: —
Переключатель модулей платформы в шапке Bablo
Что сделано
- Исследовал эталонный компонент
/opt/ks2builder/frontend/src/components/AppHeader.jsx — разметка, Tailwind-классы, структура дропдауна
- Сверил
@theme блоки CSS обоих проектов: ks2builder/src/index.css vs bablo/app/globals.css — токены идентичны (ks2builder был скопирован с Bablo по записи в комментарии)
- Создал
/opt/bablo/app/components/layout/AppHeader.tsx:
'use client' компонент с useState для toggle дропдауна
- Кнопка:
PROFITVILL / Bablo ▾ в шрифте font-display (JetBrains Mono), text-color-accent (#facc15)
- Дропдаун
w-64 bg-bg-elevated border-border-subtle rounded shadow-lg z-50:
- Bablo — активный пункт (
bg-bg-surface, не ссылка)
- КС-2 Builder →
https://ks2.profitvill.ru (внешняя <a>)
- ИД →
https://id.profitvill.ru (внешняя <a>)
- разделитель
border-t border-border-subtle
- AI-ключи →
/settings/ai-keys (Next.js <Link>)
- Модель AI →
/settings/ai-model (Next.js <Link>)
- Админка →
/admin/users (только для role === 'owner')
- Обновил
/opt/bablo/app/app/(app)/layout.tsx:
- Layout стал
async, импортирует getSession()
- AppHeader рендерится поверх
flex строки sidebar + main
- Передаёт
{ fullName, email: null, role } из сессии
- TypeScript type check: clean (0 ошибок)
- Next.js production build: clean
- Docker:
bablo-app rebuild + restart, сервис поднялся за 229ms
Что не сделано
- Скриншот в браузере (нет прямого доступа через CLI; контейнер работает на порту 3010 за NPM)
Решения
- Используем
<a> для внешних ссылок (ks2, id) и <Link> для внутренних (settings, admin) — разница семантическая
onMouseLeave на дропдауне закрывает его при уходе мышью (точно как в эталоне)
- User email не передаём в AppHeader (в Bablo email в сайдбаре не нужен, только fullName)