rails_admin 0.6.8 → 0.7.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.

Potentially problematic release.


This version of rails_admin might be problematic. Click here for more details.

Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +17 -37
  3. data/README.md +1 -1
  4. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +20 -5
  5. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +13 -10
  6. data/app/assets/javascripts/rails_admin/ra.i18n.coffee +1 -1
  7. data/app/assets/javascripts/rails_admin/ra.remote-form.js +2 -2
  8. data/app/assets/javascripts/rails_admin/ra.widgets.coffee +1 -1
  9. data/app/assets/javascripts/rails_admin/ui.coffee +8 -0
  10. data/app/assets/stylesheets/rails_admin/base/theming.scss +37 -7
  11. data/app/assets/stylesheets/rails_admin/ra.widgets.scss +3 -2
  12. data/app/assets/stylesheets/rails_admin/themes/cerulean/theming.scss +95 -59
  13. data/app/assets/stylesheets/rails_admin/themes/cerulean/variables.scss +809 -120
  14. data/app/helpers/rails_admin/application_helper.rb +7 -2
  15. data/app/helpers/rails_admin/main_helper.rb +4 -2
  16. data/app/views/layouts/rails_admin/_navigation.html.haml +6 -1
  17. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +1 -3
  18. data/app/views/rails_admin/main/_form_file_upload.html.haml +6 -2
  19. data/app/views/rails_admin/main/index.html.haml +2 -0
  20. data/config/locales/rails_admin.en.yml +3 -0
  21. data/lib/rails_admin/config.rb +4 -0
  22. data/lib/rails_admin/config/fields/association.rb +1 -1
  23. data/lib/rails_admin/config/fields/base.rb +3 -1
  24. data/lib/rails_admin/config/fields/factories/enum.rb +4 -0
  25. data/lib/rails_admin/config/fields/types/active_record_enum.rb +41 -0
  26. data/lib/rails_admin/config/fields/types/all.rb +1 -0
  27. data/lib/rails_admin/config/fields/types/file_upload.rb +8 -1
  28. data/lib/rails_admin/config/fields/types/serialized.rb +1 -1
  29. data/lib/rails_admin/config/fields/types/string.rb +6 -1
  30. data/lib/rails_admin/config/fields/types/text.rb +1 -0
  31. data/lib/rails_admin/engine.rb +1 -4
  32. data/lib/rails_admin/version.rb +2 -2
  33. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0409337248747730f7ea1bfeecd3c8a87970b95
4
- data.tar.gz: a9a8e2ec8886981cdde444441df74ceaa5099e85
3
+ metadata.gz: 531cf0017e10c6ec70071cc36bf6f26bb022eb0a
4
+ data.tar.gz: 1660b6774fadf54a24b9d67a534305630727ccb1
5
5
  SHA512:
6
- metadata.gz: 65f95de98ec19d04476bf20a64c6d930c35d76e99c5499a939bb78e2207d277effb01807f63d2e6cffa301c0a79ef6f9ddd5cfc48a18f4fbe8f0470ed69c88f4
7
- data.tar.gz: ce24bd3ce10b5952c29ba58e0c25284bddb54abd0493328298750aa29c20c1ad878be3d2797ef2d462411b422c83e4f39cb1fb8876543540e26031367a803a96
6
+ metadata.gz: f2ca04cae79c6bfcdaab54dfadcbaa72b36bdc715ac37d15bbaa52d9ff383b27f7d514fd76537e466ebb6dd76ef1b5805c53dc73ade5abb6af717e1164e6a3a7
7
+ data.tar.gz: 39da0448e0b86dde4a980fa8444ec09007d9e095285d89a2329eb8c79bc03a2ec56dbed0c9c8da2503e50ba3391f36c4687f7995ce3a3c02b67f985f5d080674
data/Gemfile CHANGED
@@ -1,48 +1,28 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- case ENV['RAILS_VERSION']
4
- when '4.0'
5
- gem 'rails', '~> 4.0.0'
6
- gem 'devise', '>= 3.2'
7
- gem 'test-unit'
8
- when '4.1'
9
- gem 'rails', '~> 4.1.0'
10
- gem 'devise', '>= 3.2'
11
- else
12
- gem 'rails', '~> 4.2.0'
13
- gem 'sass-rails', '~> 5.0'
14
- gem 'devise', '>= 3.4'
15
- end
3
+ gem 'appraisal', '>= 2.0'
4
+ gem 'devise'
16
5
 
