ratchet_design 0.1.10 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/ratchet/base/form.js +8 -117
  3. data/app/assets/javascripts/ratchet/base/mobilemenu.js +12 -50
  4. data/app/assets/javascripts/ratchet/base/sync-input-value.js +30 -0
  5. data/app/assets/javascripts/ratchet/core.js +55 -78
  6. data/app/assets/javascripts/ratchet/enhancement/lightbox.js +9 -8
  7. data/app/assets/javascripts/ratchet/enhancement/notice.js +8 -3
  8. data/app/assets/javascripts/ratchet/enhancement/sticky.js +18 -35
  9. data/app/assets/javascripts/ratchet/enhancement/waypoints.js +125 -162
  10. data/app/assets/javascripts/ratchet/utility/loader.js +4 -2
  11. data/app/assets/stylesheets/ratchet/_core.scss +2 -1
  12. data/app/assets/stylesheets/ratchet/base/_form.scss +4 -13
  13. data/app/assets/stylesheets/ratchet/base/_multistep-form.scss +62 -0
  14. data/app/assets/stylesheets/ratchet/utility/_global.scss +1 -10
  15. data/app/helpers/ratchet/application_helper.rb +23 -2
  16. data/app/views/layouts/ratchet/default.html.slim +2 -2
  17. data/app/views/shared/ratchet/_footer.html.slim +3 -2
  18. data/app/views/shared/ratchet/_header.html.slim +1 -1
  19. data/lib/ratchet_design/version.rb +1 -1
  20. data/public/assets/ratchet/core-0.1.11.js +133 -0
  21. data/public/assets/ratchet/core-0.1.11.js.gz +0 -0
  22. data/public/assets/ratchet/core-0.1.11.map.json +1 -0
  23. data/public/assets/ratchet/{fonts-woff-0.1.10.css → fonts-woff-0.1.11.css} +0 -0
  24. data/public/assets/ratchet/{fonts-woff-0.1.10.css.gz → fonts-woff-0.1.11.css.gz} +0 -0
  25. data/public/assets/ratchet/{fonts-woff2-0.1.10.css → fonts-woff2-0.1.11.css} +0 -0
  26. data/public/assets/ratchet/{fonts-woff2-0.1.10.css.gz → fonts-woff2-0.1.11.css.gz} +0 -0
  27. metadata +11 -23
  28. data/app/assets/javascripts/ratchet/base/validation.js +0 -263
  29. data/app/assets/javascripts/ratchet/shim/classlist.js +0 -234
  30. data/app/assets/javascripts/ratchet/shim/object.assign.js +0 -30
  31. data/app/assets/javascripts/ratchet/utility/compile_data.js +0 -40
  32. data/app/assets/javascripts/ratchet/utility/from_top.js +0 -14
  33. data/app/assets/javascripts/ratchet/utility/full_stop.js +0 -55
  34. data/app/assets/javascripts/ratchet/utility/get_closest.js +0 -20
  35. data/app/assets/javascripts/ratchet/utility/get_next.js +0 -17
  36. data/app/assets/javascripts/ratchet/utility/matches.js +0 -15
  37. data/app/assets/javascripts/ratchet/utility/scroll_to.js +0 -74
  38. data/app/assets/javascripts/ratchet/utility/throttle.js +0 -25
  39. data/app/assets/javascripts/ratchet/utility/timeout.js +0 -45
  40. data/app/assets/javascripts/ratchet/utility/unhover.js +0 -56
  41. data/app/assets/javascripts/ratchet/utility/word_count.js +0 -15
  42. data/public/assets/ratchet/core-0.1.10.js +0 -115
  43. data/public/assets/ratchet/core-0.1.10.js.gz +0 -0
  44. data/public/assets/ratchet/core-0.1.10.map.json +0 -1
@@ -6,129 +6,93 @@
6
6
  **/
7
7
 
8
8
  // Dependencies
