From 81b57ac387915769f463afd40543ed7e659d8962 Mon Sep 17 00:00:00 2001 From: Michael Sheedy Date: Thu, 6 Feb 2014 09:07:48 -0500 Subject: [PATCH 1/8] Initial commit --- .bowerrc | 3 + .editorconfig | 9 + .gitignore | 45 +++ .project/images/compass-logo.png | Bin 0 -> 3558 bytes .project/images/grunt-logo.png | Bin 0 -> 81790 bytes Gruntfile.js | 38 +++ README.md | 117 ++++++++ bower.json | 11 + config/csscomb.json | 318 +++++++++++++++++++++ config/csslintrc.csslintrc | 38 +++ config/jshintrc.jshintrc | 16 ++ config/prettifyrc.prettifyrc | 14 + docs/how-to-use.md | 32 +++ docs/install.md | 58 ++++ package.json | 54 ++++ src/css/_project/dib/_iframe.scss | 41 +++ src/css/base/_accessibility.scss | 23 ++ src/css/base/_global.scss | 37 +++ src/css/base/_header.scss | 5 + src/css/base/_list.scss | 5 + src/css/base/_table.scss | 5 + src/css/base/_typography.scss | 75 +++++ src/css/base/forms/_checkbox.scss | 5 + src/css/base/forms/_form.scss | 5 + src/css/base/forms/_input.scss | 5 + src/css/base/forms/_label.scss | 5 + src/css/base/forms/_multiselect-box.scss | 5 + src/css/base/forms/_radio.scss | 5 + src/css/base/forms/_select.scss | 5 + src/css/base/forms/_textarea.scss | 5 + src/css/generic/_clearfix.scss | 15 + src/css/generic/_shame.scss | 0 src/css/generic/_state.scss | 19 ++ src/css/objects/_box.scss | 9 + src/css/objects/_button.scss | 53 ++++ src/css/objects/_grid.scss | 83 ++++++ src/css/objects/_tabs.scss | 25 ++ src/css/project.scss | 21 ++ src/css/styles.scss | 1 + src/css/utilities/_config.scss | 83 ++++++ src/css/utilities/_mixins.scss | 101 +++++++ src/css/utilities/_variables.scss | 128 +++++++++ src/data/data.json | 41 +++ src/data/test-data.json | 25 ++ src/favicon.ico | Bin 0 -> 1150 bytes src/images/svg-build/grunticon.loader.txt | 2 + src/images/svg-build/icons.data.png.css | 2 + src/images/svg-build/icons.data.svg.css | 2 + src/images/svg-build/icons.fallback.css | 2 + src/images/svg-build/png/icon-settings.png | Bin 0 -> 9493 bytes src/images/svg-build/preview.html | 26 ++ src/images/svg/icon-settings.svg | 19 ++ src/js/script.js | 3 + src/templates/layouts/custom.hbs | 19 ++ src/templates/layouts/default.hbs | 19 ++ src/templates/layouts/rwd.hbs | 19 ++ src/templates/pages/index.hbs | 6 + src/templates/pages/proj-rwd/index.hbs | 11 + src/templates/pages/subdir/page.hbs | 10 + src/templates/partials/_footer-subpage.hbs | 10 + src/templates/partials/_footer.hbs | 10 + src/templates/partials/_head-subpage.hbs | 14 + src/templates/partials/_head.hbs | 10 + tasks/build.js | 23 ++ tasks/options/arialinter.js | 14 + tasks/options/assemble.js | 33 +++ tasks/options/clean.js | 18 ++ tasks/options/coffee.js | 25 ++ tasks/options/compass.js | 20 ++ tasks/options/concat.js | 15 + tasks/options/concurrent.js | 21 ++ tasks/options/connect.js | 51 ++++ tasks/options/copy.js | 104 +++++++ tasks/options/cssc.js | 24 ++ tasks/options/csscomb.js | 17 ++ tasks/options/csslint.js | 33 +++ tasks/options/grunticon.js | 17 ++ tasks/options/htmlhint.js | 36 +++ tasks/options/htmlmin.js | 27 ++ tasks/options/imagemin.js | 23 ++ tasks/options/jshint.js | 17 ++ tasks/options/libsass.js | 22 ++ tasks/options/open.js | 13 + tasks/options/prettify.js | 22 ++ tasks/options/replace.js | 17 ++ tasks/options/rev.js | 16 ++ tasks/options/sass.js | 33 +++ tasks/options/shell.js | 25 ++ tasks/options/uglify.js | 10 + tasks/options/usemin.js | 14 + tasks/options/useminPrepare.js | 38 +++ tasks/options/watch.js | 61 ++++ tasks/server.js | 26 ++ tasks/test.js | 12 + 94 files changed, 2599 insertions(+) create mode 100644 .bowerrc create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .project/images/compass-logo.png create mode 100644 .project/images/grunt-logo.png create mode 100644 Gruntfile.js create mode 100644 README.md create mode 100644 bower.json create mode 100644 config/csscomb.json create mode 100644 config/csslintrc.csslintrc create mode 100644 config/jshintrc.jshintrc create mode 100644 config/prettifyrc.prettifyrc create mode 100644 docs/how-to-use.md create mode 100644 docs/install.md create mode 100644 package.json create mode 100644 src/css/_project/dib/_iframe.scss create mode 100644 src/css/base/_accessibility.scss create mode 100644 src/css/base/_global.scss create mode 100644 src/css/base/_header.scss create mode 100644 src/css/base/_list.scss create mode 100644 src/css/base/_table.scss create mode 100644 src/css/base/_typography.scss create mode 100644 src/css/base/forms/_checkbox.scss create mode 100644 src/css/base/forms/_form.scss create mode 100644 src/css/base/forms/_input.scss create mode 100644 src/css/base/forms/_label.scss create mode 100644 src/css/base/forms/_multiselect-box.scss create mode 100644 src/css/base/forms/_radio.scss create mode 100644 src/css/base/forms/_select.scss create mode 100644 src/css/base/forms/_textarea.scss create mode 100644 src/css/generic/_clearfix.scss create mode 100644 src/css/generic/_shame.scss create mode 100644 src/css/generic/_state.scss create mode 100644 src/css/objects/_box.scss create mode 100644 src/css/objects/_button.scss create mode 100644 src/css/objects/_grid.scss create mode 100644 src/css/objects/_tabs.scss create mode 100644 src/css/project.scss create mode 100644 src/css/styles.scss create mode 100644 src/css/utilities/_config.scss create mode 100644 src/css/utilities/_mixins.scss create mode 100755 src/css/utilities/_variables.scss create mode 100644 src/data/data.json create mode 100644 src/data/test-data.json create mode 100644 src/favicon.ico create mode 100644 src/images/svg-build/grunticon.loader.txt create mode 100644 src/images/svg-build/icons.data.png.css create mode 100644 src/images/svg-build/icons.data.svg.css create mode 100644 src/images/svg-build/icons.fallback.css create mode 100644 src/images/svg-build/png/icon-settings.png create mode 100644 src/images/svg-build/preview.html create mode 100644 src/images/svg/icon-settings.svg create mode 100644 src/js/script.js create mode 100644 src/templates/layouts/custom.hbs create mode 100644 src/templates/layouts/default.hbs create mode 100644 src/templates/layouts/rwd.hbs create mode 100644 src/templates/pages/index.hbs create mode 100644 src/templates/pages/proj-rwd/index.hbs create mode 100644 src/templates/pages/subdir/page.hbs create mode 100644 src/templates/partials/_footer-subpage.hbs create mode 100644 src/templates/partials/_footer.hbs create mode 100644 src/templates/partials/_head-subpage.hbs create mode 100644 src/templates/partials/_head.hbs create mode 100644 tasks/build.js create mode 100644 tasks/options/arialinter.js create mode 100644 tasks/options/assemble.js create mode 100644 tasks/options/clean.js create mode 100644 tasks/options/coffee.js create mode 100644 tasks/options/compass.js create mode 100644 tasks/options/concat.js create mode 100644 tasks/options/concurrent.js create mode 100644 tasks/options/connect.js create mode 100644 tasks/options/copy.js create mode 100644 tasks/options/cssc.js create mode 100644 tasks/options/csscomb.js create mode 100644 tasks/options/csslint.js create mode 100644 tasks/options/grunticon.js create mode 100644 tasks/options/htmlhint.js create mode 100644 tasks/options/htmlmin.js create mode 100644 tasks/options/imagemin.js create mode 100644 tasks/options/jshint.js create mode 100644 tasks/options/libsass.js create mode 100644 tasks/options/open.js create mode 100644 tasks/options/prettify.js create mode 100644 tasks/options/replace.js create mode 100644 tasks/options/rev.js create mode 100644 tasks/options/sass.js create mode 100644 tasks/options/shell.js create mode 100644 tasks/options/uglify.js create mode 100644 tasks/options/usemin.js create mode 100644 tasks/options/useminPrepare.js create mode 100644 tasks/options/watch.js create mode 100644 tasks/server.js create mode 100644 tasks/test.js diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..5341cde --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "src/bower_components" +} \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7d94f70 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +# editorconfig.org +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f6562d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +*.orig + +# Sublime Text# +############### +*.sublime-* + +# Miscellaneous # +################# +.allow-devtools-edit +.sass-cache/ + +# Project # +########### +.tmp +/.ignored/ +/node_modules/ +/src/bower_components/ +/build diff --git a/.project/images/compass-logo.png b/.project/images/compass-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..963ab6f244091b162e2f77fcdc02107769d4f6ec GIT binary patch literal 3558 zcmaJ^dpy&7A19YnLR3x&tw}CpGuLe_VPY7P%g}M%tYNmcVN@bVx*$;G{20zu))!`Mlom_viZ0@4B6hxtNHo2p=Dx7}^45 z&pQow-rd5yFJfbW$~$D}W?1?evM)Wvi;Cwn#*w}805r*qfVanc;X=>1;&}`KMWO?i zj>T9be8?oQ*A52EAW?X1o|qAX;^pIyrvtq41Y#f(xL8#O1Q2mZptCMU6GJh@pCej? zQSoQOY#e;T{C(g!pwS6{Ap^k^AmQm=00t=_kcMC&fq&^Dc=sJQ1PJ&GLia}k|D6;T zV+SxLQ}F;@u&#!WCR7KY4+leap*k?AIzUSkstwW9hCsD7pjrq`I0C8*`1=9!qET_a z2z%72zhm(%B=8)aPC-B*At52)5N$A-N`OG&a5zL$3!V4<(WQ zLDT5=`2XblKZR)yp%gsC9#10&QGIxW^HtmlMM0QS@m_Q?)qzY7_|ZkXb7VT1c8*K| zn3@7qFkU{yz#UulF9HUGKnK$3UV%P%GztmiNq~t&90F=)3`6Pa!}W~ypiropHe3&G zYGQ)oIrLF*eO8CKJF-A{p+Dzab`2SYA4xi-8j&Gj*)Ucj7?U+zkMFb_%I#)wm*xy37F6;8-H~@L+1?DvekN3PF|V;zlC)`s-TstiHkGjJncAC^ z(NZ(tWdpb^SHwS->iLf1q|%4vT{8;f%}%Xx*>sbrGRMsLNS4@2*Gn^t^ESDKWl1n> zuU1OfY-JwH-CY}HyQlc_TAYC;3&^o*J1T=KVB3(Q(o39XQWymu8}`D<+`?VaN#DZm z#`;P2jHuWso=+CPnOgSkkG9W;U}fOERoQyk-u=2?vybtEqI9J*3FZ~SJ>hjAO_f9A z(FZVZ_4N8$2H%<2&Vu|;DJ+6w1gi&6XMqlNKBiB87&Xd24N4^Sm~a#3^-t{A6P0q8 zFphH_RZAjW{nahCe*1*zptk?3@Uf-*X-1vJJSW9BPQB#U7u_e9SYgRs!~X2E%L$XN zJvqhua7Sj!_ra!*&ZiB1uD#g93~yF#vZJ$ar6tFKH+9xn3>@cTic^1Wl)+v zDbhCaT}loqZT^;N)tFU6&`!o=dIcnYhO-NRh6b~Yhf`AXbn&1%r{6*XJN_KMgw7jo zvs0?>GR~TER7GkP6ngzKg$AFuT=IL1n|be^!^c?k=1gl>Jms{~<%C4C8pY9uE8(7K z;??C37T1OPT5cM?U(0MozZ$Ly{(W&7$?RLLYVQ65mwO#|bgO8tm#o1YbzqN(PYS1) zCmg)B=K8jJApN(ufzLa~zq!yiZ||#uEr{j|olQ$YyA(n5=tJx8jh;@b?W?nM2u`_6 zs#Ld97$vN&E_R=H8aMFylevP%9`r~-_swG^bsfxOEb1|AL|ITO zo+ycYy6478fq1jhn9~iTdqv=w-&R(q{RbP)8}2_! z2HuB9I@a4&wmhEjyQM>u`sR+y$sZ$XFS7ShWW;2woE=xv(jpx)~C#u&8u8rVyHW+ znp3eyLWI&aQrfIos{sT;bj+;s1azuN4lVKywrwK9X_qb$ihXVM(ZAbo=-aAtmfVR^ zjP-7bP#L$BFWz02q^m^s&wr9M{uCTJ*W;E%26MMiL%pLl|m z65BFhz|Oguh)y1Vs3RI|z1N>$o2&D+)oJtT!Ayy`Q*6H4zI~iakJerX$-Gmjzc-L# z!3c=J)vZ44Xw24DUgY!rLaZ^yv!4ii8_qfKn|>m$G#;kdKP2ntEL70)wXaVlB{i>p z_fMC2(KHdqatW!#6@3*b2$n&iLY-Nj?ST*NeQm|A4QWQ-t*gH1y{DNgB^<3dG0Jb| zl+iVJ-M`F(%!NXBhfkYfuLd9EzrH&Jb9>GnD13kI}s>&6~|aiQSK zD-~rzv`t$1b>;7SBehr z78TDDIR;$vfTZMKLMI=#>72Zpf7*y>H(Uw_x4oOTkspx4SZqVhvPU&?S=qQTCN@$2 z^`tqoBQ~#ZbFeCM?U|j<=s}}Tgvj8j#On2y{qd;axg4)h(-^g^uJF7Z%ad%b4V5Z+ zsv4hEB5$-kt-_5HNOLqFE4NbVS1Lp)d$xBZtAr|Lk(Ev9c-bziHJh6tZFmo?qm!GH znttP$y30ZBjm`ORTIVI<@6EX|+l9!)*yl+NKvz4_y^@kq+kbR)_t2(XCaxR_Hk_*) zXMDlNrEY`Z3b#0JTW(VeSsx?o-!Is{gza@5<23noBU~t_vL1=Z2DG&$0iV_1&uWTD z9qA|w0Vf&m!*D$Iyskb|_VspzV+WIS4T0>n3n$z8?jsfRoy{E^P!;A^0nS0X zuRfBVil@~sCfn(?ALtCfV9{S2QMuU}^RewXJIQBpewl+5?RbE!n)%pdc%(cR;uTsGT4b0+g@!VY`Di}2+{CTL3$n31i$x>^znFC#5U=ELgnuUt z#R_K_Un49}yZthA|zSi1C+^#P;f+o#oxrrNhNybHUMhp^pQ9%)YJ4SQ#AckBZ_ gHpuWA+!mDPvrqND*Uop~=FXoN+RO%3Wa4?{UvGJ3%m4rY literal 0 HcmV?d00001 diff --git a/.project/images/grunt-logo.png b/.project/images/grunt-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aae96324a8e710d9812e33ad1ba8370a1dcdb024 GIT binary patch literal 81790 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

