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 0000000..963ab6f Binary files /dev/null and b/.project/images/compass-logo.png differ diff --git a/.project/images/grunt-logo.png b/.project/images/grunt-logo.png new file mode 100644 index 0000000..aae9632 Binary files /dev/null and b/.project/images/grunt-logo.png differ diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..ff0e154 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,40 @@ +'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'); + // need this to get rid of the "No tasks were registered or unregistered" warning + grunt.registerTask('dummy', []); + +}; diff --git a/README.md b/README.md index 4997aa1..fb1ebb3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,118 @@ -ux-prototype -============ +[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/) -A collection of tools to help you design and build more products and less documentation +# UX Prototype +v0.0.1 + +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..8ea4ea1 --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "name": "ux-prototype", + "version": "0.0.1", + "dependencies": { + "grunt-notify": "~0.2.17" + }, + "devDependencies": { + "grunt": ">=0.4.2", + "grunt-contrib-copy": ">=0.5.0", + "grunt-contrib-concat": ">=0.3.0", + "grunt-contrib-coffee": ">=0.9.0", + "grunt-contrib-uglify": ">=0.3.2", + "grunt-contrib-compass": ">=0.7.1", + "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.5.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.2", + "grunt-mocha": ">=0.4.10", + "grunt-open": ">=0.2.3", + "grunt-concurrent": ">=0.4.3", + "grunt-grunticon": ">=1.0.0", + "grunt-arialinter": ">=0.1.6", + "grunt-shell": ">=0.6.4", + "grunt-prettify": ">=0.3.4", + "grunt-photobox": ">=0.7.1", + "grunt-htmlhint": ">=0.4.0", + "grunt-cssc": ">=0.2.6", + "load-grunt-config": ">=0.7.0", + "assemble": ">=0.4.35", + "matchdep": ">=0.3.0", + "connect-livereload": ">=0.3.2", + "jshint-stylish": ">=0.1.5", + "time-grunt": ">=0.2.9", + "load-grunt-tasks": ">=0.3.0", + "css-condense": "0.0.6", + "jit-grunt": ">=0.2.1", + "grunt-newer": ">=0.6.1", + "grunt-csscomb": ">=2.0.1", + "grunt-sass": ">=0.10.0", + "grunt-contrib-sass": ">=0.7.2", + "grunt-text-replace": "~0.3.10" + }, + "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 0000000..8b70ae0 Binary files /dev/null and b/src/favicon.ico differ diff --git a/src/images/svg-build/grunticon.loader.txt b/src/images/svg-build/grunticon.loader.txt new file mode 100644 index 0000000..32ebc2b --- /dev/null +++ b/src/images/svg-build/grunticon.loader.txt @@ -0,0 +1,2 @@ +/* grunticon Stylesheet Loader | https://github.com/filamentgroup/grunticon | (c) 2012 Scott Jehl, Filament Group, Inc. | MIT license. */ +window.grunticon=function(e){if(e&&3===e.length){var t=window,n=!(!t.document.createElementNS||!t.document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect||!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")||window.opera&&-1===navigator.userAgent.indexOf("Chrome")),o=function(o){var r=t.document.createElement("link"),a=t.document.getElementsByTagName("script")[0];r.rel="stylesheet",r.href=e[o&&n?0:o?1:2],a.parentNode.insertBefore(r,a)},r=new t.Image;r.onerror=function(){o(!1)},r.onload=function(){o(1===r.width&&1===r.height)},r.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}}; \ No newline at end of file diff --git a/src/images/svg-build/icons.data.png.css b/src/images/svg-build/icons.data.png.css new file mode 100644 index 0000000..7c249ec --- /dev/null +++ b/src/images/svg-build/icons.data.png.css @@ -0,0 +1,2 @@ +.icon-icon-settings { background-image: url('data:image/png;base64,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'); background-repeat: no-repeat; } + diff --git a/src/images/svg-build/icons.data.svg.css b/src/images/svg-build/icons.data.svg.css new file mode 100644 index 0000000..04d6496 --- /dev/null +++ b/src/images/svg-build/icons.data.svg.css @@ -0,0 +1,2 @@ +.icon-icon-settings { background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%22512px%22%20height%3D%22512px%22%20viewBox%3D%220%200%20512%20512%22%20enable-background%3D%22new%200%200%20512%20512%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20id%3D%22tools-4-icon%22%20d%3D%22M158.055%2C249.342l160.08%2C160.081c13.483%2C13.481%2C35.338%2C13.479%2C48.82%2C0%20c13.481-13.482%2C13.481-35.338%2C0-48.821l-160.08-160.079c-7.697-7.696-11.661-18.401-10.821-29.252%20c1.59-20.558-5.474-41.66-21.197-57.383c-20.369-20.369-49.916-26.309-75.679-17.399l46.539%2C46.538%20c1.068%2C18.163-27.021%2C46.233-45.159%2C45.159L54.02%2C141.646c-8.864%2C25.632-3.067%2C55.21%2C17.398%2C75.678%20c14.28%2C14.28%2C32.994%2C21.416%2C51.71%2C21.416C128.284%2C238.74%2C144.289%2C235.577%2C158.055%2C249.342z%20M340.861%2C368.679%20c7.856%2C0%2C14.228%2C6.369%2C14.228%2C14.228s-6.371%2C14.229-14.228%2C14.229c-7.857%2C0-14.228-6.37-14.228-14.229%20S333.004%2C368.679%2C340.861%2C368.679z%20M219.444%2C115.329c0%2C0%2C88.328-43.474%2C146.982%2C0.69c33.279%2C25.059%2C28.81%2C47.442%2C43.819%2C62.451%20c13.8%2C13.801%2C30.706%2C2.416%2C30.706%2C2.416L462%2C201.933l-67.281%2C67.281l-21.047-21.047c0%2C0%2C9.086-12.995-1.727-23.806%20c-9.773-9.776-21.966-7.017-34.732%2C5.75c-7.13%2C7.129-30.984%2C30.985-30.984%2C30.985l-46.994-46.995l31.347-31.348%20C319.604%2C153.731%2C289.646%2C122.345%2C219.444%2C115.329z%20M218.553%2C348.385l-61.474%2C61.151c-12.963%2C12.964-33.979%2C12.964-46.94%2C0%20c-12.962-12.96-12.962-33.978%2C0-46.938l61.475-61.153L218.553%2C348.385z%22%2F%3E%3C%2Fsvg%3E'); background-repeat: no-repeat; } + diff --git a/src/images/svg-build/icons.fallback.css b/src/images/svg-build/icons.fallback.css new file mode 100644 index 0000000..54b080d --- /dev/null +++ b/src/images/svg-build/icons.fallback.css @@ -0,0 +1,2 @@ +.icon-icon-settings { background-image: url('png/icon-settings.png'); background-repeat: no-repeat; } + diff --git a/src/images/svg-build/png/icon-settings.png b/src/images/svg-build/png/icon-settings.png new file mode 100644 index 0000000..c138d6c Binary files /dev/null and b/src/images/svg-build/png/icon-settings.png differ 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..01d0e4b --- /dev/null +++ b/src/templates/partials/_footer.hbs @@ -0,0 +1,9 @@ + + + + + + + + + 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..f423ff4 --- /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..39b4de6 --- /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 %>/subdir/': ['<%= src %>/templates/pages/subdir/*.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..d25a2d2 --- /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/**/**' + ] + } + ] + }, + + // 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-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.