# Conventions ## Must - Использовать Biome: `npm run lint`; табы и двойные кавычки определяет `biome.json`. - Для type-only импортов использовать `import type`; не использовать `enum` и `namespace`. - UI-строки хранить в `src/shared/i18n/locales/ru.ts` и получать через `useTranslation()`. - Zod-схемы не содержат пользовательских строк: использовать `validationMessage(key)` из `src/shared/i18n/zod.ts`. - Публичный импорт слайса идёт через его `index.ts`. - Тесты лежат рядом с исходником как `*.test.tsx`. - Зависимости используют exact versions; не добавлять semver ranges. - Полный локальный gate: `npm run verify`. Pre-commit запускает staged formatting, OpenAPI check и FSD dependency checks; commit message должен следовать Conventional Commits. ## File roles - `Component.tsx` - контейнер или публичный компонент; для data-driven pages вызывает page VM hook и выбирает top-level state view. - `Component.vm.ts` - hook с данными, действиями, state selection и derived presentation data. - `Component.view.tsx` - чистое представление: получает props, рендерит JSX и не вызывает data/auth/router/navigation/VM hooks. - `Component.types.ts` - props и локальные типы. - `Component.module.css` - локальные стили. Большие view files дробить по ответственности. Если section/state можно самостоятельно назвать, вынести его в соседний presentation component вместо накопления смысловой нагрузки в одном файле.