diff --git a/RULES.md b/RULES.md index b8efe1e..254ab16 100644 --- a/RULES.md +++ b/RULES.md @@ -15,6 +15,7 @@ - **Zustand** — глобальное состояние. - **i18next (i18n)** — локализация всех пользовательских текстов. - **Vitest** — тестирование. +- **clsx** — конкатенация CSS‑классов. - **PostCSS Modules** — изоляция стилей. - **Mobile First** — подход к адаптивной верстке. @@ -596,6 +597,86 @@ src/ +# Компоненты + +Раздел описывает правила создания UI‑компонентов. Эти правила обязательны для всех слоёв FSD: `app`, `screens`, `layouts`, `widgets`, `features`, `entities`, `shared`. + +## Базовая структура компонента + +Минимальный набор файлов: компонент, стили, типы и публичный экспорт. + +```text +container/ +├── styles/ +│ └── container.module.scss +├── types/ +│ └── container.interface.ts +├── container.ui.tsx +└── index.ts +``` + +## Пример базового компонента + +`styles/container.module.scss` +```scss +.root {} +``` +В CSS Modules использование имени класса **.root** — это общепринятое соглашение (best practice) + +`types/container.interface.ts` +```ts +import type { HTMLAttributes } from 'react' + +/** + * Параметры контейнера. + */ +export interface ContainerProps extends HTMLAttributes {} +``` +Интерфес параметров компонента всегда наследует свойства своего тега: div, button, итд.. + +`container.ui.tsx` + +```tsx +import type { FC } from 'react' +import { cl } from 'clsx' +import type { ContainerProps } from './types/container.interface' +import styles from './styles/container.module.scss' + +/** + * Контейнер с адаптивной максимальной шириной. + * + * Используется для: + * - ограничения ширины контента + * - центрирования содержимого + * - построения адаптивной сетки страницы + */ +export const Container: FC = ({ className, ...htmlAttr }) => { + return ( +
+ Container... +
+ ) +} +``` + +- Компонент объявляется через `const` и экспортируется именованно. +- Пропсы деструктурируются в сигнатуре; если их больше двух — деструктуризацию переносим в тело компонента. +- Из пропсов отдельно извлекаются `className` и `...htmlAttr`, чтобы корректно объединять классы и прокидывать остальные атрибуты. +- `cl` — короткое имя функции для конкатенации CSS‑классов. +- `FC<>` используется для декларации `children`. + +`index.ts` + +```ts +export { Container } from './container.ui' +``` + + +## Вложенные (дочерние) компоненты + +Если для реализации функционала нужны компоненты, которые используются только внутри текущего компонента, создавайте их как вложенные в папке `ui/`. Такие компоненты не экспортируются наружу и используются только локально. + +Вложенные компоненты подчиняются тем же правилам по структуре, именованию и стилю (включая папку `styles/` для их стилей). diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..6375196 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,6 @@ +[build] +command = "npm run build" +publish = ".vitepress/dist" + +[build.environment] +NODE_VERSION = "24"