+
PNG, GIF (animated or not) and JPEG formats.
+
+
+### The best ampersand
+
+ Nuts
+
Down the Rabbit-Hole
+
Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, “and what is the use of a book,” thought Alice “without pictures or conversation?”
+
So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid), whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly a White Rabbit with pink eyes ran close by her.
+
diff --git a/gh-pages/tamia/modules/text/example.html b/gh-pages/tamia/modules/text/example.html
new file mode 100644
index 0000000..5e59774
--- /dev/null
+++ b/gh-pages/tamia/modules/text/example.html
@@ -0,0 +1,7 @@
+
+ * },
+ * // Initialize jQuery plugins (plain initializer)
+ * jquerypony: function(elem) {
+ * $(elem).pluginmethod({option1: 'val1', options2: 'val2'});
+ * $(elem).pluginmethod2();
+ * },
+ * // Initialize jQuery plugins (shortcut)
+ * jquerypony: {
+ * pluginmethod: {option1: 'val1', options2: 'val2'},
+ * pluginmethod2: ['attr1', 'attr2', 'attr3'],
+ * pluginmethod3: null
+ * }
+ * }
+ *
+ * Caveats:
+ *
+ * 1. To initialize components inside container that was hidden or inside dynamically created container use
+ * init.tamia event: `$('.js-container').trigger('init.tamia');`
+ * 2. No components will be initialized twice. It’s safe to trigger init.tamia event multiple times: only new nodes
+ * or nodes that was hidden before will be affected.
+ */
+ tamia.initComponents = function(components, parent) {
+ var containers;
+ if (parent === undefined) {
+ containers = _containersCache || (_containersCache = _getContainers());
+ }
+ else {
+ // Init all components inside DOM node
+ containers = _getContainers(parent);
+ components = _components;
+ }
+
+ // Init components
+ for (var containerIdx = 0, containerCnt = containers.length; containerIdx < containerCnt; containerIdx++) {
+ var container = containers[containerIdx];
+ var componentName = container.getAttribute('data-component');
+ var component = components[componentName];
+ if (!component || container.hasAttribute(_initializedAttribute)) continue;
+
+ var initialized = true;
+ if ('__tamia_cmpnt__' in component) {
+ // New style component
+ initialized = (new component(container)).initializable;
+ }
+ else if (typeof component === 'function') {
+ // Old style component
+ initialized = component(container);
+ }
+ else if (jQuery) {
+ // jQuery plugins shortcut
+ for (var method in component) {
+ var params = component[method];
+ var elem = jQuery(container);
+ if (DEBUG && !jQuery.isFunction(elem[method])) warn('jQuery method "%s" not found (used in "%s" component).', method, componentName);
+ if (jQuery.isArray(params)) {
+ elem[method].apply(elem, params);
+ }
+ else {
+ elem[method](params);
+ }
+ }
+ }
+
+ if (initialized !== false) {
+ container.setAttribute(_initializedAttribute, 'yes');
+ }
+ }
+
+ // Add new components to all components array
+ for (var name in components) {
+ _components[name] = components[name];
+ }
+ };
+
+ if (jQuery) {
+
+ var _doc = jQuery(document);
+ var _hiddenClass = 'is-hidden';
+ var _transitionClass = 'is-transit';
+ var _appearedEvent = 'appeared.tamia';
+ var _disappearedEvent = 'disappeared.tamia';
+ var _fallbackTimeout = 1000;
+
+ /**
+ * Registers Tâmia events (eventname.tamia) on document.
+ *
+ * Example:
+ *
+ * // Registers enable.tamia event.
+ * tamia.registerEvents({
+ * enable: function(elem) {
+ * }
+ * });
+ *
+ * @param {Object} handlers Handlers list.
+ */
+ tamia.registerEvents = function(handlers) {
+ var events = $.map(handlers, _tamiaze).join(' ');
+ _doc.on(events, function(event) {
+ if (DEBUG) log('Event "%s":', event.type, event.target);
+ handlers[event.type](event.target);
+ });
+ };
+
+ var _tamiaze = function (handler, name) {
+ return name + '.tamia';
+ };
+
+
+ /**
+ * Events
+ */
+ var _handlers = {};
+
+ /**
+ * Init components inside any jQuery node.
+ *
+ * Examples:
+ *
+ * $(document).trigger('init.tamia');
+ * $('.js-container').trigger('init.tamia');
+ */
+ _handlers.init = function(elem) {
+ tamia.initComponents(undefined, elem);
+ };
+
+ /**
+ * Show element with CSS transition.
+ *
+ * appeared.tamia event will be fired the moment transition ends.
+ *
+ * Example:
+ *
+ * .dialog
+ * transition: opacity .5s ease-in-out
+ * ...
+ * &.is-hidden
+ * opacity: 0
+ *
+ *
...
+ *
+ * $('.js-dialog').trigger('appear.tamia');
+ */
+ _handlers.appear = function(elem) {
+ elem = $(elem);
+ if (Modernizr && Modernizr.csstransitions) {
+ if (elem.hasClass(_transitionClass) && !elem.hasClass(_hiddenClass)) return;
+ elem.addClass(_transitionClass);
+ setTimeout(function() {
+ elem.removeClass(_hiddenClass);
+ elem.afterTransition(function() {
+ elem.removeClass(_transitionClass);
+ elem.trigger(_appearedEvent);
+ });
+ }, 0);
+ }
+ else {
+ elem.removeClass(_hiddenClass);
+ elem.trigger(_appearedEvent);
+ }
+ };
+
+ /**
+ * Hide element with CSS transition.
+ *
+ * disappeared.tamia event will be fired the moment transition ends.
+ *
+ * Opposite of `appear.tamia` event.
+ */
+ _handlers.disappear = function(elem) {
+ elem = $(elem);
+ if (Modernizr && Modernizr.csstransitions) {
+ if (elem.hasClass(_transitionClass) && elem.hasClass(_hiddenClass)) return;
+ elem.addClass(_transitionClass);
+ elem.addClass(_hiddenClass);
+ elem.afterTransition(function() {
+ elem.removeClass(_transitionClass);
+ elem.trigger(_disappearedEvent);
+ });
+ }
+ else {
+ elem.addClass(_hiddenClass);
+ elem.trigger(_disappearedEvent);
+ }
+ };
+
+ /**
+ * Toggles element’s visibility with CSS transition.
+ *
+ * See `appear.tamia` event for details.
+ */
+ _handlers.toggle = function(elem) {
+ elem = $(elem);
+ if (elem.hasClass(_hiddenClass)) {
+ _handlers.appear(elem);
+ }
+ else {
+ _handlers.disappear(elem);
+ }
+ };
+
+ tamia.registerEvents(_handlers);
+
+
+ /**
+ * Controls.
+ *
+ * Fires jQuery event to specified element on click at this element.
+ *
+ * @param data-fire Event name.
+ * @param [data-target] Target element selector.
+ * @param [data-closest] Target element selector: search only through element ancestors.
+ * @param [data-attrs] Comma separated attributes list.
+ *
+ * Either of data-target or data-closest is required.
+ *
+ * Example:
+ *
+ *
Next
+ *
+ */
+ _doc.on('click', '[data-fire]', function(event) {
+ var elem = jQuery(event.currentTarget);
+
+ var data = elem.data();
+ if (DEBUG) if (!data.target && !data.closest) return log('You should define either data-target or data-closest on', elem[0]);
+
+ var target = data.target && jQuery(data.target) || elem.closest(data.closest);
+ if (DEBUG) if (!target.length) return log('Target element %s not found for', data.target || data.closest, elem[0]);
+
+ var attrs = data.attrs;
+ if (DEBUG) log('Fire "%s" with attrs [%s] on', data.fire, attrs || '', target);
+ target.trigger(data.fire, attrs ? attrs.split(/[;, ]/) : undefined);
+
+ event.preventDefault();
+ });
+
+ /**
+ * Grid helper.
+ *
+ * Example:
+ *
+ *
+ */
+ if (DEBUG) tamia.initComponents({
+ grid: function(elem) {
+ elem = $(elem);
+ elem
+ .addClass('g-row')
+ .html(
+ new Array((elem.data('columns') || 12) + 1).join('
')
+ )
+ ;
+ }
+ });
+
+ }
+
+}(window, window.jQuery, window.Modernizr));
diff --git a/gh-pages/tamia/vendor/transition-events.js b/gh-pages/tamia/vendor/transition-events.js
new file mode 100644
index 0000000..df9a6c8
--- /dev/null
+++ b/gh-pages/tamia/vendor/transition-events.js
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2012 Andrey “A.I.” Sitnik
,
+ * sponsored by Evil Martians.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+;(function($) {
+ "use strict";
+
+ // Common methods and properties for jQuery Transition Events plugin.
+ // Mostly for internal usage, but maybe helpful for some hack stuff:
+ //
+ // if ( $.Transitions.isSupported() ) {
+ // // CSS Transitions is supported
+ // }
+ $.Transitions = {
+
+ // Hash of property name to event name with vendor prefixes.
+ // It is used to detect prefix.
+ _names: {
+ // Webkit must be on bottom, because Opera try to use webkit
+ // prefix.
+ 'transition': 'transitionend',
+ 'OTransition': 'oTransitionEnd',
+ 'WebkitTransition': 'webkitTransitionEnd',
+ 'MozTransition': 'transitionend'
+ },
+
+ // Return array of milliseconds for CSS value of `transition-duration`.
+ // It’s used in `$.fn.afterTransition`.
+ _parseTimes: function (string) {
+ var value, array = string.split(/,\s*/);
+ for (var i = 0; i < array.length; i++) {
+ value = array[i];
+ array[i] = parseFloat(value);
+ if ( value.match(/\ds/) ) {
+ array[i] = array[i] * 1000;
+ }
+ }
+ return array;
+ },
+
+ // Autodetect vendor prefix and return `transitionend` event name.
+ //
+ // If browser didn’t support CSS Transitions it will return `false`.
+ getEvent: function () {
+ var finded = false;
+ for ( var prop in this._names ) {
+ if ( typeof(document.body.style[prop]) != 'undefined' ) {
+ finded = this._names[prop];
+ break;
+ }
+ }
+
+ this.getEvent = function () {
+ return finded;
+ };
+
+ return finded;
+ },
+
+ // Alias to vendor prefixed `requestAnimationFrame`. Will be replace
+ // by native function after first call.
+ animFrame: function (callback) {
+ var raf = window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.msRequestAnimationFrame;
+ if ( raf ) {
+ this.animFrame = function (callback) {
+ return raf.call(window, callback);
+ };
+ } else {
+ this.animFrame = function (callback) {
+ return setTimeout(callback, 10);
+ };
+ }
+ return this.animFrame(callback);
+ },
+
+ // Return `true` if browser support CSS Transitions.
+ isSupported: function () {
+ return this.getEvent() !== false;
+ }
+
+ }
+
+ // jQuery node methods.
+ $.extend($.fn, {
+
+ // Call `callback` after CSS Transition finish
+ // `delay + (durationPart * duration)`. It will call `callback` only
+ // once, in difference from `transitionEnd`.
+ //
+ // $('.show-video').click(function () {
+ // $('.slider').addClass('video-position').afterTransition(
+ // function () { autoPlayVideo(); });
+ // });
+ //
+ // You can set `durationPart` to call `callback` in the middle of
+ // transition:
+ //
+ // $('.fliper').addClass('rotate').afterTransition(0.5, function () {
+ // $(this).find('.backface').show();
+ // });
+ //
+ // Callback will get object with `propertyName` and `elapsedTime`
+ // properties. If transition is set to difference properties, it will
+ // be called on every property.
+ //
+ // This method doesn’t check, that transition is really finished (it can
+ // be canceled in the middle).
+ afterTransition: function (durationPart, callback) {
+ if ( typeof(callback) == 'undefined' ) {
+ callback = durationPart;
+ durationPart = 1;
+ }
+
+ if ( !$.Transitions.isSupported() ) {
+ for (var i = 0; i < this.length; i++) {
+ callback.call(this[i], {
+ type: 'aftertransition',
+ elapsedTime: 0,
+ propertyName: '',
+ currentTarget: this[i]
+ });
+ }
+ return this;
+ }
+
+ for (var i = 0; i < this.length; i++) {
+ var el = $(this[i]);
+ var props = el.css('transition-property').split(/,\s*/);
+ var durations = el.css('transition-duration');
+ var delays = el.css('transition-delay');
+
+ durations = $.Transitions._parseTimes(durations);
+ delays = $.Transitions._parseTimes(delays);
+
+ var prop, duration, delay, after, elapsed;
+ for (var j = 0; j < props.length; j++) {
+ prop = props[j];
+ duration = durations[ durations.length == 1 ? 0 : j ];
+ delay = delays[ delays.length == 1 ? 0 : j ];
+ after = delay + (duration * durationPart);
+ elapsed = duration * durationPart / 1000;
+
+ (function (el, prop, after, elapsed) {
+ setTimeout(function () {
+ $.Transitions.animFrame(function () {
+ callback.call(el[0], {
+ type: 'aftertransition',
+ elapsedTime: elapsed,
+ propertyName: prop,
+ currentTarget: el[0]
+ });
+ });
+ }, after);
+ })(el, prop, after, elapsed);
+ }
+ }
+ return this;
+ },
+
+ // Set `callback` to listen every CSS Transition finish.
+ // It will call `callback` on every finished transition,
+ // in difference from `afterTransition`.
+ //
+ // It just bind to `transitionend` event, but detect vendor prefix.
+ //
+ // Callback will get event object with `propertyName` and `elapsedTime`
+ // properties. If transition is set to difference properties, it will
+ // be called on every property.
+ //
+ // Note, that `callback` will get original event object, not from
+ // jQuery.
+ //
+ // var slider = $('.slider').transitionEnd(function () {
+ // if ( slider.hasClass('video-position') ) {
+ // autoPlayVideo();
+ // }
+ // });
+ //
+ // $('.show-video').click(function () {
+ // slider.addClass('video-position');
+ // });
+ //
+ // If transition will be canceled before finish, event won’t be fired.
+ transitionEnd: function (callback) {
+ for (var i = 0; i < this.length; i++) {
+ this[i].addEventListener($.Transitions.getEvent(), function (e) {
+ callback.call(this, e);
+ });
+ }
+ return this;
+ }
+
+ });
+
+}).call(this, jQuery);
diff --git a/gh-pages/templates/build.tmpl.html b/gh-pages/templates/build.tmpl.html
new file mode 100644
index 0000000..c6a2d72
--- /dev/null
+++ b/gh-pages/templates/build.tmpl.html
@@ -0,0 +1,17 @@
+
+
+ {{? $.site_facebook }}
Facebook
{{?}}
+
+ {{? $.site_twitter }}{{?}}
+
+ {{? $.site_mailru }}
Мой мир
{{?}}
+
+ {{? $.site_vkontakte }}
Вконтакте
{{?}}
+
+ {{? $.site_odnoklassniki }}
Одноклассники
{{?}}
+
+ {{? $.site_plusone }}
Google+
{{?}}
+
+ {{? $.site_pinterest }}
Pinterest
{{?}}
+
+
\ No newline at end of file
diff --git a/gh-pages/templates/functions.js b/gh-pages/templates/functions.js
new file mode 100644
index 0000000..3dadcb1
--- /dev/null
+++ b/gh-pages/templates/functions.js
@@ -0,0 +1,21 @@
+$.tagsClasses = function(prefix, tags) {
+ var classes = [prefix];
+ for (var tagIdx = 0; tagIdx < tags.length; tagIdx++) {
+ classes.push(prefix + '_' + tags[tagIdx]);
+ }
+ return classes.join(' ');
+};
+
+$.getPage = function(page) {
+ return $.map[$.lang + '/' + page];
+};
+
+$.getBodyClasses = function() {
+ if (!$.bodyClasses) return '';
+ return $.bodyClasses.join(' ');
+};
+
+$.getTranslationUrl = function(lang) {
+ var translation = $.map[$.path.replace($.lang, lang)];
+ return translation ? translation.url : $.map[lang + '/index'].url;
+};
diff --git a/gh-pages/templates/index.tmpl.html b/gh-pages/templates/index.tmpl.html
new file mode 100644
index 0000000..83da27b
--- /dev/null
+++ b/gh-pages/templates/index.tmpl.html
@@ -0,0 +1,19 @@
+
+
+
+
+ Social Likes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $.name
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $.docs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gh-pages/vendor/modernizr.js b/gh-pages/vendor/modernizr.js
new file mode 100644
index 0000000..f70ebc6
--- /dev/null
+++ b/gh-pages/vendor/modernizr.js
@@ -0,0 +1,9442 @@
+/*!
+ * modernizr v3.2.0
+ * Build http://modernizr.com/download?-adownload-ambientlight-animation-apng-appearance-applicationcache-atobbtoa-audio-audioloop-audiopreload-backdropfilter-backgroundblendmode-backgroundcliptext-backgroundsize-batteryapi-bdi-beacon-bgpositionshorthand-bgpositionxy-bgrepeatspace_bgrepeatround-bgsizecover-blobconstructor-bloburls-blobworkers-borderimage-borderradius-boxshadow-boxsizing-canvas-canvasblending-canvastext-canvaswinding-capture-checked-classlist-contains-contenteditable-contextmenu-cookies-cors-createelementattrs_createelement_attrs-cryptography-cssall-cssanimations-csscalc-csschunit-csscolumns-cssescape-cssexunit-cssfilters-cssgradients-csshairline-csshyphens_softhyphens_softhyphensfind-cssinvalid-cssmask-csspointerevents-csspositionsticky-csspseudoanimations-csspseudotransitions-cssreflections-cssremunit-cssresize-cssscrollbar-csstransforms-csstransforms3d-csstransitions-cssvalid-cssvhunit-cssvmaxunit-cssvminunit-cssvwunit-cubicbezierrange-customevent-customprotocolhandler-dart-datachannel-datalistelem-dataset-datauri-dataview-dataworkers-details-devicemotion_deviceorientation-directory-display_runin-displaytable-documentfragment-ellipsis-emoji-es5-es5array-es5date-es5function-es5object-es5string-es5syntax-es5undefined-es6array-es6collections-es6math-es6number-es6object-es6string-eventlistener-eventsource-exiforientation-fetch-fileinput-filereader-filesystem-flash-flexbox-flexboxlegacy-flexboxtweener-flexwrap-fontface-forcetouch-formattribute-formvalidation-framed-fullscreen-gamepads-generatedcontent-generators-geolocation-getrandomvalues-getusermedia-hashchange-hidden-hiddenscroll-history-hsla-htmlimports-ie8compat-imgcrossorigin-indexeddb-indexeddbblob-inlinesvg-input-inputformaction-inputformenctype-inputformmethod-inputformtarget-inputtypes-intl-jpeg2000-jpegxr-json-lastchild-ligatures-localizednumber-localstorage-lowbandwidth-lowbattery-matchmedia-mathml-mediaqueries-microdata-multiplebgs-mutationobserver-notification-nthchild-objectfit-olreversed-oninput-opacity-outputelem-overflowscrolling-pagevisibility-peerconnection-performance-picture-placeholder-pointerevents-pointerlock-postmessage-preserve3d-progressbar_meter-promises-proximity-queryselector-quotamanagement-regions-requestanimationframe-requestautocomplete-rgba-ruby-sandbox-scriptasync-scriptdefer-scrollsnappoints-seamless-search-serviceworker-sessionstorage-shapes-sharedworkers-siblinggeneral-sizes-smil-speechrecognition-speechsynthesis-srcdoc-srcset-strictmode-stylescoped-subpixelfont-supports-svg-svgasimg-svgclippaths-svgfilters-svgforeignobject-target-template-templatestrings-textalignlast-textareamaxlength-textshadow-texttrackapi_track-time-todataurljpeg_todataurlpng_todataurlwebp-touchevents-transferables-typedarrays-unicode-unicoderange-unknownelements-urlparser-userdata-userselect-vibrate-video-videoautoplay-videoloop-videopreload-vml-webaudio-webgl-webglextensions-webintents-webp-webpalpha-webpanimation-webplossless_webp_lossless-websockets-websocketsbinary-websqldatabase-webworkers-willchange-wrapflow-xdomainrequest-xhr2-xhrresponsetype-xhrresponsetypearraybuffer-xhrresponsetypeblob-xhrresponsetypedocument-xhrresponsetypejson-xhrresponsetypetext-addtest-atrule-domprefixes-hasevent-mq-prefixed-prefixedcss-prefixedcssvalue-prefixes-setclasses-shiv-testallprops-testprop-teststyles-dontmin
+ *
+ * Copyright (c)
+ * Faruk Ates
+ * Paul Irish
+ * Alex Sexton
+ * Ryan Seddon
+ * Patrick Kettner
+ * Stu Cox
+ * Richard Herrera
+
+ * MIT License
+ */
+
+/*
+ * Modernizr tests which native CSS3 and HTML5 features are available in the
+ * current UA and makes the results available to you in two ways: as properties on
+ * a global `Modernizr` object, and as classes on the `` element. This
+ * information allows you to progressively enhance your pages with a granular level
+ * of control over the experience.
+ */
+
+;(function(window, document, undefined){
+ var classes = [];
+
+
+ var tests = [];
+
+
+ /**
+ *
+ * ModernizrProto is the constructor for Modernizr
+ *
+ * @class
+ * @access public
+ */
+
+ var ModernizrProto = {
+ // The current version, dummy
+ _version: '3.2.0',
+
+ // Any settings that don't work as separate modules
+ // can go in here as configuration.
+ _config: {
+ 'classPrefix': '',
+ 'enableClasses': true,
+ 'enableJSClass': true,
+ 'usePrefixes': true
+ },
+
+ // Queue of tests
+ _q: [],
+
+ // Stub these for people who are listening
+ on: function(test, cb) {
+ // I don't really think people should do this, but we can
+ // safe guard it a bit.
+ // -- NOTE:: this gets WAY overridden in src/addTest for actual async tests.
+ // This is in case people listen to synchronous tests. I would leave it out,
+ // but the code to *disallow* sync tests in the real version of this
+ // function is actually larger than this.
+ var self = this;
+ setTimeout(function() {
+ cb(self[test]);
+ }, 0);
+ },
+
+ addTest: function(name, fn, options) {
+ tests.push({name: name, fn: fn, options: options});
+ },
+
+ addAsyncTest: function(fn) {
+ tests.push({name: null, fn: fn});
+ }
+ };
+
+
+
+ // Fake some of Object.create so we can force non test results to be non "own" properties.
+ var Modernizr = function() {};
+ Modernizr.prototype = ModernizrProto;
+
+ // Leak modernizr globally when you `require` it rather than force it here.
+ // Overwrite name so constructor name is nicer :D
+ Modernizr = new Modernizr();
+
+
+ /*!
+ {
+ "name": "Application Cache",
+ "property": "applicationcache",
+ "caniuse": "offline-apps",
+ "tags": ["storage", "offline"],
+ "notes": [{
+ "name": "MDN documentation",
+ "href": "https://developer.mozilla.org/en/docs/HTML/Using_the_application_cache"
+ }],
+ "polyfills": ["html5gears"]
+ }
+ !*/
+ /* DOC
+ Detects support for the Application Cache, for storing data to enable web-based applications run offline.
+
+ The API has been [heavily criticized](http://alistapart.com/article/application-cache-is-a-douchebag) and discussions are underway to address this.
+ */
+
+ Modernizr.addTest('applicationcache', 'applicationCache' in window);
+
+ /*!
+ {
+ "name": "Blob constructor",
+ "property": "blobconstructor",
+ "aliases": ["blob-constructor"],
+ "builderAliases": ["blob_constructor"],
+ "caniuse": "blobbuilder",
+ "notes": [{
+ "name": "W3C spec",
+ "href": "http://dev.w3.org/2006/webapi/FileAPI/#constructorBlob"
+ }],
+ "polyfills": ["blobjs"]
+ }
+ !*/
+ /* DOC
+ Detects support for the Blob constructor, for creating file-like objects of immutable, raw data.
+ */
+
+ Modernizr.addTest('blobconstructor', function() {
+ try {
+ return !!new Blob();
+ } catch (e) {
+ return false;
+ }
+ }, {
+ aliases: ['blob-constructor']
+ });
+
+ /*!
+ {
+ "name": "Cookies",
+ "property": "cookies",
+ "tags": ["storage"],
+ "authors": ["tauren"]
+ }
+ !*/
+ /* DOC
+ Detects whether cookie support is enabled.
+ */
+
+ // https://github.com/Modernizr/Modernizr/issues/191
+
+ Modernizr.addTest('cookies', function() {
+ // navigator.cookieEnabled cannot detect custom or nuanced cookie blocking
+ // configurations. For example, when blocking cookies via the Advanced
+ // Privacy Settings in IE9, it always returns true. And there have been
+ // issues in the past with site-specific exceptions.
+ // Don't rely on it.
+
+ // try..catch because some in situations `document.cookie` is exposed but throws a
+ // SecurityError if you try to access it; e.g. documents created from data URIs
+ // or in sandboxed iframes (depending on flags/context)
+ try {
+ // Create cookie
+ document.cookie = 'cookietest=1';
+ var ret = document.cookie.indexOf('cookietest=') != -1;
+ // Delete cookie
+ document.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT';
+ return ret;
+ }
+ catch (e) {
+ return false;
+ }
+ });
+
+ /*!
+ {
+ "name": "Cross-Origin Resource Sharing",
+ "property": "cors",
+ "caniuse": "cors",
+ "authors": ["Theodoor van Donge"],
+ "notes": [{
+ "name": "MDN documentation",
+ "href": "https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS"
+ }],
+ "polyfills": ["pmxdr", "ppx", "flxhr"]
+ }
+ !*/
+ /* DOC
+ Detects support for Cross-Origin Resource Sharing: method of performing XMLHttpRequests across domains.
+ */
+
+ Modernizr.addTest('cors', 'XMLHttpRequest' in window && 'withCredentials' in new XMLHttpRequest());
+
+ /*!
+ {
+ "name": "Custom protocol handler",
+ "property": "customprotocolhandler",
+ "authors": ["Ben Schwarz"],
+ "builderAliases": ["custom_protocol_handler"],
+ "notes": [{
+ "name": "WHATWG overview",
+ "href": "http://developers.whatwg.org/timers.html#custom-handlers"
+ },{
+ "name": "MDN documentation",
+ "href": "https://developer.mozilla.org/en-US/docs/Web/API/navigator.registerProtocolHandler"
+ }],
+ "warnings": [],
+ "polyfills": []
+ }
+ !*/
+ /* DOC
+ Detects support for the `window.registerProtocolHandler()` API to allow websites to register themselves as possible handlers for particular protocols.
+ */
+
+ Modernizr.addTest('customprotocolhandler', function() {
+ // early bailout where it doesn't exist at all
+ if (!navigator.registerProtocolHandler) {
+ return false;
+ }
+
+ // registerProtocolHandler was stubbed in webkit for a while, and didn't
+ // actually do anything. We intentionally set it improperly to test for
+ // the proper sort of failure
+ try {
+ navigator.registerProtocolHandler('thisShouldFail');
+ }
+ catch (e) {
+ return e instanceof TypeError;
+ }
+
+ return false;
+ });
+
+ /*!
+ {
+ "name": "CustomEvent",
+ "property": "customevent",
+ "tags": ["customevent"],
+ "authors": ["Alberto Elias"],
+ "notes": [{
+ "name": "W3C DOM reference",
+ "href": "http://www.w3.org/TR/DOM-Level-3-Events/#interface-CustomEvent"
+ }, {
+ "name": "MDN documentation",
+ "href": "https://developer.mozilla.org/en/docs/Web/API/CustomEvent"
+ }],
+ "polyfills": ["eventlistener"]
+ }
+ !*/
+ /* DOC
+
+ Detects support for CustomEvent.
+
+ */
+
+ Modernizr.addTest('customevent', 'CustomEvent' in window && typeof window.CustomEvent === 'function');
+
+ /*!
+ {
+ "name": "DataView",
+ "property": "dataview",
+ "authors": ["Addy Osmani"],
+ "builderAliases": ["dataview_api"],
+ "notes": [{
+ "name": "MDN documentation",
+ "href": "https://developer.mozilla.org/en/JavaScript_typed_arrays/DataView"
+ }],
+ "polyfills": ["jdataview"]
+ }
+ !*/
+ /* DOC
+ Detects support for the DataView interface for reading data from an ArrayBuffer as part of the Typed Array spec.
+ */
+
+ Modernizr.addTest('dataview', (typeof DataView !== 'undefined' && 'getFloat64' in DataView.prototype));
+
+ /*!
+ {
+ "name": "Event Listener",
+ "property": "eventlistener",
+ "authors": ["Andrew Betts (@triblondon)"],
+ "notes": [{
+ "name": "W3C Spec",
+ "href": "http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Registration-interfaces"
+ }],
+ "polyfills": ["eventlistener"]
+ }
+ !*/
+ /* DOC
+ Detects native support for addEventListener
+ */
+
+ Modernizr.addTest('eventlistener', 'addEventListener' in window);
+
+ /*!
+ {
+ "name": "Geolocation API",
+ "property": "geolocation",
+ "caniuse": "geolocation",
+ "tags": ["media"],
+ "notes": [{
+ "name": "MDN documentation",
+ "href": "https://developer.mozilla.org/en-US/docs/WebAPI/Using_geolocation"
+ }],
+ "polyfills": [
+ "joshuabell-polyfill",
+ "webshims",
+ "geo-location-javascript",
+ "geolocation-api-polyfill"
+ ]
+ }
+ !*/
+ /* DOC
+ Detects support for the Geolocation API for users to provide their location to web applications.
+ */
+
+ // geolocation is often considered a trivial feature detect...
+ // Turns out, it's quite tricky to get right:
+ //
+ // Using !!navigator.geolocation does two things we don't want. It:
+ // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513
+ // 2. Disables page caching in WebKit: webk.it/43956
+ //
+ // Meanwhile, in Firefox < 8, an about:config setting could expose
+ // a false positive that would throw an exception: bugzil.la/688158
+
+ Modernizr.addTest('geolocation', 'geolocation' in navigator);
+
+ /*!
+ {
+ "name": "History API",
+ "property": "history",
+ "caniuse": "history",
+ "tags": ["history"],
+ "authors": ["Hay Kranen", "Alexander Farkas"],
+ "notes": [{
+ "name": "W3C Spec",
+ "href": "http://www.w3.org/TR/html51/browsers.html#the-history-interface"
+ }, {
+ "name": "MDN documentation",
+ "href": "https://developer.mozilla.org/en-US/docs/Web/API/window.history"
+ }],
+ "polyfills": ["historyjs", "html5historyapi"]
+ }
+ !*/
+ /* DOC
+ Detects support for the History API for manipulating the browser session history.
+ */
+
+ Modernizr.addTest('history', function() {
+ // Issue #733
+ // The stock browser on Android 2.2 & 2.3, and 4.0.x returns positive on history support
+ // Unfortunately support is really buggy and there is no clean way to detect
+ // these bugs, so we fall back to a user agent sniff :(
+ var ua = navigator.userAgent;
+
+ // We only want Android 2 and 4.0, stock browser, and not Chrome which identifies
+ // itself as 'Mobile Safari' as well, nor Windows Phone (issue #1471).
+ if ((ua.indexOf('Android 2.') !== -1 ||
+ (ua.indexOf('Android 4.0') !== -1)) &&
+ ua.indexOf('Mobile Safari') !== -1 &&
+ ua.indexOf('Chrome') === -1 &&
+ ua.indexOf('Windows Phone') === -1) {
+ return false;
+ }
+
+ // Return the regular check
+ return (window.history && 'pushState' in window.history);
+ });
+
+ /*!
+ {
+ "name": "IE8 compat mode",
+ "property": "ie8compat",
+ "authors": ["Erich Ocean"]
+ }
+ !*/
+ /* DOC
+ Detects whether or not the current browser is IE8 in compatibility mode (i.e. acting as IE7).
+ */
+
+ // In this case, IE8 will be acting as IE7. You may choose to remove features in this case.
+
+ // related:
+ // james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments/
+
+ Modernizr.addTest('ie8compat', (!window.addEventListener && !!document.documentMode && document.documentMode === 7));
+
+ /*!
+ {
+ "name": "JSON",
+ "property": "json",
+ "caniuse": "json",
+ "notes": [{
+ "name": "MDN documentation",
+ "href": "http://developer.mozilla.org/en/JSON"
+ }],
+ "polyfills": ["json2"]
+ }
+ !*/
+ /* DOC
+ Detects native support for JSON handling functions.
+ */
+
+ // this will also succeed if you've loaded the JSON2.js polyfill ahead of time
+ // ... but that should be obvious. :)
+
+ Modernizr.addTest('json', 'JSON' in window && 'parse' in JSON && 'stringify' in JSON);
+
+ /*!
+ {
+ "name": "Notification",
+ "property": "notification",
+ "caniuse": "notifications",
+ "authors": ["Theodoor van Donge", "Hendrik Beskow"],
+ "notes": [{
+ "name": "HTML5 Rocks tutorial",
+ "href": "http://www.html5rocks.com/en/tutorials/notifications/quick/"
+ },{
+ "name": "W3C spec",
+ "href": "www.w3.org/TR/notifications/"
+ }, {
+ "name": "Changes in Chrome to Notifications API due to Service Worker Push Notifications",
+ "href": "https://developers.google.com/web/updates/2015/05/Notifying-you-of-notificiation-changes"
+ }],
+ "knownBugs": [
+ "Possibility of false-positive on Chrome for Android if permissions we're granted for a website prior to Chrome 44."
+ ],
+ "polyfills": ["desktop-notify", "html5-notifications"]
+ }
+ !*/
+ /* DOC
+ Detects support for the Notifications API
+ */
+
+ Modernizr.addTest('notification', function() {
+ if (!window.Notification || !window.Notification.requestPermission) {
+ return false;
+ }
+ // if permission is already granted, assume support
+ if (window.Notification.permission === 'granted') {
+ return true;
+ }
+
+ try {
+ new window.Notification('');
+ } catch (e) {
+ if (e.name === 'TypeError') {
+ return false;
+ }
+ }
+
+ return true;
+ });
+
+ /*!
+ {
+ "name": "postMessage",
+ "property": "postmessage",
+ "caniuse": "x-doc-messaging",
+ "notes": [{
+ "name": "W3C Spec",
+ "href": "http://www.w3.org/TR/html5/comms.html#posting-messages"
+ }],
+ "polyfills": ["easyxdm", "postmessage-jquery"]
+ }
+ !*/
+ /* DOC
+ Detects support for the `window.postMessage` protocol for cross-document messaging.
+ */
+
+ Modernizr.addTest('postmessage', 'postMessage' in window);
+
+ /*!
+ {
+ "name": "QuerySelector",
+ "property": "queryselector",
+ "caniuse": "queryselector",
+ "tags": ["queryselector"],
+ "authors": ["Andrew Betts (@triblondon)"],
+ "notes": [{
+ "name" : "W3C Selectors reference",
+ "href": "http://www.w3.org/TR/selectors-api/#queryselectorall"
+ }],
+ "polyfills": ["css-selector-engine"]
+ }
+ !*/
+ /* DOC
+ Detects support for querySelector.
+ */
+
+ Modernizr.addTest('queryselector', 'querySelector' in document && 'querySelectorAll' in document);
+
+ /*!
+ {
+ "name": "ServiceWorker API",
+ "property": "serviceworker",
+ "notes": [{
+ "name": "ServiceWorkers Explained",
+ "href": "https://github.com/slightlyoff/ServiceWorker/blob/master/explainer.md"
+ }]
+ }
+ !*/
+ /* DOC
+ ServiceWorkers (formerly Navigation Controllers) are a way to persistently cache resources to built apps that work better offline.
+ */
+
+ Modernizr.addTest('serviceworker', 'serviceWorker' in navigator);
+
+ /*!
+ {
+ "name": "SVG",
+ "property": "svg",
+ "caniuse": "svg",
+ "tags": ["svg"],
+ "authors": ["Erik Dahlstrom"],
+ "polyfills": [
+ "svgweb",
+ "raphael",
+ "amplesdk",
+ "canvg",
+ "svg-boilerplate",
+ "sie",
+ "dojogfx",
+ "fabricjs"
+ ]
+ }
+ !*/
+ /* DOC
+ Detects support for SVG in `