matestack-ui-bootstrap 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +8 -0
  3. data/README.md +26 -0
  4. data/Rakefile +43 -0
  5. data/app/assets/images/avatar-placeholder.png +0 -0
  6. data/app/assets/images/icons/bootstrap-icons.svg +1 -0
  7. data/app/concepts/matestack/ui/bootstrap/apps/admin_template.rb +85 -0
  8. data/app/concepts/matestack/ui/bootstrap/components/accordion.rb +53 -0
  9. data/app/concepts/matestack/ui/bootstrap/components/alert.js +53 -0
  10. data/app/concepts/matestack/ui/bootstrap/components/alert.rb +34 -0
  11. data/app/concepts/matestack/ui/bootstrap/components/avatar.rb +27 -0
  12. data/app/concepts/matestack/ui/bootstrap/components/badge.rb +30 -0
  13. data/app/concepts/matestack/ui/bootstrap/components/breadcrumb.rb +46 -0
  14. data/app/concepts/matestack/ui/bootstrap/components/button.rb +54 -0
  15. data/app/concepts/matestack/ui/bootstrap/components/button_group.rb +36 -0
  16. data/app/concepts/matestack/ui/bootstrap/components/card.rb +100 -0
  17. data/app/concepts/matestack/ui/bootstrap/components/carousel.js +79 -0
  18. data/app/concepts/matestack/ui/bootstrap/components/carousel.rb +85 -0
  19. data/app/concepts/matestack/ui/bootstrap/components/chart.js +232 -0
  20. data/app/concepts/matestack/ui/bootstrap/components/chart.rb +71 -0
  21. data/app/concepts/matestack/ui/bootstrap/components/close.rb +30 -0
  22. data/app/concepts/matestack/ui/bootstrap/components/collapse.js +84 -0
  23. data/app/concepts/matestack/ui/bootstrap/components/collapse.rb +43 -0
  24. data/app/concepts/matestack/ui/bootstrap/components/dropdown.js +14 -0
  25. data/app/concepts/matestack/ui/bootstrap/components/dropdown.rb +116 -0
  26. data/app/concepts/matestack/ui/bootstrap/components/icon.rb +19 -0
  27. data/app/concepts/matestack/ui/bootstrap/components/list_group.rb +83 -0
  28. data/app/concepts/matestack/ui/bootstrap/components/modal.js +90 -0
  29. data/app/concepts/matestack/ui/bootstrap/components/modal.rb +106 -0
  30. data/app/concepts/matestack/ui/bootstrap/components/navbar.rb +120 -0
  31. data/app/concepts/matestack/ui/bootstrap/components/page_heading.rb +28 -0
  32. data/app/concepts/matestack/ui/bootstrap/components/pagination.rb +40 -0
  33. data/app/concepts/matestack/ui/bootstrap/components/popover.js +26 -0
  34. data/app/concepts/matestack/ui/bootstrap/components/popover.rb +92 -0
  35. data/app/concepts/matestack/ui/bootstrap/components/progress.rb +65 -0
  36. data/app/concepts/matestack/ui/bootstrap/components/scrollspy.rb +33 -0
  37. data/app/concepts/matestack/ui/bootstrap/components/section_card.rb +31 -0
  38. data/app/concepts/matestack/ui/bootstrap/components/spinner.rb +31 -0
  39. data/app/concepts/matestack/ui/bootstrap/components/tab_nav.rb +81 -0
  40. data/app/concepts/matestack/ui/bootstrap/components/tab_nav_content.rb +32 -0
  41. data/app/concepts/matestack/ui/bootstrap/components/toast.js +79 -0
  42. data/app/concepts/matestack/ui/bootstrap/components/toast.rb +99 -0
  43. data/app/concepts/matestack/ui/bootstrap/components/tooltip.js +26 -0
  44. data/app/concepts/matestack/ui/bootstrap/components/tooltip.rb +82 -0
  45. data/app/concepts/matestack/ui/bootstrap/content/collection/collection.rb +112 -0
  46. data/app/concepts/matestack/ui/bootstrap/content/collection/collection.scss +10 -0
  47. data/app/concepts/matestack/ui/bootstrap/content/collection/content.rb +101 -0
  48. data/app/concepts/matestack/ui/bootstrap/content/collection/filter.rb +33 -0
  49. data/app/concepts/matestack/ui/bootstrap/content/collection/paginate.rb +92 -0
  50. data/app/concepts/matestack/ui/bootstrap/content/figure.rb +7 -0
  51. data/app/concepts/matestack/ui/bootstrap/form/checkbox.rb +90 -0
  52. data/app/concepts/matestack/ui/bootstrap/form/date.js +38 -0
  53. data/app/concepts/matestack/ui/bootstrap/form/date.rb +98 -0
  54. data/app/concepts/matestack/ui/bootstrap/form/input.rb +123 -0
  55. data/app/concepts/matestack/ui/bootstrap/form/radio.rb +65 -0
  56. data/app/concepts/matestack/ui/bootstrap/form/select.haml +11 -0
  57. data/app/concepts/matestack/ui/bootstrap/form/select.rb +74 -0
  58. data/app/concepts/matestack/ui/bootstrap/form/submit.rb +20 -0
  59. data/app/concepts/matestack/ui/bootstrap/form/switch.rb +90 -0
  60. data/app/concepts/matestack/ui/bootstrap/layout/column.rb +47 -0
  61. data/app/concepts/matestack/ui/bootstrap/layout/container.rb +25 -0
  62. data/app/concepts/matestack/ui/bootstrap/layout/row.rb +15 -0
  63. data/app/concepts/matestack/ui/bootstrap/layout/sidebar.js +64 -0
  64. data/app/concepts/matestack/ui/bootstrap/layout/sidebar.rb +45 -0
  65. data/app/concepts/matestack/ui/bootstrap/layout/sidebar.scss +57 -0
  66. data/app/concepts/matestack/ui/bootstrap/pages/devise/sign_in.rb +40 -0
  67. data/app/concepts/matestack/ui/bootstrap/registry.rb +63 -0
  68. data/app/helpers/matestack/ui/bootstrap/application_helper.rb +13 -0
  69. data/app/javascript/matestack-ui-bootstrap/index.js +26 -0
  70. data/app/javascript/matestack-ui-bootstrap/stylesheets/matestack-ui-bootstrap.scss +65 -0
  71. data/app/javascript/packs/matestack-ui-bootstrap.js +2 -0
  72. data/config/routes.rb +2 -0
  73. data/config/webpack/development.js +5 -0
  74. data/config/webpack/environment.js +29 -0
  75. data/config/webpack/production.js +33 -0
  76. data/config/webpack/test.js +5 -0
  77. data/config/webpacker.yml +96 -0
  78. data/lib/matestack/ui/bootstrap.rb +27 -0
  79. data/lib/matestack/ui/bootstrap/engine.rb +26 -0
  80. data/lib/matestack/ui/bootstrap/version.rb +7 -0
  81. data/lib/tasks/matestack/ui/bootstrap_tasks.rake +66 -0
  82. metadata +137 -0
