11 KiB
title
| title |
|---|
| CSS |
CSS
Правила оформления и стилизации CSS-кода
-
Препроцессоры
Используй PostCSS и модули для стилизации. -
Архитектура написания стилей
Используй подход Mobile First
Используй CSS переменные для стилизации.
Используй Custom Media Queries для адаптивных стилей.
Используй BEM для именования классов.
Между каждым CSS-правилом (селектором) должен быть один пустой сброс строки, пример:.todo-list { max-width: 600px; padding: var(--space-3); @media (--md) { max-width: 800px; } } .todo-list__text { font-size: 18px; @media (--md) { font-size: 22px; } }Запрещено писать правила подряд без пустой строки:
/* Так делать нельзя! */ .todo-list { ... } .todo-list__text { ... } -
Методология именования классов
Использовать методологию BEM для именования классов.- Блок: kebab-case, пример
.user-bar { } - Елемент: kebab-case, соеденный с блоком двойным нижним подчеркиванием, пример
.user-bar__slide { } - Модификатор: kebab-case, отдельный самостоятельный класс, не соединяется с блоком/елементом, имя модификатора всегда начинается с нижнего подчеркивания, пример:
._red { }
- Блок: kebab-case, пример
-
Единицы измерения
Используйpxкак основная единица измирения, так-же допускается использовать остальные единицы измерения если того требует реализуемый дизайн. -
Импорт стилей
Стили компонента должны импортироваться только внутри соответствующего компонента.
Запрещено импортировать стили одного компонента в другой. Запрещено импортироватьcss переменныев файлы стилей, они доступны глобально. Запрещено импортироватьcustom mediaв файлы стилей, они доступны глобально. -
Переменные
Все значения переменных нужно писать в/shared/stylesили в Mantine ThemeProvider. Все что не является цветами, брекпоинтами, отступами, скруглением допускаются использоваться в компонентах. Обязательное создавай CSS перменные для:- "Цветов", пример:
--color-danger: red;. - "Брекпоинты", описываем в (Сustom media) пример:
@custom-media --md (min-width: 62em);. - "Отспупы (--space)", , пример:
--space-1: 4px;,--space-2: 8px;,--space-3: 12px;итд.. - "Скругление углов (--radius)", пример:
--radius-1: 4px;,--radius-2: 8px;,--radius-3: 12px;итд..
- "Цветов", пример:
-
Вложенность селекторов Запрещено использовать вложенность селекторов. Разрешено использовать вложенность только для:
- Псевдо-классов
:hover,:activeитд.. - Псевдо-елементов
::before,::after - Медиа запросов
@media - Классы модификаторы по методологии BEM Каждый вложенный селектор отделяется 1 пустой строкой.
- Псевдо-классов
-
Медиа запросы
Строго запрещено использовать@mediaбез вложения в селектор.
Строго запрещено использовать в теле@mediaлюбые селекторы.
Разрешено использовать только Custom Media Queries (например,@media (--md) {}).
Запрещено использовать любые произвольные значения breakpoints (например, max-width: 768px).
Пример как правильно писать @media.todo-list { max-width: 600px; padding: 24px; @media (--md) { max-width: 800px; } } .todo-list__text { font-size: 18px; @media (--md) { font-size: 22px; } }Пример как неправильно писать @media
// Медиа запрос не вложен в селектор @media (--md) { .todo-list { max-width: 600px; padding: 24px; } .todo-list__text { font-size: 18px; } } // Используется стандартный `min-width: 992px` вмето Custom Media Queries @media (min-width: 992px) { // Внутри @media запроса используются селекторы .todo-list { max-width: 600px; padding: 24px; } .todo-list__text { font-size: 18px; } } -
Глобальные стили и сбросы
Все глобальные стили (например, сбросы) должны располагаться в отдельном файле, например,src/app/styles/global.css. -
Использование Mantine и PostCSS
Для стандартных визуальных компонентов (кнопки, инпуты, layout, grid, notifications и т.д.) использовать только Mantine и его ThemeProvider. Запрещено использовать в Mantine компонентах его props/styling, вмето этого нужно добавлять кастомные стили PostCSS. Кастомные стили допускаются только в случае, если требуемый дизайн невозможно реализовать средствами Mantine.
При написании кастомных стилей стараться использовать переменные и токены Mantine, если это возможно. -
Порядок CSS-свойств
В стилях рекомендуется придерживаться логического порядка свойств:- Позиционирование (position, top, left, z-index и т.д.)
- Блочная модель (display, width, height, margin, padding и т.д.)
- Оформление (background, border, box-shadow и т.д.)
- Текст (font, color, text-align и т.д.)
- Прочее (transition, animation и т.д.)
-
Комментарии
В стилях запрещено использовать комментарии. -
Дублирования
Не дублировать стили между компонентами. Общие стили выносить в shared/styles или использовать переменные. -
Примеры кода стилей Пример как хорошо:
/* Блок BEM */ .user-bar { display: none; color: black; /* Медиа запрос custom media и отделяется 1 пустой строкой */ @media (--md) { display: flex; } } /* Елемент BEM отделяется 1 пустой строкой*/ .user-bar__button-next { background-color: #f0f0f0; /* Псевдо-класс отделяется 1 пустой строкой*/ &:hover { background-color: #e0e0e0; } /* Модификатор BEM отделяется 1 пустой строкой*/ &._blue { background-color: #2b2bbe; } /* Модификатор BEM отделяется 1 пустой строкой*/ &._green { background-color: #29c53d; } }Пример как плохо писать:
.user-bar { display: none; color: black; &__button { &_next { background-color: #f0f0f0; &:hover { background-color: #e0e0e0; } &._blue { background-color: #2b2bbe; } &._green { background-color: #29c53d; } } } } @media (min-width: 992px) { .user-bar { display: flex; } }
Чек лист для проверки стилизации.
- Используется PostCSS и CSS-модули для стилизации.
- Применён подход Mobile First.
- Именование классов строго по BEM:
- Модификатор — отдельный класс, начинается с нижнего подчёркивания (например,
._red,._active)
- Модификатор — отдельный класс, начинается с нижнего подчёркивания (например,
- Все CSS-переменные (цвета, брейкпоинты, отступы, скругления) определены только в
/shared/stylesили через Mantine ThemeProvider. - Для медиа-запросов используются только custom media переменные из
/shared/styles/media.css. - Соблюдается правила вложености селекторов.
- Соблюдается правила отступов селекторов.
- Глобальные стили (reset) вынесены в отдельный файл, остальные стили — модульные.
- Для стандартных UI-элементов используются только компоненты Mantine, кастомные стили — только при необходимости.
- В Mantine-компонентах не используются props/styling для стилизации, только PostCSS.
- Кастомные стили используют переменные и токены Mantine, если это возможно.
- В стилях нет комментариев.
- Стили компонента импортируются только внутри соответствующего компонента.
- Нет импорта стилей одного компонента в другой.
- Нет импорта файлов переменных и custom media — они доступны глобально.
- Нет дублирования стилей между компонентами, общие стили вынесены в shared/styles или используются переменные.