diff options
Diffstat (limited to 'js/vendor/fizzy-ui-utils')
-rw-r--r-- | js/vendor/fizzy-ui-utils/.bower.json | 43 | ||||
-rw-r--r-- | js/vendor/fizzy-ui-utils/README.md | 64 | ||||
-rw-r--r-- | js/vendor/fizzy-ui-utils/bower.json | 33 | ||||
-rw-r--r-- | js/vendor/fizzy-ui-utils/utils.js | 236 |
4 files changed, 376 insertions, 0 deletions
diff --git a/js/vendor/fizzy-ui-utils/.bower.json b/js/vendor/fizzy-ui-utils/.bower.json new file mode 100644 index 000000000..de72a0780 --- /dev/null +++ b/js/vendor/fizzy-ui-utils/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "fizzy-ui-utils", + "version": "2.0.0", + "authors": [ + "David DeSandro" + ], + "description": "UI utilities", + "main": "utils.js", + "dependencies": { + "matches-selector": "~2.0.0" + }, + "moduleType": [ + "amd", + "globals", + "node" + ], + "keywords": [ + "utility", + "ui" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "package.json" + ], + "devDependencies": { + "qunit": "~1.20.0" + }, + "homepage": "https://github.com/metafizzy/fizzy-ui-utils", + "_release": "2.0.0", + "_resolution": { + "type": "version", + "tag": "v2.0.0", + "commit": "8d35dbc42874d439d0854337e79d2c25232e3a56" + }, + "_source": "git://github.com/metafizzy/fizzy-ui-utils.git", + "_target": "~2.0.0", + "_originalSource": "fizzy-ui-utils" +}
\ No newline at end of file diff --git a/js/vendor/fizzy-ui-utils/README.md b/js/vendor/fizzy-ui-utils/README.md new file mode 100644 index 000000000..ae461c4c5 --- /dev/null +++ b/js/vendor/fizzy-ui-utils/README.md @@ -0,0 +1,64 @@ +# Fizzy UI utils + +UI utility & helper functions + +Used in [Flickity](http://flickity.metafizzy.co), [Isotope](http://isotope.metafizzy.co), [Masonry](http://masonry.desandro.com), [Draggabilly](http://draggabilly.desandro.com) + +## Install + +Bower: `bower install fizzy-ui-utils --save` + +npm: `npm install fizzy-ui-utils --save` + +## API + +``` js +// fizzyUIUtils is the browser global +var utils = fizzyUIUtils; + +// ---- ---- // + +utils.extend( a, b ) +// extend object + +utils.modulo( num, div ) +// num [modulo] div + +utils.makeArray( obj ) +// make array from object + +utils.removeFrom( ary, obj ) +// remove object from array + +utils.getParent( elem, selector ) +// get parent element of an element, given a selector string + +utils.getQueryElement( elem ) +// if elem is a string, use it as a selector and return element + +Class.prototype.handleEvent = utils.handleEvent; +// enable Class.onclick when element.addEventListener( 'click', this, false ) + +utils.filterFindElements( elems, selector ) +// iterate through elems, filter and find all elements that match selector + +utils.debounceMethod( Class, methodName, threhold ) +// debounce a class method + +utils.docReady( callback ) +// trigger callback on document ready + +utils.toDashed( str ) +// 'camelCaseString' -> 'camel-case-string' + +utils.htmlInit( Class, namespace ) +// on document ready, initialize Class on every element +// that matches js-namespace +// pass in JSON options from element's data-options-namespace attribute +``` + +--- + +[MIT license](http://desandro.mit-license.org/). Have at it. + +By [Metafizzy](http://metafizzy.co) diff --git a/js/vendor/fizzy-ui-utils/bower.json b/js/vendor/fizzy-ui-utils/bower.json new file mode 100644 index 000000000..ec254413d --- /dev/null +++ b/js/vendor/fizzy-ui-utils/bower.json @@ -0,0 +1,33 @@ +{ + "name": "fizzy-ui-utils", + "version": "2.0.0", + "authors": [ + "David DeSandro" + ], + "description": "UI utilities", + "main": "utils.js", + "dependencies": { + "matches-selector": "~2.0.0" + }, + "moduleType": [ + "amd", + "globals", + "node" + ], + "keywords": [ + "utility", + "ui" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "package.json" + ], + "devDependencies": { + "qunit": "~1.20.0" + } +} diff --git a/js/vendor/fizzy-ui-utils/utils.js b/js/vendor/fizzy-ui-utils/utils.js new file mode 100644 index 000000000..f4bed3670 --- /dev/null +++ b/js/vendor/fizzy-ui-utils/utils.js @@ -0,0 +1,236 @@ +/** + * Fizzy UI utils v2.0.0 + * MIT license + */ + +/*jshint browser: true, undef: true, unused: true, strict: true */ + +( function( window, factory ) { + /*global define: false, module: false, require: false */ + 'use strict'; + // universal module definition + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( [ + 'matches-selector/matches-selector' + ], function( matchesSelector ) { + return factory( window, matchesSelector ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('desandro-matches-selector') + ); + } else { + // browser global + window.fizzyUIUtils = factory( + window, + window.matchesSelector + ); + } + +}( window, function factory( window, matchesSelector ) { + +'use strict'; + +var utils = {}; + +// ----- extend ----- // + +// extends objects +utils.extend = function( a, b ) { + for ( var prop in b ) { + a[ prop ] = b[ prop ]; + } + return a; +}; + +// ----- modulo ----- // + +utils.modulo = function( num, div ) { + return ( ( num % div ) + div ) % div; +}; + +// ----- makeArray ----- // + +// turn element or nodeList into an array +utils.makeArray = function( obj ) { + var ary = []; + if ( Array.isArray( obj ) ) { + // use object if already an array + ary = obj; + } else if ( obj && typeof obj.length == 'number' ) { + // convert nodeList to array + for ( var i=0; i < obj.length; i++ ) { + ary.push( obj[i] ); + } + } else { + // array of single index + ary.push( obj ); + } + return ary; +}; + +// ----- removeFrom ----- // + +utils.removeFrom = function( ary, obj ) { + var index = ary.indexOf( obj ); + if ( index != -1 ) { + ary.splice( index, 1 ); + } +}; + +// ----- getParent ----- // + +utils.getParent = function( elem, selector ) { + while ( elem != document.body ) { + elem = elem.parentNode; + if ( matchesSelector( elem, selector ) ) { + return elem; + } + } +}; + +// ----- getQueryElement ----- // + +// use element as selector string +utils.getQueryElement = function( elem ) { + if ( typeof elem == 'string' ) { + return document.querySelector( elem ); + } + return elem; +}; + +// ----- handleEvent ----- // + +// enable .ontype to trigger from .addEventListener( elem, 'type' ) +utils.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +// ----- filterFindElements ----- // + +utils.filterFindElements = function( elems, selector ) { + // make array of elems + elems = utils.makeArray( elems ); + var ffElems = []; + + elems.forEach( function( elem ) { + // check that elem is an actual element + if ( !( elem instanceof HTMLElement ) ) { + return; + } + // add elem if no selector + if ( !selector ) { + ffElems.push( elem ); + return; + } + // filter & find items if we have a selector + // filter + if ( matchesSelector( elem, selector ) ) { + ffElems.push( elem ); + } + // find children + var childElems = elem.querySelectorAll( selector ); + // concat childElems to filterFound array + for ( var i=0; i < childElems.length; i++ ) { + ffElems.push( childElems[i] ); + } + }); + + return ffElems; +}; + +// ----- debounceMethod ----- // + +utils.debounceMethod = function( _class, methodName, threshold ) { + // original method + var method = _class.prototype[ methodName ]; + var timeoutName = methodName + 'Timeout'; + + _class.prototype[ methodName ] = function() { + var timeout = this[ timeoutName ]; + if ( timeout ) { + clearTimeout( timeout ); + } + var args = arguments; + + var _this = this; + this[ timeoutName ] = setTimeout( function() { + method.apply( _this, args ); + delete _this[ timeoutName ]; + }, threshold || 100 ); + }; +}; + +// ----- docReady ----- // + +utils.docReady = function( callback ) { + if ( document.readyState == 'complete' ) { + callback(); + } else { + document.addEventListener( 'DOMContentLoaded', callback ); + } +}; + +// ----- htmlInit ----- // + +// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ +utils.toDashed = function( str ) { + return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) { + return $1 + '-' + $2; + }).toLowerCase(); +}; + +var console = window.console; +/** + * allow user to initialize classes via [data-namespace] or .js-namespace class + * htmlInit( Widget, 'widgetName' ) + * options are parsed from data-namespace-options + */ +utils.htmlInit = function( WidgetClass, namespace ) { + utils.docReady( function() { + var dashedNamespace = utils.toDashed( namespace ); + var dataAttr = 'data-' + dashedNamespace; + var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' ); + var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace ); + var elems = utils.makeArray( dataAttrElems ) + .concat( utils.makeArray( jsDashElems ) ); + var dataOptionsAttr = dataAttr + '-options'; + var jQuery = window.jQuery; + + elems.forEach( function( elem ) { + var attr = elem.getAttribute( dataAttr ) || + elem.getAttribute( dataOptionsAttr ); + var options; + try { + options = attr && JSON.parse( attr ); + } catch ( error ) { + // log error, do not initialize + if ( console ) { + console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className + + ': ' + error ); + } + return; + } + // initialize + var instance = new WidgetClass( elem, options ); + // make available via $().data('layoutname') + if ( jQuery ) { + jQuery.data( elem, namespace, instance ); + } + }); + + }); +}; + +// ----- ----- // + +return utils; + +})); |