locomotive_cms 2.4.1 → 2.5.0.rc1

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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/README.textile +3 -3
  4. data/app/assets/images/locomotive/icons/flags/sk.png +0 -0
  5. data/app/assets/javascripts/aloha/plugins/custom/locomotive_media/lib/locomotive_media-plugin.js +1 -1
  6. data/app/assets/javascripts/locomotive/models/content_asset.js.coffee +7 -1
  7. data/app/assets/javascripts/locomotive/utils/aloha_settings.js.coffee +1 -1
  8. data/app/assets/javascripts/locomotive/utils/core_ext.js +1 -1
  9. data/app/assets/javascripts/locomotive/views/content_assets/picker_item_view.js.coffee +12 -0
  10. data/app/assets/javascripts/locomotive/views/content_assets/picker_view.js.coffee +149 -15
  11. data/app/assets/javascripts/locomotive/views/shared/asset_picker_view.js.coffee +16 -4
  12. data/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee +1 -1
  13. data/app/assets/javascripts/locomotive/views/shared/list_item_view.js.coffee +1 -1
  14. data/app/assets/javascripts/tinymce/plugins/locomotive_media/editor_plugin.js +1 -1
  15. data/app/assets/stylesheets/locomotive/backoffice/_buttons.css.scss +56 -0
  16. data/app/assets/stylesheets/locomotive/backoffice/application.css.scss +6 -0
  17. data/app/assets/stylesheets/locomotive/backoffice/content_assets.css.scss +74 -4
  18. data/app/assets/stylesheets/locomotive/backoffice/dialog_changes.css.scss +4 -0
  19. data/app/assets/stylesheets/locomotive/shared/common.css.scss +7 -0
  20. data/app/controllers/locomotive/api/documentation_controller.rb +8 -2
  21. data/app/controllers/locomotive/api/pages_controller.rb +1 -1
  22. data/app/controllers/locomotive/content_assets_controller.rb +4 -0
  23. data/app/models/locomotive/content_asset.rb +5 -1
  24. data/app/models/locomotive/content_entry.rb +7 -2
  25. data/app/models/locomotive/content_type.rb +1 -1
  26. data/app/models/locomotive/editable_element.rb +1 -0
  27. data/app/models/locomotive/extensions/asset/types.rb +9 -4
  28. data/app/models/locomotive/extensions/asset/vignette.rb +2 -0
  29. data/app/models/locomotive/extensions/content_entry/csv.rb +2 -2
  30. data/app/models/locomotive/extensions/content_entry/localized.rb +18 -0
  31. data/app/models/locomotive/page.rb +2 -2
  32. data/app/models/locomotive/snippet.rb +8 -7
  33. data/app/models/locomotive/theme_asset.rb +12 -6
  34. data/app/models/locomotive/translation.rb +1 -1
  35. data/app/views/locomotive/content_assets/_picker.html.haml +23 -2
  36. data/app/views/locomotive/pages/_page.html.haml +2 -0
  37. data/app/views/locomotive/shared/_header.html.haml +3 -1
  38. data/app/views/locomotive/shared/_main_app_header.html.haml +1 -0
  39. data/app/views/locomotive/translations/index.html.haml +1 -1
  40. data/config/locales/admin_ui.bg.yml +1 -0
  41. data/config/locales/admin_ui.cs.yml +1 -0
  42. data/config/locales/admin_ui.de.yml +1 -0
  43. data/config/locales/admin_ui.en.yml +7 -0
  44. data/config/locales/admin_ui.es.yml +1 -0
  45. data/config/locales/admin_ui.et.yml +1 -0
  46. data/config/locales/admin_ui.fr.yml +12 -2
  47. data/config/locales/admin_ui.it.yml +1 -0
  48. data/config/locales/admin_ui.ja.yml +1 -0
  49. data/config/locales/admin_ui.nb.yml +1 -0
  50. data/config/locales/admin_ui.nl.yml +1 -0
  51. data/config/locales/admin_ui.pl.yml +1 -0
  52. data/config/locales/admin_ui.pt-BR.yml +1 -0
  53. data/config/locales/admin_ui.ru.yml +8 -4
  54. data/config/locales/admin_ui.sk.yml +360 -0
  55. data/config/locales/admin_ui.zh-CN.yml +1 -0
  56. data/config/locales/carrierwave.sk.yml +4 -0
  57. data/config/locales/default.fr.yml +3 -0
  58. data/config/locales/default.ru.yml +18 -7
  59. data/config/locales/default.sk.yml +249 -0
  60. data/config/locales/devise.sk.yml +64 -0
  61. data/config/locales/flash.sk.yml +115 -0
  62. data/config/locales/formtastic.fr.yml +7 -1
  63. data/config/locales/formtastic.sk.yml +125 -0
  64. data/config/routes.rb +2 -0
  65. data/lib/generators/locomotive/install/install_generator.rb +6 -0
  66. data/lib/generators/locomotive/install/templates/dragonfly.rb +16 -13
  67. data/lib/generators/locomotive/install/templates/locomotive.rb +7 -2
  68. data/lib/locomotive.rb +3 -15
  69. data/lib/locomotive/action_controller/responder.rb +8 -1
  70. data/lib/locomotive/carrierwave/asset.rb +0 -4
  71. data/lib/locomotive/configuration.rb +4 -3
  72. data/lib/locomotive/dragonfly.rb +20 -5
  73. data/lib/locomotive/liquid/drops/content_entry.rb +1 -1
  74. data/lib/locomotive/liquid/filters/base.rb +4 -0
  75. data/lib/locomotive/liquid/filters/translate.rb +4 -0
  76. data/lib/locomotive/liquid/tags/path_helper.rb +5 -2
  77. data/lib/locomotive/middlewares.rb +2 -1
  78. data/lib/locomotive/misc/api_documentation.rb +3 -1
  79. data/lib/locomotive/render.rb +7 -6
  80. data/lib/locomotive/version.rb +1 -1
  81. data/lib/tasks/development.rake +21 -0
  82. data/spec/dummy/config/initializers/dragonfly.rb +16 -13
  83. data/spec/dummy/config/initializers/locomotive.rb +9 -5
  84. data/spec/fixtures/assets/specs.pdf +0 -0
  85. data/spec/lib/locomotive/liquid/filters/html_spec.rb +22 -13
  86. data/spec/models/locomotive/content_asset_spec.rb +9 -0
  87. data/spec/models/locomotive/content_entry_spec.rb +57 -6
  88. data/spec/models/locomotive/extensions/content_entry/csv_spec.rb +30 -0
  89. data/spec/support/locomotive.rb +2 -1
  90. data/vendor/assets/javascripts/locomotive/ICanHandlebarz.js +1 -1
  91. data/vendor/assets/javascripts/locomotive/backbone.sync.js +14 -1
  92. metadata +34 -9
  93. data/lib/locomotive/middlewares/cache.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 056a1926af08cec148104a15758876016a135d9e
