bs5 0.0.13 → 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/components/bs5/accordion_component.html.erb +4 -11
  4. data/app/components/bs5/accordion_component.rb +1 -0
  5. data/app/components/bs5/alert_component.html.erb +1 -1
  6. data/app/components/bs5/button_group_component.html.erb +3 -0
  7. data/app/components/bs5/button_group_component.rb +49 -0
  8. data/app/components/bs5/button_toolbar_component.html.erb +3 -0
  9. data/app/components/bs5/button_toolbar_component.rb +21 -0
  10. data/app/helpers/bs5/components_helper.rb +12 -8
  11. data/app/service/bs5/collapse_service.rb +49 -0
  12. data/app/service/bs5/popover_service.rb +31 -0
  13. data/app/service/bs5/tooltip_service.rb +31 -0
  14. data/app/views/bs5/examples/button_group/button_toolbar/_example.html.erb +3 -0
  15. data/app/views/bs5/examples/button_group/button_toolbar/snippet.html.erb +18 -0
  16. data/app/views/bs5/examples/button_group/button_toolbar/snippet2.html.erb +27 -0
  17. data/app/views/bs5/examples/button_group/default/_example.html.erb +2 -0
  18. data/app/views/bs5/examples/button_group/default/snippet.html.erb +5 -0
  19. data/app/views/bs5/examples/button_group/sizing/_example.html.erb +2 -0
  20. data/app/views/bs5/examples/button_group/sizing/snippet.html.erb +17 -0
  21. data/app/views/bs5/examples/button_group/vertical/_example.html.erb +2 -0
  22. data/app/views/bs5/examples/button_group/vertical/snippet.html.erb +8 -0
  23. data/app/views/bs5/examples/collapse/default/_example.html.erb +4 -0
  24. data/app/views/bs5/examples/collapse/default/multiple_targets.html.erb +21 -0
  25. data/app/views/bs5/examples/collapse/default/snippet.html.erb +9 -0
  26. data/app/views/bs5/examples/popovers/default/_example.html.erb +2 -0
  27. data/app/views/bs5/examples/popovers/default/snippet.html.erb +1 -0
  28. data/app/views/bs5/examples/popovers/disabled_elements/_example.html.erb +2 -0
  29. data/app/views/bs5/examples/popovers/disabled_elements/snippet.html.erb +3 -0
  30. data/app/views/bs5/examples/popovers/dismissable_on_next_click/_example.html.erb +2 -0
  31. data/app/views/bs5/examples/popovers/dismissable_on_next_click/snippet.html.erb +1 -0
  32. data/app/views/bs5/examples/popovers/four_directions/_example.html.erb +2 -0
  33. data/app/views/bs5/examples/popovers/four_directions/snippet.html.erb +7 -0
  34. data/app/views/bs5/pages/button_group.html.erb +5 -0
  35. data/app/views/bs5/pages/collapse.html.erb +2 -0
  36. data/app/views/bs5/pages/popovers.html.erb +5 -0
  37. data/app/views/layouts/bs5/application.html.erb +1 -0
  38. data/app/views/layouts/bs5/pages.html.erb +4 -0
  39. data/config/initializers/hash_refinement.rb +9 -0
  40. data/lib/bs5/version.rb +1 -1
  41. data/lib/generators/bs5/install/install_generator.rb +2 -1
  42. data/lib/generators/bs5/install/templates/bs5.js +11 -1
  43. metadata +33 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b63f00444e32de97ae7167d85ab798ec58085c325730e18a48d21bdde8a8de89
4
- data.tar.gz: 2a8ab48a4bd4fe50a629868448315c3ef9d641ef7b30cdb189db8e95015ddd38
3
+ metadata.gz: 7e7ed0ecd3b82a680eae723045c2c24020920a4942b4dfa5460951042be2a5c1
4
+ data.tar.gz: 4217f3cd7e572d702deb22988f772c0653da8709c39c8a2bff3796747990a4b0
5
5
  SHA512:
6
- metadata.gz: 94fc5dc2aab1bb53e3155d14acfdf889ef58d3aee2e03fa8a9620fd2e3379bfd48d0c453c9c42f22a826457b8f7fb7edc0274c0db54c6437ecf901dd6f371e6e
7
- data.tar.gz: e3cf1bbf76474375de657c37ecc3395d51993dc33cac54240014769b58b63dc466bc3e1c669f7f3500ba966de17cb17a4799cb902057d1ae39660ab6a5300c41
6
+ metadata.gz: 3e520e4f93b185a7aa46cba4bf5c43b24655c03b8d75576eca3edf2b6740e0384caff3b413e9a3b18abadfda4edf1464be4ea4fb21eb66a67617b0f5268ed49c
7
+ data.tar.gz: 38fd799067d2148b0cd44f323dc41d0a4130771edc2e8de6fade8af6aaab4f2a19c22d5dba6abc77f84d1189a9e6f5529c471f903796f07dc47cc40dab769b2a
data/README.md CHANGED
@@ -32,7 +32,7 @@ $ gem install bs5
32
32
 
33
33
  Run the following command to setup your project to use Bootstrap 5.
34
34
 
35
- $ rails generate bs5:install
35
+ $ bin/rails generate bs5:install
36
36
 
37
37
  ## Contributing
38
38
 
@@ -6,22 +6,15 @@
6
6
  id="<%= item.header_id %>"
7
7
  class="accordion-header"
8
8
  >
9
- <button
10
- class="<%= item.button_class %>"
11
- type="button"
12
- data-toggle="collapse"
13
- data-target="#<%= item.collapse_id %>"
14
- aria-expanded="true"
15
- aria-controls="<%= item.collapse_id %>"
16
- >
17
- <%= item.title %>
18
- </button>
9
+ <%= button_tag item.title,
10
+ bs5_collapse(target: "##{item.collapse_id}", expanded: !item.collapsed?)
11
+ .merge(type: :button, class: item.button_class) %>
19
12
  </h2>
20
13
  <div
21
14
  id="<%= item.collapse_id %>"
22
15
  class="<%= item.collapse_class %>"
23
16
  aria-labelledby="<%= item.header_id %>"
24
- data-parent="#<%= id %>"
17
+ data-bs-parent="#<%= id %>"
25
18
  >
26
19
  <div class="accordion-body">
27
20
  <%= item.content %>
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Bs5
4
4
  class AccordionComponent < ViewComponent::Base
5
+ include ComponentsHelper
5
6
  include ViewComponent::Slotable
6
7
 
7
8
  with_slot :item, collection: true, class_name: 'Item'
@@ -1,6 +1,6 @@
1
1
  <div class="<%= component_class %>" role="alert">
2
2
  <%= content %>
3
3
  <%- if is_dismissable %>
4
- <%= render Bs5::CloseButtonComponent.new(data: { dismiss: :alert }) %>
4
+ <%= render Bs5::CloseButtonComponent.new(data: { 'bs-dismiss': :alert }) %>
5
5
  <%- end %>
6
6
  </div>
@@ -0,0 +1,3 @@
1
+ <%= tag.div(component_attributes) do %>
2
+ <%= content %>
3
+ <% end %>
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bs5
4
+ class ButtonGroupComponent < ViewComponent::Base
5
+ SIZES = { small: :sm, large: :lg }.with_indifferent_access.freeze
6
+ CLASS_PREFIX = 'btn-group'
7
+
8
+ attr_reader :vertical, :size
9
+
10
+ def initialize(options = {})
11
+ @options = options.symbolize_keys
12
+ @vertical = @options.delete(:vertical)
13
+ @size = @options.delete(:size)
14
+ end
15
+
16
+ def render?
17
+ content.present?
18
+ end
19
+
20
+ def component_attributes
21
+ default_options = { role: 'group' }
22
+ @options[:class] = component_class
23
+ @options.merge(default_options)
24
+ end
25
+
26
+ private
27
+
28
+ def component_class
29
+ class_names = Array(@options[:class])
30
+ class_names << vertical_class
31
+ class_names << size_class
32
+ class_names
33
+ end
34
+
35
+ def vertical_class
36
+ @vertical ? "#{CLASS_PREFIX}-vertical" : CLASS_PREFIX
37
+ end
38
+
39
+ def size_class
40
+ return unless size?
41
+
42
+ [CLASS_PREFIX, SIZES[size]].join('-')
43
+ end
44
+
45
+ def size?
46
+ !!size
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ <%= tag.div(component_attributes) do %>
2
+ <%= content %>
3
+ <% end %>
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bs5
4
+ class ButtonToolbarComponent < ViewComponent::Base
5
+ def initialize(options = {})
6
+ @options = options
7
+ end
8
+
9
+ def render?
10
+ content.present?
11
+ end
12
+
13
+ def component_attributes
14
+ default_options = { role: 'toolbar' }
15
+ @options[:class] = Array(@options[:class])
16
+ @options[:class] << 'btn-toolbar'
17
+
18
+ @options.merge(default_options)
19
+ end
20
+ end
21
+ end
@@ -2,7 +2,8 @@
2
2
 
3
3
  module Bs5
4
4
  module ComponentsHelper
5
- COMPONENTS = %w[accordion alert badge close_button breadcrumb button_tag button_to list_group].freeze
5
+ COMPONENTS = %w[accordion alert badge close_button breadcrumb button_group button_tag button_to button_toolbar
6
+ list_group].freeze
6
7
 
7
8
  COMPONENTS.each do |name|
8
9
  define_method("bs5_#{name}") do |*args, &block|
@@ -11,13 +12,16 @@ module Bs5
11
12
  end
12
13
  end
13
14
 
14
- def bs5_tooltip(title, options = nil)
15
- default_options = { toggle: :tooltip }
16
- options = Hash(options).symbolize_keys.merge(default_options)
17
- {
18
- title: title,
19
- data: options
20
- }
15
+ def bs5_tooltip(*args)
16
+ TooltipService.new(*args).to_hash
17
+ end
18
+
19
+ def bs5_popover(*args)
20
+ PopoverService.new(*args).to_hash
21
+ end
22
+
23
+ def bs5_collapse(*args)
24
+ CollapseService.new(*args).to_hash
21
25
  end
22
26
 
23
27
  private
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bs5
4
+ class CollapseService
5
+ using HashRefinement
6
+
7
+ CONTROLS_ERR_MSG = 'Please provide either a `controls` option' \
8
+ ' containing the id of the collapsible element' \
9
+ ' or an ID selector as `target` options.'
10
+
11
+ attr_reader :expanded, :target, :controls
12
+
13
+ def initialize(expanded: false, target: nil, controls: nil)
14
+ @expanded = expanded
15
+ @target = target
16
+ @controls = controls
17
+ end
18
+
19
+ def to_hash
20
+ {
21
+ data: data_options,
22
+ aria: aria_options
23
+ }
24
+ end
25
+
26
+ private
27
+
28
+ def data_options
29
+ options = { toggle: :collapse }
30
+ options[:target] = target if target
31
+
32
+ options.prefix_keys_with_bs
33
+ end
34
+
35
+ def aria_options
36
+ options = { expanded: expanded }
37
+
38
+ if controls
39
+ options[:controls] = controls
40
+ elsif target&.start_with?('#')
41
+ options[:controls] = target.delete_prefix('#')
42
+ else
43
+ raise CONTROLS_ERR_MSG
44
+ end
45
+
46
+ options
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bs5
4
+ class PopoverService
5
+ using HashRefinement
6
+
7
+ attr_reader :title
8
+
9
+ def initialize(options = {})
10
+ @title = options.delete(:title)
11
+ @options = options
12
+ end
13
+
14
+ def to_hash
15
+ {
16
+ title: title,
17
+ data: options
18
+ }.compact
19
+ end
20
+
21
+ private
22
+
23
+ def options
24
+ @options.symbolize_keys.merge(default_options).prefix_keys_with_bs
25
+ end
26
+
27
+ def default_options
28
+ { toggle: :popover }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bs5
4
+ class TooltipService
5
+ using HashRefinement
6
+
7
+ attr_reader :title
8
+
9
+ def initialize(title, options = {})
10
+ @title = title
11
+ @options = options
12
+ end
13
+
14
+ def to_hash
15
+ {
16
+ title: title,
17
+ data: options
18
+ }
19
+ end
20
+
21
+ private
22
+
23
+ def options
24
+ @options.symbolize_keys.merge(default_options).prefix_keys_with_bs
25
+ end
26
+
27
+ def default_options
28
+ { toggle: :tooltip }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ <h2>Button toolbar</h2>
2
+ <%= bs5_example(snippet: 'button_group/button_toolbar/snippet') %>
3
+ <%= bs5_example(snippet: 'button_group/button_toolbar/snippet2') %>
@@ -0,0 +1,18 @@
1
+ <%= bs5_button_toolbar(aria: { label: 'Toolbar with button groups' }) do %>
2
+ <%= bs5_button_group(class: 'me-2', aria: { label: 'First group' }) do %>
3
+ <%= bs5_button_tag('1', type: 'button') %>
4
+ <%= bs5_button_tag('2', type: 'button') %>
5
+ <%= bs5_button_tag('3', type: 'button') %>
6
+ <%= bs5_button_tag('4', type: 'button') %>
7
+ <% end %>
8
+
9
+ <%= bs5_button_group(class: 'me-2', aria: { label: 'Second group' }) do %>
10
+ <%= bs5_button_tag('5', type: 'button', style: :secondary) %>
11
+ <%= bs5_button_tag('6', type: 'button', style: :secondary) %>
12
+ <%= bs5_button_tag('7', type: 'button', style: :secondary) %>
13
+ <% end %>
14
+
15
+ <%= bs5_button_group(aria: { label: 'Third group' }) do %>
16
+ <%= bs5_button_tag('8', type: 'button', style: :info) %>
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,27 @@
1
+ <%= bs5_button_toolbar(class: 'mb-3', aria: { label: 'Toolbar with button groups' }) do %>
2
+ <%= bs5_button_group(class: 'me-2', aria: { label: 'First group' }) do %>
3
+ <%= bs5_button_tag('1', type: 'button', outline: true, style: :secondary) %>
4
+ <%= bs5_button_tag('2', type: 'button', outline: true, style: :secondary) %>
5
+ <%= bs5_button_tag('3', type: 'button', outline: true, style: :secondary) %>
6
+ <%= bs5_button_tag('4', type: 'button', outline: true, style: :secondary) %>
7
+ <% end %>
8
+
9
+ <div class="input-group">
10
+ <div class="input-group-text" id="btnGroupAddon">@</div>
11
+ <input type="text" class="form-control" placeholder="Input group example" aria-label="Input group example" aria-describedby="btnGroupAddon">
12
+ </div>
13
+ <% end %>
14
+
15
+ <%= bs5_button_toolbar(class: 'justify-content-between', aria: { label: 'Toolbar with button groups' }) do %>
16
+ <%= bs5_button_group(aria: { label: 'First group' }) do %>
17
+ <%= bs5_button_tag('1', type: 'button', outline: true, style: :secondary) %>
18
+ <%= bs5_button_tag('2', type: 'button', outline: true, style: :secondary) %>
19
+ <%= bs5_button_tag('3', type: 'button', outline: true, style: :secondary) %>
20
+ <%= bs5_button_tag('4', type: 'button', outline: true, style: :secondary) %>
21
+ <% end %>
22
+
23
+ <div class="input-group">
24
+ <div class="input-group-text" id="btnGroupAddon2">@</div>
25
+ <input type="text" class="form-control" placeholder="Input group example" aria-label="Input group example" aria-describedby="btnGroupAddon2">
26
+ </div>
27
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <h2>Basic example</h2>
2
+ <%= bs5_example(snippet: 'button_group/default/snippet') %>
@@ -0,0 +1,5 @@
1
+ <%= bs5_button_group(aria: { label: 'Basic example' }) do %>
2
+ <%= bs5_button_tag('Left', type: 'button') %>
3
+ <%= bs5_button_tag('Middle', type: 'button') %>
4
+ <%= bs5_button_tag('Right', type: 'button') %>
5
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <h2>Sizing</h2>
2
+ <%= bs5_example(snippet: 'button_group/sizing/snippet') %>
@@ -0,0 +1,17 @@
1
+ <%= bs5_button_group(size: 'large', class: 'mb-2', aria: { label: 'Large button group' }) do %>
2
+ <%= bs5_button_tag('Left', type: 'button', style: :dark, outline: true) %>
3
+ <%= bs5_button_tag('Middle', type: 'button', style: :dark, outline: true) %>
4
+ <%= bs5_button_tag('Right', type: 'button', style: :dark, outline: true) %>
5
+ <% end %>
6
+ <br/>
7
+ <%= bs5_button_group(class: 'mb-2', aria: { label: 'Default button group' }) do %>
8
+ <%= bs5_button_tag('Left', type: 'button', style: :dark, outline: true) %>
9
+ <%= bs5_button_tag('Middle', type: 'button', style: :dark, outline: true) %>
10
+ <%= bs5_button_tag('Right', type: 'button', style: :dark, outline: true) %>
11
+ <% end %>
12
+ <br/>
13
+ <%= bs5_button_group(size: :small, aria: { label: 'Small button group' }) do %>
14
+ <%= bs5_button_tag('Left', type: 'button', style: :dark, outline: true) %>
15
+ <%= bs5_button_tag('Middle', type: 'button', style: :dark, outline: true) %>
16
+ <%= bs5_button_tag('Right', type: 'button', style: :dark, outline: true) %>
17
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <h2>Vertical variation</h2>
2
+ <%= bs5_example(snippet: 'button_group/vertical/snippet') %>
@@ -0,0 +1,8 @@
1
+ <%= bs5_button_group(vertical: :true, aria: { label: 'Vertical button group' }) do %>
2
+ <%= bs5_button_tag('Button', type: 'button', style: :dark) %>
3
+ <%= bs5_button_tag('Button', type: 'button', style: :dark) %>
4
+ <%= bs5_button_tag('Button', type: 'button', style: :dark) %>
5
+ <%= bs5_button_tag('Button', type: 'button', style: :dark) %>
6
+ <%= bs5_button_tag('Button', type: 'button', style: :dark) %>
7
+ <%= bs5_button_tag('Button', type: 'button', style: :dark) %>
8
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <h2>Example</h2>
2
+ <%= bs5_example(snippet: 'collapse/default/snippet') %>
3
+ <h2>Multiple targets</h2>
4
+ <%= bs5_example(snippet: 'collapse/default/multiple_targets') %>
@@ -0,0 +1,21 @@
1
+ <p>
2
+ <%= link_to 'Toggle first element', '#multiCollapseExample1', bs5_collapse(controls: 'multiCollapseExample1 multiCollapseExample2').merge(class: 'btn btn-primary', role: :button) %>
3
+ <%= bs5_button_tag 'Toggle second element', bs5_collapse(target: '#multiCollapseExample2', controls: 'multiCollapseExample1 multiCollapseExample2') %>
4
+ <%= bs5_button_tag 'Toggle both elements', bs5_collapse(target: '.multi-collapse', controls: 'multiCollapseExample1 multiCollapseExample2') %>
5
+ </p>
6
+ <div class="row">
7
+ <div class="col">
8
+ <div class="collapse multi-collapse" id="multiCollapseExample1">
9
+ <div class="card card-body">
10
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident.
11
+ </div>
12
+ </div>
13
+ </div>
14
+ <div class="col">
15
+ <div class="collapse multi-collapse" id="multiCollapseExample2">
16
+ <div class="card card-body">
17
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident.
18
+ </div>
19
+ </div>
20
+ </div>
21
+ </div>
@@ -0,0 +1,9 @@
1
+ <p>
2
+ <%= link_to 'Link with href', '#collapseExample', bs5_collapse(controls: 'collapseExample').merge(class: 'btn btn-primary', role: :button) %>
3
+ <%= bs5_button_tag 'Button with data-target', bs5_collapse(target: '#collapseExample').merge(type: :button) %>
4
+ </p>
5
+ <div class="collapse" id="collapseExample">
6
+ <div class="card card-body">
7
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident.
8
+ </div>
9
+ </div>
@@ -0,0 +1,2 @@
1
+ <h2>Example</h2>
2
+ <%= bs5_example(snippet: 'popovers/default/snippet') %>
@@ -0,0 +1 @@
1
+ <%= bs5_button_tag('Click to toggle popover', bs5_popover(title: 'Popover title', content: "And here's some amazing content. It's very engaging. Right?").merge(type: 'button', style: :danger, size: :large)) %>
@@ -0,0 +1,2 @@
1
+ <h2>Disabled elements</h2>
2
+ <%= bs5_example(snippet: 'popovers/disabled_elements/snippet') %>
@@ -0,0 +1,3 @@
1
+ <%= tag.span(bs5_popover(content: 'Disabled popover').merge(class: 'd-inline-block')) do %>
2
+ <%= bs5_button_tag('Disabled button', disabled: true) %>
3
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <h2>Dismissable on next click</h2>
2
+ <%= bs5_example(snippet: 'popovers/dismissable_on_next_click/snippet') %>
@@ -0,0 +1 @@
1
+ <%= tag.a 'Dismissible popover', bs5_popover(title: 'Dismissible popover', content: "And here's some amazing content. It's very engaging. Right?", trigger: :focus).merge(class: 'btn btn-lg btn-danger', role: :button, tabindex: 0) %>
@@ -0,0 +1,2 @@
1
+ <h2>Four directions</h2>
2
+ <%= bs5_example(snippet: 'popovers/four_directions/snippet') %>
@@ -0,0 +1,7 @@
1
+ <%= bs5_button_tag('Popover on top', bs5_popover(content: "Vivamus sagittis lacus vel augue laoreet rutrum faucibus.", container: :body, placement: :top).merge(type: 'button', style: :secondary)) %>
2
+
3
+ <%= bs5_button_tag('Popover on right', bs5_popover(content: "Vivamus sagittis lacus vel augue laoreet rutrum faucibus.", container: :body, placement: :right).merge(type: 'button', style: :secondary)) %>
4
+
5
+ <%= bs5_button_tag('Popover on bottom', bs5_popover(content: "Vivamus sagittis lacus vel augue laoreet rutrum faucibus.", container: :body, placement: :bottom).merge(type: 'button', style: :secondary)) %>
6
+
7
+ <%= bs5_button_tag('Popover on left', bs5_popover(content: "Vivamus sagittis lacus vel augue laoreet rutrum faucibus.", container: :body, placement: :left).merge(type: 'button', style: :secondary)) %>
@@ -0,0 +1,5 @@
1
+ <h1>Button group</h1>
2
+ <%= render 'bs5/examples/button_group/default/example' %>
3
+ <%= render 'bs5/examples/button_group/button_toolbar/example' %>
4
+ <%= render 'bs5/examples/button_group/sizing/example' %>
5
+ <%= render 'bs5/examples/button_group/vertical/example' %>
@@ -0,0 +1,2 @@
1
+ <h1>Collapse</h1>
2
+ <%= render 'bs5/examples/collapse/default/example' %>
@@ -0,0 +1,5 @@
1
+ <h1>Popovers</h1>
2
+ <%= render 'bs5/examples/popovers/default/example' %>
3
+ <%= render 'bs5/examples/popovers/four_directions/example' %>
4
+ <%= render 'bs5/examples/popovers/dismissable_on_next_click/example' %>
5
+ <%= render 'bs5/examples/popovers/disabled_elements/example' %>
@@ -2,6 +2,7 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>Bs5</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
6
  <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
6
7
  <%= stylesheet_pack_tag 'styles', media: 'all', 'data-turbolinks-track': 'reload' %>
7
8
  <style><%= Rouge::Themes::Github.render(scope: '.highlight') %></style>
@@ -2,6 +2,7 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>Bs5</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
6
  <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
6
7
  <%= stylesheet_pack_tag 'styles', media: 'all', 'data-turbolinks-track': 'reload' %>
7
8
  <style><%= Rouge::Themes::Github.render(scope: '.highlight') %></style>
@@ -17,8 +18,11 @@
17
18
  <% lg.slot(:item, active: current_page?(pages_path('badge'))) do %><%= link_to 'Badge', pages_path('badge') %><% end %>
18
19
  <% lg.slot(:item, active: current_page?(pages_path('breadcrumb'))) do %><%= link_to 'Breadcrumb', pages_path('breadcrumb') %><% end %>
19
20
  <% lg.slot(:item, active: current_page?(pages_path('buttons'))) do %><%= link_to 'Buttons', pages_path('buttons') %><% end %>
21
+ <% lg.slot(:item, active: current_page?(pages_path('button_group'))) do %><%= link_to 'Button group', pages_path('button_group') %><% end %>
20
22
  <% lg.slot(:item, active: current_page?(pages_path('close_button'))) do %><%= link_to 'Close button', pages_path('close_button') %><% end %>
