twitter-bootstrap-rails 5.3.0 → 5.4.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 (194) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +81 -0
  3. data/README.md +128 -628
  4. data/app/assets/javascripts/twitter/bootstrap/bootstrap.min.js +3 -3
  5. data/app/assets/stylesheets/twitter-bootstrap-static/bootstrap.css +3 -3
  6. data/lib/generators/bootstrap/badge/badge_generator.rb +13 -0
  7. data/lib/generators/bootstrap/breadcrumb/breadcrumb_generator.rb +13 -0
  8. data/lib/generators/bootstrap/button/button_generator.rb +13 -0
  9. data/lib/generators/bootstrap/cdn/cdn_generator.rb +39 -0
  10. data/lib/generators/bootstrap/cdn_tags.rb +43 -0
  11. data/lib/generators/bootstrap/dropdown/dropdown_generator.rb +13 -0
  12. data/lib/generators/bootstrap/features/features_generator.rb +13 -0
  13. data/lib/generators/bootstrap/footer/footer_generator.rb +13 -0
  14. data/lib/generators/bootstrap/header/header_generator.rb +13 -0
  15. data/lib/generators/bootstrap/hero/hero_generator.rb +13 -0
  16. data/lib/generators/bootstrap/install/install_generator.rb +120 -61
  17. data/lib/generators/bootstrap/install/templates/application.js +1 -1
  18. data/lib/generators/bootstrap/install/templates/bootstrap.js +10 -3
  19. data/lib/generators/bootstrap/install/templates/bootstrap_and_overrides.css +2 -2
  20. data/lib/generators/bootstrap/jumbotron/jumbotron_generator.rb +13 -0
  21. data/lib/generators/bootstrap/layout/layout_generator.rb +65 -1
  22. data/lib/generators/bootstrap/layout/templates/layout.html.erb +14 -9
  23. data/lib/generators/bootstrap/layout/templates/layout.html.haml +28 -43
  24. data/lib/generators/bootstrap/layout/templates/layout.html.slim +25 -40
  25. data/lib/generators/bootstrap/list_group/list_group_generator.rb +13 -0
  26. data/lib/generators/bootstrap/modal/modal_generator.rb +13 -0
  27. data/lib/generators/bootstrap/sidebar/sidebar_generator.rb +13 -0
  28. data/lib/generators/bootstrap/snippets/snippet_base.rb +126 -0
  29. data/lib/generators/bootstrap/snippets/snippet_catalog.rb +134 -0
  30. data/lib/generators/bootstrap/snippets/templates/badges/pills.html.erb +10 -0
  31. data/lib/generators/bootstrap/snippets/templates/badges/subtle.html.erb +10 -0
  32. data/lib/generators/bootstrap/snippets/templates/badges/subtle_bordered.html.erb +20 -0
  33. data/lib/generators/bootstrap/snippets/templates/badges/with_avatar.html.erb +34 -0
  34. data/lib/generators/bootstrap/snippets/templates/badges/with_avatar_divider.html.erb +66 -0
  35. data/lib/generators/bootstrap/snippets/templates/badges/with_icons.html.erb +26 -0
  36. data/lib/generators/bootstrap/snippets/templates/breadcrumbs/basic.html.erb +9 -0
  37. data/lib/generators/bootstrap/snippets/templates/breadcrumbs/chevron.html.erb +18 -0
  38. data/lib/generators/bootstrap/snippets/templates/breadcrumbs/custom.html.erb +18 -0
  39. data/lib/generators/bootstrap/snippets/templates/breadcrumbs/with_icons.html.erb +18 -0
  40. data/lib/generators/bootstrap/snippets/templates/buttons/circle.html.erb +20 -0
  41. data/lib/generators/bootstrap/snippets/templates/buttons/grid.html.erb +6 -0
  42. data/lib/generators/bootstrap/snippets/templates/buttons/loading.html.erb +10 -0
  43. data/lib/generators/bootstrap/snippets/templates/buttons/pills.html.erb +11 -0
  44. data/lib/generators/bootstrap/snippets/templates/buttons/with_icons.html.erb +14 -0
  45. data/lib/generators/bootstrap/snippets/templates/dropdowns/calendar.html.erb +156 -0
  46. data/lib/generators/bootstrap/snippets/templates/dropdowns/mega_menu.html.erb +140 -0
  47. data/lib/generators/bootstrap/snippets/templates/dropdowns/simple.html.erb +20 -0
  48. data/lib/generators/bootstrap/snippets/templates/dropdowns/with_icons.html.erb +88 -0
  49. data/lib/generators/bootstrap/snippets/templates/dropdowns/with_search.html.erb +64 -0
  50. data/lib/generators/bootstrap/snippets/templates/features/columns_with_icons.html.erb +46 -0
  51. data/lib/generators/bootstrap/snippets/templates/features/custom_cards.html.erb +79 -0
  52. data/lib/generators/bootstrap/snippets/templates/features/hanging_icons.html.erb +41 -0
  53. data/lib/generators/bootstrap/snippets/templates/features/icon_grid.html.erb +77 -0
  54. data/lib/generators/bootstrap/snippets/templates/features/with_title.html.erb +50 -0
  55. data/lib/generators/bootstrap/snippets/templates/footers/columns.html.erb +43 -0
  56. data/lib/generators/bootstrap/snippets/templates/footers/simple.html.erb +15 -0
  57. data/lib/generators/bootstrap/snippets/templates/footers/with_brand.html.erb +22 -0
  58. data/lib/generators/bootstrap/snippets/templates/footers/with_nav.html.erb +12 -0
  59. data/lib/generators/bootstrap/snippets/templates/footers/with_newsletter.html.erb +62 -0
  60. data/lib/generators/bootstrap/snippets/templates/headers/centered.html.erb +15 -0
  61. data/lib/generators/bootstrap/snippets/templates/headers/dark_double.html.erb +66 -0
  62. data/lib/generators/bootstrap/snippets/templates/headers/dark_search.html.erb +25 -0
  63. data/lib/generators/bootstrap/snippets/templates/headers/double.html.erb +28 -0
  64. data/lib/generators/bootstrap/snippets/templates/headers/grid_dropdown.html.erb +47 -0
  65. data/lib/generators/bootstrap/snippets/templates/headers/light_search.html.erb +34 -0
  66. data/lib/generators/bootstrap/snippets/templates/headers/nav_pills.html.erb +11 -0
  67. data/lib/generators/bootstrap/snippets/templates/headers/with_auth_buttons.html.erb +22 -0
  68. data/lib/generators/bootstrap/snippets/templates/heroes/centered.html.erb +13 -0
  69. data/lib/generators/bootstrap/snippets/templates/heroes/centered_screenshot.html.erb +17 -0
  70. data/lib/generators/bootstrap/snippets/templates/heroes/cropped_image.html.erb +17 -0
  71. data/lib/generators/bootstrap/snippets/templates/heroes/dark.html.erb +14 -0
  72. data/lib/generators/bootstrap/snippets/templates/heroes/signup_form.html.erb +26 -0
  73. data/lib/generators/bootstrap/snippets/templates/heroes/with_image.html.erb +17 -0
  74. data/lib/generators/bootstrap/snippets/templates/icons/_bootstrap_icons.html.erb +134 -0
  75. data/lib/generators/bootstrap/snippets/templates/jumbotrons/basic.html.erb +10 -0
  76. data/lib/generators/bootstrap/snippets/templates/jumbotrons/full_width.html.erb +12 -0
  77. data/lib/generators/bootstrap/snippets/templates/jumbotrons/placeholder.html.erb +13 -0
  78. data/lib/generators/bootstrap/snippets/templates/jumbotrons/with_icon.html.erb +22 -0
  79. data/lib/generators/bootstrap/snippets/templates/list-groups/checkable.html.erb +24 -0
  80. data/lib/generators/bootstrap/snippets/templates/list-groups/checkboxes.html.erb +45 -0
  81. data/lib/generators/bootstrap/snippets/templates/list-groups/checkboxes_expanded.html.erb +52 -0
  82. data/lib/generators/bootstrap/snippets/templates/list-groups/radios.html.erb +32 -0
  83. data/lib/generators/bootstrap/snippets/templates/list-groups/with_avatars.html.erb +36 -0
  84. data/lib/generators/bootstrap/snippets/templates/modals/confirm.html.erb +18 -0
  85. data/lib/generators/bootstrap/snippets/templates/modals/sheet.html.erb +19 -0
  86. data/lib/generators/bootstrap/snippets/templates/modals/signup.html.erb +44 -0
  87. data/lib/generators/bootstrap/snippets/templates/modals/whats_new.html.erb +41 -0
  88. data/lib/generators/bootstrap/snippets/templates/sidebars/collapsible.html.erb +90 -0
  89. data/lib/generators/bootstrap/snippets/templates/sidebars/dark.html.erb +67 -0
  90. data/lib/generators/bootstrap/snippets/templates/sidebars/icon_only.html.erb +59 -0
  91. data/lib/generators/bootstrap/snippets/templates/sidebars/light.html.erb +67 -0
  92. data/lib/generators/bootstrap/snippets/templates/sidebars/list_group.html.erb +94 -0
  93. data/lib/generators/bootstrap/starter/starter_generator.rb +37 -0
  94. data/lib/generators/bootstrap/starter/templates/starter.html.erb +13 -0
  95. data/lib/twitter/bootstrap/rails/bootstrap.rb +1 -0
  96. data/lib/twitter/bootstrap/rails/config.rb +54 -0
  97. data/lib/twitter/bootstrap/rails/engine.rb +0 -8
  98. data/lib/twitter/bootstrap/rails/version.rb +28 -1
  99. data/lib/twitter-bootstrap-rails.rb +0 -1
  100. data/spec/lib/generators/cdn_generator_spec.rb +42 -0
  101. data/spec/lib/generators/install_generator_spec.rb +148 -0
  102. data/spec/lib/generators/layout_generator_spec.rb +124 -0
  103. data/spec/lib/generators/no_hardcoded_versions_spec.rb +45 -0
  104. data/spec/lib/generators/snippet_generators_spec.rb +201 -0
  105. data/spec/lib/generators/starter_generator_spec.rb +54 -0
  106. data/spec/spec_helper.rb +5 -0
  107. data/spec/support/generator_spec_helper.rb +87 -0
  108. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap.bundle.min.js +3 -3
  109. data/vendor/assets/stylesheets/twitter/bootstrap/bootstrap.min.css +3 -3
  110. metadata +99 -123
  111. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  112. data/app/assets/fonts/glyphicons-halflings-regular.svg +0 -288
  113. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  114. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  115. data/app/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
  116. data/app/helpers/glyph_helper.rb +0 -23
  117. data/lib/generators/bootstrap/install/templates/bootstrap.coffee +0 -3
  118. data/lib/generators/bootstrap/install/templates/bootstrap_and_overrides.less +0 -21
  119. data/spec/lib/twitter_bootstrap_rails/glyph_helper_spec.rb +0 -24
  120. data/vendor/assets/stylesheets/twitter-bootstrap-static/bootstrap.css.erb +0 -6684
  121. data/vendor/static-source/bootstrap.less +0 -1
  122. data/vendor/static-source/sprites.less +0 -6
  123. data/vendor/toolkit/twitter/bootstrap/alerts.less +0 -73
  124. data/vendor/toolkit/twitter/bootstrap/badges.less +0 -66
  125. data/vendor/toolkit/twitter/bootstrap/bootstrap.less +0 -55
  126. data/vendor/toolkit/twitter/bootstrap/breadcrumbs.less +0 -26
  127. data/vendor/toolkit/twitter/bootstrap/button-groups.less +0 -244
  128. data/vendor/toolkit/twitter/bootstrap/buttons.less +0 -166
  129. data/vendor/toolkit/twitter/bootstrap/carousel.less +0 -270
  130. data/vendor/toolkit/twitter/bootstrap/close.less +0 -34
  131. data/vendor/toolkit/twitter/bootstrap/code.less +0 -69
  132. data/vendor/toolkit/twitter/bootstrap/component-animations.less +0 -33
  133. data/vendor/toolkit/twitter/bootstrap/dropdowns.less +0 -216
  134. data/vendor/toolkit/twitter/bootstrap/forms.less +0 -613
  135. data/vendor/toolkit/twitter/bootstrap/glyphicons.less +0 -305
  136. data/vendor/toolkit/twitter/bootstrap/grid.less +0 -84
  137. data/vendor/toolkit/twitter/bootstrap/input-groups.less +0 -171
  138. data/vendor/toolkit/twitter/bootstrap/jumbotron.less +0 -54
  139. data/vendor/toolkit/twitter/bootstrap/labels.less +0 -64
  140. data/vendor/toolkit/twitter/bootstrap/list-group.less +0 -130
  141. data/vendor/toolkit/twitter/bootstrap/media.less +0 -66
  142. data/vendor/toolkit/twitter/bootstrap/mixins/alerts.less +0 -14
  143. data/vendor/toolkit/twitter/bootstrap/mixins/background-variant.less +0 -9
  144. data/vendor/toolkit/twitter/bootstrap/mixins/border-radius.less +0 -18
  145. data/vendor/toolkit/twitter/bootstrap/mixins/buttons.less +0 -65
  146. data/vendor/toolkit/twitter/bootstrap/mixins/center-block.less +0 -7
  147. data/vendor/toolkit/twitter/bootstrap/mixins/clearfix.less +0 -22
  148. data/vendor/toolkit/twitter/bootstrap/mixins/forms.less +0 -85
  149. data/vendor/toolkit/twitter/bootstrap/mixins/gradients.less +0 -59
  150. data/vendor/toolkit/twitter/bootstrap/mixins/grid-framework.less +0 -91
  151. data/vendor/toolkit/twitter/bootstrap/mixins/grid.less +0 -122
  152. data/vendor/toolkit/twitter/bootstrap/mixins/hide-text.less +0 -21
  153. data/vendor/toolkit/twitter/bootstrap/mixins/image.less +0 -33
  154. data/vendor/toolkit/twitter/bootstrap/mixins/labels.less +0 -12
  155. data/vendor/toolkit/twitter/bootstrap/mixins/list-group.less +0 -30
  156. data/vendor/toolkit/twitter/bootstrap/mixins/nav-divider.less +0 -10
  157. data/vendor/toolkit/twitter/bootstrap/mixins/nav-vertical-align.less +0 -9
  158. data/vendor/toolkit/twitter/bootstrap/mixins/opacity.less +0 -8
  159. data/vendor/toolkit/twitter/bootstrap/mixins/pagination.less +0 -24
  160. data/vendor/toolkit/twitter/bootstrap/mixins/panels.less +0 -24
  161. data/vendor/toolkit/twitter/bootstrap/mixins/progress-bar.less +0 -10
  162. data/vendor/toolkit/twitter/bootstrap/mixins/reset-filter.less +0 -8
  163. data/vendor/toolkit/twitter/bootstrap/mixins/reset-text.less +0 -18
  164. data/vendor/toolkit/twitter/bootstrap/mixins/resize.less +0 -6
  165. data/vendor/toolkit/twitter/bootstrap/mixins/responsive-visibility.less +0 -15
  166. data/vendor/toolkit/twitter/bootstrap/mixins/size.less +0 -10
  167. data/vendor/toolkit/twitter/bootstrap/mixins/tab-focus.less +0 -9
  168. data/vendor/toolkit/twitter/bootstrap/mixins/table-row.less +0 -28
  169. data/vendor/toolkit/twitter/bootstrap/mixins/text-emphasis.less +0 -9
  170. data/vendor/toolkit/twitter/bootstrap/mixins/text-overflow.less +0 -8
  171. data/vendor/toolkit/twitter/bootstrap/mixins/vendor-prefixes.less +0 -227
  172. data/vendor/toolkit/twitter/bootstrap/mixins.less +0 -40
  173. data/vendor/toolkit/twitter/bootstrap/modals.less +0 -150
  174. data/vendor/toolkit/twitter/bootstrap/navbar.less +0 -660
  175. data/vendor/toolkit/twitter/bootstrap/navs.less +0 -242
  176. data/vendor/toolkit/twitter/bootstrap/normalize.less +0 -424
  177. data/vendor/toolkit/twitter/bootstrap/pager.less +0 -54
  178. data/vendor/toolkit/twitter/bootstrap/pagination.less +0 -89
  179. data/vendor/toolkit/twitter/bootstrap/panels.less +0 -271
  180. data/vendor/toolkit/twitter/bootstrap/popovers.less +0 -131
  181. data/vendor/toolkit/twitter/bootstrap/print.less +0 -101
  182. data/vendor/toolkit/twitter/bootstrap/progress-bars.less +0 -87
  183. data/vendor/toolkit/twitter/bootstrap/responsive-embed.less +0 -35
  184. data/vendor/toolkit/twitter/bootstrap/responsive-utilities.less +0 -194
  185. data/vendor/toolkit/twitter/bootstrap/scaffolding.less +0 -161
  186. data/vendor/toolkit/twitter/bootstrap/tables.less +0 -234
  187. data/vendor/toolkit/twitter/bootstrap/theme.less +0 -291
  188. data/vendor/toolkit/twitter/bootstrap/thumbnails.less +0 -36
  189. data/vendor/toolkit/twitter/bootstrap/tooltip.less +0 -101
  190. data/vendor/toolkit/twitter/bootstrap/type.less +0 -302
  191. data/vendor/toolkit/twitter/bootstrap/utilities.less +0 -55
  192. data/vendor/toolkit/twitter/bootstrap/variables.less +0 -1751
  193. data/vendor/toolkit/twitter/bootstrap/wells.less +0 -29
  194. data/vendor/toolkit/twitter/bootstrap_base.less +0 -2
