Slide 1

Slide 1 text

Automate ALL THE FRONT-END THINGS! Text SotR 2014 • Kitt Hodsden • http://ki.tt • @kitt 1

Slide 2

Slide 2 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 2 AUTOMATE

Slide 3

Slide 3 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 3 Hi!

Slide 4

Slide 4 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Who are you? 4

Slide 5

Slide 5 text

Kitt Hodsden • @kitt • http://ki.tt/sotr And what do have we here? 5

Slide 6

Slide 6 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://ki.tt/sotr 6

Slide 7

Slide 7 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 7 http://ki.tt/sotr

Slide 8

Slide 8 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 8 http://ki.tt/sotr http://ki.tt/sotr

Slide 9

Slide 9 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Wait... what? 9 What are we talking about?

Slide 10

Slide 10 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Wait... what? 10 What are we talking about?

Slide 11

Slide 11 text

Kitt Hodsden • @kitt • http://ki.tt/sotr You are invited to participate in group note taking at: http://ki.tt/sotr14notes 11 Community knowledge!

Slide 12

Slide 12 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Demo files / examples available at: http://ki.tt/sotr.zip 12 Demo files!

Slide 13

Slide 13 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Prerequisites! 13

Slide 14

Slide 14 text

Kitt Hodsden • @kitt • http://ki.tt/sotr node & ruby (and maybe python & php) 14 We need node and ruby to use the tools we’re going to talk about.

Slide 15

Slide 15 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 15 Setup node by downloading the installer and running it. http://nodejs.org

Slide 16

Slide 16 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 16 # mac / linux $ which ruby /usr/local/bin/ruby $ ruby --version ruby 2.0.0p195 # windows > where ruby C:\Ruby200\bin\ruby.exe > ruby --version ruby 2.0.0p451 Yay! Sass installed! See if you already have ruby installed

Slide 17

Slide 17 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 17 RVM RUBY VERSION MANAGER https://rvm.io/rvm/install Install ruby in different ways on OSX OSX

Slide 18

Slide 18 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 18 RVM RUBY VERSION MANAGER https://rvm.io/rvm/install Install ruby in different ways on OSX OSX

Slide 19

Slide 19 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 19 https://unfiniti.com/software/mac/jewelrybox Ruby on OSX, I recommend JewelryBox, too.

Slide 20

Slide 20 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 20 APT / YUM $ sudo apt-get install ruby1.9.1 $ sudo yum install ruby1.9.1 RVM RUBY VERSION MANAGER https://rvm.io/rvm/install Install ruby in different ways on Linux Linux http://ki.tt/s223

Slide 21

Slide 21 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 21 APT / YUM $ sudo apt-get install ruby1.9.1 $ sudo yum install ruby1.9.1 RVM RUBY VERSION MANAGER https://rvm.io/rvm/install Install ruby in different ways on Linux Linux http://ki.tt/s223

Slide 22

Slide 22 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 22 Install ruby in different ways on Windows Windows http://chocolatey.org/

Slide 23

Slide 23 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 23 C:\> cinst ruby Install ruby in different ways on Windows Windows

Slide 24

Slide 24 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 24 RUBYINSTALLER http://rubyinstaller.org/downloads/ PIK https://github.com/vertiginous/pik Install ruby in different ways on Windows Windows CYGWIN http://cygwin.com

Slide 25

Slide 25 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://ki.tt/sotr 25

Slide 26

Slide 26 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 26

Slide 27

Slide 27 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 27 Automate All the Front-End Things!

Slide 28

Slide 28 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY principle 28 Guiding principles of making our workflows AWESOME

Slide 29

Slide 29 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY principle 2. Make changes easy 29 Guiding principles of making our workflows AWESOME

Slide 30

Slide 30 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy 30 Guiding principles of making our workflows AWESOME

Slide 31

Slide 31 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype 31 What magic do we do?

Slide 32

Slide 32 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs 32 What magic do we do?

Slide 33

Slide 33 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers 33 What magic do we do?

Slide 34

Slide 34 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 34 What magic do we do?

Slide 35

Slide 35 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 35 What magic do we do?

Slide 36

Slide 36 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 36 We’re MAGICAL

Slide 37

Slide 37 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 37

Slide 38

Slide 38 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 38 How often do we have a blank slate, really?

Slide 39

Slide 39 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 39

Slide 40

Slide 40 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 40

Slide 41

Slide 41 text

Kitt Hodsden • @kitt • http://ki.tt/sotr change. click. change. click. 41

Slide 42

Slide 42 text

Kitt Hodsden • @kitt • http://ki.tt/sotr change. click. change. click. 42 change. click. change. click. change click. change. click. change. click. hange. click. hange. click. hange. click. change. click. change click. change click. change. click.

Slide 43

Slide 43 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 43 Guiding principles! 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy

Slide 44

Slide 44 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 44 3

Slide 45

Slide 45 text

Kitt Hodsden • @kitt • http://ki.tt/sotr LiveReload 45 http://livereload.com/

Slide 46

Slide 46 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 46

Slide 47

Slide 47 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 47 http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions- http://ki.tt/LR

Slide 48

Slide 48 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 48 http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions- http://ki.tt/LR

Slide 49

Slide 49 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 49 or!

Slide 50

Slide 50 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 50 document.write('<script src="http://' + (location.host || 'localhost').split(':') [0] + ':35729/livereload.js?snipver=1"></' + 'script>') If you don’t use browser plugins, you need this JS for LiveReload

Slide 51

Slide 51 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 51

Slide 52

Slide 52 text

Kitt Hodsden • @kitt • http://ki.tt/sotr IE options http://github.com/dvdotsenko/livereload_ie_extension http://reloadit.codeplex.com/ 52 LiveReload IE options

Slide 53

Slide 53 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 53

Slide 54

Slide 54 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 54 Guiding principles! 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy

Slide 55

Slide 55 text

Kitt Hodsden • @kitt • http://ki.tt/sotr browser-sync 55 http://browsersync.io/

Slide 56

Slide 56 text

Kitt Hodsden • @kitt • http://ki.tt/sotr With your handy local development web server... 56

Slide 57

Slide 57 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://ki.tt/3ws 57 LOTS of different ways to start a local webserver Need one quick?

Slide 58

Slide 58 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 58 $ python -m SimpleHTTPServer 8000

