rails_admin_content_builder_rails_6 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +134 -0
  7. data/Rakefile +2 -0
  8. data/app/assets/images/cb-image-default.jpg +0 -0
  9. data/app/assets/images/cb-loading.svg +1 -0
  10. data/app/assets/images/cb-snippet-gallery.jpg +0 -0
  11. data/app/assets/images/cb-snippet-gallery.psd +0 -0
  12. data/app/assets/images/cb-snippet-image-text.jpg +0 -0
  13. data/app/assets/images/cb-snippet-image-text.psd +0 -0
  14. data/app/assets/images/cb-snippet-image.jpg +0 -0
  15. data/app/assets/images/cb-snippet-image.psd +0 -0
  16. data/app/assets/images/cb-snippet-quote-text.jpg +0 -0
  17. data/app/assets/images/cb-snippet-quote-text.psd +0 -0
  18. data/app/assets/images/cb-snippet-quote.jpg +0 -0
  19. data/app/assets/images/cb-snippet-quote.psd +0 -0
  20. data/app/assets/images/cb-snippet-relational-text.jpg +0 -0
  21. data/app/assets/images/cb-snippet-relational-text.psd +0 -0
  22. data/app/assets/images/cb-snippet-text-image.jpg +0 -0
  23. data/app/assets/images/cb-snippet-text-image.psd +0 -0
  24. data/app/assets/images/cb-snippet-text-quote.jpg +0 -0
  25. data/app/assets/images/cb-snippet-text-quote.psd +0 -0
  26. data/app/assets/images/cb-snippet-text-relational.jpg +0 -0
  27. data/app/assets/images/cb-snippet-text-relational.psd +0 -0
  28. data/app/assets/images/cb-snippet-text.jpg +0 -0
  29. data/app/assets/images/cb-snippet-text.psd +0 -0
  30. data/app/assets/images/cb-snippet-video.jpg +0 -0
  31. data/app/assets/images/cb-snippet-video.psd +0 -0
  32. data/app/assets/images/cb-video-default.jpg +0 -0
  33. data/app/assets/javascripts/rails_admin/content_builder.js.erb +374 -0
  34. data/app/assets/javascripts/rails_admin/helpers/action_sortable.js +16 -0
  35. data/app/assets/javascripts/rails_admin/helpers/add_event_to_input.js +9 -0
  36. data/app/assets/javascripts/rails_admin/helpers/autocomplete.js.erb +32 -0
  37. data/app/assets/javascripts/rails_admin/helpers/file_select_and_upload.js +31 -0
  38. data/app/assets/javascripts/rails_admin/helpers/file_select_and_upload_gallery.js +43 -0
  39. data/app/assets/javascripts/rails_admin/helpers/generate_id.js +4 -0
  40. data/app/assets/javascripts/rails_admin/helpers/get_image_of_position.js +11 -0
  41. data/app/assets/javascripts/rails_admin/helpers/medium_editor.js +44 -0
  42. data/app/assets/javascripts/rails_admin/helpers/scrool_to.js +8 -0
  43. data/app/assets/javascripts/rails_admin/helpers/youtube_parse.js.erb +11 -0
  44. data/app/assets/stylesheets/rails_admin/content_builder.scss +534 -0
  45. data/app/controllers/rails_admin_content_builder/content_builder_controller.rb +39 -0
  46. data/app/helpers/rails_admin_content_builder/content_builder_helpers.rb +38 -0
  47. data/app/models/application_record.rb +3 -0
  48. data/app/models/rails_admin_content_builder/content_builder.rb +45 -0
  49. data/app/models/rails_admin_content_builder/content_builder_category.rb +12 -0
  50. data/app/models/rails_admin_content_builder/content_builder_image.rb +11 -0
  51. data/app/views/.gitkeep +0 -0
  52. data/app/views/rails_admin/main/content_builder.html.erb +102 -0
  53. data/bin/console +14 -0
  54. data/bin/setup +8 -0
  55. data/config/initializers/assets.rb +14 -0
  56. data/config/locales/content_builder.en.yml +32 -0
  57. data/config/locales/content_builder.pt-BR.yml +32 -0
  58. data/config/routes.rb +9 -0
  59. data/lib/rails_admin_content_builder_rails_6.rb +55 -0
  60. data/lib/rails_admin_content_builder_rails_6/engine.rb +24 -0
  61. data/lib/rails_admin_content_builder_rails_6/generators/rails_admin_content_builder_generator.rb +40 -0
  62. data/lib/rails_admin_content_builder_rails_6/generators/templates/content_builder_image_uploader.rb +90 -0
  63. data/lib/rails_admin_content_builder_rails_6/generators/templates/create_content_builder_category_migration.rb +10 -0
  64. data/lib/rails_admin_content_builder_rails_6/generators/templates/create_content_builder_image_migration.rb +10 -0
  65. data/lib/rails_admin_content_builder_rails_6/generators/templates/create_content_builder_migration.rb +16 -0
  66. data/lib/rails_admin_content_builder_rails_6/generators/templates/rails_admin_content_builder.rb +37 -0
  67. data/lib/rails_admin_content_builder_rails_6/version.rb +3 -0
  68. data/rails_admin_content_builder_rails_6.gemspec +45 -0
  69. data/vendor/assets/stylesheets/rails_admin_content_builder.scss +411 -0
  70. metadata +417 -0
