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,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
|