bemer 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +5 -5
  2. data/{LICENSE-RU → LICENSE-RU.txt} +0 -0
  3. data/{LICENSE → LICENSE.txt} +5 -5
  4. data/README.md +47 -16
  5. data/docs/BEMHTML.md +5 -0
  6. data/docs//320/232/320/276/320/275/321/202/320/265/320/272/321/201/321/202-/321/203/320/267/320/273/320/260.md +275 -0
  7. data/docs//320/232/320/276/320/275/321/204/320/270/320/263/321/203/321/200/320/260/321/206/320/270/321/217.md +158 -0
  8. data/docs//320/237/321/200/320/265/320/264/320/270/320/272/320/260/321/202/321/213.md +205 -0
  9. data/docs//320/240/320/265/320/266/320/270/320/274/321/213.md +274 -0
  10. data/docs//320/241/320/276/320/267/320/264/320/260/320/275/320/270/320/265-/320/270-/320/270/321/201/320/277/320/276/320/273/321/214/320/267/320/276/320/262/320/260/320/275/320/270/320/265-UI-/320/272/320/276/320/274/320/277/320/276/320/275/320/265/320/275/321/202.md +173 -0
  11. data/docs//320/244/320/260/320/270/314/206/320/273/320/276/320/262/320/260/321/217-/321/201/321/202/321/200/321/203/320/272/321/202/321/203/321/200/320/260.md +167 -0
  12. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-bem_mix.md +62 -0
  13. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-bem_mods.md +63 -0
  14. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-block_tag.md +215 -0
  15. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_asset_path.md +71 -0
  16. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_pack.md +101 -0
  17. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-component_partial_path.md +28 -0
  18. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-define_component.md +154 -0
  19. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-define_templates.md +96 -0
  20. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-elem_tag.md +38 -0
  21. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-refine_component.md +114 -0
  22. data/docs//320/245/320/265/320/273/320/277/320/265/321/200-render_component.md +108 -0
  23. data/docs//320/250/320/260/320/261/320/273/320/276/320/275/321/213.md +44 -0
  24. data/lib/bemer.rb +3 -1
  25. data/lib/bemer/builders.rb +8 -0
  26. data/lib/bemer/builders/tree.rb +0 -8
  27. data/lib/bemer/configuration.rb +3 -1
  28. data/lib/bemer/context_extentions/structure.rb +2 -3
  29. data/lib/bemer/entity.rb +2 -2
  30. data/lib/bemer/entity_builder.rb +5 -9
  31. data/lib/bemer/helpers.rb +10 -0
  32. data/lib/bemer/mixin_list.rb +1 -1
  33. data/lib/bemer/modifier_list.rb +2 -2
  34. data/lib/bemer/path_resolver.rb +23 -0
  35. data/lib/bemer/pipeline/handler.rb +4 -6
  36. data/lib/bemer/railtie.rb +22 -9
  37. data/lib/bemer/renderer.rb +1 -1
  38. data/lib/bemer/template_list.rb +2 -4
  39. data/lib/bemer/tree.rb +3 -3
  40. data/lib/bemer/tree/node.rb +5 -7
  41. data/lib/bemer/version.rb +1 -1
  42. data/spec/bemer/railtie_spec.rb +95 -0
  43. data/spec/dummy/config/application.rb +30 -12
  44. data/spec/dummy/config/initializers/backtrace_silencers.rb +1 -5
  45. data/spec/dummy/config/initializers/bemer.rb +1 -3
  46. data/spec/rails_helper.rb +5 -9
  47. metadata +87 -129
  48. data/.gitignore +0 -17
  49. data/.overcommit.yml +0 -59
  50. data/.rspec +0 -4
  51. data/.rubocop.yml +0 -21
  52. data/.rubocop_todo.yml +0 -11
  53. data/Gemfile +0 -12
  54. data/Rakefile +0 -12
  55. data/bemer.gemspec +0 -43
  56. data/spec/dummy/Rakefile +0 -8
  57. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  58. data/spec/dummy/app/helpers/application_helper.rb +0 -4
  59. data/spec/dummy/app/jobs/application_job.rb +0 -4
  60. data/spec/dummy/app/mailers/application_mailer.rb +0 -6
  61. data/spec/dummy/app/models/application_record.rb +0 -5
  62. data/spec/dummy/app/models/concerns/.keep +0 -0
  63. data/spec/dummy/app/views/layouts/mailer.html.erb +0 -13
  64. data/spec/dummy/app/views/layouts/mailer.text.erb +0 -1
  65. data/spec/dummy/bin/bundle +0 -5
  66. data/spec/dummy/bin/rails +0 -6
  67. data/spec/dummy/bin/rake +0 -6
  68. data/spec/dummy/bin/setup +0 -39
  69. data/spec/dummy/bin/update +0 -31
  70. data/spec/dummy/bin/yarn +0 -13
  71. data/spec/dummy/config/cable.yml +0 -10
  72. data/spec/dummy/config/database.yml +0 -25
  73. data/spec/dummy/config/environments/development.rb +0 -51
  74. data/spec/dummy/config/environments/production.rb +0 -84
  75. data/spec/dummy/config/environments/test.rb +0 -44
  76. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -7
  77. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -7
  78. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -6
  79. data/spec/dummy/config/initializers/inflections.rb +0 -17
  80. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  81. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  82. data/spec/dummy/config/locales/en.yml +0 -33
  83. data/spec/dummy/config/puma.rb +0 -58
  84. data/spec/dummy/config/routes.rb +0 -5
  85. data/spec/dummy/config/secrets.yml +0 -32
  86. data/spec/dummy/config/spring.rb +0 -8
  87. data/spec/dummy/lib/assets/.keep +0 -0
  88. data/spec/dummy/log/.keep +0 -0
  89. data/spec/dummy/package.json +0 -5
  90. data/spec/dummy/public/404.html +0 -67
  91. data/spec/dummy/public/422.html +0 -67
  92. data/spec/dummy/public/500.html +0 -66
  93. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  94. data/spec/dummy/public/apple-touch-icon.png +0 -0
  95. data/spec/dummy/public/favicon.ico +0 -0
@@ -0,0 +1,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
+ ```
@@ -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
 
@@ -12,6 +12,14 @@ module Bemer
12
12
  autoload :Tree
13
13
  end
14
14
 
15
+ class Tree
16
+ extend ActiveSupport::Autoload
17
+
18
+ eager_autoload do
19
+ autoload :Element
20
+ end
21
+ end
22
+
15
23
  module Tag
16
24
  extend ActiveSupport::Autoload
17
25
 
@@ -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