@@ -0,0 +1,40 @@
1
+ require 'rails/generators'
2
+
3
+ class RailsAdminContentBuilderGenerator < Rails::Generators::Base
4
+ include Rails::Generators::Migration
5
+
6
+ def self.source_root
7
+ @source_root ||= File.expand_path(
8
+ File.join(File.dirname(__FILE__), 'templates/')
9
+ )
10
+ end
11
+
12
+ def self.next_migration_number(*)
13
+ if @migration
14
+ @migration += 1
15
+ else
16
+ @migration = Time.now.utc.strftime('%Y%m%d%H%M%S').to_i
17
+ end
18
+ @migration.to_s
19
+ end
20
+
21
+ def create_uploader_content_builder_image_model
22
+ template 'content_builder_image_uploader.rb',
23
+ 'app/uploaders/content_builder_image_uploader.rb'
24
+ end
25
+
26
+ def create_rails_admin_config_in_initializer
27
+ template 'rails_admin_content_builder.rb',
28
+ 'config/initializers/rails_admin_content_builder.rb'
29
+ end
30
+
31
+ def create_migrations
32
+ path = 'db/migrate'
33
+ migration_template 'create_content_builder_category_migration.rb',
34
+ File.join(path, 'create_content_builder_categories.rb')
35
+ migration_template 'create_content_builder_migration.rb',
36
+ File.join(path, 'create_content_builders.rb')
37
+ migration_template 'create_content_builder_image_migration.rb',
38
+ File.join(path, 'create_content_builder_images.rb')
39
+ end
40
+ end
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+ class ContentBuilderImageUploader < CarrierWave::Uploader::Base
3
+ # Include RMagick or MiniMagick support:
4
+ # include CarrierWave::RMagick
5
+ include CarrierWave::MiniMagick
6
+
7
+ # Choose what kind of storage to use for this uploader:
8
+ if Rails.env.development? || Rails.env.test?
9
+ storage :file
10
+ else
11
+ storage :sftp
12
+ end
13
+ # storage :fog
14
+
15
+ # Override the directory where uploaded files will be stored.
16
+ # This is a sensible default for uploaders that are meant to be mounted:
17
+ def store_dir
18
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
19
+ end
20
+
21
+ # Provide a default URL as a default if there hasn't been a file uploaded:
22
+ # def default_url
23
+ # # For Rails 3.1+ asset pipeline compatibility:
24
+ # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
25
+ #
26
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
27
+ # end
28
+
29
+ # Process files as they are uploaded:
30
+ # process scale: [200, 300]
31
+ #
32
+ # def scale(width, height)
33
+ # # do something
34
+ # end
35
+
36
+ # Create different versions of your uploaded files:
37
+ # Use quality to compress the image
38
+ # resize_to_limit - Resize the image to fit within the specified dimensions while
39
+ # retaining the original aspect ratio. Will only resize the image if it is larger
40
+ # than the specified dimensions. The resulting image may be shorter or narrower
41
+ # than specified in the smaller dimension but will not be larger than the specified
42
+ # values.
43
+ # resize_to_fit - Resize the image to fit within the specified dimensions while
44
+ # retaining the original aspect ratio. The image may be shorter or narrower than
45
+ # specified in the smaller dimension but will not be larger than the specified values.
46
+ # resize_to_fill - Resize the image to fit within the specified dimensions while
47
+ # retaining the aspect ratio of the original image. If necessary, crop the image in
48
+ # the larger dimension. Optionally, a "gravity" may be specified, for example
49
+ # "Center", or "NorthEast".
50
+ # resize_and_pad - Resize the image to fit within the specified dimensions while
51
+ # retaining the original aspect ratio. If necessary, will pad the remaining area
52
+ # with the given color, which defaults to transparent (for gif and png, white
53
+ # for jpeg). Optionally, a "gravity" may be specified, as above.
54
+ version :left_or_right do
55
+ process resize_to_fit: [640, 360]
56
+ process quality: 60
57
+ end
58
+
59
+ version :center do
60
+ process resize_to_fit: [1280, 720]
61
+ process quality: 80
62
+ end
63
+
64
+ # Use quality to compress the image
65
+ # version :thumb_large do
66
+ # process resize_to_fit: [1280, 720]
67
+ # process quality: 60
68
+ # end
69
+
70
+ # Add a white list of extensions which are allowed to be uploaded.
71
+ # For images you might use something like this:
72
+ def extension_whitelist
73
+ %w(jpg jpeg gif png)
74
+ end
75
+
76
+ # Mitigate CVE-2016-3714
77
+ def content_type_whitelist
78
+ [/image\//]
79
+ end
80
+
81
+ # Override the filename of the uploaded files:
82
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
83
+ def filename
84
+ if original_filename
85
+ image_format = original_filename.match(/\.([^.]*)$/).to_a.first
86
+ image_name = original_filename.gsub(/\.([^.]*)$/, "").parameterize
87
+ return "#{image_name}#{image_format}"
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,10 @@
1
+ class CreateContentBuilderCategories < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :content_builder_categories do |t|
4
+ t.string :name
5
+ t.string :slug
6
+
7
+ t.timestamps null: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class CreateContentBuilderImages < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :content_builder_images do |t|
4
+ t.string :image
5
+ t.references :content_builder, index: true, foreign_key: true
6
+
7
+ t.timestamps null: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ class CreateContentBuilders < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :content_builders do |t|
4
+ t.string :title
5
+ t.string :written_by
6
+ t.datetime :date_publish
7
+ t.text :content
8
+ t.boolean :status, default: false
9
+ t.string :slug
10
+ t.text :summary
11
+ t.references :content_builder_category, index: true, foreign_key: true
12
+
13
+ t.timestamps null: false
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+ RailsAdmin.config do |config|
2
+ config.actions do
3
+ content_builder do
4
+ only ['RailsAdminContentBuilder::ContentBuilder']
5
+ end
6
+
7
+ config.model 'RailsAdminContentBuilder::ContentBuilder' do
8
+ list do
9
+ field :id
10
+ field :title
11
+ field :date_publish
12
+ field :content_builder_category
13
+ field :status
14
+ end
15
+ edit do
16
+ field :title
17
+ field :date_publish
18
+ field :written_by
19
+ field :content_builder_category
20
+ end
21
+ end
22
+
23
+ config.model 'RailsAdminContentBuilder::ContentBuilderCategory' do
24
+ list do
25
+ field :id
26
+ field :name
27
+ end
28
+ edit do
29
+ field :name
30
+ end
31
+ end
32
+
33
+ config.model 'RailsAdminContentBuilder::ContentBuilderImage' do
34
+ visible false
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module RailsAdminContentBuilderRails6
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,45 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "rails_admin_content_builder_rails_6/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rails_admin_content_builder_rails_6"
7
+ spec.version = RailsAdminContentBuilderRails6::VERSION
8
+ spec.authors = ["Giuliano Crivelli"]
9
+ spec.email = ["giuliano@agenciaw3.digital"]
10
+
11
+ spec.summary = "Easy way for create contents using rails_admin on Rails 6"
12
+ spec.description = "Easy way for create contents using rails_admin on Rails 6 now with improvements and bug fixes"
13
+ spec.homepage = "https://github.com/thefalked/rails_admin_content_builder_rails_6"
14
+ spec.license = "MIT"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+ end
23
+ spec.bindir = "exe"
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ["lib"]
26
+
27
+ spec.add_development_dependency "bundler", "~> 2.0"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency 'rails', '~> 6.0.3', '>= 6.0.3.3'
30
+ spec.add_development_dependency 'rails_admin', '~> 2.0.2'
31
+ spec.add_development_dependency 'capybara', '~> 2.7', '>= 2.7.0'
32
+ spec.add_development_dependency 'launchy', '~> 2.4', '>= 2.4.3'
33
+ spec.add_development_dependency 'shoulda-matchers', '~> 3.1'
34
+ spec.add_development_dependency 'selenium-webdriver', '~> 2.53', '>= 2.53.4'
35
+ spec.add_development_dependency 'factory_girl_rails', '~> 4.7', '>= 4.7.0'
36
+ spec.add_development_dependency 'faker', '~> 1.6', '>= 1.6.3'
37
+
38
+ spec.add_runtime_dependency 'carrierwave', '~> 2.0'
39
+ spec.add_runtime_dependency 'medium-editor-rails', '~> 2.1', '>= 2.1.0'
40
+ spec.add_runtime_dependency 'mini_magick', '~> 4.5', '>= 4.5.1'
41
+ spec.add_runtime_dependency 'friendly_id', '~> 5.1', '>= 5.1.0'
42
+ spec.add_runtime_dependency 'simple_form', '~> 5.0.2'
43
+ spec.add_runtime_dependency 'search_cop', '~> 1.0', '>= 1.0.6'
44
+ spec.add_runtime_dependency 'rails-html-sanitizer', '~> 1.0', '>= 1.0.0'
45
+ end
@@ -0,0 +1,411 @@
1
+ // content builder
2
+
3
+ .cb,
4
+ .news {
5
+ font-size: 1em;
6
+
7
+ a {
8
+ color: inherit;
9
+ font-weight: 600;
10
+ text-decoration: none;
11
+
12
+ &:hover,
13
+ &:focus {
14
+ text-decoration: underline;
15
+ }
16
+ }
17
+ }
18
+
19
+ .cb-header,
20
+ .news__header {
21
+ padding-bottom: 1em;
22
+ margin-bottom: 1em;
23
+ border-bottom: solid 1px rgba(0,0,0,.1);
24
+ }
25
+
26
+ .cb-title,
27
+ .news__title {
28
+ margin: 0;
29
+ line-height: 1.2;
30
+
31
+ color: rgba(0,0,0,.65);
32
+ font-size: 1.4em;
33
+ letter-spacing: -.04em;
34
+ }
35
+
36
+ .cb-summary,
37
+ .news__summary {
38
+ margin: .5em 0 0;
39
+ line-height: 1.5;
40
+
41
+ color: rgba(0,0,0,.4);
42
+ font-size: .8em;
43
+ }
44
+
45
+ .cb-date,
46
+ .news__date {
47
+ margin: 0 0 .5em;
48
+
49
+ color: rgba(0,0,0,.5);
50
+ font-size: .64em;
51
+ }
52
+
53
+ .cb-info,
54
+ .news__info {
55
+ margin-top: 1em;
56
+
57
+ color: rgba(0,0,0,.5);
58
+ font-size: .7em;
59
+ }
60
+
61
+ .cb-row,
62
+ .news__row {
63
+ position: relative;
64
+ max-width: 100%;
65
+ height: auto !important;
66
+
67
+ &:after {
68
+ visibility: hidden;
69
+ display: block;
70
+ font-size: 0;
71
+ content: " ";
72
+ clear: both;
73
+ height: 0;
74
+ }
75
+ }
76
+
77
+ .cb-content,
78
+ .news__content {
79
+ line-height: 1.6;
80
+
81
+ color: rgba(0,0,0,.6);
82
+ font-family: sans-serif;
83
+ font-size: .8em;
84
+
85
+ margin-bottom: 1.5em;
86
+
87
+ &:after {
88
+ visibility: hidden;
89
+ display: block;
90
+ font-size: 0;
91
+ content: " ";
92
+ clear: both;
93
+ height: 0;
94
+ }
95
+
96
+ p {
97
+ margin: 0 0 1.5em;
98
+
99
+ &:last-of-type {
100
+ margin: 0;
101
+ }
102
+ }
103
+ }
104
+
105
+ .cb-figure,
106
+ .news__figure {
107
+ position: relative;
108
+ margin: .3em 0 1.5em;
109
+
110
+ img {
111
+ display: block;
112
+ width: 100%;
113
+ }
114
+ }
115
+
116
+ .cb-figcaption,
117
+ .news__figcaption {
118
+ color: rgba(0,0,0,.6);
119
+
120
+ font-size: .8em;
121
+ line-height: 1.4;
122
+
123
+ margin-top: .2em;
124
+ padding: .3em .6em .4em;
125
+
126
+ background: rgba(0,0,0,.05);
127
+ }
128
+
129
+ .cb-video,
130
+ .news__video {
131
+ position: relative;
132
+ height: 0;
133
+ overflow: hidden;
134
+ padding-bottom: 56.25%;
135
+ background: rgba(0,0,0,.02);
136
+
137
+ iframe {
138
+ position: absolute;
139
+ width: 100%;
140
+ height: 100%;
141
+ vertical-align: middle;
142
+ }
143
+ }
144
+
145
+ .cb-video--center,
146
+ .news__video--center {
147
+ margin-bottom: 1.5em;
148
+ }
149
+
150
+ .cb-blockquote {
151
+ position: relative;
152
+ margin: 0 0 1.5rem;
153
+
154
+ padding: 1.5em 0 0 1.5em;
155
+ border: 0;
156
+
157
+ color: rgba(0,0,0,.5);
158
+ }
159
+
160
+ .cb-blockquote__text {
161
+ margin: 0 0 .5em;
162
+
163
+ line-height: 1.4;
164
+
165
+ font-family: sans-serif;
166
+ font-size: 1em;
167
+
168
+ &:before {
169
+ content: "\“";
170
+
171
+ position: absolute;
172
+ top: 0;
173
+ left: 0;
174
+
175
+ display: block;
176
+ line-height: 1;
177
+
178
+ color: rgba(0,0,0,.2);
179
+ font-size: 4em;
180
+ }
181
+ }
182
+
183
+ .cb-blockquote__footer {
184
+ position: relative;
185
+ margin: 0;
186
+
187
+ padding-left: 1.5em;
188
+
189
+ font-family: sans-serif;
190
+ font-size: .9em;
191
+
192
+ &:before {
193
+ content: "\2014 \00A0";
194
+
195
+ position: absolute;
196
+ top: 0;
197
+ left: 0;
198
+
199
+ display: block;
200
+ }
201
+ }
202
+
203
+ .cb-relational {
204
+ margin: 0 0 1.5em;
205
+ padding-top: .3em;
206
+ }
207
+
208
+ .cb-relational__title {
209
+ margin: 0 0 .5em;
210
+
211
+ line-height: 1;
212
+ padding-top: .5em;
213
+ border-top: solid 4px rgba(0,0,0,.1);
214
+
215
+ color: rgba(0,0,0,.3);
216
+ font-size: 1em;
217
+ font-weight: 700;
218
+ text-transform: uppercase;
219
+ }
220
+
221
+ .cb-relational__list {
222
+ margin: 0;
223
+ padding: 0;
224
+ list-style: none;
225
+ }
226
+
227
+ .cb-relational__item {
228
+ position: relative;
229
+ padding: 1em 0;
230
+ border-bottom: solid 1px rgba(0,0,0,.05);
231
+ }
232
+
233
+ .cb-relational__caption {
234
+ margin: 0;
235
+
236
+ display: block;
237
+
238
+ font-size: .9em;
239
+ font-weight: 700;
240
+ }
241
+
242
+ .cb-relational__link {
243
+ position: absolute;
244
+ top: 0;
245
+ left: 0;
246
+
247
+ display: block;
248
+ width: 100%;
249
+ height: 100%;
250
+
251
+ &:hover,
252
+ &:focus {
253
+ ~ .cb-relational__caption {
254
+ text-decoration: underline;
255
+ }
256
+ }
257
+ }
258
+
259
+ .cb-relational__btn {
260
+ display: none;
261
+ }
262
+
263
+ .cb-content-gallery {
264
+ @extend .cb-content;
265
+ }
266
+
267
+ .cb-gallery {
268
+
269
+ }
270
+
271
+ .cb-gallery__item {
272
+
273
+ }
274
+
275
+ .cb-gallery__figure {
276
+ margin: 0;
277
+ padding: 0;
278
+ }
279
+
280
+ .cb-gallery__image {
281
+ width: 100%;
282
+ }
283
+
284
+ @media screen and (min-width: 768px) {
285
+ .cb-header,
286
+ .news__header {
287
+ margin-bottom: 1.5em;
288
+ padding-bottom: 1.5em;
289
+ }
290
+
291
+ .cb-title,
292
+ .news__title {
293
+ font-size: 2em;
294
+ }
295
+
296
+ .cb-date,
297
+ .news__date {
298
+ font-size: .8em;
299
+ }
300
+
301
+ .cb-summary,
302
+ .news__summary {
303
+ font-size: 1em;
304
+ }
305
+
306
+ .cb-info,
307
+ .news__info {
308
+ margin: 1em 0 0;
309
+ font-size: .8em;
310
+ }
311
+
312
+ .cb-content,
313
+ .news__content {
314
+ font-size: 1em;
315
+ }
316
+
317
+ .cb-figure--left,
318
+ .news__figure--left {
319
+ float: left;
320
+ width: 50%;
321
+ margin: .3em 1.5em 1em 0;
322
+ }
323
+
324
+ .cb-figure--right,
325
+ .news__figure--right {
326
+ float: right;
327
+ width: 50%;
328
+ margin: .3em 0 1em 1.5em;
329
+ }
330
+
331
+ .cb-figure--center,
332
+ .news__figure--center {
333
+ margin: .3em 0 1.5rem;
334
+ }
335
+
336
+ .cb-figcaption,
337
+ .news__figcaption {
338
+ font-size: .9em;
339
+ padding: .4em .8em .5em;
340
+ }
341
+
342
+ .cb-blockquote {
343
+ padding: 2em 0 0 2em;
344
+ }
345
+
346
+ .cb-blockquote__text {
347
+ font-size: 1.2em;
348
+ }
349
+
350
+ .cb-blockquote--left {
351
+ float: left;
352
+ width: 50%;
353
+ margin: 0 2rem 1.5em 0;
354
+ }
355
+
356
+ .cb-blockquote--right {
357
+ float: right;
358
+ width: 50%;
359
+ margin: 0 0 1.5em 1.5em;
360
+ }
361
+
362
+ .cb-relational--left {
363
+ float: left;
364
+ margin: 0 1.5em 1.5em 0;
365
+ width: 50%;
366
+ }
367
+
368
+ .cb-relational--right {
369
+ float: right;
370
+ margin: 0 0 1.5em 1.5em;
371
+ width: 50%;
372
+ }
373
+
374
+ .cb-relational__caption {
375
+ font-size: 1em;
376
+ }
377
+ }
378
+
379
+ @media screen and (min-width: 992px) {
380
+ .cb-title,
381
+ .news__title {
382
+ font-size: 2.2em;
383
+ }
384
+
385
+ .cb-summary,
386
+ .news__summary {
387
+ font-size: 1.1em;
388
+ }
389
+
390
+ .cb-aside-title {
391
+ font-size: 1.2em;
392
+ }
393
+ }
394
+
395
+ @media print {
396
+ .cb-blockquote--left {
397
+ float: left;
398
+ width: 50%;
399
+ margin: 0 2em 1.5em 0;
400
+ }
401
+
402
+ .cb-blockquote--right {
403
+ float: right;
404
+ width: 50%;
405
+ margin: 0 0 1.5em 2em;
406
+ }
407
+
408
+ .cb-relational {
409
+ display: none;
410
+ }
411
+ }