# UI/UX-спецификация: персональный YouTube-клиент **Назначение:** передать coding agent вместе с основным техническим заданием. **Формат:** single-user self-hosted web app, в будущем PWA/mobile client. ## 1. Концепция Приложение должно ощущаться как персональная лента YouTube-подписок, но с нормальной категоризацией каналов и локальным хранением выбранных видео. Пользовательский сценарий: ```text Открыть приложение → выбрать категорию → увидеть последние видео каналов этой категории → смотреть через YouTube → при желании нажать "Скачать" → после загрузки видеть "На сервере" → дальше смотреть локальную копию через MeTube ``` Интерфейс не должен выглядеть как admin panel. Это consumer media UI. --- ## 2. Общий layout Desktop: ```text ┌──────────────────────────────────────────────────────────────────────┐ │ Header │ ├──────────────────────┬───────────────────────────────────────────────┤ │ Sidebar │ Main content │ │ │ │ │ Все видео │ Video feed │ │ Без категории │ │ │ На сервере │ │ │ │ │ │ КАТЕГОРИИ │ │ │ Linux │ │ │ Шахматы │ │ │ Научпоп │ │ │ │ │ │ Каналы │ │ │ Настройки │ │ └──────────────────────┴───────────────────────────────────────────────┘ ``` Sidebar: 220–260 px. Header: фиксированный сверху. Main content: responsive grid. Mobile: sidebar превращается в drawer/hamburger. --- ## 3. Визуальный стиль Тёмная тема по умолчанию. Рекомендуемые design tokens: ```text Background main #0F0F0F Surface #181818 Surface hover #272727 Border #303030 Primary text #F1F1F1 Secondary text #AAAAAA Accent #3EA6FF Success/local #2BA640 Warning/downloading #F5A623 Error #E53935 ``` Использовать CSS variables, а не раскидывать цвета по компонентам. Типографика: ```text Inter / Roboto / system-ui Page title 24px / 600 Section title 18px / 600 Video title 15–16px / 500 Metadata 12–14px Buttons 14px / 500 ``` --- ## 4. Header Пример: ```text ┌──────────────────────────────────────────────────────────────────────┐ │ ▶ MyTube 🔍 Поиск... ✓ 12 мин ⚙ │ └──────────────────────────────────────────────────────────────────────┘ ``` Слева: - логотип; - рабочее название `MyTube` или configurable app name. Центр: - поиск по локальной БД: video title + channel title. Справа: - sync indicator; - settings. Sync states: ```text ✓ Обновлено 12 мин назад ↻ Обновление... ⚠ Ошибка синхронизации ``` По клику на sync indicator: ```text Подписки: обновлены 20:11 Видео: обновлены 20:12 MeTube: доступен ``` --- ## 5. Sidebar Пример: ```text ● Все видео Без категории На сервере КАТЕГОРИИ 🐧 Linux ♟ Шахматы 🔬 Научпоп 🎮 Игры + Новая категория ──────────── Каналы Настройки ``` Активная категория должна иметь заметный, но спокойный selected state. `Все видео`, `Без категории`, `На сервере` — виртуальные категории. --- ## 6. Feed Route: ```text / ``` или: ```text /feed ``` Header выбранной категории: ```text Linux 24 канала Обновлено 12 минут назад [↻ Обновить] ``` Опциональные chips: ```text [Все] [На сервере] [Не скачаны] ``` Сортировка видео: ```text published_at DESC ``` --- ## 7. Video grid Responsive: ```text >= 1800 px → 5 columns >= 1400 px → 4 columns >= 1000 px → 3 columns >= 700 px → 2 columns mobile → 1 column ``` Рекомендуемый CSS: ```css grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); ``` --- ## 8. Video card Пример: ```text ┌────────────────────────────────────┐ │ │ │ THUMBNAIL │ │ 18:42 │ │ │ ├────────────────────────────────────┤ │ Linux Kernel 7.0 — What's New │ │ The Linux Experiment │ │ 2 часа назад │ │ │ │ [▶ Смотреть] [⬇ Скачать] │ └────────────────────────────────────┘ ``` Thumbnail: - aspect ratio 16:9; - duration badge справа снизу. Карточка содержит: - thumbnail; - title; - channel name; - publish time; - duration; - download/local state; - Watch; - Download. --- ## 9. Состояния скачивания ### Не скачано ```text [▶ Смотреть] [⬇ Скачать] ``` ### В очереди ```text [▶ Смотреть] [В очереди...] ``` ### Скачивается ```text [▶ Смотреть] [64%] ``` Дополнительно progress-line внизу thumbnail. ### Post-processing ```text [▶ Смотреть] [Обработка...] ``` ### На сервере ```text [▶ Смотреть] [✓ На сервере] ``` ### Ошибка ```text [▶ Смотреть] [⚠ Повторить] ``` Не показывать traceback. --- ## 10. Video page Route: ```text /video/:youtubeVideoId ``` Desktop: ```text ┌──────────────────────────────────────────────────────────────────┐ │ │ │ VIDEO PLAYER │ │ │ └──────────────────────────────────────────────────────────────────┘ Linux Kernel 7.0 — What's New The Linux Experiment 2 часа назад [⬇ Скачать] Источник: YouTube [Linux] [IT] ──────────────────────────────────────────────────────────────────── Описание видео... ``` Если local copy существует: ```text Источник: ● Локальная копия · mediaVM ``` и вместо YouTube iframe используется HTML5 `