17
- case ENV['CI_ORM']
18
- when 'mongoid'
19
- gem 'mongoid', '~> 4.0.0.beta1'
6
+ group :mongoid do
7
+ gem 'mongoid', '~> 4.0.0'
20
8
  gem 'mongoid-paperclip', '>= 0.0.8', require: 'mongoid_paperclip'
21
9
  gem 'carrierwave-mongoid', '>= 0.6.3', require: 'carrierwave/mongoid'
22
- else
10
+ end
11
+
12
+ group :active_record do
23
13
  platforms :jruby do
24
- case ENV['CI_DB_ADAPTER']
25
- when 'mysql'
26
- gem 'activerecord-jdbcmysql-adapter', '>= 1.2'
27
- gem 'jdbc-mysql', '>= 5.1'
28
- when 'postgresql'
29
- gem 'activerecord-jdbcpostgresql-adapter', '>= 1.2'
30
- gem 'jdbc-postgres', '>= 9.2'
31
- else
32
- gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta1'
33
- gem 'jdbc-sqlite3', '>= 3.7'
34
- end
14
+ gem 'activerecord-jdbcmysql-adapter', '>= 1.2'
15
+ gem 'jdbc-mysql', '>= 5.1'
16
+ gem 'activerecord-jdbcpostgresql-adapter', '>= 1.2'
17
+ gem 'jdbc-postgres', '>= 9.2'
18
+ gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta1'
19
+ gem 'jdbc-sqlite3', '>= 3.7'
35
20
  end
36
21
 
37
22
  platforms :ruby, :mswin, :mingw do
38
- case ENV['CI_DB_ADAPTER']
39
- when 'mysql2'
40
- gem 'mysql2', '~> 0.3.14'
41
- when 'postgresql'
42
- gem 'pg', '>= 0.14'
43
- else
44
- gem 'sqlite3', '>= 1.3'
45
- end
23
+ gem 'mysql2', '~> 0.3.14'
24
+ gem 'pg', '>= 0.14'
25
+ gem 'sqlite3', '>= 1.3'
46
26
  end
47
27
 
48
28
  gem 'paper_trail', '~> 3.0'
@@ -64,7 +44,7 @@ group :test do
64
44
  gem 'generator_spec', '>= 0.8'
65
45
  gem 'launchy', '>= 2.2'
66
46
  gem 'mini_magick', '>= 3.4'
67
- gem 'paperclip', '>= 3.4'
47
+ gem 'paperclip', ['>= 3.4', '!= 4.3.0']
68
48
  gem 'poltergeist', '~> 1.5'
69
49
  gem 'rack-cache', require: 'rack/cache'
70
50
  gem 'rspec-rails', '>= 2.14'
data/README.md CHANGED
@@ -60,7 +60,7 @@ class Ball < ActiveRecord::Base
60
60
  end
