bs5 0.0.26 → 0.0.27
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/components/bs5/modal/body_component.html.erb +3 -0
- data/app/components/bs5/modal/body_component.rb +8 -0
- data/app/components/bs5/modal/controller_component.html.erb +1 -0
- data/app/components/bs5/modal/controller_component.rb +40 -0
- data/app/components/bs5/modal/footer_component.html.erb +4 -0
- data/app/components/bs5/modal/footer_component.rb +8 -0
- data/app/components/bs5/modal/header_component.html.erb +4 -0
- data/app/components/bs5/modal/header_component.rb +18 -0
- data/app/components/bs5/modal_component.html.erb +11 -0
- data/app/components/bs5/modal_component.rb +80 -0
- data/app/helpers/bs5/components_helper.rb +1 -1
- data/app/views/bs5/examples/modal/_examples.html.erb +9 -0
- data/app/views/bs5/examples/modal/_fullscreen.html.erb +2 -0
- data/app/views/bs5/examples/modal/_optional_sizes.html.erb +2 -0
- data/app/views/bs5/examples/modal/examples/snippet1.html.erb +12 -0
- data/app/views/bs5/examples/modal/examples/snippet2.html.erb +12 -0
- data/app/views/bs5/examples/modal/examples/snippet3.html.erb +14 -0
- data/app/views/bs5/examples/modal/examples/snippet4.html.erb +12 -0
- data/app/views/bs5/examples/modal/fullscreen/snippet1.html.erb +55 -0
- data/app/views/bs5/examples/modal/optional_sizes/snippet1.html.erb +23 -0
- data/app/views/bs5/pages/modal.html.erb +4 -0
- data/app/views/layouts/bs5/pages.html.erb +1 -0
- data/lib/bs5/version.rb +1 -1
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bd6c6c2f823f5b4ba980c7ef01db9381fe5fa6c02e4b82dc101a6765b8bfc22
|
4
|
+
data.tar.gz: 16c43758c937dab60f50f331f56e31dd75aa2df4f982c803c340fe449302a346
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e55c062be7d27cbe65efa1dd098b5ae1e26f4a5fc919ac22e5e8267a4d7c269cfc29fa15077444d3be082ccb9d7211fa27d3b1fbaa63c26e847665fcb0a30279
|
7
|
+
data.tar.gz: 13300ddc486bed84d11bae9d30cc2078fc60951a833ace82e07828228865bc3858f416e41dea9ff4e459b7df0912d1c04b0336596bacff8553b941dc8e660854
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= content %>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bs5
|
4
|
+
module Modal
|
5
|
+
class ControllerComponent < ViewComponent::Base
|
6
|
+
def initialize(modal_id:)
|
7
|
+
@modal_id = modal_id
|
8
|
+
end
|
9
|
+
|
10
|
+
def content
|
11
|
+
return nil if @content.blank?
|
12
|
+
|
13
|
+
if actionable_element?
|
14
|
+
set_actionable_element_attributes
|
15
|
+
actionable_element.to_html.html_safe # rubocop:disable Rails/OutputSafety
|
16
|
+
else
|
17
|
+
@content
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_actionable_element_attributes
|
22
|
+
actionable_element['data-bs-toggle'] = 'modal'
|
23
|
+
actionable_element['data-bs-target'] = "##{@modal_id}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def actionable_element
|
27
|
+
@actionable_element ||= begin
|
28
|
+
if (elements = Nokogiri::HTML::DocumentFragment.parse(@content).elements).one? &&
|
29
|
+
(element = elements.first).name.in?(%w[a button])
|
30
|
+
element
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def actionable_element?
|
36
|
+
!!actionable_element
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bs5
|
4
|
+
module Modal
|
5
|
+
class HeaderComponent < ViewComponent::Base
|
6
|
+
attr_reader :title
|
7
|
+
|
8
|
+
def initialize(title: nil, label_id: nil)
|
9
|
+
@title = title
|
10
|
+
@label_id = label_id
|
11
|
+
end
|
12
|
+
|
13
|
+
def content
|
14
|
+
title || @content
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bs5
|
4
|
+
class ModalComponent < ViewComponent::Base
|
5
|
+
include ViewComponent::SlotableV2
|
6
|
+
using HashRefinement
|
7
|
+
|
8
|
+
MODAL_OPTIONS = %i[backdrop keyboard focus].freeze
|
9
|
+
|
10
|
+
renders_one :controller, lambda { |_modal_id: nil|
|
11
|
+
Bs5::Modal::ControllerComponent.new(modal_id: modal_id)
|
12
|
+
}
|
13
|
+
renders_one :header, lambda { |_label_id: nil|
|
14
|
+
Bs5::Modal::HeaderComponent.new(label_id: label_id)
|
15
|
+
}
|
16
|
+
renders_one :body, Bs5::Modal::BodyComponent
|
17
|
+
renders_one :footer, Bs5::Modal::FooterComponent
|
18
|
+
|
19
|
+
def initialize(options = {})
|
20
|
+
@options = options.symbolize_keys
|
21
|
+
extract_options
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def extract_options
|
27
|
+
@scroll = @options.delete(:scroll)
|
28
|
+
@center = @options.delete(:center)
|
29
|
+
@size = @options.delete(:size)
|
30
|
+
@fullscreen = @options.delete(:fullscreen)
|
31
|
+
|
32
|
+
extract_modal_options
|
33
|
+
end
|
34
|
+
|
35
|
+
def extract_modal_options
|
36
|
+
@modal_options = @options.extract!(*MODAL_OPTIONS)
|
37
|
+
end
|
38
|
+
|
39
|
+
def modal_attributes
|
40
|
+
{ class: 'modal fade',
|
41
|
+
id: modal_id,
|
42
|
+
tabindex: -1,
|
43
|
+
aria: { labelledby: label_id, hidden: true },
|
44
|
+
data: @modal_options.prefix_keys_with_bs }
|
45
|
+
end
|
46
|
+
|
47
|
+
def dialog_classes
|
48
|
+
class_names = ['modal-dialog']
|
49
|
+
class_names << 'modal-dialog-scrollable' if scroll?
|
50
|
+
class_names << 'modal-dialog-centered' if center?
|
51
|
+
class_names << "modal-#{@size}" if size?
|
52
|
+
class_names << fullscreen_class
|
53
|
+
|
54
|
+
class_names.join(' ')
|
55
|
+
end
|
56
|
+
|
57
|
+
def fullscreen_class
|
58
|
+
return unless fullscreen?
|
59
|
+
|
60
|
+
class_name = %w[modal fullscreen]
|
61
|
+
class_name << [@fullscreen, 'down'] if @fullscreen.is_a?(Symbol)
|
62
|
+
|
63
|
+
class_name.join('-')
|
64
|
+
end
|
65
|
+
|
66
|
+
def modal_id
|
67
|
+
"modal-#{object_id}"
|
68
|
+
end
|
69
|
+
|
70
|
+
def label_id
|
71
|
+
"modal-label-#{object_id}"
|
72
|
+
end
|
73
|
+
|
74
|
+
%i[scroll center size fullscreen].each do |name|
|
75
|
+
define_method("#{name}?") do
|
76
|
+
!instance_variable_get("@#{name}").nil?
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Bs5
|
4
4
|
module ComponentsHelper
|
5
5
|
COMPONENTS = %w[accordion alert badge breadcrumb button_group button_tag button_to button_toolbar close_button
|
6
|
-
dropdown list_group spinner toast toast_container].freeze
|
6
|
+
dropdown list_group modal spinner toast toast_container].freeze
|
7
7
|
|
8
8
|
COMPONENTS.each do |name|
|
9
9
|
define_method("bs5_#{name}") do |*args, &block|
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<h2>Examples</h2>
|
2
|
+
<h3>Live demo</h3>
|
3
|
+
<%= bs5_example(snippet: 'modal/examples/snippet1') %>
|
4
|
+
<h3>Static backdrop</h3>
|
5
|
+
<%= bs5_example(snippet: 'modal/examples/snippet2') %>
|
6
|
+
<h3>Scrolling long content</h3>
|
7
|
+
<%= bs5_example(snippet: 'modal/examples/snippet3') %>
|
8
|
+
<h3>Vertically centered</h3>
|
9
|
+
<%= bs5_example(snippet: 'modal/examples/snippet4') %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= bs5_modal do |m| %>
|
2
|
+
<%= m.controller do %>
|
3
|
+
<%= bs5_button_tag('Launch demo modal', type: 'button') %>
|
4
|
+
<% end %>
|
5
|
+
<%= m.header { 'Modal title' } %>
|
6
|
+
<%= m.body do %>
|
7
|
+
<p>Modal body text goes here.</p>
|
8
|
+
<% end %>
|
9
|
+
<%= m.footer do %>
|
10
|
+
<%= bs5_button_tag('Save changes', type: 'button') %>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= bs5_modal(backdrop: :static, keyboard: false) do |m| %>
|
2
|
+
<%= m.controller do %>
|
3
|
+
<%= bs5_button_tag('Launch demo modal', type: 'button') %>
|
4
|
+
<% end %>
|
5
|
+
<%= m.header { 'Modal title' } %>
|
6
|
+
<%= m.body do %>
|
7
|
+
<p>I will not close if you click outside me. Don't even try to press escape key.</p>
|
8
|
+
<% end %>
|
9
|
+
<%= m.footer do %>
|
10
|
+
<%= bs5_button_tag('Understood', type: 'button') %>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<%= bs5_modal(scroll: true) do |m| %>
|
2
|
+
<%= m.controller do %>
|
3
|
+
<%= bs5_button_tag('Launch demo modal', type: 'button') %>
|
4
|
+
<% end %>
|
5
|
+
<%= m.header { 'Modal title' } %>
|
6
|
+
<%= m.body do %>
|
7
|
+
<% 15.times do %>
|
8
|
+
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
|
9
|
+
<% end %>
|
10
|
+
<% end %>
|
11
|
+
<%= m.footer do %>
|
12
|
+
<%= bs5_button_tag('Save changes', type: 'button') %>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= bs5_modal(center: true) do |m| %>
|
2
|
+
<%= m.controller do %>
|
3
|
+
<%= bs5_button_tag('Launch demo modal', type: 'button') %>
|
4
|
+
<% end %>
|
5
|
+
<%= m.header { 'Modal title' } %>
|
6
|
+
<%= m.body do %>
|
7
|
+
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
|
8
|
+
<% end %>
|
9
|
+
<%= m.footer do %>
|
10
|
+
<%= bs5_button_tag('Save changes', type: 'button') %>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<%= bs5_modal(fullscreen: true) do |m| %>
|
2
|
+
<%= m.controller do %>
|
3
|
+
<%= bs5_button_tag('Full screen', type: 'button') %>
|
4
|
+
<% end %>
|
5
|
+
<%= m.header { 'Full screen modal' } %>
|
6
|
+
<%= m.body do %>
|
7
|
+
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
|
8
|
+
<% end %>
|
9
|
+
<%= m.footer {} %>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<%= bs5_modal(fullscreen: :sm) do |m| %>
|
13
|
+
<%= m.controller do %>
|
14
|
+
<%= bs5_button_tag('Full screen below sm', type: 'button') %>
|
15
|
+
<% end %>
|
16
|
+
<%= m.header { 'Full screen below sm' } %>
|
17
|
+
<%= m.body { '...'} %>
|
18
|
+
<%= m.footer {} %>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<%= bs5_modal(fullscreen: :md) do |m| %>
|
22
|
+
<%= m.controller do %>
|
23
|
+
<%= bs5_button_tag('Full screen below md', type: 'button') %>
|
24
|
+
<% end %>
|
25
|
+
<%= m.header { 'Full screen below md' } %>
|
26
|
+
<%= m.body { '...'} %>
|
27
|
+
<%= m.footer {} %>
|
28
|
+
<% end %>
|
29
|
+
|
30
|
+
<%= bs5_modal(fullscreen: :lg) do |m| %>
|
31
|
+
<%= m.controller do %>
|
32
|
+
<%= bs5_button_tag('Full screen below lg', type: 'button') %>
|
33
|
+
<% end %>
|
34
|
+
<%= m.header { 'Full screen below lg' } %>
|
35
|
+
<%= m.body { '...'} %>
|
36
|
+
<%= m.footer {} %>
|
37
|
+
<% end %>
|
38
|
+
|
39
|
+
<%= bs5_modal(fullscreen: :xl) do |m| %>
|
40
|
+
<%= m.controller do %>
|
41
|
+
<%= bs5_button_tag('Full screen below xl', type: 'button') %>
|
42
|
+
<% end %>
|
43
|
+
<%= m.header { 'Full screen below xl' } %>
|
44
|
+
<%= m.body { '...'} %>
|
45
|
+
<%= m.footer {} %>
|
46
|
+
<% end %>
|
47
|
+
|
48
|
+
<%= bs5_modal(fullscreen: :xxl) do |m| %>
|
49
|
+
<%= m.controller do %>
|
50
|
+
<%= bs5_button_tag('Full screen below xxl', type: 'button') %>
|
51
|
+
<% end %>
|
52
|
+
<%= m.header { 'Full screen below xxl' } %>
|
53
|
+
<%= m.body { '...'} %>
|
54
|
+
<%= m.footer {} %>
|
55
|
+
<% end %>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<%= bs5_modal(size: :xl) do |m| %>
|
2
|
+
<%= m.controller do %>
|
3
|
+
<%= bs5_button_tag('Extra large modal', type: 'button') %>
|
4
|
+
<% end %>
|
5
|
+
<%= m.header { 'Extra large modal' } %>
|
6
|
+
<%= m.body { '...' } %>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<%= bs5_modal(size: :lg) do |m| %>
|
10
|
+
<%= m.controller do %>
|
11
|
+
<%= bs5_button_tag('Large modal', type: 'button') %>
|
12
|
+
<% end %>
|
13
|
+
<%= m.header { 'Large modal' } %>
|
14
|
+
<%= m.body { '...' } %>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<%= bs5_modal(size: :sm) do |m| %>
|
18
|
+
<%= m.controller do %>
|
19
|
+
<%= bs5_button_tag('Small modal', type: 'button') %>
|
20
|
+
<% end %>
|
21
|
+
<%= m.header { 'Small modal' } %>
|
22
|
+
<%= m.body { '...' } %>
|
23
|
+
<% end %>
|
@@ -24,6 +24,7 @@
|
|
24
24
|
<% lg.item(active: current_page?(pages_path('collapse'))) do %><%= link_to 'Collapse', pages_path('collapse') %><% end %>
|
25
25
|
<% lg.item(active: current_page?(pages_path('dropdowns'))) do %><%= link_to 'Dropdowns', pages_path('dropdowns') %><% end %>
|
26
26
|
<% lg.item(active: current_page?(pages_path('list_group'))) do %><%= link_to 'List group', pages_path('list_group') %><% end %>
|
27
|
+
<% lg.item(active: current_page?(pages_path('modal'))) do %><%= link_to 'Modal', pages_path('modal') %><% end %>
|
27
28
|
<% lg.item(active: current_page?(pages_path('popovers'))) do %><%= link_to 'Popovers', pages_path('popovers') %><% end %>
|
28
29
|
<% lg.item(active: current_page?(pages_path('spinners'))) do %><%= link_to 'Spinners', pages_path('spinners') %><% end %>
|
29
30
|
<% lg.item(active: current_page?(pages_path('toasts'))) do %><%= link_to 'Toasts', pages_path('toasts') %><% end %>
|
data/lib/bs5/version.rb
CHANGED
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.
|
4
|
+
version: 0.0.27
|
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-
|
11
|
+
date: 2020-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -151,6 +151,16 @@ files:
|
|
151
151
|
- app/components/bs5/example_component.rb
|
152
152
|
- app/components/bs5/list_group_component.html.erb
|
153
153
|
- app/components/bs5/list_group_component.rb
|
154
|
+
- app/components/bs5/modal/body_component.html.erb
|
155
|
+
- app/components/bs5/modal/body_component.rb
|
156
|
+
- app/components/bs5/modal/controller_component.html.erb
|
157
|
+
- app/components/bs5/modal/controller_component.rb
|
158
|
+
- app/components/bs5/modal/footer_component.html.erb
|
159
|
+
- app/components/bs5/modal/footer_component.rb
|
160
|
+
- app/components/bs5/modal/header_component.html.erb
|
161
|
+
- app/components/bs5/modal/header_component.rb
|
162
|
+
- app/components/bs5/modal_component.html.erb
|
163
|
+
- app/components/bs5/modal_component.rb
|
154
164
|
- app/components/bs5/spinner_component.html.erb
|
155
165
|
- app/components/bs5/spinner_component.rb
|
156
166
|
- app/components/bs5/toast/body_component.html.erb
|
@@ -281,6 +291,15 @@ files:
|
|
281
291
|
- app/views/bs5/examples/list_group/style/default.html.erb
|
282
292
|
- app/views/bs5/examples/list_group/with_badges/_example.html.erb
|
283
293
|
- app/views/bs5/examples/list_group/with_badges/default.html.erb
|
294
|
+
- app/views/bs5/examples/modal/_examples.html.erb
|
295
|
+
- app/views/bs5/examples/modal/_fullscreen.html.erb
|
296
|
+
- app/views/bs5/examples/modal/_optional_sizes.html.erb
|
297
|
+
- app/views/bs5/examples/modal/examples/snippet1.html.erb
|
298
|
+
- app/views/bs5/examples/modal/examples/snippet2.html.erb
|
299
|
+
- app/views/bs5/examples/modal/examples/snippet3.html.erb
|
300
|
+
- app/views/bs5/examples/modal/examples/snippet4.html.erb
|
301
|
+
- app/views/bs5/examples/modal/fullscreen/snippet1.html.erb
|
302
|
+
- app/views/bs5/examples/modal/optional_sizes/snippet1.html.erb
|
284
303
|
- app/views/bs5/examples/popovers/default/_example.html.erb
|
285
304
|
- app/views/bs5/examples/popovers/default/snippet.html.erb
|
286
305
|
- app/views/bs5/examples/popovers/disabled_elements/_example.html.erb
|
@@ -335,6 +354,7 @@ files:
|
|
335
354
|
- app/views/bs5/pages/collapse.html.erb
|
336
355
|
- app/views/bs5/pages/dropdowns.html.erb
|
337
356
|
- app/views/bs5/pages/list_group.html.erb
|
357
|
+
- app/views/bs5/pages/modal.html.erb
|
338
358
|
- app/views/bs5/pages/popovers.html.erb
|
339
359
|
- app/views/bs5/pages/spinners.html.erb
|
340
360
|
- app/views/bs5/pages/toasts.html.erb
|