# Вёрстка графических компонентов
При создании графических компонент ("виджетов") в первую очередь придумывается их HTML/CSS-структура.
Как будет выглядеть виджет в обычном состоянии? Как будет меняться в процессе взаимодействия с посетителем?
Чтобы разработка виджета была удобной, при вёрстке полезно соблюдать несколько простых, но очень важных соглашений.
[cut]
## Семантическая вёрстка
HTML-разметка и названия CSS-классов должны отражать не оформление, а смысл.
Например, сообщение об ошибке можно сверстать так:
```html
Плохая вёрстка сообщения об ошибке: атрибут style!
```
...Или так:
```html
Плохая вёрстка сообщения об ошибке: несемантический class!
```
В обоих случаях вёрстка не является семантической. В первом случае -- стиль, а во втором -- класс содержат информацию об *оформлении*.
**При семантической вёрстке классы описывают смысл ("что это?" -- меню, кнопка...) и состояние (открыто, закрыто, отключено...) компонента.**
Например:
```html
Сообщение об ошибке (error), правильная вёрстка!
```
У предупреждения будет класс `message` и так далее, по смыслу.
```html
Предупреждение (warning), правильная вёрстка!
```
Семантическая верстка упрощает поддержку и развитие CSS, упрощает взаимодействие между членами команды.
Такая верстка удобна для организации JS-кода. В коде мы просто ставим нужный класс, остальное делает CSS.
## Состояние виджета -- класс на элементе
Зачастую компонент может иметь несколько состояний. Например, меню может быть открыто или закрыто.
**Состояние должно добавляться CSS-классом не на тот элемент, который нужно скрыть/показать/..., а на тот, к которому оно "по смыслу" относится, обычно -- на корневой элемент.**
Например, меню в закрытом состоянии скрывает свой список элементов. Класс `open` нужно добавлять не к списку опций `