4
- data.tar.gz: 3ff975e241eebd6b02dea709ef718c772e9008a3
3
+ metadata.gz: f6b5fd84b77a2c1027f2f3a0ef2ff655bc31f775
4
+ data.tar.gz: 884301132a77dc7822611d9291582d7688f3afc2
5
5
  SHA512:
6
- metadata.gz: 9c39801b29f1a9d1cec5d07dfdaab516e95ee3a26f5f0257ab7f548dc1580f010de21dcf61114853ea557735a02c190695bdd082c55805dc04825133d6e67cad
7
- data.tar.gz: 4a24a6c374c4f15fccc56090d4d180b14a3365958b68bbc41cb19d2cb173ef82ae6287159eec444bfef0044de4602eca5a8cb7ab779d5aa30f85b2ebf39a42a1
6
+ metadata.gz: cd423925ab81601ff850d0d784d7b34ac48cf70509c8a9b2b2fbb19ef45721c0ba35b30673d37c914586c73fa8d7b66877067f5034aac529370e7c91e11634fa
7
+ data.tar.gz: 3bdfce2c8125d5e1690ebe4f266bc50a0a1603de461692c61299f920ee2ecdd82c44a86b1ac602283ee670569a3b7a62b34161ec8cefdbf591d3670dd2e83df5
data/Gemfile CHANGED
@@ -34,7 +34,7 @@ group :development do
34
34
  gem 'thor'
35
35
  gem 'github_api'
36
36
 
37
- gem 'unicorn' # Using unicorn_rails instead of webrick (default server)
37
+ gem 'unicorn-rails' # Using unicorn_rails instead of webrick (default server)
38
38
 
