html5_layout 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +107 -0
  4. data/README.markdown +29 -0
  5. data/Rakefile +2 -0
  6. data/features/html5_layout.feature +43 -0
  7. data/features/step_definitions/common_steps.rb +37 -0
  8. data/features/step_definitions/rails_setup_steps.rb +6 -0
  9. data/features/support/env.rb +6 -0
  10. data/features/support/matchers.rb +7 -0
  11. data/html5_layout.gemspec +26 -0
  12. data/lib/generators/html5_layout/USAGE +22 -0
  13. data/lib/generators/html5_layout/html5_layout_generator.rb +40 -0
  14. data/lib/generators/html5_layout/templates/app/stylesheets/_html5_reset.sass +333 -0
  15. data/lib/generators/html5_layout/templates/app/stylesheets/_text.sass +49 -0
  16. data/lib/generators/html5_layout/templates/app/stylesheets/application.sass +63 -0
  17. data/lib/generators/html5_layout/templates/app/stylesheets/grid.sass +20 -0
  18. data/lib/generators/html5_layout/templates/app/stylesheets/handheld.sass +5 -0
  19. data/lib/generators/html5_layout/templates/config/compass.rb +17 -0
  20. data/lib/generators/html5_layout/templates/config/initializers/compass.rb +3 -0
  21. data/lib/generators/html5_layout/templates/dd_belatedpng.js +328 -0
  22. data/lib/generators/html5_layout/templates/handheld.css +7 -0
  23. data/lib/generators/html5_layout/templates/jquery-1.4.2.min.js +154 -0
  24. data/lib/generators/html5_layout/templates/layout.html.erb +58 -0
  25. data/lib/generators/html5_layout/templates/layout_helper.rb +22 -0
  26. data/lib/generators/html5_layout/templates/modernizr-1.5.min.js +28 -0
  27. data/lib/generators/html5_layout/templates/stylesheet.css +170 -0
  28. data/lib/html5_layout.rb +3 -0
  29. data/lib/html5_layout/version.rb +3 -0
  30. metadata +163 -0