61
61
  ```
62
62
 
63
- [Details](https://github.com/sferik/rails_admin/wiki/Railsadmin-DSL)
63
+ Details: [Models](https://github.com/sferik/rails_admin/wiki/Models), [Groups](https://github.com/sferik/rails_admin/wiki/Groups), [Fields](https://github.com/sferik/rails_admin/wiki/Fields)
64
64
 
65
65
  ## Documentation
66
66
  https://github.com/sferik/rails_admin/wiki
@@ -24,8 +24,7 @@
24
24
  chooseAll: "Choose all",
25
25
  chosen: "Chosen records",
26
26
  clearAll: "Clear all",
27
- remove: "Remove",
28
- selectChoice: "Select your choice(s) and click"
27
+ remove: "Remove"
29
28
  },
30
29
  searchDelay: 400,
31
30
  remote_source: null,
@@ -101,6 +100,13 @@
101
100
  this.selection.wrap('<div class="wrapper"/>');
102
101
 
103
102
  this.element.css({display: "none"});
103
+
104
+ this.tooManyObjectsPlaceholder = $('<option disabled="disabled" />').text(RailsAdmin.I18n.t("too_many_objects"));
105
+ this.noObjectsPlaceholder = $('<option disabled="disabled" />').text(RailsAdmin.I18n.t("no_objects"))
106
+
107
+ if(this.options.xhr){
108
+ this.collection.append(this.tooManyObjectsPlaceholder);
109
+ }
104
110
  },
105
111
 
106
112
  _bindEvents: function() {
@@ -164,13 +170,21 @@
164
170
  var widget = this;
165
171
  widget._query(val, function(matches) {
166
172
  var i;
167
- widget.collection.html('');
173
+ var filtered = [];
168
174
  for (i in matches) {
169
175
  if (matches.hasOwnProperty(i) && !widget.selected(matches[i].id)) {
176
+ filtered.push(i);
177
+ }
178
+ }
179
+ if (filtered.length > 0) {
180
+ widget.collection.html('');
181
+ for (i in filtered) {
170
182
  widget.collection.append(
171
183
  $('<option></option>').attr('value', matches[i].id).attr('title', matches[i].label).text(matches[i].label)
172
184
  );
173
185
  }
186
+ } else {
187
+ widget.collection.html(widget.noObjectsPlaceholder);
174
188
  }
175
189
  });
176
190
  },
@@ -209,10 +223,11 @@
209
223
  matches.push({id: i, label: this._cache[i]});
210
224
  }
211
225
  }
226
+ success.apply(this, [matches]);
227
+ } else {
228
+ this.collection.html(this.tooManyObjectsPlaceholder);
212
229
  }
213
230
 
214
- success.apply(this, [matches]);
215
-
216
231
  } else {
217
232
 
218
233
  if (this.options.xhr) {
@@ -39,7 +39,7 @@
39
39
  return { label: $(this).text(), value: this.value };
40
40
  }).toArray();
41
41
  }
42
- var filtering_select = $('<div class="input-append filtering-select" style="float:left"></div>')
42
+ var filtering_select = $('<div class="input-group filtering-select col-sm-2" style="float:left"></div>')
43
43
  var input = this.input = $('<input type="text">')
44
44
  .val(value)
45
45
  .addClass("form-control ra-filtering-select-input")
@@ -94,12 +94,11 @@
94
94
  input.data("ui-autocomplete")._renderItem = function(ul, item) {
95
95
  return $("<li></li>")
96
96
  .data("ui-autocomplete-item", item)
97
- .append( $( "<a></a>" ).html( item.label || item.id ) )
97
+ .append( $( "<a></a>" ).html( item.html || item.id ) )
98
98
  .appendTo(ul);
99
99
  };
100
100
 
101
- // replace with dropdown button once ready in twitter-bootstrap
102
- var button = this.button = $('<label class="add-on ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" title="Show All Items" role="button"><span class="ui-button-icon-primary ui-icon ui-icon-triangle-1-s"></span><span class="ui-button-text">&nbsp;</span></label>')
101
+ var button = this.button = $('<span class="input-group-btn"><label class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false" title="Show All Items" role="button"><span class="caret"></span><span class="ui-button-text">&nbsp;</span></label></span>')
103
102
  .click(function() {
104
103
  // close if already visible
105
104
  if (input.autocomplete("widget").is(":visible")) {
@@ -119,17 +118,21 @@
119
118
 
120
119
  _getResultSet: function(request, data, xhr) {
121
120
  var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
121
+ var highlighter = function(label, word){
122
+ if(word.length > 0){
123
+ return $.map(label.split(word), function(el, i){
124
+ return $('<span></span>').text(el).html();
125
+ }).join($('<strong></strong>').text(word)[0].outerHTML);
126
+ }else{
127
+ return $('<span></span>').text(label).html();
128
+ }
129
+ };
122
130
 
123
131
  return $.map(data, function(el, i) {
124
132
  // match regexp only for local requests, remote ones are already filtered, and label may not contain filtered term.
125
133
  if ((el.id || el.value) && (xhr || matcher.test(el.label))) {
126
134
  return {
127
- label: el.label ? el.label.replace(
128
- new RegExp(
129
- "(?![^&;]+;)(?!<[^<>]*)(" +
130
- $.ui.autocomplete.escapeRegex(request.term) +
131
- ")(?![^<>]*>)(?![^&;]+;)", "gi"
132
- ), "<strong>$1</strong>") : el.id,
135
+ html: highlighter(el.label || el.id, request.term),
133
136
  value: el.label || el.id,
134
137
  id: el.id || el.value
135
138
  };
@@ -2,5 +2,5 @@ class @RailsAdmin
2
2
  @RailsAdmin.I18n = class Locale
3
3
  @init: (@locale)->
4
4
  @t:(key) ->
5
- humanize = key.charAt(0).toUpperCase() + key.replace("_", " ").slice(1)
5
+ humanize = key.charAt(0).toUpperCase() + key.replace(/_/g, " ").slice(1)
6
6
  @locale[key] || humanize
@@ -19,7 +19,7 @@
19
19
 
20
20
  var edit_url = dom_widget.find('select').first().data('options') && dom_widget.find('select').first().data('options')['edit-url'];
21
21
  if(typeof(edit_url) != 'undefined' && edit_url.length) {
22
- dom_widget.on('dblclick', '.ra-multiselect option', function(e){
22
+ dom_widget.on('dblclick', '.ra-multiselect option:not(:disabled)', function(e){
23
23
  widget._bindModalOpening(e, edit_url.replace('__ID__', this.value))
24
24
  });
25
25
  }
@@ -109,7 +109,7 @@
109
109
  select.find('option[value=' + json.id + ']').text(json.label);
110
110
  multiselect.find('option[value= ' + json.id + ']').text(json.label);
111
111
  } else { // add
112
- select.prepend(option);
112
+ select.append(option);
113
113
  multiselect.find('select.ra-multiselect-selection').append(option);
114
114
  }
115
115
  }
@@ -46,7 +46,7 @@ $(document).on 'rails_admin.dom_ready', (e, content) ->
46
46
  input = this
47
47
  image_container = $("#" + input.id).parent().children(".preview")
48
48
  unless image_container.length
49
- image_container = $("#" + input.id).parent().prepend($('<img />').addClass('preview')).find('img.preview')
49
+ image_container = $("#" + input.id).parent().prepend($('<img />').addClass('preview').addClass('img-thumbnail')).find('img.preview')
50
50
  image_container.parent().find('img:not(.preview)').hide()
51
51
  ext = $("#" + input.id).val().split('.').pop().toLowerCase()
52
52
  if input.files and input.files[0] and $.inArray(ext, ['gif','png','jpg','jpeg','bmp']) != -1
@@ -92,3 +92,11 @@ $(document).on 'pjax:popstate', () ->
92
92
  return
93
93
  return
94
94
  return
95
+
96
+ #Remove all filter and then refresh
97
+ $(document).on 'click', "#remove_filter",(event) ->
98
+ event.preventDefault()
99
+ $("#filters_box").html("")
100
+ $("hr.filters_box").hide()
101
+ $(this).parent().siblings("input[type='search']").val("")
102
+ $(this).parents("form").submit()
@@ -3,6 +3,8 @@
3
3
  Keep it clean, people
4
4
  */
5
5
 
6
+ $avatar-size: 30px;
7
+
6
8
  body.rails_admin {
7
9
 
8
10
  .thumbnail {
@@ -12,12 +14,18 @@ body.rails_admin {
12
14
  /* room for upper navbar */
13
15
  padding-top: $navbar-height;
14
16
 
15
- /* Application name */
16
- .navbar .brand {
17
- small {
18
- color:#9d261d;
19
- font-weight:bold;
20
- line-height: 1;
17
+ .navbar {
18
+ .edit_user_root_link {
19
+ position: relative;
20
+
21
+ img {
22
+ position: absolute;
23
+ top: ((40px - $avatar-size) / 2);
24
+
25
+ & + span {
26
+ margin-left: ($avatar-size + 5px);
27
+ }
28
+ }
21
29
  }
22
30
  }
23
31
 
@@ -62,6 +70,18 @@ body.rails_admin {
62
70
  display:none;
63
71
  }
64
72
 
73
+ .control-group {
74
+ .img-thumbnail {
75
+ margin-bottom: 10px;
76
+ }
77
+
78
+ .btn-remove-image {
79
+ &.btn-info {
80
+ margin-top: 10px;
81
+ }
82
+ }
83
+ }
84
+
65
85
  legend {
66
86
  cursor:pointer;
67
87
  i {
@@ -114,6 +134,8 @@ body.rails_admin {
114
134
 
115
135
  /* nested forms */
116
136
  .tab-content {
137
+ clear: both;
138
+
117
139
  .tab-pane {
118
140
  @include clearfix;
119
141
  border-left: 5px solid #049cdb;
@@ -300,8 +322,16 @@ body.rails_admin {
300
322
  }
301
323
  }
302
324
 
303
- @media screen and (min-width: $screen-sm-min) {
325
+ @media screen and (min-width: $grid-float-breakpoint) {
304
326
  body.rails_admin {
327
+ .navbar {
328
+ .edit_user_root_link {
329
+ img {
330
+ top: (($navbar-height - $avatar-size) / 2);
331
+ }
332
+ }
333
+ }
334
+
305
335
  .sidebar-nav {
306
336
  position: fixed;
307
337
  top: $navbar-height;
@@ -2,7 +2,8 @@ iframe.wysihtml5-sandbox{
2
2
  height: 250px !important;
3
3
  width: 75% !important;
4
4
  }
5
+
5
6
  .controls img.preview{
6
- max-height: 100px;
7
- max-width: 100px;
7
+ max-height: 200px;
8
+ max-width: 300px;
8
9
  }
@@ -1,97 +1,133 @@
1
- // Bootswatch.less
2
- // Swatch: Cerulean
3
- // Version: 2.0.2
4
- // -----------------------------------------------------
5
-
6
- // TYPOGRAPHY
7
- // -----------------------------------------------------
1
+ // Cerulean 3.3.1
2
+ // Bootswatch
3
+ // .rails_admin .sidebar-nav added to prevent same link color
4
+ // ------------------------------------------------------------------
5
+
6
+ @mixin btn-shadow($color){
7
+ @include gradient-vertical-three-colors(lighten($color, 8%), $color, 60%, darken($color, 4%));
8
+ filter: none;
9
+ border-bottom: 1px solid darken($color, 10%);
10
+ }
8
11
 
9
- @import url(https://fonts.googleapis.com/css?family=Telex);
12
+ // Navbar =====================================================================
10
13
 
11
- .navbar, .subnav {
12
- font-family: $headingsFontFamily;
14
+ .navbar {
15
+ @include btn-shadow($navbar-default-bg);
16
+ filter: none;
17
+ @include box-shadow(0 1px 10px rgba(0, 0, 0, 0.1));
13
18
  }
14
19
 
15
- // NAVBAR
16
- // -----------------------------------------------------
20
+ .navbar.navbar-default .badge {
21
+ background-color: #fff;
22
+ color: $navbar-default-bg;
23
+ }
17
24
 
18
- .navbar-inner {
19
- @include gradient-vertical-three-colors($navbarBackground, $navbarBackground, 0.9, $navbarBackgroundHighlight);
20
- }
25
+ .navbar.navbar-inverse , .rails_admin .sidebar-nav {
26
+ @include gradient-vertical-three-colors(lighten($navbar-inverse-bg, 8%), lighten($navbar-inverse-bg, 4%), 60%, darken($navbar-inverse-bg, 2%));
27
+ filter: none;
28
+ border-bottom: 1px solid darken($navbar-inverse-bg, 10%);
29
+ }
21
30
 
22
- .navbar .nav .active > a,
23
- .navbar .nav .active > a:hover {
24
- background-color: $navbarBackground;
25
- background-color: rgba(0,0,0,.2);
26
- }
27
31
 
28
- .navbar .search-query {
29
- border: 1px solid darken($linkColor, 10%);
32
+ .navbar.navbar-inverse .badge {
33
+ background-color: #fff;
34
+ color: $navbar-inverse-bg;
30
35
  }
31
36
 
32
- // responsive menu colors
37
+ .navbar .navbar-nav > li > a,
38
+ .navbar .navbar-brand {
39
+ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
40
+ }
33
41
 
34
- .navbar .nav-collapse.in > .nav > li .dropdown-menu a {
35
- color: $white;
36
42
 
37
- &:hover {
38
- color: $white;
39
- }
40
- }
43
+ @media (max-width: $grid-float-breakpoint-max) {
41
44
 
42
- .navbar .nav-collapse.in .nav li > a {
43
- color: $white;
45
+ .navbar {
44
46
 
45
- &:hover {
46
- background-color: #2B7CAC;
47
- }
47
+ .dropdown-header {
48
+ color: #fff;
49
+ }
50
+ }
48
51
  }
49
52
 
50
- .btn-navbar:hover {
51
- background-color: darken($white, 20%);
53
+ // Buttons ====================================================================
54
+
55
+ .btn {
56
+
57
+ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
58
+
59
+ .caret {
60
+ border-top-color: #fff;
61
+ }
52
62
  }
53
63
 
54
- // BUTTONS
55
- // -----------------------------------------------------
64
+ .btn-default {
65
+
66
+ @include btn-shadow($btn-default-bg);
56
67
 
57
- .btn {
58
- @include gradient-vertical-three-colors($white, $white, 0.05, darken($white, 0%));
59
- $shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
60
- @include box-shadow($shadow);
61
-
62
68
  &:hover {
63
- background-position: 0 0;
69
+ color: $btn-default-color;
70
+ }
71
+
72
+ .caret {
73
+ border-top-color: $text-color;
64
74
  }
65
75
  }
66
76
 
67
- .btn-primary {
68
- @include buttonBackground(lighten($btnPrimaryBackground, 5%), $btnPrimaryBackground);
77
+ .btn-default {
78
+ @include btn-shadow($btn-default-bg);
69
79
  }
70
80
 
71
- .btn-info {
72
- @include buttonBackground(lighten($btnInfoBackground, 5%), $btnInfoBackground);
81
+ .btn-primary {
82
+ @include btn-shadow($btn-primary-bg);
73
83
  }
74
84
 
75
85
  .btn-success {
76
- @include buttonBackground(lighten($btnSuccessBackground, 5%), $btnSuccessBackground);
86
+ @include btn-shadow($btn-success-bg);
87
+ }
88
+
89
+ .btn-info {
90
+ @include btn-shadow($btn-info-bg);
77
91
  }
78
92
 
79
93
  .btn-warning {
80
- @include buttonBackground(lighten($btnWarningBackground, 5%), $btnWarningBackground);
94
+ @include btn-shadow($btn-warning-bg);
81
95
  }
82
96
 
83
97
  .btn-danger {
84
- @include buttonBackground(lighten($btnDangerBackground, 5%), $btnDangerBackground);
98
+ @include btn-shadow($btn-danger-bg);
85
99
  }
86
100
 
87
- .btn-inverse {
88
- @include buttonBackground(lighten($btnInverseBackground, 5%), $btnInverseBackground);
101
+ // Typography =================================================================
102
+
103
+ // Tables =====================================================================
104
+ table,
105
+ .table {
106
+ > thead > tr > th {
107
+
108
+ color: $headings-color;
109
+ }
110
+
89
111
  }
90
112
 
91
- // ICONS
92
- // -----------------------------------------------------
113
+ // Forms ======================================================================
114
+
115
+ // Navs =======================================================================
116
+
117
+ // Indicators =================================================================
118
+
119
+ // Progress bars ==============================================================
93
120
 
94
- // Make icons gray
95
- i[class^="icon-"]{
96
- opacity: 0.8;
97
- }
121
+ // Containers =================================================================
122
+
123
+ .panel-primary,
124
+ .panel-success,
125
+ .panel-warning,
126
+ .panel-danger,
127
+ .panel-info {
128
+
129
+ .panel-heading,
130
+ .panel-title {
131
+ color: #fff;
132
+ }
133
+ }