bemer 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +5 -5
  2. data/{LICENSE-RU → LICENSE-RU.txt} +0 -0
  3. data/{LICENSE → LICENSE.txt} +5 -5
  4. data/README.md +47 -16
  5. data/docs/BEMHTML.md +5 -0
  6. data/docs//320/232/320/276/320/275/321/202/320/265/320/272/321/201/321/202-/321/203/320/267/320/273/320/260.md +275 -0
  7. data/docs//320/232/320/276/320/275/321/204/320/270/320/263/321/203/321/200/320/260/321/206/320/270/321/217.md +158 -0
  8. data/docs//320/237/321/200/320/265/320/264/320/270/320/272/320/260/321/202/321/213.md +205 -0
  9. data/docs//320/240/320/265/320/266/320/270/320/274/321/213.md +274 -0
  10. data/docs//320/241/320/276/320/267/320/264/320/260/320/275/320/270/320/265-/320/270-/320/270/321/201/320/277/320/276/320/273/321/214/320/267/320/276/320/262/320/260/320/275/320/270/320/265-UI-/320/272/320/276/320/274/320/277/320/276/320/275/320/265/320/275/321/202.md +173 -0
  11. data/docs//320/244/320/260/320/270/314/206/320/273/320/276/320/262/320/260/321/217-/321/201/321/202/321/200/321/203/320/272/321/202/321/203/321/200/320/260.md +167 -0
  12. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-bem_mix.md +62 -0
  13. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-bem_mods.md +63 -0
  14. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-block_tag.md +215 -0
  15. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_asset_path.md +71 -0
  16. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_pack.md +101 -0
  17. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_partial_path.md +28 -0
  18. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-define_component.md +154 -0
  19. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-define_templates.md +96 -0
  20. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-elem_tag.md +38 -0
  21. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-refine_component.md +114 -0
  22. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-render_component.md +108 -0
  23. data/docs//320/250/320/260/320/261/320/273/320/276/320/275/321/213.md +44 -0
  24. data/lib/bemer.rb +3 -1
  25. data/lib/bemer/builders.rb +8 -0
  26. data/lib/bemer/builders/tree.rb +0 -8
  27. data/lib/bemer/configuration.rb +3 -1
  28. data/lib/bemer/context_extentions/structure.rb +2 -3
  29. data/lib/bemer/entity.rb +2 -2
  30. data/lib/bemer/entity_builder.rb +5 -9
  31. data/lib/bemer/helpers.rb +10 -0
  32. data/lib/bemer/mixin_list.rb +1 -1
  33. data/lib/bemer/modifier_list.rb +2 -2
  34. data/lib/bemer/path_resolver.rb +23 -0
  35. data/lib/bemer/pipeline/handler.rb +4 -6
  36. data/lib/bemer/railtie.rb +22 -9
  37. data/lib/bemer/renderer.rb +1 -1
  38. data/lib/bemer/template_list.rb +2 -4
  39. data/lib/bemer/tree.rb +3 -3
  40. data/lib/bemer/tree/node.rb +5 -7
  41. data/lib/bemer/version.rb +1 -1
  42. data/spec/bemer/railtie_spec.rb +95 -0
  43. data/spec/dummy/config/application.rb +30 -12
  44. data/spec/dummy/config/initializers/backtrace_silencers.rb +1 -5
  45. data/spec/dummy/config/initializers/bemer.rb +1 -3
  46. data/spec/rails_helper.rb +5 -9
  47. metadata +87 -129
  48. data/.gitignore +0 -17
  49. data/.overcommit.yml +0 -59
  50. data/.rspec +0 -4
  51. data/.rubocop.yml +0 -21
  52. data/.rubocop_todo.yml +0 -11
  53. data/Gemfile +0 -12
  54. data/Rakefile +0 -12
  55. data/bemer.gemspec +0 -43
  56. data/spec/dummy/Rakefile +0 -8
  57. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  58. data/spec/dummy/app/helpers/application_helper.rb +0 -4
  59. data/spec/dummy/app/jobs/application_job.rb +0 -4
  60. data/spec/dummy/app/mailers/application_mailer.rb +0 -6
  61. data/spec/dummy/app/models/application_record.rb +0 -5
  62. data/spec/dummy/app/models/concerns/.keep +0 -0
  63. data/spec/dummy/app/views/layouts/mailer.html.erb +0 -13
  64. data/spec/dummy/app/views/layouts/mailer.text.erb +0 -1
  65. data/spec/dummy/bin/bundle +0 -5
  66. data/spec/dummy/bin/rails +0 -6
  67. data/spec/dummy/bin/rake +0 -6
  68. data/spec/dummy/bin/setup +0 -39
  69. data/spec/dummy/bin/update +0 -31
  70. data/spec/dummy/bin/yarn +0 -13
  71. data/spec/dummy/config/cable.yml +0 -10
  72. data/spec/dummy/config/database.yml +0 -25
  73. data/spec/dummy/config/environments/development.rb +0 -51
  74. data/spec/dummy/config/environments/production.rb +0 -84
  75. data/spec/dummy/config/environments/test.rb +0 -44
  76. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -7
  77. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -7
  78. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -6
  79. data/spec/dummy/config/initializers/inflections.rb +0 -17
  80. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  81. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  82. data/spec/dummy/config/locales/en.yml +0 -33
  83. data/spec/dummy/config/puma.rb +0 -58
  84. data/spec/dummy/config/routes.rb +0 -5
  85. data/spec/dummy/config/secrets.yml +0 -32
  86. data/spec/dummy/config/spring.rb +0 -8
  87. data/spec/dummy/lib/assets/.keep +0 -0
  88. data/spec/dummy/log/.keep +0 -0
  89. data/spec/dummy/package.json +0 -5
  90. data/spec/dummy/public/404.html +0 -67
  91. data/spec/dummy/public/422.html +0 -67
  92. data/spec/dummy/public/500.html +0 -66
  93. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  94. data/spec/dummy/public/apple-touch-icon.png +0 -0
  95. data/spec/dummy/public/favicon.ico +0 -0
