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.
- checksums.yaml +5 -5
- data/{LICENSE-RU → LICENSE-RU.txt} +0 -0
- data/{LICENSE → LICENSE.txt} +5 -5
- data/README.md +47 -16
- data/docs/BEMHTML.md +5 -0
- 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
- 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
- data/docs//320/237/321/200/320/265/320/264/320/270/320/272/320/260/321/202/321/213.md +205 -0
- data/docs//320/240/320/265/320/266/320/270/320/274/321/213.md +274 -0
- 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
- 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
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-bem_mix.md +62 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-bem_mods.md +63 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-block_tag.md +215 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_asset_path.md +71 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_pack.md +101 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_partial_path.md +28 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-define_component.md +154 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-define_templates.md +96 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-elem_tag.md +38 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-refine_component.md +114 -0
- data/docs//320/245/320/265/320/273/320/277/320/265/321/200-render_component.md +108 -0
- data/docs//320/250/320/260/320/261/320/273/320/276/320/275/321/213.md +44 -0
- data/lib/bemer.rb +3 -1
- data/lib/bemer/builders.rb +8 -0
- data/lib/bemer/builders/tree.rb +0 -8
- data/lib/bemer/configuration.rb +3 -1
- data/lib/bemer/context_extentions/structure.rb +2 -3
- data/lib/bemer/entity.rb +2 -2
- data/lib/bemer/entity_builder.rb +5 -9
- data/lib/bemer/helpers.rb +10 -0
- data/lib/bemer/mixin_list.rb +1 -1
- data/lib/bemer/modifier_list.rb +2 -2
- data/lib/bemer/path_resolver.rb +23 -0
- data/lib/bemer/pipeline/handler.rb +4 -6
- data/lib/bemer/railtie.rb +22 -9
- data/lib/bemer/renderer.rb +1 -1
- data/lib/bemer/template_list.rb +2 -4
- data/lib/bemer/tree.rb +3 -3
- data/lib/bemer/tree/node.rb +5 -7
- data/lib/bemer/version.rb +1 -1
- data/spec/bemer/railtie_spec.rb +95 -0
- data/spec/dummy/config/application.rb +30 -12
- data/spec/dummy/config/initializers/backtrace_silencers.rb +1 -5
- data/spec/dummy/config/initializers/bemer.rb +1 -3
- data/spec/rails_helper.rb +5 -9
- metadata +87 -129
- data/.gitignore +0 -17
- data/.overcommit.yml +0 -59
- data/.rspec +0 -4
- data/.rubocop.yml +0 -21
- data/.rubocop_todo.yml +0 -11
- data/Gemfile +0 -12
- data/Rakefile +0 -12
- data/bemer.gemspec +0 -43
- data/spec/dummy/Rakefile +0 -8
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +0 -4
- data/spec/dummy/app/jobs/application_job.rb +0 -4
- data/spec/dummy/app/mailers/application_mailer.rb +0 -6
- data/spec/dummy/app/models/application_record.rb +0 -5
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +0 -13
- data/spec/dummy/app/views/layouts/mailer.text.erb +0 -1
- data/spec/dummy/bin/bundle +0 -5
- data/spec/dummy/bin/rails +0 -6
- data/spec/dummy/bin/rake +0 -6
- data/spec/dummy/bin/setup +0 -39
- data/spec/dummy/bin/update +0 -31
- data/spec/dummy/bin/yarn +0 -13
- data/spec/dummy/config/cable.yml +0 -10
- data/spec/dummy/config/database.yml +0 -25
- data/spec/dummy/config/environments/development.rb +0 -51
- data/spec/dummy/config/environments/production.rb +0 -84
- data/spec/dummy/config/environments/test.rb +0 -44
- data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -7
- data/spec/dummy/config/initializers/cookies_serializer.rb +0 -7
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -6
- data/spec/dummy/config/initializers/inflections.rb +0 -17
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
- data/spec/dummy/config/locales/en.yml +0 -33
- data/spec/dummy/config/puma.rb +0 -58
- data/spec/dummy/config/routes.rb +0 -5
- data/spec/dummy/config/secrets.yml +0 -32
- data/spec/dummy/config/spring.rb +0 -8
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/package.json +0 -5
- data/spec/dummy/public/404.html +0 -67
- data/spec/dummy/public/422.html +0 -67
- data/spec/dummy/public/500.html +0 -66
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- 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">×</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' ×
|
|
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
|
+
```
|