Files
evening_detective_frontend/AGENTS.md
T
2026-08-31 01:33:24 +07:00

105 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md — Вечерний детектив (фронтенд)
Правила работы агента над этим репозиторием. Читай целиком перед началом любой задачи.
Онлайн-детективная игра: команды проходят «дело» — сценарий из точек, дверей, ключей и улик.
## 1. Стек и команды
- **Стек:** Vue 3.5 (`<script setup lang="ts">`), Vite 8, Pinia 3, Vue Router 5, Naive UI (тёмная тема), @vicons, axios.
- **API:** клиенты генерируются из `proto/main.proto``src/api/generated/`.
| Команда | Назначение |
|---|---|
| `npm run dev` | dev-сервер (Vite, `--host`) |
| `npm run type-check` | проверка типов (vue-tsc) |
| `npm run lint` | ESLint с автофиксами |
| `npm run lint:css` | Stylelint (алфавитный порядок свойств) |
| `npm run format` | Prettier (`src/`) |
| `npm run build` | type-check + сборка |
| `npm run proto:gen` | генерация API-клиентов из proto (после изменения proto) |
## 2. Структура и соглашения
- `src/views/*View.vue` — тонкие обёртки над страницами (только импорт и `<Page />`).
- `src/components/*Page.vue` — страницы (GamesPage, OfficePage, TeamStoryPage…).
- `src/components/*.vue` — переиспользуемые блоки (HeaderMenu, MessagePaper, PlaceBlock, IntroBlock…).
- `src/api/generated/**`**сгенерированный код, руками не редактировать.** Обновляется только через `npm run proto:gen`.
- `src/stores/`, `src/composables/`, `src/utils/`, `src/types/` — по назначению.
- Алиас `@/``src/`. Импорты: `@/components/...` для общих блоков, относительные для соседних файлов.
- UI-тексты — на русском.
## 3. Правила выполнения задач
1. **Сначала изучи.** Прочитай `package.json`, `tsconfig.app.json`, релевантные компоненты и существующие паттерны. Следуй им; не вводи новый стек, механизмы и зависимости без согласования с пользователем.
2. **Код:** `defineProps` с типами (`Object as PropType<T>`), типизированные `emit`, производные значения через `computed`. Не дублируй логику — выноси в `composables/`/`utils/`.
3. **Импорты:** сортируй (simple-import-sort): сторонние → `@/` → относительные. Удаляй неиспользуемые (unused-imports). Точки с запятой не ставим, одинарные кавычки, ширина 100 (Prettier).
4. **API:** только через сгенерированные клиенты (`getAuthClient()` и т.п.). После вызова проверяй `res.error` и показывай `message.error(res.error!)`. Поля из proto необязательны — бери с `!` как в существующем коде.
5. **Ошибки и состояния:** используй `useMessage()` из naive-ui; загрузку — простым `ref` + асинхронная функция (существующий паттерн), поллинг — `useSimplePolling`.
6. **Стили:** `scoped`, свойства по алфавиту (stylelint). Не добавляй новые цвета хардкодом — только палитра из раздела 4.
7. **Адаптивность:** мобильная вёрстка по умолчанию, брейкпоинт `@media (width >= 1024px)` (существующий паттерн). Скрывай скроллбары как `.center-block-custom`.
8. **Проверки перед сдачей (всегда):** `npm run type-check``npm run lint``npm run lint:css`. При затрагивании сборки — `npm run build`. Сообщи в ответе, какие проверки прошли.
9. **Запрещено:** `git commit` и `git push` (глобальное правило). Не переписывай чужой код без необходимости — минимальные целевые изменения.
## 4. Правила дизайна (канон «бумажного детектива»)
Стилистика проекта — тёмный «кабинет сыщика»: тёмный фон, «бумажные листы дел» с текстурой и шрифтом печатной машинки, бронзовые/золотые акценты, зелёный акцент интерактива.
### 4.1 Палитра (использовать только эти значения)
| Роль | Значение |
|---|---|
| Фон страницы | `#111` |
| Панели / карточки / блоки | `#222` (border-radius: 10px) |
| Основной текст | `#eee` |
| Вторичный текст (подписи, служебное) | `#aaa`, `#777` |
| Акцент hover/active | `#63e2b7` |
| Бронза (заголовки на бумаге, PDF-ссылки) | `--second-color: rgb(97 74 22)` |
| Золото (ключи, «требуемые ключи») | `gold` |
| Кнопки-действия на бумаге | текст `#bfa07d`, фон — текстура `belt.png` |
| Подписи улик/приложений | `burlywood` |
| Текст на бумажном листе | `black` |
### 4.2 Типографика
- **UI (формы, панели, навигация):** системный стек из `base.css`, 15px.
- **Бумажные листы дел:** `font-family: 'font_old_typer'` (шрифт подключён в `main.css`, файл `src/assets/fonts/a_OldTyper.ttf`). Контент — 18px, заголовок вступления — 26px с `letter-spacing: 3px`.
- Никогда не используй `font_old_typer` для UI-элементов (кнопки, формы, меню).
### 4.3 Бумажный лист (компонент MessagePaper)
Контент дел (вступление, точки, приложения) оборачивается в `MessagePaper`:
- Фон — текстура `paper.jpg` (`background-size: cover`), тень `0 0 5px black`, слои-подложки с поворотами `rotate(-3deg)` / `rotate(2deg)`.
- Разделители — пунктирные `hr`: `border: dashed 1px` (на бумаге — `black`, в тёмных панелях — `#eee`).
- **«Фотографии»** (картинка точки, картинки-улики): подложка с текстурой `paper_white.jpg`, паддинг 7px, `transform: rotate(-3deg)`, тень `0 3px 15px rgb(98 98 98)`, `cursor: zoom-in`, клик — просмотр в `n-modal` + `n-card`.
- **Улики-картинки в потоке текста:** блок `float: right`, текст обтекает; контейнер — `display: flow-root` (BFC, чтобы не наезжало на двери).
- **Кнопки действий («двери»):** фон `belt.png` (`background-size: cover`), текст `#bfa07d`, `border-radius: 5px`, inline-block, паддинг `5px 12px`.
- **Сворачивание листа:** иконка `collapse.png` (45×28), развёрнутый лист — `rotate(-180deg)`.
### 4.4 Компоненты и иконки
- UI-контролы — только naive-ui (`n-*`): тёмная тема задана в `App.vue` (`NConfigProvider :theme="darkTheme"`). Не стилизуй нативные `<input>/<button>`.
- Иконки — `@vicons` через обёртку `<Icon>` из `@vicons/utils`, размер через `size` (например `<Icon size="28"><MenuOutlined /></Icon>`).
- Модальные окна просмотра — `n-modal` + `n-card`, ширина `min(94vw, 1200px)`, `role="dialog" aria-modal="true"`.
### 4.5 Раскладка страниц
- Фиксированный `HeaderMenu` сверху, высота 70px; контент — контейнер `.center-block-custom` (`margin-top: 70px`, высота `calc(100dvh - 70px)`, скрытый скроллбар).
- Ширина контента: `.width700` — бумажные листы/дела, `.width1200` — списки и таблицы.
- Карточки списков (игры, сценарии): фон `#222`, `border-radius: 10px`, hover — `color: #63e2b7` + `cursor: pointer`.
- Интерактивные блоки-«листы» в редакторе: `.place-block-hover` — hover-рамка `1px solid #63e2b7`.
### 4.6 Поведение и состояния
- Hover интерактивных элементов — только `#63e2b7` (не изобретай новые цвета).
- Заголовки и служебные подписи — вторичные цвета палитры (`#aaa`/`#777`), без ярких акцентов.
- Новые цвета/токены добавлять только через `src/assets/base.css` в `:root` (существующие: `--main-color`, `--second-color`, `--main-back-color`, `--main-back-item-color`) — и только если без них нельзя обойтись палитрой.
## 5. Чек-лист перед сдачей
1. ✅ Соблюдены соглашения структуры и импортов (разделы 2–3).
2. ✅ Использована только палитра и стилистика раздела 4.
3. ✅ Адаптивность и скролл-контейнеры как в существующих страницах.
4.`npm run type-check`, `npm run lint`, `npm run lint:css` — без ошибок (отчёт в ответе).
5. ✅ Сгенерированный код не тронут; git commit/push не выполнялись.