sumatra-rails 0.0.3.1 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +8 -8
  2. data/Gemfile.lock +32 -32
  3. data/lib/sumatra/rails/version.rb +1 -1
  4. data/sumatra-rails.gemspec +1 -1
  5. data/vendor/assets/javascripts/sumatra.js.coffee +1 -121
  6. data/vendor/assets/javascripts/sumatra/.env.example +1 -0
  7. data/vendor/assets/javascripts/sumatra/.gitignore +2 -0
  8. data/vendor/assets/javascripts/sumatra/Cakefile +27 -0
  9. data/vendor/assets/javascripts/sumatra/LICENSE.md +20 -0
  10. data/vendor/assets/javascripts/sumatra/README.md +183 -0
  11. data/vendor/assets/javascripts/sumatra/component.json +30 -0
  12. data/vendor/assets/javascripts/sumatra/docs/docco.css +500 -0
  13. data/vendor/assets/javascripts/sumatra/docs/index.html +177 -0
  14. data/vendor/assets/javascripts/sumatra/docs/index.md +0 -0
  15. data/vendor/assets/javascripts/sumatra/docs/plugin.js.html +207 -0
  16. data/vendor/assets/javascripts/sumatra/docs/public/fonts/aller-bold.eot +0 -0
  17. data/vendor/assets/javascripts/sumatra/docs/public/fonts/aller-bold.ttf +0 -0
  18. data/vendor/assets/javascripts/sumatra/docs/public/fonts/aller-bold.woff +0 -0
  19. data/vendor/assets/javascripts/sumatra/docs/public/fonts/aller-light.eot +0 -0
  20. data/vendor/assets/javascripts/sumatra/docs/public/fonts/aller-light.ttf +0 -0
  21. data/vendor/assets/javascripts/sumatra/docs/public/fonts/aller-light.woff +0 -0
  22. data/vendor/assets/javascripts/sumatra/docs/public/fonts/fleurons.eot +0 -0
  23. data/vendor/assets/javascripts/sumatra/docs/public/fonts/fleurons.ttf +0 -0
  24. data/vendor/assets/javascripts/sumatra/docs/public/fonts/fleurons.woff +0 -0
  25. data/vendor/assets/javascripts/sumatra/docs/public/fonts/novecento-bold.eot +0 -0
  26. data/vendor/assets/javascripts/sumatra/docs/public/fonts/novecento-bold.ttf +0 -0
  27. data/vendor/assets/javascripts/sumatra/docs/public/fonts/novecento-bold.woff +0 -0
  28. data/vendor/assets/javascripts/sumatra/docs/public/images/gray.png +0 -0
  29. data/vendor/assets/javascripts/sumatra/docs/public/stylesheets/normalize.css +375 -0
  30. data/vendor/assets/javascripts/sumatra/docs/runtime.js.html +111 -0
  31. metadata +29 -4
