diff --git a/CLAUDE.md b/CLAUDE.md index 44023a5..2fc5855 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -97,7 +97,7 @@ ESM-пакет, Node 22+. SDK — `@modelcontextprotocol/sdk` (`McpServer` + `St - `views/` — страницы, подключённые в `router/index.ts`. - `stores/` — глобальные Pinia-сторы (`user-store`, `question-types-store`). - `api/` — общий HTTP-клиент: `api/client.ts` (axios инстанс с JWT-интерцептором и редиректом на `/login` по 401), `api/auth.ts`, `api/tokenStorage.ts`. -- `composables/` — реюзабельные composables (`useCooldown`, `usePushSubscription`, ...). +- `composables/` — реюзабельные composables (`useCooldown`, `usePushSubscription`, `useNow`, ...). - `mocks/` — MSW-моки для тестов. - `sw.ts` — кастомный service worker (workbox). @@ -105,6 +105,10 @@ ESM-пакет, Node 22+. SDK — `@modelcontextprotocol/sdk` (`McpServer` + `St Авторизация: при старте `main.ts` пробует `authorize()` если есть `Telegram.WebApp.initData` или dev-флаг `VITE_DEV_TELEGRAM_ID`. Router guard в `router/index.ts` редиректит на `/login` любой не-public маршрут при отсутствии токена. Public-маршруты помечены `meta: { public: true }`. +**Секционный блок сайдбара — один компонент на секцию.** `sectionExtraRegistry` в `components/AppLayout.vue` отображает `meta.sectionNav` в **ровно один** компонент (`tasks` → `TasksSidebarSection.vue`). Чтобы добавить в сайдбар ещё один блок, композиция делается внутри секционного компонента, а не расширением реестра до массива. `AppSidebar.vue` рендерит слот `section-extra` **дважды** — в десктопном `