1
0
Fork 0

Move notes into slideshow speaker notes

This commit is contained in:
Andrew Tomaka 2014-05-13 23:53:42 -04:00
parent 336fda75cb
commit 11a65b2ece
16 changed files with 2998 additions and 92 deletions

51
bower_components/headjs/.bower.json vendored Normal file
View file

@ -0,0 +1,51 @@
{
"name": "headjs",
"description": "HeadJS: Responsive Design, Feature Detections & Asset Loading. The only script in your <HEAD>",
"version": "1.0.3",
"license": "MIT",
"authors": [
{
"name": "Tero Piirainen"
},
{
"name": "Robert Hoffmann"
}
],
"homepage ": "http://headjs.com",
"main": [
"./dist/1.0.0/head.min.js",
"./dist/1.0.0/head.min.js.map",
"./dist/1.0.0/changelog.txt"
],
"ignore": [
"**",
"!/dist/1.0.0/*.js",
"!/dist/1.0.0/*.map",
"!/dist/1.0.0/*.txt"
],
"directory": "public/scripts",
"repository": {
"type": "git",
"url": "git://github.com/headjs/headjs.git"
},
"keywords": [
"loader",
"require",
"polyfill",
"html5",
"css3",
"feature",
"responsive"
],
"homepage": "https://github.com/headjs/headjs",
"_release": "1.0.3",
"_resolution": {
"type": "version",
"tag": "v1.0.3",
"commit": "edc8427191a633d80e7372c49e6d28a098be766f"
},
"_source": "git://github.com/headjs/headjs.git",
"_target": "~1.0.3",
"_originalSource": "headjs",
"_direct": true
}

View file

@ -0,0 +1,96 @@
1.0.3 (2013-11-22)
- New: Timeout added to resource loading
- New: CSS callbacks now executed for all browsers
- https://github.com/headjs/headjs/pull/273
- New: Changed how file extensions are parsed for detecting css files
- in the future, we will need to add a way to supply a filetype when loading resources via scripts like: style.aspx, style.php
- Fix: Array loading & trigger not functioning correctly on old browsers
- https://github.com/headjs/headjs/issues/274
- Fix: ready() sometimes does not trigger if assets are loaded too fast
- https://github.com/headjs/headjs/issues/271
1.0.2 (2013-11-13)
- Fix: no-js class not being removed
- https://github.com/headjs/headjs/issues/270
1.0.1 (2013-11-05)
- Fix: Old IE's can trigger ready too soon
- https://github.com/headjs/headjs/issues/203
1.0.0 (2013-11-04)
- New: Detect Windows 8 Mobile (Surface RT/Pro), IE11, Kindle, and other Android devices
- New: Add Browser & Version CSS no matter what browser breakpoints are configured
- Example: .ff .ff20
- There is no need to cycle through all browser versions in 90% of cases
- Makes it possible to work without any breakpoints at all
- New: Improved CSS Router
- https://github.com/headjs/headjs/issues/227
- New: Added "main" HTML5 element to shim
- https://github.com/headjs/headjs/pull/230
- New: Enable/Disable HTML5 Shim in head_conf
- New: Load files from Array of Files or Array of Labels
- head.load(["file1", "file2"], callBack);
- head.load([{ label1: "file1" }, { label2: "file2" }], callBack);
- https://github.com/headjs/headjs/issues/139
- New: Possibility to wait for multiple labels or files
- head.ready(["label1", "label2"], callBack);
- head.ready(["file1.js", "file2.js"], callBack);
- https://github.com/headjs/headjs/pull/212
- New: Load file via data attribute on HeadJS script tag
- data-headjs-load="configuration.js"
- https://github.com/headjs/headjs/pull/213
- New: Source map files have been added for all minified JS files
- Fix: Prevent loading empty strings
- https://github.com/headjs/headjs/pull/184
- Fix: CSS classes getting bigger on successive resizes under Chrome
- https://github.com/headjs/headjs/issues/226
- Fix: Invalid regular expression for CSS detection
- https://github.com/headjs/headjs/issues/255
- Fix: callback failing to trigger under certain cirumstances
- https://github.com/headjs/headjs/issues/262
- Divers: Changed window.frameElement detection
- https://github.com/headjs/headjs/pull/257
- Divers: Cleaned up a bunch of syntaxt to conform to JSHint
- Now using a very strict .jshintrc
- Divers: Added missing .gitattributes
0.99 (2012-11-15)
- Load: Fixed regression in IE6, caused by IE10 fix
- Load: CSS loading seems to work in all browsers.
- However a few will not trigger the callback. Over 90% do.
- Either don't use it, or only load css in situations when you don't need the callback triggered.
- Load: Conditional loading with head.test() now in evaluation phase
- try it, but don't rely on it yet
- head.test(bool, "ok.js", "failed.js", callback)
- All: CDN is now availiable thanks to: http://cloudflare.com
- Info in download section on main site
- Unit Tests
- Integrated with main site so that everyone can participate
- They have also been hooked up to automatically report stats back to http://browserscope.org
0.98 (2012-11-09)
- Load: Fixed loading bug in IE10
- Load: Corrected some issues with loading from inside &lt;head&gt;
- Load: Rewrite of large parts of code base
- Started to massively document the sourcecode :)
- Css3: moved "touch" detection from core to here
- Css3: added "retina" detection
- Css3: replaced "font-face" detection that was using "Conditional Comments" with simplisitc browser version detection
- Core: Added gt, gte, lte, eq classes to width detection (lt existed already)
- Core: Added gt, gte, lt, lte, eq classes for browser vendor & version detection
- By default only lt/gt classes are activated
- You can of course configure to your likings via head_conf
0.97a (2012-10-20)
- Updated QUnit &amp; got unit tests running again
- Swictched to "use strict"
- Fixed up some variable usage
- Added browser detections other than just for ie-lt
- updated browser regexes (firefox, safari, opera, ios, android, webkit)
- detect if browser is: desktop, mobile, touch enabled
- detect portrait/landscape mode
- html5 shim now only triggers on ie-lt9
- added a throttle to onResize, since some browsers fire tons of events/sec
- added corrected height/width measurements, but only exposed via new object: head.screen
- contains height/width, innerHeight/innerWidth, outerHeight/outerWidth
- force all css router names to lowercase just in case ppl try typing in names with wierd casings

View file