Slide 59

Slide 59 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 59 Open a new terminal or command window

Slide 60

Slide 60 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 60 In OSX, drag and drop the folder into the terminal window for the path.

Slide 61

Slide 61 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 61 In Windows, use right click cut and paste

Slide 62

Slide 62 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://localhost:8000/index.html http://127.0.0.1:8000/index.html 62 You can see the temporary site running locally!

Slide 63

Slide 63 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 63 $ npm install connect && echo "var c = require('connect');c.createServer(c .static(__dirname)).listen(8000);" | node

Slide 64

Slide 64 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm 64 Node Package Manager for installng node packages

Slide 65

Slide 65 text

Kitt Hodsden • @kitt • http://ki.tt/sotr browser-sync 65 http://browsersync.io/

Slide 66

Slide 66 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://ki.tt/sotr.zip 66 Demo files if you’d like to follow along Example files, if you’d like.

Slide 67

Slide 67 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 67 $ npm install -g browser-sync

Slide 68

Slide 68 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 68 $ browser-sync start --server --files "css/*.css"

Slide 69

Slide 69 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 69

Slide 70

Slide 70 text

Kitt Hodsden • @kitt • http://ki.tt/sotr bs-config.js 70

Slide 71

Slide 71 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 71 $ browser-sync init [BS] Config file created (bs-config.js) [BS] To use it, in the same directory run: browser-sync $

Slide 72