@@ -1,50 +1,35 @@
1
- !!! 5
2
- %html(lang="en")
1
+ !!!
2
+ %html{:lang => "en"}
3
3
  %head
4
- %meta(charset="utf-8")
5
- %meta(http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1")
6
- %meta(name="viewport" content="width=device-width, initial-scale=1.0")
4
+ %meta{:charset => "utf-8"}
5
+ %meta{:name => "viewport", :content => "width=device-width, initial-scale=1"}
7
6
  %title= content_for?(:title) ? yield(:title) : "<%= app_name %>"
8
7
  = csrf_meta_tags
9
- = stylesheet_link_tag "application", :media => "all"
10
- = favicon_link_tag 'apple-touch-icon-144x144-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '144x144'
11
- = favicon_link_tag 'apple-touch-icon-114x114-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '114x114'
12
- = favicon_link_tag 'apple-touch-icon-72x72-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '72x72'
13
- = favicon_link_tag 'apple-touch-icon-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png'
14
- = favicon_link_tag 'favicon.ico', :rel => 'shortcut icon'
15
- = javascript_include_tag "application"
16
- / Le HTML5 shim, for IE6-8 support of HTML elements
17
- /[if lt IE 9]
18
- = javascript_include_tag "//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"
19
-
8
+ <% if cdn? -%>
9
+ <%= indent_tags(css_tag, " ") %>
10
+ <% else -%>
11
+ = stylesheet_link_tag <%= stylesheet_arguments %>, :media => "all"
12
+ <% end -%>
20
13
 
21
14
  %body
22
- .navbar.navbar-default.navbar-static-top
15
+ %nav.navbar.navbar-expand-lg.navbar-dark.bg-primary
23
16
  .container
24
- %button.navbar-toggle(type="button" data-toggle="collapse" data-target=".navbar-responsive-collapse")
25
- %span.icon-bar
26
- %span.icon-bar
27
- %span.icon-bar
28
- %a.navbar-brand(href="#") <%= app_name %>
29
- .navbar-collapse.collapse.navbar-responsive-collapse
30
- %ul.nav.navbar-nav
31
- %li= link_to "Link 1", "/path1"
32
- %li= link_to "Link 2", "/path2"
33
- %li= link_to "Link 3", "/path3"
34
- %li= link_to "Link 3", "/path3"
17
+ %a.navbar-brand{:href => "/"} <%= app_name %>
18
+ %button.navbar-toggler{:type => "button", "data-bs-toggle" => "collapse", "data-bs-target" => "#navbarNav", "aria-controls" => "navbarNav", "aria-expanded" => "false", "aria-label" => "Toggle navigation"}
19
+ %span.navbar-toggler-icon
20
+ #navbarNav.collapse.navbar-collapse
21
+ %ul.navbar-nav
22
+ %li.nav-item= link_to "Home", "/", :class => "nav-link"
23
+
24
+ .container.mt-4
25
+ = bootstrap_flash
26
+ = yield
27
+
28
+ %footer.mt-5.py-3.border-top
29
+ %p.text-body-secondary &copy; Company #{Time.current.year}
35
30
 
36
- .container
37
- .row
38
- .col-lg-9
39
- = bootstrap_flash
40
- = yield
41
- .col-lg-3
42
- .well.sidebar-nav
43
- %h3 Sidebar
44
- %ul.nav.nav-list
45
- %li.nav-header Sidebar
46
- %li= link_to "Link 1", "/path1"
47
- %li= link_to "Link 2", "/path2"
48
- %li= link_to "Link 3", "/path3"
49
- %footer
50
- %p &copy; Company <%= Date.today.year %>
31
+ <% if cdn? -%>
32
+ <%= indent_tags(script_tags, " ") %>
33
+ <% else -%>
34
+ = javascript_include_tag <%= javascript_arguments %>
35
+ <% end -%>
@@ -2,49 +2,34 @@ doctype html
2
2
  html lang="en"
3
3
  head
4
4
  meta charset="utf-8"
5
- meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"
6
- meta name="viewport" content="width=device-width, initial-scale=1.0"
5
+ meta name="viewport" content="width=device-width, initial-scale=1"
7
6
  title= content_for?(:title) ? yield(:title) : "<%= app_name %>"
8
7
  = csrf_meta_tags
9
- = stylesheet_link_tag "application", :media => "all"
10
- = favicon_link_tag 'apple-touch-icon-144x144-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '144x144'
11
- = favicon_link_tag 'apple-touch-icon-114x114-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '114x114'
12
- = favicon_link_tag 'apple-touch-icon-72x72-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '72x72'
13
- = favicon_link_tag 'apple-touch-icon-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png'
14
- = favicon_link_tag 'favicon.ico', :rel => 'shortcut icon'
15
- = javascript_include_tag "application"
16
- /! Le HTML5 shim, for IE6-8 support of HTML elements
17
- /[if lt IE 9]
18
- = javascript_include_tag "//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"
19
-
8
+ <% if cdn? -%>
9
+ <%= slim_tags(css_tag, " ") %>
10
+ <% else -%>
11
+ = stylesheet_link_tag <%= stylesheet_arguments %>, :media => "all"
12
+ <% end -%>
20
13
 
21
14
  body
22
- .navbar.navbar-default.navbar-static-top
23
- .container
24
- button.navbar-toggle type="button" data-toggle="collapse" data-target=".navbar-responsive-collapse"
25
- span.icon-bar
26
- span.icon-bar
27
- span.icon-bar
28
- a.navbar-brand href="#"<%= app_name %>
29
- .navbar-collapse.collapse.navbar-responsive-collapse
30
- ul.nav.navbar-nav
31
- li= link_to "Link 1", "/path1"
32
- li= link_to "Link 2", "/path2"
33
- li= link_to "Link 3", "/path3"
15
+ nav.navbar.navbar-expand-lg.navbar-dark.bg-primary
16
+ .container
17
+ a.navbar-brand href="/" <%= app_name %>
18
+ button.navbar-toggler type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"
19
+ span.navbar-toggler-icon
20
+ #navbarNav.collapse.navbar-collapse
21
+ ul.navbar-nav
22
+ li.nav-item= link_to "Home", "/", class: "nav-link"
23
+
24
+ .container.mt-4
25
+ = bootstrap_flash
26
+ = yield
34
27
 
35
- .container
36
- .row
37
- .col-lg-9
38
- = bootstrap_flash
39
- = yield
40
- .col-lg-3
41
- .well.sidebar-nav
42
- h3 Sidebar
43
- ul.nav.nav-list
44
- li.nav-header Sidebar
45
- li= link_to "Link 1", "/path1"
46
- li= link_to "Link 2", "/path2"
47
- li= link_to "Link 3", "/path3"
28
+ footer.mt-5.py-3.border-top
29
+ p.text-body-secondary &copy; Company #{Time.current.year}
48
30
 
49
- footer
50
- p &copy; Company <%= Date.today.year %>
31
+ <% if cdn? -%>
32
+ <%= slim_tags(script_tags, " ") %>
33
+ <% else -%>
34
+ = javascript_include_tag <%= javascript_arguments %>
35
+ <% end -%>
@@ -0,0 +1,13 @@
1
+ require 'generators/bootstrap/snippets/snippet_base'
2
+
3
+ module Bootstrap
4
+ module Generators
5
+ # List groups from https://getbootstrap.com/docs/5.3/examples/list-groups/
6
+ class ListGroupGenerator < SnippetBase
7
+ snippet_category "list-groups"
8
+
9
+ desc "Copies a Bootstrap list groups snippet into your views. " \
10
+ "Run with --list to see the variants."
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'generators/bootstrap/snippets/snippet_base'
2
+
3
+ module Bootstrap
4
+ module Generators
5
+ # Modals from https://getbootstrap.com/docs/5.3/examples/modals/
6
+ class ModalGenerator < SnippetBase
7
+ snippet_category "modals"
8
+
9
+ desc "Copies a Bootstrap modals snippet into your views. " \
10
+ "Run with --list to see the variants."
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'generators/bootstrap/snippets/snippet_base'
2
+
3
+ module Bootstrap
4
+ module Generators
5
+ # Sidebars from https://getbootstrap.com/docs/5.3/examples/sidebars/
6
+ class SidebarGenerator < SnippetBase
7
+ snippet_category "sidebars"
8
+
9
+ desc "Copies a Bootstrap sidebars snippet into your views. " \
10
+ "Run with --list to see the variants."
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,126 @@
1
+ require 'rails/generators'
2
+ require 'twitter/bootstrap/rails/version'
3
+ require 'generators/bootstrap/snippets/snippet_catalog'
4
+
5
+ module Bootstrap
6
+ module Generators
7
+ # Shared behaviour for the per-category snippet generators (bootstrap:header,
8
+ # bootstrap:hero, ...). Each subclass only declares which docs category it
9
+ # serves; everything else lives here.
10
+ class SnippetBase < ::Rails::Generators::Base
11
+ ICONS_PARTIAL = 'bootstrap_icons'.freeze
12
+
13
+ argument :requested_variant, :type => :string, :required => false,
14
+ :default => nil, :banner => 'VARIANT'
15
+
16
+ class_option :as, :type => :string,
17
+ :desc => 'Partial name to write (defaults to the generator name)'
18
+ class_option :path, :type => :string, :default => 'app/views/shared',
19
+ :desc => 'Directory to write the partial into'
20
+ class_option :list, :type => :boolean, :default => false,
21
+ :desc => 'List the available variants and exit'
22
+ class_option :icons, :type => :boolean, :default => true,
23
+ :desc => 'Also install the shared Bootstrap Icons sprite when the snippet needs it'
24
+
25
+ # Subclasses call `snippet_category "headers"`.
26
+ def self.snippet_category(category = nil)
27
+ @snippet_category = category if category
28
+ @snippet_category
29
+ end
30
+
31
+ def self.source_root
32
+ File.expand_path("../templates", __FILE__)
33
+ end
34
+
35
+ def self.banner
36
+ "rails generate #{namespace} [VARIANT] [options]"
37
+ end
38
+
39
+ def list_variants
40
+ return unless options[:list]
41
+
42
+ say "#{category} variants:\n\n"
43
+ SnippetCatalog.variants(category).each do |v|
44
+ say format(" %-22s %s%s", v[:name], v[:description], v[:icons] ? " (uses icons)" : "")
45
+ end
46
+ say "\nDefault: #{SnippetCatalog.default_variant(category)}"
47
+ end
48
+
49
+ def copy_snippet
50
+ return if options[:list]
51
+
52
+ copy_file "#{category}/#{variant_name}.html.erb", partial_path
53
+ end
54
+
55
+ def copy_icons
56
+ return if options[:list]
57
+ return unless variant[:icons] && options[:icons]
58
+
59
+ copy_file "icons/_#{ICONS_PARTIAL}.html.erb",
60
+ File.join(options[:path], "_#{ICONS_PARTIAL}.html.erb")
61
+ end
62
+
63
+ def report
64
+ return if options[:list]
65
+
66
+ say "\nRender it with: <%= render \"#{render_path}\" %>"
67
+ if variant[:icons] && options[:icons]
68
+ say "The snippet uses Bootstrap Icons; render the sprite once in your layout:"
69
+ say " <%= render \"#{icons_render_path}\" %>"
70
+ end
71
+ if variant[:images]
72
+ say_status :warn,
73
+ "This snippet references placeholder images from the Bootstrap docs site " \
74
+ "(e.g. bootstrap-docs.png). They will 404 until you point them at your own assets.",
75
+ :yellow
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def category
82
+ self.class.snippet_category
83
+ end
84
+
85
+ # The variant argument, or the category's first variant.
86
+ def variant_name
87
+ name = (requested_variant || SnippetCatalog.default_variant(category)).to_s.tr('-', '_')
88
+
89
+ unless SnippetCatalog.variant(category, name)
90
+ raise ::Rails::Generators::Error,
91
+ "Unknown #{category} variant #{name.inspect}. Available: " \
92
+ "#{SnippetCatalog.variant_names(category).join(', ')}. " \
93
+ "Run `rails g #{self.class.namespace} --list` for descriptions."
94
+ end
95
+
96
+ name
97
+ end
98
+
99
+ def variant
100
+ SnippetCatalog.variant(category, variant_name)
101
+ end
102
+
103
+ def partial_name
104
+ options[:as] || self.class.generator_name
105
+ end
106
+
107
+ def partial_path
108
+ File.join(options[:path], "_#{partial_name}.html.erb")
109
+ end
110
+
111
+ # "app/views/shared/_header.html.erb" -> "shared/header"
112
+ def render_path
113
+ strip_view_path(partial_name)
114
+ end
115
+
116
+ def icons_render_path
117
+ strip_view_path(ICONS_PARTIAL)
118
+ end
119
+
120
+ def strip_view_path(name)
121
+ dir = options[:path].sub(%r{\Aapp/views/}, '')
122
+ dir.empty? ? name : File.join(dir, name)
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,134 @@
1
+ module Bootstrap
2
+ module Generators
3
+ # Every snippet published at https://getbootstrap.com/docs/5.3/examples/
4
+ # Variants are listed in the order they appear on each docs page.
5
+ module SnippetCatalog
6
+ # generator name => docs category
7
+ GENERATORS = {
8
+ "header" => "headers",
9
+ "hero" => "heroes",
10
+ "features" => "features",
11
+ "sidebar" => "sidebars",
12
+ "footer" => "footers",
13
+ "dropdown" => "dropdowns",
14
+ "list_group" => "list-groups",
15
+ "modal" => "modals",
16
+ "badge" => "badges",
17
+ "breadcrumb" => "breadcrumbs",
18
+ "button" => "buttons",
19
+ "jumbotron" => "jumbotrons",
20
+ }.freeze
21
+
22
+ VARIANTS = {
23
+ "headers" => [
24
+ { :name => "centered", :description => "Brand and centered nav pills with a bottom border", :icons => true, :images => false },
25
+ { :name => "nav_pills", :description => "Bare centered nav pills", :icons => false, :images => false },
26
+ { :name => "with_auth_buttons", :description => "Brand, nav, and Login / Sign-up buttons", :icons => true, :images => false },
27
+ { :name => "dark_search", :description => "Dark bar with search box and user dropdown", :icons => true, :images => false },
28
+ { :name => "light_search", :description => "Light bar with search box and user dropdown", :icons => true, :images => false },
29
+ { :name => "grid_dropdown", :description => "Full-width grid header with a brand dropdown and search", :icons => true, :images => false },
30
+ { :name => "double", :description => "Two-row header: utility links above, brand and nav below", :icons => true, :images => false },
31
+ { :name => "dark_double", :description => "Dark two-row header with nav and search", :icons => true, :images => false },
32
+ ],
33
+ "heroes" => [
34
+ { :name => "centered", :description => "Centered hero with heading, lead text, and buttons", :icons => false, :images => true },
35
+ { :name => "centered_screenshot", :description => "Centered hero with a screenshot below the fold", :icons => false, :images => true },
36
+ { :name => "with_image", :description => "Responsive left-aligned hero with an image", :icons => false, :images => true },
37
+ { :name => "signup_form", :description => "Vertically centered hero with a sign-up form", :icons => false, :images => false },
38
+ { :name => "cropped_image", :description => "Bordered hero with a cropped image and shadows", :icons => false, :images => true },
39
+ { :name => "dark", :description => "Dark colour hero", :icons => false, :images => false },
40
+ ],
41
+ "features" => [
42
+ { :name => "columns_with_icons", :description => "Three columns each led by an icon", :icons => true, :images => false },
43
+ { :name => "hanging_icons", :description => "Rows with icons hanging to the left of the text", :icons => true, :images => false },
44
+ { :name => "custom_cards", :description => "Feature cards with background images", :icons => true, :images => true },
45
+ { :name => "icon_grid", :description => "Compact grid of icons with short descriptions", :icons => true, :images => false },
46
+ { :name => "with_title", :description => "Left-aligned section title beside a feature grid", :icons => true, :images => false },
47
+ ],
48
+ "sidebars" => [
49
+ { :name => "dark", :description => "Dark sidebar with nav and a user dropdown", :icons => true, :images => false },
50
+ { :name => "light", :description => "Light sidebar with nav and a user dropdown", :icons => true, :images => false },
51
+ { :name => "icon_only", :description => "Narrow icon-only sidebar", :icons => true, :images => false },
52
+ { :name => "collapsible", :description => "Sidebar with collapsible nav sections", :icons => true, :images => false },
53
+ { :name => "list_group", :description => "Sidebar built from a scrollable list group", :icons => true, :images => false },
54
+ ],
55
+ "footers" => [
56
+ { :name => "simple", :description => "Copyright on the left, nav links on the right", :icons => true, :images => false },
57
+ { :name => "with_brand", :description => "Brand mark, copyright, and social icons", :icons => true, :images => false },
58
+ { :name => "with_nav", :description => "Centered nav above a centered copyright line", :icons => false, :images => false },
59
+ { :name => "columns", :description => "Five columns of links with a brand column", :icons => true, :images => false },
60
+ { :name => "with_newsletter", :description => "Link columns plus a newsletter sign-up form", :icons => true, :images => false },
61
+ ],
62
+ "dropdowns" => [
63
+ { :name => "simple", :description => "Menu of plain items with a divider", :icons => false, :images => false },
64
+ { :name => "with_search", :description => "Menu with a dark header and a search field", :icons => false, :images => false },
65
+ { :name => "with_icons", :description => "Menu items each led by an icon", :icons => true, :images => false },
66
+ { :name => "calendar", :description => "Date picker rendered inside a dropdown", :icons => true, :images => false },
67
+ { :name => "mega_menu", :description => "Wide multi-column menu with descriptions", :icons => true, :images => false },
68
+ ],
69
+ "list-groups" => [
70
+ { :name => "with_avatars", :description => "Items with an avatar, heading, text, and timestamp", :icons => false, :images => false },
71
+ { :name => "checkboxes", :description => "Checkbox items with supporting text", :icons => false, :images => false },
72
+ { :name => "checkboxes_expanded", :description => "Checkbox items that reveal more content when checked", :icons => true, :images => false },
73
+ { :name => "checkable", :description => "Borderless checkable cards", :icons => false, :images => false },
74
+ { :name => "radios", :description => "Radio cards with a selected state", :icons => false, :images => false },
75
+ ],
76
+ "modals" => [
77
+ { :name => "sheet", :description => "Bottom-docked modal sheet with a list of actions", :icons => false, :images => false },
78
+ { :name => "confirm", :description => "Small confirmation dialog with two buttons", :icons => false, :images => false },
79
+ { :name => "whats_new", :description => "\"What's new\" dialog listing recent features", :icons => true, :images => false },
80
+ { :name => "signup", :description => "Sign-up dialog with a form and third-party buttons", :icons => true, :images => false },
81
+ ],
82
+ "badges" => [
83
+ { :name => "pills", :description => "Solid pill badges in every theme colour", :icons => false, :images => false },
84
+ { :name => "subtle", :description => "Subtle background pill badges", :icons => false, :images => false },
85
+ { :name => "subtle_bordered", :description => "Subtle pill badges with a matching border", :icons => false, :images => false },
86
+ { :name => "with_avatar", :description => "Badges leading with a small round avatar", :icons => false, :images => false },
87
+ { :name => "with_icons", :description => "Badges with a trailing icon", :icons => true, :images => false },
88
+ { :name => "with_avatar_divider", :description => "Avatar badges split by a vertical divider", :icons => true, :images => false },
89
+ ],
90
+ "breadcrumbs" => [
91
+ { :name => "basic", :description => "Breadcrumb on a tinted, rounded background", :icons => false, :images => false },
92
+ { :name => "with_icons", :description => "Breadcrumb whose first crumb is a home icon", :icons => true, :images => false },
93
+ { :name => "chevron", :description => "Chevron separators instead of slashes", :icons => true, :images => false },
94
+ { :name => "custom", :description => "Arrow-shaped crumbs joined edge to edge", :icons => true, :images => false },
95
+ ],
96
+ "buttons" => [
97
+ { :name => "pills", :description => "Pill buttons in every theme colour", :icons => false, :images => false },
98
+ { :name => "grid", :description => "Full-width stacked buttons in a grid", :icons => false, :images => false },
99
+ { :name => "with_icons", :description => "Buttons with a trailing icon", :icons => true, :images => false },
100
+ { :name => "loading", :description => "Buttons with a spinner in the loading state", :icons => false, :images => false },
101
+ { :name => "circle", :description => "Round icon-only buttons", :icons => true, :images => false },
102
+ ],
103
+ "jumbotrons" => [
104
+ { :name => "with_icon", :description => "Jumbotron led by a large SVG icon", :icons => true, :images => false },
105
+ { :name => "placeholder", :description => "Faded jumbotron for placeholder content", :icons => true, :images => false },
106
+ { :name => "full_width", :description => "Edge-to-edge jumbotron with a contained body", :icons => false, :images => false },
107
+ { :name => "basic", :description => "Simple jumbotron inside a container", :icons => false, :images => false },
108
+ ],
109
+ }.freeze
110
+
111
+ module_function
112
+
113
+ def category_for(generator_name)
114
+ GENERATORS.fetch(generator_name)
115
+ end
116
+
117
+ def variants(category)
118
+ VARIANTS.fetch(category)
119
+ end
120
+
121
+ def variant(category, name)
122
+ variants(category).find { |v| v[:name] == name }
123
+ end
124
+
125
+ def variant_names(category)
126
+ variants(category).map { |v| v[:name] }
127
+ end
128
+
129
+ def default_variant(category)
130
+ variants(category).first[:name]
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,10 @@
1
+ <div class="d-flex gap-2 justify-content-center py-5">
2
+ <span class="badge text-bg-primary rounded-pill">Primary</span>
3
+ <span class="badge text-bg-secondary rounded-pill">Secondary</span>
4
+ <span class="badge text-bg-success rounded-pill">Success</span>
5
+ <span class="badge text-bg-danger rounded-pill">Danger</span>
6
+ <span class="badge text-bg-warning rounded-pill">Warning</span>
7
+ <span class="badge text-bg-info rounded-pill">Info</span>
8
+ <span class="badge text-bg-light rounded-pill">Light</span>
9
+ <span class="badge text-bg-dark rounded-pill">Dark</span>
10
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="d-flex gap-2 justify-content-center py-5">
2
+ <span class="badge bg-primary-subtle text-primary-emphasis rounded-pill">Primary</span>
3
+ <span class="badge bg-secondary-subtle text-secondary-emphasis rounded-pill">Secondary</span>
4
+ <span class="badge bg-success-subtle text-success-emphasis rounded-pill">Success</span>
5
+ <span class="badge bg-danger-subtle text-danger-emphasis rounded-pill">Danger</span>
6
+ <span class="badge bg-warning-subtle text-warning-emphasis rounded-pill">Warning</span>
7
+ <span class="badge bg-info-subtle text-info-emphasis rounded-pill">Info</span>
8
+ <span class="badge bg-light-subtle text-light-emphasis rounded-pill">Light</span>
9
+ <span class="badge bg-dark-subtle text-dark-emphasis rounded-pill">Dark</span>
10
+ </div>
@@ -0,0 +1,20 @@
1
+ <div class="d-flex gap-2 justify-content-center py-5">
2
+ <span class="badge bg-primary-subtle border border-primary-subtle text-primary-emphasis rounded-pill">
3
+ Primary
4
+ </span>
5
+ <span class="badge bg-secondary-subtle border border-secondary-subtle text-secondary-emphasis rounded-pill">
6
+ Secondary
7
+ </span>
8
+ <span class="badge bg-success-subtle border border-success-subtle text-success-emphasis rounded-pill">
9
+ Success
10
+ </span>
11
+ <span class="badge bg-danger-subtle border border-danger-subtle text-danger-emphasis rounded-pill">
12
+ Danger
13
+ </span>
14
+ <span class="badge bg-warning-subtle border border-warning-subtle text-warning-emphasis rounded-pill">
15
+ Warning
16
+ </span>
17
+ <span class="badge bg-info-subtle border border-info-subtle text-info-emphasis rounded-pill">Info</span>
18
+ <span class="badge bg-light-subtle border border-light-subtle text-light-emphasis rounded-pill">Light</span>
19
+ <span class="badge bg-dark-subtle border border-dark-subtle text-dark-emphasis rounded-pill">Dark</span>
20
+ </div>
@@ -0,0 +1,34 @@
1
+ <div class="d-flex gap-2 justify-content-center py-5">
2
+ <span class="badge d-flex align-items-center p-1 pe-2 text-primary-emphasis bg-primary-subtle border border-primary-subtle rounded-pill">
3
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
4
+ Primary
5
+ </span>
6
+ <span class="badge d-flex align-items-center p-1 pe-2 text-secondary-emphasis bg-secondary-subtle border border-secondary-subtle rounded-pill">
7
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
8
+ Secondary
9
+ </span>
10
+ <span class="badge d-flex align-items-center p-1 pe-2 text-success-emphasis bg-success-subtle border border-success-subtle rounded-pill">
11
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
12
+ Success
13
+ </span>
14
+ <span class="badge d-flex align-items-center p-1 pe-2 text-danger-emphasis bg-danger-subtle border border-danger-subtle rounded-pill">
15
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
16
+ Danger
17
+ </span>
18
+ <span class="badge d-flex align-items-center p-1 pe-2 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-pill">
19
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
20
+ Warning
21
+ </span>
22
+ <span class="badge d-flex align-items-center p-1 pe-2 text-info-emphasis bg-info-subtle border border-info-subtle rounded-pill">
23
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
24
+ Info
25
+ </span>
26
+ <span class="badge d-flex align-items-center p-1 pe-2 text-dark-emphasis bg-light-subtle border border-dark-subtle rounded-pill">
27
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
28
+ Light
29
+ </span>
30
+ <span class="badge d-flex align-items-center p-1 pe-2 text-dark-emphasis bg-dark-subtle border border-dark-subtle rounded-pill">
31
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
32
+ Dark
33
+ </span>
34
+ </div>
@@ -0,0 +1,66 @@
1
+ <div class="d-flex gap-2 justify-content-center py-5">
2
+ <span class="badge d-flex align-items-center p-1 pe-2 text-primary-emphasis bg-primary-subtle border border-primary-subtle rounded-pill">
3
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
4
+ Primary
5
+ <span class="vr mx-2"></span>
6
+ <a href="#" aria-label="Delete primary">
7
+ <svg class="bi" width="16" height="16" aria-hidden="true"><use xlink:href="#x-circle-fill"></use></svg>
8
+ </a>
9
+ </span>
10
+ <span class="badge d-flex align-items-center p-1 pe-2 text-secondary-emphasis bg-secondary-subtle border border-secondary-subtle rounded-pill">
11
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
12
+ Secondary
13
+ <span class="vr mx-2"></span>
14
+ <a href="#" aria-label="Delete secondary">
15
+ <svg class="bi" width="16" height="16" aria-hidden="true"><use xlink:href="#x-circle-fill"></use></svg>
16
+ </a>
17
+ </span>
18
+ <span class="badge d-flex align-items-center p-1 pe-2 text-success-emphasis bg-success-subtle border border-success-subtle rounded-pill">
19
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
20
+ Success
21
+ <span class="vr mx-2"></span>
22
+ <a href="#" aria-label="Delete success">
23
+ <svg class="bi" width="16" height="16" aria-hidden="true"><use xlink:href="#x-circle-fill"></use></svg>
24
+ </a>
25
+ </span>
26
+ <span class="badge d-flex align-items-center p-1 pe-2 text-danger-emphasis bg-danger-subtle border border-danger-subtle rounded-pill">
27
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
28
+ Danger
29
+ <span class="vr mx-2"></span>
30
+ <a href="#" aria-label="Delete danger">
31
+ <svg class="bi" width="16" height="16" aria-hidden="true"><use xlink:href="#x-circle-fill"></use></svg>
32
+ </a>
33
+ </span>
34
+ <span class="badge d-flex align-items-center p-1 pe-2 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-pill">
35
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
36
+ Warning
37
+ <span class="vr mx-2"></span>
38
+ <a href="#" aria-label="Delete warning">
39
+ <svg class="bi" width="16" height="16" aria-hidden="true"><use xlink:href="#x-circle-fill"></use></svg>
40
+ </a>
41
+ </span>
42
+ <span class="badge d-flex align-items-center p-1 pe-2 text-info-emphasis bg-info-subtle border border-info-subtle rounded-pill">
43
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
44
+ Info
45
+ <span class="vr mx-2"></span>
46
+ <a href="#" aria-label="Delete info">
47
+ <svg class="bi" width="16" height="16" aria-hidden="true"><use xlink:href="#x-circle-fill"></use></svg>
48
+ </a>
49
+ </span>
50
+ <span class="badge d-flex align-items-center p-1 pe-2 text-light-emphasis bg-light-subtle border border-dark-subtle rounded-pill">
51
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
52
+ Light
53
+ <span class="vr mx-2"></span>
54
+ <a href="#" aria-label="Delete light">
55
+ <svg class="bi" width="16" height="16" aria-hidden="true"><use xlink:href="#x-circle-fill"></use></svg>
56
+ </a>
57
+ </span>
58
+ <span class="badge d-flex align-items-center p-1 pe-2 text-dark-emphasis bg-dark-subtle border border-dark-subtle rounded-pill">
59
+ <img class="rounded-circle me-1" width="24" height="24" src="https://github.com/mdo.png" alt="">
60
+ Dark
61
+ <span class="vr mx-2"></span>
62
+ <a href="#" aria-label="Delete dark">
63
+ <svg class="bi" width="16" height="16" aria-hidden="true"><use xlink:href="#x-circle-fill"></use></svg>
64
+ </a>
65
+ </span>
66
+ </div>
@@ -0,0 +1,26 @@
1
+ <div class="d-flex gap-2 justify-content-center py-5">
2
+ <span class="badge d-flex p-2 align-items-center text-bg-primary rounded-pill">
3
+ <span class="px-1">Primary 1</span>
4
+ <a href="#" aria-label="Delete primary 1">
5
+ <svg class="bi ms-1" width="16" height="16" aria-hidden="true">
6
+ <use xlink:href="#x-circle-fill"></use>
7
+ </svg>
8
+ </a>
9
+ </span>
10
+ <span class="badge d-flex p-2 align-items-center text-primary-emphasis bg-primary-subtle rounded-pill">
11
+ <span class="px-1">Primary 2</span>
12
+ <a href="#" aria-label="Delete primary 2">
13
+ <svg class="bi ms-1" width="16" height="16" aria-hidden="true">
14
+ <use xlink:href="#x-circle-fill"></use>
15
+ </svg>
16
+ </a>
17
+ </span>
18
+ <span class="badge d-flex p-2 align-items-center text-primary-emphasis bg-primary-subtle border border-primary-subtle rounded-pill">
19
+ <span class="px-1">Primary 3</span>
20
+ <a href="#" aria-label="Delete primary 3">
21
+ <svg class="bi ms-1" width="16" height="16" aria-hidden="true">
22
+ <use xlink:href="#x-circle-fill"></use>
23
+ </svg>
24
+ </a>
25
+ </span>
26
+ </div>