@@ -0,0 +1,20 @@
1
+ class Matestack::Ui::Bootstrap::Form::Submit < Matestack::Ui::Component
2
+
3
+ optional :button_variant
4
+ optional :spinner_variant
5
+ optional :text
6
+ optional :loading_text
7
+
8
+ def response
9
+ form_submit do
10
+ bs_btn type: "submit", variant: button_variant || :primary, attributes: { "v-if": "!loading()" } do
11
+ plain text || "Submit"
12
+ end
13
+ bs_btn type: "submit", variant: button_variant || :primary, attributes: { disabled: true, "v-if": "loading()" } do
14
+ bs_spinner variant: spinner_variant || :light, size: :sm
15
+ plain loading_text || "Loading..."
16
+ end
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,90 @@
1
+ class Matestack::Ui::Bootstrap::Form::Switch < Matestack::Ui::Core::Form::Checkbox::Checkbox
2
+
3
+ optional :form_text
4
+ optional :disabled
5
+ optional :variant
6
+
7
+ def response
8
+ if !checkbox_options.empty?
9
+ label for: attr_key, class: "form-label", text: input_label if input_label
10
+ end
11
+ if !checkbox_options.empty?
12
+ multiple_switches
13
+ else
14
+ true_false_switch
15
+ end
16
+ render_form_text
17
+ end
18
+
19
+ private
20
+
21
+ def checkbox_wrapper(options = {}, &block)
22
+ div class: "form-check form-switch #{'form-check-inline' if variant == :inline}", attributes: options[:attributes] do
23
+ yield
24
+ end
25
+ end
26
+
27
+ def bs_label(text:, for_input:)
28
+ label text: text, for: for_input, class: 'form-check-label'
29
+ end
30
+
31
+ def true_false_switch
32
+ checkbox_wrapper do
33
+ form_input type: :hidden, key: key, value: (false_value || 0), errors: false
34
+ input html_attributes.merge(
35
+ type: :checkbox,
36
+ id: "#{id_for_item(value)}",
37
+ name: item_name(key),
38
+ value: checked_value,
39
+ class: 'form-check-input',
40
+ disabled: disabled,
41
+ attributes: vue_attributes.merge(
42
+ ref: "input.#{attr_key}",
43
+ )
44
+ )
45
+ bs_label text: input_label, for_input: id_for_item(value)
46
+ render_errors
47
+ end
48
+ end
49
+
50
+ def multiple_switches
51
+ checkbox_options.to_a.each do |item|
52
+ checkbox_wrapper do
53
+ input html_attributes.merge(
54
+ type: :checkbox,
55
+ id: "#{id_for_item(item_value(item))}",
56
+ name: item_name(item),
57
+ value: item_value(item),
58
+ class: 'form-check-input',
59
+ disabled: disabled,
60
+ attributes: vue_attributes
61
+ )
62
+ bs_label text: item_name(item), for_input: id_for_item(item_value(item))
63
+ render_errors if checkbox_options.to_a.last == item
64
+ end
65
+ end
66
+ end
67
+
68
+ def render_errors
69
+ unless @included_config[:errors] == false && (errors == false || errors.nil?) || errors == false
70
+ div class: 'invalid-feedback', attributes: { 'v-for': "error in #{error_key}" } do
71
+ plain '{{ error }}'
72
+ end
73
+ end
74
+ end
75
+
76
+ def input_error_class
77
+ 'is-invalid'
78
+ end
79
+
80
+ def checkbox_options
81
+ super || {}
82
+ end
83
+
84
+ def render_form_text
85
+ div id: "form_text_for_#{attr_key}", class: "form-text" do
86
+ plain form_text
87
+ end
88
+ end
89
+
90
+ end
@@ -0,0 +1,47 @@
1
+ class Matestack::Ui::Bootstrap::Layout::Column < Matestack::Ui::Component
2
+
3
+ COL_ATTRIBUTES = %i[default sm md lg xl xxl]
4
+ optional *COL_ATTRIBUTES
5
+
6
+ ORDER_ATTRIBUTES = %i[order order_sm order_md order_lg order_xl order_xxl]
7
+ optional *ORDER_ATTRIBUTES
8
+
9
+ OFFSET_ATTRIBUTES = %i[offset offset_sm offset_md offset_lg offset_xl offset_xxl]
10
+ optional *OFFSET_ATTRIBUTES
11
+
12
+ optional class: { as: :bs_class }
13
+ optional :align_self
14
+
15
+ def response
16
+ div col_attributes do
17
+ yield_components
18
+ end
19
+ end
20
+
21
+ protected
22
+
23
+ def col_attributes
24
+ html_attributes.merge(
25
+ class: col_classes,
26
+ attributes: options[:attributes]
27
+ )
28
+ end
29
+
30
+ def col_classes
31
+ classes = []
32
+ COL_ATTRIBUTES.each do |attrs|
33
+ classes << "col-#{ self.send(:"#{attrs}") }" if attrs == :default and self.send(:"#{attrs}")
34
+ classes << "col-#{attrs}-#{ self.send(:"#{attrs}") }" if attrs != :default and self.send(:"#{attrs}")
35
+ end
36
+ ORDER_ATTRIBUTES.each do |attrs|
37
+ classes << "#{attrs}-#{ self.send(:"#{attrs}") }".gsub('_', '-') if self.send(:"#{attrs}")
38
+ end
39
+ OFFSET_ATTRIBUTES.each do |attrs|
40
+ classes << "#{attrs}-#{ self.send(:"#{attrs}") }".gsub('_', '-') if self.send(:"#{attrs}")
41
+ end
42
+ classes << "align-self-#{align_self}" if align_self.present?
43
+ classes << "col" if classes.blank?
44
+ classes << bs_class
45
+ classes.join(' ').strip
46
+ end
47
+ end
@@ -0,0 +1,25 @@
1
+ class Matestack::Ui::Bootstrap::Layout::Container < Matestack::Ui::Component
2
+
3
+ optional :size, class: { as: :bs_class }
4
+
5
+ def response
6
+ div container_attributes do
7
+ yield_components
8
+ end
9
+ end
10
+
11
+ protected
12
+
13
+ def container_attributes
14
+ html_attributes.merge(
15
+ class: container_classes
16
+ )
17
+ end
18
+
19
+ def container_classes
20
+ [].tap do |classes|
21
+ classes << (size.present? ? "container-#{size}" : "container")
22
+ classes << bs_class
23
+ end.join(' ').strip
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ class Matestack::Ui::Bootstrap::Layout::Row < Matestack::Ui::Component
2
+ def prepare
3
+ @row_classes = []
4
+
5
+ @row_classes << "align-items-#{options[:vertical]}" if options[:vertical].present?
6
+ @row_classes << "justify-content-#{options[:horizontal]}" if options[:horizontal].present?
7
+ @row_classes << "#{options[:class]}" if options[:class].present?
8
+ end
9
+
10
+ def response
11
+ div id: "#{options[:id]}", class: "row #{@row_classes.join(' ')}" do
12
+ yield_components
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,64 @@
1
+ const bootstrap = require('bootstrap')
2
+
3
+ MatestackUiCore.Vue.component('matestack-ui-bootstrap-sidebar', {
4
+ mixins: [MatestackUiCore.componentMixin],
5
+
6
+ data() {
7
+ return {
8
+ sidebarOpen: false,
9
+ };
10
+ },
11
+
12
+ methods: {
13
+ sidebarToggle: function() {
14
+ var sidebarElement = document.getElementById("sidebar");
15
+ if (sidebarElement.classList.contains("closed")) {
16
+ this.openSideBar();
17
+ } else {
18
+ this.closeSideBar();
19
+ }
20
+ },
21
+ openSideBar: function(){
22
+ var sidebarElement = document.getElementById("sidebar");
23
+ var contentElement = document.getElementById("content")
24
+ this.sidebarOpen = true;
25
+ sidebarElement.classList.remove("closed")
26
+ sidebarElement.classList.add("open")
27
+ contentElement.classList.add("sidebar-open")
28
+ },
29
+ closeSideBar: function(){
30
+ var sidebarElement = document.getElementById("sidebar");
31
+ var contentElement = document.getElementById("content")
32
+ this.sidebarOpen = false;
33
+ sidebarElement.classList.add("closed")
34
+ sidebarElement.classList.remove("open")
35
+ contentElement.classList.remove("sidebar-open")
36
+ },
37
+ resizeCallback: function(){
38
+ if (window.innerWidth <= 992){
39
+ this.closeSideBar();
40
+ } else {
41
+ this.openSideBar();
42
+ }
43
+ }
44
+ },
45
+
46
+ mounted: function(){
47
+ if (window.innerWidth <= 992){
48
+ this.sidebarOpen = true;
49
+ }
50
+ window.addEventListener('resize', this.resizeCallback);
51
+ var self = this;
52
+ MatestackUiCore.matestackEventHub.$on("page_loaded", function(){
53
+ if (window.innerWidth <= 992){
54
+ self.closeSideBar();
55
+ }
56
+ })
57
+ MatestackUiCore.matestackEventHub.$on("page_loading_triggered", function(){
58
+ if (window.innerWidth <= 992){
59
+ self.closeSideBar();
60
+ }
61
+ })
62
+ }
63
+
64
+ });
@@ -0,0 +1,45 @@
1
+ class Matestack::Ui::Bootstrap::Layout::Sidebar < Matestack::Ui::VueJsComponent
2
+
3
+ vue_js_component_name "matestack-ui-bootstrap-sidebar"
4
+
5
+ optional :slots
6
+ optional :sidebar_navigation_items
7
+
8
+ def response
9
+ div class: "sidebar-wrapper shadow-sm bg-white", id: "sidebar" do
10
+ nav class: 'sidebar pt-4 px-3' do
11
+ div class: "sidebar-toggler" do
12
+ bs_btn variant: :link, attributes: { "@click": "sidebarToggle" } do
13
+ bs_icon name: "list", size: 25, class: "text-muted"
14
+ end
15
+ end
16
+ div class: "sidebar-top mb-3" do
17
+ slot slots[:sidebar_top] if slots[:sidebar_top].present?
18
+ end
19
+ div class: "sidebar-navigation my-3" do
20
+ sidebar_navigation_partial
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ def sidebar_navigation_partial
27
+ div class: "list-group" do
28
+ sidebar_navigation_items.each do |item|
29
+ if item[:type] == :link
30
+ link class: "list-group-item list-group-item-action border-0 rounded", path: item[:path] do
31
+ bs_icon name: item[:icon], size: 20 if item[:icon]
32
+ span class: "ps-3", text: item[:text] if item[:text]
33
+ end
34
+ else
35
+ transition class: "list-group-item list-group-item-action border-0 rounded", path: item[:path], delay: item[:delay] || 300 do
36
+ bs_icon name: item[:icon], size: 20 if item[:icon]
37
+ span class: "ps-3", text: item[:text] if item[:text]
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+ end
@@ -0,0 +1,57 @@
1
+ // Sidebar
2
+ .sidebar-wrapper{
3
+ position: relative;
4
+ z-index: 10;
5
+ transition: 0.5s;
6
+
7
+ flex-grow: 0; /* do not grow - initial value: 0 */
8
+ flex-shrink: 0; /* do not shrink - initial value: 1 */
9
+ flex-basis: 300px; /* width/height - initial value: auto */
10
+
11
+ .sidebar-toggler{
12
+ transition: 0.5s;
13
+ position: relative;
14
+ left: 290px;
15
+ }
16
+
17
+ &.closed {
18
+ margin-left: -300px;
19
+ }
20
+ &.open {
21
+ margin-left: 0px;
22
+ }
23
+
24
+ // @include media-breakpoint-down(lg) {
25
+ @media (max-width: 992px) {
26
+ margin-left: -300px;
27
+ &.open {
28
+ margin-left: 0px;
29
+ }
30
+ }
31
+
32
+ .sidebar{
33
+ min-height: 100vh;
34
+ height: 100%;
35
+
36
+
37
+
38
+ .sidebar-top{
39
+ margin-top: -35px;
40
+ a{
41
+ text-decoration: none;
42
+ }
43
+ }
44
+
45
+ .list-group-item{
46
+ &.active{
47
+ margin-top: 0px!important;
48
+ }
49
+ &.active-child{
50
+ color: var(--bs-white);
51
+ background-color: var(--bs-primary);
52
+ }
53
+ }
54
+ }
55
+
56
+
57
+ }
@@ -0,0 +1,40 @@
1
+ class Matestack::Ui::Bootstrap::Pages::Devise::SignIn < Matestack::Ui::Page
2
+
3
+ def response
4
+ bs_container class: "mt-5" do
5
+ bs_row class: "mt-5", vertical: :center, horizontal: :center do
6
+ bs_col md:4 do
7
+ login_form_partial
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def login_form_partial
16
+ section class: "mt-5 rounded shadow-sm p-4 mb-4" do
17
+ heading size: 2, text: 'Sign in'
18
+ form form_config do
19
+ div class: "mb-3 mt-4" do
20
+ bs_form_input label: 'Email', key: :email, type: :email
21
+ end
22
+ div class: "mb-3" do
23
+ bs_form_input label: 'Password', key: :password, type: :password
24
+ end
25
+ div class: "mb-3" do
26
+ bs_form_submit text: "Sign in"
27
+ end
28
+ end
29
+ toggle show_on: 'sign_in_failure' do
30
+ plain 'Your email or password is not valid.'
31
+ end
32
+ br
33
+ small text: "Dummy user: admin@matestack.io"
34
+ br
35
+ small text: "Dummy password: password"
36
+ end
37
+ end
38
+
39
+
40
+ end
@@ -0,0 +1,63 @@
1
+ module Matestack::Ui::Bootstrap::Registry
2
+
3
+ COMPONENTS = {
4
+ bs_accordion: Matestack::Ui::Bootstrap::Components::Accordion,
5
+ bs_alert: Matestack::Ui::Bootstrap::Components::Alert,
6
+ bs_avatar: Matestack::Ui::Bootstrap::Components::Avatar,
7
+ bs_badge: Matestack::Ui::Bootstrap::Components::Badge,
8
+ bs_breadcrumb: Matestack::Ui::Bootstrap::Components::Breadcrumb,
9
+ bs_btn: Matestack::Ui::Bootstrap::Components::Button,
10
+ bs_btn_group: Matestack::Ui::Bootstrap::Components::ButtonGroup,
11
+ bs_card: Matestack::Ui::Bootstrap::Components::Card,
12
+ bs_carousel: Matestack::Ui::Bootstrap::Components::Carousel,
13
+ bs_chart: Matestack::Ui::Bootstrap::Components::Chart,
14
+ bs_close: Matestack::Ui::Bootstrap::Components::Close,
15
+ bs_collapse: Matestack::Ui::Bootstrap::Components::Collapse,
16
+ bs_dropdown: Matestack::Ui::Bootstrap::Components::Dropdown,
17
+ bs_icon: Matestack::Ui::Bootstrap::Components::Icon,
18
+ bs_list_group: Matestack::Ui::Bootstrap::Components::ListGroup,
19
+ bs_modal: Matestack::Ui::Bootstrap::Components::Modal,
20
+ bs_navbar: Matestack::Ui::Bootstrap::Components::Navbar,
21
+ bs_pagination: Matestack::Ui::Bootstrap::Components::Pagination,
22
+ bs_page_heading: Matestack::Ui::Bootstrap::Components::PageHeading,
23
+ bs_popover: Matestack::Ui::Bootstrap::Components::Popover,
24
+ bs_progress: Matestack::Ui::Bootstrap::Components::Progress,
25
+ bs_scrollspy: Matestack::Ui::Bootstrap::Components::Scrollspy,
26
+ bs_section_card: Matestack::Ui::Bootstrap::Components::SectionCard,
27
+ bs_spinner: Matestack::Ui::Bootstrap::Components::Spinner,
28
+ bs_tab_nav: Matestack::Ui::Bootstrap::Components::TabNav,
29
+ bs_tab_nav_content: Matestack::Ui::Bootstrap::Components::TabNavContent,
30
+ bs_toast: Matestack::Ui::Bootstrap::Components::Toast,
31
+ bs_tooltip: Matestack::Ui::Bootstrap::Components::Tooltip,
32
+ }
33
+
34
+ FORMS = {
35
+ bs_form_input: Matestack::Ui::Bootstrap::Form::Input,
36
+ bs_form_select: Matestack::Ui::Bootstrap::Form::Select,
37
+ bs_form_checkbox: Matestack::Ui::Bootstrap::Form::Checkbox,
38
+ bs_form_radio: Matestack::Ui::Bootstrap::Form::Radio,
39
+ bs_form_switch: Matestack::Ui::Bootstrap::Form::Switch,
40
+ bs_form_submit: Matestack::Ui::Bootstrap::Form::Submit,
41
+ bs_form_date: Matestack::Ui::Bootstrap::Form::Date,
42
+ }
43
+
44
+ CONTENT = {
45
+ bs_figure: Matestack::Ui::Bootstrap::Content::Figure,
46
+ bs_smart_collection: Matestack::Ui::Bootstrap::Content::Collection::Collection,
47
+ }
48
+
49
+ LAYOUTS = {
50
+ bs_col: Matestack::Ui::Bootstrap::Layout::Column,
51
+ bs_container: Matestack::Ui::Bootstrap::Layout::Container,
52
+ bs_row: Matestack::Ui::Bootstrap::Layout::Row,
53
+ bs_sidebar: Matestack::Ui::Bootstrap::Layout::Sidebar
54
+ }
55
+
56
+ Matestack::Ui::Core::Component::Registry.register_components(
57
+ **COMPONENTS,
58
+ **FORMS,
59
+ **CONTENT,
60
+ **LAYOUTS
61
+ )
62
+
63
+ end