@ -0,0 +1,312 @@
///#source 1 1 /src/1.0.0/core.js
/*! head.core - v1.0.2 */
/*
* HeadJS The only script in your <HEAD>
* Author Tero Piirainen (tipiirai)
* Maintainer Robert Hoffmann (itechnology)
* License MIT / http://bit.ly/mit-license
* WebSite http://headjs.com
*/
(function(win, undefined) {
"use strict";
// gt, gte, lt, lte, eq breakpoints would have been more simple to write as ['gt','gte','lt','lte','eq']
// but then we would have had to loop over the collection on each resize() event,
// a simple object with a direct access to true/false is therefore much more efficient
var doc = win.document,
nav = win.navigator,
loc = win.location,
html = doc.documentElement,
klass = [],
conf = {
screens : [240, 320, 480, 640, 768, 800, 1024, 1280, 1440, 1680, 1920],
screensCss: { "gt": true, "gte": false, "lt": true, "lte": false, "eq": false },
browsers : [
{ ie: { min: 6, max: 11 } }
//,{ chrome : { min: 8, max: 33 } }
//,{ ff : { min: 3, max: 26 } }
//,{ ios : { min: 3, max: 7 } }
//,{ android: { min: 2, max: 4 } }
//,{ webkit : { min: 9, max: 12 } }
//,{ opera : { min: 9, max: 12 } }
],
browserCss: { "gt": true, "gte": false, "lt": true, "lte": false, "eq": true },
html5 : true,
page : "-page",
section : "-section",
head : "head"
};
if (win.head_conf) {
for (var item in win.head_conf) {
if (win.head_conf[item] !== undefined) {
conf[item] = win.head_conf[item];
}
}
}
function pushClass(name) {
klass[klass.length] = name;
}
function removeClass(name) {
// need to test for both space and no space
// https://github.com/headjs/headjs/issues/270
// https://github.com/headjs/headjs/issues/226
var re = new RegExp(" ?\\b" + name + "\\b");
html.className = html.className.replace(re, "");
}
function each(arr, fn) {
for (var i = 0, l = arr.length; i < l; i++) {
fn.call(arr, arr[i], i);
}
}
// API
var api = win[conf.head] = function() {
api.ready.apply(null, arguments);
};
api.feature = function(key, enabled, queue) {
// internal: apply all classes
if (!key) {
html.className += " " + klass.join(" ");
klass = [];
return api;
}
if (Object.prototype.toString.call(enabled) === "[object Function]") {
enabled = enabled.call();
}
pushClass((enabled ? "" : "no-") + key);
api[key] = !!enabled;
// apply class to HTML element
if (!queue) {
removeClass("no-" + key);
removeClass(key);
api.feature();
}
return api;
};
// no queue here, so we can remove any eventual pre-existing no-js class
api.feature("js", true);
// browser type & version
var ua = nav.userAgent.toLowerCase(),
mobile = /mobile|android|kindle|silk|midp|phone|(windows .+arm|touch)/.test(ua);
// useful for enabling/disabling feature (we can consider a desktop navigator to have more cpu/gpu power)
api.feature("mobile" , mobile , true);
api.feature("desktop", !mobile, true);
// http://www.zytrax.com/tech/web/browser_ids.htm
// http://www.zytrax.com/tech/web/mobile_ids.html
ua = /(chrome|firefox)[ \/]([\w.]+)/.exec(ua) || // Chrome & Firefox
/(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Mobile IOS
/(android)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Mobile Webkit
/(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Safari & Opera
/(msie) ([\w.]+)/.exec(ua) ||
/(trident).+rv:(\w.)+/.exec(ua) || [];
var browser = ua[1],
version = parseFloat(ua[2]);
switch (browser) {
case "msie":
case "trident":
browser = "ie";
version = doc.documentMode || version;
break;
case "firefox":
browser = "ff";
break;
case "ipod":
case "ipad":
case "iphone":
browser = "ios";
break;
case "webkit":
browser = "safari";
break;
}
// Browser vendor and version
api.browser = {
name: browser,
version: version
};
api.browser[browser] = true;
for (var i = 0, l = conf.browsers.length; i < l; i++) {
for (var key in conf.browsers[i]) {
if (browser === key) {
pushClass(key);
var min = conf.browsers[i][key].min;
var max = conf.browsers[i][key].max;
for (var v = min; v <= max; v++) {
if (version > v) {
if (conf.browserCss.gt) {
pushClass("gt-" + key + v);
}
if (conf.browserCss.gte) {
pushClass("gte-" + key + v);
}
} else if (version < v) {
if (conf.browserCss.lt) {
pushClass("lt-" + key + v);
}
if (conf.browserCss.lte) {
pushClass("lte-" + key + v);
}
} else if (version === v) {
if (conf.browserCss.lte) {
pushClass("lte-" + key + v);
}
if (conf.browserCss.eq) {
pushClass("eq-" + key + v);
}
if (conf.browserCss.gte) {
pushClass("gte-" + key + v);
}
}
}
} else {
pushClass("no-" + key);
}
}
}
pushClass(browser);
pushClass(browser + parseInt(version, 10));
// IE lt9 specific
if (conf.html5 && browser === "ie" && version < 9) {
// HTML5 support : you still need to add html5 css initialization styles to your site
// See: assets/html5.css
each("abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|progress|section|summary|time|video".split("|"), function(el) {
doc.createElement(el);
});
}
// CSS "router"
each(loc.pathname.split("/"), function(el, i) {
if (this.length > 2 && this[i + 1] !== undefined) {
if (i) {
pushClass(this.slice(i, i + 1).join("-").toLowerCase() + conf.section);
}
} else {
// pageId
var id = el || "index", index = id.indexOf(".");
if (index > 0) {
id = id.substring(0, index);
}
html.id = id.toLowerCase() + conf.page;
// on root?
if (!i) {
pushClass("root" + conf.section);
}
}
});
// basic screen info
api.screen = {
height: win.screen.height,
width : win.screen.width
};
// viewport resolutions: w-100, lt-480, lt-1024 ...
function screenSize() {
// remove earlier sizes
html.className = html.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g, "");
// Viewport width
var iw = win.innerWidth || html.clientWidth,
ow = win.outerWidth || win.screen.width;
api.screen.innerWidth = iw;
api.screen.outerWidth = ow;
// for debugging purposes, not really useful for anything else
pushClass("w-" + iw);
each(conf.screens, function(width) {
if (iw > width) {
if (conf.screensCss.gt) {
pushClass("gt-" + width);
}
if (conf.screensCss.gte) {
pushClass("gte-" + width);
}
} else if (iw < width) {
if (conf.screensCss.lt) {
pushClass("lt-" + width);
}
if (conf.screensCss.lte) {
pushClass("lte-" + width);
}
} else if (iw === width) {
if (conf.screensCss.lte) {
pushClass("lte-" + width);
}
if (conf.screensCss.eq) {
pushClass("e-q" + width);
}
if (conf.screensCss.gte) {
pushClass("gte-" + width);
}
}
});
// Viewport height
var ih = win.innerHeight || html.clientHeight,
oh = win.outerHeight || win.screen.height;
api.screen.innerHeight = ih;
api.screen.outerHeight = oh;
// no need for onChange event to detect this
api.feature("portrait" , (ih > iw));
api.feature("landscape", (ih < iw));
}
screenSize();
// Throttle navigators from triggering too many resize events
var resizeId = 0;
function onResize() {
win.clearTimeout(resizeId);
resizeId = win.setTimeout(screenSize, 50);
}
// Manually attach, as to not overwrite existing handler
if (win.addEventListener) {
win.addEventListener("resize", onResize, false);
} else {
// IE8 and less
win.attachEvent("onresize", onResize);
}
}(window));

View file

@ -0,0 +1,5 @@
/*! head.core - v1.0.2 */
(function(n,t){"use strict";function r(n){a[a.length]=n}function k(n){var t=new RegExp(" ?\\b"+n+"\\b");c.className=c.className.replace(t,"")}function p(n,t){for(var i=0,r=n.length;i<r;i++)t.call(n,n[i],i)}function tt(){var t,e,f,o;c.className=c.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g,"");t=n.innerWidth||c.clientWidth;e=n.outerWidth||n.screen.width;u.screen.innerWidth=t;u.screen.outerWidth=e;r("w-"+t);p(i.screens,function(n){t>n?(i.screensCss.gt&&r("gt-"+n),i.screensCss.gte&&r("gte-"+n)):t<n?(i.screensCss.lt&&r("lt-"+n),i.screensCss.lte&&r("lte-"+n)):t===n&&(i.screensCss.lte&&r("lte-"+n),i.screensCss.eq&&r("e-q"+n),i.screensCss.gte&&r("gte-"+n))});f=n.innerHeight||c.clientHeight;o=n.outerHeight||n.screen.height;u.screen.innerHeight=f;u.screen.outerHeight=o;u.feature("portrait",f>t);u.feature("landscape",f<t)}function it(){n.clearTimeout(b);b=n.setTimeout(tt,50)}var y=n.document,rt=n.navigator,ut=n.location,c=y.documentElement,a=[],i={screens:[240,320,480,640,768,800,1024,1280,1440,1680,1920],screensCss:{gt:!0,gte:!1,lt:!0,lte:!1,eq:!1},browsers:[{ie:{min:6,max:11}}],browserCss:{gt:!0,gte:!1,lt:!0,lte:!1,eq:!0},html5:!0,page:"-page",section:"-section",head:"head"},v,u,s,w,o,h,l,d,f,g,nt,e,b;if(n.head_conf)for(v in n.head_conf)n.head_conf[v]!==t&&(i[v]=n.head_conf[v]);u=n[i.head]=function(){u.ready.apply(null,arguments)};u.feature=function(n,t,i){return n?(Object.prototype.toString.call(t)==="[object Function]"&&(t=t.call()),r((t?"":"no-")+n),u[n]=!!t,i||(k("no-"+n),k(n),u.feature()),u):(c.className+=" "+a.join(" "),a=[],u)};u.feature("js",!0);s=rt.userAgent.toLowerCase();w=/mobile|android|kindle|silk|midp|phone|(windows .+arm|touch)/.test(s);u.feature("mobile",w,!0);u.feature("desktop",!w,!0);s=/(chrome|firefox)[ \/]([\w.]+)/.exec(s)||/(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(android)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(msie) ([\w.]+)/.exec(s)||/(trident).+rv:(\w.)+/.exec(s)||[];o=s[1];h=parseFloat(s[2]);switch(o){case"msie":case"trident":o="ie";h=y.documentMode||h;break;case"firefox":o="ff";break;case"ipod":case"ipad":case"iphone":o="ios";break;case"webkit":o="safari"}for(u.browser={name:o,version:h},u.browser[o]=!0,l=0,d=i.browsers.length;l<d;l++)for(f in i.browsers[l])if(o===f)for(r(f),g=i.browsers[l][f].min,nt=i.browsers[l][f].max,e=g;e<=nt;e++)h>e?(i.browserCss.gt&&r("gt-"+f+e),i.browserCss.gte&&r("gte-"+f+e)):h<e?(i.browserCss.lt&&r("lt-"+f+e),i.browserCss.lte&&r("lte-"+f+e)):h===e&&(i.browserCss.lte&&r("lte-"+f+e),i.browserCss.eq&&r("eq-"+f+e),i.browserCss.gte&&r("gte-"+f+e));else r("no-"+f);r(o);r(o+parseInt(h,10));i.html5&&o==="ie"&&h<9&&p("abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|progress|section|summary|time|video".split("|"),function(n){y.createElement(n)});p(ut.pathname.split("/"),function(n,u){if(this.length>2&&this[u+1]!==t)u&&r(this.slice(u,u+1).join("-").toLowerCase()+i.section);else{var f=n||"index",e=f.indexOf(".");e>0&&(f=f.substring(0,e));c.id=f.toLowerCase()+i.page;u||r("root"+i.section)}});u.screen={height:n.screen.height,width:n.screen.width};tt();b=0;n.addEventListener?n.addEventListener("resize",it,!1):n.attachEvent("onresize",it)})(window);
/*
//# sourceMappingURL=head.core.min.js.map
*/

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,477 @@
///#source 1 1 /src/1.0.0/core.js
/*! head.core - v1.0.2 */
/*
* HeadJS The only script in your <HEAD>
* Author Tero Piirainen (tipiirai)
* Maintainer Robert Hoffmann (itechnology)
* License MIT / http://bit.ly/mit-license
* WebSite http://headjs.com
*/
(function(win, undefined) {
"use strict";
// gt, gte, lt, lte, eq breakpoints would have been more simple to write as ['gt','gte','lt','lte','eq']
// but then we would have had to loop over the collection on each resize() event,
// a simple object with a direct access to true/false is therefore much more efficient
var doc = win.document,
nav = win.navigator,
loc = win.location,
html = doc.documentElement,
klass = [],
conf = {
screens : [240, 320, 480, 640, 768, 800, 1024, 1280, 1440, 1680, 1920],
screensCss: { "gt": true, "gte": false, "lt": true, "lte": false, "eq": false },
browsers : [
{ ie: { min: 6, max: 11 } }
//,{ chrome : { min: 8, max: 33 } }
//,{ ff : { min: 3, max: 26 } }
//,{ ios : { min: 3, max: 7 } }
//,{ android: { min: 2, max: 4 } }
//,{ webkit : { min: 9, max: 12 } }
//,{ opera : { min: 9, max: 12 } }
],
browserCss: { "gt": true, "gte": false, "lt": true, "lte": false, "eq": true },
html5 : true,
page : "-page",
section : "-section",
head : "head"
};
if (win.head_conf) {
for (var item in win.head_conf) {
if (win.head_conf[item] !== undefined) {
conf[item] = win.head_conf[item];
}
}
}
function pushClass(name) {
klass[klass.length] = name;
}
function removeClass(name) {
// need to test for both space and no space
// https://github.com/headjs/headjs/issues/270
// https://github.com/headjs/headjs/issues/226
var re = new RegExp(" ?\\b" + name + "\\b");
html.className = html.className.replace(re, "");
}
function each(arr, fn) {
for (var i = 0, l = arr.length; i < l; i++) {
fn.call(arr, arr[i], i);
}
}
// API
var api = win[conf.head] = function() {
api.ready.apply(null, arguments);
};
api.feature = function(key, enabled, queue) {
// internal: apply all classes
if (!key) {
html.className += " " + klass.join(" ");
klass = [];
return api;
}
if (Object.prototype.toString.call(enabled) === "[object Function]") {
enabled = enabled.call();
}
pushClass((enabled ? "" : "no-") + key);
api[key] = !!enabled;
// apply class to HTML element
if (!queue) {
removeClass("no-" + key);
removeClass(key);
api.feature();
}
return api;
};
// no queue here, so we can remove any eventual pre-existing no-js class
api.feature("js", true);
// browser type & version
var ua = nav.userAgent.toLowerCase(),
mobile = /mobile|android|kindle|silk|midp|phone|(windows .+arm|touch)/.test(ua);
// useful for enabling/disabling feature (we can consider a desktop navigator to have more cpu/gpu power)
api.feature("mobile" , mobile , true);
api.feature("desktop", !mobile, true);
// http://www.zytrax.com/tech/web/browser_ids.htm
// http://www.zytrax.com/tech/web/mobile_ids.html
ua = /(chrome|firefox)[ \/]([\w.]+)/.exec(ua) || // Chrome & Firefox
/(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Mobile IOS
/(android)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Mobile Webkit
/(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Safari & Opera
/(msie) ([\w.]+)/.exec(ua) ||
/(trident).+rv:(\w.)+/.exec(ua) || [];
var browser = ua[1],
version = parseFloat(ua[2]);
switch (browser) {
case "msie":
case "trident":
browser = "ie";
version = doc.documentMode || version;
break;
case "firefox":
browser = "ff";
break;
case "ipod":
case "ipad":
case "iphone":
browser = "ios";
break;
case "webkit":
browser = "safari";
break;
}
// Browser vendor and version
api.browser = {
name: browser,
version: version
};
api.browser[browser] = true;
for (var i = 0, l = conf.browsers.length; i < l; i++) {
for (var key in conf.browsers[i]) {
if (browser === key) {
pushClass(key);
var min = conf.browsers[i][key].min;
var max = conf.browsers[i][key].max;
for (var v = min; v <= max; v++) {
if (version > v) {
if (conf.browserCss.gt) {
pushClass("gt-" + key + v);
}
if (conf.browserCss.gte) {
pushClass("gte-" + key + v);
}
} else if (version < v) {
if (conf.browserCss.lt) {
pushClass("lt-" + key + v);
}
if (conf.browserCss.lte) {
pushClass("lte-" + key + v);
}
} else if (version === v) {
if (conf.browserCss.lte) {
pushClass("lte-" + key + v);
}
if (conf.browserCss.eq) {
pushClass("eq-" + key + v);
}
if (conf.browserCss.gte) {
pushClass("gte-" + key + v);
}
}
}
} else {
pushClass("no-" + key);
}
}
}
pushClass(browser);
pushClass(browser + parseInt(version, 10));
// IE lt9 specific
if (conf.html5 && browser === "ie" && version < 9) {
// HTML5 support : you still need to add html5 css initialization styles to your site
// See: assets/html5.css
each("abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|progress|section|summary|time|video".split("|"), function(el) {
doc.createElement(el);
});
}
// CSS "router"
each(loc.pathname.split("/"), function(el, i) {
if (this.length > 2 && this[i + 1] !== undefined) {
if (i) {
pushClass(this.slice(i, i + 1).join("-").toLowerCase() + conf.section);
}
} else {
// pageId
var id = el || "index", index = id.indexOf(".");
if (index > 0) {
id = id.substring(0, index);
}
html.id = id.toLowerCase() + conf.page;
// on root?
if (!i) {
pushClass("root" + conf.section);
}
}
});
// basic screen info
api.screen = {
height: win.screen.height,
width : win.screen.width
};
// viewport resolutions: w-100, lt-480, lt-1024 ...
function screenSize() {
// remove earlier sizes
html.className = html.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g, "");
// Viewport width
var iw = win.innerWidth || html.clientWidth,
ow = win.outerWidth || win.screen.width;
api.screen.innerWidth = iw;
api.screen.outerWidth = ow;
// for debugging purposes, not really useful for anything else
pushClass("w-" + iw);
each(conf.screens, function(width) {
if (iw > width) {
if (conf.screensCss.gt) {
pushClass("gt-" + width);
}
if (conf.screensCss.gte) {
pushClass("gte-" + width);
}
} else if (iw < width) {
if (conf.screensCss.lt) {
pushClass("lt-" + width);
}
if (conf.screensCss.lte) {
pushClass("lte-" + width);
}
} else if (iw === width) {
if (conf.screensCss.lte) {
pushClass("lte-" + width);
}
if (conf.screensCss.eq) {
pushClass("e-q" + width);
}
if (conf.screensCss.gte) {
pushClass("gte-" + width);
}
}
});
// Viewport height
var ih = win.innerHeight || html.clientHeight,
oh = win.outerHeight || win.screen.height;
api.screen.innerHeight = ih;
api.screen.outerHeight = oh;
// no need for onChange event to detect this
api.feature("portrait" , (ih > iw));
api.feature("landscape", (ih < iw));
}
screenSize();
// Throttle navigators from triggering too many resize events
var resizeId = 0;
function onResize() {
win.clearTimeout(resizeId);
resizeId = win.setTimeout(screenSize, 50);
}
// Manually attach, as to not overwrite existing handler
if (win.addEventListener) {
win.addEventListener("resize", onResize, false);
} else {
// IE8 and less
win.attachEvent("onresize", onResize);
}
}(window));
///#source 1 1 /src/1.0.0/css3.js
/*! head.css3 - v1.0.0 */
/*
* HeadJS The only script in your <HEAD>
* Author Tero Piirainen (tipiirai)
* Maintainer Robert Hoffmann (itechnology)
* License MIT / http://bit.ly/mit-license
* WebSite http://headjs.com
*/
(function (win, undefined) {
"use strict";
var doc = win.document,
/*
To add a new test:
head.feature("video", function() {
var tag = document.createElement('video');
return !!tag.canPlayType;
});
Good place to grab more tests
https://github.com/Modernizr/Modernizr/blob/master/modernizr.js
*/
/* CSS modernizer */
el = doc.createElement("i"),
style = el.style,
prefs = " -o- -moz- -ms- -webkit- -khtml- ".split(" "),
domPrefs = "Webkit Moz O ms Khtml".split(" "),
headVar = win.head_conf && win.head_conf.head || "head",
api = win[headVar];
// Thanks Paul Irish!
function testProps(props) {
for (var i in props) {
if (style[props[i]] !== undefined) {
return true;
}
}
return false;
}
function testAll(prop) {
var camel = prop.charAt(0).toUpperCase() + prop.substr(1),
props = (prop + " " + domPrefs.join(camel + " ") + camel).split(" ");
return !!testProps(props);
}
var tests = {
// should we seperate linear/radial ?
// seems like some browsers need a test for prefix http://caniuse.com/#feat=css-gradients
gradient: function () {
var s1 = "background-image:",
s2 = "gradient(linear,left top,right bottom,from(#9f9),to(#fff));",
s3 = "linear-gradient(left top,#eee,#fff);";
style.cssText = (s1 + prefs.join(s2 + s1) + prefs.join(s3 + s1)).slice(0, -s1.length);
return !!style.backgroundImage;
},
rgba: function () {
style.cssText = "background-color:rgba(0,0,0,0.5)";
return !!style.backgroundColor;
},
opacity: function () {
return el.style.opacity === "";
},
textshadow: function () {
return style.textShadow === "";
},
multiplebgs: function () {
style.cssText = "background:url(https://),url(https://),red url(https://)";
// If the UA supports multiple backgrounds, there should be three occurrences
// of the string "url(" in the return value for elemStyle.background
var result = (style.background || "").match(/url/g);
return Object.prototype.toString.call(result) === "[object Array]" && result.length === 3;
},
boxshadow: function () {
return testAll("boxShadow");
},
borderimage: function () {
return testAll("borderImage");
},
borderradius: function () {
return testAll("borderRadius");
},
cssreflections: function () {
return testAll("boxReflect");
},
csstransforms: function () {
return testAll("transform");
},
csstransitions: function () {
return testAll("transition");
},
touch: function () {
return "ontouchstart" in win;
},
retina: function () {
return (win.devicePixelRatio > 1);
},
/*
font-face support. Uses browser sniffing but is synchronous.
http://paulirish.com/2009/font-face-feature-detection/
*/
fontface: function () {
var browser = api.browser.name, version = api.browser.version;
switch (browser) {
case "ie":
return version >= 9;
case "chrome":
return version >= 13;
case "ff":
return version >= 6;
case "ios":
return version >= 5;
case "android":
return false;
case "webkit":
return version >= 5.1;
case "opera":
return version >= 10;
default:
return false;
}
}
};
// queue features
for (var key in tests) {
if (tests[key]) {
api.feature(key, tests[key].call(), true);
}
}
// enable features at once
api.feature();
}(window));

View file

@ -0,0 +1,7 @@
/*! head.core - v1.0.2 */
(function(n,t){"use strict";function r(n){a[a.length]=n}function k(n){var t=new RegExp(" ?\\b"+n+"\\b");c.className=c.className.replace(t,"")}function p(n,t){for(var i=0,r=n.length;i<r;i++)t.call(n,n[i],i)}function tt(){var t,e,f,o;c.className=c.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g,"");t=n.innerWidth||c.clientWidth;e=n.outerWidth||n.screen.width;u.screen.innerWidth=t;u.screen.outerWidth=e;r("w-"+t);p(i.screens,function(n){t>n?(i.screensCss.gt&&r("gt-"+n),i.screensCss.gte&&r("gte-"+n)):t<n?(i.screensCss.lt&&r("lt-"+n),i.screensCss.lte&&r("lte-"+n)):t===n&&(i.screensCss.lte&&r("lte-"+n),i.screensCss.eq&&r("e-q"+n),i.screensCss.gte&&r("gte-"+n))});f=n.innerHeight||c.clientHeight;o=n.outerHeight||n.screen.height;u.screen.innerHeight=f;u.screen.outerHeight=o;u.feature("portrait",f>t);u.feature("landscape",f<t)}function it(){n.clearTimeout(b);b=n.setTimeout(tt,50)}var y=n.document,rt=n.navigator,ut=n.location,c=y.documentElement,a=[],i={screens:[240,320,480,640,768,800,1024,1280,1440,1680,1920],screensCss:{gt:!0,gte:!1,lt:!0,lte:!1,eq:!1},browsers:[{ie:{min:6,max:11}}],browserCss:{gt:!0,gte:!1,lt:!0,lte:!1,eq:!0},html5:!0,page:"-page",section:"-section",head:"head"},v,u,s,w,o,h,l,d,f,g,nt,e,b;if(n.head_conf)for(v in n.head_conf)n.head_conf[v]!==t&&(i[v]=n.head_conf[v]);u=n[i.head]=function(){u.ready.apply(null,arguments)};u.feature=function(n,t,i){return n?(Object.prototype.toString.call(t)==="[object Function]"&&(t=t.call()),r((t?"":"no-")+n),u[n]=!!t,i||(k("no-"+n),k(n),u.feature()),u):(c.className+=" "+a.join(" "),a=[],u)};u.feature("js",!0);s=rt.userAgent.toLowerCase();w=/mobile|android|kindle|silk|midp|phone|(windows .+arm|touch)/.test(s);u.feature("mobile",w,!0);u.feature("desktop",!w,!0);s=/(chrome|firefox)[ \/]([\w.]+)/.exec(s)||/(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(android)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(msie) ([\w.]+)/.exec(s)||/(trident).+rv:(\w.)+/.exec(s)||[];o=s[1];h=parseFloat(s[2]);switch(o){case"msie":case"trident":o="ie";h=y.documentMode||h;break;case"firefox":o="ff";break;case"ipod":case"ipad":case"iphone":o="ios";break;case"webkit":o="safari"}for(u.browser={name:o,version:h},u.browser[o]=!0,l=0,d=i.browsers.length;l<d;l++)for(f in i.browsers[l])if(o===f)for(r(f),g=i.browsers[l][f].min,nt=i.browsers[l][f].max,e=g;e<=nt;e++)h>e?(i.browserCss.gt&&r("gt-"+f+e),i.browserCss.gte&&r("gte-"+f+e)):h<e?(i.browserCss.lt&&r("lt-"+f+e),i.browserCss.lte&&r("lte-"+f+e)):h===e&&(i.browserCss.lte&&r("lte-"+f+e),i.browserCss.eq&&r("eq-"+f+e),i.browserCss.gte&&r("gte-"+f+e));else r("no-"+f);r(o);r(o+parseInt(h,10));i.html5&&o==="ie"&&h<9&&p("abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|progress|section|summary|time|video".split("|"),function(n){y.createElement(n)});p(ut.pathname.split("/"),function(n,u){if(this.length>2&&this[u+1]!==t)u&&r(this.slice(u,u+1).join("-").toLowerCase()+i.section);else{var f=n||"index",e=f.indexOf(".");e>0&&(f=f.substring(0,e));c.id=f.toLowerCase()+i.page;u||r("root"+i.section)}});u.screen={height:n.screen.height,width:n.screen.width};tt();b=0;n.addEventListener?n.addEventListener("resize",it,!1):n.attachEvent("onresize",it)})(window);
/*! head.css3 - v1.0.0 */
(function(n,t){"use strict";function a(n){for(var r in n)if(i[n[r]]!==t)return!0;return!1}function r(n){var t=n.charAt(0).toUpperCase()+n.substr(1),i=(n+" "+c.join(t+" ")+t).split(" ");return!!a(i)}var h=n.document,o=h.createElement("i"),i=o.style,s=" -o- -moz- -ms- -webkit- -khtml- ".split(" "),c="Webkit Moz O ms Khtml".split(" "),l=n.head_conf&&n.head_conf.head||"head",u=n[l],f={gradient:function(){var n="background-image:";return i.cssText=(n+s.join("gradient(linear,left top,right bottom,from(#9f9),to(#fff));"+n)+s.join("linear-gradient(left top,#eee,#fff);"+n)).slice(0,-n.length),!!i.backgroundImage},rgba:function(){return i.cssText="background-color:rgba(0,0,0,0.5)",!!i.backgroundColor},opacity:function(){return o.style.opacity===""},textshadow:function(){return i.textShadow===""},multiplebgs:function(){i.cssText="background:url(https://),url(https://),red url(https://)";var n=(i.background||"").match(/url/g);return Object.prototype.toString.call(n)==="[object Array]"&&n.length===3},boxshadow:function(){return r("boxShadow")},borderimage:function(){return r("borderImage")},borderradius:function(){return r("borderRadius")},cssreflections:function(){return r("boxReflect")},csstransforms:function(){return r("transform")},csstransitions:function(){return r("transition")},touch:function(){return"ontouchstart"in n},retina:function(){return n.devicePixelRatio>1},fontface:function(){var t=u.browser.name,n=u.browser.version;switch(t){case"ie":return n>=9;case"chrome":return n>=13;case"ff":return n>=6;case"ios":return n>=5;case"android":return!1;case"webkit":return n>=5.1;case"opera":return n>=10;default:return!1}}};for(var e in f)f[e]&&u.feature(e,f[e].call(),!0);u.feature()})(window);
/*
//# sourceMappingURL=head.css3.min.js.map
*/

File diff suppressed because one or more lines are too long

1184
bower_components/headjs/dist/1.0.0/head.js vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,707 @@
///#source 1 1 /src/1.0.0/load.js
/*! head.load - v1.0.3 */
/*
* HeadJS The only script in your <HEAD>
* Author Tero Piirainen (tipiirai)
* Maintainer Robert Hoffmann (itechnology)
* License MIT / http://bit.ly/mit-license
* WebSite http://headjs.com
*/
(function (win, undefined) {
"use strict";
//#region variables
var doc = win.document,
domWaiters = [],
handlers = {}, // user functions waiting for events
assets = {}, // loadable items in various states
isAsync = "async" in doc.createElement("script") || "MozAppearance" in doc.documentElement.style || win.opera,
isDomReady,
/*** public API ***/
headVar = win.head_conf && win.head_conf.head || "head",
api = win[headVar] = (win[headVar] || function () { api.ready.apply(null, arguments); }),
// states
PRELOADING = 1,
PRELOADED = 2,
LOADING = 3,
LOADED = 4;
//#endregion
//#region PRIVATE functions
//#region Helper functions
function noop() {
// does nothing
}
function each(arr, callback) {
if (!arr) {
return;
}
// arguments special type
if (typeof arr === "object") {
arr = [].slice.call(arr);
}
// do the job
for (var i = 0, l = arr.length; i < l; i++) {
callback.call(arr, arr[i], i);
}
}
/* A must read: http://bonsaiden.github.com/JavaScript-Garden
************************************************************/
function is(type, obj) {
var clas = Object.prototype.toString.call(obj).slice(8, -1);
return obj !== undefined && obj !== null && clas === type;
}
function isFunction(item) {
return is("Function", item);
}
function isArray(item) {
return is("Array", item);
}
function toLabel(url) {
///<summary>Converts a url to a file label</summary>
var items = url.split("/"),
name = items[items.length - 1],
i = name.indexOf("?");
return i !== -1 ? name.substring(0, i) : name;
}
// INFO: this look like a "im triggering callbacks all over the place, but only wanna run it one time function" ..should try to make everything work without it if possible
// INFO: Even better. Look into promises/defered's like jQuery is doing
function one(callback) {
///<summary>Execute a callback only once</summary>
callback = callback || noop;
if (callback._done) {
return;
}
callback();
callback._done = 1;
}
//#endregion
function conditional(test, success, failure, callback) {
///<summary>
/// INFO: use cases:
/// head.test(condition, null , "file.NOk" , callback);
/// head.test(condition, "fileOk.js", null , callback);
/// head.test(condition, "fileOk.js", "file.NOk" , callback);
/// head.test(condition, "fileOk.js", ["file.NOk", "file.NOk"], callback);
/// head.test({
/// test : condition,
/// success : [{ label1: "file1Ok.js" }, { label2: "file2Ok.js" }],
/// failure : [{ label1: "file1NOk.js" }, { label2: "file2NOk.js" }],
/// callback: callback
/// );
/// head.test({
/// test : condition,
/// success : ["file1Ok.js" , "file2Ok.js"],
/// failure : ["file1NOk.js", "file2NOk.js"],
/// callback: callback
/// );
///</summary>
var obj = (typeof test === "object") ? test : {
test: test,
success: !!success ? isArray(success) ? success : [success] : false,
failure: !!failure ? isArray(failure) ? failure : [failure] : false,
callback: callback || noop
};
// Test Passed ?
var passed = !!obj.test;
// Do we have a success case
if (passed && !!obj.success) {
obj.success.push(obj.callback);
api.load.apply(null, obj.success);
}
// Do we have a fail case
else if (!passed && !!obj.failure) {
obj.failure.push(obj.callback);
api.load.apply(null, obj.failure);
}
else {
callback();
}
return api;
}
function getAsset(item) {
///<summary>
/// Assets are in the form of
/// {
/// name : label,
/// url : url,
/// state: state
/// }
///</summary>
var asset = {};
if (typeof item === "object") {
for (var label in item) {
if (!!item[label]) {
asset = {
name: label,
url : item[label]
};
}
}
}
else {
asset = {
name: toLabel(item),
url : item
};
}
// is the item already existant
var existing = assets[asset.name];
if (existing && existing.url === asset.url) {
return existing;
}
assets[asset.name] = asset;
return asset;
}
function allLoaded(items) {
items = items || assets;
for (var name in items) {
if (items.hasOwnProperty(name) && items[name].state !== LOADED) {
return false;
}
}
return true;
}
function onPreload(asset) {
asset.state = PRELOADED;
each(asset.onpreload, function (afterPreload) {
afterPreload.call();
});
}
function preLoad(asset, callback) {
if (asset.state === undefined) {
asset.state = PRELOADING;
asset.onpreload = [];
loadAsset({ url: asset.url, type: "cache" }, function () {
onPreload(asset);
});
}
}
function apiLoadHack() {
/// <summary>preload with text/cache hack
///
/// head.load("http://domain.com/file.js","http://domain.com/file.js", callBack)
/// head.load(["http://domain.com/file.js","http://domain.com/file.js"], callBack)
/// head.load({ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }, callBack)
/// head.load([{ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }], callBack)
/// </summary>
var args = arguments,
callback = args[args.length - 1],
rest = [].slice.call(args, 1),
next = rest[0];
if (!isFunction(callback)) {
callback = null;
}
// if array, repush as args
if (isArray(args[0])) {
args[0].push(callback);
api.load.apply(null, args[0]);
return api;
}
// multiple arguments
if (!!next) {
/* Preload with text/cache hack (not good!)
* http://blog.getify.com/on-script-loaders/
* http://www.nczonline.net/blog/2010/12/21/thoughts-on-script-loaders/
* If caching is not configured correctly on the server, then items could load twice !
*************************************************************************************/
each(rest, function (item) {
// item is not a callback or empty string
if (!isFunction(item) && !!item) {
preLoad(getAsset(item));
}
});
// execute
load(getAsset(args[0]), isFunction(next) ? next : function () {
api.load.apply(null, rest);
});
}
else {
// single item
load(getAsset(args[0]));
}
return api;
}
function apiLoadAsync() {
///<summary>
/// simply load and let browser take care of ordering
///
/// head.load("http://domain.com/file.js","http://domain.com/file.js", callBack)
/// head.load(["http://domain.com/file.js","http://domain.com/file.js"], callBack)
/// head.load({ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }, callBack)
/// head.load([{ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }], callBack)
///</summary>
var args = arguments,
callback = args[args.length - 1],
items = {};
if (!isFunction(callback)) {
callback = null;
}
// if array, repush as args
if (isArray(args[0])) {
args[0].push(callback);
api.load.apply(null, args[0]);
return api;
}
// JRH 262#issuecomment-26288601
// First populate the items array.
// When allLoaded is called, all items will be populated.
// Issue when lazy loaded, the callback can execute early.
each(args, function (item, i) {
if (item !== callback) {
item = getAsset(item);
items[item.name] = item;
}
});
each(args, function (item, i) {
if (item !== callback) {
item = getAsset(item);
load(item, function () {
if (allLoaded(items)) {
one(callback);
}
});
}
});
return api;
}
function load(asset, callback) {
///<summary>Used with normal loading logic</summary>
callback = callback || noop;
if (asset.state === LOADED) {
callback();
return;
}
// INFO: why would we trigger a ready event when its not really loaded yet ?
if (asset.state === LOADING) {
api.ready(asset.name, callback);
return;
}
if (asset.state === PRELOADING) {
asset.onpreload.push(function () {
load(asset, callback);
});
return;
}
asset.state = LOADING;
loadAsset(asset, function () {
asset.state = LOADED;
callback();
// handlers for this asset
each(handlers[asset.name], function (fn) {
one(fn);
});
// dom is ready & no assets are queued for loading
// INFO: shouldn't we be doing the same test above ?
if (isDomReady && allLoaded()) {
each(handlers.ALL, function (fn) {
one(fn);
});
}
});
}
function getExtension(url) {
url = url || "";
var items = url.split("?")[0].split(".");
return items[items.length-1].toLowerCase();
}
/* Parts inspired from: https://github.com/cujojs/curl
******************************************************/
function loadAsset(asset, callback) {
callback = callback || noop;
function error(event) {
event = event || win.event;
// release event listeners
ele.onload = ele.onreadystatechange = ele.onerror = null;
// do callback
callback();
// need some more detailed error handling here
}
function process(event) {
event = event || win.event;
// IE 7/8 (2 events on 1st load)
// 1) event.type = readystatechange, s.readyState = loading
// 2) event.type = readystatechange, s.readyState = loaded
// IE 7/8 (1 event on reload)
// 1) event.type = readystatechange, s.readyState = complete
// event.type === 'readystatechange' && /loaded|complete/.test(s.readyState)
// IE 9 (3 events on 1st load)
// 1) event.type = readystatechange, s.readyState = loading
// 2) event.type = readystatechange, s.readyState = loaded
// 3) event.type = load , s.readyState = loaded
// IE 9 (2 events on reload)
// 1) event.type = readystatechange, s.readyState = complete
// 2) event.type = load , s.readyState = complete
// event.type === 'load' && /loaded|complete/.test(s.readyState)
// event.type === 'readystatechange' && /loaded|complete/.test(s.readyState)
// IE 10 (3 events on 1st load)
// 1) event.type = readystatechange, s.readyState = loading
// 2) event.type = load , s.readyState = complete
// 3) event.type = readystatechange, s.readyState = loaded
// IE 10 (3 events on reload)
// 1) event.type = readystatechange, s.readyState = loaded
// 2) event.type = load , s.readyState = complete
// 3) event.type = readystatechange, s.readyState = complete
// event.type === 'load' && /loaded|complete/.test(s.readyState)
// event.type === 'readystatechange' && /complete/.test(s.readyState)
// Other Browsers (1 event on 1st load)
// 1) event.type = load, s.readyState = undefined
// Other Browsers (1 event on reload)
// 1) event.type = load, s.readyState = undefined
// event.type == 'load' && s.readyState = undefined
// !doc.documentMode is for IE6/7, IE8+ have documentMode
if (event.type === "load" || (/loaded|complete/.test(ele.readyState) && (!doc.documentMode || doc.documentMode < 9))) {
// remove timeouts
win.clearTimeout(asset.errorTimeout);
win.clearTimeout(asset.cssTimeout);
// release event listeners
ele.onload = ele.onreadystatechange = ele.onerror = null;
// do callback
callback();
}
}
function isCssLoaded() {
// should we test again ? 20 retries = 5secs ..after that, the callback will be triggered by the error handler at 7secs
if (asset.state !== LOADED && asset.cssRetries <= 20) {
// loop through stylesheets
for (var i = 0, l = doc.styleSheets.length; i < l; i++) {
// do we have a match ?
// we need to tests agains ele.href and not asset.url, because a local file will be assigned the full http path on a link element
if (doc.styleSheets[i].href === ele.href) {
process({ "type": "load" });
return;
}
}
// increment & try again
asset.cssRetries++;
asset.cssTimeout = win.setTimeout(isCssLoaded, 250);
}
}
var ele;
var ext = getExtension(asset.url);
if (ext === "css") {
ele = doc.createElement("link");
ele.type = "text/" + (asset.type || "css");
ele.rel = "stylesheet";
ele.href = asset.url;
/* onload supported for CSS on unsupported browsers
* Safari windows 5.1.7, FF < 10
*/
// Set counter to zero
asset.cssRetries = 0;
asset.cssTimeout = win.setTimeout(isCssLoaded, 500);
}
else {
ele = doc.createElement("script");
ele.type = "text/" + (asset.type || "javascript");
ele.src = asset.url;
}
ele.onload = ele.onreadystatechange = process;
ele.onerror = error;
/* Good read, but doesn't give much hope !
* http://blog.getify.com/on-script-loaders/
* http://www.nczonline.net/blog/2010/12/21/thoughts-on-script-loaders/
* https://hacks.mozilla.org/2009/06/defer/
*/
// ASYNC: load in parallel and execute as soon as possible
ele.async = false;
// DEFER: load in parallel but maintain execution order
ele.defer = false;
// timout for asset loading
asset.errorTimeout = win.setTimeout(function () {
error({ type: "timeout" });
}, 7e3);
// use insertBefore to keep IE from throwing Operation Aborted (thx Bryan Forbes!)
var head = doc.head || doc.getElementsByTagName("head")[0];
// but insert at end of head, because otherwise if it is a stylesheet, it will not override values
head.insertBefore(ele, head.lastChild);
}
/* Parts inspired from: https://github.com/jrburke/requirejs
************************************************************/
function init() {
var items = doc.getElementsByTagName("script");
// look for a script with a data-head-init attribute
for (var i = 0, l = items.length; i < l; i++) {
var dataMain = items[i].getAttribute("data-headjs-load");
if (!!dataMain) {
api.load(dataMain);
return;
}
}
}
function ready(key, callback) {
///<summary>
/// INFO: use cases:
/// head.ready(callBack);
/// head.ready(document , callBack);
/// head.ready("file.js", callBack);
/// head.ready("label" , callBack);
/// head.ready(["label1", "label2"], callback);
///</summary>
// DOM ready check: head.ready(document, function() { });
if (key === doc) {
if (isDomReady) {
one(callback);
}
else {
domWaiters.push(callback);
}
return api;
}
// shift arguments
if (isFunction(key)) {
callback = key;
key = "ALL"; // holds all callbacks that where added without labels: ready(callBack)
}
// queue all items from key and return. The callback will be executed if all items from key are already loaded.
if (isArray(key)) {
var items = {};
each(key, function (item) {
items[item] = assets[item];
api.ready(item, function() {
if (allLoaded(items)) {
one(callback);
}
});
});
return api;
}
// make sure arguments are sane
if (typeof key !== "string" || !isFunction(callback)) {
return api;
}
// this can also be called when we trigger events based on filenames & labels
var asset = assets[key];
// item already loaded --> execute and return
if (asset && asset.state === LOADED || key === "ALL" && allLoaded() && isDomReady) {
one(callback);
return api;
}
var arr = handlers[key];
if (!arr) {
arr = handlers[key] = [callback];
}
else {
arr.push(callback);
}
return api;
}
/* Mix of stuff from jQuery & IEContentLoaded
* http://dev.w3.org/html5/spec/the-end.html#the-end
***************************************************/
function domReady() {
// Make sure body exists, at least, in case IE gets a little overzealous (jQuery ticket #5443).
if (!doc.body) {
// let's not get nasty by setting a timeout too small.. (loop mania guaranteed if assets are queued)
win.clearTimeout(api.readyTimeout);
api.readyTimeout = win.setTimeout(domReady, 50);
return;
}
if (!isDomReady) {
isDomReady = true;
init();
each(domWaiters, function (fn) {
one(fn);
});
}
}
function domContentLoaded() {
// W3C
if (doc.addEventListener) {
doc.removeEventListener("DOMContentLoaded", domContentLoaded, false);
domReady();
}
// IE
else if (doc.readyState === "complete") {
// we're here because readyState === "complete" in oldIE
// which is good enough for us to call the dom ready!
doc.detachEvent("onreadystatechange", domContentLoaded);
domReady();
}
}
// Catch cases where ready() is called after the browser event has already occurred.
// we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if (doc.readyState === "complete") {
domReady();
}
// W3C
else if (doc.addEventListener) {
doc.addEventListener("DOMContentLoaded", domContentLoaded, false);
// A fallback to window.onload, that will always work
win.addEventListener("load", domReady, false);
}
// IE
else {
// Ensure firing before onload, maybe late but safe also for iframes
doc.attachEvent("onreadystatechange", domContentLoaded);
// A fallback to window.onload, that will always work
win.attachEvent("onload", domReady);
// If IE and not a frame
// continually check to see if the document is ready
var top = false;
try {
top = !win.frameElement && doc.documentElement;
} catch (e) { }
if (top && top.doScroll) {
(function doScrollCheck() {
if (!isDomReady) {
try {
// Use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
top.doScroll("left");
} catch (error) {
// let's not get nasty by setting a timeout too small.. (loop mania guaranteed if assets are queued)
win.clearTimeout(api.readyTimeout);
api.readyTimeout = win.setTimeout(doScrollCheck, 50);
return;
}
// and execute any waiting functions
domReady();
}
}());
}
}
//#endregion
//#region Public Exports
// INFO: determine which method to use for loading
api.load = api.js = isAsync ? apiLoadAsync : apiLoadHack;
api.test = conditional;
api.ready = ready;
//#endregion
//#region INIT
// perform this when DOM is ready
api.ready(doc, function () {
if (allLoaded()) {
each(handlers.ALL, function (callback) {
one(callback);
});
}
if (api.feature) {
api.feature("domloaded", true);
}
});
//#endregion
}(window));

View file

@ -0,0 +1,5 @@
/*! head.load - v1.0.3 */
(function(n,t){"use strict";function w(){}function u(n,t){if(n){typeof n=="object"&&(n=[].slice.call(n));for(var i=0,r=n.length;i<r;i++)t.call(n,n[i],i)}}function it(n,i){var r=Object.prototype.toString.call(i).slice(8,-1);return i!==t&&i!==null&&r===n}function s(n){return it("Function",n)}function a(n){return it("Array",n)}function et(n){var i=n.split("/"),t=i[i.length-1],r=t.indexOf("?");return r!==-1?t.substring(0,r):t}function f(n){(n=n||w,n._done)||(n(),n._done=1)}function ot(n,t,r,u){var f=typeof n=="object"?n:{test:n,success:!t?!1:a(t)?t:[t],failure:!r?!1:a(r)?r:[r],callback:u||w},e=!!f.test;return e&&!!f.success?(f.success.push(f.callback),i.load.apply(null,f.success)):e||!f.failure?u():(f.failure.push(f.callback),i.load.apply(null,f.failure)),i}function v(n){var t={},i,r;if(typeof n=="object")for(i in n)!n[i]||(t={name:i,url:n[i]});else t={name:et(n),url:n};return(r=c[t.name],r&&r.url===t.url)?r:(c[t.name]=t,t)}function y(n){n=n||c;for(var t in n)if(n.hasOwnProperty(t)&&n[t].state!==l)return!1;return!0}function st(n){n.state=ft;u(n.onpreload,function(n){n.call()})}function ht(n){n.state===t&&(n.state=nt,n.onpreload=[],rt({url:n.url,type:"cache"},function(){st(n)}))}function ct(){var n=arguments,t=n[n.length-1],r=[].slice.call(n,1),f=r[0];return(s(t)||(t=null),a(n[0]))?(n[0].push(t),i.load.apply(null,n[0]),i):(f?(u(r,function(n){s(n)||!n||ht(v(n))}),b(v(n[0]),s(f)?f:function(){i.load.apply(null,r)})):b(v(n[0])),i)}function lt(){var n=arguments,t=n[n.length-1],r={};return(s(t)||(t=null),a(n[0]))?(n[0].push(t),i.load.apply(null,n[0]),i):(u(n,function(n){n!==t&&(n=v(n),r[n.name]=n)}),u(n,function(n){n!==t&&(n=v(n),b(n,function(){y(r)&&f(t)}))}),i)}function b(n,t){if(t=t||w,n.state===l){t();return}if(n.state===tt){i.ready(n.name,t);return}if(n.state===nt){n.onpreload.push(function(){b(n,t)});return}n.state=tt;rt(n,function(){n.state=l;t();u(h[n.name],function(n){f(n)});o&&y()&&u(h.ALL,function(n){f(n)})})}function at(n){n=n||"";var t=n.split("?")[0].split(".");return t[t.length-1].toLowerCase()}function rt(t,i){function e(t){t=t||n.event;u.onload=u.onreadystatechange=u.onerror=null;i()}function o(f){f=f||n.event;(f.type==="load"||/loaded|complete/.test(u.readyState)&&(!r.documentMode||r.documentMode<9))&&(n.clearTimeout(t.errorTimeout),n.clearTimeout(t.cssTimeout),u.onload=u.onreadystatechange=u.onerror=null,i())}function s(){if(t.state!==l&&t.cssRetries<=20){for(var i=0,f=r.styleSheets.length;i<f;i++)if(r.styleSheets[i].href===u.href){o({type:"load"});return}t.cssRetries++;t.cssTimeout=n.setTimeout(s,250)}}var u,h,f;i=i||w;h=at(t.url);h==="css"?(u=r.createElement("link"),u.type="text/"+(t.type||"css"),u.rel="stylesheet",u.href=t.url,t.cssRetries=0,t.cssTimeout=n.setTimeout(s,500)):(u=r.createElement("script"),u.type="text/"+(t.type||"javascript"),u.src=t.url);u.onload=u.onreadystatechange=o;u.onerror=e;u.async=!1;u.defer=!1;t.errorTimeout=n.setTimeout(function(){e({type:"timeout"})},7e3);f=r.head||r.getElementsByTagName("head")[0];f.insertBefore(u,f.lastChild)}function vt(){for(var t,u=r.getElementsByTagName("script"),n=0,f=u.length;n<f;n++)if(t=u[n].getAttribute("data-headjs-load"),!!t){i.load(t);return}}function yt(n,t){var v,p,e;return n===r?(o?f(t):d.push(t),i):(s(n)&&(t=n,n="ALL"),a(n))?(v={},u(n,function(n){v[n]=c[n];i.ready(n,function(){y(v)&&f(t)})}),i):typeof n!="string"||!s(t)?i:(p=c[n],p&&p.state===l||n==="ALL"&&y()&&o)?(f(t),i):(e=h[n],e?e.push(t):e=h[n]=[t],i)}function e(){if(!r.body){n.clearTimeout(i.readyTimeout);i.readyTimeout=n.setTimeout(e,50);return}o||(o=!0,vt(),u(d,function(n){f(n)}))}function k(){r.addEventListener?(r.removeEventListener("DOMContentLoaded",k,!1),e()):r.readyState==="complete"&&(r.detachEvent("onreadystatechange",k),e())}var r=n.document,d=[],h={},c={},ut="async"in r.createElement("script")||"MozAppearance"in r.documentElement.style||n.opera,o,g=n.head_conf&&n.head_conf.head||"head",i=n[g]=n[g]||function(){i.ready.apply(null,arguments)},nt=1,ft=2,tt=3,l=4,p;if(r.readyState==="complete")e();else if(r.addEventListener)r.addEventListener("DOMContentLoaded",k,!1),n.addEventListener("load",e,!1);else{r.attachEvent("onreadystatechange",k);n.attachEvent("onload",e);p=!1;try{p=!n.frameElement&&r.documentElement}catch(wt){}p&&p.doScroll&&function pt(){if(!o){try{p.doScroll("left")}catch(t){n.clearTimeout(i.readyTimeout);i.readyTimeout=n.setTimeout(pt,50);return}e()}}()}i.load=i.js=ut?lt:ct;i.test=ot;i.ready=yt;i.ready(r,function(){y()&&u(h.ALL,function(n){f(n)});i.feature&&i.feature("domloaded",!0)})})(window);
/*
//# sourceMappingURL=head.load.min.js.map
*/

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,9 @@
/*! head.core - v1.0.2 */
(function(n,t){"use strict";function r(n){a[a.length]=n}function k(n){var t=new RegExp(" ?\\b"+n+"\\b");c.className=c.className.replace(t,"")}function p(n,t){for(var i=0,r=n.length;i<r;i++)t.call(n,n[i],i)}function tt(){var t,e,f,o;c.className=c.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g,"");t=n.innerWidth||c.clientWidth;e=n.outerWidth||n.screen.width;u.screen.innerWidth=t;u.screen.outerWidth=e;r("w-"+t);p(i.screens,function(n){t>n?(i.screensCss.gt&&r("gt-"+n),i.screensCss.gte&&r("gte-"+n)):t<n?(i.screensCss.lt&&r("lt-"+n),i.screensCss.lte&&r("lte-"+n)):t===n&&(i.screensCss.lte&&r("lte-"+n),i.screensCss.eq&&r("e-q"+n),i.screensCss.gte&&r("gte-"+n))});f=n.innerHeight||c.clientHeight;o=n.outerHeight||n.screen.height;u.screen.innerHeight=f;u.screen.outerHeight=o;u.feature("portrait",f>t);u.feature("landscape",f<t)}function it(){n.clearTimeout(b);b=n.setTimeout(tt,50)}var y=n.document,rt=n.navigator,ut=n.location,c=y.documentElement,a=[],i={screens:[240,320,480,640,768,800,1024,1280,1440,1680,1920],screensCss:{gt:!0,gte:!1,lt:!0,lte:!1,eq:!1},browsers:[{ie:{min:6,max:11}}],browserCss:{gt:!0,gte:!1,lt:!0,lte:!1,eq:!0},html5:!0,page:"-page",section:"-section",head:"head"},v,u,s,w,o,h,l,d,f,g,nt,e,b;if(n.head_conf)for(v in n.head_conf)n.head_conf[v]!==t&&(i[v]=n.head_conf[v]);u=n[i.head]=function(){u.ready.apply(null,arguments)};u.feature=function(n,t,i){return n?(Object.prototype.toString.call(t)==="[object Function]"&&(t=t.call()),r((t?"":"no-")+n),u[n]=!!t,i||(k("no-"+n),k(n),u.feature()),u):(c.className+=" "+a.join(" "),a=[],u)};u.feature("js",!0);s=rt.userAgent.toLowerCase();w=/mobile|android|kindle|silk|midp|phone|(windows .+arm|touch)/.test(s);u.feature("mobile",w,!0);u.feature("desktop",!w,!0);s=/(chrome|firefox)[ \/]([\w.]+)/.exec(s)||/(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(android)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(s)||/(msie) ([\w.]+)/.exec(s)||/(trident).+rv:(\w.)+/.exec(s)||[];o=s[1];h=parseFloat(s[2]);switch(o){case"msie":case"trident":o="ie";h=y.documentMode||h;break;case"firefox":o="ff";break;case"ipod":case"ipad":case"iphone":o="ios";break;case"webkit":o="safari"}for(u.browser={name:o,version:h},u.browser[o]=!0,l=0,d=i.browsers.length;l<d;l++)for(f in i.browsers[l])if(o===f)for(r(f),g=i.browsers[l][f].min,nt=i.browsers[l][f].max,e=g;e<=nt;e++)h>e?(i.browserCss.gt&&r("gt-"+f+e),i.browserCss.gte&&r("gte-"+f+e)):h<e?(i.browserCss.lt&&r("lt-"+f+e),i.browserCss.lte&&r("lte-"+f+e)):h===e&&(i.browserCss.lte&&r("lte-"+f+e),i.browserCss.eq&&r("eq-"+f+e),i.browserCss.gte&&r("gte-"+f+e));else r("no-"+f);r(o);r(o+parseInt(h,10));i.html5&&o==="ie"&&h<9&&p("abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|progress|section|summary|time|video".split("|"),function(n){y.createElement(n)});p(ut.pathname.split("/"),function(n,u){if(this.length>2&&this[u+1]!==t)u&&r(this.slice(u,u+1).join("-").toLowerCase()+i.section);else{var f=n||"index",e=f.indexOf(".");e>0&&(f=f.substring(0,e));c.id=f.toLowerCase()+i.page;u||r("root"+i.section)}});u.screen={height:n.screen.height,width:n.screen.width};tt();b=0;n.addEventListener?n.addEventListener("resize",it,!1):n.attachEvent("onresize",it)})(window);
/*! head.css3 - v1.0.0 */
(function(n,t){"use strict";function a(n){for(var r in n)if(i[n[r]]!==t)return!0;return!1}function r(n){var t=n.charAt(0).toUpperCase()+n.substr(1),i=(n+" "+c.join(t+" ")+t).split(" ");return!!a(i)}var h=n.document,o=h.createElement("i"),i=o.style,s=" -o- -moz- -ms- -webkit- -khtml- ".split(" "),c="Webkit Moz O ms Khtml".split(" "),l=n.head_conf&&n.head_conf.head||"head",u=n[l],f={gradient:function(){var n="background-image:";return i.cssText=(n+s.join("gradient(linear,left top,right bottom,from(#9f9),to(#fff));"+n)+s.join("linear-gradient(left top,#eee,#fff);"+n)).slice(0,-n.length),!!i.backgroundImage},rgba:function(){return i.cssText="background-color:rgba(0,0,0,0.5)",!!i.backgroundColor},opacity:function(){return o.style.opacity===""},textshadow:function(){return i.textShadow===""},multiplebgs:function(){i.cssText="background:url(https://),url(https://),red url(https://)";var n=(i.background||"").match(/url/g);return Object.prototype.toString.call(n)==="[object Array]"&&n.length===3},boxshadow:function(){return r("boxShadow")},borderimage:function(){return r("borderImage")},borderradius:function(){return r("borderRadius")},cssreflections:function(){return r("boxReflect")},csstransforms:function(){return r("transform")},csstransitions:function(){return r("transition")},touch:function(){return"ontouchstart"in n},retina:function(){return n.devicePixelRatio>1},fontface:function(){var t=u.browser.name,n=u.browser.version;switch(t){case"ie":return n>=9;case"chrome":return n>=13;case"ff":return n>=6;case"ios":return n>=5;case"android":return!1;case"webkit":return n>=5.1;case"opera":return n>=10;default:return!1}}};for(var e in f)f[e]&&u.feature(e,f[e].call(),!0);u.feature()})(window);
/*! head.load - v1.0.3 */
(function(n,t){"use strict";function w(){}function u(n,t){if(n){typeof n=="object"&&(n=[].slice.call(n));for(var i=0,r=n.length;i<r;i++)t.call(n,n[i],i)}}function it(n,i){var r=Object.prototype.toString.call(i).slice(8,-1);return i!==t&&i!==null&&r===n}function s(n){return it("Function",n)}function a(n){return it("Array",n)}function et(n){var i=n.split("/"),t=i[i.length-1],r=t.indexOf("?");return r!==-1?t.substring(0,r):t}function f(n){(n=n||w,n._done)||(n(),n._done=1)}function ot(n,t,r,u){var f=typeof n=="object"?n:{test:n,success:!t?!1:a(t)?t:[t],failure:!r?!1:a(r)?r:[r],callback:u||w},e=!!f.test;return e&&!!f.success?(f.success.push(f.callback),i.load.apply(null,f.success)):e||!f.failure?u():(f.failure.push(f.callback),i.load.apply(null,f.failure)),i}function v(n){var t={},i,r;if(typeof n=="object")for(i in n)!n[i]||(t={name:i,url:n[i]});else t={name:et(n),url:n};return(r=c[t.name],r&&r.url===t.url)?r:(c[t.name]=t,t)}function y(n){n=n||c;for(var t in n)if(n.hasOwnProperty(t)&&n[t].state!==l)return!1;return!0}function st(n){n.state=ft;u(n.onpreload,function(n){n.call()})}function ht(n){n.state===t&&(n.state=nt,n.onpreload=[],rt({url:n.url,type:"cache"},function(){st(n)}))}function ct(){var n=arguments,t=n[n.length-1],r=[].slice.call(n,1),f=r[0];return(s(t)||(t=null),a(n[0]))?(n[0].push(t),i.load.apply(null,n[0]),i):(f?(u(r,function(n){s(n)||!n||ht(v(n))}),b(v(n[0]),s(f)?f:function(){i.load.apply(null,r)})):b(v(n[0])),i)}function lt(){var n=arguments,t=n[n.length-1],r={};return(s(t)||(t=null),a(n[0]))?(n[0].push(t),i.load.apply(null,n[0]),i):(u(n,function(n){n!==t&&(n=v(n),r[n.name]=n)}),u(n,function(n){n!==t&&(n=v(n),b(n,function(){y(r)&&f(t)}))}),i)}function b(n,t){if(t=t||w,n.state===l){t();return}if(n.state===tt){i.ready(n.name,t);return}if(n.state===nt){n.onpreload.push(function(){b(n,t)});return}n.state=tt;rt(n,function(){n.state=l;t();u(h[n.name],function(n){f(n)});o&&y()&&u(h.ALL,function(n){f(n)})})}function at(n){n=n||"";var t=n.split("?")[0].split(".");return t[t.length-1].toLowerCase()}function rt(t,i){function e(t){t=t||n.event;u.onload=u.onreadystatechange=u.onerror=null;i()}function o(f){f=f||n.event;(f.type==="load"||/loaded|complete/.test(u.readyState)&&(!r.documentMode||r.documentMode<9))&&(n.clearTimeout(t.errorTimeout),n.clearTimeout(t.cssTimeout),u.onload=u.onreadystatechange=u.onerror=null,i())}function s(){if(t.state!==l&&t.cssRetries<=20){for(var i=0,f=r.styleSheets.length;i<f;i++)if(r.styleSheets[i].href===u.href){o({type:"load"});return}t.cssRetries++;t.cssTimeout=n.setTimeout(s,250)}}var u,h,f;i=i||w;h=at(t.url);h==="css"?(u=r.createElement("link"),u.type="text/"+(t.type||"css"),u.rel="stylesheet",u.href=t.url,t.cssRetries=0,t.cssTimeout=n.setTimeout(s,500)):(u=r.createElement("script"),u.type="text/"+(t.type||"javascript"),u.src=t.url);u.onload=u.onreadystatechange=o;u.onerror=e;u.async=!1;u.defer=!1;t.errorTimeout=n.setTimeout(function(){e({type:"timeout"})},7e3);f=r.head||r.getElementsByTagName("head")[0];f.insertBefore(u,f.lastChild)}function vt(){for(var t,u=r.getElementsByTagName("script"),n=0,f=u.length;n<f;n++)if(t=u[n].getAttribute("data-headjs-load"),!!t){i.load(t);return}}function yt(n,t){var v,p,e;return n===r?(o?f(t):d.push(t),i):(s(n)&&(t=n,n="ALL"),a(n))?(v={},u(n,function(n){v[n]=c[n];i.ready(n,function(){y(v)&&f(t)})}),i):typeof n!="string"||!s(t)?i:(p=c[n],p&&p.state===l||n==="ALL"&&y()&&o)?(f(t),i):(e=h[n],e?e.push(t):e=h[n]=[t],i)}function e(){if(!r.body){n.clearTimeout(i.readyTimeout);i.readyTimeout=n.setTimeout(e,50);return}o||(o=!0,vt(),u(d,function(n){f(n)}))}function k(){r.addEventListener?(r.removeEventListener("DOMContentLoaded",k,!1),e()):r.readyState==="complete"&&(r.detachEvent("onreadystatechange",k),e())}var r=n.document,d=[],h={},c={},ut="async"in r.createElement("script")||"MozAppearance"in r.documentElement.style||n.opera,o,g=n.head_conf&&n.head_conf.head||"head",i=n[g]=n[g]||function(){i.ready.apply(null,arguments)},nt=1,ft=2,tt=3,l=4,p;if(r.readyState==="complete")e();else if(r.addEventListener)r.addEventListener("DOMContentLoaded",k,!1),n.addEventListener("load",e,!1);else{r.attachEvent("onreadystatechange",k);n.attachEvent("onload",e);p=!1;try{p=!n.frameElement&&r.documentElement}catch(wt){}p&&p.doScroll&&function pt(){if(!o){try{p.doScroll("left")}catch(t){n.clearTimeout(i.readyTimeout);i.readyTimeout=n.setTimeout(pt,50);return}e()}}()}i.load=i.js=ut?lt:ct;i.test=ot;i.ready=yt;i.ready(r,function(){y()&&u(h.ALL,function(n){f(n)});i.feature&&i.feature("domloaded",!0)})})(window);
/*
//# sourceMappingURL=head.min.js.map
*/

File diff suppressed because one or more lines are too long

View file

@ -36,6 +36,22 @@
</ul>
</li>
<li><strong>BUT...</strong>It might not be for you</li>
<aside class="notes">
<ul>
<li>Too many tools: Sublime Text 2 for editing, Putty for SSH,
git bash for git, Cygwin for Rubt commands.</li>
<li>Can mostly be done in ST2 with time. Restart with Vim,
"nerd cred", More importantly, server administration Vim (or vi)
works everywhere, no matter how broken the machine is (emacs
does not)</li>
<li>
After 20 years, people are still finding new ways to use it
</li>
<li>
Repetitive Strain injury - vim helps enforce better habbits
</li>
<li>You have to decide what works for you</li>
</aside>
</section>
<!-- learning curve -->
@ -64,6 +80,14 @@
</li>
<li>Focus on five commands a week</li>
</ul>
<aside class="notes">
<ul>
<li>vimtutor - 30-45 minutes is enough to gain usability</li>
<li>VIM Adventures - game that finally pushed me into learning</li>
<li>Cheat Sheet - I still keep one printed off on a wall</li>
<li>Focus on a small set - I picked five that I wrote down and learned
each week and still do from time to time</li>
</aside>
</section>
<section>
@ -73,6 +97,15 @@
<li>Not using the mouse</li>
<li>Getting to the end of the line</li>
</ul>
<aside class="notes">
My struggles
<ul>
<li>Copy and paste - different idea</li>
<li>Not using a mouse</li>
<li>Getting to the end of the line example: I used
shift+A&lt;ESC&gt; instead of $ for months</li>
</ul>
</aside>
</section>
<!-- modes -->
@ -88,6 +121,15 @@
</ul>
</li>
<li>Higher complexity, but comes with incredible power</li>
<aside class="notes">
<ul>
<li>In the early days, all editors had modes. By programmers,
for programers.</li>
<li>Mid-1970s, Larry Tesler came up with the concept of modeless
editors.</li>
<li>But traded a lot of power in favor of this ease of use.</li>
</ul>
</aside>
</ul>
</section>
@ -107,6 +149,12 @@
</ul>
</li>
</ul>
<aside class="notes">
<ul>
<li>Focus on home row.</li>
<li>Move around screen: H, M, L</li>
<li>Move around document: gg, G, :50</li>
</aside>
</section>
<!-- actions -->
@ -126,6 +174,15 @@
</ul>
</li>
</ul>
<aside class="notes">
<ul>
<li>insert is a complete mode switch to let you type text, leave
with &lt;ESC&gt;</li>
<li>delete, change, yank act on things</li>
<li>All of them put affected text into a place that can be pasted
from</li>
</ul>
</aside>
</section>
<!-- objects -->
@ -148,6 +205,12 @@
</ul>
</li>
</ul>
<aside class="notes">
<ul>
<li>Everything is an object in Vim.</li>
<li>Learning to utilize these is the key to effective vim use</li>
</ul>
</aside>
</section>
<!-- modified -->
@ -159,6 +222,15 @@
<li>t - (un)till</li>
<li>f - find</li>
</ul>
<aside class="notes">
<ul>
<li>inside - excludes the surrounding part of the object</li>
<li>around - includes the surrounding part of the object</li>
<li>till - from cursor to the specific character</li>
<li>find - the same as till except for including the specific
character</li>
</ul>
</aside>
</section>
<!-- combined -->
@ -181,6 +253,13 @@
</ul>
</li>
</ul>
<aside class="notes">
<ul>
<li>
das - includes the spaces. dis would not inclue space after.
</li>
</ul>
</aside>
</section>
<!-- example stuff -->
@ -211,6 +290,14 @@
by Chris Hunt
</li>
</ul>
<aside class="notes">
<ul>
<li>Ben Orenstein - one of my favorite speakers</li>
<li>:w&lt;CR&gt; to ^s; thousands of key strokes per week</li>
<li>Damian Conway - more advanced with neat plugins</li>
<li>Chris Hunt - Basic tmux and Vim. I do this.</li>
</ul>
</aside>
</section>
<!-- Repository slide -->
@ -231,6 +318,11 @@
</ul>
</li>
</ul>
<aside class="notes">
<ul>
<li>Grow your vim file like a garden</li>
</ul>
</aside>
</section>
<!-- Conclusion -->
@ -239,12 +331,32 @@
</section>
</div>
</div>
<script src="bower_components/headjs/dist/1.0.0/head.min.js"></script>
<script src="bower_components/reveal.js/js/reveal.min.js"></script>
<script>
Reveal.initialize({
controls: false,
progress: true,
history: true
history: true,
dependencies: [
{
src: 'bower_components/reveal.js/plugin/notes/notes.js',
async: true,
condition: function() { return !!document.body.classList; }
},
{
src: 'bower_components/reveal.js/plugin/markdown/marked.js',
condition: function() {
return !!document.querySelector( '[data-markdown]' );
}
},
{
src: 'bower_components/reveal.js/plugin/markdown/markdown.js',
condition: function() {
return !!document.querySelector( '[data-markdown]' );
}
},
]
});
</script>
</body>

View file

@ -1,91 +0,0 @@
# Intro to Vim
## Intro to Vim
## Why I use Vim
* Was using too many tools
* Sublime Text 2 for editing
* Putty for SSH
* git bash for git
* Cygwin for Rubt commands
* Can mostly be done in ST2, but with time invested. Restart with Vim
* "nerd cred"
* More importantly, server administration
* Vim (or vi) works **everywhere**, no matter how broken the machine is
* (emacs does not)
* After 20 years, people are still finding new ways to use it
* Repetitive Strain injury - vim helps enforce better habbits
* You have to decide what works for you
## Everyone's first Vim session
* Bash.org joke
## But how can we avoid this
* vimtutor - 30-45 minutes is enough to gain usability
* VIM Adventures - game that finally pushed me into learning
* Cheat Sheet - I still keep one printed off on a wall
* Focus on a small set - I picked five that I wrote down and learned each week
* and still do from time to time
## You will still struggle
* Some of the things I struggled with
* Copy and paste - very different idea, more later (and more advanced)
* Not using a mouse - if you don't plan on this, Vim is not for you
* Getting to the end of the line example
* I used shift+A<ESC> instead of $ for months
## Vim has modes
* In the early days, all editors had modes. By programmers, for programers.
* Mid-1970s, Larry Tesler came up with the concept of modeless editors.
* But a lot of power in favor of this ease of use.
## You can move around
* Focus on home row. h, l to go left and right, j, k to go up and down
* Arrow keys are bad. Require awkward hand movements.
* Variants can get you around the screen faster.
* Screen: H, M, L
* Document: gg, G, :50
## And do things
* insert is a complete mode switch to let you type text, leave with <ESC>
* delete, change, yank act on things
* All of them put affected text into a place that can be pasted from
## On objects
* Everything is an object in Vim.
* Learning to utilize these is the key to effective vim use
## That can be modified
* inside - excludes the surrounding part of the object
* around - includes the surrounding part of the object
* till - from cursor to the specific character
* find - the same as till except for including the specific character
## And finally combined into a language
* das - includes the spaces. dis would not include the space after
# Demonstration
# Other Talks
* Ben Orenstein - one of my favorite speakers. more intermediate than beginner
* Note comment on saving keystrokes
* Damian Conway - More advanced and neat plugins
* Chris Hunt - Shows basics of using Vim in combination with Tmux
* I do this
# Resources
* Slides along with sample configuration available on Github
# Try Vim for yourself