bemer 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ ```