bs5 0.0.24 → 0.0.29
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/alert_component.html.erb +1 -1
- data/app/components/bs5/alert_component.rb +1 -0
- data/app/components/bs5/button_tag_component.rb +10 -1
- data/app/components/bs5/carousel/caption_component.html.erb +3 -0
- data/app/components/bs5/carousel/caption_component.rb +8 -0
- data/app/components/bs5/carousel/item_component.html.erb +4 -0
- data/app/components/bs5/carousel/item_component.rb +74 -0
- data/app/components/bs5/carousel_component.html.erb +30 -0
- data/app/components/bs5/carousel_component.rb +60 -0
- data/app/components/bs5/close_button_component.rb +14 -6
- data/app/components/bs5/dropdown/item_component.html.erb +1 -0
- data/app/components/bs5/dropdown/item_component.rb +39 -0
- data/app/components/bs5/dropdown_component.html.erb +22 -0
- data/app/components/bs5/dropdown_component.rb +154 -0
- 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/components/bs5/progress/bar_component.html.erb +1 -0
- data/app/components/bs5/progress/bar_component.rb +60 -0
- data/app/components/bs5/progress_component.html.erb +9 -0
- data/app/components/bs5/progress_component.rb +15 -0
- data/app/components/bs5/toast/body_component.html.erb +3 -0
- data/app/components/bs5/toast/body_component.rb +8 -0
- data/app/components/bs5/toast/header_component.html.erb +4 -0
- data/app/components/bs5/toast/header_component.rb +9 -0
- data/app/components/bs5/toast_component.html.erb +8 -0
- data/app/components/bs5/toast_component.rb +72 -0
- data/app/components/bs5/toast_container_component.html.erb +3 -0
- data/app/components/bs5/toast_container_component.rb +19 -0
- data/app/helpers/bs5/components_helper.rb +5 -2
- data/app/views/bs5/examples/alert/color/snippet.html.erb +8 -24
- data/app/views/bs5/examples/alert/default/snippet.html.erb +1 -3
- data/app/views/bs5/examples/carousel/_dark_variant.html.erb +2 -0
- data/app/views/bs5/examples/carousel/_examples.html.erb +13 -0
- data/app/views/bs5/examples/carousel/dark_variant/snippet1.html.erb +25 -0
- data/app/views/bs5/examples/carousel/examples/snippet1.html.erb +13 -0
- data/app/views/bs5/examples/carousel/examples/snippet2.html.erb +13 -0
- data/app/views/bs5/examples/carousel/examples/snippet3.html.erb +13 -0
- data/app/views/bs5/examples/carousel/examples/snippet4.html.erb +25 -0
- data/app/views/bs5/examples/carousel/examples/snippet5.html.erb +13 -0
- data/app/views/bs5/examples/carousel/examples/snippet6.html.erb +13 -0
- data/app/views/bs5/examples/dropdowns/dark/_example.html.erb +2 -0
- data/app/views/bs5/examples/dropdowns/dark/snippet.html.erb +7 -0
- data/app/views/bs5/examples/dropdowns/directions/_example.html.erb +7 -0
- data/app/views/bs5/examples/dropdowns/directions/snippet1.html.erb +17 -0
- data/app/views/bs5/examples/dropdowns/directions/snippet2.html.erb +17 -0
- data/app/views/bs5/examples/dropdowns/directions/snippet3.html.erb +17 -0
- data/app/views/bs5/examples/dropdowns/menu_alignment/_example.html.erb +5 -0
- data/app/views/bs5/examples/dropdowns/menu_alignment/snippet1.html.erb +5 -0
- data/app/views/bs5/examples/dropdowns/menu_alignment/snippet2.html.erb +7 -0
- data/app/views/bs5/examples/dropdowns/menu_alignment/snippet3.html.erb +7 -0
- data/app/views/bs5/examples/dropdowns/menu_content/_example.html.erb +9 -0
- data/app/views/bs5/examples/dropdowns/menu_content/snippet1.html.erb +5 -0
- data/app/views/bs5/examples/dropdowns/menu_content/snippet2.html.erb +7 -0
- data/app/views/bs5/examples/dropdowns/menu_content/snippet3.html.erb +10 -0
- data/app/views/bs5/examples/dropdowns/menu_content/snippet4.html.erb +24 -0
- data/app/views/bs5/examples/dropdowns/menu_items/_example.html.erb +7 -0
- data/app/views/bs5/examples/dropdowns/menu_items/snippet1.html.erb +5 -0
- data/app/views/bs5/examples/dropdowns/menu_items/snippet2.html.erb +6 -0
- data/app/views/bs5/examples/dropdowns/menu_items/snippet3.html.erb +5 -0
- data/app/views/bs5/examples/dropdowns/menu_items/snippet4.html.erb +5 -0
- data/app/views/bs5/examples/dropdowns/single/_example.html.erb +4 -0
- data/app/views/bs5/examples/dropdowns/single/snippet1.html.erb +5 -0
- data/app/views/bs5/examples/dropdowns/single/snippet2.html.erb +47 -0
- data/app/views/bs5/examples/dropdowns/single/snippet3.html.erb +47 -0
- data/app/views/bs5/examples/dropdowns/sizing/_example.html.erb +3 -0
- data/app/views/bs5/examples/dropdowns/sizing/snippet1.html.erb +17 -0
- data/app/views/bs5/examples/dropdowns/sizing/snippet2.html.erb +17 -0
- data/app/views/bs5/examples/dropdowns/split/_example.html.erb +3 -0
- data/app/views/bs5/examples/dropdowns/split/snippet1.html.erb +35 -0
- data/app/views/bs5/examples/dropdowns/split/snippet2.html.erb +47 -0
- data/app/views/bs5/examples/list_group/active/snippet.html.erb +5 -5
- data/app/views/bs5/examples/list_group/default/snippet.html.erb +5 -5
- data/app/views/bs5/examples/list_group/disabled/snippet.html.erb +5 -5
- data/app/views/bs5/examples/list_group/flush/snippet.html.erb +5 -5
- data/app/views/bs5/examples/list_group/horizontal/snippet.html.erb +18 -18
- data/app/views/bs5/examples/list_group/style/default.html.erb +8 -8
- 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/examples/progress/_animated.html.erb +2 -0
- data/app/views/bs5/examples/progress/_backgrounds.html.erb +2 -0
- data/app/views/bs5/examples/progress/_examples.html.erb +2 -0
- data/app/views/bs5/examples/progress/_labels.html.erb +2 -0
- data/app/views/bs5/examples/progress/_multiple_bars.html.erb +2 -0
- data/app/views/bs5/examples/progress/_striped.html.erb +2 -0
- data/app/views/bs5/examples/progress/animated/snippet1.html.erb +13 -0
- data/app/views/bs5/examples/progress/backgrounds/snippet1.html.erb +13 -0
- data/app/views/bs5/examples/progress/examples/snippet1.html.erb +17 -0
- data/app/views/bs5/examples/progress/labels/snippet1.html.erb +5 -0
- data/app/views/bs5/examples/progress/multiple_bars/snippet1.html.erb +5 -0
- data/app/views/bs5/examples/progress/striped/snippet1.html.erb +13 -0
- data/app/views/bs5/examples/toasts/color_schemes/_example.html.erb +2 -0
- data/app/views/bs5/examples/toasts/color_schemes/snippet.html.erb +33 -0
- data/app/views/bs5/examples/toasts/custom_content/_example.html.erb +3 -0
- data/app/views/bs5/examples/toasts/custom_content/snippet1.html.erb +3 -0
- data/app/views/bs5/examples/toasts/custom_content/snippet2.html.erb +9 -0
- data/app/views/bs5/examples/toasts/default/_example.html.erb +2 -0
- data/app/views/bs5/examples/toasts/default/snippet.html.erb +17 -0
- data/app/views/bs5/examples/toasts/js_options/_example.html.erb +2 -0
- data/app/views/bs5/examples/toasts/js_options/snippet.html.erb +23 -0
- data/app/views/bs5/examples/toasts/placement/_example.html.erb +3 -0
- data/app/views/bs5/examples/toasts/placement/snippet1.html.erb +44 -0
- data/app/views/bs5/examples/toasts/placement/snippet2.html.erb +24 -0
- data/app/views/bs5/examples/toasts/stacking/_example.html.erb +2 -0
- data/app/views/bs5/examples/toasts/stacking/snippet.html.erb +37 -0
- data/app/views/bs5/pages/carousel.html.erb +3 -0
- data/app/views/bs5/pages/dropdowns.html.erb +10 -0
- data/app/views/bs5/pages/modal.html.erb +4 -0
- data/app/views/bs5/pages/progress.html.erb +7 -0
- data/app/views/bs5/pages/toasts.html.erb +7 -0
- data/app/views/layouts/bs5/pages.html.erb +5 -0
- data/lib/bs5/version.rb +1 -1
- data/lib/generators/bs5/install/templates/bs5.js +24 -13
- metadata +113 -2
@@ -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
|
@@ -0,0 +1 @@
|
|
1
|
+
<div class="<%= bar_class %>" role="progressbar" style="width: <%= value %>%" aria-valuenow="<%= value %>" aria-valuemin="0" aria-valuemax="100"><%= label %></div>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bs5
|
4
|
+
module Progress
|
5
|
+
class BarComponent < ViewComponent::Base
|
6
|
+
attr_reader :value, :color
|
7
|
+
|
8
|
+
def initialize(value, label: nil, color: nil, striped: false, animated: false)
|
9
|
+
@value = value
|
10
|
+
@label = label
|
11
|
+
@color = color
|
12
|
+
@striped = striped
|
13
|
+
@animated = animated
|
14
|
+
end
|
15
|
+
|
16
|
+
def label
|
17
|
+
return unless @label
|
18
|
+
|
19
|
+
case @label
|
20
|
+
when String
|
21
|
+
@label
|
22
|
+
else
|
23
|
+
"#{value}%"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def bar_class
|
28
|
+
class_names = %w[progress-bar]
|
29
|
+
class_names << contextual_class
|
30
|
+
class_names << striped_class
|
31
|
+
class_names << animated_class
|
32
|
+
class_names.flatten.uniq.join(' ')
|
33
|
+
end
|
34
|
+
|
35
|
+
def contextual_class
|
36
|
+
return unless color?
|
37
|
+
|
38
|
+
"bg-#{color}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def striped_class
|
42
|
+
return unless striped?
|
43
|
+
|
44
|
+
'progress-bar-striped'
|
45
|
+
end
|
46
|
+
|
47
|
+
def animated_class
|
48
|
+
return unless animated?
|
49
|
+
|
50
|
+
%w[progress-bar-striped progress-bar-animated]
|
51
|
+
end
|
52
|
+
|
53
|
+
%i[color striped animated].each do |name|
|
54
|
+
define_method("#{name}?") do
|
55
|
+
!!instance_variable_get("@#{name}")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bs5
|
4
|
+
class ProgressComponent < ViewComponent::Base
|
5
|
+
include ViewComponent::SlotableV2
|
6
|
+
renders_many :bars, Bs5::Progress::BarComponent
|
7
|
+
|
8
|
+
attr_reader :value, :options
|
9
|
+
|
10
|
+
def initialize(value = nil, options = {})
|
11
|
+
@options = options.symbolize_keys
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bs5
|
4
|
+
class ToastComponent < ViewComponent::Base
|
5
|
+
include ViewComponent::SlotableV2
|
6
|
+
include ComponentsHelper
|
7
|
+
using HashRefinement
|
8
|
+
|
9
|
+
attr_reader :color
|
10
|
+
|
11
|
+
renders_one :header, Bs5::Toast::HeaderComponent
|
12
|
+
renders_one :body, Bs5::Toast::BodyComponent
|
13
|
+
|
14
|
+
def initialize(options = {})
|
15
|
+
@options = options.symbolize_keys
|
16
|
+
@color = @options.delete(:color)
|
17
|
+
@close_button = @options.fetch(:close_button, true)
|
18
|
+
@data_options = @options.extract!(:animation, :autohide, :delay)
|
19
|
+
end
|
20
|
+
|
21
|
+
def header?
|
22
|
+
!!header
|
23
|
+
end
|
24
|
+
|
25
|
+
def component_attributes
|
26
|
+
default_options = {
|
27
|
+
role: :alert,
|
28
|
+
aria: { live: 'assertive', atomic: true },
|
29
|
+
data: data_options
|
30
|
+
}
|
31
|
+
|
32
|
+
@options[:class] = component_class
|
33
|
+
|
34
|
+
@options.merge(default_options)
|
35
|
+
end
|
36
|
+
|
37
|
+
def white_text?
|
38
|
+
color? && color.in?(%i[primary secondary success danger dark])
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def data_options
|
44
|
+
@data_options.prefix_keys_with_bs
|
45
|
+
end
|
46
|
+
|
47
|
+
def component_class
|
48
|
+
class_names = Array(@options[:class])
|
49
|
+
class_names << 'toast'
|
50
|
+
class_names << contextual_class
|
51
|
+
class_names.compact.join(' ')
|
52
|
+
end
|
53
|
+
|
54
|
+
def contextual_class
|
55
|
+
return unless color?
|
56
|
+
|
57
|
+
class_names = ['border-0']
|
58
|
+
class_names << "bg-#{color}"
|
59
|
+
class_names << 'text-white' if white_text?
|
60
|
+
|
61
|
+
class_names
|
62
|
+
end
|
63
|
+
|
64
|
+
def color?
|
65
|
+
!!color
|
66
|
+
end
|
67
|
+
|
68
|
+
def close_button?
|
69
|
+
@close_button
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bs5
|
4
|
+
class ToastContainerComponent < ViewComponent::Base
|
5
|
+
def initialize(options = {})
|
6
|
+
@options = options.symbolize_keys
|
7
|
+
end
|
8
|
+
|
9
|
+
def component_class
|
10
|
+
class_names = Array(@options[:class])
|
11
|
+
class_names << 'toast-container'
|
12
|
+
class_names.compact.join(' ')
|
13
|
+
end
|
14
|
+
|
15
|
+
def render?
|
16
|
+
content.present?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -2,8 +2,11 @@
|
|
2
2
|
|
3
3
|
module Bs5
|
4
4
|
module ComponentsHelper
|
5
|
-
COMPONENTS = %w[accordion alert badge
|
6
|
-
|
5
|
+
COMPONENTS = %w[accordion alert badge breadcrumb button_group button_tag button_to button_toolbar
|
6
|
+
carousel close_button
|
7
|
+
dropdown list_group modal spinner
|
8
|
+
progress
|
9
|
+
toast toast_container].freeze
|
7
10
|
|
8
11
|
COMPONENTS.each do |name|
|
9
12
|
define_method("bs5_#{name}") do |*args, &block|
|
@@ -1,31 +1,15 @@
|
|
1
|
-
<%= bs5_alert(color: :primary)
|
2
|
-
A simple primary alert—check it out!
|
3
|
-
<%- end %>
|
1
|
+
<%= bs5_alert(color: :primary) { "A simple primary alert—check it out!" } %>
|
4
2
|
|
5
|
-
<%= bs5_alert(color: :secondary)
|
6
|
-
A simple secondary alert—check it out!
|
7
|
-
<%- end %>
|
3
|
+
<%= bs5_alert(color: :secondary) { "A simple secondary alert—check it out!" } %>
|
8
4
|
|
9
|
-
<%= bs5_alert(color: :success)
|
10
|
-
A simple success alert—check it out!
|
11
|
-
<%- end %>
|
5
|
+
<%= bs5_alert(color: :success) { "A simple success alert—check it out!" } %>
|
12
6
|
|
13
|
-
<%= bs5_alert(color: :danger)
|
14
|
-
A simple danger alert—check it out!
|
15
|
-
<%- end %>
|
7
|
+
<%= bs5_alert(color: :danger) { "A simple danger alert—check it out!" } %>
|
16
8
|
|
17
|
-
<%= bs5_alert(color: :warning)
|
18
|
-
A simple warning alert—check it out!
|
19
|
-
<%- end %>
|
9
|
+
<%= bs5_alert(color: :warning) { "A simple warning alert—check it out!" } %>
|
20
10
|
|
21
|
-
<%= bs5_alert(color: :info)
|
22
|
-
A simple info alert—check it out!
|
23
|
-
<%- end %>
|
11
|
+
<%= bs5_alert(color: :info) { "A simple info alert—check it out!" } %>
|
24
12
|
|
25
|
-
<%= bs5_alert(color: :light)
|
26
|
-
A simple light alert—check it out!
|
27
|
-
<%- end %>
|
13
|
+
<%= bs5_alert(color: :light) { "A simple light alert—check it out!" } %>
|
28
14
|
|
29
|
-
<%= bs5_alert(color: :dark)
|
30
|
-
A simple dark alert—check it out!
|
31
|
-
<%- end %>
|
15
|
+
<%= bs5_alert(color: :dark) { "A simple dark alert—check it out!" } %>
|