Вёрстка (теги html) только в компонентах в директории @src/components/
, в других частях приложения вёрстка недопустима.
Импорт файлов стилей (css, less...) тоже только в компонентах.
Желательно использовать препроцессор less, но допустимы и другие — главное аргументировать их.
CSS классы именовать по БЭМ методологии:
.ComponentName
— название блока, соответствует названию компонента, указывается для корневого тега компонента;.ComponentName_modify
— модификация блока (модификация стиля корневого тега компонента);.ComponentName__elementName
— элемент блока (практически все вложенные теги в разметке компонента);.ComponentName__elementName_modify
— модификация элемента;.modify
— допускаются простые классы для модификации блока или элемента, но их определение должно быть в паре с классом блока или элемента .CompoenntName.modify{}
;В описании стилей компонента не использовать каскад с классом от другого компонента.
Динамическая стилизация компонента через props
— это передача названия модификатора блока.
props
свойства стиля (цвет, например) — тогда реализация отображения переместится из компонента в контейнер.Для комбинации нескольких классов в атрибуте className
использовать библиотеку classnames
.
Для подставления модификатора в атрибуте className
лучше применить функцию @src/utils/themes
_theme_${modify}
:themes('ComponentName', 'skin1 skin2'); //→ "ComponentName ComponentName_theme_skin1 ComponentName_theme_skin2"
themes('ComponentName', {skin3: true, skin4: false}); //→ "ComponentName ComponentName_theme_skin3"
Модульный импорт стилей использовать по согласованию с командой разработчиков.
classes.componentName
. Указание класса все равно будет длинным.Стилизация на jss, styled-components и подобных не используются.
Для разметки областей создавать компоненты Layout* в @src/components/layout/
.
props
.В компоненте разметка одного блока. Желание заверстать ещё один блок — признак создать отдельный компонент.
Использовать HTML5 теги для семантической разметки, там где уместно. Но тегам все равно назначать классы по БЭМ.
Общие стили, шрифты, css переменные, нормалайзеры, картинки и другие ресурсы разметки помещаются в директории @src/theme/
Пример компонента LayoutPage
/**
* Компонент разметки страницы с тремя областями для вставки
*/
import React from 'react';
import PropTypes from 'prop-types';
import cn from 'classnames';
import themes from '@src/utils/themes';
import './style.less';
function LayoutPage (props) {
return (
<div className={themes('LayoutPage', props.theme)}>
<header className="LayoutPage__header">{props.header}</header>
<div className="LayoutPage__content">{props.children || props.content}</div>
<footer className="LayoutPage__footer">{props.footer}</footer>
</div>
);
}
LayoutPage.propTypes = {
header: PropTypes.node,
content: PropTypes.node,
footer: PropTypes.node,
children: PropTypes.node,
theme: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),//можно передать несколько тем через пробел или массив
};
LayoutPage.defaultProps = {
theme: ''
}
export default React.memo(LayoutPage);
Стили с темой night
для компонента
.LayoutPage{
display: flex;
min-height: 100vh;
flex-direction: column;
&_theme {
&_night {
background: #000000;
color: #eeeeee;
}
}
&__content{
flex: 1;
}
}
Применение компонента
function AboutContainer(){
return (
<LayoutPage header={<MainHeader/>} footer={<MainFooter/>} theme="night">
<About/>
</LayoutPage>
);
}