39
39
  end
40
40
 
@@ -27,9 +27,9 @@ h2. Gems
27
27
 
28
28
  Here is a short list of main gems / technologies used in the application.
29
29
 
30
- * Ruby 2.0
31
- * Rails 3.2.16 (Rails 4.0 planned for the beginning of 2014)
32
- * Mongoid 3.1.3 (with MongoDB 2.x)
30
+ * Ruby 2.x
31
+ * Rails 3.2.17 (Rails 4.0 planned for the beginning of 2014)
32
+ * Mongoid 3.1.5 (with MongoDB 2.x)
33
33
  * Liquid
34
34
  * Devise
35
35
  * Carrierwave
@@ -49,7 +49,7 @@ define(
49
49
  */
50
50
  insertLink: function(asset) {
51
51
  var range = Aloha.Selection.getRangeObject(),
52
- linkText = asset.get('filename'),
52
+ linkText = asset.get('full_filename'),
53
53
  linkUrl = asset.get('url'),
54
54
  linktag, newLink;
55
55
 
@@ -8,11 +8,17 @@ class Locomotive.Models.ContentAsset extends Backbone.Model
8
8
  @prepare()
9
9
 
10
10
  prepare: ->
11
+ @set(filename: @get('source').name.truncate(15)) if @get('uploading')
12
+
11
13
  @set
12
- image: @get('content_type') == 'image'
14
+ image: @get('content_type') == 'image'
15
+ with_thumbnail: @get('content_type') == 'image' || @get('content_type') == 'pdf'
13
16
 
14
17
  return @
15
18
 
19
+ toJSONForSave: ->
20
+ { source: @get('source') }
21
+
16
22
  class Locomotive.Models.ContentAssetsCollection extends Backbone.Collection
17
23
 
18
24
  model: Locomotive.Models.ContentAsset
@@ -39,7 +39,7 @@ window.Aloha.settings =
39
39
  crop: false
40
40
 
41
41
  i18n:
42
- available: ['en', 'fr', 'pl', 'pt-BR', 'es', 'de', 'no', 'ru', 'nl', 'ja', 'cs', 'bg']
42
+ available: ['en', 'fr', 'pl', 'pt-BR', 'es', 'de', 'no', 'ru', 'nl', 'ja', 'cs', 'bg', 'sk']
43
43
 
44
44
  sidebar:
45
45
  disabled: true
@@ -10,7 +10,7 @@
10
10
 
11
11
  String.prototype.truncate = function(length) {
12
12
  if (this.length > length) {
13
- return this.slice(0, length - 3) + "...";
13
+ return this.slice(0, length - 3) + '...';
14
14
  } else {
15
15
  return this;
16
16
  }
@@ -15,6 +15,18 @@ class Locomotive.Views.ContentAssets.PickerItemView extends Backbone.View
15
15
 
16
16
  return @
17
17
 
18
+ refresh: ->
19
+ $(@el).html(ich.content_asset(@model.toJSON()))
20
+
21
+ uploaded_at: (loaded, total) ->
22
+ percentage = (loaded / total) * 100
23
+
24
+ # for UI reasons, it's better to have it begin at 20%.
25
+ percentage = 20 if percentage < 20
26
+
27
+ # update the progress bar
28
+ @$('.uploading .progress-bar').css('width', "#{percentage}%")
29
+
18
30
  select_asset: (event) ->
19
31
  event.stopPropagation() & event.preventDefault()
20
32
  @on_select(@model)
@@ -6,45 +6,166 @@ class Locomotive.Views.ContentAssets.PickerView extends Locomotive.Views.Shared.
6
6
 
7
7
  number_items_per_row: 4
8
8
 
9
- _item_views: []
9
+ page: 1
10
+
11
+ per_page: 12
12
+
13
+ total_pages: null
14
+
15
+ uploading: false
16
+
17
+ _item_views: []
18
+
19
+ events:
20
+ 'click .btn': 'toggle_filter_by_type'
21
+ 'change input[name=query]': 'fetch_assets'
22
+
23
+ render: ->
24
+ super
25
+
26
+ @enable_dropzone()
27
+
28
+ @enable_infinite_scroll()
29
+
30
+ @
10
31
 
11
32
  template: ->
12
33
  ich.content_asset_picker
13
34
 
14
- fetch_assets: ->
35
+ fetch_assets: (event) ->
15
36
  @_reset()
16
- @collection.fetch
17
- success: () =>
18
- @open()
37
+ xhr = @collection.fetch
38
+ data: @_fetch_options()
39
+ reset: true
40
+ success: => @open()
41
+
42
+ xhr.done => @_get_pagination_info(xhr)
43
+
44
+ toggle_filter_by_type: (event) ->
45
+ $(event.target).toggleClass('on')
46
+ @fetch_assets()
19
47
 
20
48
  build_uploader: (el, link) ->
21
49
  link.bind 'click', (event) ->
22
50
  event.stopPropagation() & event.preventDefault()
23
51
  el.click()
24
52
 
25
- el.bind 'change', (event) =>
26
- _.each event.target.files, (file) =>
27
- asset = new Locomotive.Models.ContentAsset(source: file)
28
- asset.save {},
29
- headers: { 'X-Flash': true }
30
- success: (model, response) => @collection.add(model.prepare())
31
- error: => @shake()
53
+ el.bind 'change', (event) => @_persist_files(event)
32
54
 
33
55
  add_asset: (asset, first) ->
34
56
  view = new Locomotive.Views.ContentAssets.PickerItemView model: asset, parent: @
35
57
 
36
58
  (@_item_views ||= []).push(view)
37
- @$('ul.list .clear').before(view.render().el)
38
59
 
39
- @_refresh()
60
+ if @uploading
61
+ @$('ul.list').prepend(view.render().el)
62
+ @_refresh()
63
+ else
64
+ @$('ul.list .clear').before(view.render().el)
65
+ @_refresh()
66
+ @_move_to_last_asset() unless first == true
67
+
68
+
69
+ enable_dropzone: ->
70
+ # make sure it works for the browser
71
+ return unless window.File && window.FileList && window.FileReader
72
+
73
+ dropzone = @$('ul.list').parent()
74
+
75
+ dropzone.on 'dragover', (event) => @_stop_event(event); dropzone.addClass('hovered')
76
+ dropzone.on 'dragleave', (event) => @_stop_event(event); dropzone.removeClass('hovered')
77
+ dropzone.on 'dragenter', (event) => @_stop_event(event)
78
+ dropzone.on 'drop', (event) =>
79
+ @_stop_event(event)
80
+ dropzone.removeClass('hovered')
81
+ @_persist_files(event)
82
+
83
+ enable_infinite_scroll: ->
84
+ $list = @$('ul.list')
85
+
86
+ $list.on 'scroll', (event) =>
87
+ clearTimeout(@throttle_timer) if @throttle_timer?
88
+
89
+ @throttle_timer = setTimeout =>
90
+ height = $list[0].scrollHeight - $list.innerHeight()
91
+ scroll = $list.scrollTop()
92
+
93
+ isScrolledToEnd = (scroll >= height)
40
94
 
41
- @_move_to_last_asset() unless first == true
95
+ if isScrolledToEnd && @page < @total_pages
96
+ @page += 1
97
+ xhr = @collection.fetch
98
+ data: { page: @page, per_page: @per_page }
99
+ success: () =>
100
+ @_refresh()
101
+ $list.scrollTop(scroll)
102
+ xhr.done => @_get_pagination_info(xhr)
103
+ , 100
42
104
 
43
105
  remove_asset: (asset) ->
44
106
  view = _.find @_item_views, (tmp) -> tmp.model == asset
45
107
  view.remove() if view?
46
108
  @_refresh()
47
109
 
110
+ dialog_class: ->
111
+ 'content-asset-picker-dialog'
112
+
113
+ _fetch_options: ->
114
+ _.tap { per_page: @per_page }, (options) =>
115
+ options.types = []
116
+
117
+ @$('.asset-types .btn.on').each ->
118
+ options.types.push $(this).data('type')
119
+
120
+ options.query = @$('input[name=query]').val()
121
+
122
+ _persist_files: (event) ->
123
+ files = event.target.files || event.originalEvent.dataTransfer.files
124
+
125
+ @_move_to_top()
126
+ @uploading = true
127
+
128
+ _.each files, (file) =>
129
+ # create a new asset
130
+ asset = new Locomotive.Models.ContentAsset(uploading: true, source: file)
131
+ @collection.add(asset.prepare(), at: 0)
132
+
133
+ # create the view at first
134
+ view = @_find_view_by_asset(asset)
135
+
136
+ # async save
137
+ asset.save {},
138
+ headers: { 'X-Flash': true }
139
+ success: (model, response) =>
140
+ asset.set(uploading: false)
141
+ asset.prepare()
142
+ view.refresh()
143
+ error: => @shake()
144
+ progress: (loaded, total) => view.uploaded_at(loaded, total)
145
+
146
+ @uploading = false
147
+
148
+ # what's the total pages now ?
149
+ @_recalculate_pagination(_.size(files))
150
+
151
+ _recalculate_pagination: (number_assets_added) ->
152
+ previous_total_pages = @total_pages
153
+
154
+ # not on the last page ?
155
+ if @page < @total_pages
156
+ number_assets_to_delete = number_assets_added % @per_page
157
+
158
+ while number_assets_to_delete -= 1
159
+ @collection.pop()
160
+
161
+ # not a problem if the total pages is not super accurate because it will
162
+ # be recalculated at the next scroll
163
+ @total_entries += number_assets_added
164
+ @total_pages = Math.ceil(@total_entries / @per_page)
165
+
166
+ # move the current page to the new last one if we already were at the last page
167
+ @page = @total_pages if @page == previous_total_pages || previous_total_pages == 0
168
+
48
169
  _on_refresh: ->
49
170
  self = @
50
171
  @$('ul.list li.asset').each (index) ->
@@ -53,6 +174,19 @@ class Locomotive.Views.ContentAssets.PickerView extends Locomotive.Views.Shared.
53
174
  else
54
175
  $(@).removeClass('last')
55
176
 
177
+ _find_view_by_asset: (asset) ->
178
+ _.find @_item_views || [], (view) -> view.model.cid == asset.cid
179
+
180
+ _stop_event: (event) ->
181
+ event.stopPropagation() & event.preventDefault()
182
+
183
+ _get_pagination_info: (xhr) ->
184
+ @total_pages = parseInt(xhr.getResponseHeader('X-Total-Pages'))
185
+ @per_page = parseInt(xhr.getResponseHeader('X-Per-Page'))
186
+ @total_entries = parseInt(xhr.getResponseHeader('X-Total-Entries'))
187
+
56
188
  _reset: ->
189
+ @page = 1
190
+ @total_pages = null
57
191
  _.each @_item_views || [], (view) -> view.remove()
58
192
  super()
@@ -28,10 +28,12 @@ class Locomotive.Views.Shared.AssetPickerView extends Backbone.View
28
28
 
29
29
  create_dialog: ->
30
30
  @dialog ||= $(@el).dialog
31
- autoOpen: false
32
- modal: true
33
- zIndex: window.application_view.unique_dialog_zindex()
34
- width: 650,
31
+ autoOpen: false
32
+ modal: true
33
+ zIndex: window.application_view.unique_dialog_zindex()
34
+ dialogClass: @dialog_class()
35
+ width: 615
36
+ minHeight: 520
35
37
  create: (event, ui) =>
36
38
  $(@el).prev().find('.ui-dialog-title').html(@$('h2').html())
37
39
  @$('h2').remove()
@@ -46,6 +48,10 @@ class Locomotive.Views.Shared.AssetPickerView extends Backbone.View
46
48
 
47
49
  open: (event, ui, extra) =>
48
50
  $(@el).dialog('overlayEl').bind 'click', => @close()
51
+ $(document.body).addClass('stop-scrolling')
52
+
53
+ close: (event, ui, extra) =>
54
+ $(document.body).removeClass('stop-scrolling')
49
55
 
50
56
  open: ->
51
57
  $(@el).dialog('open')
@@ -73,10 +79,16 @@ class Locomotive.Views.Shared.AssetPickerView extends Backbone.View
73
79
  remove_asset: (asset) ->
74
80
  # please overide remove_asset
75
81
 
82
+ dialog_class: ->
83
+ 'asset-picker-dialog'
84
+
76
85
  _move_to_last_asset: ->
77
86
  limit = @$('ul.list li.clear').position()
78
87
  @$('ul.list').animate(scrollTop: limit.top, 100) if limit?
79
88
 
89
+ _move_to_top: ->
90
+ @$('ul.list').animate(scrollTop: 0, 100)
91
+
80
92
  _refresh: ->
81
93
  if @collection.length == 0
82
94
  @$('ul.list').hide() & @$('p.no-items').show()
@@ -89,7 +89,7 @@ class Locomotive.Views.Shared.FormView extends Backbone.View
89
89
 
90
90
  trigger_change_event_on_focused_inputs: ->
91
91
  # make sure that the current text field gets saved too
92
- input = @$('form input[type=text]:focus, form input[type=password]:focus, form textarea:focus')
92
+ input = @$('form input[type=text]:focus, form input[type=password]:focus, form input[type=number]:focus, form textarea:focus')
93
93
  input.trigger('change') if input.size() > 0
94
94
 
95
95
  enable_save_with_keys_combination: ->
@@ -18,5 +18,5 @@ class Locomotive.Views.Shared.ListItemView extends Backbone.View
18
18
  remove_item: (event) ->
19
19
  event.stopPropagation() & event.preventDefault()
20
20
 
21
- if confirm $(event.target).data('confirm')
21
+ if confirm $(event.target).closest('a').data('confirm')
22
22
  @model.destroy()
@@ -28,7 +28,7 @@
28
28
  } else {
29
29
  var html = ed.selection.getContent();
30
30
  if (html == '') {
31
- html = asset.get('filename');
31
+ html = asset.get('full_filename');
32
32
  ed.execCommand('mceInsertContent', false, '<a id="__mce_tmp" href="#">' + html + '</a>', { skip_undo: 1 });
33
33
  } else {
34
34
  ed.execCommand('mceReplaceContent', false, ' <a id="__mce_tmp" href="#">' + html + '</a>', { skip_undo: 1 });
@@ -175,4 +175,60 @@
175
175
  &:active {
176
176
  top: 1px;
177
177
  }
178
+ }
179
+
180
+ .button-groups {
181
+ position: relative;
182
+ display: inline-block;
183
+ vertical-align: middle;
184
+
185
+ .btn {
186
+ display: inline-block;
187
+ position: relative;
188
+ float: left;
189
+ white-space: nowrap;
190
+ text-align: center;
191
+ vertical-align: middle;
192
+ cursor: pointer;
193
+ outline: none;
194
+ padding: 0px 5px;
195
+ margin: 0px;
196
+ margin-left: -1px;
197
+ border: 1px solid transparent;
198
+ color: #fff;
199
+
200
+ &:first-child {
201
+ @include border-top-left-radius(16px);
202
+ @include border-bottom-left-radius(16px);
203
+ }
204
+
205
+ &:last-child {
206
+ @include border-top-right-radius(16px);
207
+ @include border-bottom-right-radius(16px);
208
+ }
209
+
210
+ padding: 0px 12px 0px 12px;
211
+ line-height: 26px;
212
+ outline: none;
213
+ text-decoration: none;
214
+
215
+ color: #fff;
216
+ font-size: 12px;
217
+ font-weight: normal;
218
+ @include single-text-shadow(rgba(0, 0, 0, 1), 1px, 1px, 1px);
219
+
220
+ border: 1px solid rgba(0, 0, 0, 0.2);
221
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
222
+ border-bottom: 1px solid rgba(0, 0, 0, 0.6);
223
+ @include box-shadow(rgba(255, 255, 255, 0.1) 0 1px 0 0 inset, rgba(255, 255, 255, 0.1) 0 1px 0 0);
224
+ @include background-image(linear-gradient(#303138, #1e1e24));
225
+
226
+ &.on, &:active {
227
+ border: 1px solid rgba(0, 0, 0, 0.4);
228
+ border-top: 1px solid rgba(0, 0, 0, 0.6);
229
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
230
+ @include background-image(linear-gradient(#1e1e24, #212229));
231
+ @include box-shadow(rgba(0, 0, 0, 0) 0 1px 0 0 inset, rgba(255, 255, 255, 0.1) 0 1px 0 0);
232
+ }
233
+ }
178
234
  }
@@ -244,6 +244,12 @@ ul.list {
244
244
  left: 5px;
245
245
  }
246
246
 
247
+ span.content-type {
248
+ @include label;
249
+ top: -1px;
250
+ left: 5px;
251
+ }
252
+
247
253
  .more {
248
254
  position: absolute;
249
255
  top: 0px;