diff --git a/AGENTS.md b/AGENTS.md index d419e69..c47847f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,6 +33,7 @@ This document defines how AI agents should work with the WhatIDo codebase. Follo ### 3. File Uploads - **Multer configs**: `upload` (images only), `adminUpload` (wider allowed ext), `uploadBackup` (restore) +- **Видео в интерфейсе**: `mp4`/`m4v`/`webm`/`ogv` играются в модалке `#videoModal` в `journal.html` (`data-video` в `filesHTML`); остальные видео (`mov`, `mkv`, `avi`, …) остаются обычными ссылками на скачивание. Отдача — `GET /api/files/:token?play=1` **inline** с `Accept-Ranges`; без `?play=1` файл по-прежнему уходит как `attachment`, чтобы старые ссылки не поменяли поведение - **Limits**: `UPLOAD_FILE_LIMIT_MB` per file (default 50), `UPLOAD_TOTAL_LIMIT_MB` per entry (default 200) — both env-driven; `UPLOAD_REQUEST_TIMEOUT_MS` overrides the auto-computed request timeout. The frontend reads the two MB values from `GET /api/public-settings` (`upload_file_limit_mb`, `upload_total_limit_mb`) — do not hardcode them again in `public/js/index.js` - **Staging**: Multer always writes to `uploads/` (`timestamp-random.ext`); a global `res.on('finish')` hook persists each uploaded file through `storage.persist` on successful responses (only when `STORAGE_DRIVER=s3`) - **HEIC**: Auto-converted to JPEG via `heic-convert` @@ -41,7 +42,8 @@ This document defines how AI agents should work with the WhatIDo codebase. Follo ### 3a. Storage (`storage.js`) - **Drivers**: `local` (default, files in `uploads/`) and `s3` (S3-compatible: SeaweedFS by default, MinIO via `docker-compose.minio.yml`) - **Keys are stable**: DB stores `/uploads/`; S3 object keys are the same `` (plus `.originals/`). Never change key format — it would break existing DB rows and URLs -- **API**: `put`, `putFile`, `head`, `exists`, `sizeOf`, `getStream`, `getBuffer`, `del`, `copyObject`, `listAll`, `localize`, `persist`, `streamTo`, `downloadAll`, `uploadTree`, `ensureBucket`, `usage`, `pruneCache` +- **API**: `put`, `putFile`, `head`, `exists`, `sizeOf`, `getStream`, `getBuffer`, `getRange`, `del`, `copyObject`, `listAll`, `localize`, `persist`, `streamTo`, `streamRangeTo`, `downloadAll`, `uploadTree`, `ensureBucket`, `usage`, `pruneCache` +- **Диапазоны**: `getRange(key, start, end)` и `streamRangeTo(res, key, start, end, opts)` отдают `206` с `Content-Range`/`Accept-Ranges` — только для медиа, разбор `Range` на стороне сервера (`parseByteRange`) - **Rules**: never call `fs.*` on `uploads/` directly in request/worker code — use `storage.*`. `safeUnlink` is the only deletion helper (local + remote, idempotent) - **Read path**: `STORAGE_LOCAL_FALLBACK=1` prefers a local file when it still exists (covers in-flight uploads and partial migration); otherwise the app streams the object from S3 - **Cache**: `.thumbs` (WebP miniatures) and `.cache` (originals localized for sharp/zip) live inside `uploads/` and are pruned hourly (`STORAGE_CACHE_MAX_AGE_HOURS`) diff --git a/PRD.md b/PRD.md index 9468c64..5d1795e 100644 --- a/PRD.md +++ b/PRD.md @@ -47,6 +47,7 @@ | ENT-6 | Pagination (limit/offset) + total count | Must | | ENT-7 | Anti-spam: min interval between entries per student (configurable, default 30 min) | Must | | ENT-8 | Files attached to entry: upload (max 10 files, per-file and total size limits from `UPLOAD_FILE_LIMIT_MB`/`UPLOAD_TOTAL_LIMIT_MB`), download by token | Must | +| ENT-9 | Video attachments: `mp4`/`m4v`/`webm`/`ogv` playable inline in the journal with seeking (Range), other video formats download-only | Should | ### 2.4 Files Management (Centralized) | ID | Requirement | Priority | @@ -175,7 +176,7 @@ branches | GET | `/api/files` | Admin | All files (filters) | | GET | `/api/files/detached` | Admin | Detached files | | POST | `/api/files/:id/detach` | Admin | Detach file | -| GET | `/api/files/:token` | Public | Download file by token | +| GET | `/api/files/:token` | Public | Download file by token; `?play=1` serves `mp4`/`m4v`/`webm`/`ogv` inline with `Range` support | | GET | `/api/groups` | Public | List groups | | POST/PUT/DELETE | `/api/groups` | Admin | CRUD groups | | GET/POST | `/api/groups/:id/photos` | Admin | Group photo chronicle | diff --git a/README.md b/README.md index a496f4e..e7306d1 100644 --- a/README.md +++ b/README.md @@ -528,6 +528,7 @@ node api.smoketest.js # сквозная проверка API (нужен - **CORS отключён** — кросс-доменные запросы к API запрещены. - **Rate limiting** по IP на публичные роуты: `POST /api/entries` — 10 запросов / 15 мин, загрузка файлов и share-ссылки — 300 / 15 мин. - **Загрузки** ограничены: суммарно на запись и на файл — лимиты из `UPLOAD_TOTAL_LIMIT_MB` / `UPLOAD_FILE_LIMIT_MB` (по умолчанию 200 МБ и 50 МБ); заблокированы опасные расширения (`.html`, `.js`, `.svg`, `.xml`, `.exe` и др.); SVG не отдаётся inline. +- **Видеофайлы** (`.mp4`, `.m4v`, `.webm`, `.ogv`) играются прямо в журнале: `GET /api/files/:token?play=1` отдаёт файл **inline** с `Accept-Ranges: bytes` и поддержкой `Range` (`206`), поэтому перемотка работает без скачивания целиком. Остальные форматы (`.mov`, `.mkv`, `.avi` и пр.) браузер не играет — они остаются ссылками на скачивание. - **Restore** проходит полную валидацию данных бэкапа; удаление файлов ограничено каталогом `uploads/`. - **Заголовки**: `helmet` — `X-Frame-Options`, `nosniff`, HSTS, `Referrer-Policy`. - **Порт БД** 5432 наружу не публикуется (доступ только внутри docker-сети). diff --git a/instructions/TODO.md b/instructions/TODO.md new file mode 100644 index 0000000..1d080dd --- /dev/null +++ b/instructions/TODO.md @@ -0,0 +1,92 @@ +# TODO — Инструкция по системе WhatIDo (со скриншотами) + +Статус: `☐` todo · `☑` готово · `◐` в работе + +Цель: папка `instructions/` с полной русскоязычной инструкцией для администратора/преподавателя, +**каждый раздел проиллюстрирован реальными скриншотами живого стенда** (стенд поднят, +в БД 358 записей, 151 ученик, 22 группы, 72 модуля, 35 ссылок — данные реальные, не моки). + +## Часть 0. Подготовка + +- [x] 0.1 Поднять стенд: `docker compose ps` — app на `http://localhost:3003` +- [x] 0.2 Проверить доступность `GET /` → 200, `GET /api/public-settings` → `system_name=KIBERone` +- [x] 0.3 Получить учётку админа (`admin` / `ADMIN_PASSWORD`), `POST /api/auth/login` → токен +- [x] 0.4 Инвентаризация всех страниц `public/*.html` (меню, ID, русские подписи, роли) +- [x] 0.5 Снять инвентарь данных в БД, чтобы скриншоты были непустыми +- [x] 0.6 Создать папку `instructions/` и этот TODO + +## Часть 1. Публичная часть — то, что видит ученик + +- [x] 1.1 `index.html` — форма «Что мы узнали на занятии»: общий вид, шапка, футер +- [x] 1.2 Блок «Фото»: превью, кнопка «Камера», модалка камеры (снять/отмена) +- [x] 1.3 Блок «Файлы проекта»: выбор, вставка из буфера, список с размерами, очистка +- [x] 1.4 Блок полей: ФИО, Группа, Тема модуля, «Что сделал» (+ автодополнение) +- [x] 1.5 Кнопка «Отправить» + панель успеха `#sentPanel` с таймером антиспама +- [x] 1.6 Ошибки/повторная отправка, тосты + +## Часть 2. Вход и оболочка админки + +- [x] 2.1 `login.html` — форма входа (логин, пароль, honeypot, ошибки) +- [x] 2.2 `admin.js` — сайдбар: логотип, user-box, две группы меню, версия +- [x] 2.3 Выпадающий список уведомлений в сайдбаре + бейдж + +## Часть 3. Разделы по порядку (основное → администрирование) + +- [x] 3.1 **Дашборд** — плитки статистики, динамика за 14 дней, последние записи, активные группы, топ учеников, быстрые действия +- [x] 3.2 **Журнал** — фильтры, список/карточки, пагинация, карточка записи +- [x] 3.3 Журнал — модалка «Редактирование записи» (+ `✨` ИИ-исправление, `ИИ предлагает вариант`) +- [x] 3.4 Журнал — «Улучшение фото»: сравнение до/после, слайдеры, режимы ИИ, история версий +- [x] 3.5 Журнал — модалка «Создать ссылку» +- [x] 3.6 **Ученики** — список, фильтры, пагинация, кнопки действий +- [x] 3.7 Ученики — пакетное добавление, прикрепление к группе +- [x] 3.8 Ученики — «Данные профиля» (все поля отчёта) +- [x] 3.9 Ученики — «Экспорт отчёта» (ZIP) +- [x] 3.10 **Группы** — карточки, расписание, филиал/тутор +- [x] 3.11 Группы — галерея фото группы (загрузка, обложка, порядок, правка) +- [x] 3.12 Группы — «Архив файлов группы» (ZIP-выгрузка) +- [x] 3.13 **Фото** — все фото, фильтры по источнику, карточки +- [x] 3.14 **Файлы** — прикреплённые / откреплённые +- [x] 3.15 **Ссылки** — список share-ссылок, бейджи, создание +- [x] 3.16 **Корзина** — восстановление, «помеченные на удаление» +- [x] 3.17 **Темы модулей** — список, модалка модуля, пакетное добавление +- [x] 3.18 **Филиалы** — CRUD +- [x] 3.19 **Пользователи** — таблица, модалка, мультивыбор филиалов +- [x] 3.20 **Воркер ИИ** — статус, очередь, последние проверки, фото-задания, ошибки +- [x] 3.21 **Аудит** — таблица действий, модалка «Детали действия» с диффом +- [x] 3.22 **Блокировки** — таблица IP, модалка ручного бана +- [x] 3.23 **Уведомления** — полная история, фильтр, «прочитать все», «очистить всё» +- [x] 3.24 **Настройки** — 13 секций (система, стек, брендинг, антиспам, ссылки, футер, фото, фото-ИИ, уведомления, ИИ, бэкапы, корзина, блокировки) + +## Часть 4. Публичные страницы по ссылкам + +- [x] 4.1 `share.html` (`/s/`) — карточки записей, фото группы, cookie-баннер, лайтбокс +- [x] 4.2 `share.html` — защита паролем `#passwordModal` +- [x] 4.3 `report.html` (`/r/`) — публичный отчёт: hero, «Обо мне», хроника, работы, файлы, фото, контакты +- [x] 4.4 `error.html` — страница ошибки 404 + +## Часть 5. Сборка инструкции + +- [x] 5.1 Скриншоты → `instructions/img/` с нумерацией +- [x] 5.2 `instructions/README.md` — оглавление, роли, вход, быстрый старт +- [x] 5.3 Постраничные файлы инструкции `01-…` … `05-…` с вставленными картинками +- [x] 5.4 `instructions/CHEATSHEET.md` — краткая шпаргалка + горячие клавиши/API +- [x] 5.5 Проверка: все ссылки на изображения существуют, нет битых `.md` + +## Итог + +| Артефакт | Описание | +|---|---| +| `instructions/README.md` | Оглавление + обзор системы + порядок работы | +| `instructions/01-public-form.md` | Публичная форма ученика (пошагово) | +| `instructions/02-login-shell.md` | Вход, сайдбар, уведомления | +| `instructions/03-dashboard.md` | Дашборд | +| `instructions/04-journal.md` | Журнал: фильтры, редактирование, фото-ИИ, ссылки | +| `instructions/05-students.md` | Ученики: профили, группы, экспорт | +| `instructions/06-groups-photos-files.md` | Группы, Фото, Файлы | +| `instructions/07-links-trash.md` | Ссылки, Корзина | +| `instructions/08-admin-sections.md` | Модули, Филиалы, Пользователи, Блокировки | +| `instructions/09-worker-audit-notifications.md` | Воркер ИИ, Аудит, Уведомления | +| `instructions/10-settings.md` | Настройки: все 13 секций | +| `instructions/11-share-report-pages.md` | Публичные `/s/` и `/r/` страницы | +| `instructions/CHEATSHEET.md` | Шпаргалка | +| `instructions/img/*.png` | Скриншоты | diff --git a/instructions/img/01-01-form-main.png b/instructions/img/01-01-form-main.png new file mode 100644 index 0000000..17002d5 Binary files /dev/null and b/instructions/img/01-01-form-main.png differ diff --git a/instructions/img/01-02-form-camera.png b/instructions/img/01-02-form-camera.png new file mode 100644 index 0000000..f2929a4 Binary files /dev/null and b/instructions/img/01-02-form-camera.png differ diff --git a/instructions/img/01-03-form-photo.png b/instructions/img/01-03-form-photo.png new file mode 100644 index 0000000..b70b317 Binary files /dev/null and b/instructions/img/01-03-form-photo.png differ diff --git a/instructions/img/01-04-form-filled.png b/instructions/img/01-04-form-filled.png new file mode 100644 index 0000000..3b29e32 Binary files /dev/null and b/instructions/img/01-04-form-filled.png differ diff --git a/instructions/img/01-05-form-sent.png b/instructions/img/01-05-form-sent.png new file mode 100644 index 0000000..bc03089 Binary files /dev/null and b/instructions/img/01-05-form-sent.png differ diff --git a/instructions/img/01-06-form-cooldown.png b/instructions/img/01-06-form-cooldown.png new file mode 100644 index 0000000..57ccf68 Binary files /dev/null and b/instructions/img/01-06-form-cooldown.png differ diff --git a/instructions/img/02-01-login.png b/instructions/img/02-01-login.png new file mode 100644 index 0000000..2fe3400 Binary files /dev/null and b/instructions/img/02-01-login.png differ diff --git a/instructions/img/02-02-login-error.png b/instructions/img/02-02-login-error.png new file mode 100644 index 0000000..6070222 Binary files /dev/null and b/instructions/img/02-02-login-error.png differ diff --git a/instructions/img/02-03-dashboard-after-login.png b/instructions/img/02-03-dashboard-after-login.png new file mode 100644 index 0000000..2ca25cc Binary files /dev/null and b/instructions/img/02-03-dashboard-after-login.png differ diff --git a/instructions/img/02-04-sidebar-notify.png b/instructions/img/02-04-sidebar-notify.png new file mode 100644 index 0000000..6023942 Binary files /dev/null and b/instructions/img/02-04-sidebar-notify.png differ diff --git a/instructions/img/03-01-dashboard.png b/instructions/img/03-01-dashboard.png new file mode 100644 index 0000000..3abbd65 Binary files /dev/null and b/instructions/img/03-01-dashboard.png differ diff --git a/instructions/img/04-01-journal-list.png b/instructions/img/04-01-journal-list.png new file mode 100644 index 0000000..f8cda26 Binary files /dev/null and b/instructions/img/04-01-journal-list.png differ diff --git a/instructions/img/04-02-journal-cards.png b/instructions/img/04-02-journal-cards.png new file mode 100644 index 0000000..029079e Binary files /dev/null and b/instructions/img/04-02-journal-cards.png differ diff --git a/instructions/img/04-03-journal-edit.png b/instructions/img/04-03-journal-edit.png new file mode 100644 index 0000000..5b5f305 Binary files /dev/null and b/instructions/img/04-03-journal-edit.png differ diff --git a/instructions/img/04-04-journal-ai.png b/instructions/img/04-04-journal-ai.png new file mode 100644 index 0000000..8e7df9e Binary files /dev/null and b/instructions/img/04-04-journal-ai.png differ diff --git a/instructions/img/04-05-journal-enhance.png b/instructions/img/04-05-journal-enhance.png new file mode 100644 index 0000000..cd58113 Binary files /dev/null and b/instructions/img/04-05-journal-enhance.png differ diff --git a/instructions/img/04-06-journal-link-modal.png b/instructions/img/04-06-journal-link-modal.png new file mode 100644 index 0000000..b4f66b5 Binary files /dev/null and b/instructions/img/04-06-journal-link-modal.png differ diff --git a/instructions/img/04-07-journal-link-created.png b/instructions/img/04-07-journal-link-created.png new file mode 100644 index 0000000..cade607 Binary files /dev/null and b/instructions/img/04-07-journal-link-created.png differ diff --git a/instructions/img/05-01-students.png b/instructions/img/05-01-students.png new file mode 100644 index 0000000..e3163e7 Binary files /dev/null and b/instructions/img/05-01-students.png differ diff --git a/instructions/img/05-02-students-batch.png b/instructions/img/05-02-students-batch.png new file mode 100644 index 0000000..84c8d17 Binary files /dev/null and b/instructions/img/05-02-students-batch.png differ diff --git a/instructions/img/05-03-students-attach.png b/instructions/img/05-03-students-attach.png new file mode 100644 index 0000000..0b0fa10 Binary files /dev/null and b/instructions/img/05-03-students-attach.png differ diff --git a/instructions/img/05-04-students-profile.png b/instructions/img/05-04-students-profile.png new file mode 100644 index 0000000..a48c864 Binary files /dev/null and b/instructions/img/05-04-students-profile.png differ diff --git a/instructions/img/05-05-students-export.png b/instructions/img/05-05-students-export.png new file mode 100644 index 0000000..fe5bbac Binary files /dev/null and b/instructions/img/05-05-students-export.png differ diff --git a/instructions/img/06-01-groups.png b/instructions/img/06-01-groups.png new file mode 100644 index 0000000..75d88ac Binary files /dev/null and b/instructions/img/06-01-groups.png differ diff --git a/instructions/img/06-02-groups-photos.png b/instructions/img/06-02-groups-photos.png new file mode 100644 index 0000000..3348618 Binary files /dev/null and b/instructions/img/06-02-groups-photos.png differ diff --git a/instructions/img/06-03-groups-files-zip.png b/instructions/img/06-03-groups-files-zip.png new file mode 100644 index 0000000..a2bfd37 Binary files /dev/null and b/instructions/img/06-03-groups-files-zip.png differ diff --git a/instructions/img/06-04-photos.png b/instructions/img/06-04-photos.png new file mode 100644 index 0000000..48c6b84 Binary files /dev/null and b/instructions/img/06-04-photos.png differ diff --git a/instructions/img/06-05-files.png b/instructions/img/06-05-files.png new file mode 100644 index 0000000..3221014 Binary files /dev/null and b/instructions/img/06-05-files.png differ diff --git a/instructions/img/06-06-files-detached.png b/instructions/img/06-06-files-detached.png new file mode 100644 index 0000000..c9a1fe9 Binary files /dev/null and b/instructions/img/06-06-files-detached.png differ diff --git a/instructions/img/07-01-links.png b/instructions/img/07-01-links.png new file mode 100644 index 0000000..d3e139f Binary files /dev/null and b/instructions/img/07-01-links.png differ diff --git a/instructions/img/07-02-links-edit.png b/instructions/img/07-02-links-edit.png new file mode 100644 index 0000000..f9d7364 Binary files /dev/null and b/instructions/img/07-02-links-edit.png differ diff --git a/instructions/img/07-03-trash.png b/instructions/img/07-03-trash.png new file mode 100644 index 0000000..5ffca87 Binary files /dev/null and b/instructions/img/07-03-trash.png differ diff --git a/instructions/img/07-04-trash-pending.png b/instructions/img/07-04-trash-pending.png new file mode 100644 index 0000000..6d8d8bc Binary files /dev/null and b/instructions/img/07-04-trash-pending.png differ diff --git a/instructions/img/08-01-modules.png b/instructions/img/08-01-modules.png new file mode 100644 index 0000000..7fc8cf1 Binary files /dev/null and b/instructions/img/08-01-modules.png differ diff --git a/instructions/img/08-02-modules-modal.png b/instructions/img/08-02-modules-modal.png new file mode 100644 index 0000000..22e2a90 Binary files /dev/null and b/instructions/img/08-02-modules-modal.png differ diff --git a/instructions/img/08-03-branches.png b/instructions/img/08-03-branches.png new file mode 100644 index 0000000..0e4fbc2 Binary files /dev/null and b/instructions/img/08-03-branches.png differ diff --git a/instructions/img/08-04-branches-modal.png b/instructions/img/08-04-branches-modal.png new file mode 100644 index 0000000..3e1b714 Binary files /dev/null and b/instructions/img/08-04-branches-modal.png differ diff --git a/instructions/img/08-05-users.png b/instructions/img/08-05-users.png new file mode 100644 index 0000000..f091716 Binary files /dev/null and b/instructions/img/08-05-users.png differ diff --git a/instructions/img/08-06-users-modal.png b/instructions/img/08-06-users-modal.png new file mode 100644 index 0000000..691aaea Binary files /dev/null and b/instructions/img/08-06-users-modal.png differ diff --git a/instructions/img/08-07-bans.png b/instructions/img/08-07-bans.png new file mode 100644 index 0000000..bd656ee Binary files /dev/null and b/instructions/img/08-07-bans.png differ diff --git a/instructions/img/08-08-bans-modal.png b/instructions/img/08-08-bans-modal.png new file mode 100644 index 0000000..2415f04 Binary files /dev/null and b/instructions/img/08-08-bans-modal.png differ diff --git a/instructions/img/09-01-worker.png b/instructions/img/09-01-worker.png new file mode 100644 index 0000000..1896fbf Binary files /dev/null and b/instructions/img/09-01-worker.png differ diff --git a/instructions/img/09-02-worker-ai-detail.png b/instructions/img/09-02-worker-ai-detail.png new file mode 100644 index 0000000..7cc0f17 Binary files /dev/null and b/instructions/img/09-02-worker-ai-detail.png differ diff --git a/instructions/img/09-03-audit.png b/instructions/img/09-03-audit.png new file mode 100644 index 0000000..e20090e Binary files /dev/null and b/instructions/img/09-03-audit.png differ diff --git a/instructions/img/09-04-audit-details.png b/instructions/img/09-04-audit-details.png new file mode 100644 index 0000000..2079def Binary files /dev/null and b/instructions/img/09-04-audit-details.png differ diff --git a/instructions/img/09-05-notifications.png b/instructions/img/09-05-notifications.png new file mode 100644 index 0000000..4cdcb4a Binary files /dev/null and b/instructions/img/09-05-notifications.png differ diff --git a/instructions/img/10-01-settings-system.png b/instructions/img/10-01-settings-system.png new file mode 100644 index 0000000..1e3eace Binary files /dev/null and b/instructions/img/10-01-settings-system.png differ diff --git a/instructions/img/10-02-settings-brand-share.png b/instructions/img/10-02-settings-brand-share.png new file mode 100644 index 0000000..85a2c88 Binary files /dev/null and b/instructions/img/10-02-settings-brand-share.png differ diff --git a/instructions/img/10-03-settings-form-photo.png b/instructions/img/10-03-settings-form-photo.png new file mode 100644 index 0000000..32d11c0 Binary files /dev/null and b/instructions/img/10-03-settings-form-photo.png differ diff --git a/instructions/img/10-04-settings-notify-bans.png b/instructions/img/10-04-settings-notify-bans.png new file mode 100644 index 0000000..8eb3a0b Binary files /dev/null and b/instructions/img/10-04-settings-notify-bans.png differ diff --git a/instructions/img/11-01-share-top.png b/instructions/img/11-01-share-top.png new file mode 100644 index 0000000..47427ff Binary files /dev/null and b/instructions/img/11-01-share-top.png differ diff --git a/instructions/img/11-02-share-photos.png b/instructions/img/11-02-share-photos.png new file mode 100644 index 0000000..bbb3d5c Binary files /dev/null and b/instructions/img/11-02-share-photos.png differ diff --git a/instructions/img/11-03-share-cards.png b/instructions/img/11-03-share-cards.png new file mode 100644 index 0000000..01a8468 Binary files /dev/null and b/instructions/img/11-03-share-cards.png differ diff --git a/instructions/img/11-04-share-password.png b/instructions/img/11-04-share-password.png new file mode 100644 index 0000000..8fab5c5 Binary files /dev/null and b/instructions/img/11-04-share-password.png differ diff --git a/instructions/img/11-05-share-unlocked.png b/instructions/img/11-05-share-unlocked.png new file mode 100644 index 0000000..a16d870 Binary files /dev/null and b/instructions/img/11-05-share-unlocked.png differ diff --git a/instructions/img/11-06-report-hero.png b/instructions/img/11-06-report-hero.png new file mode 100644 index 0000000..2e6f594 Binary files /dev/null and b/instructions/img/11-06-report-hero.png differ diff --git a/instructions/img/11-07-report-about.png b/instructions/img/11-07-report-about.png new file mode 100644 index 0000000..0b1ea68 Binary files /dev/null and b/instructions/img/11-07-report-about.png differ diff --git a/instructions/img/11-08-report-timeline.png b/instructions/img/11-08-report-timeline.png new file mode 100644 index 0000000..2bfab83 Binary files /dev/null and b/instructions/img/11-08-report-timeline.png differ diff --git a/instructions/img/11-09-report-works.png b/instructions/img/11-09-report-works.png new file mode 100644 index 0000000..ac73dcd Binary files /dev/null and b/instructions/img/11-09-report-works.png differ diff --git a/instructions/img/11-10-report-files.png b/instructions/img/11-10-report-files.png new file mode 100644 index 0000000..ef235cf Binary files /dev/null and b/instructions/img/11-10-report-files.png differ diff --git a/instructions/img/11-11-report-contact.png b/instructions/img/11-11-report-contact.png new file mode 100644 index 0000000..6dda1a7 Binary files /dev/null and b/instructions/img/11-11-report-contact.png differ diff --git a/instructions/img/11-12-error404.png b/instructions/img/11-12-error404.png new file mode 100644 index 0000000..9d38e19 Binary files /dev/null and b/instructions/img/11-12-error404.png differ diff --git a/public/admin.css b/public/admin.css index 59b8a94..ea8791f 100644 --- a/public/admin.css +++ b/public/admin.css @@ -215,6 +215,15 @@ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;b .modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:100;display:none;align-items:center;justify-content:center} .modal-overlay.open{display:flex} .modal-overlay > img{max-width:90%;max-height:90dvh;border-radius:var(--radius)} +#videoModal{background:rgba(0,0,0,.85)} +.video-modal{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:16px;width:min(1000px,94vw);max-height:94dvh;display:flex;flex-direction:column;gap:12px} +.video-head{display:flex;align-items:center;gap:12px;font-size:.85rem;color:var(--text)} +.video-head > span:first-child{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.video-dl{background:none;border:1px solid var(--border);border-radius:6px;padding:3px 10px;color:var(--muted);text-decoration:none;font-size:.75rem} +.video-dl:hover{color:var(--accent);border-color:var(--accent)} +.video-close{background:none;border:none;color:var(--muted);cursor:pointer;font-size:1.4rem;line-height:1;padding:0 4px} +.video-close:hover{color:var(--text)} +#videoPlayer{width:100%;max-height:78dvh;background:#000;border-radius:var(--radius);display:block} .edit-modal{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px;max-width:420px;width:90%;display:flex;flex-direction:column;gap:16px} .edit-modal h3{font-size:1.1rem;font-weight:600} .edit-modal label{font-size:.8rem;color:var(--muted);margin-bottom:4px} diff --git a/public/journal.html b/public/journal.html index fa86527..87ebd67 100644 --- a/public/journal.html +++ b/public/journal.html @@ -66,6 +66,17 @@ + +