adminterface 0.0.0 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +1 -1
- data/README.md +69 -0
- data/Rakefile +43 -0
- data/app/assets/config/adminterface_manifest.js +1 -0
- data/app/assets/stylesheets/adminterface/_base.scss +20 -0
- data/app/assets/stylesheets/adminterface/_print.scss +56 -0
- data/app/assets/stylesheets/adminterface/components/_active_admin_comment.scss +19 -0
- data/app/assets/stylesheets/adminterface/components/_all.scss +24 -0
- data/app/assets/stylesheets/adminterface/components/_aside.scss +28 -0
- data/app/assets/stylesheets/adminterface/components/_attributes_table.scss +19 -0
- data/app/assets/stylesheets/adminterface/components/_comments.scss +7 -0
- data/app/assets/stylesheets/adminterface/components/_divider.scss +28 -0
- data/app/assets/stylesheets/adminterface/components/_filters.scss +27 -0
- data/app/assets/stylesheets/adminterface/components/_flash.scss +4 -0
- data/app/assets/stylesheets/adminterface/components/_footer.scss +4 -0
- data/app/assets/stylesheets/adminterface/components/_form.scss +219 -0
- data/app/assets/stylesheets/adminterface/components/_header.scss +30 -0
- data/app/assets/stylesheets/adminterface/components/_index.scss +1 -0
- data/app/assets/stylesheets/adminterface/components/_index_as_grid.scss +5 -0
- data/app/assets/stylesheets/adminterface/components/_index_as_table.scss +1 -0
- data/app/assets/stylesheets/adminterface/components/_index_footer.scss +19 -0
- data/app/assets/stylesheets/adminterface/components/_modal_dialog.scss +4 -0
- data/app/assets/stylesheets/adminterface/components/_pagination.scss +3 -0
- data/app/assets/stylesheets/adminterface/components/_panel.scss +21 -0
- data/app/assets/stylesheets/adminterface/components/_sidebar.scss +13 -0
- data/app/assets/stylesheets/adminterface/components/_site_title.scss +17 -0
- data/app/assets/stylesheets/adminterface/components/_table_for.scss +37 -0
- data/app/assets/stylesheets/adminterface/components/_table_tools.scss +19 -0
- data/app/assets/stylesheets/adminterface/components/_thumbnail.scss +29 -0
- data/app/assets/stylesheets/adminterface/components/_title_bar.scss +36 -0
- data/app/assets/stylesheets/adminterface/components/inputs/_all.scss +2 -0
- data/app/assets/stylesheets/adminterface/components/inputs/_password.scss +28 -0
- data/app/assets/stylesheets/adminterface/components/inputs/_text.scss +30 -0
- data/app/assets/stylesheets/adminterface/helpers/_aa_icon.scss +1 -0
- data/app/assets/stylesheets/adminterface/helpers/_all.scss +2 -0
- data/app/assets/stylesheets/adminterface/helpers/_pointer.scss +1 -0
- data/app/assets/stylesheets/adminterface/layouts/_all.scss +4 -0
- data/app/assets/stylesheets/adminterface/layouts/_base.scss +5 -0
- data/app/assets/stylesheets/adminterface/layouts/_logged_in.scss +30 -0
- data/app/assets/stylesheets/adminterface/layouts/_logged_out.scss +14 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_all.scss +4 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_mixins.scss +195 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_navigation_aside.scss +33 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_navigation_sidebar.scss +15 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_navigation_top.scss +33 -0
- data/app/assets/stylesheets/adminterface/mixins/_all.scss +3 -0
- data/app/assets/stylesheets/adminterface/mixins/_layouts.scss +38 -0
- data/app/assets/stylesheets/adminterface/mixins/_utilities.scss +39 -0
- data/app/assets/stylesheets/adminterface/mixins/_variables.scss +100 -0
- data/app/assets/stylesheets/adminterface/placeholders/_aa_icon.scss +10 -0
- data/app/assets/stylesheets/adminterface/placeholders/_all.scss +3 -0
- data/app/assets/stylesheets/adminterface/placeholders/_background.scss +5 -0
- data/app/assets/stylesheets/adminterface/placeholders/_typography.scss +11 -0
- data/app/assets/stylesheets/adminterface/vendors/_all.scss +4 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/_all.scss +6 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/_variables.scss +51 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_buttons.scss +5 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_dropdowns.scss +28 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_navs.scss +25 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/form/_labels.scss +5 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/content/_tables.scss +2 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/content/_typography.scss +2 -0
- data/app/assets/stylesheets/adminterface/vendors/flatpickr/_all.scss +2 -0
- data/app/assets/stylesheets/adminterface/vendors/flatpickr/_variables.scss +7 -0
- data/app/assets/stylesheets/adminterface/vendors/flatpickr/main.scss +50 -0
- data/app/assets/stylesheets/adminterface/vendors/tom_select/_all.scss +1 -0
- data/app/assets/stylesheets/adminterface/vendors/tom_select/_main.scss +6 -0
- data/app/assets/stylesheets/adminterface/vendors/trix/_actiontext.scss +36 -0
- data/app/assets/stylesheets/adminterface/vendors/trix/_all.scss +3 -0
- data/app/assets/stylesheets/adminterface/vendors/trix/_trix_editor.scss +86 -0
- data/app/assets/stylesheets/adminterface/vendors/trix/_variables.scss +31 -0
- data/app/javascript/adminterface/base.js +14 -0
- data/app/javascript/adminterface/config.js +129 -0
- data/app/javascript/adminterface/initializers/batch_actions.js +9 -0
- data/app/javascript/adminterface/initializers/bootstrap.js +29 -0
- data/app/javascript/adminterface/initializers/confirm_dialog.js +23 -0
- data/app/javascript/adminterface/initializers/detached_dropdown.js +16 -0
- data/app/javascript/adminterface/initializers/drawer_menu_item_toggler.js +15 -0
- data/app/javascript/adminterface/initializers/filters.js +23 -0
- data/app/javascript/adminterface/initializers/has_many.js +7 -0
- data/app/javascript/adminterface/initializers/header_toggler.js +10 -0
- data/app/javascript/adminterface/initializers/index.js +2 -0
- data/app/javascript/adminterface/initializers/per_page.js +12 -0
- data/app/javascript/adminterface/initializers/plugins/flatpickr.js +24 -0
- data/app/javascript/adminterface/initializers/plugins/input_counter.js +21 -0
- data/app/javascript/adminterface/initializers/plugins/password_visibility.js +23 -0
- data/app/javascript/adminterface/initializers/plugins/tom_select.js +24 -0
- data/app/javascript/adminterface/lib/__tests__/checkbox_toggler.html +5 -0
- data/app/javascript/adminterface/lib/__tests__/checkbox_toggler.spec.js +110 -0
- data/app/javascript/adminterface/lib/__tests__/detached_dropdown.spec.js +69 -0
- data/app/javascript/adminterface/lib/__tests__/filters.spec.js +150 -0
- data/app/javascript/adminterface/lib/__tests__/has_many.html +14 -0
- data/app/javascript/adminterface/lib/__tests__/has_many.spec.js +224 -0
- data/app/javascript/adminterface/lib/__tests__/utils.spec.js +280 -0
- data/app/javascript/adminterface/lib/batch_actions.js +106 -0
- data/app/javascript/adminterface/lib/checkbox_toggler.js +55 -0
- data/app/javascript/adminterface/lib/confirm_dialog.js +113 -0
- data/app/javascript/adminterface/lib/detached_dropdown.js +34 -0
- data/app/javascript/adminterface/lib/filters.js +34 -0
- data/app/javascript/adminterface/lib/has_many.js +125 -0
- data/app/javascript/adminterface/lib/header_toggler.js +54 -0
- data/app/javascript/adminterface/lib/input.js +108 -0
- data/app/javascript/adminterface/lib/inputs/base/groupish.js +55 -0
- data/app/javascript/adminterface/lib/inputs/base/pluginish.js +63 -0
- data/app/javascript/adminterface/lib/inputs/base_input.js +87 -0
- data/app/javascript/adminterface/lib/inputs/boolean_input.js +30 -0
- data/app/javascript/adminterface/lib/inputs/check_boxes_input.js +14 -0
- data/app/javascript/adminterface/lib/inputs/choices_input.js +96 -0
- data/app/javascript/adminterface/lib/inputs/color_input.js +14 -0
- data/app/javascript/adminterface/lib/inputs/country_input.js +90 -0
- data/app/javascript/adminterface/lib/inputs/datalist_input.js +41 -0
- data/app/javascript/adminterface/lib/inputs/date_picker_input.js +11 -0
- data/app/javascript/adminterface/lib/inputs/datetime_picker_input.js +11 -0
- data/app/javascript/adminterface/lib/inputs/hidden_input.js +21 -0
- data/app/javascript/adminterface/lib/inputs/password_input.js +13 -0
- data/app/javascript/adminterface/lib/inputs/radio_input.js +13 -0
- data/app/javascript/adminterface/lib/inputs/select_input.js +68 -0
- data/app/javascript/adminterface/lib/inputs/string_input.js +13 -0
- data/app/javascript/adminterface/lib/inputs/switch_input.js +9 -0
- data/app/javascript/adminterface/lib/inputs/text_input.js +12 -0
- data/app/javascript/adminterface/lib/inputs/time_picker_input.js +13 -0
- data/app/javascript/adminterface/lib/inputs/time_zone_input.js +66 -0
- data/app/javascript/adminterface/lib/per_page.js +18 -0
- data/app/javascript/adminterface/lib/plugins/input_counter.js +94 -0
- data/app/javascript/adminterface/lib/plugins/password_visibility.js +70 -0
- data/app/javascript/adminterface/lib/table_checkbox_toggler.js +47 -0
- data/app/javascript/adminterface/lib/utils.js +148 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +19 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +21 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +19 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +24 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +23 -0
- data/app/views/active_admin/devise/shared/_links.html.erb +25 -0
- data/app/views/active_admin/devise/shared/_omniauth.html.erb +10 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +19 -0
- data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_gap.html.erb +12 -0
- data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin/_paginator.html.erb +27 -0
- data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +56 -0
- data/config/locales/active_admin.en.yml +25 -0
- data/lib/adminterface/callable.rb +7 -0
- data/lib/adminterface/configs.rb +76 -0
- data/lib/adminterface/data/base.rb +11 -0
- data/lib/adminterface/data/countries.rb +44 -0
- data/lib/adminterface/data/time_zones.rb +31 -0
- data/lib/adminterface/data.rb +6 -0
- data/lib/adminterface/encryption/encryptor.rb +26 -0
- data/lib/adminterface/engine.rb +22 -0
- data/lib/adminterface/extensions/base_controller.rb +59 -0
- data/lib/adminterface/extensions/batch_actions/resource_extension.rb +64 -0
- data/lib/adminterface/extensions/batch_actions/views/batch_action_selector.rb +48 -0
- data/lib/adminterface/extensions/batch_actions/views/selection_cells.rb +39 -0
- data/lib/adminterface/extensions/dsl.rb +13 -0
- data/lib/adminterface/extensions/dynamic_settings_node.rb +26 -0
- data/lib/adminterface/extensions/filters/forms.rb +76 -0
- data/lib/adminterface/extensions/form_builder.rb +165 -0
- data/lib/adminterface/extensions/inputs/base/active_admin_config.rb +21 -0
- data/lib/adminterface/extensions/inputs/base/choices.rb +33 -0
- data/lib/adminterface/extensions/inputs/base/groupish.rb +50 -0
- data/lib/adminterface/extensions/inputs/base/html.rb +15 -0
- data/lib/adminterface/extensions/inputs/base/labelling.rb +15 -0
- data/lib/adminterface/extensions/inputs/base/pluginish.rb +56 -0
- data/lib/adminterface/extensions/inputs/base/stringish.rb +19 -0
- data/lib/adminterface/extensions/inputs/base/wrapping.rb +25 -0
- data/lib/adminterface/extensions/inputs/base.rb +19 -0
- data/lib/adminterface/extensions/inputs/boolean_input.rb +42 -0
- data/lib/adminterface/extensions/inputs/check_boxes_input.rb +34 -0
- data/lib/adminterface/extensions/inputs/color_input.rb +29 -0
- data/lib/adminterface/extensions/inputs/country_input.rb +33 -0
- data/lib/adminterface/extensions/inputs/datalist_input.rb +26 -0
- data/lib/adminterface/extensions/inputs/date_picker_input.rb +30 -0
- data/lib/adminterface/extensions/inputs/date_select_input.rb +7 -0
- data/lib/adminterface/extensions/inputs/datetime_picker_input.rb +19 -0
- data/lib/adminterface/extensions/inputs/datetime_select_input.rb +7 -0
- data/lib/adminterface/extensions/inputs/email_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/file_input.rb +19 -0
- data/lib/adminterface/extensions/inputs/filters/base/search_method_select.rb +37 -0
- data/lib/adminterface/extensions/inputs/filters/base.rb +3 -0
- data/lib/adminterface/extensions/inputs/filters/boolean_input.rb +4 -0
- data/lib/adminterface/extensions/inputs/filters/check_boxes_input.rb +12 -0
- data/lib/adminterface/extensions/inputs/filters/date_picker_input.rb +4 -0
- data/lib/adminterface/extensions/inputs/filters/date_range_input.rb +50 -0
- data/lib/adminterface/extensions/inputs/filters/select_input.rb +4 -0
- data/lib/adminterface/extensions/inputs/number_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/password_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/phone_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/radio_input.rb +41 -0
- data/lib/adminterface/extensions/inputs/range_input.rb +22 -0
- data/lib/adminterface/extensions/inputs/rich_text_area_input.rb +21 -0
- data/lib/adminterface/extensions/inputs/search_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/select_input.rb +33 -0
- data/lib/adminterface/extensions/inputs/string_input.rb +19 -0
- data/lib/adminterface/extensions/inputs/switch_input.rb +11 -0
- data/lib/adminterface/extensions/inputs/text_input.rb +27 -0
- data/lib/adminterface/extensions/inputs/time_picker_input.rb +19 -0
- data/lib/adminterface/extensions/inputs/time_select_input.rb +7 -0
- data/lib/adminterface/extensions/inputs/time_zone_input.rb +33 -0
- data/lib/adminterface/extensions/inputs/url_input.rb +23 -0
- data/lib/adminterface/extensions/menu_item.rb +16 -0
- data/lib/adminterface/extensions/namespace_settings.rb +30 -0
- data/lib/adminterface/extensions/orm/active_record/comments/views/active_admin_comments.rb +122 -0
- data/lib/adminterface/extensions/resource/action_items.rb +117 -0
- data/lib/adminterface/extensions/sidebar_section.rb +35 -0
- data/lib/adminterface/extensions/view_helpers/alert_helper.rb +38 -0
- data/lib/adminterface/extensions/view_helpers/component_helper.rb +23 -0
- data/lib/adminterface/extensions/views/action_items.rb +39 -0
- data/lib/adminterface/extensions/views/columns.rb +59 -0
- data/lib/adminterface/extensions/views/components/active_admin_form.rb +47 -0
- data/lib/adminterface/extensions/views/components/attributes_table.rb +28 -0
- data/lib/adminterface/extensions/views/components/blank_slate.rb +19 -0
- data/lib/adminterface/extensions/views/components/dropdown_menu.rb +58 -0
- data/lib/adminterface/extensions/views/components/icon.rb +26 -0
- data/lib/adminterface/extensions/views/components/index_list.rb +43 -0
- data/lib/adminterface/extensions/views/components/menu.rb +18 -0
- data/lib/adminterface/extensions/views/components/menu_item.rb +69 -0
- data/lib/adminterface/extensions/views/components/paginated_collection.rb +52 -0
- data/lib/adminterface/extensions/views/components/panel.rb +71 -0
- data/lib/adminterface/extensions/views/components/scopes.rb +53 -0
- data/lib/adminterface/extensions/views/components/sidebar_section.rb +39 -0
- data/lib/adminterface/extensions/views/components/site_title.rb +36 -0
- data/lib/adminterface/extensions/views/components/status_tag.rb +26 -0
- data/lib/adminterface/extensions/views/components/table_for.rb +23 -0
- data/lib/adminterface/extensions/views/components/tabs.rb +101 -0
- data/lib/adminterface/extensions/views/footer.rb +27 -0
- data/lib/adminterface/extensions/views/header.rb +60 -0
- data/lib/adminterface/extensions/views/index_as_grid.rb +53 -0
- data/lib/adminterface/extensions/views/index_as_table.rb +77 -0
- data/lib/adminterface/extensions/views/pages/base.rb +165 -0
- data/lib/adminterface/extensions/views/pages/form.rb +27 -0
- data/lib/adminterface/extensions/views/pages/index.rb +136 -0
- data/lib/adminterface/extensions/views/pages/page.rb +18 -0
- data/lib/adminterface/extensions/views/title_bar.rb +74 -0
- data/lib/adminterface/fixtures/components.yml +73 -0
- data/lib/adminterface/fixtures/css_classes.yml +107 -0
- data/lib/adminterface/initializers/batch_actions.rb +15 -0
- data/lib/adminterface/initializers/comments.rb +13 -0
- data/lib/adminterface/initializers/configurations.rb +38 -0
- data/lib/adminterface/initializers/formtastic.rb +58 -0
- data/lib/adminterface/initializers/resource.rb +20 -0
- data/lib/adminterface/initializers/view_helpers.rb +14 -0
- data/lib/adminterface/initializers/views.rb +39 -0
- data/lib/adminterface/license.rb +18 -0
- data/lib/adminterface/licensing/base.rb +99 -0
- data/lib/adminterface/licensing/commercial.rb +7 -0
- data/lib/adminterface/licensing/notice.rb +54 -0
- data/lib/adminterface/licensing/personal.rb +13 -0
- data/lib/adminterface/public.pem +9 -0
- data/lib/adminterface/version.rb +3 -0
- data/lib/adminterface.rb +55 -0
- data/lib/generators/adminterface/comments/comments_generator.rb +33 -0
- data/lib/generators/adminterface/comments/templates/README +13 -0
- data/lib/generators/adminterface/comments/templates/active_admin_comment_action_text.rb +18 -0
- data/lib/generators/adminterface/comments/templates/migrations/drop_body_for_active_admin_comments.rb.erb +28 -0
- data/lib/generators/adminterface/configs/configs_generator.rb +19 -0
- data/lib/generators/adminterface/configs/templates/README +33 -0
- data/lib/generators/adminterface/install/install_generator.rb +39 -0
- data/lib/generators/adminterface/install/templates/dashboard.rb +32 -0
- data/lib/generators/adminterface/views/views_generator.rb +15 -0
- data/lib/generators/adminterface/webpacker/templates/README +27 -0
- data/lib/generators/adminterface/webpacker/templates/active_admin.js +12 -0
- data/lib/generators/adminterface/webpacker/templates/active_admin.scss +8 -0
- data/lib/generators/adminterface/webpacker/templates/print.scss +3 -0
- data/lib/generators/adminterface/webpacker/webpacker_generator.rb +69 -0
- data/lib/tasks/adminterface_tasks.rake +4 -0
- metadata +291 -10
- data/lib/name.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55f6123dc817294d2566d26a1bf0537e4872ac7f21f614302d0c03a7eb2b5d02
|
4
|
+
data.tar.gz: bcf8d3977bfecbf02325ebb7c54eed28b1b28bf6858ce5e740a5ea7ad1a82536
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4e1d39c819aa2b33ba261343fd69f99db3af0a99a7b9a5bd7d5db236a2a041989d0a074de689bf0be058fec7ae5c8169ef6add875c231e98d00f1af132bec79
|
7
|
+
data.tar.gz: 0b47892df0a7b40cff4f99038228e2cc00cb9be1654517ed0297fb8dde4daa1c2a000c4d9228f839d042222775a602300165fd47a47eaf4f7870a583f52d7d92
|
data/LICENSE.md
CHANGED
@@ -87,7 +87,7 @@ CMDBrew Studio Inc. is the sole and exclusive owner of all right, title, and int
|
|
87
87
|
If you make a Contribution to the Software, you hereby automatically, immediately, unconditionally, and irrevocably assign the entirety of such Contribution to CMDBrew Studio Inc. for no additional consideration beyond the License granted hereunder. Similarly, in the event that you acquire (by any means) or have (at any time) any right, title, or interest (including any Intellectual Property Right) in or to the Software beyond the License granted hereunder, you hereby automatically, immediately, unconditionally, and irrevocably assign the entirety of such right, title, and interest to CMDBrew Studio Inc. for no additional consideration beyond the License granted hereunder. In the event of any assignment by you to us under this Section "Contributions", you hereby irrevocably waive, to the extent permitted by applicable law, any and all claims you may now or hereafter have in any jurisdiction to all rights of paternity, integrity, disclosure, and withdrawal and any other rights (which may be known as "moral rights") with respect to the subject matter of such assignment. For further information regarding how to contribute, please visit the the Software Repository.
|
88
88
|
|
89
89
|
## Refunds
|
90
|
-
CMDBrew Studio Inc. offers limited refunds on software within
|
90
|
+
CMDBrew Studio Inc. offers limited refunds on software within 14 days of purchase. Contact contact@cmdbrew.com for assistance.
|
91
91
|
|
92
92
|
## Indemnity
|
93
93
|
You agree to indemnify and hold harmless CMDBrew Studio Inc. for any third-party claims, actions or suits, as well as any related expenses, liabilities, damages, settlements or fees arising from your use or misuse of the Software, or a violation of any terms of this license.
|
data/README.md
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
# Adminterface <!-- omit in toc -->
|
2
|
+
[![CI](https://github.com/CMDBrew/adminterface/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/CMDBrew/adminterface/actions/workflows/ci.yml)
|
3
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/4dbedfdf21a2d675d2ca/maintainability)](https://codeclimate.com/github/CMDBrew/adminterface/maintainability)
|
4
|
+
[![Test Coverage](https://api.codeclimate.com/v1/badges/4dbedfdf21a2d675d2ca/test_coverage)](https://codeclimate.com/github/CMDBrew/adminterface/test_coverage)
|
5
|
+
[![gem](https://img.shields.io/gem/v/adminterface?color=%23E9573F&label=rubygems.org)](https://rubygems.org/gems/adminterface)
|
6
|
+
[![npm](https://img.shields.io/npm/v/@cmdbrew/adminterface?color=%230273B4&label=npmjs.com)](https://www.npmjs.com/package/@cmdbrew/adminterface)
|
7
|
+
|
8
|
+
A gem that brings Bootstrap 5, advanced customizability, and other goodies into ActiveAdmin
|
9
|
+
|
10
|
+
[![](preview.jpg)](https://adminterface.io)
|
11
|
+
|
12
|
+
## Dependencies
|
13
|
+
- [Ruby](https://www.ruby-lang.org/en/) >= 2.7
|
14
|
+
- [Rails](http://rubyonrails.org/) >= 6.0
|
15
|
+
- [ActiveAdmin](https://github.com/activeadmin/activeadmin) ~> 2.9
|
16
|
+
- [Bootstrap](https://getbootstrap.com/) ~> 5.1.3
|
17
|
+
- [Webpacker](https://github.com/rails/webpacker) ~> 5.0
|
18
|
+
|
19
|
+
## Quick Start
|
20
|
+
1. Add the following to your application's Gemfile:
|
21
|
+
```ruby
|
22
|
+
gem "adminterface"
|
23
|
+
```
|
24
|
+
2. Then execute:
|
25
|
+
```bash
|
26
|
+
$ bundle install
|
27
|
+
```
|
28
|
+
3. Install ActiveAdmin (If you haven't)
|
29
|
+
```bash
|
30
|
+
$ rails g active_admin:install --use_webpacker
|
31
|
+
```
|
32
|
+
4. Install Adminterface
|
33
|
+
|
34
|
+
> This command will ask for permissions to overwrite files generated by ActiveAdmin. Make sure to review the files carefully and accept them.
|
35
|
+
> We recommend you commit your files before running this command to ensure you are aware of the changes made.
|
36
|
+
|
37
|
+
```bash
|
38
|
+
$ rails g adminterface:install
|
39
|
+
```
|
40
|
+
5. Migrate your database and start the server
|
41
|
+
```bash
|
42
|
+
$ rails db:migrate
|
43
|
+
$ rails server
|
44
|
+
```
|
45
|
+
|
46
|
+
## Documentation
|
47
|
+
Check our [website](https://adminterface.io) to find in-depth documentation for everything that Adminterface offers.
|
48
|
+
|
49
|
+
## Contributing
|
50
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
51
|
+
|
52
|
+
## License
|
53
|
+
Adminterface is free for personal and non-commercial use and with a yearly subscription for commercial purposes. See our [Terms of Service in full text](LICENSE.md) for more information.
|
54
|
+
|
55
|
+
### For Commerical License
|
56
|
+
Get a license at https://adminterface.io/pricing, then create and add the `license_key` into the following file in your project:
|
57
|
+
```ruby
|
58
|
+
# config/initializers/adminterface.rb
|
59
|
+
Adminterface.setup do |config|
|
60
|
+
config.license_key = "**********************"
|
61
|
+
|
62
|
+
## Use Rails credentials:
|
63
|
+
## doc: https://edgeguides.rubyonrails.org/security.html#custom-credentials
|
64
|
+
# config.license_key = Rails.application.credentials.adminterface[:license_key]
|
65
|
+
|
66
|
+
## Or, use environment variables:
|
67
|
+
# config.license_key = ENV["ADMINTERFACE_LICENSE_KEY"]
|
68
|
+
end
|
69
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
|
3
|
+
APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
|
4
|
+
load "rails/tasks/engine.rake"
|
5
|
+
load "rails/tasks/statistics.rake"
|
6
|
+
|
7
|
+
require "bundler/gem_tasks"
|
8
|
+
require "rake/testtask"
|
9
|
+
|
10
|
+
Rake::TestTask.new(:test) do |t|
|
11
|
+
t.libs << "test"
|
12
|
+
t.pattern = "test/**/*_test.rb"
|
13
|
+
t.verbose = false
|
14
|
+
end
|
15
|
+
|
16
|
+
# Prepare webpack for dummy
|
17
|
+
task :prepare_assets do
|
18
|
+
system "rm -rf test/dummy/public/packs"
|
19
|
+
system "rm -rf test/dummy/public/packs-test"
|
20
|
+
system "yarn install --frozen-lockfile"
|
21
|
+
system "cd test/dummy && yarn install --frozen-lockfile"
|
22
|
+
end
|
23
|
+
|
24
|
+
# Generate dependency licenses
|
25
|
+
task :licenses do
|
26
|
+
system "bundle exec license_finder report --decisions_file reports/dependency_decisions.yml --format json --save reports/licenses.json"
|
27
|
+
end
|
28
|
+
|
29
|
+
# Custom Rails stats command
|
30
|
+
task stats: :statsetup
|
31
|
+
task :statsetup do
|
32
|
+
require "rails/code_statistics"
|
33
|
+
|
34
|
+
custom_directories = [
|
35
|
+
%w[Libraries\ tests test/lib]
|
36
|
+
]
|
37
|
+
STATS_DIRECTORIES.concat(custom_directories)
|
38
|
+
|
39
|
+
custom_test_types = %w[Libraries\ tests]
|
40
|
+
CodeStatistics::TEST_TYPES.concat(custom_test_types)
|
41
|
+
end
|
42
|
+
|
43
|
+
task default: :test
|
@@ -0,0 +1 @@
|
|
1
|
+
//= link_directory ../stylesheets/adminterface .css
|
@@ -0,0 +1,20 @@
|
|
1
|
+
@import "./vendors/bootstrap/variables";
|
2
|
+
@import "bootstrap/scss/bootstrap";
|
3
|
+
@import "bootstrap-icons/font/bootstrap-icons";
|
4
|
+
@import "flatpickr/dist/flatpickr";
|
5
|
+
@import "tom-select/dist/css/tom-select.bootstrap5";
|
6
|
+
@import "./mixins/all";
|
7
|
+
@import "./placeholders/all";
|
8
|
+
@import "./helpers/all";
|
9
|
+
@import "./vendors/all";
|
10
|
+
@import "./components/all";
|
11
|
+
|
12
|
+
// stylelint-disable no-invalid-position-at-import-rule
|
13
|
+
@media screen {
|
14
|
+
@import "./layouts/all";
|
15
|
+
}
|
16
|
+
|
17
|
+
@media print {
|
18
|
+
@import "./print";
|
19
|
+
}
|
20
|
+
// stylelint-enable no-invalid-position-at-import-rule
|
@@ -0,0 +1,56 @@
|
|
1
|
+
// Header
|
2
|
+
.navbar-toggler {
|
3
|
+
display: none;
|
4
|
+
}
|
5
|
+
|
6
|
+
// TitleBar
|
7
|
+
#title_bar {
|
8
|
+
#titlebar_right {
|
9
|
+
display: none;
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
// Main
|
14
|
+
#wrapper {
|
15
|
+
padding: 1rem 0;
|
16
|
+
}
|
17
|
+
|
18
|
+
// Table
|
19
|
+
.col-actions,
|
20
|
+
.table_tools {
|
21
|
+
display: none;
|
22
|
+
}
|
23
|
+
|
24
|
+
// Sidebars
|
25
|
+
#filters_sidebar_section {
|
26
|
+
display: none;
|
27
|
+
}
|
28
|
+
|
29
|
+
// Index
|
30
|
+
#index_footer {
|
31
|
+
.download_links,
|
32
|
+
.pagination_per_page,
|
33
|
+
.paginator {
|
34
|
+
display: none;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
// Show
|
39
|
+
#new_active_admin_comment {
|
40
|
+
display: none;
|
41
|
+
}
|
42
|
+
|
43
|
+
// Form
|
44
|
+
.formtastic {
|
45
|
+
fieldset {
|
46
|
+
&.has_many_fields {
|
47
|
+
ol li.handle,
|
48
|
+
.has-many-actions {
|
49
|
+
display: none;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
&.actions { display: none; }
|
53
|
+
|
54
|
+
.has_many_add { display: none; }
|
55
|
+
}
|
56
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
.active_admin_comment {
|
2
|
+
&.formtastic { margin-bottom: map-get($spacers, 4); }
|
3
|
+
|
4
|
+
&:not(.formtastic) {
|
5
|
+
fieldset.actions ol { flex-direction: row; }
|
6
|
+
}
|
7
|
+
}
|
8
|
+
|
9
|
+
.comments {
|
10
|
+
.paginating-footer {
|
11
|
+
display: flex;
|
12
|
+
align-items: center;
|
13
|
+
flex-direction: column;
|
14
|
+
|
15
|
+
.pagination_information { margin-bottom: $spacer; }
|
16
|
+
}
|
17
|
+
|
18
|
+
.empty { display: none; }
|
19
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
@import './active_admin_comment';
|
2
|
+
@import './aside';
|
3
|
+
@import './attributes_table';
|
4
|
+
@import './comments';
|
5
|
+
@import './divider';
|
6
|
+
@import './filters';
|
7
|
+
@import './flash';
|
8
|
+
@import './footer';
|
9
|
+
@import './form';
|
10
|
+
@import './header';
|
11
|
+
@import './index_as_grid';
|
12
|
+
@import './index_as_table';
|
13
|
+
@import './index_footer';
|
14
|
+
@import './index';
|
15
|
+
@import './inputs/all';
|
16
|
+
@import './modal_dialog';
|
17
|
+
@import './pagination';
|
18
|
+
@import './panel';
|
19
|
+
@import './sidebar';
|
20
|
+
@import './site_title';
|
21
|
+
@import './table_for';
|
22
|
+
@import './table_tools';
|
23
|
+
@import './thumbnail';
|
24
|
+
@import './title_bar';
|
@@ -0,0 +1,28 @@
|
|
1
|
+
.aside {
|
2
|
+
position: fixed;
|
3
|
+
top: 0;
|
4
|
+
right: 0;
|
5
|
+
bottom: 0;
|
6
|
+
z-index: $zindex-fixed + 1;
|
7
|
+
display: block !important;
|
8
|
+
width: 100%;
|
9
|
+
height: auto !important;
|
10
|
+
padding: 0;
|
11
|
+
|
12
|
+
@include shadow($aside-box-shadow);
|
13
|
+
@include transition(transform 0.2s linear);
|
14
|
+
|
15
|
+
&:not(.show) {
|
16
|
+
@include transform(translateX(100%));
|
17
|
+
}
|
18
|
+
|
19
|
+
@include media-breakpoint-up($aside-breakpoint) {
|
20
|
+
position: absolute;
|
21
|
+
z-index: 11;
|
22
|
+
width: $aside-width;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
body.aside-active {
|
27
|
+
overflow: hidden !important;
|
28
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
.attributes_table {
|
2
|
+
.empty { color: $text-muted; }
|
3
|
+
|
4
|
+
.table {
|
5
|
+
background: transparent;
|
6
|
+
& > tbody > tr > th { padding-left: 0; }
|
7
|
+
& > tbody > tr > td { padding-right: 0; }
|
8
|
+
|
9
|
+
& > tbody > tr:first-child {
|
10
|
+
td,
|
11
|
+
th {
|
12
|
+
border-top: 0;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
th { width: $attribute-table-key-width; }
|
17
|
+
td { text-align: left; }
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
%divider {
|
2
|
+
flex: 1;
|
3
|
+
height: 1px;
|
4
|
+
background-color: currentColor;
|
5
|
+
color: $hr-color;
|
6
|
+
opacity: $hr-opacity;
|
7
|
+
content: "";
|
8
|
+
|
9
|
+
@include transform(translateY(-50%));
|
10
|
+
}
|
11
|
+
|
12
|
+
.divider {
|
13
|
+
display: flex;
|
14
|
+
flex-direction: row;
|
15
|
+
align-items: center;
|
16
|
+
|
17
|
+
&::before {
|
18
|
+
@extend %divider;
|
19
|
+
|
20
|
+
margin-right: $spacer;
|
21
|
+
}
|
22
|
+
|
23
|
+
&::after {
|
24
|
+
@extend %divider;
|
25
|
+
|
26
|
+
margin-left: $spacer;
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#filters {
|
2
|
+
&.aside {
|
3
|
+
.sidebar_section {
|
4
|
+
display: flex;
|
5
|
+
flex-direction: column;
|
6
|
+
height: 100%;
|
7
|
+
}
|
8
|
+
|
9
|
+
.panel {
|
10
|
+
border-radius: 0;
|
11
|
+
border: 0;
|
12
|
+
}
|
13
|
+
|
14
|
+
.panel-body {
|
15
|
+
flex: 1;
|
16
|
+
overflow-y: auto;
|
17
|
+
}
|
18
|
+
|
19
|
+
.btn-close {
|
20
|
+
position: absolute;
|
21
|
+
top: 0.5rem;
|
22
|
+
right: $card-spacer-x;
|
23
|
+
z-index: 11;
|
24
|
+
color: $text-muted;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
@@ -0,0 +1,219 @@
|
|
1
|
+
%fields-with-errors {
|
2
|
+
$_color: $form-feedback-invalid-color;
|
3
|
+
$_icon: $form-feedback-icon-invalid;
|
4
|
+
$_focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($_color, $input-btn-focus-color-opacity);
|
5
|
+
|
6
|
+
.invalid-feedback,
|
7
|
+
.invalid-tooltip {
|
8
|
+
display: block;
|
9
|
+
}
|
10
|
+
|
11
|
+
.form-control {
|
12
|
+
border-color: $_color;
|
13
|
+
|
14
|
+
@if $enable-validation-icons {
|
15
|
+
padding-right: $input-height-inner;
|
16
|
+
background-image: escape-svg($_icon);
|
17
|
+
background-repeat: no-repeat;
|
18
|
+
background-position: right $input-height-inner-quarter center;
|
19
|
+
background-size: $input-height-inner-half $input-height-inner-half;
|
20
|
+
}
|
21
|
+
|
22
|
+
&:focus {
|
23
|
+
border-color: $_color;
|
24
|
+
box-shadow: $_focus-box-shadow;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
.form-control-color { max-width: 4.5rem; }
|
29
|
+
|
30
|
+
trix-editor.form-control,
|
31
|
+
textarea.form-control {
|
32
|
+
@if $enable-validation-icons {
|
33
|
+
padding-right: $input-height-inner;
|
34
|
+
background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
.form-select:not(.ts-dropdown) {
|
39
|
+
border-color: $_color;
|
40
|
+
|
41
|
+
@if $enable-validation-icons {
|
42
|
+
&:not([multiple]):not([size]),
|
43
|
+
&:not([multiple])[size="1"] {
|
44
|
+
padding-right: $form-select-feedback-icon-padding-end;
|
45
|
+
background-image: escape-svg($form-select-indicator), escape-svg($_icon);
|
46
|
+
background-position: $form-select-bg-position, $form-select-feedback-icon-position;
|
47
|
+
background-size: $form-select-bg-size, $form-select-feedback-icon-size;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
&:focus {
|
52
|
+
border-color: $_color;
|
53
|
+
box-shadow: $_focus-box-shadow;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
.form-check {
|
58
|
+
.form-check-input {
|
59
|
+
border-color: $_color;
|
60
|
+
|
61
|
+
&:checked { background-color: $_color; }
|
62
|
+
&:focus { box-shadow: $_focus-box-shadow; }
|
63
|
+
}
|
64
|
+
|
65
|
+
.form-check-label { color: $_color; }
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
%feedback-hint {
|
70
|
+
width: 100%;
|
71
|
+
margin-top: $form-feedback-margin-top;
|
72
|
+
font-style: $form-feedback-font-style;
|
73
|
+
color: $secondary;
|
74
|
+
|
75
|
+
@include font-size($form-feedback-font-size);
|
76
|
+
}
|
77
|
+
|
78
|
+
%fragements {
|
79
|
+
legend { margin-bottom: 0; }
|
80
|
+
legend.label { font-size: $font-size-base; }
|
81
|
+
|
82
|
+
.fragments-group {
|
83
|
+
display: flex;
|
84
|
+
flex-direction: row;
|
85
|
+
padding: 0;
|
86
|
+
margin: 0 calc(-#{$spacer} / 4) !important;
|
87
|
+
list-style: none;
|
88
|
+
|
89
|
+
.fragment {
|
90
|
+
flex: 1;
|
91
|
+
padding: 0 calc(#{$spacer} / 4);
|
92
|
+
margin-bottom: $spacer;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
.formtastic {
|
98
|
+
.errors { margin-bottom: 0; }
|
99
|
+
.hidden { display: none; }
|
100
|
+
.input.error { @extend %fields-with-errors; }
|
101
|
+
.fragments { @extend %fragements; }
|
102
|
+
.inline-hints { @extend %feedback-hint; }
|
103
|
+
|
104
|
+
li.has-many-inputs,
|
105
|
+
fieldset.inputs,
|
106
|
+
fieldset.actions {
|
107
|
+
& > ol {
|
108
|
+
padding: 0;
|
109
|
+
margin: 0;
|
110
|
+
list-style: none;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
fieldset.actions {
|
115
|
+
ol {
|
116
|
+
display: flex;
|
117
|
+
align-items: flex-end;
|
118
|
+
-webkit-box-orient: horizontal;
|
119
|
+
-webkit-box-align: end;
|
120
|
+
-webkit-box-direction: reverse;
|
121
|
+
flex-direction: row-reverse;
|
122
|
+
}
|
123
|
+
|
124
|
+
li {
|
125
|
+
display: inline-block;
|
126
|
+
margin-right: map-get($spacers, 2);
|
127
|
+
&:first-child { margin: 0; }
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
fieldset.columns > ol {
|
132
|
+
display: flex;
|
133
|
+
flex-direction: row;
|
134
|
+
flex-wrap: wrap;
|
135
|
+
padding: 0;
|
136
|
+
}
|
137
|
+
|
138
|
+
fieldset.has_many_fields {
|
139
|
+
&.sortable-placeholder {
|
140
|
+
z-index: 11;
|
141
|
+
background: $form-sortable-placeholder-bg;
|
142
|
+
visibility: visible;
|
143
|
+
box-sizing: border-box;
|
144
|
+
|
145
|
+
&[draggable="true"] {
|
146
|
+
max-height: $form-sortable-placeholder-max-height;
|
147
|
+
overflow: hidden;
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
&.sortable-drag {
|
152
|
+
background: $form-sortable-drag-bg;
|
153
|
+
box-sizing: border-box;
|
154
|
+
|
155
|
+
&[draggable="true"] {
|
156
|
+
max-height: $form-sortable-drag-max-height;
|
157
|
+
overflow: hidden;
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
& > ol {
|
162
|
+
display: flex;
|
163
|
+
flex-direction: row;
|
164
|
+
|
165
|
+
li {
|
166
|
+
&.handle {
|
167
|
+
display: flex;
|
168
|
+
color: $text-muted;
|
169
|
+
cursor: move;
|
170
|
+
align-items: flex-start;
|
171
|
+
padding: 0;
|
172
|
+
padding-right: $spacer;
|
173
|
+
|
174
|
+
&::before {
|
175
|
+
@extend %aa-icon;
|
176
|
+
|
177
|
+
content: map-get($aa-icons, 'form-has-many-sortable-handle');
|
178
|
+
}
|
179
|
+
}
|
180
|
+
|
181
|
+
&.has-many-inputs {
|
182
|
+
display: flex;
|
183
|
+
flex: 1;
|
184
|
+
flex-direction: row;
|
185
|
+
padding: 0;
|
186
|
+
> ol:first-child { flex: 1; }
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
190
|
+
.has_many_delete {
|
191
|
+
input[type='checkbox']:checked + label { color: $danger; }
|
192
|
+
|
193
|
+
label.form-check-label {
|
194
|
+
span,
|
195
|
+
i {
|
196
|
+
display: none;
|
197
|
+
}
|
198
|
+
}
|
199
|
+
}
|
200
|
+
|
201
|
+
.has_many_remove {
|
202
|
+
padding-left: $spacer;
|
203
|
+
font-size: 0;
|
204
|
+
text-decoration: none;
|
205
|
+
|
206
|
+
&::before {
|
207
|
+
@extend %aa-icon;
|
208
|
+
|
209
|
+
content: map-get($aa-icons, 'form-has-many-destroy');
|
210
|
+
}
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
.columns { margin: 0 calc(-#{$grid-gutter-width} / 2); }
|
215
|
+
.has_many_delete { margin-bottom: 0; }
|
216
|
+
}
|
217
|
+
|
218
|
+
.choices-group { @extend %list-unstyled; }
|
219
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#header {
|
2
|
+
#main-nav { margin-right: auto; }
|
3
|
+
.dropdown-item a { color: inherit; }
|
4
|
+
|
5
|
+
.navbar-nav {
|
6
|
+
@include media-breakpoint-up($sidebar-breakpoint) {
|
7
|
+
align-items: center;
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
.nav-item {
|
12
|
+
.nav-link {
|
13
|
+
@extend %text-truncate;
|
14
|
+
|
15
|
+
width: 100%;
|
16
|
+
|
17
|
+
& > * {
|
18
|
+
display: inline-block;
|
19
|
+
vertical-align: middle;
|
20
|
+
}
|
21
|
+
|
22
|
+
i.aa-icon {
|
23
|
+
margin-right: map-get($spacers, 1);
|
24
|
+
font-size: $header-icon-size;
|
25
|
+
width: $header-icon-size;
|
26
|
+
height: $header-icon-size;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
.index_content .index > * { width: 100%; }
|
@@ -0,0 +1 @@
|
|
1
|
+
.index_as_table table.index_table { margin-bottom: 0; }
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#index_footer {
|
2
|
+
margin-top: $spacer;
|
3
|
+
text-align: center;
|
4
|
+
|
5
|
+
.pagination_per_page {
|
6
|
+
display: inline-block;
|
7
|
+
& + .paginator { margin-top: $spacer; }
|
8
|
+
}
|
9
|
+
|
10
|
+
.paginator {
|
11
|
+
& + .pagination_information { margin-top: $spacer; }
|
12
|
+
|
13
|
+
ul {
|
14
|
+
display: flex;
|
15
|
+
justify-content: center;
|
16
|
+
margin: 0 auto;
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|