9
- var matches = require( '../utility/matches' ),
10
- fromTop = require( '../utility/from_top' ),
11
- scrollTo = require( '../utility/scroll_to' ),
12
- getClosest = require( '../utility/get_closest' ),
13
- throttle = require( '../utility/throttle' );
9
+ var toolbox = require( 'compose-toolbox' ),
10
+ Event = toolbox.event,
11
+ matches = toolbox.matches,
12
+ fromTop = toolbox.fromTop,
13
+ scrollTo = toolbox.scrollTo,
14
+ getClosest = toolbox.getClosest,
15
+ callback = Event.callback;
14
16
 
15
17
  // Public API function
16
- var waypoints = function( elements, settings ) {
18
+ var waypoints = function( settings ) {
17
19
 
18
20
  // Overridable defaults
19
21
  var defaults = {
20
- initWidth : '700px',
21
- activeAnchor : 'active',
22
- elemOffset : 0,
23
- showLandmarks : false,
24
- landmarkSelector : '.landmark',
25
- activeLandmark : 'pinned',
26
- };
27
-
28
- // Scoped variables
29
- var options = Object.assign( {}, defaults, settings ),
30
- selectors = document.querySelectorAll( elements );
31
-
32
- // If selectors are not present
33
- if ( !selectors.length ) {
34
-
35
- // Abort
36
- return false;
37
-
38
- // Otherwise attach listeners
39
- } else {
22
+ initWidth : '0px',
23
+ elemOffset : 0
24
+ }
40
25
 
41
- // Scoped variables
42
- var initWidth = options.initWidth ? options.initWidth : '0px',
43
- widthQuery = window.matchMedia( '(min-width: ' + initWidth + ')' ),
44
- docBody = document.body,
45
- coordinates = [],
46
- oldActiveItem,
47
- windowHash,
48
- docHeight,
49
- winHeight;
26
+ function slice( obj, count ) {
27
+ return Array.prototype.slice.call( obj, count )
28
+ }
50
29
 
51
- // If hash is present
52
- if ( window.location.hash ) {
30
+ // Scoped variables
31
+ var options = toolbox.merge( defaults, settings ),
32
+ activeAnchor = 'active',
33
+ landmarkSelector = 'dl',
34
+ activeLandmark = 'pinned',
35
+ nav = document.querySelector('.waypoint-nav'),
36
+ elements = [];
53
37
 
54
- // Cache it
55
- windowHash = window.location.hash.replace( '#', '' );
38
+ if ( nav ) slice( nav.querySelectorAll( "a[href^='#']" ) ).forEach( function( el ) {
56
39
 
57
- // Then delete it to prevent default page scroll
58
- window.location.hash = '';
40
+ // Find all elements matching links in the waypoints nav
41
+ var section = document.querySelector( el.getAttribute('href') )
59
42
 
60
- // And replace it
61
- history.replaceState( null, '', '#' + windowHash );
43
+ // If found, add them to the elements list
44
+ if ( section ) elements.push( section )
62
45
 
63
- }
46
+ })
64
47
 
65
- // Resize throttle function init
66
- throttle( 'resize', 'optimizedResize' );
48
+ if ( !nav || elements.length < 1 ) { return false }
67
49
 
68
- // Scroll throttle function init
69
- throttle( 'scroll', 'optimizedScroll' );
50
+ // Scoped variables
51
+ var docBody = document.body,
52
+ coordinates = [],
53
+ oldActiveItem,
54
+ windowHash,
55
+ docHeight,
56
+ winHeight;
70
57
 
71
- // Only run once the window is loaded
72
- window.addEventListener( 'load', function() {
58
+ // If hash is present
59
+ if ( window.location.hash ) {
73
60
 
74
- // Call listener function explicitly at run time
75
- queryHandler( widthQuery );
61
+ // Cache it
62
+ windowHash = window.location.hash.replace( '#', '' );
76
63
 
77
- // Attach listener function to listen in on state changes
78
- widthQuery.addListener( queryHandler );
64
+ // Then delete it to prevent default page scroll
65
+ window.location.hash = '';
79
66
 
80
- }, false );
67
+ // And replace it
68
+ history.replaceState( null, '', '#' + windowHash );
81
69
 
82
70
  }
83
71
 
84
- // Media query handler function
85
- function queryHandler( condition ) {
86
-
87
- // If media query matches
88
- if ( condition.matches ) {
72
+ // Only run once the window is loaded
73
+ Event.on( window, 'load', function() {
89
74
 
90
- // Call resize listener function explicitly at run time
91
- resizeHandler();
75
+ // Media query handler function
76
+ Event.media.minWidth( options.initWidth, function( condition ) {
92
77
 
93
- // Resize throttle function init
94
- window.addEventListener( 'optimizedResize', resizeHandler, false );
78
+ // Set up resize listener
79
+ resize.toggle( condition.matches )
80
+ resize()
95
81
 
96
- // Call scroll listener function explicitly at run time
97
- scrollHandler();
82
+ // Set up scroll listener
83
+ scroll.toggle( condition.matches )
84
+ scroll()
85
+
86
+ // Set up hash change listener
87
+ hashChange.toggle( condition.matches )
88
+ hashChange()
98
89
 
99
- // Scroll function listener
100
- window.addEventListener( 'optimizedScroll', scrollHandler, false );
90
+ })
101
91
 
102
- // Click function listener
103
- docBody.addEventListener( 'click', clickHandler, false );
104
-
105
- // Call hash change listener function explicitly at run time
106
- hashHandler();
107
-
108
- // Hash change function listener
109
- window.addEventListener( 'hashchange', hashHandler, false );
110
-
111
- // Otherwise…
112
- } else {
113
-
114
- // Remove resize listener
115
- window.removeEventListener( 'optimizedResize', resizeHandler, false );
116
-
117
- // Remove scroll listener
118
- window.removeEventListener( 'optimizedScroll', scrollHandler, false );
119
-
120
- // Remove click listener
121
- docBody.removeEventListener( 'click', clickHandler, false );
122
-
123
- // Remove hash change listener
124
- window.removeEventListener( 'hashchange', hashHandler, false );
125
-
126
- }
127
-
128
- }
92
+ })
129
93
 
130
94
  // Resize handler function
131
- function resizeHandler() {
95
+ var resize = callback.new( function() {
132
96
 
133
97
  // Update document height variable
134
98
  docHeight = docBody.scrollHeight;
@@ -137,23 +101,22 @@ var waypoints = function( elements, settings ) {
137
101
  winHeight = window.innerHeight;
138
102
 
139
103
  // Loop through waypoints
140
- for ( var i = 0; i < selectors.length; i++ ) {
141
-
142
- // Construct coordinate object
143
- var coordinate = {
144
- elem : selectors[ i ],
145
- offset : fromTop( selectors[ i ] )
146
- };
104
+ setCoordinates()
147
105
 
148
- // And update coordinates array
149
- coordinates[ i ] = coordinate;
150
-
151
- }
106
+ })
152
107
 
108
+ // Store coordinates to elements
109
+ var setCoordinates = function() {
110
+ elements.forEach( function( element, i ) {
111
+ coordinates[ i ] = {
112
+ elem : elements[ i ],
113
+ offset : fromTop( elements[ i ] )
114
+ }
115
+ })
153
116
  }
154
117
 
155
118
  // Scroll handler function
156
- function scrollHandler() {
119
+ var scroll = callback.new( function() {
157
120
 
158
121
  // Scoped variables
159
122
  var newScrollY = window.pageYOffset,
@@ -163,11 +126,10 @@ var waypoints = function( elements, settings ) {
163
126
  landmark;
164
127
 
165
128
  // Loop through coordinates
166
- for ( var i = 0; i < coordinates.length; i++ ) {
129
+ coordinates.forEach( function( currWaypoint, i ) {
167
130
 
168
131
  // Scoped variables
169
132
  var firstWaypoint = coordinates[ 0 ],
170
- currWaypoint = coordinates[ i ],
171
133
  nextWaypoint = coordinates[ i + 1 ],
172
134
  lastWaypoint = coordinates[ coordinates.length - 1 ];
173
135
 
@@ -191,76 +153,65 @@ var waypoints = function( elements, settings ) {
191
153
 
192
154
  }
193
155
 
194
- }
156
+ })
195
157
 
196
158
  // If active item exists
197
159
  if ( newActiveItem ) {
198
160
 
199
161
  // Only run when new active item is triggered
200
- if ( newActiveItem === oldActiveItem ) return false;
162
+ if ( newActiveItem === oldActiveItem ) return false
201
163
 
202
164
  // Update active link
203
- activeLink = docBody.querySelector( 'a[href="#' + newActiveItem + '"]' );
165
+ activeLink = nav.querySelector( 'a[href="#' + newActiveItem + '"]' )
204
166
 
205
167
  // If no active link is found, abort
206
- if ( !activeLink ) return false;
168
+ if ( !activeLink ) return false
207
169
 
208
170
  // And enable navigation item
209
- activate( activeLink, options.activeAnchor );
210
-
211
- // If landmarks are turned on
212
- if ( options.showLandmarks === true ) {
213
-
214
- // Set active landmark to active link’s parent
215
- landmark = getClosest( activeLink, options.landmarkSelector );
216
-
217
- // Enable active landmark
218
- activate( landmark, options.activeLandmark );
219
-
220
- }
171
+ activateLink( activeLink )
221
172
 
222
173
  // Update old active item variable
223
- oldActiveItem = newActiveItem;
174
+ oldActiveItem = newActiveItem
224
175
 
225
176
  }
226
177
 
227
- }
178
+ })
228
179
 
229
180
  // Click handler function
230
- function clickHandler( event ) {
181
+ var click = callback.new( function( event ) {
231
182
 
232
183
  // Matches selector function init
233
184
  if ( matches( event.target, 'a[href^="#"]' ) ) {
234
185
 
235
186
  // Prevent default behavior
236
- event.preventDefault();
187
+ event.preventDefault()
237
188
 
238
189
  // Travel to clicked target
239
- travel( event.target, 'click' );
190
+ travel( event.target, true )
240
191
 
241
192
  }
242
- }
193
+ })
243
194
 
244
195
  // Hash change handler function
245
- function hashHandler() {
196
+ var hashChange = callback.new( function() {
246
197
 
247
198
  // Only run when a hash is present
248
- if ( !window.location.hash ) return false;
199
+ if ( !window.location.hash ) return false
249
200
 
250
201
  // Find the hash’s relevant navigation item
251
- var hashAnchor = document.querySelector( 'a[href="' + window.location.hash + '"]' );
202
+ var hashAnchor = document.querySelector( 'a[href="' + window.location.hash + '"]' )
252
203
 
253
204
  // And travel to its target
254
- travel( hashAnchor, 'hash' );
205
+ travel( hashAnchor )
255
206
 
256
- }
207
+ })
257
208
 
258
209
  // Window scroll travel function
259
- function travel( destination, trigger ) {
210
+ var travel = function( destination, animateScroll ) {
260
211
 
261
212
  // Define scoped variable(s)
262
- var targetAnchor = destination.href.split( '#' )[ 1 ],
263
- targetElement = document.querySelector( '#' + targetAnchor ),
213
+ var targetAnchor = destination.getAttribute('href'),
214
+ targetElement = document.querySelector( targetAnchor ),
264
215
  targetOffset,
265
216
  travelTime;
266
217
 
@@ -268,10 +219,10 @@ var waypoints = function( elements, settings ) {
268
219
  if ( targetElement ) {
269
220
 
270
221
  // Enable new active navigation item
271
- activate( destination, options.activeAnchor );
222
+ activateLink( destination, activeAnchor )
272
223
 
273
224
  // Loop through coordinates
274
- for ( var i = 0; i < coordinates.length; i++ ) {
225
+ coordinates.forEach( function( current, i ) {
275
226
 
276
227
  // If coordinate element matches target element
277
228
  if ( coordinates[ i ].elem === targetElement ) {
@@ -279,49 +230,61 @@ var waypoints = function( elements, settings ) {
279
230
  // Assign its coordinates to target offset variable
280
231
  targetOffset = coordinates[ i ].offset;
281
232
  }
282
- }
233
+ })
283
234
 
284
235
  // If trigger was a click
285
- if ( trigger === 'click' ) {
236
+ if ( animateScroll ) {
286
237
 
287
238
  // Temporarily remove scroll listener function
288
- window.removeEventListener( 'optimizedScroll', scrollHandler, false );
239
+ scroll.stop()
289
240
 
290
241
  // Update the hash
291
- history.pushState( null, '', '#' + targetAnchor );
292
-
293
- // Animate scroll to appropriate element
294
- scrollTo( targetOffset - options.elemOffset + 1, function() {
295
-
296
- // Once scroll is complete, enable scroll listener
297
- window.addEventListener( 'optimizedScroll', scrollHandler, false );
242
+ history.pushState( null, '', targetAnchor );
298
243
 
299
- });
244
+ // Animate scroll to appropriate element then renable scroll listener
245
+ scrollTo( targetElement, scroll.start )
300
246
 
301
- // Otherwise if trigger was a hash
302
- } else if ( trigger === 'hash' ) {
247
+ } else {
303
248
 
304
249
  // Skip the scroll animation
305
- window.scrollTo( 0, targetOffset - options.elemOffset + 1 );
250
+ window.scrollTo( 0, fromTop( targetElement ) );
306
251
 
307
252
  }
308
253
  }
309
254
  }
310
255
 
311
- // Link activation function
312
- function activate( selector, cls ) {
256
+ function activate( el, classname ) {
313
257
 
314
258
  // Find currently active link
315
- var activeLink = docBody.querySelector( '.' + cls );
259
+ var activeEl = nav.querySelector( '.' + classname )
260
+
261
+ if ( activeEl == el ) return
316
262
 
317
- // And if it exists, disable it
318
- if ( activeLink ) activeLink.classList.remove( cls );
263
+ // remove active class from existing element
264
+ if ( activeEl ) activeEl.classList.remove( classname )
319
265
 
320
266
  // Then enable the passed selector
321
- selector.classList.add( cls );
267
+ el.classList.add( classname )
268
+
269
+ }
270
+
271
+ // Link activation function
272
+ function activateLink( el ) {
273
+ activate( el, activeAnchor )
322
274
 
275
+ // Set active landmark to active link’s parent
276
+ activateLandmark( getClosest( el, landmarkSelector ) )
323
277
  }
324
278
 
279
+ function activateLandmark( el ) {
280
+ if ( el ) activate( el, activeLandmark )
281
+ }
282
+
283
+ Event.resize.stop( resize )
284
+ Event.scroll( scroll )
285
+ Event.on( document, 'click', click )
286
+ Event.on( window, 'hashchange', hashChange )
287
+
325
288
  };
326
289
 
327
290
  // Public API
@@ -5,6 +5,8 @@
5
5
  * @license MIT
6
6
  **/
7
7
 
8
+ var toolbox = require( 'compose-toolbox' )
9
+
8
10
  // Public API function
9
11
  var loader = function( settings ) {
10
12
 
@@ -21,7 +23,7 @@ var loader = function( settings ) {
21
23
  };
22
24
 
23
25
  // Extend defaults
24
- var options = Object.assign( {}, defaults, settings );
26
+ var options = toolbox.merge( defaults, settings );
25
27
 
26
28
  // If it doesn’t already exist
27
29
  if ( !document.querySelector( 'div.' + options.loaderClass ) ) {
@@ -79,4 +81,4 @@ var loader = function( settings ) {
79
81
  };
80
82
 
81
83
  // Public API
82
- module.exports = loader;
84
+ module.exports = loader;
@@ -9,6 +9,7 @@
9
9
  @import 'base/button';
10
10
  @import 'base/media';
11
11
  @import 'base/form';
12
+ @import 'base/multistep-form';
12
13
  @import 'base/table';
13
14
  @import 'base/document';
14
15
 
@@ -19,4 +20,4 @@
19
20
  @import 'enhancement/hero';
20
21
  @import 'enhancement/contrast-section';
21
22
  @import 'enhancement/tooltip';
22
- @import 'enhancement/lightbox';
23
+ @import 'enhancement/lightbox';
@@ -63,11 +63,6 @@ $text-inputs: 'textarea, input[type=url], input[type=tel], input[type=text], inp
63
63
  textarea,
64
64
  #{$text-inputs} {
65
65
 
66
- // Active state
67
- + span {
68
- @extend %active;
69
- }
70
-
71
66
  // Non-required active color
72
67
  &:not(:required):focus + span,
73
68
  &:not(:required):active + span {
@@ -86,11 +81,6 @@ $text-inputs: 'textarea, input[type=url], input[type=tel], input[type=text], inp
86
81
  textarea,
87
82
  #{$text-inputs} {
88
83
 
89
- // Active state
90
- + span {
91
- @extend %active;
92
- }
93
-
94
84
  // Non-required active color
95
85
  &:not(:required):focus + span,
96
86
  &:not(:required):active + span {
@@ -149,9 +139,10 @@ $text-inputs: 'textarea, input[type=url], input[type=tel], input[type=text], inp
149
139
  transform .2s;
150
140
  }
151
141
 
152
- // Move labels out of the way on focus
142
+ // Move labels out of the way on focus and empty
153
143
  &:focus + span,
154
- &:active + span {
144
+ &:active + span,
145
+ &:not([value=""]) + span, {
155
146
  @extend %active;
156
147
  }
157
148
  }
@@ -540,7 +531,7 @@ button[type=submit] {
540
531
  * ------------------------------------- */
541
532
 
542
533
  // Apply validation styles to inputs & textareas
543
- textarea, #{$text-inputs} {
534
+ textarea, #{$text-inputs}, select {
544
535
 
545
536
  // Strip default styling
546
537
  &:invalid {
@@ -0,0 +1,62 @@
1
+ fieldset.form-step {
2
+ left: 0;
3
+ right: 0;
4
+
5
+ &[disabled] {
6
+ display: none;
7
+ }
8
+
9
+
10
+ // Transition to form step
11
+ &.arrived { animation: fade-in-right .5s forwards; }
12
+
13
+ // Revisit form step
14
+ &.revisted, &.step-visited.arrived { animation: .5s fade-in-left forwards; }
15
+
16
+ // Transition away from form step
17
+ &.departed { animation: fade-out-left .5s forwards; }
18
+ }
19
+
20
+ // Transition to form step
21
+ @keyframes fade-in-right {
22
+ 0% {
23
+ opacity: 0;
24
+ transform: perspective(1px) translate3d(200px, 0, 0);
25
+ }
26
+
27
+ 100% {
28
+ opacity: 1;
29
+ transform: perspective(1px) translate3d(0, 0, 0);
30
+ }
31
+ }
32
+
33
+ // Transition away from form step
34
+ @keyframes fade-out-left {
35
+ 0% {
36
+ opacity: 1;
37
+ transform: perspective(1px) translate3d(0, 0, 0);
38
+ }
39
+
40
+ 99% {
41
+ opacity: 0;
42
+ transform: perspective(1px) translate3d(-200px, 0, 0);
43
+ }
44
+
45
+ 100% {
46
+ opacity: 0;
47
+ transform: perspective(1px) translate3d(-9999px, 0, 0);
48
+ }
49
+ }
50
+
51
+ // Return to previous form step
52
+ @keyframes fade-in-left {
53
+ 0% {
54
+ opacity: 0;
55
+ transform: perspective(1px) translate3d(-200px, 0, 0);
56
+ }
57
+
58
+ 100% {
59
+ opacity: 1;
60
+ transform: perspective(1px) translate3d(0, 0, 0);
61
+ }
62
+ }
@@ -96,15 +96,6 @@ $mono-font: 'Nitti', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
96
96
  // Transition duration
97
97
  $duration: .2s;
98
98
 
99
- // Class to prevent transitions
100
- .no-transitions * {
101
- &,
102
- &:after,
103
- &:before {
104
- transition: none !important;
105
- }
106
- }
107
-
108
99
  /* ===================================== *
109
100
  * iv. Layout
110
101
  * ------------------------------------- */
@@ -251,4 +242,4 @@ $content-padding: vr(2); // 30px
251
242
  // Visually shown placeholder
252
243
  %shown {
253
244
  @include shown;
254
- }
245
+ }
@@ -21,6 +21,11 @@ module Ratchet
21
21
  content_for :blank, &block
22
22
  end
23
23
 
24
+ # Blank slate layout
25
+ def footer(&block)
26
+ content_for :footer, &block
27
+ end
28
+
24
29
  # Set custom page title
25
30
  def title(title = nil)
26
31
  title ? content_for(:title) { title + " | " + Site.name } : content_for(:title).presence
@@ -42,9 +47,25 @@ module Ratchet
42
47
  end
43
48
 
44
49
  # Consolidated page class output
45
- def page_classes
46
- request.path_parameters[:page].split("/").last + (selector ? " #{selector}" : "")
50
+ def page_class( classnames = nil )
51
+ if ( classnames )
52
+ @page_classes ||= ''
53
+ @page_classes = @page_classes + ' ' + classnames
54
+ @page_classes.strip!
55
+ else
56
+ @page_classes || ''
57
+ end
47
58
  end
48
59
 
60
+ # Consolidated page class output
61
+ def main_class( classnames = nil )
62
+ if ( classnames )
63
+ @main_classes ||= ''
64
+ @main_classes = @main_classes + ' ' + classnames
65
+ @main_classes.strip!
66
+ else
67
+ @main_classes || ''
68
+ end
69
+ end
49
70
  end
50
71
  end
@@ -41,7 +41,7 @@ html
41
41
  / Head
42
42
  = yield :head
43
43
 
44
- body class="#{page_classes}"
44
+ body class=page_class
45
45
 
46
46
  / Icon inclusion
47
47
  = render "shared/ratchet/icons"
@@ -56,7 +56,7 @@ html
56
56
  = render "shared/ratchet/header"
57
57
 
58
58
  / Document main
59
- main role="main"= yield
59
+ main class=main_class role="main"= yield
60
60
 
61
61
  / Document footer
62
62
  = render "shared/ratchet/footer"
@@ -1,2 +1,3 @@
1
- footer role="contentinfo"
2
- p &copy; #{Time.now.year} #{Site.name}
1
+ - if content_for?(:footer)
2
+ footer role="contentinfo"
3
+ = yield :footer
@@ -11,5 +11,5 @@ header role="banner"
11
11
  button.mobile-menu-button
12
12
 
13
13
  / Main site navigation
14
- nav role="navigation"
14
+ nav.main-nav role="navigation"
15
15
  = yield :top_nav
@@ -1,3 +1,3 @@
1
1
  module RatchetDesign
2
- VERSION = "0.1.10"
2
+ VERSION = "0.1.11"
3
3
  end