23
+ <% lg.slot(:item, active: current_page?(pages_path('collapse'))) do %><%= link_to 'Collapse', pages_path('collapse') %><% end %>
21
24
  <% lg.slot(:item, active: current_page?(pages_path('list_group'))) do %><%= link_to 'List group', pages_path('list_group') %><% end %>
25
+ <% lg.slot(:item, active: current_page?(pages_path('popovers'))) do %><%= link_to 'Popovers', pages_path('popovers') %><% end %>
22
26
  <% lg.slot(:item, active: current_page?(pages_path('tooltips'))) do %><%= link_to 'Tooltips', pages_path('tooltips') %><% end %>
23
27
  <%- end %>
24
28
  </div>
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HashRefinement
4
+ refine Hash do
5
+ def prefix_keys_with_bs
6
+ transform_keys! { |k| "bs_#{k}".to_sym }
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bs5
4
- VERSION = '0.0.13'
4
+ VERSION = '0.0.18'
5
5
  end
@@ -5,7 +5,7 @@ module Bs5
5
5
  source_root File.expand_path('templates', __dir__)
6
6
 
7
7
  def add_bootstrap # rubocop:disable Metrics/MethodLength
8
- run 'yarn add bootstrap@next popper.js'
8
+ run 'yarn add bootstrap@next @popperjs/core'
9
9
 