@@ -0,0 +1,205 @@
1
+ # Предикаты
2
+
3
+ Позволяют указать условия для выбора узлов в структуре/дереве компонента.
4
+
5
+ #### Предикат `block`
6
+
7
+ С помощью предиката `block` можно задать условия для выбора узла(ов) с типом блок по БЭМ методологии в структуре/дереве компонента.
8
+
9
+ В качестве параметров можно указать:
10
+ 1. [Название блока](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8) как `String` или `Symbol`, по умолчанию равно `'*'`.
11
+ 1. Вторым параметром можно передать условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий.
12
+ 1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла.
13
+ 1. `mix` задает список миксов которые должны присутствовать в списке миксов узла.
14
+
15
+ ##### Примеры
16
+
17
+ Выбрать блоки с названием `panel` и заменить css классы:
18
+ ```slim
19
+ = render_component :panel do |template|
20
+ = template.block(:panel).cls :panel, :panel_success
21
+ ```
22
+
23
+ Выбрать блоки с названием `panel` и применить несколько режимов:
24
+ ```slim
25
+ / Эквивалентные записи
26
+ = render_component :panel do |template|
27
+ = template.block(:panel).cls :panel, :panel_success
28
+ = template.block(:panel).bem true
29
+ = template.block(:panel).js true
30
+
31
+ = render_component :panel do |template|
32
+ = template.block(:panel) do |panel|
33
+ = panel.cls :panel, :panel_success
34
+ = panel.bem true
35
+ = panel.js true
36
+ ```
37
+
38
+ Выбрать все блоки(с любым названием) и выключить генерацию данных связанных с БЭМ методологией:
39
+ ```slim
40
+ / Эквивалентные записи
41
+ = render_component :panel do |template|
42
+ = template.block.bem false
43
+
44
+ = render_component :panel do |template|
45
+ = template.block('*').bem false
46
+ ```
47
+
48
+ Выбрать блоки без названия и выключить генерацию данных связанных с БЭМ методологией:
49
+ ```slim
50
+ = render_component :panel do |template|
51
+ = template.block('').tag false
52
+ ```
53
+
54
+ Выбрать все блоки которые занимают первую позицию среди своих братьев/сестер(siblings) и заменить их на строку `'Plain text'`:
55
+ ```slim
56
+ = render_component :panel do |template|
57
+ = template.block('*', ->(node) { node.first? }).replace 'Plain text'
58
+ ```
59
+
60
+ Выбрать блоки у которых есть микс `block__elem` и заменить их содержимое на строку `'Plain text'`:
61
+ ```slim
62
+ = render_component :panel do |template|
63
+ = template.block(mix: { block: :elem }).content 'Plain text'
64
+ ```
65
+
66
+ Выбрать блоки у которых есть модификатор с названием `enabled` и значением `true` и добавить `js` атрибуты:
67
+ ```slim
68
+ = render_component :panel do |template|
69
+ = template.block(mods: :enabled).js true
70
+ ```
71
+
72
+ #### Предикат `elem`
73
+
74
+ С помощью предиката `elem` можно задать условия для выбора узла(ов) с типом элемент по БЭМ методологии в структуре/дереве компонента.
75
+
76
+ В качестве параметров можно указать:
77
+ 1. [Название элемента](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-elem_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8) как `String` или `Symbol`, по умолчанию равно `'*'`.
78
+ 1. Вторым параметром можно передать условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий.
79
+ 1. `block` [название блока](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8), как `String` или `Symbol`, по умолчанию равно `'*'`.
80
+ 1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла.
81
+ 1. `mix` задает список миксов которые должны присутствовать в списке миксов узла.
82
+
83
+ ##### Примеры
84
+
85
+ Выбрать элементы с названием `heading` и заменить их контент/содержимое:
86
+ ```slim
87
+ = render_component :panel do |template|
88
+ = template.elem(:heading).content
89
+ h3.panel-title Panel title
90
+ ```
91
+
92
+ Выбрать элементы с названием `heading` и применить несколько режимов:
93
+ ```slim
94
+ / Эквивалентные записи
95
+ = render_component :panel do |template|
96
+ = template.elem(:heading).cls :css_class
97
+ = template.elem(:heading).bem true
98
+ = template.elem(:heading).js true
99
+
100
+ = render_component :panel do |template|
101
+ = template.elem(:heading) do |heading|
102
+ = heading.cls :css_class
103
+ = heading.bem true
104
+ = heading.js true
105
+ ```
106
+
107
+ Выбрать все элементы(с любым названием) и выключить генерацию данных связанных с БЭМ методологией:
108
+ ```slim
109
+ / Эквивалентные записи
110
+ = render_component :panel do |template|
111
+ = template.elem.bem false
112
+
113
+ = render_component :panel do |template|
114
+ = template.elem('*', block: '*').bem false
115
+ ```
116
+
117
+ Выбрать элементы без названия и отключить отображение HTML тега:
118
+ ```slim
119
+ = render_component :panel do |template|
120
+ = template.elem('').tag ''
121
+ ```
122
+
123
+ Выбрать все элементы которые занимают последнюю позицию среди своих братьев/сестер(siblings) и заменить их на строку `'Plain text'`:
124
+ ```slim
125
+ = render_component :panel do |template|
126
+ = template.elem('*', ->(node) { node.last? }).replace 'Plain text'
127
+ ```
128
+
129
+ Выбрать элементы у которых есть микс `block__elem` и заменить HTML атрибуты:
130
+ ```slim
131
+ = render_component :panel do |template|
132
+ = template.block(mix: 'block__elem' }).attrs key: :val
133
+ ```
134
+
135
+ Выбрать элементы у которых есть модификатор с названием `theme` и значением `green_islands` и добавить `js` атрибуты:
136
+ ```slim
137
+ = render_component :panel do |template|
138
+ = template.elem(mods: { theme: :green_islands }).js key: :val
139
+ ```
140
+
141
+ #### Предикат `match`
142
+
143
+ С помощью предиката `match` можно задать условия для выбора узла(ов) с типом блок и/или элемент по БЭМ методологии в структуре/дереве компонента. Если условия заданы для блоков и элементов, тогда необходимо использовать `&block` см. примеры.
144
+
145
+ В качестве параметров можно указать:
146
+ 1. Условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий.
147
+ 1. `block` название блока, как `String` или `Symbol`, по умолчанию равно `'*'`.
148
+ 1. `elem` название элемента, как `String` или `Symbol`, по умолчанию равно `'*'`.
149
+ 1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла.
150
+ 1. `mix` задает список миксов которые должны присутствовать в списке миксов узла.
151
+
152
+ ##### Примеры
153
+
154
+ Выбрать все блоки и элементы, и выключить генерацию данных связанных с БЭМ методологией:
155
+ ```slim
156
+ / Эквивалентные записи
157
+ = render_component :panel do |template|
158
+ = template.match do |block, elem|
159
+ = block.bem false
160
+ = elem.bem false
161
+
162
+ = render_component :panel do |template|
163
+ = template.match(block: '*', elem: '*') do |block, elem|
164
+ = block.bem false
165
+ = elem.bem false
166
+ ```
167
+
168
+ Выбрать блоки без названия и отключить отображение HTML тега:
169
+ ```slim
170
+ / Эквивалентные записи
171
+ = render_component :panel do |template|
172
+ = template.match(block: '', elem: false).tag ''
173
+
174
+ = render_component :panel do |template|
175
+ = template.match(block: '', elem: nil).tag ''
176
+ ```
177
+ Выбрать все элементы и отключить отображение HTML тега:
178
+ ```slim
179
+ / Эквивалентные записи
180
+ = render_component :panel do |template|
181
+ = template.match(block: false).tag ''
182
+
183
+ = render_component :panel do |template|
184
+ = template.match(block: nil).tag ''
185
+ ```
186
+
187
+ Использование других параметров такое же как у предикатов `block` и `elem`.
188
+
189
+ #### Указание дополнительных условий с помощью `specify`
190
+
191
+ Метод `specify` позволяет указать дополнительные (уточнить) условия для предиката (выстроить цепочку условий), с учетом, что они еще не были объявлены до этого, есть исключения:
192
+
193
+ 1. Название блока можно переопределить если оно равно `'*'`
194
+ 1. Название элемента можно переопределить если оно равно `'*'` или `nil`
195
+ 1. Условие которое идет вторым параметром у предикат `block` `elem` и первым параметром у `match` можно переопределять всегда
196
+ 1. Параметры `mix` и `mods` можно переопределить если они еще не были объявлены
197
+
198
+ ##### Примеры
199
+
200
+ ```slim
201
+ = render_component :panel do |template|
202
+ = template.block(mix: :block) do |block|
203
+ = block.specify(block: :block1).tag false
204
+ = block.specify(block: :block2).tag true
205
+ ```
@@ -0,0 +1,274 @@
1
+ # Режимы
2
+
3
+ **ВАЖНО**. *Только для компонент, [структура (дерево) которых была создана](Создание-и-использование-UI-компонент.md) с помощью [хелпера `define_component`](Хелпер-define_component.md) доступно использование [BEMHTML шаблонов](Шаблоны.md).*
4
+
5
+ **ВАЖНО**. *Количество режимов и правила их использования отличаются от [bem-xjst](https://github.com/bem/bem-xjst/blob/f69293e95672e387ee5f734c253bb5829654974c/docs/ru/5-templates-syntax.md#Описание-стандартных-режимов).*
6
+
7
+ **ВАЖНО**. *Порядок поиска и применения шаблонов такой же как и в [bem-xjst](https://github.com/bem/bem-xjst/blob/f69293e95672e387ee5f734c253bb5829654974c/docs/ru/7-runtime.md#Как-выбираются-и-применяются-шаблоны).*
8
+
9
+ Режимы (моды, modes) позволяют производить различные манипуляции (добавлять/изменять/заменять/удалять) над узлами дерева (структуры). При работе с BEMHTML шаблонами доступно 9 основных и 4 вспомогательных режима.
10
+
11
+ Для всех примеров используется файловая структура:
12
+ ```
13
+ app/
14
+ ├── assets/
15
+ | ├── javascripts/
16
+ | | └── application.js
17
+ | └── stylesheets/
18
+ | └── application.css
19
+ ├── bemer_components/
20
+ | ├── common/
21
+ | | ├── alert/
22
+ | | | ├── index.html.slim
23
+ | | | ├── index.bemhtml.slim
24
+ | | | ├── index.js
25
+ | | | └── index.css
26
+ | | └── ...
27
+ | └── ...
28
+ └── ...
29
+ ```
30
+ Подключение технологий JavaScript и CSS компонента `alert` при использование Sprockets:
31
+
32
+ ```js
33
+ // Файл app/assets/javascripts/application.js
34
+ //= require common/alert
35
+ ```
36
+
37
+ ```scss
38
+ // Файл app/assets/stylesheets/application.css
39
+ //= require common/alert
40
+ ```
41
+
42
+ В качестве структуры компонента `alert` будет взят [компонент `alert` из библиотеки Twitter Bootstrap](https://getbootstrap.com/docs/3.3/components/#alerts):
43
+
44
+ ```html
45
+ <!-- Исходная HTML структура компонента alert из библиотеки Twitter Bootstrap -->
46
+ <div class="alert alert-info alert-dismissible" role="alert">
47
+ <button type="button" class="close" data-dismiss="alert">
48
+ <span aria-hidden="true">&times;</span>
49
+ </button>
50
+ <strong>Warning!</strong> Better check yourself, you're not looking too good.
51
+ </div>
52
+ ```
53
+ Возможный вариант разметки компонента `alert` по БЭМ методологии:
54
+ ```slim
55
+ / Содержимое файла index.html.slim компонента alert
56
+ = define_component bem_cascade: false do |component|
57
+ = component.block :alert, tag: :div, cls: 'alert alert-dismissible', role: :alert do |alert|
58
+ = alert.elem :close, type: :button, tag: :button, cls: :close, data: { dismiss: :alert }
59
+ span aria-hidden='true' &times;
60
+ = alert.elem :message, tag: false
61
+ strong> Warning!
62
+ | Better check yourself, you're not looking too good.
63
+ ```
64
+ Возможный вариант шаблонов по умолчанию для компонента `alert`:
65
+ ```slim
66
+ / Содержимое файла index.bemhtml.slim компонента alert
67
+ = define_templates do |template|
68
+ = template.block(:alert).add_cls :alert_info
69
+ ```
70
+ HTML структура компонента `alert` после вызова `render_component`:
71
+ ```slim
72
+ / Шаблонизатор Slim
73
+ = render_component 'common/alert'
74
+
75
+ / =>
76
+ / <div role="alert" class="alert alert-dismissible alert-info">
77
+ / <button type="button" data-dismiss="alert" class="close">
78
+ / <span aria-hidden="true">×</span>
79
+ / </button>
80
+ / <strong>Warning!</strong> Better check yourself, you're not looking too good.
81
+ / </div>
82
+ ```
83
+
84
+ ## Основные режимы
85
+
86
+ Список основных режимов и порядок их применения: `replace`, `content`, `tag`, `cls`, `attrs`, `bem`, `mods`, `mix`, `js`.
87
+
88
+ ### Режим `replace`
89
+
90
+ **ВАЖНО**. *Режим `content` работает быстрее режима `replace`.*
91
+
92
+ **ВАЖНО**. *В тело шаблона вторым параметром передается билдер (builder) компонента.*
93
+
94
+ **ВАЖНО**. *Методы `ctx` и `content` доступны ТОЛЬКО в режимах `replace` и `content`*.
95
+
96
+ Заменяет/удаляет узел в дереве(структуре) компонента.
97
+
98
+ Аргументом метода (телом шаблона) может быть `String`, `Proc`, `lambda` или `&block`.
99
+
100
+ Найти элемент `message` и заменить на другой текст:
101
+ ```slim
102
+ / Шаблонизатор Slim
103
+ = render_component 'common/alert' do |template|
104
+ = template.elem(:message).replace
105
+ strong> Heads up!
106
+ | This
107
+ =< link_to 'alert needs your attention', '#', class: 'alert-link'
108
+ | , but it's not super important.
109
+
110
+ / =>
111
+ / <div role="alert" class="alert alert-dismissible alert-info">
112
+ / <button type="button" data-dismiss="alert" class="close">
113
+ / <span aria-hidden="true">×</span>
114
+ / </button>
115
+ / <strong>Heads up!</strong>
116
+ / This <a class="alert-link" href="#">alert needs your attention</a>,
117
+ / but it's not super important.
118
+ / </div>
119
+ ```
120
+
121
+ Найти элемент `close` и заменить на пустую строку, т.е. будет выполнено удаление:
122
+ ```slim
123
+ / Шаблонизатор Slim
124
+ = render_component 'common/alert' do |template|
125
+ = template.elem(:close).replace
126
+
127
+ / =>
128
+ / <div role="alert" class="alert alert-dismissible alert-info">
129
+ / <strong>Warning!</strong> Better check yourself, you're not looking too good.
130
+ / </div>
131
+ ```
132
+
133
+ ### Режим `content`
134
+
135
+ **ВАЖНО**. *Режим `content` работает быстрее режима `replace`.*
136
+
137
+ **ВАЖНО**. *В тело шаблона вторым параметром передается билдер (builder) компонента.*
138
+
139
+ **ВАЖНО**. *Методы `ctx` и `content` доступны ТОЛЬКО в режимах `replace` и `content`*.
140
+
141
+ Заменяет/удаляет содержимое узла в дереве(структуре) компонента.
142
+
143
+ Аргументом метода (телом шаблона) может быть `String`, `Proc`, `lambda` или `&block`.
144
+
145
+ Пример из режима `replace`, будет работать быстрее для режима `content`:
146
+ ```slim
147
+ / Шаблонизатор Slim
148
+ = render_component 'common/alert' do |template|
149
+ = template.elem(:message).content
150
+ strong> Heads up!
151
+ | This
152
+ =< link_to 'alert needs your attention', '#', class: 'alert-link'
153
+ | , but it's not super important.
154
+
155
+ / =>
156
+ / <div role="alert" class="alert alert-dismissible alert-info">
157
+ / <button type="button" data-dismiss="alert" class="close">
158
+ / <span aria-hidden="true">×</span>
159
+ / </button>
160
+ / <strong>Heads up!</strong>
161
+ / This <a class="alert-link" href="#">alert needs your attention</a>,
162
+ / but it's not super important.
163
+ / </div>
164
+ ```
165
+
166
+ ### Режим `tag`
167
+
168
+ Изменяет [параметр `tag`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-tag) аргументом (телом шаблона) может быть `Proc` и `lambda`.
169
+
170
+ ### Режим `cls`
171
+
172
+ Изменяет [параметр `cls`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-cls-%D1%81%D0%B8%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC-class) аргументом (телом шаблона) может быть `Proc` и `lambda`.
173
+
174
+ ### Режим `attrs`
175
+
176
+ Изменяет [HTML атрибуты](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%90%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D1%8B), аргументом (телом шаблона) может быть `Hash`, `Proc`, `lambda` или `Array`.
177
+
178
+ ### Режим `bem`
179
+
180
+ Изменяет [параметр `bem`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-bem) аргументом (телом шаблона) может быть `Proc` и `lambda`.
181
+
182
+ ### Режим `mods`
183
+
184
+ Изменяет [параметр `mods`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-mods) аргументом (телом шаблона) может быть `Proc` и `lambda`.
185
+
186
+ ### Режим `mix`
187
+
188
+ Изменяет [параметр `mix`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-mix) аргументом (телом шаблона) может быть `Proc` и `lambda`.
189
+
190
+ ### Режим `js`
191
+
192
+ Изменяет [параметр `js`, кроме допустимых значений](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-js) аргументом (телом шаблона) может быть `Proc` и `lambda`.
193
+
194
+ ## Вспомогательные режимы
195
+
196
+ **ВАЖНО**. *Вспомогательные режимы это всего лишь синтаксический сахар (syntactic sugar) для некоторых основных режимов.*
197
+
198
+ Список вспомогательных режимов: `add_attrs`, `add_cls`, `add_mix`, `add_mods`.
199
+
200
+ ### Режим `add_attrs`
201
+
202
+ **ВАЖНО**. *Аргументы такие же как и у режима `attrs`.*
203
+
204
+ Добавляет HTML атрибуты.
205
+
206
+ ```slim
207
+ / Эквивалентные записи
208
+ = render_component 'common/alert' do |template|
209
+ = template.block(:alert).add_attrs key: :value
210
+
211
+ = render_component 'common/alert' do |template|
212
+ = template.block(:alert).attrs ->(node) { node.apply_next.merge!(key: :value) }
213
+
214
+ = render_component 'common/alert' do |template|
215
+ = template.block(:alert).attrs ->(node) { node.apply(:attrs).merge!(key: :value) }
216
+ ```
217
+
218
+ ### Режим `add_cls`
219
+
220
+ **ВАЖНО**. *Аргументы такие же как и у режима `cls`.*
221
+
222
+ Добавляет css классы.
223
+
224
+ ```slim
225
+ / Эквивалентные записи
226
+ = render_component 'common/alert' do |template|
227
+ = template.block(:alert).add_cls :css_class
228
+
229
+ = render_component 'common/alert' do |template|
230
+ = template.block(:alert).cls ->(node) { node.apply_next << :css_class }
231
+
232
+ = render_component 'common/alert' do |template|
233
+ = template.block(:alert).cls ->(node) { node.apply(:cls) << :css_class }
234
+ ```
235
+
236
+ ### Режим `add_mix`
237
+
238
+ **ВАЖНО**. *Аргументы такие же как и у режима `mix`.*
239
+
240
+ Добавляет миксы.
241
+
242
+ ```slim
243
+ / Эквивалентные записи
244
+ = render_component 'common/alert' do |template|
245
+ = template.block(:alert).add_mix block: :elem
246
+
247
+ = render_component 'common/alert' do |template|
248
+ = template.block(:alert).mix ->(node) { node.apply_next << { block: :elem } }
249
+
250
+ = render_component 'common/alert' do |template|
251
+ = template.block(:alert).mix ->(node) { node.apply(:mix) << { block: :elem } }
252
+
253
+ / С использованием хелпера bem_mix
254
+ = render_component 'common/alert' do |template|
255
+ = template.block(:alert).mix ->(node) { node.apply(:mix) << bem_mix(block: :elem) }
256
+ ```
257
+
258
+ ### Режим `add_mods`
259
+
260
+ **ВАЖНО**. *Аргументы такие же как и у режима `mods`.*
261
+
262
+ Добавляет модификаторы.
263
+
264
+ ```slim
265
+ / Эквивалентные записи
266
+ = render_component 'common/alert' do |template|
267
+ = template.block(:alert).add_mods :enabled
268
+
269
+ = render_component 'common/alert' do |template|
270
+ = template.block(:alert).mods ->(node) { node.apply_next.merge!(enabled: true) }
271
+
272
+ = render_component 'common/alert' do |template|
273
+ = template.block(:alert).mods ->(node) { node.apply(:mods).merge!(enabled: true) }
274
+ ```