Slide 72 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 72 module.exports = { files: "css/*.css", proxy: { host: "localhost", port: 8000 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true, }; https://github.com/shakyShane/browser-sync/wiki/options

Slide 73

Slide 73 text

Kitt Hodsden • @kitt • http://ki.tt/sotr module.exports = { files: "css/*.css", proxy: { host: "localhost", port: 8000 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true, }; 73 https://github.com/shakyShane/browser-sync/wiki/options

Slide 74

Slide 74 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 74 module.exports = { files: ["css/*.css", "**.*.html", "js/**/*.js"], proxy: { host: "localhost", port: 8000 }, ghostMode: { clicks: true, links: true, forms: true, scroll: true }, open: true, injectChanges: false, notify: true, }; https://github.com/shakyShane/browser-sync/wiki/options

Slide 75

Slide 75 text

Kitt Hodsden • @kitt • http://ki.tt/sotr https://github.com/shakyShane/browser-sync/wiki/options 75

Slide 76

Slide 76 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 76 $ browser-sync start

Slide 77

Slide 77 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 77 $ browser-sync start [BS] Copy the following snippet into your website, just before the closing body> tag var ___socket___ = io.connect('http://192.168.5.6:3000'); [BS] Watching files...

Slide 78

Slide 78 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 78

Slide 79

Slide 79 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 79 MAGICAL

Slide 80

Slide 80 text

Kitt Hodsden • @kitt • http://ki.tt/sotr click. copy. scroll. click. paste. 80

Slide 81

Slide 81 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 81

Slide 82

Slide 82 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Alfred http://alfredapp.com/ Quicksilver http://qsapp.com/ Launchbar http://www.obdev.at/products/launchbar/ 82

Slide 83

Slide 83 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Skylight http://www.candylabs.com/skylight Launchy http://www.launchy.net/ http://pylaunchy.sourceforge.net/docs/ FARR https://www.donationcoder.com/Software/Mouser/findrun/ 83

Slide 84

Slide 84 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Gnome Launch Box https://live.gnome.org/ Gnome Do http://do.davebsd.com/ Launchy http://www.launchy.net/ http://pylaunchy.sourceforge.net/ 84

Slide 85

Slide 85 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 85

Slide 86

Slide 86 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 86

Slide 87

Slide 87 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 87

Slide 88

Slide 88 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 88 http://kapeli.com/dash

Slide 89

Slide 89 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 89 http://zealdocs.org/

Slide 90

Slide 90 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 90 Alfred looking up jQuery.

Slide 91

Slide 91 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 91 Dash has a large number of document sets

Slide 92

Slide 92 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 92 Naïve way to open all the browsers at once

Slide 93

Slide 93 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 93 https://github.com/zenorocha/alfred-workflows/ https://github.com/aiyodk/Alfred-Extensions/tree/master/AlfredApp_2.x https://github.com/willfarrell/alfred-workflows Alfred Workflows

Slide 94

Slide 94 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Can you feel the awesome? 94 Awwwwwwwww yissssssssssssssssssss!

Slide 95

Slide 95 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 3 95

Slide 96

Slide 96 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 96

Slide 97

Slide 97 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 97 $ npm install -g grunt-cli Install the grunt package

Slide 98

Slide 98 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 98 Windows users, use PowerShell

Slide 99

Slide 99 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 99 $ npm install -g grunt-init $ git clone https://github.com/ gruntjs/grunt-init-gruntfile.git ~/.grunt-init/gruntfile $ grunt-init gruntfile Download the grunt template files and generate the grunt config files ...

Slide 100

Slide 100 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Or just download them. http://ki.tt/fgrf 100

Slide 101

Slide 101 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 101 package.json Gruntfile.js The two files grunt uses

Slide 102

Slide 102 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 102 { "engines": { "node": ">= 0.10.0" }, "devDependencies": { "grunt": "~0.4.2", "grunt-contrib-jshint": "~0.7.2", "grunt-contrib-watch": "~0.5.3", } } This is what a package.json file looks like

Slide 103

Slide 103 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 103 $ npm install With a package.json file, you can install the needed packages easily.

Slide 104

Slide 104 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Watch for file changes 2. Refresh the browser on change 104 What we want grunt to do.

Slide 105

Slide 105 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 105 module.exports = function(grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%="yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } }); // Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify'); // Default task(s). grunt.registerTask('default', ['uglify']); }; A basic Gruntfile.js file

Slide 106

Slide 106 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 106 module.exports = function(grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%="yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } }); // Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify'); // Default task(s). grunt.registerTask('default', ['uglify']); }; A basic Gruntfile.js file

Slide 107

Slide 107 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 107 module.exports = function(grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%="yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } }); // Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify'); // Default task(s). grunt.registerTask('default', ['uglify']); }; A basic Gruntfile.js file

Slide 108

Slide 108 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 108 module.exports = function(grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%="yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } }); // Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify'); // Default task(s). grunt.registerTask('default', ['uglify']); }; A basic Gruntfile.js file

Slide 109

Slide 109 text

Kitt Hodsden • @kitt • http://ki.tt/sotr browser-sync 109

Slide 110

Slide 110 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Find grunt plugin* 2. Install with npm install --save-dev 3. Add the task to our Gruntfile.js file 4. Add the tasks to a command 5. Run the command ... 7. Profit! *write if you need to 110 How to add a task to grunt

Slide 111

Slide 111 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://npmjs.org 111 Where to find node and grunt packages

Slide 112

Slide 112 text

Kitt Hodsden • @kitt • http://ki.tt/sotr “grunt browser-sync” 112 What I searched for on npmjs.org

Slide 113

Slide 113 text

Kitt Hodsden • @kitt • http://ki.tt/sotr THIS IS OKAY. 113

Slide 114

Slide 114 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 114 Check for current state before downloading.

Slide 115

Slide 115 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 115 $ npm install grunt-browser-sync --save-dev Installing the browser-sync grunt package

Slide 116

Slide 116 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 116 $ ls Gemfile!! README.txt fonts node_modules template.php Gemfile.lock bs-config.js images package.json templates Gruntfile.js config.rb js screenshot.png theme.info Guardfile! css logo.png scss widgets

Slide 117

Slide 117 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 117 "grunt-browser-sync": "^0.9.1"

Slide 118

Slide 118 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 118 browserSync: { files: { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8000 }, server: false, } },

Slide 119

Slide 119 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 119 browserSync: { files: { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8000 }, server: false, } },

Slide 120

Slide 120 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 120 browserSync: { files: { src: [ 'css/*.css', 'img/*', 'js/*.js', '*.html' ] }, options: { watchTask: true, proxy: { host: "localhost", port: 8000 }, server: false, } },

Slide 121

Slide 121 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 121 watch: { gruntfile: { files: '<%= jshint.gruntfile.src %>', tasks: ['jshint:gruntfile'] }, scss: { files: ['scss/*.scss'], tasks: ['sass:dev'] }, js: { // watch for js changes except for script.min.js files: ['js/*.js', '!js/script.min.js'], tasks: ['uglify:dev'] } }

Slide 122

Slide 122 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 122 grunt.loadNpmTasks('grunt-browser-sync'); ... grunt.registerTask('default', ['browserSync', ‘watch’]);

Slide 123

Slide 123 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 123 grunt.registerTask('gogogo', ['browserSync', 'watch']);

Slide 124

Slide 124 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 124 $ grunt gogogo Running the newly defined “gogogo” command

Slide 125

Slide 125 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 125

Slide 126

Slide 126 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 126 modern.ie

Slide 127

Slide 127 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 127

Slide 128

Slide 128 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 128

Slide 129

Slide 129 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Javascript? 129

Slide 130

Slide 130 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 130 1. Find grunt plugin* 2. Install with npm install --save-dev 3. Add the task to our Gruntfile.js file 4. Add the tasks to a command 5. Run the command ... 7. Profit! *write if you need to

Slide 131

Slide 131 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy 131 Guiding principles of making our workflows AWESOME

Slide 132

Slide 132 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 132 $ npm install matchdep --save-dev Installing the browser-sync grunt package

Slide 133

Slide 133 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 133 ... // load all the grunt modules instead of one each line require("matchdep").filterDev("grunt-*").forEach(grunt.loadNpmTasks); grunt.registerTask('checkjs', ['jshint']); grunt.registerTask('watchjs', ['jshint', 'watch']); grunt.registerTask('gruntjs', ['jshint:gruntfile', 'watch']);

Slide 134

Slide 134 text

Kitt Hodsden • @kitt • http://ki.tt/sotr jshint 134

Slide 135

Slide 135 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-jshint --save-dev 135 Use jshint when editing your Gruntfile.js https://github.com/gruntjs/grunt-contrib-jshint

Slide 136

Slide 136 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 136 jshint: { options: { ... }, gruntfile: { src: ‘Gruntfile.js’ } } ... grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.registerTask('checkjs', ['jshint']); grunt.registerTask('watchjs', ['jshint', 'watch']); grunt.registerTask('gruntjs', ['jshint:gruntfile', 'watch']);

Slide 137

Slide 137 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 137

Slide 138

Slide 138 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-qunit --save-dev 138 Javascript unit tests https://github.com/gruntjs/grunt-contrib-qunit

Slide 139

Slide 139 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-jasmine --save-dev 139 Javascript unit tests https://github.com/gruntjs/grunt-contrib-jasmine

Slide 140

Slide 140 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-simple-mocha --save-dev 140 Javascript unit tests https://github.com/yaymukund/grunt-simple-mocha

Slide 141

Slide 141 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 141

Slide 142

Slide 142 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 142

Slide 143

Slide 143 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Reduce file sizes 2. Reduce the number of files 3. Reduce content rendering time 143

Slide 144

Slide 144 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 144 1. Reduce file sizes 2. Reduce the number of files 3. Reduce content rendering time

Slide 145

Slide 145 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Images 145

Slide 146

Slide 146 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-imagemin --save-dev 146 Make pages load faster by reducing image sizes

Slide 147

Slide 147 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 147 imagemin: { prod: { files: [{ expand: true, cwd: 'imgs-src/', src: ['**/*.{png,jpg,gif}'], dest: 'imgs/' }] } }

Slide 148

Slide 148 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-svgmin --save-dev 148 Reduce SVG sizes, too

Slide 149

Slide 149 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 149 grunt.initConfig({ svgmin: { // Task options: { // Configuration that will be passed directly to SVGO plugins: [ { removeViewBox: false }, { removeUselessStrokeAndFill: false } ] }, dist: { // Target files: [{ // Dictionary of files expand: true, // Enable dynamic expansion. cwd: 'img/src', // Src matches are relative to this path. src: ['**/*.svg'], // Actual pattern(s) to match. dest: 'img/', // Destination path prefix. ext: '.min.svg' // Dest filepaths will have this extension. // ie: optimise img/src/branding/logo.svg and store it in img/branding/logo.min.svg }] } }); grunt.loadNpmTasks('grunt-svgmin'); grunt.registerTask('default', ['svgmin']); Sample grunt-svgmin configuration

Slide 150

Slide 150 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-responsive-images --save-dev 150 Responsive images by resizing https://github.com/andismith/grunt-responsive-images

Slide 151

Slide 151 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 151 grunt.initConfig({ responsive_images: { myTask: { options: { sizes: [{ width: 320, height: 240 },{ name: 'large', width: 640 },{ name: "large", width: 1024, suffix: "_x2", quality: 60 }] }, files: [{ expand: true, src: ['assets/**.{jpg,gif,png}'], cwd: 'test/', dest: 'resize/{%= width %}/' }] } }, }); Sample grunt-responsive-images configuration

Slide 152

Slide 152 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-grunticon --save-dev 152 SVG with PNG fallbacks https://github.com/filamentgroup/grunticon

Slide 153

Slide 153 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Non-images 153

Slide 154

Slide 154 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-cssmin --save-dev 154 Minimize CSS files

Slide 155

Slide 155 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-csscss --save-dev 155 Minimize CSS files

Slide 156

Slide 156 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-uncss --save-dev 156 Remove unused CSS

Slide 157

Slide 157 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-uglify --save-dev 157 Minimize javascript files

Slide 158

Slide 158 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 158 1. Reduce file sizes 2. Reduce the number of files 3. Reduce content rendering time

Slide 159

Slide 159 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Sprites! 159 Making things easier with sprites!

Slide 160

Slide 160 text

Kitt Hodsden • @kitt • http://ki.tt/sotr WHOO! 160

Slide 161

Slide 161 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Creating them is EASY! 161

Slide 162

Slide 162 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-montage --save-dev 162 Sprite your images

Slide 163

Slide 163 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 163 grunt.initConfig({ montage: { iconaroo: { files: { "images/sprites": [ "images/icons/*.png" ] }, options: { size: 32, outputImage: "sprite-icons.png", outputStylesheet: "sprite-icons.css" } } } }); Sample grunt-montage configuration

Slide 164

Slide 164 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Wow. That was a lot of work. 164

Slide 165

Slide 165 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 165 $ mkdir 640x480; for file in *.jpg; do convert $file -resize \ 640x480 640x480/$file; done A “one-liner” that resizes images

Slide 166

Slide 166 text

Kitt Hodsden • @kitt • http://ki.tt/sotr aliases / functions / scripts 166

Slide 167

Slide 167 text

Kitt Hodsden • @kitt • http://ki.tt/sotr aliases / functions / scripts 167

Slide 168

Slide 168 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 168 zsh, bash format alias d="dirs -v" tcsh format alias d 'dirs -v' Alias syntax

Slide 169

Slide 169 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 169 $ cat ~/.bash_profile alias d='dirs -v' alias pu='pushd' alias po='popd' alias sa='source ~/.bash_profile' alias pdw='pwd' alias purge='rm *.~*~' alias mroe='more' alias memacs='emacs `git st | grep modified | cut -c14-180`' alias sotr='pushd ~/talks/2014/sotr' Create aliases

Slide 170

Slide 170 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 170 history | cut -c8-120 | cut -d" " -f1 | sort | uniq -c | sort Good candidates for your aliases

Slide 171

Slide 171 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 171 http://alias.sh/

Slide 172

Slide 172 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 172 http://twitter.com/climagic

Slide 173

Slide 173 text

Kitt Hodsden • @kitt • http://ki.tt/sotr aliases / functions / scripts 173

Slide 174

Slide 174 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 174 function envg() { env | grep -i $1; } Functions if your arguments vary

Slide 175

Slide 175 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 175 $ mkdir new-dir && cd $_ # function mkcd { mkdir $1 && cd $1; } $ mkcd new-dir Functions if your arguments vary

Slide 176

Slide 176 text

Kitt Hodsden • @kitt • http://ki.tt/sotr aliases / functions / scripts 176

Slide 177

Slide 177 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 177 #!/usr/bin/env bash mkdir 640x480 for file in *.jpg; do convert $file -resize 640x480 640x480/$file; done A bash script to convert

Slide 178

Slide 178 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 178 #!/usr/bin/env bash echo “make the resize dir 640x480” mkdir 640x480 echo “resize each file” for file in *.jpg; echo “ resizing $file” do convert $file -resize 640x480 640x480/$file; done A bash script to convert

Slide 179

Slide 179 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 179 #!/usr/bin/env bash -x echo “make the resize dir 640x480” mkdir 640x480 echo “resize each file” for file in *.jpg; echo “ resizing $file” do convert $file -resize 640x480 640x480/$file; done A bash script to convert

Slide 180

Slide 180 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 180 bash-3.2$ resize-images.sh + mkdir 640x480 mkdir: 640x480: File exists + for file in '*.jpg' + convert place-kitten-01.jpg -resize 640x480 640x480/place-kitten-01.jpg + for file in '*.jpg' + convert place-kitten-02.jpg -resize 640x480 640x480/place-kitten-02.jpg + for file in '*.jpg' + convert place-kitten-03.jpg -resize 640x480 640x480/place-kitten-03.jpg + for file in '*.jpg' + convert place-kitten-04.jpg -resize 640x480 640x480/place-kitten-04.jpg + for file in '*.jpg' + convert place-kitten-05.jpg -resize 640x480 640x480/place-kitten-05.jpg Output with -x for the bash script

Slide 181

Slide 181 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://www.kfirlavi.com/blog/2012/11/14/ defensive-bash-programming/ 181

Slide 182

Slide 182 text

Kitt Hodsden • @kitt • http://ki.tt/sotr just completed! 182

Slide 183

Slide 183 text

Kitt Hodsden • @kitt • http://ki.tt/sotr livereload, browser-sync, grunt, alfred, productivity apps, aliases, functions, scripts 183

Slide 184

Slide 184 text

Kitt Hodsden • @kitt • http://ki.tt/sotr next up! 184

Slide 185

Slide 185 text

Kitt Hodsden • @kitt • http://ki.tt/sotr sass, media queries, source maps, pattern lab, phantomcss, wraith, emmet, yeoman, bower 185

Slide 186

Slide 186 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Add your suggestions! http://ki.tt/sotr14notes 186 Community knowledge! (You’re awesome!)

Slide 187

Slide 187 text

all the front-end things? (automating front-end workflows, part two) Text SotR 2014 • Kitt Hodsden • http://ki.tt • @kitt 187

Slide 188

Slide 188 text

Text 188

Slide 189

Slide 189 text

Kitt Hodsden • @kitt • http://ki.tt/sotr livereload, browser-sync, grunt, alfred, productivity apps, aliases, functions, scripts 189

Slide 190

Slide 190 text

Kitt Hodsden • @kitt • http://ki.tt/sotr sass, media queries, source maps, pattern lab, phantomcss, wraith, emmet, yeoman, bower 190

Slide 191

Slide 191 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://ki.tt/sotr 191

Slide 192

Slide 192 text

Kitt Hodsden • @kitt • http://ki.tt/sotr You are invited to participate in group note taking at: http://ki.tt/sotr14notes 192 Community knowledge!

Slide 193

Slide 193 text

Kitt Hodsden • @kitt • http://ki.tt/sotr You are invited to participate in group note taking at: http://ki.tt/sotr14notes 193 Community knowledge!

Slide 194

Slide 194 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy 194 Guiding principles of making our workflows AWESOME

Slide 195

Slide 195 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 195 What magic do we do?

Slide 196

Slide 196 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster 196 What magic do we do?

Slide 197

Slide 197 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Reduce file sizes 2. Reduce the number of files 3. Reduce content rendering time 197

Slide 198

Slide 198 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 198 1. Reduce file sizes 2. Reduce the number of files 3. Reduce content rendering time

Slide 199

Slide 199 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 199 1. Reduce file sizes 2. Reduce the number of files 3. Reduce content rendering time

Slide 200

Slide 200 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy 200 Guiding principles of making our workflows AWESOME

Slide 201

Slide 201 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Change the font BLUE 201 Easiest change ever!

Slide 202

Slide 202 text

Kitt Hodsden • @kitt • http://ki.tt/sotr #6c869d 㱺 #212939 202 Easiest change ever!

Slide 203

Slide 203 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 203 Well, phooey. The ticket was reopened.

Slide 204

Slide 204 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 204 Soon, EVERYTHING is important!

Slide 205

Slide 205 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 205

Slide 206

Slide 206 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 206

Slide 207

Slide 207 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 207 Guiding principles! 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy

Slide 208

Slide 208 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 208 Guiding principles! 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy

Slide 209

Slide 209 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Use a CSS preprocessor. 209 Saw that coming, didn’t you?

Slide 210

Slide 210 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Sass / LESS / Stylus 210 Saw that coming, didn’t you?

Slide 211

Slide 211 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Quick check! 211

Slide 212

Slide 212 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Sass ⟳ CSS 212

Slide 213

Slide 213 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Getting started with Sass 213

Slide 214

Slide 214 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Install it. 214

Slide 215

Slide 215 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 215 $ gem update --system $ gem install sass $ sudo gem update --system $ sudo gem install sass Yay! Sass installed!

Slide 216

Slide 216 text

Kitt Hodsden • @kitt • http://ki.tt/sotr COMPASS 216 Install Compass, too http://compass-style.org/install/

Slide 217

Slide 217 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 217 $ gem update --system $ gem install compass $ sudo gem update --system $ sudo gem install compass Setting up tools. In this case, Compass.

Slide 218

Slide 218 text

Kitt Hodsden • @kitt • http://ki.tt/sotr See also: Bourbon 218 Bourbon is another example of extending Sass http://bourbon.io/

Slide 219

Slide 219 text

Kitt Hodsden • @kitt • http://ki.tt/sotr CSS 㱺 Sass 219

Slide 220

Slide 220 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Let us count the (3) ways. 220 How we get started with Sass in an existing project.

Slide 221

Slide 221 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Move and rename files. 221 How we get started with Sass in an existing project.

Slide 222

Slide 222 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 222 $ mkdir scss $ mv css/styles.css scss/styles.scss Setting up tools. In this case, Compass.

Slide 223

Slide 223 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Use sass-convert 223 How we get started with Sass in an existing project.

Slide 224

Slide 224 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 224 $ sass-convert --help Usage: sass-convert [options] [INPUT] [OUTPUT] $ $ cd theme-dir $ sass-convert --recursive --from=css --to=scss css scss Setting up tools. In this case, Compass.

Slide 225

Slide 225 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Use http://css2sass.heroku.com 225 How we get started with Sass in an existing project.

Slide 226

Slide 226 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 226

Slide 227

Slide 227 text

Kitt Hodsden • @kitt • http://ki.tt/sotr $variables 227 Quick! Sass in 5 slides!

Slide 228

Slide 228 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 228 $variable: value; Before variables...

Slide 229

Slide 229 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 229 dev[405]% grep background-color * style.css: background-color: #edf5fa; style.css: background-color: #ddecf5; style.css: background-color: #e6f1f7; style.css: background-color: #d4e7f3; style.css: background-color: #edf5fa; style.css: background-color: #fcfce8; style.css: background-color: #fcf9e5; style.css: background-color: #fbf5cf; style.css: background-color: #fefefe; style.css: background-color: #f5f5f5; style.css: background-color: #fdf5e6; style.css: background-color: #fdf2de; style.css: background-color: #fbe4e4; style.css: background-color: #fbdbdb; style.css: background-color: #ffcccc; style.css: background-color: #ffffdd; style.css: background-color: #ddffdd; Before variables...

Slide 230

Slide 230 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 230 $color-main: rgb(255,251,114); $color-second: rgb(70,87,204); $color-hilite: rgb(189,177,255); ... .button { background-color: $color-main; ... } See? Easy!

Slide 231

Slide 231 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 231 $font-times: Cambria, "Hoefler Text", Utopia, "Liberation Serif", "Nimbus Roman No9 L Regular", Times, "Times New Roman", serif; $font-garamond: "Palatino Linotype", Palatino, Palladio, "URW Palladio L", "Book Antiqua", Baskerville, "Bookman Old Style", "Bitstream Charter", "Nimbus Roman No9 L", Garamond, "Apple Garamond", "ITC Garamond Narrow", "New Century Schoolbook", "Century Schoolbook", "Century Schoolbook L", Georgia, serif; Uses of variables: fonts http://css-tricks.com/snippets/css/font-stacks/

Slide 232

Slide 232 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 232 $color-main: #ff0000; $border-main: 2px solid $color-main; .multivalue-example { border-top: $border-main; } # compiles to .multivalue-example { border-top: 2px solid red; } See? Easy!

Slide 233

Slide 233 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Variable name best practice. 233

Slide 234

Slide 234 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 234 $ourBlue : #1f4363; $ourBlueLight : #355673; $ourBlueLighter : #6c869d; $ourBlueDark : #0e2c47; $ourBlueDarker : #212939; $ourBlueHover : #7e99b3; ... $color_border $ourBlue; $color_link: $ourBlue; $table_header: $ourBlueLighter; Use descriptive AND functional variable names http://sachagreif.com/sass-color-variables

Slide 235

Slide 235 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Nested syntax 235 Quick! Sass in 5 slides!

Slide 236

Slide 236 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 236 .navigation { a { display: block; padding: .5em; color: $color-link; border: none; } b { font-size: .9em; } span { display: block; font-size: .8em; } } .navigation a { display: block; padding: .5em; color: #444040; border: none; } .navigation b { font-size: .9em; } .navigation span { display: block; font-size: .8em; } Sass syntax, talking nesting

Slide 237

Slide 237 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 237 .navigation { a { display: block; padding: .5em; &:hover { color: $color-link; border: none; } } &>.first { padding-left: 0; } } Sass syntax, talking nesting

Slide 238

Slide 238 text

Kitt Hodsden • @kitt • http://ki.tt/sotr @extend 238 Quick! Sass in 5 slides!

Slide 239

Slide 239 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 239 Sass syntax, talking @extend .box { padding: 2em; color: $color-text; background-color: $color-bg; } .box-warning { @extend .box; border: 2px dotted $color-yikes; } .box-success { @extend .box; border: 2px dotted $color-success; } .box-info { @extend .box; border: 2px dotted $color-info; }

Slide 240

Slide 240 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 240 Sass syntax, talking @extend .box, .box-warning, .box-success, .box-info { padding: 2em; color: #333333; background-color: white; } .box-warning { border: 2px dotted #cc0000; } .box-success{ border: 2px dotted #33cc00; } .box-info { border: 2px dotted #996633; }

Slide 241

Slide 241 text

Kitt Hodsden • @kitt • http://ki.tt/sotr
...
241 Sass syntax, talking @extend

Slide 242

Slide 242 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 242 Sass syntax, talking @extend
...

Slide 243

Slide 243 text

Kitt Hodsden • @kitt • http://ki.tt/sotr @mixin @include 243 Quick! Sass in 5 slides!

Slide 244

Slide 244 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 244 Sass syntax, @mixin @mixin module($parent-color) { color: darken($parent-color, 50%); } .main_module { @include module(#ccc); min-height: 3em; } .sidebar_module { @include module(#444); min-height: 2em; }

Slide 245

Slide 245 text

Kitt Hodsden • @kitt • http://ki.tt/sotr When you can, use a Compass (or Bourbon) mixin. 245

Slide 246

Slide 246 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 246 Sass syntax, @mixin @import "compass/css3/box-sizing"; el { @include box-sizing(border-box); } http://compass-style.org/reference/compass/css3/box_sizing/

Slide 247

Slide 247 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 247 Sass Overview http://caniuse.com/

Slide 248

Slide 248 text

Kitt Hodsden • @kitt • http://ki.tt/sotr @mixin vs @extend 248 Sass Overview

Slide 249

Slide 249 text

Kitt Hodsden • @kitt • http://ki.tt/sotr You’re awesome. 249

Slide 250

Slide 250 text

Kitt Hodsden • @kitt • http://ki.tt/sotr _partials.scss 250 Quick! Sass in 5 slides!

Slide 251

Slide 251 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 251 Sass syntax, @mixin @import "vars"; @import "mixins"; @import "layouts/*";

Slide 252

Slide 252 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 252 Quick! Sass in 5 slides!

Slide 253

Slide 253 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 253 Quick! Sass in 5 slides! @if/@else @for @each @functions (return a single value)

Slide 254

Slide 254 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Media Queries made EASY 254

Slide 255

Slide 255 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 255 @mixin bp($point) { $bp-mobile: "(max-width: 600px)"; $bp-notso: "(max-width: 1250px)"; $bp-fullon: "(max-width: 1600px)"; @if $point == mq-fullon { @media #{$bp-fullon} { @content; } } @else if $point == mq-notso { @media #{$bp-notso} { @content; } } @else if $point == mq-mobile { @media #{$bp-mobile} { @content; } } }

Slide 256

Slide 256 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 256 h1 { font-size: 20px; font-family: $font-main; @include bp(mq-notso) { font-size: 30px; } @include bp(mq-fullon) { font-size: 60px; } }

Slide 257

Slide 257 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 257 h1 { font-size: 20px; } @media (max-width: 1250px) { h1 { font-size: 30px; } } @media (max-width: 1600px) { h1 { font-size: 60px; } }

Slide 258

Slide 258 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://breakpoint-sass.com/ 258 Quick! Sass in 5 slides!

Slide 259

Slide 259 text

Kitt Hodsden • @kitt • http://ki.tt/sotr More Information. 259 Sass for Designers Pragmatic Guide To Sass Sass and Compass in Action

Slide 260

Slide 260 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 260 sass --watch --line-numbers --style expanded scss:css

Slide 261

Slide 261 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 261 Guiding principles! 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy

Slide 262

Slide 262 text

Kitt Hodsden • @kitt • http://ki.tt/sotr aliases / functions / scripts 262

Slide 263

Slide 263 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 263 alias sassgo="cd ~/project ;sass --watch \ --line-numbers --style expanded scss:css"

Slide 264

Slide 264 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 264 function sassgo() { cd $1; sass --watch --line-numbers --style expanded scss:css }

Slide 265

Slide 265 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 265 #!/usr/bin/env bash cd ~/project sass --watch --line-numbers --style expanded scss:css

Slide 266

Slide 266 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 266

Slide 267

Slide 267 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 267

Slide 268

Slide 268 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Compass has its config.rb 268

Slide 269

Slide 269 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 269

Slide 270

Slide 270 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 270 compass config config.rb --sass-dir=scss \ --css-dir=css --javascripts-dir=js \ --output-style=expanded How to create a compass conifig.rb file

Slide 271

Slide 271 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 271 $ compass watch

Slide 272

Slide 272 text

Kitt Hodsden • @kitt • http://ki.tt/sotr GUI 272

Slide 273

Slide 273 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 273 https://incident57.com/codekit/

Slide 274

Slide 274 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 274 http://compass.kkbox.com/

Slide 275

Slide 275 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 275 http://koala-app.com/

Slide 276

Slide 276 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 276 https://github.com/vladikoff/grunt-devtools

Slide 277

Slide 277 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Watch for file changes 2. Compile our Sass to CSS 3. Refresh the browser on change 277 What we want grunt to do.

Slide 278

Slide 278 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-compass --save-dev 278 Installing the compass compiling node package

Slide 279

Slide 279 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 279 grunt.initConfig({ compass: { dist: { options: { config: 'config.rb' } } } });

Slide 280

Slide 280 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 280 grunt.initConfig({ watch: { scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, } });

Slide 281

Slide 281 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 281 grunt.initConfig({ watch: { scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, } });

Slide 282

Slide 282 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 282 grunt.initConfig({ watch: { scss: { files: ['**/*.scss'], tasks: ['compass'] } }, compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, } });

Slide 283

Slide 283 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 283 compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded' } }, prod: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'compressed' } }, }

Slide 284

Slide 284 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 284 grunt.loadNpmTasks('grunt-contrib-compass'); ... grunt.registerTask('default', ['compass:dev', ‘watch’]);

Slide 285

Slide 285 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 285

Slide 286

Slide 286 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 286 1. Reduce file sizes 2. Reduce the number of files 3. Reduce content rendering time

Slide 287

Slide 287 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 287 @import "compass/utilities/sprites"; ... $sprites-spacing: 20px; @import “../img/sprites/*png”; Creating sprite images with Compass

Slide 288

Slide 288 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 288 @import "compass/utilities/sprites"; ... $orange-spacing: 20px; @import “../img/orange/*png”; Sprite names are dependent on your directory name

Slide 289

Slide 289 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 289 @import "compass/utilities/sprites"; ... $awesome-spacing: 20px; @import “../img/awesome/*png”; Sprite names are dependent on your directory name

Slide 290

Slide 290 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 290 Using generated sprites .footer-follow-us{ .twitter { @include awesome-sprite(follow-us-twitter); } .facebook { @include awesome-sprite(follow-us-fb); } .google { @include awesome-sprite(follow-us-google); } .pinterest { @include awesome-sprite(follow-us-pins); } } .awesome-sprite, .footer-follow-us .twitter, .footer-follow-us .facebook, .footer-follow-us .google, .footer-follow-us .pinterest { background: url('../images/awesome-s34fe0604ab.png') no-repeat; } .footer-follow-us .twitter { background-position: 0 -96px; } .footer-follow-us .facebook { background-position: 0 0; } .footer-follow-us .google { background-position: 0 -32px; } .footer-follow-us .pinterest { background-position: 0 -64px; }

Slide 291

Slide 291 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Uh... 291 How do we check these?

Slide 292

Slide 292 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy 292 Guiding principles of making our workflows AWESOME

Slide 293

Slide 293 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 293 How do we check these?

Slide 294

Slide 294 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Source Maps 294 How do we check these?

Slide 295

Slide 295 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 295 c http://code.tutsplus.com/tutorials/developing-with-sass-and-chrome-devtools--net-32805

Slide 296

Slide 296 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 296 Generating

Slide 297

Slide 297 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 297 sass --compass --sourcemap --watch scss:css

Slide 298

Slide 298 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 298 gem install compass --pre

Slide 299

Slide 299 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 299 compass: { dev: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'expanded', sourcemap: true } }, prod: { options: { sassDir: 'scss', cssDir: 'css', outputStyle: 'compressed' } }, }

Slide 300

Slide 300 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 300 Don’t deploy to production!

Slide 301

Slide 301 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 301 # apache Order allow, deny Deny from all # nginx location ~* \.map$ { ! deny all; }

Slide 302

Slide 302 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 302 Using

Slide 303

Slide 303 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 303 This works in > Firefox 29, right click to show CSS

Slide 304

Slide 304 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 304

Slide 305

Slide 305 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 305 1. Reduce file sizes 2. Reduce the number of files 3. Reduce content rendering time

Slide 306

Slide 306 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Don’t nest more than 3 deep 306 http://css-tricks.com/sass-style-guide/

Slide 307

Slide 307 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Avoid using tag selectors Use class selectors if you can. 307 https://developers.google.com/speed/docs/best-practices/rendering

Slide 308

Slide 308 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-devperf --save-dev 308

Slide 309

Slide 309 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 309 devperf: { options: { urls: [ 'http://localhost:8000' ] } }

Slide 310

Slide 310 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 310

Slide 311

Slide 311 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 311 https://github.com/gmetais/grunt-devperf/

Slide 312

Slide 312 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 1. Embrace the DRY principle 2. Make changes easy 3. Make finding mistakes easy 312 Guiding principles of making our workflows AWESOME

Slide 313

Slide 313 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Regression testing 313

Slide 314

Slide 314 text

Kitt Hodsden • @kitt • http://ki.tt/sotr PhantomCSS Wraith DiffUX dpxdt 314

Slide 315

Slide 315 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Wraith 315

Slide 316

Slide 316 text

Kitt Hodsden • @kitt • http://ki.tt/sotr gem install wraith 316

Slide 317

Slide 317 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 317 $ wraith setup create configs/config.yaml create javascript/snap.js phantomcss grunt task

Slide 318

Slide 318 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 318 #Headless browser option browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task

Slide 319

Slide 319 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 319 #Headless browser option browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task

Slide 320

Slide 320 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 320 #Headless browser option browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task

Slide 321

Slide 321 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 321 #Headless browser option browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task

Slide 322

Slide 322 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 322 #Headless browser option browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task

Slide 323

Slide 323 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 323 #Headless browser option browser: webkit: "phantomjs" # gecko: "slimerjs" #If you want to have multiple snapping files, set the file name here snap_file: "js/wraith-snap.js" # Type the name of the directory that shots will be stored in directory: - 'shots' # Add only 2 domains, key will act as a label domains: local: "http://localhost:8000" stage: "http://fontsmack.fallgears.com" #Type screen widths below, here are a couple of examples screen_widths: - 320 - 768 - 1280 #Type page URL paths below, here are a couple of examples paths: home: / allthethings: /all-the-things.html phantomcss grunt task

Slide 324

Slide 324 text

Kitt Hodsden • @kitt • http://ki.tt/sotr $ wraith capture automate 324

Slide 325

Slide 325 text

Kitt Hodsden • @kitt • http://ki.tt/sotr $ wraith capture automate 325

Slide 326

Slide 326 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 326 $ ls -l configs/ automate.yaml config.yaml phantomcss grunt task

Slide 327

Slide 327 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 327 $ wraith capture automate Creating Folders Snapping http://localhost:8000/ at width 320 Snapping http://localhost:8000/ at width 1280 Snapping http://localhost:8000/ at width 768 Snapping http://localhost:8000/all-the-things.html at width 320 Snapping http://fontsmack.fallgears.com/ at width 320 Snapping http://fontsmack.fallgears.com/ at width 768 Snapping http://fontsmack.fallgears.com/ at width 1280 Snapping http://fontsmack.fallgears.com/all-the-things.html at width 320 Snapping http://localhost:8000/all-the-things.html at width 768 Snapping http://localhost:8000/all-the-things.html at width 1280 Snapping http://fontsmack.fallgears.com/all-the-things.html at width 1280 Snapping http://fontsmack.fallgears.com/all-the-things.html at width 768 phantomcss grunt task

Slide 328

Slide 328 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 328

Slide 329

Slide 329 text

Kitt Hodsden • @kitt • http://ki.tt/sotr PhantomCSS 329

Slide 330

Slide 330 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-phantomcss --save-dev install details at https://www.npmjs.org/package/grunt-phantomcss 330

Slide 331

Slide 331 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 331 phantomcss: { desktop: { options: { screenshots: 'test/visual/desktop/', results: 'results/visual/desktop', viewportSize: [1024, 768] }, src: [ 'test/visual/**.js' ] }, mobile: { options: { screenshots: 'test/visual/mobile/', results: 'results/visual/mobile', viewportSize: [320, 480] }, src: [ 'test/visual/**.js' ] } } phantomcss grunt task

Slide 332

Slide 332 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 332 casper.start('http://localhost:8000/') .then(function() { phantomcss.screenshot('#region-branding', 'region-branding'); }). then(function now_check_the_screenshots(){ phantomCSS.compareAll(); }); phantomcss website flow

Slide 333

Slide 333 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Seeing failures 333 http://tldr.huddle.com/blog/css-testing/

Slide 334

Slide 334 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Style Guides 334

Slide 335

Slide 335 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://patternlab.io 335

Slide 336

Slide 336 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install grunt-contrib-copy --save-dev npm install grunt-shell --save-dev 336

Slide 337

Slide 337 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 337 watch: { ... html: { files: ['patternlab/source/_patterns/**/*.mustache', 'patternlab/source/**/*.json'], tasks: ['shell:patternlab'], options: { spawn: false } } } ... copy: { styleguide: { files: [{ src: ['css/main.css'], dest: 'patternlab/public/css/style.css', filter: 'isFile'}] } } } phantomcss website flow

Slide 338

Slide 338 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 338 grunt.registerTask('default', ['compass:dev', 'copy:sg', 'watch']); phantomcss website flow

Slide 339

Slide 339 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 339

Slide 340

Slide 340 text

Kitt Hodsden • @kitt • http://ki.tt/sotr https://github.com/midnightspecial/patternlab-node 340

Slide 341

Slide 341 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Phew! 341

Slide 342

Slide 342 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 342 What magic do we do? Implement a design or prototype Update the designs Make sure it works in all browsers Make it faster

Slide 343

Slide 343 text

Kitt Hodsden • @kitt • http://ki.tt/sotr From the beginning! 343

Slide 344

Slide 344 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Faster HTML 344

Slide 345

Slide 345 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://docs.emmet.io/ 345

Slide 346

Slide 346 text

Kitt Hodsden • @kitt • http://ki.tt/sotr div#banner>div.logo+ul#navigation>li*4>a 346

Slide 347

Slide 347 text

Kitt Hodsden • @kitt • http://ki.tt/sotr
347

Slide 348

Slide 348 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 348 http://shortcutfoo.com/

Slide 349

Slide 349 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Faster Setup 349

Slide 350

Slide 350 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 350 http://yeoman.io Yeoman

Slide 351

Slide 351 text

Kitt Hodsden • @kitt • http://ki.tt/sotr yo 351

Slide 352

Slide 352 text

Kitt Hodsden • @kitt • http://ki.tt/sotr npm install -g yo 352 Installing yeoman globally

Slide 353

Slide 353 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 353 # use a generator $ yo webapp # start the server $ grunt server # run tests $ grunt test # run default $ grunt

Slide 354

Slide 354 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 354 # download new generator $ npm install generator-gruntplugin # run the generator $ yo gruntplugin

Slide 355

Slide 355 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 355 # download new generator $ npm install generator-gruntfile # run the generator $ yo gruntfile

Slide 356

Slide 356 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 356 Lots of generators available http://yeoman.io/official-generators.html

Slide 357

Slide 357 text

Kitt Hodsden • @kitt • http://ki.tt/sotr 357 # download new generator $ npm install generator-generator # create the directory $ mkdir generator-bigred && cd $_ # run the generator $ yo generator

Slide 358

Slide 358 text

Kitt Hodsden • @kitt • http://ki.tt/sotr http://yeoman.io/generators.html#writing-your-first-generator 358 http://ki.tt/yog

Slide 359

Slide 359 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Wow, that was fast. 359

Slide 360

Slide 360 text

Kitt Hodsden • @kitt • http://ki.tt/sotr I skipped over Bundler Managing what ruby gems you have installed http://bundler.io/ Vagrant Setting up development instances for consistency http://www.vagrantup.com/ Creating your own Grunt tasks http://gruntjs.com/creating-tasks Bower Managing project dependencies http://bower.io/ 360

Slide 361

Slide 361 text

Kitt Hodsden • @kitt • http://ki.tt/sotr Questions? 361

Slide 362

Slide 362 text

Kitt Hodsden • @kitt • http://ki.tt/sotr My Notes! http://ki.tt/sotr Your Notes! http://ki.tt/sotr14notes 362