alveole 0.0.1

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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.gitlab-ci.yml +55 -0
  4. data/.rubocop.yml +63 -0
  5. data/.rubocop_todo.yml +12 -0
  6. data/.travis.yml +6 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +7 -0
  9. data/Gemfile.lock +171 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +44 -0
  12. data/Rakefile +10 -0
  13. data/alveole.gemspec +35 -0
  14. data/bin/console +14 -0
  15. data/bin/setup +8 -0
  16. data/lib/alveole/components/avatar_component/avatar_component.html.slim +6 -0
  17. data/lib/alveole/components/avatar_component.rb +9 -0
  18. data/lib/alveole/components/badge_component/badge_component.html.slim +2 -0
  19. data/lib/alveole/components/badge_component.rb +8 -0
  20. data/lib/alveole/components/breadcrumb_component/breadcrumb_component.html.slim +2 -0
  21. data/lib/alveole/components/breadcrumb_component.rb +8 -0
  22. data/lib/alveole/components/breadcrumbs_component.rb +7 -0
  23. data/lib/alveole/components/button_component/button_component.html.slim +5 -0
  24. data/lib/alveole/components/button_component.rb +15 -0
  25. data/lib/alveole/components/definition_component/definition_component.html.slim +4 -0
  26. data/lib/alveole/components/definition_component.rb +13 -0
  27. data/lib/alveole/components/form_component/form_component.html.slim +3 -0
  28. data/lib/alveole/components/form_component.rb +3 -0
  29. data/lib/alveole/components/form_submit_component/form_submit_component.html.slim +1 -0
  30. data/lib/alveole/components/form_submit_component.rb +7 -0
  31. data/lib/alveole/components/heading_component/heading_component.html.slim +4 -0
  32. data/lib/alveole/components/heading_component.rb +8 -0
  33. data/lib/alveole/components/input_component/input_component.html.slim +17 -0
  34. data/lib/alveole/components/input_component.rb +42 -0
  35. data/lib/alveole/components/notice_component/notice_component.html.slim +5 -0
  36. data/lib/alveole/components/notice_component.rb +15 -0
  37. data/lib/alveole/components/page_component/page_component.html.slim +10 -0
  38. data/lib/alveole/components/page_component.rb +4 -0
  39. data/lib/alveole/components/sidebar_component/sidebar_component.html.slim +7 -0
  40. data/lib/alveole/components/sidebar_component.rb +4 -0
  41. data/lib/alveole/components/table_column_component/table_column_component.html.slim +3 -0
  42. data/lib/alveole/components/table_column_component.rb +12 -0
  43. data/lib/alveole/components/table_component/table_component.html.slim +7 -0
  44. data/lib/alveole/components/table_component.rb +3 -0
  45. data/lib/alveole/components/table_header_component/table_header_component.html.slim +2 -0
  46. data/lib/alveole/components/table_header_component.rb +8 -0
  47. data/lib/alveole/components/table_row_component/table_row_component.html.slim +4 -0
  48. data/lib/alveole/components/table_row_component.rb +3 -0
  49. data/lib/alveole/components/toolbar_component/toolbar_component.html.slim +7 -0
  50. data/lib/alveole/components/toolbar_component.rb +4 -0
  51. data/lib/alveole/concerns/bem.rb +21 -0
  52. data/lib/alveole/engine.rb +30 -0
  53. data/lib/alveole/helpers/method_helper.rb +31 -0
  54. data/lib/alveole/javascript/components.js +5 -0
  55. data/lib/alveole/previews/avatar_component_preview.rb +11 -0
  56. data/lib/alveole/previews/badge_component_preview.rb +11 -0
  57. data/lib/alveole/previews/breadcrumb_component_preview.rb +15 -0
  58. data/lib/alveole/previews/button_component_preview.rb +7 -0
  59. data/lib/alveole/previews/definition_component_preview.rb +33 -0
  60. data/lib/alveole/previews/form_component_preview.rb +18 -0
  61. data/lib/alveole/previews/form_submit_component_preview.rb +7 -0
  62. data/lib/alveole/previews/heading_component_preview.rb +11 -0
  63. data/lib/alveole/previews/input_component_preview.rb +32 -0
  64. data/lib/alveole/previews/notice_component_preview.rb +15 -0
  65. data/lib/alveole/previews/page_component_preview.rb +33 -0
  66. data/lib/alveole/previews/sidebar_component_preview.rb +33 -0
  67. data/lib/alveole/previews/table_column_component_preview.rb +36 -0
  68. data/lib/alveole/previews/table_component_preview.rb +12 -0
  69. data/lib/alveole/previews/table_header_component_preview.rb +27 -0
  70. data/lib/alveole/previews/table_row_component_preview.rb +18 -0
  71. data/lib/alveole/previews/toolbar_component_preview.rb +33 -0
  72. data/lib/alveole/version.rb +3 -0
  73. data/lib/alveole.rb +16 -0
  74. data/lib/generators/alveole/config_generator.rb +17 -0
  75. data/lib/generators/alveole/templates/alveole_config.rb +1 -0
  76. metadata +197 -0
