middleman-thumbnailer 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.travis.yml +19 -0
  4. data/Dockerfile +17 -0
  5. data/Gemfile +11 -0
  6. data/LICENSE +21 -0
  7. data/README.md +42 -0
  8. data/Rakefile +15 -0
  9. data/docker-compose.yml +7 -0
  10. data/features/namespace.feature +15 -0
  11. data/features/step_definitions/server_steps.rb +46 -0
  12. data/features/support/env.rb +8 -0
  13. data/features/thumbnails.feature +24 -0
  14. data/fixtures/namespace/config.rb +77 -0
  15. data/fixtures/namespace/source/images/background.png +0 -0
  16. data/fixtures/namespace/source/images/middleman.png +0 -0
  17. data/fixtures/namespace/source/images/test/background.png +0 -0
  18. data/fixtures/namespace/source/images/test1/background.png +0 -0
  19. data/fixtures/namespace/source/index.html.erb +10 -0
  20. data/fixtures/namespace/source/javascripts/all.js +1 -0
  21. data/fixtures/namespace/source/layouts/layout.erb +19 -0
  22. data/fixtures/namespace/source/stylesheets/all.css +55 -0
  23. data/fixtures/namespace/source/stylesheets/normalize.css +375 -0
  24. data/fixtures/thumbnails/config.rb +76 -0
  25. data/fixtures/thumbnails/source/images/background.png +0 -0
  26. data/fixtures/thumbnails/source/images/middleman.png +0 -0
  27. data/fixtures/thumbnails/source/index.html.erb +10 -0
  28. data/fixtures/thumbnails/source/javascripts/all.js +1 -0
  29. data/fixtures/thumbnails/source/layouts/layout.erb +19 -0
  30. data/fixtures/thumbnails/source/stylesheets/all.css +55 -0
  31. data/fixtures/thumbnails/source/stylesheets/normalize.css +375 -0
  32. data/lib/middleman-thumbnailer.rb +8 -0
  33. data/lib/middleman-thumbnailer/extension.rb +192 -0
  34. data/lib/middleman-thumbnailer/thumbnail-generator.rb +78 -0
  35. data/lib/middleman-thumbnailer/version.rb +5 -0
  36. data/lib/middleman_extension.rb +1 -0
  37. data/middleman-thumbnailer.gemspec +24 -0
  38. data/spec/thumbnail-generator_spec.rb +22 -0
  39. metadata +142 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 47a2203c0dc6dd688551ecc5957c2cf7499aa855