07H|O<}oWPOS(giMPw9cf`x@h}~~w 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 z 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�lkzk~fLd|Hi4MNro*4$LMc2+)B))QZqzfW8$=0 zL#BFHNLK};Pbb4|8KzQ)!Ixz-Z&`Vu8ipTjoGUa+3(S-xGFcy{Pc7e_oo4n{q5f|y zr(jfspz`ApxdZA*GBmg2btuiH)IBV0oekMYwhgB!P1L-{)H>wwp?ybQ!vF7&z4nKQ YrS-h$iljy6H_+$1l#*nvxM9%$0ofwKQvd(} literal 0 HcmV?d00001 diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..07e7410 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,38 @@ +'use strict'; + +// # Globbing +// for performance reasons we're only matching one level down: +// 'test/spec/{,*/}*.js' +// use this if you want to recursively match all subfolders: +// 'test/spec/**/*.js' + +module.exports = function (grunt) { + + var path = require('path'); + + // Display task times + require('time-grunt')(grunt); + // Load tasks as needed for performance + require('jit-grunt')(grunt); + + // Split grunt file into 'tasks' and 'task options' for easier maintenance + // Source: http://www.thomasboyt.com/2013/09/01/maintainable-grunt.html + require('load-grunt-config')(grunt, { + configPath: path.join(process.cwd(), 'tasks/options'), // path to task.js files, defaults to grunt dir + init: true, // auto grunt.initConfig + config: { // additional config vars + pkg: grunt.file.readJSON('package.json'), + projname: '<%= pkg.name %>', // change here or in package.json + src: 'src', + build: 'build', + temp: '.tmp', + LIVERELOAD_PORT: 35028, + port: 9002, + hostname: '0.0.0.0' // enter 'your-host-ip-address:port-number-from-above' into browser address bar for remote livereload + } + }); + + // load tasks in /tasks directory + grunt.loadTasks('tasks'); + +}; diff --git a/README.md b/README.md new file mode 100644 index 0000000..5ee230e --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/) + +# UX Prototype + +Go from sketch to wireframe to prototype with this front-end development and design kit by generating static HTML pages from dynamic templates and partials, and modular CSS structure using SASS, allowing you to keep everything organised the way you need it to be. + + +> We’re not designing pages, we’re designing systems of components +> +> — [Stephen Hay](http://www.the-haystack.com/) + + +## Project Goal + +Enable the *building* and *demonstration* of **tangible products** and reduce *describing* and *documenting* them, by facilitating "in-browser design" ("[deciding](https://the-pastry-box-project.net/dan-mall/2012-september-12) in the browser") using: + +- A modular/atomic system of reusable components/patterns +- Flexible tools – opt-in over opt-out + + +## Features + +All features are optional, if you don't want to use one just comment it out in the appropriate ``tasks/task-name.js`` file. Everything is highly configurable and automated with [Grunt](http://gruntjs.com/). + +- Modular templating and partial/includes system ([Handlebars](http://handlebarsjs.com/)) – [Asemble](http://assemble.io) +- CSS pre-processing – [SASS](http://sass-lang.com/) +- [Livereload](https://github.com/intesso/connect-livereload) your designs instantly after saving **on multiple devices** (without a browser plugin) +- SVG conversion to PNG and Base64 encoded CSS for fallback - [Grunticon](http://www.grumpicon.com/) +- Package/asset management (jQuery, modernizr, etc.) - [Bower](http://bower.io/) +- Minification of JS and CSS +- Image optimisation +- Rule based linting of [JS](https://github.com/gruntjs/grunt-contrib-jshint), [CSS](https://github.com/stubbornella/csslint), [HTML](https://github.com/yaniswang/HTMLHint) and [Accessibility](https://github.com/globant-ui/arialinter) +- Reordering/formatting of CSS according to rules you set – [CSSComb](https://github.com/csscomb/csscomb.js) +- HTML beautification according to rules you set – [Prettify](https://github.com/jonschlinkert/grunt-prettify) +- Growl notifications + +The Sass/CSS adheres somewhat closely to the following guidelines (needs cleanup): + +- [Idiomatic CSS](https://github.com/necolas/idiomatic-css) +- [CSS Wizardry CSS guidleines](https://github.com/csswizardry/CSS-Guidelines) +- [Sass Style Guide](http://css-tricks.com/sass-style-guide/) + + +## Install + +*NOTE: This will eventually all be handled by a script (optional).* + + +If you are unfamiliar with terms like homebrew, npm, and ruby, or are having difficulty with the instructions below, read the [full install instructions](docs/Install.md). + +If you already have node installed, read on. + +#### SASS and Compass + +``` +gem install sass compass +``` + +#### Grunt & Bower + +``` +npm install -g grunt grunt-cli bower +``` + +#### Dependencies + +``` +npm install && bower install +``` + +#### Growl + +[growlnotify](http://growl.info/downloads#generaldownloads) + + +## How to use + +*NOTE: Need to elaborate on this* + +A lot of the variables are defined in `Gruntfile.js` and also in `package.json`. + +Source files are in the ``src`` directory and the static/flat output is output to the ``build`` directory. + +#### Working on source files + +Start a server with livereload and edit your HTML (.hbs), SASS or js files from the `src` and have the changes update in the browser without refreshing. + +``` +grunt server +``` + +#### Building static output + +After you have changed any of the source files, generate new files in the build directory by running the following command: + +``` +grunt build +``` + +### HTML (.hbs) pages + +[Assemble docs](http://assemble.io/docs/) + +Most page and directory relatred settings are in `tasks/options/assemble.js`. + + +## Author + +### Michael Sheedy + +- [https://twitter.com/msheedy](https://twitter.com/msheedy) +- [http://www.michaelsheedy.com/](http://www.michaelsheedy.com/) +- [http://www.myplanet.io/](http://www.myplanet.io/) + +## Credit + +Matt Bailey's [bones generator](https://github.com/matt-bailey/generator-bones) and his [blog posts on using Grunt](http://www.gpmd.co.uk/blog/front-end-process-flat-builds-and-automation-part-1-introduction/) – the seed that started this project. \ No newline at end of file diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..11444aa --- /dev/null +++ b/bower.json @@ -0,0 +1,11 @@ +{ + "name": "ux-prototype", + "version": "0.0.1", + "dependencies": { + "modernizr": "~2.6.2", + "jquery": "~1.9.0", + "jquery-color": "~2.1.2", + "animate.css": "~2.1.1" + }, + "devDependencies": {} +} diff --git a/config/csscomb.json b/config/csscomb.json new file mode 100644 index 0000000..c752205 --- /dev/null +++ b/config/csscomb.json @@ -0,0 +1,318 @@ +{ + "always-semicolon": true, + "block-indent": " ", + "colon-space": ["", " "], + "color-case": "lower", + "color-shorthand": false, + "combinator-space": [" ", " "], + "element-case": "lower", + "eof-newline": true, + "leading-zero": false, + "quotes": "double", + "remove-empty-rulesets": true, + "rule-indent": " ", + "stick-brace": " ", + "strip-spaces": true, + "unitless-zero": true, + "vendor-prefix-align": true, + "sort-order": [ + [ + "font", + "font-family", + "font-size", + "font-weight", + "font-style", + "font-variant", + "font-size-adjust", + "font-stretch", + "font-effect", + "font-emphasize", + "font-emphasize-position", + "font-emphasize-style", + "font-smooth", + "line-height" + ], + [ + "position", + "z-index", + "top", + "right", + "bottom", + "left" + ], + [ + "display", + "visibility", + "float", + "clear", + "overflow", + "overflow-x", + "overflow-y", + "-ms-overflow-x", + "-ms-overflow-y", + "clip", + "zoom", + "flex-direction", + "flex-order", + "flex-pack", + "flex-align" + ], + [ + "-webkit-box-sizing", + "-moz-box-sizing", + "box-sizing", + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "margin", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "padding", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left" + ], + [ + "table-layout", + "empty-cells", + "caption-side", + "border-spacing", + "border-collapse", + "list-style", + "list-style-position", + "list-style-type", + "list-style-image" + ], + [ + "content", + "quotes", + "counter-reset", + "counter-increment", + "resize", + "cursor", + "-webkit-user-select", + "-moz-user-select", + "-ms-user-select", + "user-select", + "nav-index", + "nav-up", + "nav-right", + "nav-down", + "nav-left", + "-webkit-transition", + "-moz-transition", + "-ms-transition", + "-o-transition", + "transition", + "-webkit-transition-delay", + "-moz-transition-delay", + "-ms-transition-delay", + "-o-transition-delay", + "transition-delay", + "-webkit-transition-timing-function", + "-moz-transition-timing-function", + "-ms-transition-timing-function", + "-o-transition-timing-function", + "transition-timing-function", + "-webkit-transition-duration", + "-moz-transition-duration", + "-ms-transition-duration", + "-o-transition-duration", + "transition-duration", + "-webkit-transition-property", + "-moz-transition-property", + "-ms-transition-property", + "-o-transition-property", + "transition-property", + "-webkit-transform", + "-moz-transform", + "-ms-transform", + "-o-transform", + "transform", + "-webkit-transform-origin", + "-moz-transform-origin", + "-ms-transform-origin", + "-o-transform-origin", + "transform-origin", + "-webkit-animation", + "-moz-animation", + "-ms-animation", + "-o-animation", + "animation", + "-webkit-animation-name", + "-moz-animation-name", + "-ms-animation-name", + "-o-animation-name", + "animation-name", + "-webkit-animation-duration", + "-moz-animation-duration", + "-ms-animation-duration", + "-o-animation-duration", + "animation-duration", + "-webkit-animation-play-state", + "-moz-animation-play-state", + "-ms-animation-play-state", + "-o-animation-play-state", + "animation-play-state", + "-webkit-animation-timing-function", + "-moz-animation-timing-function", + "-ms-animation-timing-function", + "-o-animation-timing-function", + "animation-timing-function", + "-webkit-animation-delay", + "-moz-animation-delay", + "-ms-animation-delay", + "-o-animation-delay", + "animation-delay", + "-webkit-animation-iteration-count", + "-moz-animation-iteration-count", + "-ms-animation-iteration-count", + "-o-animation-iteration-count", + "animation-iteration-count", + "-webkit-animation-direction", + "-moz-animation-direction", + "-ms-animation-direction", + "-o-animation-direction", + "animation-direction", + "text-align", + "-webkit-text-align-last", + "-moz-text-align-last", + "-ms-text-align-last", + "text-align-last", + "vertical-align", + "white-space", + "text-decoration", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-style", + "text-emphasis-position", + "text-indent", + "-ms-text-justify", + "text-justify", + "letter-spacing", + "word-spacing", + "-ms-writing-mode", + "text-outline", + "text-transform", + "text-wrap", + "text-overflow", + "-ms-text-overflow", + "text-overflow-ellipsis", + "text-overflow-mode", + "-ms-word-wrap", + "word-wrap", + "word-break", + "-ms-word-break", + "-moz-tab-size", + "-o-tab-size", + "tab-size", + "-webkit-hyphens", + "-moz-hyphens", + "hyphens", + "pointer-events" + ], + [ + "opacity", + "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", + "-ms-interpolation-mode", + "color", + "border", + "border-width", + "border-style", + "border-color", + "border-top", + "border-top-width", + "border-top-style", + "border-top-color", + "border-right", + "border-right-width", + "border-right-style", + "border-right-color", + "border-bottom", + "border-bottom-width", + "border-bottom-style", + "border-bottom-color", + "border-left", + "border-left-width", + "border-left-style", + "border-left-color", + "-webkit-border-radius", + "-moz-border-radius", + "border-radius", + "-webkit-border-top-left-radius", + "-moz-border-radius-topleft", + "border-top-left-radius", + "-webkit-border-top-right-radius", + "-moz-border-radius-topright", + "border-top-right-radius", + "-webkit-border-bottom-right-radius", + "-moz-border-radius-bottomright", + "border-bottom-right-radius", + "-webkit-border-bottom-left-radius", + "-moz-border-radius-bottomleft", + "border-bottom-left-radius", + "-webkit-border-image", + "-moz-border-image", + "-o-border-image", + "border-image", + "-webkit-border-image-source", + "-moz-border-image-source", + "-o-border-image-source", + "border-image-source", + "-webkit-border-image-slice", + "-moz-border-image-slice", + "-o-border-image-slice", + "border-image-slice", + "-webkit-border-image-width", + "-moz-border-image-width", + "-o-border-image-width", + "border-image-width", + "-webkit-border-image-outset", + "-moz-border-image-outset", + "-o-border-image-outset", + "border-image-outset", + "-webkit-border-image-repeat", + "-moz-border-image-repeat", + "-o-border-image-repeat", + "border-image-repeat", + "outline", + "outline-width", + "outline-style", + "outline-color", + "outline-offset", + "background", + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", + "background-color", + "background-image", + "background-repeat", + "background-attachment", + "background-position", + "background-position-x", + "-ms-background-position-x", + "background-position-y", + "-ms-background-position-y", + "-webkit-background-clip", + "-moz-background-clip", + "background-clip", + "background-origin", + "-webkit-background-size", + "-moz-background-size", + "-o-background-size", + "background-size", + "box-decoration-break", + "-webkit-box-shadow", + "-moz-box-shadow", + "box-shadow", + "filter:progid:DXImageTransform.Microsoft.gradient", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient", + "text-shadow" + ] + ] +} \ No newline at end of file diff --git a/config/csslintrc.csslintrc b/config/csslintrc.csslintrc new file mode 100644 index 0000000..8231591 --- /dev/null +++ b/config/csslintrc.csslintrc @@ -0,0 +1,38 @@ +{ + "box-model": false, + "display-property-grouping": false, + "duplicate-properties": false, + "empty-rules": 2, + "known-properties": 2, + + "adjoining-classes": false, + "box-sizing": false, + "compatible-vendor-prefixes": 2, + "gradients": 2, + "text-indent": 2, + "vendor-prefix": 2, + "fallback-colors": 2, + "star-property-hack": false, + "underscore-property-hack": true, + "bulletproof-font-face": 2, + + "font-faces": 2, + "import": false, + "regex-selectors": 2, + "universal-selector": false, + "unqualified-attributes": 2, + "zero-units": , + "overqualified-elements": 2, + "shorthand": 2, + "duplicate-background-images": 2, + + "floats": true, + "font-sizes": 2, + "ids": 2, + "important": false, + + "outline-none": 2, + + "qualified-headings": 2, + "unique-headings": false +} \ No newline at end of file diff --git a/config/jshintrc.jshintrc b/config/jshintrc.jshintrc new file mode 100644 index 0000000..699a7f9 --- /dev/null +++ b/config/jshintrc.jshintrc @@ -0,0 +1,16 @@ +{ + "node": true, + "esnext": true, + "bitwise": false, + "curly": false, + "eqeqeq": true, + "eqnull": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "undef": true, + "strict": false, + "trailing": true, + "smarttabs": true +} \ No newline at end of file diff --git a/config/prettifyrc.prettifyrc b/config/prettifyrc.prettifyrc new file mode 100644 index 0000000..91eefda --- /dev/null +++ b/config/prettifyrc.prettifyrc @@ -0,0 +1,14 @@ +{ + "indent": 2, + "indent_char": " ", + "indent_scripts": "normal", + "wrap_line_length": 0, + "brace_style": "collapse", + "preserve_newlines": true, + "max_preserve_newlines": 1, + "unformatted": [ + "a", + "code", + "pre" + ] +} diff --git a/docs/how-to-use.md b/docs/how-to-use.md new file mode 100644 index 0000000..e51b4a4 --- /dev/null +++ b/docs/how-to-use.md @@ -0,0 +1,32 @@ +# UX Prototype + +## How to use + +*NOTE: Need to elaborate on this* + +A lot of the variables are defined in `Gruntfile.js` and also in `package.json`. + +Source files are in the ``src`` directory and the static/flat output is output to the ``build`` directory. + +#### Working on source files + +Start a server with livereload and edit your HTML (.hbs), SASS or js files from the `src` and have the changes update in the browser without refreshing. + +``` +grunt server +``` + +#### Building static output + +After you have changed any of the source files, generate new files in the build directory by running the following command: + +``` +grunt build +``` + +### HTML (.hbs) pages + +[Assemble docs](http://assemble.io/docs/) + +Most page and directory relatred settings are in `tasks/options/assemble.js`. + diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 0000000..5085b68 --- /dev/null +++ b/docs/install.md @@ -0,0 +1,58 @@ +This will eventually all be handled by a script (optional). + +#### [Homebrew](http://brew.sh/) - The missing package manager for OS X + +``` +ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" +``` + +### [rbenv](https://github.com/sstephenson/rbenv) - Ruby environment management + +Avoid having to wait for docs to install when installing gems. + +``` +echo 'gem: --no-rdoc --no-ri' >> ~/.gemrc + +``` +#### Install rbenv + +``` +brew update +brew install rbenv ruby-build +echo 'eval "$(rbenv init -)"' >> ~/.bash_profile +``` + +If you're using zsh or [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) (you should be) + +``` +echo 'eval "$(rbenv init -)"' >> ~/.zshrc +``` + +I use `zsh` as my shell instead of bash. You can view my setup [here](https://github.com/sheedy/dotfiles). + +#### Install a ruby version and make it the default + +``` +rbenv install 2.0.0-p247 +rbenv rehash +rbenv global 2.0.0-p247 +``` + +#### [Node](http://nodejs.org/) + +``` +brew install node +``` + +#### [Sass](sass-lang.com) + +``` +gem install sass +``` + +#### [Grunt](http://gruntjs.com/) & [Bower](http://bower.io/) + +``` +npm install -g grunt-cli bower +``` + diff --git a/package.json b/package.json new file mode 100644 index 0000000..a6cd6db --- /dev/null +++ b/package.json @@ -0,0 +1,54 @@ +{ + "name": "ux-prototype", + "version": "0.0.1", + "dependencies": { + "grunt-text-replace": "~0.3.10" + }, + "devDependencies": { + "grunt": ">=0.4.2", + "grunt-contrib-copy": ">=0.5.0", + "grunt-contrib-concat": ">=0.3.0", + "grunt-contrib-coffee": ">=0.8.0", + "grunt-contrib-uglify": ">=0.2.7", + "grunt-contrib-compass": ">=0.7.0", + "grunt-contrib-jshint": ">=0.8.0", + "grunt-contrib-cssmin": ">=0.7.0", + "grunt-contrib-connect": ">=0.6.0", + "grunt-contrib-clean": ">=0.5.0", + "grunt-contrib-htmlmin": ">=0.1.3", + "grunt-contrib-imagemin": ">=0.4.0", + "grunt-contrib-watch": ">=0.5.3", + "grunt-contrib-rename": ">=0.0.3", + "grunt-contrib-csslint": ">=0.2.0", + "grunt-rev": ">=0.1.0", + "grunt-usemin": ">=2.0.0", + "grunt-mocha": ">=0.4.7", + "grunt-open": ">=0.2.2", + "grunt-concurrent": ">=0.4.2", + "grunt-grunticon": ">=1.0.0-beta.0", + "grunt-arialinter": ">=0.1.6", + "grunt-shell": ">=0.6.1", + "grunt-prettify": ">=0.3.4", + "grunt-photobox": ">=0.5.0", + "grunt-htmlhint": ">=0.4.0", + "grunt-cssc": ">=0.2.6", + "load-grunt-config": ">=0.7.0", + "assemble": ">=0.4.33", + "matchdep": ">=0.3.0", + "connect-livereload": ">=0.3.1", + "jshint-stylish": ">=0.1.4", + "time-grunt": ">=0.2.7", + "load-grunt-tasks": ">=0.2.1", + "css-condense": "0.0.6", + "jit-grunt": ">=0.1.2", + "grunt-newer": ">=0.6.0", + "grunt-notify": ">=0.2.16", + "grunt-csscomb": ">=2.0.1", + "grunt-sass": ">=0.9.0", + "grunt-contrib-sass": ">=0.6.0", + "grunt-magic-paths": ">=0.1.0" + }, + "engines": { + "node": ">=0.8.0" + } +} diff --git a/src/css/_project/dib/_iframe.scss b/src/css/_project/dib/_iframe.scss new file mode 100644 index 0000000..85e3d9a --- /dev/null +++ b/src/css/_project/dib/_iframe.scss @@ -0,0 +1,41 @@ +// Variables +$frame-color: $grey; + +// +// Extends and mixins +// + +%frame { + border: 1px solid $frame-color; + margin: 30px 20px; + display: inline-block; + vertical-align: top; +} + +/* ========================================================================== + iframe +========================================================================== */ + +.frame-wrap { + width: 90%; + margin: 0 auto; + white-space: nowrap; +} + +.frame-phone { + @extend %frame; + width: $phone-w; + height: $phone-h; +} + +.frame-tablet { + @extend %frame; + width: $tab-pw; + height: $tab-ph; +} + +.frame-desktop { + @extend %frame; + width: $desk-w; + height: $desk-h; +} \ No newline at end of file diff --git a/src/css/base/_accessibility.scss b/src/css/base/_accessibility.scss new file mode 100644 index 0000000..f32e9ac --- /dev/null +++ b/src/css/base/_accessibility.scss @@ -0,0 +1,23 @@ +/* +* Accessibility +* ------------------------------------------------------------------------------ +* +*/ + +// For accessibility we probably shouldn't turn off focus outline +*:focus { + outline: 1px solid $focus-color; +} + +p, h1, h2, h3, h4, h5, h6 { + &:focus { + outline: none; + } +} + +a { + &:focus { + color: $white; + background-color: $focus-color; + } +} \ No newline at end of file diff --git a/src/css/base/_global.scss b/src/css/base/_global.scss new file mode 100644 index 0000000..50b9049 --- /dev/null +++ b/src/css/base/_global.scss @@ -0,0 +1,37 @@ +/* +* Global +* ------------------------------------------------------------------------------ +* +*/ + + +html { + font-family: $bodyfont; + line-height: $baseLineHeight; + @include font-smooth(antialiased); + @include base-font-size; + overflow-y:scroll; + min-height:100%; +} + +body { + background: $bg-color; +} + +* { + height: auto; + -webkit-text-size-adjust: none; + // @include box-sizing(border-box); +} + +hr { + background: $border-color; + border: none; + height: 1px; + margin: 15px 0; +} + +.wrapper { + width: 960px; + margin: 0 auto; +} \ No newline at end of file diff --git a/src/css/base/_header.scss b/src/css/base/_header.scss new file mode 100644 index 0000000..b5c2af3 --- /dev/null +++ b/src/css/base/_header.scss @@ -0,0 +1,5 @@ +/* +* Header +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/_list.scss b/src/css/base/_list.scss new file mode 100644 index 0000000..d1ff52b --- /dev/null +++ b/src/css/base/_list.scss @@ -0,0 +1,5 @@ +/* +* Lists +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/_table.scss b/src/css/base/_table.scss new file mode 100644 index 0000000..e1e4c48 --- /dev/null +++ b/src/css/base/_table.scss @@ -0,0 +1,5 @@ +/* +* Tables +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/_typography.scss b/src/css/base/_typography.scss new file mode 100644 index 0000000..b2d9c04 --- /dev/null +++ b/src/css/base/_typography.scss @@ -0,0 +1,75 @@ +/* +* Typography +* ------------------------------------------------------------------------------ +* +*/ + +h1, .h1 { + +} + +h2, .h2 { + +} + +h3, .h3 { + +} + +h4, .h4 { + +} + +h5, .h5 { + +} + +p { + code { + padding: 2px 6px 3px; + margin: 0 2px; + border: 1px solid lighten($mid-grey, 50); + background-color: lighten($grey, 75); + } +} + +a { + +} + +sub { + +} + +small { + +} + +em { + +} + +strong { + font-weight: bold; +} + +blockquote { + +} + +pre { + padding: 10px 16px; + background-color: $mid-grey; + color: $white; + overflow: auto; +} + +// debug +@if $debugTypography { + body { + // thank you lea ;) + background-color: #fff; + background-image: -webkit-linear-gradient(transparent 50%, rgba(0, 0, 0, .1) 50%); + background-size: $baseLineHeight*2 $baseLineHeight*2; + } +} \ No newline at end of file diff --git a/src/css/base/forms/_checkbox.scss b/src/css/base/forms/_checkbox.scss new file mode 100644 index 0000000..45ab7e6 --- /dev/null +++ b/src/css/base/forms/_checkbox.scss @@ -0,0 +1,5 @@ +/* +* Checkboxes +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/forms/_form.scss b/src/css/base/forms/_form.scss new file mode 100644 index 0000000..ab59c3a --- /dev/null +++ b/src/css/base/forms/_form.scss @@ -0,0 +1,5 @@ +/* +* Common form elements +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/forms/_input.scss b/src/css/base/forms/_input.scss new file mode 100644 index 0000000..85e5315 --- /dev/null +++ b/src/css/base/forms/_input.scss @@ -0,0 +1,5 @@ +/* +* Input +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/forms/_label.scss b/src/css/base/forms/_label.scss new file mode 100644 index 0000000..487faae --- /dev/null +++ b/src/css/base/forms/_label.scss @@ -0,0 +1,5 @@ +/* +* label +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/forms/_multiselect-box.scss b/src/css/base/forms/_multiselect-box.scss new file mode 100644 index 0000000..b979b83 --- /dev/null +++ b/src/css/base/forms/_multiselect-box.scss @@ -0,0 +1,5 @@ +/* +* multi-select +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/forms/_radio.scss b/src/css/base/forms/_radio.scss new file mode 100644 index 0000000..ebc8d6b --- /dev/null +++ b/src/css/base/forms/_radio.scss @@ -0,0 +1,5 @@ +/* +* Radio buttons +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/forms/_select.scss b/src/css/base/forms/_select.scss new file mode 100644 index 0000000..0454785 --- /dev/null +++ b/src/css/base/forms/_select.scss @@ -0,0 +1,5 @@ +/* +* Select +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/base/forms/_textarea.scss b/src/css/base/forms/_textarea.scss new file mode 100644 index 0000000..6b4283a --- /dev/null +++ b/src/css/base/forms/_textarea.scss @@ -0,0 +1,5 @@ +/* +* Textarea +* ------------------------------------------------------------------------------ +* +*/ diff --git a/src/css/generic/_clearfix.scss b/src/css/generic/_clearfix.scss new file mode 100644 index 0000000..9c34ae2 --- /dev/null +++ b/src/css/generic/_clearfix.scss @@ -0,0 +1,15 @@ +/* +* Clearfix +* ------------------------------------------------------------------------------ +* +*/ + +.clearfix:before, +.clearfix:after { + content:""; + display:table; +} + +.clearfix:after { + clear:both; +} diff --git a/src/css/generic/_shame.scss b/src/css/generic/_shame.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/css/generic/_state.scss b/src/css/generic/_state.scss new file mode 100644 index 0000000..7c78786 --- /dev/null +++ b/src/css/generic/_state.scss @@ -0,0 +1,19 @@ +/* +* +* State +* ------------------------------------------------------------------------------ +* +*/ + +.show { + display: block !important; +} + +.hidden { + display: none !important; + visibility: hidden !important; +} + +.invisible { + visibility: hidden; +} \ No newline at end of file diff --git a/src/css/objects/_box.scss b/src/css/objects/_box.scss new file mode 100644 index 0000000..2b2aedb --- /dev/null +++ b/src/css/objects/_box.scss @@ -0,0 +1,9 @@ +/* +* Box +* ------------------------------------------------------------------------------ +* +*/ + +.box { + +} diff --git a/src/css/objects/_button.scss b/src/css/objects/_button.scss new file mode 100644 index 0000000..8f66bcc --- /dev/null +++ b/src/css/objects/_button.scss @@ -0,0 +1,53 @@ +/* +* Button +* ------------------------------------------------------------------------------ +* +*/ + +.button { + + &:hover { + + } +} + +// +// Extends and mixins +// + +%submit-buttons-inline { + text-align: right; + a:not(:first-child) { + margin-left: 8px; + } +} + +%submit-buttons-stacked { + text-align: right; + .button + .button { + margin-top: 9px; + } +} + +.button-row { + @extend %submit-buttons-inline; + + font-size: 0; + + margin: 25px, 0, 0, 0; + + .button { + display: inline-block; + min-width: 100px; + + margin-left: 10px; + } + + button { + margin-left: 10px; + } +} + +.button-column { + @extend %submit-buttons-stacked; +} diff --git a/src/css/objects/_grid.scss b/src/css/objects/_grid.scss new file mode 100644 index 0000000..520d7cb --- /dev/null +++ b/src/css/objects/_grid.scss @@ -0,0 +1,83 @@ +/* +* Grid +* ------------------------------------------------------------------------------ +* +*/ + +// See _variables.scss for grid settings + +.col-1 { + @include span-columns(1,12); + &:nth-child(12n) { @include omega; } +} +.col-1-omega { + @include span-columns(1 omega,12); +} +.col-2 { + @include span-columns(2,12); + &:nth-child(6n) { @include omega; } +} +.col-2-omega { + @include span-columns(2 omega,12); +} +.col-3 { + @include span-columns(3,12); + &:nth-child(4n) { @include omega; } +} +.col-3-omega { + @include span-columns(3 omega,12); +} +.col-4 { + @include span-columns(4,12); + &:nth-child(3n) { @include omega; } +} +.col-4-omega { + @include span-columns(4 omega,12); +} +.col-5 { + @include span-columns(5,12); +} +.col-5-omega { + @include span-columns(5 omega,12); +} +.col-6 { + @include span-columns(6,12); + // &:nth-child(2n) { @include omega; } +} +.col-6-omega { + @include span-columns(6 omega,12); +} +.col-7 { + @include span-columns(7,12); +} +.col-7-omega { + @include span-columns(7 omega,12); +} +.col-8 { + @include span-columns(8,12); +} +.col-8-omega { + @include span-columns(8 omega,12); +} +.col-9 { + @include span-columns(9,12); +} +.col-9-omega { + @include span-columns(9 omega,12); +} +.col-10 { + @include span-columns(10,12); +} +.col-10-omega { + @include span-columns(10 omega,12); +} +.col-11 { + @include span-columns(11,12); +} +.col-11-omega { + @include span-columns(11 omega,12); +} +.col-12 { + @include span-columns(12,12); + &:nth-child(1n) { @include omega; } +} diff --git a/src/css/objects/_tabs.scss b/src/css/objects/_tabs.scss new file mode 100644 index 0000000..bd31689 --- /dev/null +++ b/src/css/objects/_tabs.scss @@ -0,0 +1,25 @@ +/* +* Tab +* ------------------------------------------------------------------------------ +* +*/ + +.tabs { + +} + +.tab { + + &.active { + + } + & + .tab { + border-left: none !important; + } + &:first-of-type { + border-left-radius: $border-radius-default; + } + &:last-of-type { + border-right-radius: $border-radius-default; + } +} \ No newline at end of file diff --git a/src/css/project.scss b/src/css/project.scss new file mode 100644 index 0000000..e8ff80c --- /dev/null +++ b/src/css/project.scss @@ -0,0 +1,21 @@ +@charset "utf-8"; + +/** +* +* Styles that facilitate designing in the browser +* +* NOT for production use +* +**/ + + +// NOTE: Nothing imported in this file should ever import actual code. It should +// only import things like variables and mixins. This file should be included at +// the top of each individual sass/css file (not partials). + +// Variables +//------------------------------------------------------------------------------ + +@import "utilities/variables"; + +@import "_project/dib/iframe"; \ No newline at end of file diff --git a/src/css/styles.scss b/src/css/styles.scss new file mode 100644 index 0000000..8377e10 --- /dev/null +++ b/src/css/styles.scss @@ -0,0 +1 @@ +@import "utilities/config"; \ No newline at end of file diff --git a/src/css/utilities/_config.scss b/src/css/utilities/_config.scss new file mode 100644 index 0000000..6cd37bc --- /dev/null +++ b/src/css/utilities/_config.scss @@ -0,0 +1,83 @@ +@charset "utf-8"; + +// NOTE: Nothing imported in this file should ever import actual code. It should +// only import things like variables and mixins. + +// External dependencies +//------------------------------------------------------------------------------ + + +// Grid +// @import "susy"; // requires compass + +// Compass + +/* ========================================================================== + Reset +========================================================================== */ +// @import "compass/reset"; +// @import "compass/typography/links"; +// @import "compass/css3/border-radius"; // using locally-modified bi-app-sass instead +// @import "compass/css3/box-shadow"; +// @import "compass/css3/transition"; +// @import "compass/css3/text-shadow"; + + +// Variables +//------------------------------------------------------------------------------ + +@import "utilities/variables"; + + +// Utilities +//------------------------------------------------------------------------------ + +@import "utilities/mixins"; + + +/* ========================================================================== + Base +========================================================================== */ + +@import "base/global"; +@import "base/accessibility"; +@import "base/typography"; +@import "base/list"; +@import "base/table"; +// @import "base/icon"; +@import "base/header"; +// Forms +@import "base/forms/label"; +@import "base/forms/checkbox"; +@import "base/forms/multiselect-box"; +@import "base/forms/radio"; +@import "base/forms/input"; +@import "base/forms/select"; +@import "base/forms/textarea"; +@import "base/forms/form"; + + +/* ========================================================================== + Objects +========================================================================== */ + +// @import "objects/grid"; +@import "objects/box"; +@import "objects/button"; +@import "objects/tabs"; + + +/* ========================================================================== + Generic +========================================================================== */ + +@import "generic/clearfix"; +@import "generic/state"; + + +/* ========================================================================== + Shame +========================================================================== */ + +// Fix these +@import "generic/shame" diff --git a/src/css/utilities/_mixins.scss b/src/css/utilities/_mixins.scss new file mode 100644 index 0000000..46fe55e --- /dev/null +++ b/src/css/utilities/_mixins.scss @@ -0,0 +1,101 @@ +// Mixins only + +@mixin font-smooth($type) { + -webkit-font-smoothing: $type; +} + +@mixin sidebar-heading { + color: $header-dark; + font-weight: bold; + @include font-size(12); +} + +@mixin gradient-top-down($from, $to) { + background-image: -moz-linear-gradient(top, $from, $to); + background-image: -webkit-gradient(linear,0 0,0 100%,from($from),to($to)); + background-image: -webkit-linear-gradient(top, $from, $to); + background-image: -o-linear-gradient(top, $from, $to); + background-image: linear-gradient(to bottom, $from,$to); +} + +@mixin nav-item-font() { + color: $header-dark; + font-weight: bold; +} + + +// Rem font-sizing +//------------------------------------------------------------------------------ + +// This works with the $base-font-size variable, which MUST be set on . +// is the root for rem calculations. Without it (unless the base is 16px) +// the calculations will be incorrect. + +@mixin base-font-size($pixels: $base-font-size) { + font-size: $pixels + px; + font-size: $pixels / 16 * 100%; +} + +// This function will take the desired pixel result and provide a pixel fallback +// version as well as rem version. Do not include "px" units as argument. + +@mixin font-size($pixels: $base-font-size) { + font-size: $pixels + px; + font-size: $pixels / $base-font-size + rem; +} + +//------------------------------------------------------------------------------ + + +// Media query mixin +// - Will probably need to be adjusted +//------------------------------------------------------------------------------ + +@mixin respond-to($media) { + @if $media == retina { + @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2 / 1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + @content; + } + } + @if $media == phone { + @media only screen and (max-width: 550px) { + @content; + } + @media screen and (device-aspect-ratio: 40 / 71) { + @content; + } + } + @if $media == landscape { + @media only screen and (max-width: 680px) { + @content; + } + } + @else if $media == tablets { + @media only screen and (max-width: 940px) { + @content; + } + } + @if $media == desktop { + @media only screen and (max-width: 1020px) { + @content; + } + } + @if $media == large { + @media only screen and (max-width: 1190px) { + @content; + } + } + @if $media == ios { + @media only screen and (max-width: 1024px) and (orientation: landscape), only screen and (max-width: 1024px) and (orientation: portrait) { + @content; + } + } + @if $media == phone-invert { + @media only screen and (min-width: 550px) { + @content; + } + @media screen and (not device-aspect-ratio: 40 / 71) { + @content; + } + } +} \ No newline at end of file diff --git a/src/css/utilities/_variables.scss b/src/css/utilities/_variables.scss new file mode 100755 index 0000000..cf487d0 --- /dev/null +++ b/src/css/utilities/_variables.scss @@ -0,0 +1,128 @@ +// ========================================================================== +// Variables +// ========================================================================== + + +// =============================== +// Colours +// =============================== + +// ========== Base ========== + +$white: #ffffff; +$black: #000000; + +// ========== primary ========== + +$light-grey: #e9e9e9; +$grey: #333333; +$mid-grey: #2c2c2c; +$dark-grey: #1c1c1c; + +// ========== Other ========== + +$body-grey: $grey; +$bg-grey: $light-grey; +$shadow-grey: $mid-grey; +$border-grey: $grey; +$border-grey-light: $light-grey; +$required-grey: $mid-grey; +$required-red: red; +$error-red: red; +$pale-yellow: #fff8bb; + +// ========== Colours with context ========== + +$body-color: $mid-grey; + +$header-dark: $black; +$header-mid: $black; +$header-light: $black; + +$link-color: $black; +$link-color-light: $border-grey; +$bg-color: $bg-grey; +$shadow-color: $shadow-grey; +$border-color: $border-grey; +$border-color-light: $border-grey-light; +$notification-bubble-bg: $required-grey; +$error-colour: $error-red; + +$table-header: $bg-grey; + +$frame-color: $grey; + +$focus-color: $black; +$focus-field-color: $pale-yellow; + +// ----- End of Colours ------ + + + +// ==================================== +// Device sizes +// ==================================== + +$phone-w: 320px; +$phone-h: 480px; +$tab-lw: 1024px; +$tab-lh: 768px; +$tab-pw: 768px; +$tab-ph: 1024px; +$desk-w: 1600px; +$desk-h: 1200px; + +// ----- End of Device sizes ------ + + + +// ============================= +// Forms +// ============================= + +// $radiocheckboxbg: #93c8f6; +// $radiocheckboxborders: #7dabd5; + +// ----- End of Forms ------ + + + +// ================================== +// Typography +// ================================== + +$bodyfont: Arial, "Helvetica Neue", Helvetica, sans-serif; +$base-font-size: 16; +$base-line-height: 24; +$baseLineHeight: 1.5; +$headingthin: $bodyfont; +$headingbold: $bodyfont; +$debugTypography: false; + +// ----- End of Typography ------ + + + +// ============================== +// Layout +// ============================== + +// $box-padding: 20px; +$border-radius-default: 4px; + +// ----- End of Layout ------ + + + +// ============================ +// Grid +// ============================ + +$total-columns: 12; +$column-width: 50px; +$gutter-width: 40px; +$grid-padding: 20px; +$show-grid-backgrounds: false; +$container-width: 1119px; // -20px padding each side //1079px + +// ----- End of Grid ------ \ No newline at end of file diff --git a/src/data/data.json b/src/data/data.json new file mode 100644 index 0000000..53eda74 --- /dev/null +++ b/src/data/data.json @@ -0,0 +1,41 @@ +{ + "1": { + + "2": { + + "lorem-ipsum": { + + "other": [ + { "name": "John" }, + { "name": "Bob" }, + { "name": "Jim" } + ], + + "other-2": "", + "dates": [ + { + "index": "day1", + "lateday-slots": [ + { + "index": "slot7", + "time": "4:00 PM–5:00 PM", + "status": "available" + }, + + { + "index": "slot8", + "time": "5:00 PM–6:00 PM", + "status": "available" + } + ] + } + ], + + "location": "" + } + + } + + } + +} diff --git a/src/data/test-data.json b/src/data/test-data.json new file mode 100644 index 0000000..0f6b992 --- /dev/null +++ b/src/data/test-data.json @@ -0,0 +1,25 @@ +{ + "something": { + "info": { + + }, + + "more-info": { + "sub-info": "value" + }, + + "other-stuff": { + "sub-info": "value" + } + }, + + "test": { + "sub-test": "value" + }, + + "buttons": { + "1": "More informaiton", + "2": "other", + "3": "Submit" + } +} diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8b70ae0cb1328817fa5b37e7e6f4c2f2fd59633e GIT binary patch literal 1150 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 literal 0 HcmV?d00001 diff --git a/src/images/svg-build/preview.html b/src/images/svg-build/preview.html new file mode 100644 index 0000000..44e99cc --- /dev/null +++ b/src/images/svg-build/preview.html @@ -0,0 +1,26 @@ + + + + Icons Preview! + + + + + + + +

.icon-icon-settings:

+ + + + diff --git a/src/images/svg/icon-settings.svg b/src/images/svg/icon-settings.svg new file mode 100644 index 0000000..3451538 --- /dev/null +++ b/src/images/svg/icon-settings.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/src/js/script.js b/src/js/script.js new file mode 100644 index 0000000..9ec5df1 --- /dev/null +++ b/src/js/script.js @@ -0,0 +1,3 @@ +$(document).ready(function() { + +}); \ No newline at end of file diff --git a/src/templates/layouts/custom.hbs b/src/templates/layouts/custom.hbs new file mode 100644 index 0000000..6769455 --- /dev/null +++ b/src/templates/layouts/custom.hbs @@ -0,0 +1,19 @@ + + + + + {{> _head }} + + + + +
+ + {{> body }} + +
+ + {{> _footer }} + + + diff --git a/src/templates/layouts/default.hbs b/src/templates/layouts/default.hbs new file mode 100644 index 0000000..6769455 --- /dev/null +++ b/src/templates/layouts/default.hbs @@ -0,0 +1,19 @@ + + + + + {{> _head }} + + + + +
+ + {{> body }} + +
+ + {{> _footer }} + + + diff --git a/src/templates/layouts/rwd.hbs b/src/templates/layouts/rwd.hbs new file mode 100644 index 0000000..1ee0873 --- /dev/null +++ b/src/templates/layouts/rwd.hbs @@ -0,0 +1,19 @@ + + + + {{title}} + + + + {{> _head-subpage }} + + + + + + {{> body }} + + {{> _footer-subpage }} + + + diff --git a/src/templates/pages/index.hbs b/src/templates/pages/index.hbs new file mode 100644 index 0000000..1350ece --- /dev/null +++ b/src/templates/pages/index.hbs @@ -0,0 +1,6 @@ +--- +layout: <%= src %>/templates/layouts/default.hbs +--- + + +{{ md "docs/how-to-use.md" }} diff --git a/src/templates/pages/proj-rwd/index.hbs b/src/templates/pages/proj-rwd/index.hbs new file mode 100644 index 0000000..19b07df --- /dev/null +++ b/src/templates/pages/proj-rwd/index.hbs @@ -0,0 +1,11 @@ +--- +title: Responsive Testing +layout: src/templates/layouts/rwd.hbs +url: ../index.html # The page that is loaded into the iframes +--- + +
+ + + +
\ No newline at end of file diff --git a/src/templates/pages/subdir/page.hbs b/src/templates/pages/subdir/page.hbs new file mode 100644 index 0000000..449eb5f --- /dev/null +++ b/src/templates/pages/subdir/page.hbs @@ -0,0 +1,10 @@ +--- +title: Sub page +layout: src/templates/layouts/custom.hbs +--- + +
+ +

{{title}}

+ +
diff --git a/src/templates/partials/_footer-subpage.hbs b/src/templates/partials/_footer-subpage.hbs new file mode 100644 index 0000000..699b4d3 --- /dev/null +++ b/src/templates/partials/_footer-subpage.hbs @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/templates/partials/_footer.hbs b/src/templates/partials/_footer.hbs new file mode 100644 index 0000000..4fbc016 --- /dev/null +++ b/src/templates/partials/_footer.hbs @@ -0,0 +1,10 @@ +p + + + + + + + + + diff --git a/src/templates/partials/_head-subpage.hbs b/src/templates/partials/_head-subpage.hbs new file mode 100644 index 0000000..80a7fec --- /dev/null +++ b/src/templates/partials/_head-subpage.hbs @@ -0,0 +1,14 @@ + + +{{!-- block asset path is different for pages in root directory --}} +{{!-- Possibly even differs if this is in a partial --}} + + + + + + + + + + \ No newline at end of file diff --git a/src/templates/partials/_head.hbs b/src/templates/partials/_head.hbs new file mode 100644 index 0000000..79f8181 --- /dev/null +++ b/src/templates/partials/_head.hbs @@ -0,0 +1,10 @@ + + +{{!-- block asset path is different for pages in sub directory --}} + + + + + + + \ No newline at end of file diff --git a/tasks/build.js b/tasks/build.js new file mode 100644 index 0000000..3c4a8a6 --- /dev/null +++ b/tasks/build.js @@ -0,0 +1,23 @@ +module.exports = function(grunt) { + + grunt.registerTask('build', [ + 'clean:build', + 'assemble:server', + // 'compass:build', + 'sass:server', + 'copy:pre_concat', + // 'grunticon', + 'useminPrepare', + 'concurrent:build', + 'concat', + // 'cssmin', // 'minify' CSS (use compass' config.rb instead if needed) + // 'uglify', // minifies but keeps '!' at the start of comments + 'copy:post_concat', + // 'rev', // revision number in file name + 'usemin', + 'replace', // hack to make up for usemin's inability to resolve relative paths + 'prettify:all', + 'open:build' + ]); + +} \ No newline at end of file diff --git a/tasks/options/arialinter.js b/tasks/options/arialinter.js new file mode 100644 index 0000000..2fed5ea --- /dev/null +++ b/tasks/options/arialinter.js @@ -0,0 +1,14 @@ +module.exports = { + + // Accessibility linting + // https://github.com/globant-ui/arialinter + + files: [ + '<%= temp %>/**/*.html', + ], + options: { + templates: false, + levels: 'A' + } + +} diff --git a/tasks/options/assemble.js b/tasks/options/assemble.js new file mode 100644 index 0000000..8e47819 --- /dev/null +++ b/tasks/options/assemble.js @@ -0,0 +1,33 @@ +module.exports = { + + // Static file generation from Handlebars templates + // http://assemble.io/docs/ + + options: { + flatten: true, + assets: '<%= temp %>', + data: "<%= src %>/data/*.json", + partials: ['<%= src %>/templates/partials/**/*.hbs', '<%= src %>/templates/layouts/*.hbs'], + layout: false + }, + + // Splitting the targets below don't allow for the dynamic status page list + // From the docs (http://assemble.io/docs/Collections.html): + // For any given collection, only items found in the [current target] will be added to the collection by Assemble. + // For example, if we wish to render a list of all of the pages in the pages collection, we will only see the pages in the "current target". + + // All pages + server: { + options: { + // assets: '<%= temp %>' + }, + files: { + '<%= temp %>/': [ // destination + '<%= src %>/templates/pages/*.hbs' // target(s) + ], + '<%= temp %>/posts/': ['<%= src %>/templates/pages/posts/*.hbs'], // destination : target(s) + '<%= temp %>/proj-rwd/': ['<%= src %>/templates/pages/proj-rwd/*.hbs'] // destination : target(s) + } + } + +} diff --git a/tasks/options/clean.js b/tasks/options/clean.js new file mode 100644 index 0000000..68780a2 --- /dev/null +++ b/tasks/options/clean.js @@ -0,0 +1,18 @@ +module.exports = { + + // Clean/delete out directories and/or their contents + // https://github.com/gruntjs/grunt-contrib-clean + + build: { + files: [{ + dot: true, + src: [ + '<%= temp %>/*', + '<%= build %>/*', + '!<%= build %>/.git*' + ] + }] + }, + + server: '.tmp' +} \ No newline at end of file diff --git a/tasks/options/coffee.js b/tasks/options/coffee.js new file mode 100644 index 0000000..4ab0259 --- /dev/null +++ b/tasks/options/coffee.js @@ -0,0 +1,25 @@ +module.exports = { + + // Coffeescript + // https://github.com/gruntjs/grunt-contrib-coffee + + build: { + files: [{ + expand: true, + cwd: '<%= src %>/js', + src: '{,*/}*.coffee', + dest: '.tmp/js', + ext: '.js' + }] + }, + test: { + files: [{ + expand: true, + cwd: 'test/spec', + src: '{,*/}*.coffee', + dest: '.tmp/spec', + ext: '.js' + }] + } + +} \ No newline at end of file diff --git a/tasks/options/compass.js b/tasks/options/compass.js new file mode 100644 index 0000000..a1555de --- /dev/null +++ b/tasks/options/compass.js @@ -0,0 +1,20 @@ +module.exports = { + + // Compile Sass to CSS using the Compass framework + // https://github.com/gruntjs/grunt-contrib-compass + + options: { + config: 'config.rb' + }, + build: { + options: { + cssDir: 'build/css' + } + }, + server: { + options: { + cssDir: '.tmp/css', + debugInfo: false + } + } +} diff --git a/tasks/options/concat.js b/tasks/options/concat.js new file mode 100644 index 0000000..350d560 --- /dev/null +++ b/tasks/options/concat.js @@ -0,0 +1,15 @@ +module.exports = { + + // Concat + // not used since Uglify task does concat, + // but still available if needed + // build: { + // files: [{ + // expand: true, + // cwd: '.tmp/js', + // src: '**/*.js', + // dest: 'build/js' + // }] + // } + +} \ No newline at end of file diff --git a/tasks/options/concurrent.js b/tasks/options/concurrent.js new file mode 100644 index 0000000..58be2bb --- /dev/null +++ b/tasks/options/concurrent.js @@ -0,0 +1,21 @@ +module.exports = { + + // Run grunt tasks concurrently + // https://github.com/sindresorhus/grunt-concurrent + + server: [ + // 'coffee:build', + 'sass:server', + 'assemble:server' + ], + test: [ + // 'coffee' + ], + build: [ + // 'coffee', + // 'compass', + // 'sass:build', + 'imagemin', + 'htmlmin' + ] +} diff --git a/tasks/options/connect.js b/tasks/options/connect.js new file mode 100644 index 0000000..1555444 --- /dev/null +++ b/tasks/options/connect.js @@ -0,0 +1,51 @@ +// Livereload +// https://github.com/gruntjs/grunt-contrib-connect + +var lrSnippet = require('connect-livereload')( + { + // connect-livereload specific options + port: 35028 + } +); +var mountFolder = function (connect, dir) { + return connect.static(require('path').resolve(dir)); +}; + +module.exports = { + + options: { + port: '<%= port %>', + hostname: '<%= hostname %>' + }, + livereload: { + options: { + middleware: function (connect) { + return [ + lrSnippet, + mountFolder(connect, '.tmp'), + mountFolder(connect, '<%= src %>') + ]; + } + } + }, + test: { + options: { + middleware: function (connect) { + return [ + mountFolder(connect, '.tmp'), + mountFolder(connect, 'test') + ]; + } + } + }, + build: { + options: { + middleware: function (connect) { + return [ + mountFolder(connect, '<%= build %>') + ]; + } + } + } + +} diff --git a/tasks/options/copy.js b/tasks/options/copy.js new file mode 100644 index 0000000..85b0330 --- /dev/null +++ b/tasks/options/copy.js @@ -0,0 +1,104 @@ +module.exports = { + + // Copy files and folders + // https://github.com/gruntjs/grunt-contrib-copy + + // Build + pre_concat: { + files: [ + { + expand: true, + dot: true, + cwd: '<%= src %>', + dest: '<%= temp %>', + src: [ + 'js/**/*.js', + 'bower_components/**/*.js' + ] + } + ] + }, + + post_concat: { + files: [ + { + expand: true, + dot: true, + cwd: '<%= src %>', + dest: '<%= build %>', + src: [ + '../.tmp/**/*.html', + '*.{ico,png}', + '.htaccess', + 'images/**/*.{png,gif,jpg,jpeg,svg}' + ] + } + ] + }, + + // Server/livereload + server: { + files: [ + { + expand: true, + dot: true, + cwd: '<%= src %>', + dest: '<%= temp %>', + src: [ + 'js/**/*.js', + 'bower_components/**/*.js', + 'images/**/**' + ] + } + ] + }, + + js: { + files: [ + { + expand: true, + dot: true, + cwd: '<%= src %>', + dest: '<%= temp %>', + src: ['js/**/*.js'] + } + ] + }, + + images: { + files: [ + { + expand: true, + dot: true, + cwd: '<%= src %>/images', + dest: '<%= temp %>/images', + src: [ '{!(svg-src),!(svg-build),**}/**' ] + } + ] + }, + + svg_build: { + files: [ + { + expand: true, + dot: true, + cwd: '<%= src %>/images/svg-build/png/', + dest: '<%= temp %>/images/svg-build/png/', + src: [ '*.png' ] + } + ] + }, + + bower_components: { + files: [ + { + expand: true, + dot: true, + cwd: '<%= src %>/bower_components', + dest: '<%= temp %>/bower_components', + src: [ '**/*.js' ] + } + ] + } + +} \ No newline at end of file diff --git a/tasks/options/cssc.js b/tasks/options/cssc.js new file mode 100644 index 0000000..58529fb --- /dev/null +++ b/tasks/options/cssc.js @@ -0,0 +1,24 @@ +module.exports = { + + // Rules based on css-condense + // https://github.com/rstacruz/css-condense + // BEWARE: https://github.com/rstacruz/css-condense#but-youll-risk-breaking-things + + csscFirstSet: { + options:{ + sortSelectors: true, + lineBreaks: true, + sortDeclarations:true, + consolidateViaDeclarations:false, + consolidateViaSelectors:false, + consolidateMediaQueries:false, + }, + files: { + 'examples/main.css': 'examples/css/main.css' + } + }, + csscSecondSet: { + + } + +} \ No newline at end of file diff --git a/tasks/options/csscomb.js b/tasks/options/csscomb.js new file mode 100644 index 0000000..cac751f --- /dev/null +++ b/tasks/options/csscomb.js @@ -0,0 +1,17 @@ +module.exports = { + + // Sorting CSS properties in specific order + // https://github.com/csscomb/grunt-csscomb + // + // Rule options for csscomb.json can be found here: + // https://github.com/csscomb/csscomb.js + + build: { + options: { + config: 'config/csscomb.json' + }, + files: { + '.tmp/css/resorted-responsive-testing.css': ['.tmp/css/responsive-testing.css'], + } + } +} \ No newline at end of file diff --git a/tasks/options/csslint.js b/tasks/options/csslint.js new file mode 100644 index 0000000..1880817 --- /dev/null +++ b/tasks/options/csslint.js @@ -0,0 +1,33 @@ +module.exports = { + + // Check CSS files for rule violations + // See https://github.com/stubbornella/csslint/wiki + // https://github.com/gruntjs/grunt-contrib-csslint + // + // .csslintrc - a value of false ignores the rule, a value of 2 will set it + // to become an error. Otherwise all rules are considered warnings + // Rules: https://github.com/stubbornella/csslint/wiki/Rules + + options: { + csslintrc: 'csslint.csslintrc', + formatters: [ + { + id: 'compact', + dest: 'report/csslint.json' + } + ] + }, + strict: { + options: { + import: 2 + }, + src: ['<%= temp %>/css/**/*.css'] + }, + lax: { + options: { + import: false + }, + src: ['<%= temp %>/css/**/*.css'] + } + +} \ No newline at end of file diff --git a/tasks/options/grunticon.js b/tasks/options/grunticon.js new file mode 100644 index 0000000..dca15a5 --- /dev/null +++ b/tasks/options/grunticon.js @@ -0,0 +1,17 @@ +module.exports = { + + // Takes a folder of SVG/PNG files and outputs them to CSS + // in 3 formats: svg data urls, png data urls, and a fallback + // CSS file with references to regular png images + // https://github.com/filamentgroup/grunticon + + myIcons: { + files: [{ + expand: true, + cwd: '<%= src %>/images/svg/', + src: ['*.svg'], + dest: "<%= src %>/images/svg-build/" + }], + options: {} + } +} \ No newline at end of file diff --git a/tasks/options/htmlhint.js b/tasks/options/htmlhint.js new file mode 100644 index 0000000..e39e999 --- /dev/null +++ b/tasks/options/htmlhint.js @@ -0,0 +1,36 @@ +module.exports = { + + // Validate html files with htmlhint + // https://github.com/yaniswang/grunt-htmlhint + // + // Available rules can be found here: + // https://github.com/yaniswang/HTMLHint/wiki/Rules + + options: { + // htmlhintrc: '.htmlhintrc', + 'tag-pair': true, + // Force tags to have a closing pair + 'tagname-lowercase': true, + // Force tags to be lowercase + 'attr-lowercase': true, + // Force attribute names to be lowercase e.g.