# VoIdea — Specification ## Overview VoIdea ("Голос Идей") — гибридное приложение для фиксации и проработки идей с помощью группового ИИ-анализа. Работает как PWA (устанавливается на телефон), с перспективой нативных iOS/Android-клиентов. ## Stack & Rationale | Layer | Choice | Why | |-------|--------|-----| | Frontend framework | React 18.3 LTS | Стабильность, экосистема, перспектива React 19 | | Language | TypeScript 5.5 strict | Типобезопасность, самодокументируемость | | Styling | Tailwind CSS 3.4 | Utility-first, тёмная тема из коробки, PWA-ready | | State management | Zustand | 1.1 KB, без Provider, работает вне React (можно читать токен в api/client) | | Forms | react-hook-form + zod | Валидация через схему = один источник истины (типы TS = runtime) | | Routing | react-router-dom 6 | Стандарт React | | PWA | vite-plugin-pwa | Service worker + manifest из коробки | | Build | Vite 5 | Быстрая сборка, HMR | | Backend | FastAPI (Python) | Асинхронный, Pydantic-валидация | | Database | PostgreSQL | ACID, JSONB | | Queue | Celery + Redis | AI-вызовы, бэкапы, email | ## Key Decisions ### Zustand over Context - Context ререндерит ВСЕХ подписчиков при изменении. Zustand — только тех, кто читает изменившееся поле. - Zustand-стор можно читать вне React (в `api/client.ts` для token refresh). - Для существующего `AuthContext` — постепенный перенос в `stores/auth.ts`. ### react-hook-form + zod over native forms - Валидация через zod-схему: TypeScript тип = runtime тип, расхождение невозможно. - `errors` из коробки, `isSubmitting`, `dirty`/`touched`. - Для простых форм (2 поля: логин) — можно оставить нативный `