@@ -0,0 +1,49 @@
1
+ $ninesixty-font-family: unquote("'Lucida Grande',Verdana,Arial,sans-serif") !default
2
+ $ninesixty-font-size: 14px !default
3
+ $ninesixty-line-height: unquote("1.4em") !default
4
+
5
+ =text($font-family: $ninesixty-font-family, $font-size: $ninesixty-font-size, $line-height: $ninesixty-line-height)
6
+ body
7
+ font: $font-size/$line-height $font-family
8
+ a:focus
9
+ outline: 1px dotted invert
10
+ hr
11
+ border-color: #cccccc
12
+ border-style: solid
13
+ border-width: 1px 0 0
14
+ clear: both
15
+ height: 0
16
+ h1
17
+ font-size: 2.4em
18
+ h2
19
+ font-size: 2.2em
20
+ h3
21
+ font-size: 2em
22
+ h4
23
+ font-size: 1.8em
24
+ h5
25
+ font-size: 1.6em
26
+ h6
27
+ font-size: 1em
28
+ ol
29
+ list-style: decimal
30
+ ul
31
+ list-style: square
32
+ li
33
+ margin-left: 30px
34
+ p,
35
+ dl,
36
+ hr,
37
+ h1,
38
+ h2,
39
+ h3,
40
+ h4,
41
+ h5,
42
+ h6,
43
+ ol,
44
+ ul,
45
+ pre,
46
+ table,
47
+ address,
48
+ fieldset
49
+ margin-bottom: 15px
@@ -0,0 +1,63 @@
1
+ @import "compass"
2
+ @import "compass/css3"
3
+ @import "html5_reset"
4
+ @import "960/grid"
5
+ @import "text"
6
+
7
+ /* App specific Custom styles */
8
+ $ninesixty-gutter-width: 12px
9
+ $ninesixty-grid-width: 960px
10
+ $ninesixty-columns: 16
11
+
12
+ $font-color: #2a2a2a
13
+ $link-color: #0388a6
14
+ $link-hover-color: #009ce0
15
+ $link-focus-color: $link-color
16
+ $link-active-color: $link-color
17
+ $link-visited-color: $link-color
18
+
19
+ +text
20
+ // +font-face("Museo 300", font-files("/fonts/Museo300-Regular.otf", opentype))
21
+ // +font-face("Museo 500", font-files("/fonts/Museo500-Regular.otf", opentype))
22
+ // +font-face("Museo 700", font-files("/fonts/Museo700-Regular.otf", opentype))
23
+
24
+ a
25
+ +link-colors($link-color, $link-hover-color, $link-focus-color, $link-active-color, $link-visited-color)
26
+ &:link, &:active
27
+ text-decoration: none
28
+ &:hover
29
+ text-decoration: underline
30
+
31
+ body
32
+ background-color: #067851
33
+ +text-shadow(rgba(0,0,0,0.3), 1px, 1px, 0px)
34
+ padding: 10px 0px
35
+
36
+ #container
37
+ +grid-container
38
+ +clearfix
39
+ background: #fff
40
+ +border-radius(8px)
41
+ #main
42
+ +grid(16)
43
+ table
44
+ tr
45
+ margin-bottom: 5px
46
+ th
47
+ font-size: 1.2em
48
+ padding-bottom: 8px
49
+ td
50
+ padding-right: 10px
51
+ padding-bottom: 5px
52
+ form
53
+ .field
54
+ margin-bottom: 5px
55
+ .actions
56
+ margin-bottom: 5px
57
+ header
58
+ +grid(16)
59
+ height: 30px
60
+ margin-bottom: 10px
61
+ footer
62
+ +grid(16)
63
+ height: 40px
@@ -0,0 +1,20 @@
1
+ /* 960 Grid System ~ Core CSS.
2
+ * Learn more ~ http://960.gs/
3
+ * *
4
+ * Licensed under GPL and MIT.
5
+
6
+ @import compass/reset
7
+ @import 960/grid
8
+
9
+ $ninesixty-columns: 16
10
+
11
+ #container
12
+ +grid-container
13
+ #header,
14
+ #footer,
15
+ #main
16
+ +grid-unit-base
17
+ #header, #footer
18
+ +grid-width(16)
19
+ #header
20
+ height: 80px
@@ -0,0 +1,5 @@
1
+ *
2
+ float: none
3
+ font-size: 80%
4
+ background: #fff
5
+ color: #000
@@ -0,0 +1,17 @@
1
+ # This configuration file works with both the Compass command line tool and within Rails.
2
+ require 'ninesixty'
3
+ # Require any additional compass plugins here.
4
+
5
+ project_type = :rails
6
+ project_path = Compass::AppIntegration::Rails.root
7
+ # Set this to the root of your project when deployed:
8
+ http_path = "/"
9
+ css_dir = "public/stylesheets"
10
+ sass_dir = "app/stylesheets"
11
+ environment = Compass::AppIntegration::Rails.env
12
+ # To enable relative paths to assets via compass helper functions. Uncomment:
13
+ # relative_assets = true
14
+ preferred_syntax = :sass
15
+ line_comments = false
16
+ # :nested, :expanded, :compact, :compressed
17
+ # output_style = :compact
@@ -0,0 +1,3 @@
1
+ require 'compass'
2
+ require 'compass/app_integration/rails'
3
+ Compass::AppIntegration::Rails.initialize!
@@ -0,0 +1,328 @@
1
+ /**
2
+ * DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
3
+ * Author: Drew Diller
4
+ * Email: drew.diller@gmail.com
5
+ * URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
6
+ * Version: 0.0.8a
7
+ * Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
8
+ *
9
+ * Example usage:
10
+ * DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
11
+ * DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
12
+ **/
13
+
14
+ /*
15
+ PLEASE READ:
16
+ Absolutely everything in this script is SILLY. I know this. IE's rendering of certain pixels doesn't make sense, so neither does this code!
17
+ */
18
+
19
+ var DD_belatedPNG = {
20
+ ns: 'DD_belatedPNG',
21
+ imgSize: {},
22
+ delay: 10,
23
+ nodesFixed: 0,
24
+ createVmlNameSpace: function () { /* enable VML */
25
+ if (document.namespaces && !document.namespaces[this.ns]) {
26
+ document.namespaces.add(this.ns, 'urn:schemas-microsoft-com:vml');
27
+ }
28
+ },
29
+ createVmlStyleSheet: function () { /* style VML, enable behaviors */
30
+ /*
31
+ Just in case lots of other developers have added
32
+ lots of other stylesheets using document.createStyleSheet
33
+ and hit the 31-limit mark, let's not use that method!
34
+ further reading: http://msdn.microsoft.com/en-us/library/ms531194(VS.85).aspx
35
+ */
36
+ var screenStyleSheet, printStyleSheet;
37
+ screenStyleSheet = document.createElement('style');
38
+ screenStyleSheet.setAttribute('media', 'screen');
39
+ document.documentElement.firstChild.insertBefore(screenStyleSheet, document.documentElement.firstChild.firstChild);
40
+ if (screenStyleSheet.styleSheet) {
41
+ screenStyleSheet = screenStyleSheet.styleSheet;
42
+ screenStyleSheet.addRule(this.ns + '\\:*', '{behavior:url(#default#VML)}');
43
+ screenStyleSheet.addRule(this.ns + '\\:shape', 'position:absolute;');
44
+ screenStyleSheet.addRule('img.' + this.ns + '_sizeFinder', 'behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;'); /* large negative top value for avoiding vertical scrollbars for large images, suggested by James O'Brien, http://www.thanatopsic.org/hendrik/ */
45
+ this.screenStyleSheet = screenStyleSheet;
46
+
47
+ /* Add a print-media stylesheet, for preventing VML artifacts from showing up in print (including preview). */
48
+ /* Thanks to Rémi Prévost for automating this! */
49
+ printStyleSheet = document.createElement('style');
50
+ printStyleSheet.setAttribute('media', 'print');
51
+ document.documentElement.firstChild.insertBefore(printStyleSheet, document.documentElement.firstChild.firstChild);
52
+ printStyleSheet = printStyleSheet.styleSheet;
53
+ printStyleSheet.addRule(this.ns + '\\:*', '{display: none !important;}');
54
+ printStyleSheet.addRule('img.' + this.ns + '_sizeFinder', '{display: none !important;}');
55
+ }
56
+ },
57
+ readPropertyChange: function () {
58
+ var el, display, v;
59
+ el = event.srcElement;
60
+ if (!el.vmlInitiated) {
61
+ return;
62
+ }
63
+ if (event.propertyName.search('background') != -1 || event.propertyName.search('border') != -1) {
64
+ DD_belatedPNG.applyVML(el);
65
+ }
66
+ if (event.propertyName == 'style.display') {
67
+ display = (el.currentStyle.display == 'none') ? 'none' : 'block';
68
+ for (v in el.vml) {
69
+ if (el.vml.hasOwnProperty(v)) {
70
+ el.vml[v].shape.style.display = display;
71
+ }
72
+ }
73
+ }
74
+ if (event.propertyName.search('filter') != -1) {
75
+ DD_belatedPNG.vmlOpacity(el);
76
+ }
77
+ },
78
+ vmlOpacity: function (el) {
79
+ if (el.currentStyle.filter.search('lpha') != -1) {
80
+ var trans = el.currentStyle.filter;
81
+ trans = parseInt(trans.substring(trans.lastIndexOf('=')+1, trans.lastIndexOf(')')), 10)/100;
82
+ el.vml.color.shape.style.filter = el.currentStyle.filter; /* complete guesswork */
83
+ el.vml.image.fill.opacity = trans; /* complete guesswork */
84
+ }
85
+ },
86
+ handlePseudoHover: function (el) {
87
+ setTimeout(function () { /* wouldn't work as intended without setTimeout */
88
+ DD_belatedPNG.applyVML(el);
89
+ }, 1);
90
+ },
91
+ /**
92
+ * This is the method to use in a document.
93
+ * @param {String} selector - REQUIRED - a CSS selector, such as '#doc .container'
94
+ **/
95
+ fix: function (selector) {
96
+ if (this.screenStyleSheet) {
97
+ var selectors, i;
98
+ selectors = selector.split(','); /* multiple selectors supported, no need for multiple calls to this anymore */
99
+ for (i=0; i<selectors.length; i++) {
100
+ this.screenStyleSheet.addRule(selectors[i], 'behavior:expression(DD_belatedPNG.fixPng(this))'); /* seems to execute the function without adding it to the stylesheet - interesting... */
101
+ }
102
+ }
103
+ },
104
+ applyVML: function (el) {
105
+ el.runtimeStyle.cssText = '';
106
+ this.vmlFill(el);
107
+ this.vmlOffsets(el);
108
+ this.vmlOpacity(el);
109
+ if (el.isImg) {
110
+ this.copyImageBorders(el);
111
+ }
112
+ },
113
+ attachHandlers: function (el) {
114
+ var self, handlers, handler, moreForAs, a, h;
115
+ self = this;
116
+ handlers = {resize: 'vmlOffsets', move: 'vmlOffsets'};
117
+ if (el.nodeName == 'A') {
118
+ moreForAs = {mouseleave: 'handlePseudoHover', mouseenter: 'handlePseudoHover', focus: 'handlePseudoHover', blur: 'handlePseudoHover'};
119
+ for (a in moreForAs) {
120
+ if (moreForAs.hasOwnProperty(a)) {
121
+ handlers[a] = moreForAs[a];
122
+ }
123
+ }
124
+ }
125
+ for (h in handlers) {
126
+ if (handlers.hasOwnProperty(h)) {
127
+ handler = function () {
128
+ self[handlers[h]](el);
129
+ };
130
+ el.attachEvent('on' + h, handler);
131
+ }
132
+ }
133
+ el.attachEvent('onpropertychange', this.readPropertyChange);
134
+ },
135
+ giveLayout: function (el) {
136
+ el.style.zoom = 1;
137
+ if (el.currentStyle.position == 'static') {
138
+ el.style.position = 'relative';
139
+ }
140
+ },
141
+ copyImageBorders: function (el) {
142
+ var styles, s;
143
+ styles = {'borderStyle':true, 'borderWidth':true, 'borderColor':true};
144
+ for (s in styles) {
145
+ if (styles.hasOwnProperty(s)) {
146
+ el.vml.color.shape.style[s] = el.currentStyle[s];
147
+ }
148
+ }
149
+ },
150
+ vmlFill: function (el) {
151
+ if (!el.currentStyle) {
152
+ return;
153
+ } else {
154
+ var elStyle, noImg, lib, v, img, imgLoaded;
155
+ elStyle = el.currentStyle;
156
+ }
157
+ for (v in el.vml) {
158
+ if (el.vml.hasOwnProperty(v)) {
159
+ el.vml[v].shape.style.zIndex = elStyle.zIndex;
160
+ }
161
+ }
162
+ el.runtimeStyle.backgroundColor = '';
163
+ el.runtimeStyle.backgroundImage = '';
164
+ noImg = true;
165
+ if (elStyle.backgroundImage != 'none' || el.isImg) {
166
+ if (!el.isImg) {
167
+ el.vmlBg = elStyle.backgroundImage;
168
+ el.vmlBg = el.vmlBg.substr(5, el.vmlBg.lastIndexOf('")')-5);
169
+ }
170
+ else {
171
+ el.vmlBg = el.src;
172
+ }
173
+ lib = this;
174
+ if (!lib.imgSize[el.vmlBg]) { /* determine size of loaded image */
175
+ img = document.createElement('img');
176
+ lib.imgSize[el.vmlBg] = img;
177
+ img.className = lib.ns + '_sizeFinder';
178
+ img.runtimeStyle.cssText = 'behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;'; /* make sure to set behavior to none to prevent accidental matching of the helper elements! */
179
+ imgLoaded = function () {
180
+ this.width = this.offsetWidth; /* weird cache-busting requirement! */
181
+ this.height = this.offsetHeight;
182
+ lib.vmlOffsets(el);
183
+ };
184
+ img.attachEvent('onload', imgLoaded);
185
+ img.src = el.vmlBg;
186
+ img.removeAttribute('width');
187
+ img.removeAttribute('height');
188
+ document.body.insertBefore(img, document.body.firstChild);
189
+ }
190
+ el.vml.image.fill.src = el.vmlBg;
191
+ noImg = false;
192
+ }
193
+ el.vml.image.fill.on = !noImg;
194
+ el.vml.image.fill.color = 'none';
195
+ el.vml.color.shape.style.backgroundColor = elStyle.backgroundColor;
196
+ el.runtimeStyle.backgroundImage = 'none';
197
+ el.runtimeStyle.backgroundColor = 'transparent';
198
+ },
199
+ /* IE can't figure out what do when the offsetLeft and the clientLeft add up to 1, and the VML ends up getting fuzzy... so we have to push/enlarge things by 1 pixel and then clip off the excess */
200
+ vmlOffsets: function (el) {
201
+ var thisStyle, size, fudge, makeVisible, bg, bgR, dC, altC, b, c, v;
202
+ thisStyle = el.currentStyle;
203
+ size = {'W':el.clientWidth+1, 'H':el.clientHeight+1, 'w':this.imgSize[el.vmlBg].width, 'h':this.imgSize[el.vmlBg].height, 'L':el.offsetLeft, 'T':el.offsetTop, 'bLW':el.clientLeft, 'bTW':el.clientTop};
204
+ fudge = (size.L + size.bLW == 1) ? 1 : 0;
205
+ /* vml shape, left, top, width, height, origin */
206
+ makeVisible = function (vml, l, t, w, h, o) {
207
+ vml.coordsize = w+','+h;
208
+ vml.coordorigin = o+','+o;
209
+ vml.path = 'm0,0l'+w+',0l'+w+','+h+'l0,'+h+' xe';
210
+ vml.style.width = w + 'px';
211
+ vml.style.height = h + 'px';
212
+ vml.style.left = l + 'px';
213
+ vml.style.top = t + 'px';
214
+ };
215
+ makeVisible(el.vml.color.shape, (size.L + (el.isImg ? 0 : size.bLW)), (size.T + (el.isImg ? 0 : size.bTW)), (size.W-1), (size.H-1), 0);
216
+ makeVisible(el.vml.image.shape, (size.L + size.bLW), (size.T + size.bTW), (size.W), (size.H), 1 );
217
+ bg = {'X':0, 'Y':0};
218
+ if (el.isImg) {
219
+ bg.X = parseInt(thisStyle.paddingLeft, 10) + 1;
220
+ bg.Y = parseInt(thisStyle.paddingTop, 10) + 1;
221
+ }
222
+ else {
223
+ for (b in bg) {
224
+ if (bg.hasOwnProperty(b)) {
225
+ this.figurePercentage(bg, size, b, thisStyle['backgroundPosition'+b]);
226
+ }
227
+ }
228
+ }
229
+ el.vml.image.fill.position = (bg.X/size.W) + ',' + (bg.Y/size.H);
230
+ bgR = thisStyle.backgroundRepeat;
231
+ dC = {'T':1, 'R':size.W+fudge, 'B':size.H, 'L':1+fudge}; /* these are defaults for repeat of any kind */
232
+ altC = { 'X': {'b1': 'L', 'b2': 'R', 'd': 'W'}, 'Y': {'b1': 'T', 'b2': 'B', 'd': 'H'} };
233
+ if (bgR != 'repeat' || el.isImg) {
234
+ c = {'T':(bg.Y), 'R':(bg.X+size.w), 'B':(bg.Y+size.h), 'L':(bg.X)}; /* these are defaults for no-repeat - clips down to the image location */
235
+ if (bgR.search('repeat-') != -1) { /* now let's revert to dC for repeat-x or repeat-y */
236
+ v = bgR.split('repeat-')[1].toUpperCase();
237
+ c[altC[v].b1] = 1;
238
+ c[altC[v].b2] = size[altC[v].d];
239
+ }
240
+ if (c.B > size.H) {
241
+ c.B = size.H;
242
+ }
243
+ el.vml.image.shape.style.clip = 'rect('+c.T+'px '+(c.R+fudge)+'px '+c.B+'px '+(c.L+fudge)+'px)';
244
+ }
245
+ else {
246
+ el.vml.image.shape.style.clip = 'rect('+dC.T+'px '+dC.R+'px '+dC.B+'px '+dC.L+'px)';
247
+ }
248
+ },
249
+ figurePercentage: function (bg, size, axis, position) {
250
+ var horizontal, fraction;
251
+ fraction = true;
252
+ horizontal = (axis == 'X');
253
+ switch(position) {
254
+ case 'left':
255
+ case 'top':
256
+ bg[axis] = 0;
257
+ break;
258
+ case 'center':
259
+ bg[axis] = 0.5;
260
+ break;
261
+ case 'right':
262
+ case 'bottom':
263
+ bg[axis] = 1;
264
+ break;
265
+ default:
266
+ if (position.search('%') != -1) {
267
+ bg[axis] = parseInt(position, 10) / 100;
268
+ }
269
+ else {
270
+ fraction = false;
271
+ }
272
+ }
273
+ bg[axis] = Math.ceil( fraction ? ( (size[horizontal?'W': 'H'] * bg[axis]) - (size[horizontal?'w': 'h'] * bg[axis]) ) : parseInt(position, 10) );
274
+ if (bg[axis] % 2 === 0) {
275
+ bg[axis]++;
276
+ }
277
+ return bg[axis];
278
+ },
279
+ fixPng: function (el) {
280
+ el.style.behavior = 'none';
281
+ var lib, els, nodeStr, v, e;
282
+ if (el.nodeName == 'BODY' || el.nodeName == 'TD' || el.nodeName == 'TR') { /* elements not supported yet */
283
+ return;
284
+ }
285
+ el.isImg = false;
286
+ if (el.nodeName == 'IMG') {
287
+ if(el.src.toLowerCase().search(/\.png$/) != -1) {
288
+ el.isImg = true;
289
+ el.style.visibility = 'hidden';
290
+ }
291
+ else {
292
+ return;
293
+ }
294
+ }
295
+ else if (el.currentStyle.backgroundImage.toLowerCase().search('.png') == -1) {
296
+ return;
297
+ }
298
+ lib = DD_belatedPNG;
299
+ el.vml = {color: {}, image: {}};
300
+ els = {shape: {}, fill: {}};
301
+ for (v in el.vml) {
302
+ if (el.vml.hasOwnProperty(v)) {
303
+ for (e in els) {
304
+ if (els.hasOwnProperty(e)) {
305
+ nodeStr = lib.ns + ':' + e;
306
+ el.vml[v][e] = document.createElement(nodeStr);
307
+ }
308
+ }
309
+ el.vml[v].shape.stroked = false;
310
+ el.vml[v].shape.appendChild(el.vml[v].fill);
311
+ el.parentNode.insertBefore(el.vml[v].shape, el);
312
+ }
313
+ }
314
+ el.vml.image.shape.fillcolor = 'none'; /* Don't show blank white shapeangle when waiting for image to load. */
315
+ el.vml.image.fill.type = 'tile'; /* Makes image show up. */
316
+ el.vml.color.fill.on = false; /* Actually going to apply vml element's style.backgroundColor, so hide the whiteness. */
317
+ lib.attachHandlers(el);
318
+ lib.giveLayout(el);
319
+ lib.giveLayout(el.offsetParent);
320
+ el.vmlInitiated = true;
321
+ lib.applyVML(el); /* Render! */
322
+ }
323
+ };
324
+ try {
325
+ document.execCommand("BackgroundImageCache", false, true); /* TredoSoft Multiple IE doesn't like this, so try{} it */
326
+ } catch(r) {}
327
+ DD_belatedPNG.createVmlNameSpace();
328
+ DD_belatedPNG.createVmlStyleSheet();