@@ -0,0 +1,177 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <title>Sumatra</title>
6
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
7
+ <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
8
+ <link rel="stylesheet" media="all" href="docco.css" />
9
+ </head>
10
+ <body>
11
+ <div id="container">
12
+ <div id="background"></div>
13
+
14
+ <ul class="sections">
15
+
16
+
17
+
18
+ <li id="section-1">
19
+ <div class="annotation">
20
+
21
+ <div class="pilwrap for-h1">
22
+ <a class="pilcrow" href="#section-1">&#182;</a>
23
+ </div>
24
+ <h1>Sumatra</h1>
25
+ <p>Sumatra is a CoffeeScript framework for writing jQuery plugins harder,
26
+ better, faster, stronger.</p>
27
+ <p>You should use Sumatra if you...</p>
28
+ <ul>
29
+ <li>Encapsulate complex jQuery plugins in a service object and call an
30
+ instance of that service object for each DOM element the plugin
31
+ selector is passed</li>
32
+ <li>Enjoy test-driven development, clear code, and convention over
33
+ configuration</li>
34
+ <li>Believe unicorns are real</li>
35
+ </ul>
36
+ <h2>Why?</h2>
37
+ <p>A lot of jQuery plugins are written to encapsulate a simple bit of
38
+ functionality used throughout the application. But jQuery&#39;s syntax was
39
+ designed to improve the way people write JavaScript. CoffeeScript has a
40
+ similar goal, but approaches it from a different angle, it compiles its
41
+ syntax into JavaScript but does so in a safe, syntactically correct and
42
+ (mostly) readable way. This framework unites the two, and finally allows
43
+ jQuery developers to build plugins in CoffeeScript without making their
44
+ code look, well, downright ugly!</p>
45
+ <h2>The Goods</h2>
46
+ <p>
47
+ You came here for docs, right?
48
+
49
+ <ul>
50
+ <li><a href="plugin.js.html">SumatraPlugin</a></li>
51
+ <li><a href="runtime.js.html">sumatra()</a></li>
52
+ </ul>
53
+ </p>
54
+ <h2>Installation</h2>
55
+ <h3>Requirements</h3>
56
+ <ul>
57
+ <li>jQuery</li>
58
+ <li>CoffeeScript if you want to develop it..</li>
59
+ </ul>
60
+ <p>We recommend Bower for installing Sumatra as a component:</p>
61
+ <pre><code class="lang-bash">$ bower install sumatra</code></pre>
62
+ <p>However, you can also install Sumatra manually by just including the
63
+ <code>pkg/sumatra.js</code> file in your javascripts directory.</p>
64
+ <h2>Usage</h2>
65
+ <p>Sumatra values convention over configuration, and its usage revolves
66
+ around an established pattern that hopefully others will find useful.</p>
67
+ <h3>Defining a Basic Plugin</h3>
68
+ <p>After loading Sumatra, you can build jQuery plugins that are both clear
69
+ and superbly terse:</p>
70
+ <pre><code class="lang-coffeescript">sumatra &#39;clickMe&#39;, -&gt;
71
+ class ClickMe extends SumatraPlugin
72
+ action: &#39;click&#39;
73
+ perform: (event) =&gt;
74
+ element_id = @element.attr(&#39;id&#39;) || &#39;&lt;div&gt;&#39;
75
+ alert &quot;You just clicked #{element_id}!&quot;</code></pre>
76
+ <p>All this plugin does is show an <code>alert()</code> when the element is clicked.
77
+ You can define a single action with <code>action:</code> and then define the
78
+ <code>perform()</code> event handler that binds to whatever action you&#39;ve set
79
+ on the element.</p>
80
+ <p>To bind an element to this event, just call it like any normal
81
+ jQuery plugin:</p>
82
+ <pre><code class="lang-coffeescript">$(&#39;#my_element&#39;).clickMe();</code></pre>
83
+ <h3>Parameters</h3>
84
+ <p>You can also make plugins that pass in options. All Sumatra plugins
85
+ take an <code>options</code> hash as their only argument, regardless of whether
86
+ the service object uses them or not.</p>
87
+ <pre><code class="lang-coffeescript">sumatra &#39;ajaxSubmit&#39;, -&gt;
88
+ class AjaxSubmit extends SumatraPlugin
89
+ action: &#39;submit&#39;
90
+ mergeOptions: -&gt;
91
+ @defaults = @_getFormDefaults()
92
+ _.extend(@options, @defaults)
93
+
94
+ perform: (event) =&gt;
95
+ event.preventDefault()
96
+ event.stopPropagation()
97
+ $.ajax @options
98
+
99
+ _getFormDefaults: -&gt;
100
+ {
101
+ url: @element.attr(&#39;action&#39;)
102
+ type: @element.attr(&#39;method&#39;)
103
+ error: (message, status, xhr) -&gt;
104
+ console.log status, message, xhr
105
+ alert &quot;#{status}: #{message}&quot;
106
+ }</code></pre>
107
+ <p>This is an example of <a href="http://jquery.malsup.com/form">ajaxSubmit from the jQuery.form plugin</a>,
108
+ implemented using Sumatra. It would especially be useful when rendering
109
+ an inline response with JSON, using something such as Handlebars to
110
+ compile the JSON data into a logic-less client-side template...</p>
111
+ <pre><code class="lang-coffeescript">$(&#39;form&#39;).ajaxSubmit \
112
+ dataType: &#39;json&#39;
113
+ success: (context) =&gt;
114
+ template = Handlebars.compile $(&#39;#response_template&#39;)
115
+ response = template(context)
116
+ @element.html response</code></pre>
117
+ <h3>Basic Properties</h3>
118
+ <p>As a by-product of the jQuery instantation process, each <code>SumatraPlugin</code>
119
+ comes with the following three properties, for free:</p>
120
+ <ul>
121
+ <li><strong>element:</strong> References a single jQuery DOM Object, which can perform
122
+ basic functionality on the page. It is obtained from the collection of
123
+ objects which matched the plugin&#39;s selector upon instantiation.</li>
124
+ <li><strong>index:</strong> The index of the jQuery DOM Object in the collection of
125
+ objects which matched the plugin&#39;s selector upon instantiation.</li>
126
+ <li><strong>options:</strong> A Hash-notated Object obtained as the only argument in
127
+ the jQuery plugin when instantiated. This object is then merged with
128
+ the <code>defaults</code> hash, which are default params in the plugin&#39;s
129
+ definition, before initialization occurs.</li>
130
+ </ul>
131
+ <h3>Workflow</h3>
132
+ <p>Each SumatraPlugin has a &quot;workflow&quot; that is expressed as a series of
133
+ methods, all run in the <code>constructor</code> of the object. The constructor
134
+ is responsible for setup of the object&#39;s basic properties. This method
135
+ should never be overridden, instead, each step of the instantiation
136
+ process can be controlled by overriding one of the following methods:</p>
137
+ <ul>
138
+ <li><strong>mergeOptions:</strong> Merge the options with the defaults hash. You can
139
+ override this to use attributes from <code>@element</code> as defaults instead.</li>
140
+ <li><strong>initialize:</strong> The main override of the constructor method, this is
141
+ where one would actually &quot;construct&quot; the objects they are going to be
142
+ using in this plugin instance, bind events, and call helper methods.</li>
143
+ <li><strong>bindEvents:</strong> This is where the <code>action:</code> event should be bound in
144
+ some way. In many cases, this is overridden to bind other events as
145
+ well as the <code>action:</code>, or binding the event as a <code>$(document).on</code>.</li>
146
+ <li><strong>perform:</strong> The event handler of the plugin, this is normally called
147
+ when the <code>action:</code> event is fired, but it must be defined if it is
148
+ called or it will throw an error.</li>
149
+ </ul>
150
+ <p>You can define more methods, but these are the only public methods that
151
+ should be overridden. Any method beginning with <code>_</code> is considered
152
+ &quot;private&quot; and should not be overridden. Please carry this convention
153
+ to your own code as well.</p>
154
+ <h2>Development</h2>
155
+ <p>You can build this code into JavaScript by running the following
156
+ command at the root dir:</p>
157
+ <pre><code class="lang-bash">$ npm install &amp;&amp; cake build</code></pre>
158
+ <h3>Contributions</h3>
159
+ <p>Contributions will be accepted via Git/GitHub pull requests, as long as
160
+ you write tests that prove your contributions work. We use Jasmine to
161
+ write tests in CoffeeScript (you know, for the actual framework?) and
162
+ RSpec to write tests for the Rails helpers.</p>
163
+ <h3>Releases</h3>
164
+ <p>All releases will be made in both CoffeeScript and JavaScript, and
165
+ available simultaneously on the Bower and RubyGems package managers.
166
+ We use Bower to manage the standalone JavaScript code which has no
167
+ dependency on Sprockets, Rails, or anything Ruby.</p>
168
+ <p>This code is released under the <a href="https://github.com/tubbo/sumatra/blob/master/LICENSE.md">MIT License</a>.</p>
169
+
170
+ </div>
171
+
172
+ </li>
173
+
174
+ </ul>
175
+ </div>
176
+ </body>
177
+ </html>
File without changes
@@ -0,0 +1,207 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <title>plugin.js.coffee</title>
6
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
7
+ <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
8
+ <link rel="stylesheet" media="all" href="docco.css" />
9
+ </head>
10
+ <body>
11
+ <div id="container">
12
+ <div id="background"></div>
13
+
14
+ <ul class="sections">
15
+
16
+ <li id="title">
17
+ <div class="annotation">
18
+ <h1>plugin.js.coffee</h1>
19
+ </div>
20
+ </li>
21
+
22
+
23
+
24
+ <li id="section-1">
25
+ <div class="annotation">
26
+
27
+ <div class="pilwrap for-h2">
28
+ <a class="pilcrow" href="#section-1">&#182;</a>
29
+ </div>
30
+ <h2>SumatraPlugin</h2>
31
+
32
+ </div>
33
+
34
+ </li>
35
+
36
+
37
+ <li id="section-2">
38
+ <div class="annotation">
39
+
40
+ <div class="pilwrap ">
41
+ <a class="pilcrow" href="#section-2">&#182;</a>
42
+ </div>
43
+ <p>A prototype object for common actions when defining jQuery plugins
44
+ in the Sumatra framework. It is designed so that you never have to
45
+ override the constructor. Instead, the constructor sets up a common
46
+ method interface for both initialization (which would happen after
47
+ construction) and the binding of events, a common task in jQuery
48
+ plugins. This prototype even handles some of that for you, with
49
+ the default <code>bindEvents()</code> being bound to call the <code>perform()</code>
50
+ method (which must be defined by the object extending <code>SumatraPlugin</code>)
51
+ whenever the element it was constructed with triggers the event
52
+ defined by <code>action</code>.</p>
53
+ <p>So essentially, you can define almost any jQuery plugin using this
54
+ interface, even though the only thing binding it to the <code>sumatra</code>
55
+ function is its constructor that takes 3 parameters.</p>
56
+ <p><code>SumatraPlugin</code> also has facilities for dealing with an options hash
57
+ and merging said options with defaults. You can define the default
58
+ options for your plugin like so:</p>
59
+ <pre><code>sumatra &#39;clickToGo&#39;, -&gt;
60
+ class ClickToGo extends SumatraPlugin
61
+ action: &#39;click&#39;
62
+ defaults: { to: &#39;http://google.com&#39; }
63
+ perform: (event) =&gt;
64
+ if confirm &quot;Are you sure you want to go to #{@options.goTo}?&quot;
65
+ window.location = @options.goTo</code></pre>
66
+ <p>Then, when instantiating, just override them.</p>
67
+ <pre><code>$(&#39;a&#39;).clickToGo(to: &#39;http://yahoo.com&#39;);</code></pre>
68
+ <p>This removes the need for writing that boilerplate options hash extend
69
+ code every time you write a jQuery plugin that takes options. All
70
+ plugins defined with <code>sumatra()</code> take an optional options hash, which is
71
+ <code>{}</code> by default, in case your plugin doesn&#39;t require options.</p>
72
+
73
+ </div>
74
+
75
+ <div class="content"><div class="highlight"><pre><span class="class"><span class="keyword">class</span> @<span class="title">SumatraPlugin</span></span></pre></div></div>
76
+
77
+ </li>
78
+
79
+
80
+ <li id="section-3">
81
+ <div class="annotation">
82
+
83
+ <div class="pilwrap ">
84
+ <a class="pilcrow" href="#section-3">&#182;</a>
85
+ </div>
86
+ <p>The event to bind to if <code>perform()</code> is defined.</p>
87
+
88
+ </div>
89
+
90
+ <div class="content"><div class="highlight"><pre>action: <span class="string">'one'</span></pre></div></div>
91
+
92
+ </li>
93
+
94
+
95
+ <li id="section-4">
96
+ <div class="annotation">
97
+
98
+ <div class="pilwrap ">
99
+ <a class="pilcrow" href="#section-4">&#182;</a>
100
+ </div>
101
+ <p>A hash of attributes that are extended with an options hash passed
102
+ into the jQuery plugin upon instantiation. Useful for setting up
103
+ data that is required.</p>
104
+
105
+ </div>
106
+
107
+ <div class="content"><div class="highlight"><pre>defaults: {}</pre></div></div>
108
+
109
+ </li>
110
+
111
+
112
+ <li id="section-5">
113
+ <div class="annotation">
114
+
115
+ <div class="pilwrap ">
116
+ <a class="pilcrow" href="#section-5">&#182;</a>
117
+ </div>
118
+ <p>Instantiate a <code>SumatraPlugin</code> and bind it to the current element
119
+ with options. This also initiates the workflow.</p>
120
+ <p><strong>DO NOT OVERRIDE!!</strong></p>
121
+
122
+ </div>
123
+
124
+ <div class="content"><div class="highlight"><pre>constructor: (current_element, index_of_query, init_options) -&gt;
125
+ <span class="property">@element</span> = $(current_element)
126
+ <span class="property">@index</span> = index_of_query
127
+ <span class="property">@options</span> = <span class="property">@mergeDefaultsWith</span> init_options
128
+ <span class="property">@initialize</span>() <span class="keyword">and</span> <span class="property">@bindEvents</span>()</pre></div></div>
129
+
130
+ </li>
131
+
132
+
133
+ <li id="section-6">
134
+ <div class="annotation">
135
+
136
+ <div class="pilwrap ">
137
+ <a class="pilcrow" href="#section-6">&#182;</a>
138
+ </div>
139
+ <p>Merge <code>options</code> hash with the <code>defaults</code> as set in the definition
140
+ of this object.</p>
141
+
142
+ </div>
143
+
144
+ <div class="content"><div class="highlight"><pre>mergeDefaultsWith: (options) -&gt;
145
+ _.extend <span class="property">@defaults</span>, <span class="property">@options</span></pre></div></div>
146
+
147
+ </li>
148
+
149
+
150
+ <li id="section-7">
151
+ <div class="annotation">
152
+
153
+ <div class="pilwrap ">
154
+ <a class="pilcrow" href="#section-7">&#182;</a>
155
+ </div>
156
+ <p>Run custom constructor code, but blocks instantiation if this method
157
+ returns <code>false</code>. This method was pretty much designed to be overridden.</p>
158
+
159
+ </div>
160
+
161
+ <div class="content"><div class="highlight"><pre>initialize: -&gt;
162
+ <span class="literal">true</span></pre></div></div>
163
+
164
+ </li>
165
+
166
+
167
+ <li id="section-8">
168
+ <div class="annotation">
169
+
170
+ <div class="pilwrap ">
171
+ <a class="pilcrow" href="#section-8">&#182;</a>
172
+ </div>
173
+ <p>Bind the <code>perform()</code> method to the <code>action</code> as set in the definition
174
+ of this plugin. Overriding this method removes the guarantee that
175
+ perform() will be called at all...</p>
176
+
177
+ </div>
178
+
179
+ <div class="content"><div class="highlight"><pre>bindEvents: -&gt;
180
+ <span class="keyword">if</span> <span class="property">@action</span>?
181
+ <span class="property">@element</span>.<span class="literal">on</span> <span class="property">@action</span>, <span class="property">@perform</span></pre></div></div>
182
+
183
+ </li>
184
+
185
+
186
+ <li id="section-9">
187
+ <div class="annotation">
188
+
189
+ <div class="pilwrap ">
190
+ <a class="pilcrow" href="#section-9">&#182;</a>
191
+ </div>
192
+ <p>The event binding that handles <code>action</code>. Override this with your own
193
+ method. You must override this method or the <code>bindEvents</code> method to
194
+ get this plugin to do anything. It takes a single argument, <code>event</code>,
195
+ which represents the given DOMEvent represented by <code>action</code> as passed
196
+ in by <code>jQuery.on</code>.</p>
197
+
198
+ </div>
199
+
200
+ <div class="content"><div class="highlight"><pre>perform: <span class="literal">null</span></pre></div></div>
201
+
202
+ </li>
203
+
204
+ </ul>
205
+ </div>
206
+ </body>
207
+ </html>
@@ -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
+ }