10
10
  create_file 'app/javascript/packs/styles.scss', <<~HEREDOC
11
11
  @import "~bootstrap/scss/bootstrap";
@@ -24,6 +24,7 @@ module Bs5
24
24
  inject_into_file 'app/views/layouts/application.html.erb', before: '</head>' do
25
25
  <<~HEREDOC
26
26
  <%= stylesheet_pack_tag 'styles', media: 'all', 'data-turbolinks-track': 'reload' %>
27
+ <meta name="viewport" content="width=device-width, initial-scale=1">
27
28
  HEREDOC
28
29
  end
29
30
 
@@ -2,13 +2,23 @@ import * as bootstrap from "bootstrap";
2
2
 
3
3
  function tooltipify() {
4
4
  const tooltipTriggerList = [].slice.call(
5
- document.querySelectorAll('[data-toggle="tooltip"]')
5
+ document.querySelectorAll('[data-bs-toggle="tooltip"]')
6
6
  );
7
7
  tooltipTriggerList.map(function (tooltipTriggerEl) {
8
8
  return new bootstrap.Tooltip(tooltipTriggerEl);
9
9
  });
10
10
  }
11
11
 
12
+ function popoverify() {
13
+ const popoverTriggerList = [].slice.call(
14
+ document.querySelectorAll('[data-bs-toggle="popover"]')
15
+ );
16
+ popoverTriggerList.map(function (popoverTriggerEl) {
17
+ return new bootstrap.Popover(popoverTriggerEl);
18
+ });
19
+ }
20
+
12
21
  export function start() {
22
+ popoverify();
13
23
  tooltipify();
14
24
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bs5
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Baselier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-06 00:00:00.000000000 Z
11
+ date: 2020-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -148,8 +148,12 @@ files:
148
148
  - app/components/bs5/badge_component.rb
149
149
  - app/components/bs5/breadcrumb_component.html.erb
150
150
  - app/components/bs5/breadcrumb_component.rb
151
+ - app/components/bs5/button_group_component.html.erb
152
+ - app/components/bs5/button_group_component.rb
151
153
  - app/components/bs5/button_tag_component.rb
152
154
  - app/components/bs5/button_to_component.rb
155
+ - app/components/bs5/button_toolbar_component.html.erb
156
+ - app/components/bs5/button_toolbar_component.rb
153
157
  - app/components/bs5/close_button_component.html.erb
154
158
  - app/components/bs5/close_button_component.rb
155
159
  - app/components/bs5/example_component.html.erb
@@ -162,6 +166,9 @@ files:
162
166
  - app/helpers/bs5/components_helper.rb
163
167
  - app/helpers/bs5/examples_helper.rb
164
168
  - app/models/bs5/application_record.rb
169
+ - app/service/bs5/collapse_service.rb
170
+ - app/service/bs5/popover_service.rb
171
+ - app/service/bs5/tooltip_service.rb
165
172
  - app/validators/style_validator.rb
166
173
  - app/views/bs5/examples/accordion/default/_example.html.erb
167
174
  - app/views/bs5/examples/accordion/default/snippet.html.erb
@@ -183,6 +190,15 @@ files:
183
190
  - app/views/bs5/examples/badge/style/snippet.html.erb
184
191
  - app/views/bs5/examples/breadcrumb/default/_example.html.erb
185
192
  - app/views/bs5/examples/breadcrumb/default/snippet.html.erb
193
+ - app/views/bs5/examples/button_group/button_toolbar/_example.html.erb
194
+ - app/views/bs5/examples/button_group/button_toolbar/snippet.html.erb
195
+ - app/views/bs5/examples/button_group/button_toolbar/snippet2.html.erb
196
+ - app/views/bs5/examples/button_group/default/_example.html.erb
197
+ - app/views/bs5/examples/button_group/default/snippet.html.erb
198
+ - app/views/bs5/examples/button_group/sizing/_example.html.erb
199
+ - app/views/bs5/examples/button_group/sizing/snippet.html.erb
200
+ - app/views/bs5/examples/button_group/vertical/_example.html.erb
201
+ - app/views/bs5/examples/button_group/vertical/snippet.html.erb
186
202
  - app/views/bs5/examples/buttons/button_tag/block_buttons/_example.html.erb
187
203
  - app/views/bs5/examples/buttons/button_tag/block_buttons/block_buttons.html.erb
188
204
  - app/views/bs5/examples/buttons/button_tag/block_buttons/responsive_block_buttons_1.html.erb
@@ -207,6 +223,9 @@ files:
207
223
  - app/views/bs5/examples/close_button/disabled/snippet.html.erb
208
224
  - app/views/bs5/examples/close_button/white/_example.html.erb
209
225
  - app/views/bs5/examples/close_button/white/snippet.html.erb
226
+ - app/views/bs5/examples/collapse/default/_example.html.erb
227
+ - app/views/bs5/examples/collapse/default/multiple_targets.html.erb
228
+ - app/views/bs5/examples/collapse/default/snippet.html.erb
210
229
  - app/views/bs5/examples/list_group/actionable/_example.html.erb
211
230
  - app/views/bs5/examples/list_group/actionable/button.html.erb
212
231
  - app/views/bs5/examples/list_group/actionable/snippet.html.erb
@@ -230,6 +249,14 @@ files:
230
249
  - app/views/bs5/examples/list_group/style/default.html.erb
231
250
  - app/views/bs5/examples/list_group/with_badges/_example.html.erb
232
251
  - app/views/bs5/examples/list_group/with_badges/default.html.erb
252
+ - app/views/bs5/examples/popovers/default/_example.html.erb
253
+ - app/views/bs5/examples/popovers/default/snippet.html.erb
254
+ - app/views/bs5/examples/popovers/disabled_elements/_example.html.erb
255
+ - app/views/bs5/examples/popovers/disabled_elements/snippet.html.erb
256
+ - app/views/bs5/examples/popovers/dismissable_on_next_click/_example.html.erb
257
+ - app/views/bs5/examples/popovers/dismissable_on_next_click/snippet.html.erb
258
+ - app/views/bs5/examples/popovers/four_directions/_example.html.erb
259
+ - app/views/bs5/examples/popovers/four_directions/snippet.html.erb
233
260
  - app/views/bs5/examples/tooltips/default/_example.html.erb
234
261
  - app/views/bs5/examples/tooltips/default/buttons.html.erb
235
262
  - app/views/bs5/examples/tooltips/default/disabled_elements.html.erb
@@ -238,13 +265,17 @@ files:
238
265
  - app/views/bs5/pages/alert.html.erb
239
266
  - app/views/bs5/pages/badge.html.erb
240
267
  - app/views/bs5/pages/breadcrumb.html.erb
268
+ - app/views/bs5/pages/button_group.html.erb
241
269
  - app/views/bs5/pages/buttons.html.erb
242
270
  - app/views/bs5/pages/close_button.html.erb
271
+ - app/views/bs5/pages/collapse.html.erb
243
272
  - app/views/bs5/pages/list_group.html.erb
273
+ - app/views/bs5/pages/popovers.html.erb
244
274
  - app/views/bs5/pages/tooltips.html.erb
245
275
  - app/views/layouts/bs5/application.html.erb
246
276
  - app/views/layouts/bs5/pages.html.erb
247
277
  - config/definitions.rb
278
+ - config/initializers/hash_refinement.rb
248
279
  - config/locales/en.yml
249
280
  - config/routes.rb
250
281
  - lib/bs5.rb