# 🚀 План реализации нового Frontend (Material UI 3 + Next.js 16)
**Дата создания:** 26 января 2026
**Проект:** Uchill Platform - Frontend Material
**Цель:** Создать новый frontend с Material UI 3, iOS 24+ дизайном и панелью управления снизу
---
## 📋 Общая информация
### Технологический стек:
- **Framework:** Next.js 16.1+ (с Turbopack)
- **UI Library:** Material Web Components 3 (`@material/web`) - **ТОЛЬКО Material компоненты!**
- **Layout System:** Material Design 3 Grid System
- **Styling:** CSS Variables (Material Theme)
- **TypeScript:** Да
- **State Management:** React Context API
- **API Client:** Axios
- **Real-time:** WebSocket (чат, доска), WebRTC (видеозвонки)
- **Icons:** Material Symbols (Google Fonts)
### Дизайн-система:
- **Цвета:** Из `landing_site` (см. ниже)
- **Стиль:** iOS 24+ (rounded corners, blur effects, glassmorphism)
- **Навигация:** Bottom Navigation Bar (iOS-style, Material Navigation)
- **Компоненты:** **ТОЛЬКО Material Web Components 3** (`@material/web`)
- **Layout:** Material Design 3 Grid System
- **Styling:** Чистый CSS с CSS Variables (БЕЗ Tailwind CSS)
---
## 🎨 Цветовая палитра из landing_site
```css
:root {
--theme: #7444FD; /* Основной фиолетовый */
--theme2: #F9F3EF; /* Бежевый фон */
--theme3: #FAF8FF; /* Светло-фиолетовый фон */
--title: #282C32; /* Темно-серый для заголовков */
--text: #858585; /* Серый для текста */
--text2: #cbcbcb; /* Светло-серый */
--border: #E6E6E6; /* Границы */
--border-2: #F1F1F1; /* Светлые границы */
--bg-1: #161921; /* Темный фон */
--bg-2: #F6F7FF; /* Светлый фон */
--white: #fff;
--black: #000;
--orange: #e78c45;
}
```
### Адаптация для iOS 24+ стиля:
- Использовать blur effects (backdrop-filter)
- Rounded corners (16px, 20px, 24px)
- Glassmorphism для панелей
- Soft shadows
- Smooth animations
---
## 📦 Этап 1: Подготовка проекта и инфраструктуры
### Задача 1.1: Инициализация Next.js 16 проекта
- [ ] Создать новый Next.js проект в `front_material/`
- [ ] Настроить TypeScript конфигурацию
- [ ] Настроить ESLint и Prettier
- [ ] Настроить пути импортов (`@/components`, `@/utils`, и т.д.)
- [ ] Создать базовую структуру папок
**Команды:**
```bash
cd front_material
npx create-next-app@latest . --typescript --no-tailwind --app --no-src-dir
npm install @material/web
npm install axios date-fns livekit-client
npm install -D @types/node @types/react @types/react-dom
```
**⚠️ Важно:** Создаем проект **БЕЗ Tailwind CSS** (`--no-tailwind`)!
### Задача 1.2: Настройка Docker
- [ ] Создать `Dockerfile` для Next.js 16
- [ ] Создать `.dockerignore`
- [ ] Настроить multi-stage build (development, production)
- [ ] Обновить `docker-compose.yml` (отключить старый frontend, добавить новый)
- [ ] Настроить hot reload в Docker
**Dockerfile структура:**
```dockerfile
# Development stage
FROM node:20-alpine AS development
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
# Production stage
FROM node:20-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
```
### Задача 1.3: Настройка переменных окружения
- [ ] Создать `.env.example`
- [ ] Настроить `NEXT_PUBLIC_API_URL`
- [ ] Настроить `NEXT_PUBLIC_WS_URL`
- [ ] Настроить другие переменные окружения
**Файл `.env.example`:**
```env
NEXT_PUBLIC_API_URL=http://localhost:8123/api
NEXT_PUBLIC_WS_URL=ws://localhost:8123/ws
NEXT_PUBLIC_LIVEKIT_URL=ws://localhost:7880
NODE_ENV=development
```
### Задача 1.4: Настройка Material Web Components
- [ ] Установить `@material/web`
- [ ] Настроить импорт компонентов
- [ ] Создать wrapper компоненты для React
- [ ] Настроить темизацию (цвета из landing_site)
- [ ] Создать базовые стили
**Структура:**
```
front_material/
├── src/
│ ├── components/
│ │ ├── material/ # Wrapper компоненты для Material UI
│ │ │ ├── Button.tsx
│ │ │ ├── TextField.tsx
│ │ │ ├── Card.tsx
│ │ │ └── ...
│ │ └── ...
│ ├── styles/
│ │ ├── material-theme.css # Кастомная тема Material UI
│ │ └── globals.css # Глобальные стили
```
---
## 🎨 Этап 2: Дизайн-система и базовые компоненты
### Задача 2.1: Создание цветовой темы
- [ ] Создать CSS переменные на основе цветов landing_site
- [ ] Адаптировать цвета для iOS 24+ стиля
- [ ] Создать темную тему (dark mode)
- [ ] Настроить Material UI тему с кастомными цветами
**Файл `src/styles/theme.css`:**
```css
:root {
/* Основные цвета из landing_site */
--md-sys-color-primary: #7444FD;
--md-sys-color-on-primary: #FFFFFF;
--md-sys-color-primary-container: #FAF8FF;
--md-sys-color-on-primary-container: #282C32;
/* iOS 24+ адаптация */
--ios-blur-background: rgba(255, 255, 255, 0.8);
--ios-blur-background-dark: rgba(0, 0, 0, 0.6);
--ios-border-radius: 20px;
--ios-border-radius-small: 16px;
--ios-border-radius-large: 24px;
--ios-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}
[data-theme="dark"] {
--md-sys-color-primary: #9D6AFF;
--ios-blur-background: rgba(0, 0, 0, 0.8);
}
```
### Задача 2.2: Использование Material Web Components (напрямую)
- [ ] Импортировать все нужные Material компоненты
- [ ] Настроить типизацию для Web Components в TypeScript
- [ ] Создать глобальный импорт всех Material компонентов
**Важно:** Используем Material Web Components напрямую в JSX/TSX, без wrapper компонентов!
**Файл `src/lib/material-components.ts`:**
```typescript
// Импортируем все нужные Material компоненты
import '@material/web/button/filled-button.js';
import '@material/web/button/outlined-button.js';
import '@material/web/button/text-button.js';
import '@material/web/button/elevated-button.js';
import '@material/web/button/tonal-button.js';
import '@material/web/textfield/filled-text-field.js';
import '@material/web/textfield/outlined-text-field.js';
import '@material/web/card/filled-card.js';
import '@material/web/card/elevated-card.js';
import '@material/web/card/outlined-card.js';
import '@material/web/list/list.js';
import '@material/web/list/list-item.js';
import '@material/web/dialog/dialog.js';
import '@material/web/chip/chip-set.js';
import '@material/web/chip/assist-chip.js';
import '@material/web/chip/filter-chip.js';
import '@material/web/icon/icon.js';
import '@material/web/iconbutton/icon-button.js';
import '@material/web/checkbox/checkbox.js';
import '@material/web/radio/radio.js';
import '@material/web/switch/switch.js';
import '@material/web/select/filled-select.js';
import '@material/web/select/outlined-select.js';
// И другие по необходимости
```
**Использование в компонентах:**
```typescript
'use client';
export default function LoginPage() {
return (
Войти
);
}
```
### Задача 2.3: Настройка TypeScript для Web Components
- [ ] Создать типы для Material Web Components
- [ ] Настроить JSX для использования Web Components
**Файл `src/types/material-web.d.ts`:**
```typescript
declare namespace JSX {
interface IntrinsicElements {
'md-filled-button': any;
'md-outlined-button': any;
'md-text-button': any;
'md-elevated-button': any;
'md-tonal-button': any;
'md-filled-text-field': any;
'md-outlined-text-field': any;
'md-filled-card': any;
'md-elevated-card': any;
'md-outlined-card': any;
'md-list': any;
'md-list-item': any;
'md-dialog': any;
'md-chip-set': any;
'md-assist-chip': any;
'md-filter-chip': any;
'md-icon': any;
'md-icon-button': any;
'md-checkbox': any;
'md-radio': any;
'md-switch': any;
'md-filled-select': any;
'md-outlined-select': any;
// ... другие компоненты
}
}
```
### Задача 2.4: Настройка Material Grid System
- [ ] Использовать CSS Grid из Material Design 3
- [ ] Настроить responsive breakpoints
- [ ] Создать Layout Grid компоненты
**Material Design 3 Grid:**
```css
/* src/styles/material-grid.css */
/* Material Design 3 Grid System */
.md-grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 16px;
padding: 0 16px;
}
/* Responsive breakpoints (Material Design 3) */
@media (min-width: 600px) { /* Tablet */
.md-grid {
gap: 24px;
padding: 0 24px;
}
}
@media (min-width: 840px) { /* Desktop */
.md-grid {
gap: 24px;
padding: 0 24px;
}
}
@media (min-width: 1240px) { /* Large Desktop */
.md-grid {
gap: 24px;
max-width: 1200px;
margin: 0 auto;
}
}
/* Grid column classes */
.md-col-1 { grid-column: span 1; }
.md-col-2 { grid-column: span 2; }
.md-col-3 { grid-column: span 3; }
.md-col-4 { grid-column: span 4; }
.md-col-6 { grid-column: span 6; }
.md-col-8 { grid-column: span 8; }
.md-col-12 { grid-column: span 12; }
/* Responsive columns */
@media (max-width: 599px) {
.md-col-sm-12 { grid-column: span 12; }
}
@media (min-width: 600px) and (max-width: 839px) {
.md-col-md-6 { grid-column: span 6; }
.md-col-md-12 { grid-column: span 12; }
}
@media (min-width: 840px) {
.md-col-lg-4 { grid-column: span 4; }
.md-col-lg-6 { grid-column: span 6; }
.md-col-lg-8 { grid-column: span 8; }
}
```
### Задача 2.5: Создание Bottom Navigation Bar (iOS-style + Material)
- [ ] Компонент `BottomNavigationBar` с использованием Material компонентов
- [ ] Использовать `md-navigation-bar` и `md-navigation-tab`
- [ ] Кастомизация под iOS 24+ стиль
- [ ] Badge для уведомлений (Material Badge)
- [ ] Адаптация под разные роли (mentor, client, parent)
**Использование Material Navigation:**
```typescript
'use client';
import '@material/web/labs/navigationbar/navigation-bar.js';
import '@material/web/labs/navigationtab/navigation-tab.js';
import '@material/web/icon/icon.js';
import '@material/web/badge/badge.js';
export function BottomNavigationBar({ userRole }: { userRole: string }) {
return (
home
home
calendar_month
calendar_month
chat
chat
{userRole === 'mentor' && (
group
group
)}
);
}
```
**Кастомизация под iOS стиль:**
```css
/* src/styles/ios-navigation.css */
md-navigation-bar.ios-bottom-bar {
--md-navigation-bar-container-color: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-top: 1px solid rgba(0, 0, 0, 0.1);
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.05);
border-radius: 24px 24px 0 0;
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 1000;
}
[data-theme="dark"] md-navigation-bar.ios-bottom-bar {
--md-navigation-bar-container-color: rgba(0, 0, 0, 0.8);
border-top-color: rgba(255, 255, 255, 0.1);
}
```
---
## 🏗️ Этап 3: Архитектура и структура приложения
### Задача 3.1: Настройка роутинга Next.js App Router
- [ ] Создать структуру папок для маршрутов
- [ ] Настроить Route Groups: `(auth)`, `(protected)`
- [ ] Создать layout для защищенных страниц
- [ ] Создать layout для публичных страниц
- [ ] Настроить middleware для проверки авторизации
**Структура:**
```
src/app/
├── (auth)/
│ ├── login/
│ ├── register/
│ └── layout.tsx
├── (protected)/
│ ├── dashboard/
│ ├── schedule/
│ ├── chat/
│ └── layout.tsx
├── layout.tsx
└── page.tsx
```
### Задача 3.2: Создание системы аутентификации
- [ ] Context для хранения пользователя (`AuthContext`)
- [ ] Хуки для работы с API (`useAuth`, `useLogin`, `useLogout`)
- [ ] Хранение токенов (localStorage)
- [ ] Автоматическое обновление токенов
- [ ] Защита маршрутов через middleware
**Файл `src/contexts/AuthContext.tsx`:**
```typescript
'use client';
import { createContext, useContext, useState, useEffect } from 'react';
import { getCurrentUser } from '@/api/auth';
interface User {
id: number;
email: string;
role: 'mentor' | 'client' | 'parent';
// ...
}
interface AuthContextType {
user: User | null;
loading: boolean;
login: (token: string) => Promise;
logout: () => void;
}
const AuthContext = createContext(null);
export function AuthProvider({ children }: { children: React.ReactNode }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
// Загрузка пользователя при монтировании
useEffect(() => {
loadUser();
}, []);
const loadUser = async () => {
try {
const token = localStorage.getItem('access_token');
if (token) {
const userData = await getCurrentUser();
setUser(userData);
}
} catch (error) {
localStorage.removeItem('access_token');
} finally {
setLoading(false);
}
};
const login = async (token: string) => {
localStorage.setItem('access_token', token);
await loadUser();
};
const logout = () => {
localStorage.removeItem('access_token');
setUser(null);
};
return (
{children}
);
}
export function useAuth() {
const context = useContext(AuthContext);
if (!context) throw new Error('useAuth must be used within AuthProvider');
return context;
}
```
### Задача 3.3: Создание API клиента
- [ ] Настроить Axios с базовым URL
- [ ] Добавить interceptors для токенов
- [ ] Обработка ошибок
- [ ] Типизация API ответов
- [ ] Создать модули API (auth, schedule, chat, и т.д.)
**Файл `src/lib/api-client.ts`:**
```typescript
import axios from 'axios';
const apiClient = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8123/api',
headers: {
'Content-Type': 'application/json',
},
});
// Добавление токена к запросам
apiClient.interceptors.request.use((config) => {
const token = localStorage.getItem('access_token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// Обработка ошибок
apiClient.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
localStorage.removeItem('access_token');
window.location.href = '/login';
}
return Promise.reject(error);
}
);
export default apiClient;
```
### Задача 3.4: Создание системы управления состоянием
- [ ] Настроить React Context для глобального состояния
- [ ] Опционально: добавить Zustand для сложного состояния
- [ ] Создать stores (userStore, notificationStore, и т.д.)
---
## 📱 Этап 4: Основные страницы и компоненты
### Задача 4.1: Страницы аутентификации
- [ ] `/login` - страница входа
- Material UI TextField для email/password
- Material UI Button
- iOS-стиль дизайн
- Валидация форм
- [ ] `/register` - страница регистрации
- Форма с выбором роли
- Material UI компоненты
- Валидация
- [ ] `/forgot-password` - восстановление пароля
- [ ] `/verify-email` - подтверждение email
### Задача 4.2: Главный Layout (защищенные страницы)
- [ ] Создать `ProtectedLayout`
- [ ] Верхняя панель навигации (iOS-style)
- [ ] Нижняя панель навигации (Bottom Navigation Bar)
- [ ] Контентная область с padding
- [ ] Обработка разных ролей
**Компонент `ProtectedLayout.tsx`:**
```typescript
'use client';
import { useAuth } from '@/contexts/AuthContext';
import { BottomNavigationBar } from '@/components/navigation/BottomNavigationBar';
import { TopNavigationBar } from '@/components/navigation/TopNavigationBar';
import { useRouter } from 'next/navigation';
import { useEffect } from 'react';
export default function ProtectedLayout({ children }: { children: React.ReactNode }) {
const { user, loading } = useAuth();
const router = useRouter();
useEffect(() => {
if (!loading && !user) {
router.push('/login');
}
}, [user, loading, router]);
if (loading) {
return ;
}
if (!user) {
return null;
}
return (
{children}
);
}
```
### Задача 4.3: Дашборды для каждой роли
- [ ] `/dashboard/mentor` - дашборд ментора
- Статистика студентов
- Ближайшие занятия
- Графики доходов
- Material UI Cards
- [ ] `/dashboard/client` - дашборд клиента
- Календарь занятий
- Прогресс обучения
- Статистика
- [ ] `/dashboard/parent` - дашборд родителя
- Выбор ребенка
- Статистика детей
### Задача 4.4: Страница расписания
- [ ] Календарь (Material UI или кастомный)
- [ ] Создание занятия
- [ ] Редактирование занятия
- [ ] Список занятий
- [ ] Фильтры
### Задача 4.5: Страница чата
- [ ] Список чатов (Material UI List)
- [ ] Окно чата
- [ ] WebSocket интеграция
- [ ] Отправка сообщений
- [ ] Файлы и медиа
### Задача 4.6: Страница видеозвонков
- [ ] Интеграция с LiveKit
- [ ] Видео компоненты
- [ ] Управление микрофоном/камерой
- [ ] Интерактивная доска
- [ ] Чат во время звонка
---
## 🎨 Этап 5: Стилизация и анимации
### Задача 5.1: Настройка стилей (только CSS, без Tailwind)
- [ ] Создать CSS переменные для всей платформы
- [ ] Использовать Material Design 3 Grid System
- [ ] Настроить iOS 24+ эффекты (blur, rounded corners)
- [ ] Настроить dark mode через CSS
**⚠️ Важно:** НЕ используем Tailwind CSS! Только чистый CSS и CSS Variables.
**Файл `src/styles/globals.css`:**
```css
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif;
color: var(--md-sys-color-on-surface);
background-color: var(--md-sys-color-surface);
}
/* iOS 24+ эффекты */
.ios-blur {
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
}
.ios-card {
border-radius: 20px;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(20px);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}
[data-theme="dark"] .ios-card {
background: rgba(0, 0, 0, 0.6);
}
```
### Задача 5.2: Создание анимаций
- [ ] Переходы между страницами
- [ ] Анимация Bottom Navigation Bar
- [ ] Анимация модальных окон
- [ ] Skeleton loaders
- [ ] Pull-to-refresh (опционально)
### Задача 5.3: Адаптивный дизайн
- [ ] Mobile-first подход
- [ ] Breakpoints для планшетов и десктопов
- [ ] Адаптация Bottom Navigation Bar для разных экранов
- [ ] Оптимизация для touch устройств
---
## 🔌 Этап 6: Интеграция с Backend
### Задача 6.1: Интеграция API
- [ ] Модуль `src/api/auth.ts` - аутентификация
- [ ] Модуль `src/api/schedule.ts` - расписание
- [ ] Модуль `src/api/chat.ts` - чат
- [ ] Модуль `src/api/materials.ts` - материалы
- [ ] Модуль `src/api/homework.ts` - домашние задания
- [ ] Модуль `src/api/students.ts` - студенты
- [ ] Модуль `src/api/payment.ts` - оплата
- [ ] И другие модули по необходимости
### Задача 6.2: WebSocket интеграция
- [ ] Хук `useChatWebSocket` для чата
- [ ] Хук `useBoardWebSocket` для доски
- [ ] Хук `useVideoWebSocket` для видеозвонков
- [ ] Обработка переподключений
- [ ] Обработка ошибок
### Задача 6.3: Интеграция видеозвонков
- [ ] LiveKit клиент
- [ ] Компоненты видео
- [ ] Управление медиа
- [ ] Screen sharing
- [ ] Интерактивная доска во время звонка
---
## 🐳 Этап 7: Docker и деплой
### Задача 7.1: Обновление docker-compose.yml
- [ ] Отключить старый frontend сервис
- [ ] Добавить новый `front_material` сервис
- [ ] Настроить порты
- [ ] Настроить volumes
- [ ] Настроить environment variables
**Изменения в `docker-compose.yml`:**
```yaml
# Старый frontend - закомментировать или удалить
# frontend:
# ...
# Новый frontend
front_material:
build:
context: ./front_material
dockerfile: Dockerfile
target: development
container_name: platform_front_material
restart: unless-stopped
command: npm run dev
environment:
- NODE_ENV=development
- NEXT_PUBLIC_API_URL=http://web:8000/api
- NEXT_PUBLIC_WS_URL=ws://web:8000/ws
ports:
- "3000:3000"
volumes:
- ./front_material:/app
- /app/node_modules
- /app/.next
networks:
- app_network
depends_on:
- web
```
### Задача 7.2: Production сборка
- [ ] Настроить production Dockerfile
- [ ] Оптимизация bundle size
- [ ] Настройка кеширования
- [ ] Настройка статических файлов
---
## 📝 Этап 8: Документация и тестирование
### Задача 8.1: Документация
- [ ] README.md с инструкциями по установке
- [ ] Документация компонентов
- [ ] Документация API интеграции
- [ ] Документация стилей и темизации
### Задача 8.2: Тестирование
- [ ] Unit тесты для утилит
- [ ] Integration тесты для API
- [ ] E2E тесты для критичных flow
- [ ] Тестирование на разных устройствах
---
## ✅ Чеклист миграции со старого frontend
### Подготовка:
- [ ] Создать backup старого frontend
- [ ] Экспортировать важные данные/конфигурации
- [ ] Документировать текущие API endpoints
### Миграция:
- [ ] Постепенно переносить функциональность
- [ ] Тестировать каждую страницу
- [ ] Проверять интеграцию с backend
- [ ] Проверять WebSocket соединения
### Завершение:
- [ ] Отключить старый frontend в docker-compose.yml
- [ ] Обновить документацию
- [ ] Обновить CI/CD (если есть)
- [ ] Уведомить команду о изменениях
---
## 🎯 Приоритеты реализации
### Фаза 1 (MVP - 2-3 недели):
1. ✅ Этап 1: Подготовка проекта
2. ✅ Этап 2: Базовые компоненты
3. ✅ Этап 3: Архитектура
4. ✅ Этап 4.1-4.3: Аутентификация и дашборды
### Фаза 2 (Основной функционал - 3-4 недели):
5. ✅ Этап 4.4-4.6: Основные страницы
6. ✅ Этап 5: Стилизация
7. ✅ Этап 6: Интеграция с Backend
### Фаза 3 (Полировка - 1-2 недели):
8. ✅ Этап 7: Docker и деплой
9. ✅ Этап 8: Документация и тестирование
---
## 📚 Полезные ресурсы
### Material Web Components:
- [Документация](https://github.com/material-components/material-web)
- [Примеры использования](https://material-web.dev/)
- [Material Symbols Icons](https://fonts.google.com/icons)
### Next.js 16:
- [Документация](https://nextjs.org/docs)
- [Turbopack](https://nextjs.org/docs/app/api-reference/next-config-js/turbopack)
- [App Router](https://nextjs.org/docs/app)
### iOS 24+ Design Guidelines:
- [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/)
- [iOS Design Patterns](https://developer.apple.com/design/resources/)
---
## ⚠️ Важные замечания
1. **Vite vs Turbopack:**
- Next.js 16 уже использует Turbopack, который быстрее Vite
- Рекомендуется использовать Turbopack (встроен в Next.js)
- Если нужен чистый Vite, можно использовать Vite + React, но потеряете SSR
2. **Material UI 3 Web Components:**
- Это Web Components, не React компоненты
- Нужны wrapper компоненты для использования в React
- Альтернатива: использовать React версию Material UI, но она не Material 3
3. **Bottom Navigation:**
- На десктопе можно показывать sidebar вместо bottom bar
- Адаптация под разные экраны обязательна
4. **Цвета:**
- Использовать цвета из landing_site как основу
- Адаптировать под iOS 24+ стиль (blur, rounded corners)
---
**Дата начала:** _______________
**Ожидаемая дата завершения:** _______________
**Ответственный:** _______________