4
+ data.tar.gz: 8135751cf64e76ab698d76ee13dca9ace0a1fef5
5
+ SHA512:
6
+ metadata.gz: 1469cdb717abf5f1ba12bac8545d6c2c4ee797982b487eb3a7e4c876204068611fb157f533546655f6b6f0e505c7a019c1a5054f5a9a56fecb394e6ee191ee44
7
+ data.tar.gz: e38ea5cbb5dd6016f6499af9d638b9af4a38c3ebe50241b59964abfce9c3b74186a305bf1353330a7ce12e68d0e87aadcfd7f198c0f2f86c04887e5b7df6232a
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ bin/
6
+ coverage
7
+ tmp/
@@ -0,0 +1,19 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.4.1
4
+ - 2.3.4
5
+ - 2.2.7
6
+ - 2.1.7
7
+ - 2.0.0-p648
8
+ - jruby
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: jruby
12
+ script:
13
+ - bundle exec rake
14
+ deploy:
15
+ provider: rubygems
16
+ api_key: $RUBYGEMS_API_KEY
17
+ gemspec: middleman-thumbnailer.gemspec
18
+ on:
19
+ tags: true
@@ -0,0 +1,17 @@
1
+ FROM alpine
2
+
3
+ RUN apk update && apk upgrade
4
+ RUN apk add curl wget bash ruby ruby-io-console ruby-bundler nodejs \
5
+ curl-dev ruby-dev build-base libffi-dev imagemagick imagemagick-dev git
6
+ RUN npm install phantomjs-prebuilt
7
+
8
+ RUN mkdir -p /src/middleman-thumbnailer/lib/middleman-thumbnailer
9
+ WORKDIR /src/middleman-thumbnailer
10
+
11
+ COPY Gemfile* /src/middleman-thumbnailer/
12
+ COPY middleman-thumbnailer.gemspec /src/middleman-thumbnailer/
13
+ COPY lib/middleman-thumbnailer/version.rb \
14
+ /src/middleman-thumbnailer/lib/middleman-thumbnailer/
15
+
16
+ RUN bundle install --with development,test
17
+
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :development, :test do
6
+ gem "cucumber"
7
+ gem 'aruba'
8
+ gem "rspec"
9
+ gem "builder"
10
+ gem "erubis"
11
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Nicholas Hemsley
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,42 @@
1
+ # Middleman Thumbnailer
2
+
3
+ Generate thumbnail versions of your jpeg & png images
4
+
5
+ ## Installation
6
+
7
+ Add this line to your `Gemfile`:
8
+
9
+ ```ruby
10
+ gem 'middleman-thumbnailer', '~> 0.1'
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ To activate generating thumbnails add the following to `config.rb`:
16
+
17
+ ```ruby
18
+ activate :thumbnailer,
19
+ :dimensions => {
20
+ :small => '200x',
21
+ :medium => '400x300'
22
+ },
23
+ :include_data_thumbnails => true,
24
+ :namespace_directory => %w(gallery)
25
+ ```
26
+
27
+ This activates the extension and will only process images in `source/images/gallery`.
28
+
29
+ For a file called `background.png`, versions named `background-small-200x.png` and `background-medium-400x300.png` will be generated in the same directory.
30
+
31
+ ### Config Options
32
+
33
+ * `:include_data_thumbnails`: `Boolean` (Default: `false`) - Enables including a list all image versions generated as the `data-thumbnails`-attribute for each image when using the `thumbnail()` helper
34
+
35
+ * `:namespace_directory`: `Array` (Default: `nil`)
36
+ only process images found within this directory **within** `source/images`
37
+
38
+
39
+ ## Helpers
40
+
41
+ * `thumbnail(image, size, [html_options])`: returns thumbnail a image tag for `image` in `size`
42
+ * `thumbnail_url(image, size)`: returns the url for `image` in `size`
@@ -0,0 +1,15 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require 'cucumber'
4
+ require 'cucumber/rake/task'
5
+ require 'rake/clean'
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t|
10
+ exempt_tags = ["--tags ~@wip"]
11
+ t.cucumber_opts = "--color #{exempt_tags.join(" ")} --strict"
12
+ end
13
+
14
+ task :test => ["cucumber", "spec"]
15
+ task :default => :test
@@ -0,0 +1,7 @@
1
+ version: '2'
2
+ services:
3
+ test:
4
+ build: .
5
+ command: bash -c 'bundle exec rake'
6
+ volumes:
7
+ - ./:/src/middleman-thumbnailer
@@ -0,0 +1,15 @@
1
+ Feature: Namespacing
2
+ Scenario: Thumbnailing gets correctly namespaced
3
+ Given a fixture app "namespace"
4
+ When I run `middleman build`
5
+ Then the following files should exist:
6
+ | build/images/background.png |
7
+ | build/images/middleman.png |
8
+ | build/images/test/background-medium-x300.png |
9
+ | build/images/test/background-small-200x.png |
10
+
11
+ Then the following files should not exist:
12
+ | build/images/background-medium-x300.png |
13
+ | build/images/background-small-200x.png |
14
+ | build/images/middleman-medium-x300.png |
15
+ | build/images/middleman-small-200x.png |
@@ -0,0 +1,46 @@
1
+ require 'rmagick'
2
+
3
+ require 'middleman-thumbnailer/thumbnail-generator'
4
+
5
+ Then(/^the image "(.*?)" should have width of "([0-9]*?)"$/) do |path, width|
6
+ full_path = File.join(expand_path('.'), path)
7
+ image = ::Magick::Image.read(full_path).first
8
+ expect(image.columns).to eq(width.to_i)
9
+ end
10
+
11
+ Then(/^the image "(.*?)" should have height of "(.*?)"$/) do |path, height|
12
+ full_path = File.join(expand_path('.'), path)
13
+ image = ::Magick::Image.read(full_path).first
14
+ expect(image.rows).to eq(height.to_i)
15
+ end
16
+
17
+ Then(/^I should be able to rebuild "(.*?)" and the thumbnails do not regenerate$/) do |path|
18
+ image_path = File.join(expand_path('.'), 'build', path)
19
+
20
+ specs = {
21
+ small: '200x',
22
+ medium: 'x300'
23
+ }
24
+ thumbnail_paths = ::Middleman::ThumbnailGenerator.specs(image_path, specs)
25
+ thumbnail_path = thumbnail_paths[:small][:name]
26
+ current_mtime = File.mtime(thumbnail_path)
27
+ step %(I run `middleman build`)
28
+ new_mtime = File.mtime(thumbnail_path)
29
+ expect(new_mtime).to eq(current_mtime)
30
+ end
31
+
32
+ Then(/^I should be able to update an image "(.*?)" and the thumbnails regenerate$/) do |path|
33
+ source_path = File.join(expand_path('.'), 'source', path)
34
+ image_path = File.join(expand_path('.'), 'build', path)
35
+ specs = {
36
+ small: '200x',
37
+ medium: 'x300'
38
+ }
39
+ updated_mtime = Time.now
40
+ file = File.new(::Middleman::ThumbnailGenerator.specs(image_path, specs)[:small][:name])
41
+
42
+ expect do
43
+ File.utime(updated_mtime, updated_mtime, source_path)
44
+ step 'I run `middleman build`'
45
+ end.to change(file, :mtime)
46
+ end
@@ -0,0 +1,8 @@
1
+ PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
2
+
3
+ ENV['TEST'] = 'true'
4
+ ENV["AUTOLOAD_SPROCKETS"] = "true"
5
+ require "middleman-core"
6
+ require "middleman-core/step_definitions"
7
+ require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-thumbnailer')
8
+ require "erubis"
@@ -0,0 +1,24 @@
1
+ Feature: Thumbnails get generated for files
2
+ Scenario: Thumbnails get built
3
+ Given a successfully built app at "thumbnails"
4
+ Then the following files should exist:
5
+ | build/images/background.png |
6
+ | build/images/middleman.png |
7
+ | build/images/background-medium-x300.png |
8
+ | build/images/background-small-200x.png |
9
+ | build/images/middleman.png |
10
+ | build/images/middleman-medium-x300.png |
11
+ | build/images/middleman-small-200x.png |
12
+
13
+ Scenario: Thumbnail dimensions are correct
14
+ Given a successfully built app at "thumbnails"
15
+ Then the image "build/images/background-medium-x300.png" should have width of "300"
16
+ Then the image "build/images/background-small-200x.png" should have height of "200"
17
+
18
+ Scenario: Thumbnails are regenerated when files have changed
19
+ Given a successfully built app at "thumbnails"
20
+ Then I should be able to update an image "images/middleman.png" and the thumbnails regenerate
21
+
22
+ Scenario: Thumbnails do not regenerate when source files have not changed
23
+ Given a successfully built app at "thumbnails"
24
+ Then I should be able to rebuild "images/middleman.png" and the thumbnails do not regenerate
@@ -0,0 +1,77 @@
1
+ ###
2
+ # Compass
3
+ ###
4
+
5
+ # Change Compass configuration
6
+ # compass_config do |config|
7
+ # config.output_style = :compact
8
+ # end
9
+
10
+ ###
11
+ # Page options, layouts, aliases and proxies
12
+ ###
13
+
14
+ # Per-page layout changes:
15
+ #
16
+ # With no layout
17
+ # page "/path/to/file.html", :layout => false
18
+ #
19
+ # With alternative layout
20
+ # page "/path/to/file.html", :layout => :otherlayout
21
+ #
22
+ # A path which all have the same layout
23
+ # with_layout :admin do
24
+ # page "/admin/*"
25
+ # end
26
+
27
+ # Proxy pages (http://middlemanapp.com/basics/dynamic-pages/)
28
+ # proxy "/this-page-has-no-template.html", "/template-file.html", :locals => {
29
+ # :which_fake_page => "Rendering a fake page with a local variable" }
30
+
31
+ ###
32
+ # Helpers
33
+ ###
34
+
35
+ # Automatic image dimensions on image_tag helper
36
+ # activate :automatic_image_sizes
37
+
38
+ # Reload the browser automatically whenever files change
39
+ # activate :livereload
40
+
41
+ # Methods defined in the helpers block are available in templates
42
+ # helpers do
43
+ # def some_helper
44
+ # "Helping"
45
+ # end
46
+ # end
47
+
48
+ activate :thumbnailer,
49
+ :dimensions => {
50
+ :small => '200x',
51
+ :medium => 'x300'
52
+ },
53
+ :namespace_directory => %w(test)
54
+
55
+ set :css_dir, 'stylesheets'
56
+
57
+ set :js_dir, 'javascripts'
58
+
59
+ set :images_dir, 'images'
60
+
61
+ # Build-specific configuration
62
+ configure :build do
63
+ # For example, change the Compass output style for deployment
64
+ # activate :minify_css
65
+
66
+ # Minify Javascript on build
67
+ # activate :minify_javascript
68
+
69
+ # Enable cache buster
70
+ # activate :asset_hash
71
+
72
+ # Use relative URLs
73
+ # activate :relative_assets
74
+
75
+ # Or use a different image path
76
+ # set :http_prefix, "/Content/images/"
77
+ end
@@ -0,0 +1,10 @@
1
+ ---
2
+ title: Welcome to Middleman
3
+ ---
4
+
5
+ <div class="welcome">
6
+ <h1>Middleman is Watching</h1>
7
+ <p class="doc">
8
+ <%= link_to "Read Online Documentation", "http://middlemanapp.com/" %>
9
+ </p><!-- .doc -->
10
+ </div><!-- .welcome -->
@@ -0,0 +1 @@
1
+ //= require_tree .
@@ -0,0 +1,19 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+
6
+ <!-- Always force latest IE rendering engine or request Chrome Frame -->
7
+ <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
8
+
9
+ <!-- Use title if it's in the page YAML frontmatter -->
10
+ <title><%= current_page.data.title || "The Middleman" %></title>
11
+
12
+ <%= stylesheet_link_tag "normalize", "all" %>
13
+ <%= javascript_include_tag "all" %>
14
+ </head>
15
+
16
+ <body class="<%= page_classes %>">
17
+ <%= yield %>
18
+ </body>
19
+ </html>
@@ -0,0 +1,55 @@
1
+ @charset "utf-8";
2
+
3
+ body {
4
+ background: #d4d4d4 url("../images/background.png");
5
+ text-align: center;
6
+ font-family: sans-serif; }
7
+
8
+ h1 {
9
+ color: rgba(0, 0, 0, .3);
10
+ font-weight: bold;
11
+ font-size: 32px;
12
+ letter-spacing: -1px;
13
+ text-transform: uppercase;
14
+ text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
15
+ background: url("../images/middleman.png") no-repeat center 100px;
16
+ padding: 350px 0 10px;
17
+ margin: 0; }
18
+
19
+ .doc {
20
+ font-size: 14px;
21
+ margin: 0; }
22
+ .doc:before,
23
+ .doc:after {
24
+ opacity: .2;
25
+ padding: 6px;
26
+ font-style: normal;
27
+ position: relative;
28
+ content: "•"; }
29
+ .doc a {
30
+ color: rgba(0, 0, 0, 0.3); }
31
+ .doc a:hover {
32
+ color: #666; }
33
+
34
+ .welcome {
35
+ -webkit-animation-name: welcome;
36
+ -webkit-animation-duration: .9s; }
37
+
38
+ @-webkit-keyframes welcome {
39
+ from {
40
+ -webkit-transform: scale(0);
41
+ opacity: 0;
42
+ }
43
+ 50% {
44
+ -webkit-transform: scale(0);
45
+ opacity: 0;
46
+ }
47
+ 82.5% {
48
+ -webkit-transform: scale(1.03);
49
+ -webkit-animation-timing-function: ease-out;
50
+ opacity: 1;
51
+ }
52
+ to {
53
+ -webkit-transform: scale(1);
54
+ }
55
+ }
@@ -0,0 +1,375 @@
1
+ /*! normalize.css v2.0.1 | MIT License | git.io/normalize */
2
+
3
+ /* ==========================================================================
4
+ HTML5 display definitions
5
+ ========================================================================== */
6
+
7
+ /*
8
+ * Corrects `block` display not defined in IE 8/9.
9
+ */
10
+
11
+ article,
12
+ aside,
13
+ details,
14
+ figcaption,
15
+ figure,
16
+ footer,
17
+ header,
18
+ hgroup,
19
+ nav,
20
+ section,
21
+ summary {
22
+ display: block;
23
+ }
24
+
25
+ /*
26
+ * Corrects `inline-block` display not defined in IE 8/9.
27
+ */
28
+
29
+ audio,
30
+ canvas,
31
+ video {
32
+ display: inline-block;
33
+ }
34
+
35
+ /*
36
+ * Prevents modern browsers from displaying `audio` without controls.
37
+ * Remove excess height in iOS 5 devices.
38
+ */
39
+
40
+ audio:not([controls]) {
41
+ display: none;
42
+ height: 0;
43
+ }
44
+
45
+ /*
46
+ * Addresses styling for `hidden` attribute not present in IE 8/9.
47
+ */
48
+
49
+ [hidden] {
50
+ display: none;
51
+ }
52
+
53
+ /* ==========================================================================
54
+ Base
55
+ ========================================================================== */
56
+
57
+ /*
58
+ * 1. Sets default font family to sans-serif.
59
+ * 2. Prevents iOS text size adjust after orientation change, without disabling
60
+ * user zoom.
61
+ */
62
+
63
+ html {
64
+ font-family: sans-serif; /* 1 */
65
+ -webkit-text-size-adjust: 100%; /* 2 */
66
+ -ms-text-size-adjust: 100%; /* 2 */
67
+ }
68
+
69
+ /*
70
+ * Removes default margin.
71
+ */
72
+
73
+ body {
74
+ margin: 0;
75
+ }
76
+
77
+ /* ==========================================================================
78
+ Links
79
+ ========================================================================== */
80
+
81
+ /*
82
+ * Addresses `outline` inconsistency between Chrome and other browsers.
83
+ */
84
+
85
+ a:focus {
86
+ outline: thin dotted;
87
+ }
88
+
89
+ /*
90
+ * Improves readability when focused and also mouse hovered in all browsers.
91
+ */
92
+
93
+ a:active,
94
+ a:hover {
95
+ outline: 0;
96
+ }
97
+
98
+ /* ==========================================================================
99
+ Typography
100
+ ========================================================================== */
101
+
102
+ /*
103
+ * Addresses `h1` font sizes within `section` and `article` in Firefox 4+,
104
+ * Safari 5, and Chrome.
105
+ */
106
+
107
+ h1 {
108
+ font-size: 2em;
109
+ }
110
+
111
+ /*
112
+ * Addresses styling not present in IE 8/9, Safari 5, and Chrome.
113
+ */
114
+
115
+ abbr[title] {
116
+ border-bottom: 1px dotted;
117
+ }
118
+
119
+ /*
120
+ * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
121
+ */
122
+
123
+ b,
124
+ strong {
125
+ font-weight: bold;
126
+ }
127
+
128
+ /*
129
+ * Addresses styling not present in Safari 5 and Chrome.
130
+ */
131
+
132
+ dfn {
133
+ font-style: italic;
134
+ }
135
+
136
+ /*
137
+ * Addresses styling not present in IE 8/9.
138
+ */
139
+
140
+ mark {
141
+ background: #ff0;
142
+ color: #000;
143
+ }
144
+
145
+
146
+ /*
147
+ * Corrects font family set oddly in Safari 5 and Chrome.
148
+ */
149
+
150
+ code,
151
+ kbd,
152
+ pre,
153
+ samp {
154
+ font-family: monospace, serif;
155
+ font-size: 1em;
156
+ }
157
+
158
+ /*
159
+ * Improves readability of pre-formatted text in all browsers.
160
+ */
161
+
162
+ pre {
163
+ white-space: pre;
164
+ white-space: pre-wrap;
165
+ word-wrap: break-word;
166
+ }
167
+
168
+ /*
169
+ * Sets consistent quote types.
170
+ */
171
+
172
+ q {
173
+ quotes: "\201C" "\201D" "\2018" "\2019";
174
+ }
175
+
176
+ /*
177
+ * Addresses inconsistent and variable font size in all browsers.
178
+ */
179
+
180
+ small {
181
+ font-size: 80%;
182
+ }
183
+
184
+ /*
185
+ * Prevents `sub` and `sup` affecting `line-height` in all browsers.
186
+ */
187
+
188
+ sub,
189
+ sup {
190
+ font-size: 75%;
191
+ line-height: 0;
192
+ position: relative;
193
+ vertical-align: baseline;
194
+ }
195
+
196
+ sup {
197
+ top: -0.5em;
198
+ }
199
+
200
+ sub {
201
+ bottom: -0.25em;
202
+ }
203
+
204
+ /* ==========================================================================
205
+ Embedded content
206
+ ========================================================================== */
207
+
208
+ /*
209
+ * Removes border when inside `a` element in IE 8/9.
210
+ */
211
+
212
+ img {
213
+ border: 0;
214
+ }
215
+
216
+ /*
217
+ * Corrects overflow displayed oddly in IE 9.
218
+ */
219
+
220
+ svg:not(:root) {
221
+ overflow: hidden;
222
+ }
223
+
224
+ /* ==========================================================================
225
+ Figures
226
+ ========================================================================== */
227
+
228
+ /*
229
+ * Addresses margin not present in IE 8/9 and Safari 5.
230
+ */
231
+
232
+ figure {
233
+ margin: 0;
234
+ }
235
+
236
+ /* ==========================================================================
237
+ Forms
238
+ ========================================================================== */
239
+
240
+ /*
241
+ * Define consistent border, margin, and padding.
242
+ */
243
+
244
+ fieldset {
245
+ border: 1px solid #c0c0c0;
246
+ margin: 0 2px;
247
+ padding: 0.35em 0.625em 0.75em;
248
+ }
249
+
250
+ /*
251
+ * 1. Corrects color not being inherited in IE 8/9.
252
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
253
+ */
254
+
255
+ legend {
256
+ border: 0; /* 1 */
257
+ padding: 0; /* 2 */
258
+ }
259
+
260
+ /*
261
+ * 1. Corrects font family not being inherited in all browsers.
262
+ * 2. Corrects font size not being inherited in all browsers.
263
+ * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome
264
+ */
265
+
266
+ button,
267
+ input,
268
+ select,
269
+ textarea {
270
+ font-family: inherit; /* 1 */
271
+ font-size: 100%; /* 2 */
272
+ margin: 0; /* 3 */
273
+ }
274
+
275
+ /*
276
+ * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in
277
+ * the UA stylesheet.
278
+ */
279
+
280
+ button,
281
+ input {
282
+ line-height: normal;
283
+ }
284
+
285
+ /*
286
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
287
+ * and `video` controls.
288
+ * 2. Corrects inability to style clickable `input` types in iOS.
289
+ * 3. Improves usability and consistency of cursor style between image-type
290
+ * `input` and others.
291
+ */
292
+
293
+ button,
294
+ html input[type="button"], /* 1 */
295
+ input[type="reset"],
296
+ input[type="submit"] {
297
+ -webkit-appearance: button; /* 2 */
298
+ cursor: pointer; /* 3 */
299
+ }
300
+
301
+ /*
302
+ * Re-set default cursor for disabled elements.
303
+ */
304
+
305
+ button[disabled],
306
+ input[disabled] {
307
+ cursor: default;
308
+ }
309
+
310
+ /*
311
+ * 1. Addresses box sizing set to `content-box` in IE 8/9.
312
+ * 2. Removes excess padding in IE 8/9.
313
+ */
314
+
315
+ input[type="checkbox"],
316
+ input[type="radio"] {
317
+ box-sizing: border-box; /* 1 */
318
+ padding: 0; /* 2 */
319
+ }
320
+
321
+ /*
322
+ * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome.
323
+ * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome
324
+ * (include `-moz` to future-proof).
325
+ */
326
+
327
+ input[type="search"] {
328
+ -webkit-appearance: textfield; /* 1 */
329
+ -moz-box-sizing: content-box;
330
+ -webkit-box-sizing: content-box; /* 2 */
331
+ box-sizing: content-box;
332
+ }
333
+
334
+ /*
335
+ * Removes inner padding and search cancel button in Safari 5 and Chrome
336
+ * on OS X.
337
+ */
338
+
339
+ input[type="search"]::-webkit-search-cancel-button,
340
+ input[type="search"]::-webkit-search-decoration {
341
+ -webkit-appearance: none;
342
+ }
343
+
344
+ /*
345
+ * Removes inner padding and border in Firefox 4+.
346
+ */
347
+
348
+ button::-moz-focus-inner,
349
+ input::-moz-focus-inner {
350
+ border: 0;
351
+ padding: 0;
352
+ }
353
+
354
+ /*
355
+ * 1. Removes default vertical scrollbar in IE 8/9.
356
+ * 2. Improves readability and alignment in all browsers.
357
+ */
358
+
359
+ textarea {
360
+ overflow: auto; /* 1 */
361
+ vertical-align: top; /* 2 */
362
+ }
363
+
364
+ /* ==========================================================================
365
+ Tables
366
+ ========================================================================== */
367
+
368
+ /*
369
+ * Remove most spacing between table cells.
370
+ */
371
+
372
+ table {
373
+ border-collapse: collapse;
374
+ border-spacing: 0;
375
+ }