@@ -0,0 +1,31 @@
1
+ module Alveole
2
+ module Helper
3
+ module ComponentHelper
4
+ def component(name, *args, &block)
5
+ component_args = {}
6
+ component_args = args.pop if args[-1].is_a? Hash
7
+ component_args[:modifiers] = args unless args.empty?
8
+ component_class = "#{name}_component".camelize.constantize
9
+
10
+ render(component_class.new(**component_args), &block)
11
+ end
12
+
13
+ def format_value(value, options = {})
14
+ return if value.nil?
15
+
16
+ v = value
17
+ v = I18n.l(v.to_date, format: :short) if options[:date]
18
+ v = I18n.l(v.to_datetime, format: :short) if options[:time]
19
+
20
+ v
21
+ end
22
+
23
+ def label_for(obj, fieldname)
24
+ return unless obj && fieldname
25
+
26
+ return obj.class.human_attribute_name(fieldname) if obj.class.respond_to?(:human_attribute_name)
27
+ return obj.klass.human_attribute_name(fieldname) if obj.respond_to?(:klass) && obj.klass.respond_to?(:human_attribute_name)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,5 @@
1
+ // Import in Application.js:
2
+ // import '../components';
3
+
4
+ // BUTTON
5
+ import '../components/button_component/button_component.scss'
@@ -0,0 +1,11 @@
1
+ class AvatarComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(AvatarComponent.new(image: '/example/image', url: '/example/url'))
6
+ end
7
+
8
+ def without_url
9
+ render(AvatarComponent.new(image: '/example/image'))
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class BadgeComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(BadgeComponent.new(label: 'example de badge'))
6
+ end
7
+
8
+ def with_options
9
+ render(BadgeComponent.new(label: 'example de badge', options: { data: 'example-option' }))
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ class BreadcrumbComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(BreadcrumbComponent.new(label: 'Example Breadcrumb', url: '/example/url'))
6
+ end
7
+
8
+ def without_url
9
+ render(BreadcrumbComponent.new(label: 'Example Breadcrumb'))
10
+ end
11
+
12
+ def breadcrumbs
13
+ render(BreadcrumbsComponent.new)
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ class ButtonComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(ButtonComponent.new(label: 'Example button', url: '/example/url'))
6
+ end
7
+ end
@@ -0,0 +1,33 @@
1
+ class DefinitionComponentPreview < ViewComponent::Preview
2
+ class TempObj
3
+ def self.human_attribute_name(_)
4
+ 'label'
5
+ end
6
+
7
+ def fieldname
8
+ 'value'
9
+ end
10
+ end
11
+
12
+ layout false
13
+
14
+ def default
15
+ temp_obj = TempObj.new
16
+ render(DefinitionComponent.new(label: nil, value: nil, obj: temp_obj, fieldname: :fieldname, options: {}))
17
+ end
18
+
19
+ def with_label
20
+ temp_obj = TempObj.new
21
+ render(DefinitionComponent.new(label: 'custom label', value: nil, obj: temp_obj, fieldname: :fieldname, options: {}))
22
+ end
23
+
24
+ def with_value
25
+ temp_obj = TempObj.new
26
+ render(DefinitionComponent.new(label: nil, value: 'custom value', obj: temp_obj, fieldname: :fieldname, options: {}))
27
+ end
28
+
29
+ def with_options
30
+ temp_obj = TempObj.new
31
+ render(DefinitionComponent.new(label: nil, value: nil, obj: temp_obj, fieldname: :fieldname, options: { style: 'color:red' }))
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ class FormComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(FormComponent.new) do |form|
6
+ form.actions do
7
+ tag.span('Example actions')
8
+ end
9
+ tag.span('Example content')
10
+ end
11
+ end
12
+
13
+ def without_actions
14
+ render(FormComponent.new) do |_form|
15
+ tag.span('Example content')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ class FormSubmitComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(FormSubmitComponent.new(label: 'Example label'))
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ class HeadingComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(HeadingComponent.new(heading: 'Example heading', sub: 'Example sub title'))
6
+ end
7
+
8
+ def without_sub
9
+ render(HeadingComponent.new(heading: 'Example heading', sub: nil))
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ class InputComponentPreview < ViewComponent::Preview
2
+ class TempObj
3
+ attr_accessor :fieldname
4
+
5
+ def initialize(fieldname = 'Example value')
6
+ @fieldname = fieldname
7
+ end
8
+
9
+ def self.human_attribute_name(_)
10
+ 'label'
11
+ end
12
+ end
13
+
14
+ layout false
15
+
16
+ def default
17
+ raise 'not implemented yet'
18
+ # temp_obj = TempObj.new
19
+
20
+ # ActionView::Helpers.form_for temp_obj do |form_builder|
21
+ # # form_builder = ActionView::Helpers::FormBuilder.new(:temp_obj, temp_obj, {}, {})
22
+
23
+ # render(InputComponent.new(type: :text,
24
+ # label: nil,
25
+ # value: nil,
26
+ # form: form_builder,
27
+ # fieldname: :fieldname,
28
+ # collection: nil,
29
+ # options: {}))
30
+ # end
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ class NoticeComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(NoticeComponent.new(title: 'Example Alert', messages: ['Message 1', 'Message 2']))
6
+ end
7
+
8
+ def without_messages
9
+ render(NoticeComponent.new(title: 'Example Notice'))
10
+ end
11
+
12
+ def with_type_notice
13
+ render(NoticeComponent.new(title: 'Example Notice', messages: ['Message 1', 'Message 2'], type: 'notice'))
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ class PageComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(PageComponent.new) do |page|
6
+ page.actions do
7
+ tag.span('Example actions')
8
+ end
9
+ page.header do
10
+ tag.span('Example header')
11
+ end
12
+ tag.span('Example content')
13
+ end
14
+ end
15
+
16
+ def without_actions
17
+ render(PageComponent.new) do |page|
18
+ page.header do
19
+ tag.span('Example header')
20
+ end
21
+ tag.span('Example content')
22
+ end
23
+ end
24
+
25
+ def without_header
26
+ render(PageComponent.new) do |page|
27
+ page.actions do
28
+ tag.span('Example actions')
29
+ end
30
+ tag.span('Example content')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ class SidebarComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(SidebarComponent.new) do |sidebar|
6
+ sidebar.top do
7
+ tag.span('Example top')
8
+ end
9
+ sidebar.bottom do
10
+ tag.span('Example bottom')
11
+ end
12
+ tag.span('Example content')
13
+ end
14
+ end
15
+
16
+ def without_top
17
+ render(SidebarComponent.new) do |sidebar|
18
+ sidebar.bottom do
19
+ tag.span('Example bottom')
20
+ end
21
+ tag.span('Example content')
22
+ end
23
+ end
24
+
25
+ def without_bottom
26
+ render(SidebarComponent.new) do |sidebar|
27
+ sidebar.top do
28
+ tag.span('Example top')
29
+ end
30
+ tag.span('Example content')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ class TableColumnComponentPreview < ViewComponent::Preview
2
+ class TempObj
3
+ attr_accessor :fieldname
4
+
5
+ def initialize(fieldname = 'Example value')
6
+ @fieldname = fieldname
7
+ end
8
+ end
9
+
10
+ layout false
11
+
12
+ def default
13
+ temp_obj = TempObj.new
14
+ render(TableColumnComponent.new(value: nil, obj: temp_obj, fieldname: :fieldname, url: nil, options: {}))
15
+ end
16
+
17
+ def with_url
18
+ temp_obj = TempObj.new
19
+ render(TableColumnComponent.new(value: nil, obj: temp_obj, fieldname: :fieldname, url: 'example/url', options: {}))
20
+ end
21
+
22
+ def with_date
23
+ temp_obj = TempObj.new(Time.zone.today)
24
+ render(TableColumnComponent.new(value: nil, obj: temp_obj, fieldname: :fieldname, url: 'example/url', options: { date: true }))
25
+ end
26
+
27
+ def with_time
28
+ temp_obj = TempObj.new(Time.zone.now)
29
+ render(TableColumnComponent.new(value: nil, obj: temp_obj, fieldname: :fieldname, url: 'example/url', options: { time: true }))
30
+ end
31
+
32
+ def with_custom_value
33
+ temp_obj = TempObj.new
34
+ render(TableColumnComponent.new(value: 'custom value', obj: temp_obj, fieldname: :fieldname, url: nil, options: {}))
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ class TableComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(TableComponent.new) do |table|
6
+ table.headers do
7
+ tag.th('Example header')
8
+ end
9
+ tag.tr(tag.td('Example column'))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ class TableHeaderComponentPreview < ViewComponent::Preview
2
+ class TempObj
3
+ def self.human_attribute_name(_)
4
+ 'label'
5
+ end
6
+
7
+ def fieldname
8
+ 'value'
9
+ end
10
+ end
11
+
12
+ layout false
13
+
14
+ def default
15
+ temp_obj = TempObj.new
16
+ render(TableHeaderComponent.new(label: nil, url: nil, obj: temp_obj, fieldname: :fieldname))
17
+ end
18
+
19
+ def with_url
20
+ temp_obj = TempObj.new
21
+ render(TableHeaderComponent.new(label: nil, url: 'example/url', obj: temp_obj, fieldname: :fieldname))
22
+ end
23
+
24
+ def with_custom_label
25
+ render(TableHeaderComponent.new(label: 'Custom label', url: nil, obj: nil, fieldname: nil))
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ class TableRowComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(TableRowComponent.new) do |tablerow|
6
+ tablerow.actions do
7
+ tag.td('Example actions')
8
+ end
9
+ tag.td('Example content')
10
+ end
11
+ end
12
+
13
+ def without_actions
14
+ render(TableRowComponent.new) do |_tablerow|
15
+ tag.td('Example content')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ class ToolbarComponentPreview < ViewComponent::Preview
2
+ layout false
3
+
4
+ def default
5
+ render(ToolbarComponent.new) do |toolbar|
6
+ toolbar.left do
7
+ tag.span('Example left')
8
+ end
9
+ toolbar.right do
10
+ tag.span('Example right')
11
+ end
12
+ tag.span('Example content')
13
+ end
14
+ end
15
+
16
+ def without_left
17
+ render(ToolbarComponent.new) do |toolbar|
18
+ toolbar.right do
19
+ tag.span('Example right')
20
+ end
21
+ tag.span('Example content')
22
+ end
23
+ end
24
+
25
+ def without_right
26
+ render(ToolbarComponent.new) do |toolbar|
27
+ toolbar.left do
28
+ tag.span('Example left')
29
+ end
30
+ tag.span('Example content')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,3 @@
1
+ module Alveole
2
+ VERSION = '0.0.1'.freeze
3
+ end
data/lib/alveole.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'rails'
2
+ require 'view_component'
3
+
4
+ require 'alveole/version'
5
+ require 'alveole/concerns/bem'
6
+ require 'alveole/helpers/method_helper'
7
+
8
+ if defined? ::Rails::Railtie
9
+ # require 'alveole/railtie'
10
+ require 'alveole/engine'
11
+ end
12
+
13
+ module Alveole
14
+ class Error < StandardError; end
15
+ # Your code goes here...
16
+ end