bemer 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,96 @@
|
|
1
|
+
# Хелпер define_templates
|
2
|
+
|
3
|
+
**ВАЖНО**. *Только для компонент, структура (дерево) которых была создана с помощью [хелпера `define_component`](Хелпер-define_component.md) доступно использование [BEMHTML шаблонов](Шаблоны.md).*
|
4
|
+
|
5
|
+
Позволяет создавать шаблоны по умолчанию (технология BEMHTML) для компонент созданных [с помощью `define_component`](Хелпер-define_component.md).
|
6
|
+
|
7
|
+
При вызове `define_templates` можно передать единственный параметр `cached` который по умолчанию равен `true`, см. [хелпер `component_pack`](Хелпер-component_pack.md).
|
8
|
+
|
9
|
+
Используется следующая файловая структура:
|
10
|
+
```
|
11
|
+
app/
|
12
|
+
├── assets/
|
13
|
+
| ├── javascripts/
|
14
|
+
| | └── application.js
|
15
|
+
| └── stylesheets/
|
16
|
+
| └── application.css
|
17
|
+
├── bemer_components/
|
18
|
+
| ├── panel/
|
19
|
+
| | ├── index.html.slim
|
20
|
+
| | ├── index.bemhtml.slim
|
21
|
+
| | ├── index.js
|
22
|
+
| | └── index.css
|
23
|
+
| └── ...
|
24
|
+
└── ...
|
25
|
+
```
|
26
|
+
Подключение технологий JavaScript и CSS компонента `panel` при использовании Sprockets:
|
27
|
+
|
28
|
+
```js
|
29
|
+
// Файл app/assets/javascripts/application.js
|
30
|
+
//= require panel
|
31
|
+
```
|
32
|
+
|
33
|
+
```scss
|
34
|
+
// Файл app/assets/stylesheets/application.css
|
35
|
+
//= require panel
|
36
|
+
```
|
37
|
+
В качестве структуры компонента `panel` будет взят [компонент `panel` из библиотеки Twitter Bootstrap](https://getbootstrap.com/docs/3.3/components/#panels):
|
38
|
+
|
39
|
+
```html
|
40
|
+
<!-- Исходная HTML структура компонента panel из библиотеки Twitter Bootstrap -->
|
41
|
+
<div class="panel panel-default">
|
42
|
+
<div class="panel-heading">
|
43
|
+
<h3 class="panel-title">Panel title</h3>
|
44
|
+
</div>
|
45
|
+
<div class="panel-body">Panel content</div>
|
46
|
+
<div class="panel-footer">Panel footer</div>
|
47
|
+
</div>
|
48
|
+
```
|
49
|
+
Возможный вариант разметки компонента `panel` по БЭМ методологии:
|
50
|
+
```slim
|
51
|
+
/ Содержимое файла index.html.slim компонента panel
|
52
|
+
= define_component bem_cascade: false, tag: :div do |component|
|
53
|
+
= component.block :panel, cls: 'panel' do |panel|
|
54
|
+
= panel.elem :heading, cls: 'panel-heading'
|
55
|
+
= panel.elem :title, tag: :h3, cls: 'panel-title', content: 'Panel title'
|
56
|
+
= panel.elem :content, cls: 'panel-body', content: 'Panel content'
|
57
|
+
= panel.elem :footer, cls: 'panel-footer', content: 'Panel footer'
|
58
|
+
```
|
59
|
+
|
60
|
+
После рендеринга без применения шаблонов по умолчанию, HTML структура будет выглядеть следующим образом:
|
61
|
+
```slim
|
62
|
+
/ Шаблонизатор Slim
|
63
|
+
= render_component :panel
|
64
|
+
|
65
|
+
/ =>
|
66
|
+
/ <div class="panel">
|
67
|
+
/ <div class="panel-heading">
|
68
|
+
/ <h3 class="panel-title">Panel title</h3>
|
69
|
+
/ </div>
|
70
|
+
/ <div class="panel-body">Panel content</div>
|
71
|
+
/ <div class="panel-footer">Panel footer</div>
|
72
|
+
/ </div>
|
73
|
+
```
|
74
|
+
С помощью файла `index.bemhtml.slim` можно задать дефолтные шаблоны для компонента, которые можно будет переопределить при вызове `render_component` или `refine_component`.
|
75
|
+
|
76
|
+
Возможный вариант шаблонов по умолчанию для компонента `panel`:
|
77
|
+
```slim
|
78
|
+
/ Содержимое файла index.bemhtml.slim компонента panel
|
79
|
+
= define_templates do |template|
|
80
|
+
= template.block(:panel).add_cls :panel_default
|
81
|
+
```
|
82
|
+
|
83
|
+
После рендеринга HTML структура теперь будет выглядеть следующим образом (добавлен css класс `panel-default`):
|
84
|
+
```slim
|
85
|
+
/ Шаблонизатор Slim
|
86
|
+
= render_component :panel
|
87
|
+
|
88
|
+
/ =>
|
89
|
+
/ <div class="panel panel-default">
|
90
|
+
/ <div class="panel-heading">
|
91
|
+
/ <h3 class="panel-title">Panel title</h3>
|
92
|
+
/ </div>
|
93
|
+
/ <div class="panel-body">Panel content</div>
|
94
|
+
/ <div class="panel-footer">Panel footer</div>
|
95
|
+
/ </div>
|
96
|
+
```
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Хелпер elem_tag
|
2
|
+
|
3
|
+
**ВАЖНО**. *Только для компонент, [структура (дерево) которых была создана](Создание-и-использование-UI-компонент.md) с помощью [хелпера `define_component`](Хелпер-define_component.md) доступно использование [BEMHTML шаблонов](Шаблоны.md).*
|
4
|
+
|
5
|
+
**ВАЖНО**. *Для сущностей у которых не указано название, не будут созданы css классы и js атрибуты из методологии БЭМ*:
|
6
|
+
```ruby
|
7
|
+
elem_tag js: true, bem: true # => <div></div>
|
8
|
+
elem_tag nil, js: true, bem: true # => <div></div>
|
9
|
+
elem_tag :block, js: true, bem: true # => <div></div>
|
10
|
+
elem_tag '', :elem, js: true, bem: true # => <div></div>
|
11
|
+
```
|
12
|
+
|
13
|
+
**ВАЖНО**. *[Параметр `bem` из конфигурации](Конфигурация.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-bem) никак не влияет на работу `elem_tag`.*
|
14
|
+
|
15
|
+
**ВАЖНО**. *Альтернативное создание элементов по методологии БЭМ см. [хелпер `block_tag` параметр `content`](Хелпер-block_tag.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-content).*
|
16
|
+
|
17
|
+
Позволяет создавать элемент по методологии БЭМ.
|
18
|
+
|
19
|
+
## Название сущности
|
20
|
+
|
21
|
+
При вызове `elem_tag` первым аргументом передается название блока (указывать не обязательно), вторым название элемента (указывать не обязательно) допустимые типы:
|
22
|
+
1. `Symbol` ВСЕ символы нижнего подчеркивания будут преобразованы в тире, при формирование css классов по БЭМ методологии
|
23
|
+
1. `String` возвращается без изменений
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# Вызов без каких-либо параметров
|
27
|
+
elem_tag # => <div></div>
|
28
|
+
```
|
29
|
+
```ruby
|
30
|
+
elem_tag :block, :elem # => <div class="block__elem"></div>
|
31
|
+
```
|
32
|
+
**ВАЖНО**. *Будьте ВНИМАТЕЛЬНЫ при использовании названий с типом `String`, если в них содержатся знаки нижнего подчеркивания `_`, это может привести к неправильному результату согласно методологии БЭМ*:
|
33
|
+
```ruby
|
34
|
+
elem_tag 'block_name', 'elem_name' # => <div class="block_name__elem_name"></div>
|
35
|
+
```
|
36
|
+
## Допустимые параметры
|
37
|
+
|
38
|
+
Все параметры такие же как и у [хелпера `block_tag`](Хелпер-block_tag.md#%D0%94%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D0%BC%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B).
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# Хелпер refine_component
|
2
|
+
|
3
|
+
**ВАЖНО**. *Является псевдонимом для `render_component`.*
|
4
|
+
|
5
|
+
**ВАЖНО**. *Только для компонент, структура (дерево) которых была создана с помощью [хелпера `define_component`](Хелпер-define_component.md) доступно использование [BEMHTML шаблонов](Шаблоны.md).*
|
6
|
+
|
7
|
+
**ДОПОЛНИТЕЛЬНО**. *Различные способы создания и рендеринга компонент описаны [здесь](Создание-и-использование-UI-компонент.md).*
|
8
|
+
|
9
|
+
Соглашения по использованию:
|
10
|
+
1. `render_component` используется для рендеринга компонент
|
11
|
+
1. `refine_component` используется для создания новых компонент на основе существующих, реализованных [с помощью `define_component`](Хелпер-define_component.md)
|
12
|
+
|
13
|
+
Используя `refine_component` можно получать HTML структуру компонента, а если компонент был создан [с помощью `define_component`](Хелпер-define_component.md) тогда и изменять его структуру/внешний вид с помощью шаблонов BEMHTML.
|
14
|
+
|
15
|
+
Все передаваемые параметры будут доступны в теле компонента как локальные переменные, исключение составляют параметры `cached` и `prefix`.
|
16
|
+
|
17
|
+
Используется следующая файловая структура:
|
18
|
+
```
|
19
|
+
app/
|
20
|
+
├── assets/
|
21
|
+
| ├── javascripts/
|
22
|
+
| | └── application.js
|
23
|
+
| └── stylesheets/
|
24
|
+
| └── application.css
|
25
|
+
├── bemer_components/
|
26
|
+
| ├── progress/
|
27
|
+
| | ├── index.html.slim
|
28
|
+
| | ├── index.js
|
29
|
+
| | └── index.css
|
30
|
+
| ├── stacked_progress/
|
31
|
+
| | └── index.html.slim
|
32
|
+
| └── ...
|
33
|
+
└── ...
|
34
|
+
```
|
35
|
+
Подключение технологий JavaScript и CSS компонента `progress` при использовании Sprockets:
|
36
|
+
|
37
|
+
```js
|
38
|
+
// Файл app/assets/javascripts/application.js
|
39
|
+
//= require progress
|
40
|
+
```
|
41
|
+
|
42
|
+
```scss
|
43
|
+
// Файл app/assets/stylesheets/application.css
|
44
|
+
//= require progress
|
45
|
+
```
|
46
|
+
В качестве структуры компонента `progress` будет взят [компонент `Progress bar` из библиотеки Twitter Bootstrap](https://getbootstrap.com/docs/3.3/components/#progress):
|
47
|
+
|
48
|
+
```html
|
49
|
+
<!-- Исходная HTML структура компонента Progress bar из библиотеки Twitter Bootstrap -->
|
50
|
+
<div class="progress">
|
51
|
+
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;">
|
52
|
+
60%
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
```
|
56
|
+
Возможный вариант разметки компонента `progress` с использованием `define_component` по методологии БЭМ:
|
57
|
+
```slim
|
58
|
+
/ Содержимое файла index.html.slim компонента panel
|
59
|
+
= define_component bem_cascade: false, tag: :div do |component|
|
60
|
+
= component.block :progress, cls: :progress do |progress|
|
61
|
+
= progress.elem :bar, role: :progressbar, cls: :progress_bar, 'aria-valuemin': 0, 'aria-valuemax': 100
|
62
|
+
```
|
63
|
+
## Создание нового компонента на основе существующего
|
64
|
+
|
65
|
+
Для компонент структура которых была создана [с помощью `define_component`](Хелпер-define_component.md), можно делать переопределение структуры (дерева).
|
66
|
+
|
67
|
+
Создание компонента [`stacked_progress`](https://getbootstrap.com/docs/3.3/components/#progress-stacked) на основе компонента `progress`:
|
68
|
+
|
69
|
+
```slim
|
70
|
+
/ Содержимое файла index.html.slim компонента stacked_progress
|
71
|
+
= refine_component :progress do |template|
|
72
|
+
= template.block(:progress) do |progress|
|
73
|
+
= progress.content do |node|
|
74
|
+
= node.content
|
75
|
+
= node.content
|
76
|
+
= node.content
|
77
|
+
|
78
|
+
/ Эквивалентная запись
|
79
|
+
= refine_component :progress do |template|
|
80
|
+
= template.block(:progress) do |progress|
|
81
|
+
= progress.content do |node|
|
82
|
+
- 3.times do
|
83
|
+
= node.content
|
84
|
+
|
85
|
+
```
|
86
|
+
Теперь можно вызвать новый компонент `stacked_progress`:
|
87
|
+
```slim
|
88
|
+
= render_component :stacked_progress do |template|
|
89
|
+
= template.elem :bar do |bar|
|
90
|
+
= bar.add_cls :progress_bar_striped, :active
|
91
|
+
= bar.specify(->(node) { node.first? }) do |first_bar|
|
92
|
+
= first_bar.add_attrs 'aria-valuenow': 20, style: 'width: 20%'
|
93
|
+
= first_bar.add_cls :progress_bar_danger
|
94
|
+
= bar.specify(->(node) { node.position.eql?(2) }) do |middle_bar|
|
95
|
+
= middle_bar.add_attrs 'aria-valuenow': 30, style: 'width: 30%'
|
96
|
+
= middle_bar.add_cls :progress_bar_warning
|
97
|
+
= bar.specify(->(node) { node.last? }) do |last_bar|
|
98
|
+
= last_bar.add_attrs 'aria-valuenow': 40, style: 'width: 40%'
|
99
|
+
= last_bar.add_cls :progress_bar_success
|
100
|
+
|
101
|
+
/ =>
|
102
|
+
/ <div class="progress">
|
103
|
+
/ <div role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%" class="progress-bar progress-bar-striped active progress-bar-danger"></div>
|
104
|
+
/ <div role="progressbar" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100" style="width: 30%" class="progress-bar progress-bar-striped active progress-bar-warning"></div>
|
105
|
+
/ <div role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%" class="progress-bar progress-bar-striped active progress-bar-success"></div>
|
106
|
+
/ </div>
|
107
|
+
```
|
108
|
+
## Параметр `prefix`
|
109
|
+
|
110
|
+
Для чего нужен и как использовать параметр `prefix` можно прочитать [здесь](Конфигурация.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-default_path_prefix).
|
111
|
+
|
112
|
+
## Параметр `cached`
|
113
|
+
|
114
|
+
Описание про `cached` можно найти [в `component_pack`](Хелпер-component_pack.md).
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# Хелпер render_component
|
2
|
+
|
3
|
+
**ВАЖНО**. *Является псевдонимом для `refine_component`.*
|
4
|
+
|
5
|
+
**ВАЖНО**. *Только для компонент, структура (дерево) которых была создана с помощью [хелпера `define_component`](Хелпер-define_component.md) доступно использование [BEMHTML шаблонов](Шаблоны.md).*
|
6
|
+
|
7
|
+
**ДОПОЛНИТЕЛЬНО**. *Различные способы создания и рендеринга компонент описаны [здесь](Создание-и-использование-UI-компонент.md).*
|
8
|
+
|
9
|
+
Соглашения по использованию:
|
10
|
+
1. `render_component` используется для рендеринга компонент
|
11
|
+
1. `refine_component` используется для создания новых компонент на основе существующих, реализованных [с помощью `define_component`](Хелпер-define_component.md)
|
12
|
+
|
13
|
+
Используя `render_component` можно получать HTML структуру компонента, а если компонент был создан [с помощью `define_component`](Хелпер-define_component.md) тогда и изменять его структуру/внешний вид с помощью шаблонов BEMHTML.
|
14
|
+
|
15
|
+
Все передаваемые параметры будут доступны в теле компонента как локальные переменные, исключение составляют параметры `cached` и `prefix`.
|
16
|
+
|
17
|
+
Используется следующая файловая структура:
|
18
|
+
```
|
19
|
+
app/
|
20
|
+
├── assets/
|
21
|
+
| ├── javascripts/
|
22
|
+
| | └── application.js
|
23
|
+
| └── stylesheets/
|
24
|
+
| └── application.css
|
25
|
+
├── bemer_components/
|
26
|
+
| ├── progress/
|
27
|
+
| | ├── index.html.slim
|
28
|
+
| | ├── index.js
|
29
|
+
| | └── index.css
|
30
|
+
| └── ...
|
31
|
+
└── ...
|
32
|
+
```
|
33
|
+
Подключение технологий JavaScript и CSS компонента `progress` при использовании Sprockets:
|
34
|
+
|
35
|
+
```js
|
36
|
+
// Файл app/assets/javascripts/application.js
|
37
|
+
//= require progress
|
38
|
+
```
|
39
|
+
|
40
|
+
```scss
|
41
|
+
// Файл app/assets/stylesheets/application.css
|
42
|
+
//= require progress
|
43
|
+
```
|
44
|
+
В качестве структуры компонента `progress` будет взят [компонент `Progress bar` из библиотеки Twitter Bootstrap](https://getbootstrap.com/docs/3.3/components/#progress):
|
45
|
+
|
46
|
+
```html
|
47
|
+
<!-- Исходная HTML структура компонента Progress bar из библиотеки Twitter Bootstrap -->
|
48
|
+
<div class="progress">
|
49
|
+
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;">
|
50
|
+
60%
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
```
|
54
|
+
Возможный вариант разметки компонента `progress` с использованием `define_component` по методологии БЭМ:
|
55
|
+
```slim
|
56
|
+
/ Содержимое файла index.html.slim компонента panel
|
57
|
+
= define_component bem_cascade: false, tag: :div do |component|
|
58
|
+
= component.block :progress, cls: :progress do |progress|
|
59
|
+
= progress.elem :bar, role: :progressbar, cls: :progress_bar
|
60
|
+
```
|
61
|
+
## Использование BEMHTML шаблонов
|
62
|
+
|
63
|
+
В случае если структура компонента была создана [с помощью `define_component`](Хелпер-define_component.md), тогда при вызове `render_component` можно передать `&block` в теле которого будет доступен билдер (builder) шаблонов технологии BEMHTML:
|
64
|
+
|
65
|
+
```slim
|
66
|
+
/ Эквивалентный результат, только режим `attrs` здесь будет быстрее чем цепочка `add_attrs`
|
67
|
+
= render_component :progress do |template|
|
68
|
+
= template.elem :bar do |bar|
|
69
|
+
= bar.attrs 'aria-valuenow': 60, 'aria-valuemin': 0, 'aria-valuemax': 100, style: 'width: 60%;'
|
70
|
+
= bar.content '60%'
|
71
|
+
|
72
|
+
= render_component :progress do |template|
|
73
|
+
= template.elem :bar do |bar|
|
74
|
+
= bar.add_attrs 'aria-valuenow': 60
|
75
|
+
= bar.add_attrs 'aria-valuemin': 0
|
76
|
+
= bar.add_attrs 'aria-valuemax': 100
|
77
|
+
= bar.add_attrs style: 'width: 60%;'
|
78
|
+
= bar.content '60%'
|
79
|
+
|
80
|
+
/ =>
|
81
|
+
/ <div class="progress">
|
82
|
+
/ <div role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;" class="progress-bar">
|
83
|
+
/ 60%
|
84
|
+
/ </div>
|
85
|
+
/ </div>
|
86
|
+
```
|
87
|
+
Для изменения внешнего вида, можно добавить css классы `progress-bar-success`, `progress-bar-striped` и `active`:
|
88
|
+
```slim
|
89
|
+
= render_component :progress do |template|
|
90
|
+
= template.elem :bar do |bar|
|
91
|
+
= bar.attrs 'aria-valuenow': 60, 'aria-valuemin': 0, 'aria-valuemax': 100, style: 'width: 60%;'
|
92
|
+
= bar.content '60%'
|
93
|
+
= bar.add_cls :progress_bar_striped, :active, :progress_bar_success
|
94
|
+
|
95
|
+
/ =>
|
96
|
+
/ <div class="progress">
|
97
|
+
/ <div aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;" class="progress-bar progress-bar-striped active progress-bar-success">
|
98
|
+
/ 60%
|
99
|
+
/ </div>
|
100
|
+
/ </div>
|
101
|
+
```
|
102
|
+
## Параметр `prefix`
|
103
|
+
|
104
|
+
Для чего нужен и как использовать параметр `prefix` можно прочитать [здесь](Конфигурация.md#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-default_path_prefix).
|
105
|
+
|
106
|
+
## Параметр `cached`
|
107
|
+
|
108
|
+
Описание про `cached` можно найти [в `component_pack`](Хелпер-component_pack.md).
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Шаблоны
|
2
|
+
|
3
|
+
**ВАЖНО**. *Только для компонент, [структура (дерево) которых была создана](Создание-и-использование-UI-компонент.md) с помощью [хелпера `define_component`](Хелпер-define_component.md) доступно использование BEMHTML шаблонов.*
|
4
|
+
|
5
|
+
**ВАЖНО**. *Шаблоны должны быть максимально простыми и не содержать излишней логики.*
|
6
|
+
|
7
|
+
Каждый шаблон, например, `template.elem(:message).replace 'Plain text'` состоит из:
|
8
|
+
1. `elem(:message)` - [предикат](Предикаты.md)
|
9
|
+
1. `replace` - [режим](Режимы.md)
|
10
|
+
1. `'Plain text'` - тело
|
11
|
+
|
12
|
+
Если для узла из структуры (дерева) компонента, все условия в предикате верны, тогда для этого узла будет применено тело шаблона в указанном режиме изменения данных.
|
13
|
+
|
14
|
+
Шаблоны можно создавать используя хелперы `define_templates`, `render_component` и `refine_component`.
|
15
|
+
|
16
|
+
## Примеры шаблонов
|
17
|
+
|
18
|
+
### Шаблоны по умолчанию для компонента из файла `index.bemhtml.slim`
|
19
|
+
|
20
|
+
```slim
|
21
|
+
= define_templates do |template|
|
22
|
+
= template.block(:panel).add_cls :panel_default
|
23
|
+
```
|
24
|
+
|
25
|
+
### Шаблоны при использовании `render_component`
|
26
|
+
|
27
|
+
```slim
|
28
|
+
= render_component :alert do |template|
|
29
|
+
= template.block(:alert).add_cls :alert_info
|
30
|
+
= template.elem(:message).content do |node, builder|
|
31
|
+
span HTML content
|
32
|
+
= node.content
|
33
|
+
= builder.text TextNode content
|
34
|
+
```
|
35
|
+
|
36
|
+
### Шаблоны при использовании `refine_component`
|
37
|
+
|
38
|
+
```slim
|
39
|
+
= refine_component :progress do |template|
|
40
|
+
= template.block(:progress).content do |node|
|
41
|
+
= node.content
|
42
|
+
= node.content
|
43
|
+
= node.content
|
44
|
+
```
|
data/lib/bemer.rb
CHANGED
@@ -22,6 +22,7 @@ module Bemer
|
|
22
22
|
autoload :EntityBuilder
|
23
23
|
autoload :MixinList
|
24
24
|
autoload :ModifierList
|
25
|
+
autoload :PathResolver
|
25
26
|
autoload :Pipeline
|
26
27
|
autoload :Predicate
|
27
28
|
autoload :Renderer
|
@@ -57,7 +58,7 @@ module Bemer
|
|
57
58
|
alias prepend_asset_paths? prepend_asset_paths
|
58
59
|
|
59
60
|
def config
|
60
|
-
Configuration.instance
|
61
|
+
Bemer::Configuration.instance
|
61
62
|
end
|
62
63
|
|
63
64
|
def setup
|
@@ -70,6 +71,7 @@ module Bemer
|
|
70
71
|
Bemer::Builders.eager_load!
|
71
72
|
end
|
72
73
|
|
74
|
+
# entity_class
|
73
75
|
def bem_class(block, element = nil)
|
74
76
|
return '' if block.blank? || (!element.nil? && element.blank?)
|
75
77
|
|
data/lib/bemer/builders.rb
CHANGED
data/lib/bemer/builders/tree.rb
CHANGED
@@ -1,16 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'active_support/dependencies/autoload'
|
4
|
-
|
5
3
|
module Bemer
|
6
4
|
module Builders
|
7
5
|
class Tree
|
8
|
-
extend ActiveSupport::Autoload
|
9
|
-
|
10
|
-
eager_autoload do
|
11
|
-
autoload :Element
|
12
|
-
end
|
13
|
-
|
14
6
|
def initialize(tree)
|
15
7
|
@tree = tree
|
16
8
|
end
|