aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Zotlabs/Module/Pconfig.php5
-rw-r--r--Zotlabs/Update/_1228.php4
-rw-r--r--composer.json3
-rw-r--r--composer.lock41
-rw-r--r--library/imagesloaded/imagesloaded.pkgd.min.js7
-rw-r--r--vendor/composer/installed.json41
-rw-r--r--vendor/desandro/imagesloaded/.gitignore5
-rw-r--r--vendor/desandro/imagesloaded/.jshintrc12
-rw-r--r--vendor/desandro/imagesloaded/README.md362
-rw-r--r--vendor/desandro/imagesloaded/bower.json37
-rw-r--r--vendor/desandro/imagesloaded/composer.json15
-rw-r--r--vendor/desandro/imagesloaded/contributing.md20
-rw-r--r--vendor/desandro/imagesloaded/gulpfile.js128
-rw-r--r--vendor/desandro/imagesloaded/imagesloaded.js377
-rw-r--r--vendor/desandro/imagesloaded/imagesloaded.pkgd.js (renamed from library/imagesloaded/imagesloaded.pkgd.js)72
-rw-r--r--vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js7
-rw-r--r--vendor/desandro/imagesloaded/package.json48
-rw-r--r--vendor/desandro/imagesloaded/sandbox/background/css/background.css29
-rw-r--r--vendor/desandro/imagesloaded/sandbox/background/index.html51
-rw-r--r--vendor/desandro/imagesloaded/sandbox/progress/index.html89
-rw-r--r--vendor/desandro/imagesloaded/sandbox/progress/progress.js111
-rw-r--r--vendor/desandro/imagesloaded/test/css/tests.css41
-rw-r--r--vendor/desandro/imagesloaded/test/img/blue-shell.jpgbin0 -> 24555 bytes
-rw-r--r--vendor/desandro/imagesloaded/test/img/bowser-jr.jpgbin0 -> 36987 bytes
-rw-r--r--vendor/desandro/imagesloaded/test/img/thunder-cloud.jpgbin0 -> 24588 bytes
-rw-r--r--vendor/desandro/imagesloaded/test/index.html104
-rw-r--r--vendor/desandro/imagesloaded/test/unit/append.js30
-rw-r--r--vendor/desandro/imagesloaded/test/unit/background.js70
-rw-r--r--vendor/desandro/imagesloaded/test/unit/basics.js28
-rw-r--r--vendor/desandro/imagesloaded/test/unit/data-uri.js10
-rw-r--r--vendor/desandro/imagesloaded/test/unit/jquery-fail.js29
-rw-r--r--vendor/desandro/imagesloaded/test/unit/jquery-success.js28
-rw-r--r--vendor/desandro/imagesloaded/test/unit/local-files.js31
-rw-r--r--vendor/desandro/imagesloaded/test/unit/no-images.js11
-rw-r--r--vendor/desandro/imagesloaded/test/unit/non-element.js24
-rw-r--r--vendor/desandro/imagesloaded/test/unit/selector-string.js12
-rw-r--r--vendor/desandro/imagesloaded/test/unit/single-element.js11
-rw-r--r--view/es-es/hmessages.po26
-rw-r--r--view/es-es/hstrings.php28
-rw-r--r--view/php/theme_init.php2
40 files changed, 1879 insertions, 70 deletions
diff --git a/Zotlabs/Module/Pconfig.php b/Zotlabs/Module/Pconfig.php
index 44fe5d9a9..f31d5fdf6 100644
--- a/Zotlabs/Module/Pconfig.php
+++ b/Zotlabs/Module/Pconfig.php
@@ -22,6 +22,11 @@ class Pconfig extends \Zotlabs\Web\Controller {
$k = trim(escape_tags($_POST['k']));
$v = trim($_POST['v']);
$aj = intval($_POST['aj']);
+
+ // Do not store "serialized" data received in the $_POST
+ if (preg_match('|^a:[0-9]+:{.*}$|s',$v) || preg_match('O:8:"stdClass":[0-9]+:{.*}$|s',$v)) {
+ return;
+ }
if(in_array(argv(2),$this->disallowed_pconfig())) {
notice( t('This setting requires special processing and editing has been blocked.') . EOL);
diff --git a/Zotlabs/Update/_1228.php b/Zotlabs/Update/_1228.php
index f8a506bb4..9e6bf8047 100644
--- a/Zotlabs/Update/_1228.php
+++ b/Zotlabs/Update/_1228.php
@@ -11,8 +11,8 @@ class _1228 {
if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
$r1 = q("ALTER TABLE item ADD uuid text NOT NULL DEFAULT '' ");
- $r2 = q("create index \"uuid_idx\" on channel (\"uuid\")");
- $r3 = q("ALTER TABLE item add summary TEXT NOT NULL");
+ $r2 = q("create index \"uuid_idx\" on item (\"uuid\")");
+ $r3 = q("ALTER TABLE item add summary TEXT NOT NULL DEFAULT ''");
$r = ($r1 && $r2 && $r3);
}
diff --git a/composer.json b/composer.json
index f117cc3b1..e6cefa241 100644
--- a/composer.json
+++ b/composer.json
@@ -40,7 +40,8 @@
"smarty/smarty": "~3.1",
"ramsey/uuid": "^3.8",
"twbs/bootstrap": "4.1.3",
- "blueimp/jquery-file-upload": "^9.25"
+ "blueimp/jquery-file-upload": "^9.25",
+ "desandro/imagesloaded": "^4.1"
},
"require-dev" : {
"phpunit/phpunit" : "@stable",
diff --git a/composer.lock b/composer.lock
index 158674a42..bd95e8c78 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "63d0e52cc07f8113059ec30d3637b850",
+ "content-hash": "fe5e71d7076eeddf1c174be4a5c052dd",
"packages": [
{
"name": "blueimp/jquery-file-upload",
@@ -164,6 +164,45 @@
"time": "2017-12-29T00:13:05+00:00"
},
{
+ "name": "desandro/imagesloaded",
+ "version": "v4.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/desandro/imagesloaded.git",
+ "reference": "67c4e57453120935180c45c6820e7d3fbd2ea1f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/desandro/imagesloaded/zipball/67c4e57453120935180c45c6820e7d3fbd2ea1f9",
+ "reference": "67c4e57453120935180c45c6820e7d3fbd2ea1f9",
+ "shasum": ""
+ },
+ "type": "component",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "David DeSandro",
+ "homepage": "http://desandro.com/",
+ "role": "developer"
+ }
+ ],
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "homepage": "http://imagesloaded.desandro.com",
+ "keywords": [
+ "dom",
+ "images",
+ "javascript",
+ "jquery-plugin",
+ "library",
+ "loaded",
+ "ui"
+ ],
+ "time": "2018-01-02T16:53:35+00:00"
+ },
+ {
"name": "ezyang/htmlpurifier",
"version": "v4.10.0",
"source": {
diff --git a/library/imagesloaded/imagesloaded.pkgd.min.js b/library/imagesloaded/imagesloaded.pkgd.min.js
deleted file mode 100644
index c3e71fadc..000000000
--- a/library/imagesloaded/imagesloaded.pkgd.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * imagesLoaded PACKAGED v4.1.0
- * JavaScript is all like "You images are done yet or what?"
- * MIT License
- */
-
-!function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}(this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},n=i[t]=i[t]||[];return-1==n.indexOf(e)&&n.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{},n=i[t]=i[t]||[];return n[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var n=i.indexOf(e);return-1!=n&&i.splice(n,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var n=0,o=i[n];e=e||[];for(var r=this._onceEvents&&this._onceEvents[t];o;){var s=r&&r[o];s&&(this.off(t,o),delete r[o]),o.apply(this,e),n+=s?0:1,o=i[n]}return this}},t}),function(t,e){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}(window,function(t,e){function i(t,e){for(var i in e)t[i]=e[i];return t}function n(t){var e=[];if(Array.isArray(t))e=t;else if("number"==typeof t.length)for(var i=0;i<t.length;i++)e.push(t[i]);else e.push(t);return e}function o(t,e,r){return this instanceof o?("string"==typeof t&&(t=document.querySelectorAll(t)),this.elements=n(t),this.options=i({},this.options),"function"==typeof e?r=e:i(this.options,e),r&&this.on("always",r),this.getImages(),h&&(this.jqDeferred=new h.Deferred),void setTimeout(function(){this.check()}.bind(this))):new o(t,e,r)}function r(t){this.img=t}function s(t,e){this.url=t,this.element=e,this.img=new Image}var h=t.jQuery,a=t.console;o.prototype=Object.create(e.prototype),o.prototype.options={},o.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},o.prototype.addElementImages=function(t){"IMG"==t.nodeName&&this.addImage(t),this.options.background===!0&&this.addElementBackgroundImages(t);var e=t.nodeType;if(e&&d[e]){for(var i=t.querySelectorAll("img"),n=0;n<i.length;n++){var o=i[n];this.addImage(o)}if("string"==typeof this.options.background){var r=t.querySelectorAll(this.options.background);for(n=0;n<r.length;n++){var s=r[n];this.addElementBackgroundImages(s)}}}};var d={1:!0,9:!0,11:!0};return o.prototype.addElementBackgroundImages=function(t){var e=getComputedStyle(t);if(e)for(var i=/url\((['"])?(.*?)\1\)/gi,n=i.exec(e.backgroundImage);null!==n;){var o=n&&n[2];o&&this.addBackground(o,t),n=i.exec(e.backgroundImage)}},o.prototype.addImage=function(t){var e=new r(t);this.images.push(e)},o.prototype.addBackground=function(t,e){var i=new s(t,e);this.images.push(i)},o.prototype.check=function(){function t(t,i,n){setTimeout(function(){e.progress(t,i,n)})}var e=this;return this.progressedCount=0,this.hasAnyBroken=!1,this.images.length?void this.images.forEach(function(e){e.once("progress",t),e.check()}):void this.complete()},o.prototype.progress=function(t,e,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!t.isLoaded,this.emitEvent("progress",[this,t,e]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,t),this.progressedCount==this.images.length&&this.complete(),this.options.debug&&a&&a.log("progress: "+i,t,e)},o.prototype.complete=function(){var t=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(t,[this]),this.emitEvent("always",[this]),this.jqDeferred){var e=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[e](this)}},r.prototype=Object.create(e.prototype),r.prototype.check=function(){var t=this.getIsImageComplete();return t?void this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),void(this.proxyImage.src=this.img.src))},r.prototype.getIsImageComplete=function(){return this.img.complete&&void 0!==this.img.naturalWidth},r.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.img,e])},r.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},r.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},r.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},r.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},s.prototype=Object.create(r.prototype),s.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url;var t=this.getIsImageComplete();t&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},s.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},s.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.element,e])},o.makeJQueryPlugin=function(e){e=e||t.jQuery,e&&(h=e,h.fn.imagesLoaded=function(t,e){var i=new o(this,t,e);return i.jqDeferred.promise(h(this))})},o.makeJQueryPlugin(),o}); \ No newline at end of file
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 30fe9b020..d2f86ea99 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -163,6 +163,47 @@
"description": "Internationalization library powered by CLDR data."
},
{
+ "name": "desandro/imagesloaded",
+ "version": "v4.1.4",
+ "version_normalized": "4.1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/desandro/imagesloaded.git",
+ "reference": "67c4e57453120935180c45c6820e7d3fbd2ea1f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/desandro/imagesloaded/zipball/67c4e57453120935180c45c6820e7d3fbd2ea1f9",
+ "reference": "67c4e57453120935180c45c6820e7d3fbd2ea1f9",
+ "shasum": ""
+ },
+ "time": "2018-01-02T16:53:35+00:00",
+ "type": "component",
+ "installation-source": "dist",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "David DeSandro",
+ "homepage": "http://desandro.com/",
+ "role": "developer"
+ }
+ ],
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "homepage": "http://imagesloaded.desandro.com",
+ "keywords": [
+ "dom",
+ "images",
+ "javascript",
+ "jquery-plugin",
+ "library",
+ "loaded",
+ "ui"
+ ]
+ },
+ {
"name": "ezyang/htmlpurifier",
"version": "v4.10.0",
"version_normalized": "4.10.0.0",
diff --git a/vendor/desandro/imagesloaded/.gitignore b/vendor/desandro/imagesloaded/.gitignore
new file mode 100644
index 000000000..2486eb53d
--- /dev/null
+++ b/vendor/desandro/imagesloaded/.gitignore
@@ -0,0 +1,5 @@
+bower_components/
+node_modules/
+_site/
+build/
+package-lock.json
diff --git a/vendor/desandro/imagesloaded/.jshintrc b/vendor/desandro/imagesloaded/.jshintrc
new file mode 100644
index 000000000..78aa4af7b
--- /dev/null
+++ b/vendor/desandro/imagesloaded/.jshintrc
@@ -0,0 +1,12 @@
+{
+ "browser": true,
+ "curly": true,
+ "newcap": false,
+ "strict": true,
+ "undef": true,
+ "unused": true,
+ "globals": {
+ "imagesLoaded": false,
+ "QUnit": false
+ }
+}
diff --git a/vendor/desandro/imagesloaded/README.md b/vendor/desandro/imagesloaded/README.md
new file mode 100644
index 000000000..67b799dfd
--- /dev/null
+++ b/vendor/desandro/imagesloaded/README.md
@@ -0,0 +1,362 @@
+# imagesLoaded
+
+<p class="tagline">JavaScript is all like "You images done yet or what?"</p>
+
+[imagesloaded.desandro.com](http://imagesloaded.desandro.com)
+
+Detect when images have been loaded.
+
+## Install
+
+### Download
+
++ [imagesloaded.pkgd.min.js](https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js) minified
++ [imagesloaded.pkgd.js](https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.js) un-minified
+
+### CDN
+
+``` html
+<script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
+<!-- or -->
+<script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.js"></script>
+```
+
+### Package managers
+
+Install via [npm](https://www.npmjs.com/package/imagesloaded): `npm install imagesloaded`
+
+Install via [Bower](http://bower.io): `bower install imagesloaded --save`
+
+## jQuery
+
+You can use imagesLoaded as a jQuery Plugin.
+
+``` js
+$('#container').imagesLoaded( function() {
+ // images have loaded
+});
+
+// options
+$('#container').imagesLoaded( {
+ // options...
+ },
+ function() {
+ // images have loaded
+ }
+);
+```
+
+`.imagesLoaded()` returns a [jQuery Deferred object](http://api.jquery.com/category/deferred-object/). This allows you to use `.always()`, `.done()`, `.fail()` and `.progress()`.
+
+``` js
+$('#container').imagesLoaded()
+ .always( function( instance ) {
+ console.log('all images loaded');
+ })
+ .done( function( instance ) {
+ console.log('all images successfully loaded');
+ })
+ .fail( function() {
+ console.log('all images loaded, at least one is broken');
+ })
+ .progress( function( instance, image ) {
+ var result = image.isLoaded ? 'loaded' : 'broken';
+ console.log( 'image is ' + result + ' for ' + image.img.src );
+ });
+```
+
+## Vanilla JavaScript
+
+You can use imagesLoaded with vanilla JS.
+
+``` js
+imagesLoaded( elem, callback )
+// options
+imagesLoaded( elem, options, callback )
+// you can use `new` if you like
+new imagesLoaded( elem, callback )
+```
+
++ `elem` _Element, NodeList, Array, or Selector String_
++ `options` _Object_
++ `callback` _Function_ - function triggered after all images have been loaded
+
+Using a callback function is the same as binding it to the `always` event (see below).
+
+``` js
+// element
+imagesLoaded( document.querySelector('#container'), function( instance ) {
+ console.log('all images are loaded');
+});
+// selector string
+imagesLoaded( '#container', function() {...});
+// multiple elements
+var posts = document.querySelectorAll('.post');
+imagesLoaded( posts, function() {...});
+```
+
+Bind events with vanilla JS with .on(), .off(), and .once() methods.
+
+``` js
+var imgLoad = imagesLoaded( elem );
+function onAlways( instance ) {
+ console.log('all images are loaded');
+}
+// bind with .on()
+imgLoad.on( 'always', onAlways );
+// unbind with .off()
+imgLoad.off( 'always', onAlways );
+```
+
+## Background
+
+Detect when background images have loaded, in addition to `<img>`s.
+
+Set `{ background: true }` to detect when the element's background image has loaded.
+
+``` js
+// jQuery
+$('#container').imagesLoaded( { background: true }, function() {
+ console.log('#container background image loaded');
+});
+
+// vanilla JS
+imagesLoaded( '#container', { background: true }, function() {
+ console.log('#container background image loaded');
+});
+```
+
+[See jQuery demo](http://codepen.io/desandro/pen/pjVMPB) or [vanilla JS demo](http://codepen.io/desandro/pen/avKooW) on CodePen.
+
+Set to a selector string like `{ background: '.item' }` to detect when the background images of child elements have loaded.
+
+``` js
+// jQuery
+$('#container').imagesLoaded( { background: '.item' }, function() {
+ console.log('all .item background images loaded');
+});
+
+// vanilla JS
+imagesLoaded( '#container', { background: '.item' }, function() {
+ console.log('all .item background images loaded');
+});
+```
+
+[See jQuery demo](http://codepen.io/desandro/pen/avKoZL) or [vanilla JS demo](http://codepen.io/desandro/pen/vNrBGz) on CodePen.
+
+## Events
+
+### always
+
+``` js
+// jQuery
+$('#container').imagesLoaded().always( function( instance ) {
+ console.log('ALWAYS - all images have been loaded');
+});
+
+// vanilla JS
+imgLoad.on( 'always', function( instance ) {
+ console.log('ALWAYS - all images have been loaded');
+});
+```
+
+Triggered after all images have been either loaded or confirmed broken.
+
++ `instance` _imagesLoaded_ - the imagesLoaded instance
+
+### done
+
+``` js
+// jQuery
+$('#container').imagesLoaded().done( function( instance ) {
+ console.log('DONE - all images have been successfully loaded');
+});
+
+// vanilla JS
+imgLoad.on( 'done', function( instance ) {
+ console.log('DONE - all images have been successfully loaded');
+});
+```
+
+Triggered after all images have successfully loaded without any broken images.
+
+### fail
+
+``` js
+$('#container').imagesLoaded().fail( function( instance ) {
+ console.log('FAIL - all images loaded, at least one is broken');
+});
+
+// vanilla JS
+imgLoad.on( 'fail', function( instance ) {
+ console.log('FAIL - all images loaded, at least one is broken');
+});
+```
+
+Triggered after all images have been loaded with at least one broken image.
+
+### progress
+
+``` js
+imgLoad.on( 'progress', function( instance, image ) {
+ var result = image.isLoaded ? 'loaded' : 'broken';
+ console.log( 'image is ' + result + ' for ' + image.img.src );
+});
+```
+
+Triggered after each image has been loaded.
+
++ `instance` _imagesLoaded_ - the imagesLoaded instance
++ `image` _LoadingImage_ - the LoadingImage instance of the loaded image
+
+<!-- sponsored -->
+
+## Properties
+
+### LoadingImage.img
+
+_Image_ - The `img` element
+
+### LoadingImage.isLoaded
+
+_Boolean_ - `true` when the image has successfully loaded
+
+### imagesLoaded.images
+
+Array of _LoadingImage_ instances for each image detected
+
+``` js
+var imgLoad = imagesLoaded('#container');
+imgLoad.on( 'always', function() {
+ console.log( imgLoad.images.length + ' images loaded' );
+ // detect which image is broken
+ for ( var i = 0, len = imgLoad.images.length; i < len; i++ ) {
+ var image = imgLoad.images[i];
+ var result = image.isLoaded ? 'loaded' : 'broken';
+ console.log( 'image is ' + result + ' for ' + image.img.src );
+ }
+});
+```
+
+## Browserify
+
+imagesLoaded works with [Browserify](http://browserify.org/).
+
+``` bash
+npm install imagesloaded --save
+```
+
+``` js
+var imagesLoaded = require('imagesloaded');
+
+imagesLoaded( elem, function() {...} );
+```
+
+Use `.makeJQueryPlugin` to make to use `.imagesLoaded()` jQuery plugin.
+
+``` js
+var $ = require('jquery');
+var imagesLoaded = require('imagesloaded');
+
+// provide jQuery argument
+imagesLoaded.makeJQueryPlugin( $ );
+// now use .imagesLoaded() jQuery plugin
+$('#container').imagesLoaded( function() {...});
+```
+
+## Webpack
+
+Install imagesLoaded with npm.
+
+``` bash
+npm install imagesloaded
+```
+
+You can then `require('imagesloaded')`.
+
+``` js
+// main.js
+var imagesLoaded = require('imagesloaded');
+
+imagesLoaded( '#container', function() {
+ // images have loaded
+});
+```
+
+Use `.makeJQueryPlugin` to make `.imagesLoaded()` jQuery plugin.
+
+``` js
+// main.js
+var imagesLoaded = require('imagesloaded');
+var $ = require('jquery');
+
+// provide jQuery argument
+imagesLoaded.makeJQueryPlugin( $ );
+// now use .imagesLoaded() jQuery plugin
+$('#container').imagesLoaded( function() {...});
+```
+
+Run webpack.
+
+``` bash
+webpack main.js bundle.js
+```
+
+## RequireJS
+
+imagesLoaded works with [RequireJS](http://requirejs.org).
+
+You can require [imagesloaded.pkgd.js](http://imagesloaded.desandro.com/imagesloaded.pkgd.js).
+
+``` js
+requirejs( [
+ 'path/to/imagesloaded.pkgd.js',
+], function( imagesLoaded ) {
+ imagesLoaded( '#container', function() { ... });
+});
+```
+
+Use `.makeJQueryPlugin` to make `.imagesLoaded()` jQuery plugin.
+
+``` js
+requirejs( [
+ 'jquery',
+ 'path/to/imagesloaded.pkgd.js',
+], function( $, imagesLoaded ) {
+ // provide jQuery argument
+ imagesLoaded.makeJQueryPlugin( $ );
+ // now use .imagesLoaded() jQuery plugin
+ $('#container').imagesLoaded( function() {...});
+});
+```
+
+You can manage dependencies with [Bower](http://bower.io). Set `baseUrl` to `bower_components` and set a path config for all your application code.
+
+``` js
+requirejs.config({
+ baseUrl: 'bower_components/',
+ paths: { // path to your app
+ app: '../'
+ }
+});
+
+requirejs( [
+ 'imagesloaded/imagesloaded',
+ 'app/my-component.js'
+], function( imagesLoaded, myComp ) {
+ imagesLoaded( '#container', function() { ... });
+});
+```
+
+## Browser support
+
++ IE9+
++ Android 2.3+
++ iOS Safari 4+
++ All other modern browsers
+
+Use [imagesLoaded v3](http://imagesloaded.desandro.com/v3/) for IE8 support.
+
+## MIT License
+
+imagesLoaded is released under the [MIT License](http://desandro.mit-license.org/). Have at it.
diff --git a/vendor/desandro/imagesloaded/bower.json b/vendor/desandro/imagesloaded/bower.json
new file mode 100644
index 000000000..795c69f07
--- /dev/null
+++ b/vendor/desandro/imagesloaded/bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "imagesloaded",
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "main": "imagesloaded.js",
+ "dependencies": {
+ "ev-emitter": "^1.0.0"
+ },
+ "devDependencies": {
+ "jquery": ">=1.9 <4.0",
+ "qunit": "^2.0.0"
+ },
+ "ignore": [
+ "**/.*",
+ "test",
+ "package.json",
+ "composer.json",
+ "node_modules",
+ "bower_components",
+ "tests",
+ "sandbox/",
+ "gulpfile.js",
+ "contributing.md"
+ ],
+ "homepage": "http://imagesloaded.desandro.com",
+ "authors": [
+ "David DeSandro"
+ ],
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "keywords": [
+ "images"
+ ],
+ "license": "MIT"
+}
diff --git a/vendor/desandro/imagesloaded/composer.json b/vendor/desandro/imagesloaded/composer.json
new file mode 100644
index 000000000..95ba64c4a
--- /dev/null
+++ b/vendor/desandro/imagesloaded/composer.json
@@ -0,0 +1,15 @@
+{
+ "name": "desandro/imagesloaded",
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "type": "component",
+ "keywords": ["javascript", "library", "images", "loaded", "dom", "ui", "jquery-plugin"],
+ "homepage": "http://imagesloaded.desandro.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "David DeSandro",
+ "homepage": "http://desandro.com/",
+ "role": "developer"
+ }
+ ]
+}
diff --git a/vendor/desandro/imagesloaded/contributing.md b/vendor/desandro/imagesloaded/contributing.md
new file mode 100644
index 000000000..acac280cc
--- /dev/null
+++ b/vendor/desandro/imagesloaded/contributing.md
@@ -0,0 +1,20 @@
+## Submitting issues
+
+### Reduced test case required
+
+All bug reports and problem issues require a [**reduced test case**](http://css-tricks.com/reduced-test-cases/).
+
++ A reduced test case clearly demonstrates the bug or issue.
++ It contains the bare minimum HTML, CSS, and JavaScript required to demonstrate the bug.
++ A link to your production site is **not** a reduced test case.
+
+Create a test case by forking a [CodePen demos](http://codepen.io/desandro/pens/tags/?selected_tag=imagesloaded-docs).
+
++ [progress with jQuery](http://codepen.io/desandro/pen/bIFyl)
++ [progress with vanilla JS](http://codepen.io/desandro/pen/hlzaw)
++ [`{ background: true }` with jQuery](http://codepen.io/desandro/pen/pjVMPB)
++ [`{ background: true }` with vanilla JS](http://codepen.io/desandro/pen/avKooW)
++ [`{ background: '.selector' }` with jQuery](http://codepen.io/desandro/pen/avKoZL)
++ [`{ background: '.selector' }` with vanilla JS](http://codepen.io/desandro/pen/vNrBGz)
+
+Providing a reduced test case is the best way to get your issue addressed. They help you point out the problem. They help me verify and debug the problem. They help others understand the problem. Without a reduced test case, your issue may be closed.
diff --git a/vendor/desandro/imagesloaded/gulpfile.js b/vendor/desandro/imagesloaded/gulpfile.js
new file mode 100644
index 000000000..66f775f3d
--- /dev/null
+++ b/vendor/desandro/imagesloaded/gulpfile.js
@@ -0,0 +1,128 @@
+/*jshint node: true, strict: false */
+
+var fs = require('fs');
+var gulp = require('gulp');
+var rename = require('gulp-rename');
+var replace = require('gulp-replace');
+
+// ----- hint ----- //
+
+var jshint = require('gulp-jshint');
+
+gulp.task( 'hint-js', function() {
+ return gulp.src('imagesloaded.js')
+ .pipe( jshint() )
+ .pipe( jshint.reporter('default') );
+});
+
+gulp.task( 'hint-test', function() {
+ return gulp.src('test/unit/*.js')
+ .pipe( jshint() )
+ .pipe( jshint.reporter('default') );
+});
+
+gulp.task( 'hint-task', function() {
+ return gulp.src('gulpfile.js')
+ .pipe( jshint() )
+ .pipe( jshint.reporter('default') );
+});
+
+var jsonlint = require('gulp-json-lint');
+
+gulp.task( 'jsonlint', function() {
+ return gulp.src( '*.json' )
+ .pipe( jsonlint() )
+ .pipe( jsonlint.report('verbose') );
+});
+
+gulp.task( 'hint', [ 'hint-js', 'hint-test', 'hint-task', 'jsonlint' ]);
+
+// -------------------------- RequireJS makes pkgd -------------------------- //
+
+// refactored from gulp-requirejs-optimize
+// https://www.npmjs.com/package/gulp-requirejs-optimize/
+
+var gutil = require('gulp-util');
+var chalk = require('chalk');
+var rjsOptimize = require('gulp-requirejs-optimize');
+
+// regex for banner comment
+var reBannerComment = new RegExp('^\\s*(?:\\/\\*[\\s\\S]*?\\*\\/)\\s*');
+
+function getBanner() {
+ var src = fs.readFileSync( 'imagesloaded.js', 'utf8' );
+ var matches = src.match( reBannerComment );
+ var banner = matches[0].replace( 'imagesLoaded', 'imagesLoaded PACKAGED' );
+ return banner;
+}
+
+function addBanner( str ) {
+ return replace( /^/, str );
+}
+
+gulp.task( 'requirejs', function() {
+ var banner = getBanner();
+ // HACK src is not needed
+ // should refactor rjsOptimize to produce src
+ return gulp.src('imagesloaded.js')
+ .pipe( rjsOptimize({
+ baseUrl: 'bower_components',
+ optimize: 'none',
+ include: [
+ '../imagesloaded'
+ ]
+ }) )
+ // remove named module
+ .pipe( replace( "'../imagesloaded',", '' ) )
+ // add banner
+ .pipe( addBanner( banner ) )
+ .pipe( rename('imagesloaded.pkgd.js') )
+ .pipe( gulp.dest('.') );
+});
+
+
+// ----- uglify ----- //
+
+var uglify = require('gulp-uglify');
+
+gulp.task( 'uglify', [ 'requirejs' ], function() {
+ var banner = getBanner();
+ gulp.src('imagesloaded.pkgd.js')
+ .pipe( uglify() )
+ // add banner
+ .pipe( addBanner( banner ) )
+ .pipe( rename('imagesloaded.pkgd.min.js') )
+ .pipe( gulp.dest('.') );
+});
+
+// ----- version ----- //
+
+// set version in source files
+
+var minimist = require('minimist');
+
+// use gulp version -t 1.2.3
+gulp.task( 'version', function() {
+ var args = minimist( process.argv.slice(3) );
+ var version = args.t;
+ if ( !version || !/\d+\.\d+\.\d+/.test( version ) ) {
+ gutil.log( 'invalid version: ' + chalk.red( version ) );
+ return;
+ }
+ gutil.log( 'ticking version to ' + chalk.green( version ) );
+
+ gulp.src('imagesloaded.js')
+ .pipe( replace( /imagesLoaded v\d+\.\d+\.\d+/, 'imagesLoaded v' + version ) )
+ .pipe( gulp.dest('.') );
+
+ gulp.src( [ 'bower.json', 'package.json' ] )
+ .pipe( replace( /"version": "\d+\.\d+\.\d+"/, '"version": "' + version + '"' ) )
+ .pipe( gulp.dest('.') );
+});
+
+// ----- default ----- //
+
+gulp.task( 'default', [
+ 'hint',
+ 'uglify'
+]);
diff --git a/vendor/desandro/imagesloaded/imagesloaded.js b/vendor/desandro/imagesloaded/imagesloaded.js
new file mode 100644
index 000000000..f527a71e9
--- /dev/null
+++ b/vendor/desandro/imagesloaded/imagesloaded.js
@@ -0,0 +1,377 @@
+/*!
+ * imagesLoaded v4.1.4
+ * JavaScript is all like "You images are done yet or what?"
+ * MIT License
+ */
+
+( function( window, factory ) { 'use strict';
+ // universal module definition
+
+ /*global define: false, module: false, require: false */
+
+ if ( typeof define == 'function' && define.amd ) {
+ // AMD
+ define( [
+ 'ev-emitter/ev-emitter'
+ ], function( EvEmitter ) {
+ return factory( window, EvEmitter );
+ });
+ } else if ( typeof module == 'object' && module.exports ) {
+ // CommonJS
+ module.exports = factory(
+ window,
+ require('ev-emitter')
+ );
+ } else {
+ // browser global
+ window.imagesLoaded = factory(
+ window,
+ window.EvEmitter
+ );
+ }
+
+})( typeof window !== 'undefined' ? window : this,
+
+// -------------------------- factory -------------------------- //
+
+function factory( window, EvEmitter ) {
+
+'use strict';
+
+var $ = window.jQuery;
+var console = window.console;
+
+// -------------------------- helpers -------------------------- //
+
+// extend objects
+function extend( a, b ) {
+ for ( var prop in b ) {
+ a[ prop ] = b[ prop ];
+ }
+ return a;
+}
+
+var arraySlice = Array.prototype.slice;
+
+// turn element or nodeList into an array
+function makeArray( obj ) {
+ if ( Array.isArray( obj ) ) {
+ // use object if already an array
+ return obj;
+ }
+
+ var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
+ if ( isArrayLike ) {
+ // convert nodeList to array
+ return arraySlice.call( obj );
+ }
+
+ // array of single index
+ return [ obj ];
+}
+
+// -------------------------- imagesLoaded -------------------------- //
+
+/**
+ * @param {Array, Element, NodeList, String} elem
+ * @param {Object or Function} options - if function, use as callback
+ * @param {Function} onAlways - callback function
+ */
+function ImagesLoaded( elem, options, onAlways ) {
+ // coerce ImagesLoaded() without new, to be new ImagesLoaded()
+ if ( !( this instanceof ImagesLoaded ) ) {
+ return new ImagesLoaded( elem, options, onAlways );
+ }
+ // use elem as selector string
+ var queryElem = elem;
+ if ( typeof elem == 'string' ) {
+ queryElem = document.querySelectorAll( elem );
+ }
+ // bail if bad element
+ if ( !queryElem ) {
+ console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
+ return;
+ }
+
+ this.elements = makeArray( queryElem );
+ this.options = extend( {}, this.options );
+ // shift arguments if no options set
+ if ( typeof options == 'function' ) {
+ onAlways = options;
+ } else {
+ extend( this.options, options );
+ }
+
+ if ( onAlways ) {
+ this.on( 'always', onAlways );
+ }
+
+ this.getImages();
+
+ if ( $ ) {
+ // add jQuery Deferred object
+ this.jqDeferred = new $.Deferred();
+ }
+
+ // HACK check async to allow time to bind listeners
+ setTimeout( this.check.bind( this ) );
+}
+
+ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
+
+ImagesLoaded.prototype.options = {};
+
+ImagesLoaded.prototype.getImages = function() {
+ this.images = [];
+
+ // filter & find items if we have an item selector
+ this.elements.forEach( this.addElementImages, this );
+};
+
+/**
+ * @param {Node} element
+ */
+ImagesLoaded.prototype.addElementImages = function( elem ) {
+ // filter siblings
+ if ( elem.nodeName == 'IMG' ) {
+ this.addImage( elem );
+ }
+ // get background image on element
+ if ( this.options.background === true ) {
+ this.addElementBackgroundImages( elem );
+ }
+
+ // find children
+ // no non-element nodes, #143
+ var nodeType = elem.nodeType;
+ if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
+ return;
+ }
+ var childImgs = elem.querySelectorAll('img');
+ // concat childElems to filterFound array
+ for ( var i=0; i < childImgs.length; i++ ) {
+ var img = childImgs[i];
+ this.addImage( img );
+ }
+
+ // get child background images
+ if ( typeof this.options.background == 'string' ) {
+ var children = elem.querySelectorAll( this.options.background );
+ for ( i=0; i < children.length; i++ ) {
+ var child = children[i];
+ this.addElementBackgroundImages( child );
+ }
+ }
+};
+
+var elementNodeTypes = {
+ 1: true,
+ 9: true,
+ 11: true
+};
+
+ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
+ var style = getComputedStyle( elem );
+ if ( !style ) {
+ // Firefox returns null if in a hidden iframe https://bugzil.la/548397
+ return;
+ }
+ // get url inside url("...")
+ var reURL = /url\((['"])?(.*?)\1\)/gi;
+ var matches = reURL.exec( style.backgroundImage );
+ while ( matches !== null ) {
+ var url = matches && matches[2];
+ if ( url ) {
+ this.addBackground( url, elem );
+ }
+ matches = reURL.exec( style.backgroundImage );
+ }
+};
+
+/**
+ * @param {Image} img
+ */
+ImagesLoaded.prototype.addImage = function( img ) {
+ var loadingImage = new LoadingImage( img );
+ this.images.push( loadingImage );
+};
+
+ImagesLoaded.prototype.addBackground = function( url, elem ) {
+ var background = new Background( url, elem );
+ this.images.push( background );
+};
+
+ImagesLoaded.prototype.check = function() {
+ var _this = this;
+ this.progressedCount = 0;
+ this.hasAnyBroken = false;
+ // complete if no images
+ if ( !this.images.length ) {
+ this.complete();
+ return;
+ }
+
+ function onProgress( image, elem, message ) {
+ // HACK - Chrome triggers event before object properties have changed. #83
+ setTimeout( function() {
+ _this.progress( image, elem, message );
+ });
+ }
+
+ this.images.forEach( function( loadingImage ) {
+ loadingImage.once( 'progress', onProgress );
+ loadingImage.check();
+ });
+};
+
+ImagesLoaded.prototype.progress = function( image, elem, message ) {
+ this.progressedCount++;
+ this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
+ // progress event
+ this.emitEvent( 'progress', [ this, image, elem ] );
+ if ( this.jqDeferred && this.jqDeferred.notify ) {
+ this.jqDeferred.notify( this, image );
+ }
+ // check if completed
+ if ( this.progressedCount == this.images.length ) {
+ this.complete();
+ }
+
+ if ( this.options.debug && console ) {
+ console.log( 'progress: ' + message, image, elem );
+ }
+};
+
+ImagesLoaded.prototype.complete = function() {
+ var eventName = this.hasAnyBroken ? 'fail' : 'done';
+ this.isComplete = true;
+ this.emitEvent( eventName, [ this ] );
+ this.emitEvent( 'always', [ this ] );
+ if ( this.jqDeferred ) {
+ var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
+ this.jqDeferred[ jqMethod ]( this );
+ }
+};
+
+// -------------------------- -------------------------- //
+
+function LoadingImage( img ) {
+ this.img = img;
+}
+
+LoadingImage.prototype = Object.create( EvEmitter.prototype );
+
+LoadingImage.prototype.check = function() {
+ // If complete is true and browser supports natural sizes,
+ // try to check for image status manually.
+ var isComplete = this.getIsImageComplete();
+ if ( isComplete ) {
+ // report based on naturalWidth
+ this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
+ return;
+ }
+
+ // If none of the checks above matched, simulate loading on detached element.
+ this.proxyImage = new Image();
+ this.proxyImage.addEventListener( 'load', this );
+ this.proxyImage.addEventListener( 'error', this );
+ // bind to image as well for Firefox. #191
+ this.img.addEventListener( 'load', this );
+ this.img.addEventListener( 'error', this );
+ this.proxyImage.src = this.img.src;
+};
+
+LoadingImage.prototype.getIsImageComplete = function() {
+ // check for non-zero, non-undefined naturalWidth
+ // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
+ return this.img.complete && this.img.naturalWidth;
+};
+
+LoadingImage.prototype.confirm = function( isLoaded, message ) {
+ this.isLoaded = isLoaded;
+ this.emitEvent( 'progress', [ this, this.img, message ] );
+};
+
+// ----- events ----- //
+
+// trigger specified handler for event type
+LoadingImage.prototype.handleEvent = function( event ) {
+ var method = 'on' + event.type;
+ if ( this[ method ] ) {
+ this[ method ]( event );
+ }
+};
+
+LoadingImage.prototype.onload = function() {
+ this.confirm( true, 'onload' );
+ this.unbindEvents();
+};
+
+LoadingImage.prototype.onerror = function() {
+ this.confirm( false, 'onerror' );
+ this.unbindEvents();
+};
+
+LoadingImage.prototype.unbindEvents = function() {
+ this.proxyImage.removeEventListener( 'load', this );
+ this.proxyImage.removeEventListener( 'error', this );
+ this.img.removeEventListener( 'load', this );
+ this.img.removeEventListener( 'error', this );
+};
+
+// -------------------------- Background -------------------------- //
+
+function Background( url, element ) {
+ this.url = url;
+ this.element = element;
+ this.img = new Image();
+}
+
+// inherit LoadingImage prototype
+Background.prototype = Object.create( LoadingImage.prototype );
+
+Background.prototype.check = function() {
+ this.img.addEventListener( 'load', this );
+ this.img.addEventListener( 'error', this );
+ this.img.src = this.url;
+ // check if image is already complete
+ var isComplete = this.getIsImageComplete();
+ if ( isComplete ) {
+ this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
+ this.unbindEvents();
+ }
+};
+
+Background.prototype.unbindEvents = function() {
+ this.img.removeEventListener( 'load', this );
+ this.img.removeEventListener( 'error', this );
+};
+
+Background.prototype.confirm = function( isLoaded, message ) {
+ this.isLoaded = isLoaded;
+ this.emitEvent( 'progress', [ this, this.element, message ] );
+};
+
+// -------------------------- jQuery -------------------------- //
+
+ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
+ jQuery = jQuery || window.jQuery;
+ if ( !jQuery ) {
+ return;
+ }
+ // set local variable
+ $ = jQuery;
+ // $().imagesLoaded()
+ $.fn.imagesLoaded = function( options, callback ) {
+ var instance = new ImagesLoaded( this, options, callback );
+ return instance.jqDeferred.promise( $(this) );
+ };
+};
+// try making plugin
+ImagesLoaded.makeJQueryPlugin();
+
+// -------------------------- -------------------------- //
+
+return ImagesLoaded;
+
+});
diff --git a/library/imagesloaded/imagesloaded.pkgd.js b/vendor/desandro/imagesloaded/imagesloaded.pkgd.js
index ef23971be..a230750b3 100644
--- a/library/imagesloaded/imagesloaded.pkgd.js
+++ b/vendor/desandro/imagesloaded/imagesloaded.pkgd.js
@@ -1,11 +1,11 @@
/*!
- * imagesLoaded PACKAGED v4.1.0
+ * imagesLoaded PACKAGED v4.1.4
* JavaScript is all like "You images are done yet or what?"
* MIT License
*/
/**
- * EvEmitter v1.0.1
+ * EvEmitter v1.1.0
* Lil' event emitter
* MIT License
*/
@@ -14,7 +14,7 @@
( function( global, factory ) {
// universal module definition
- /* jshint strict: false */ /* globals define, module */
+ /* jshint strict: false */ /* globals define, module, window */
if ( typeof define == 'function' && define.amd ) {
// AMD - RequireJS
define( 'ev-emitter/ev-emitter',factory );
@@ -26,7 +26,7 @@
global.EvEmitter = factory();
}
-}( this, function() {
+}( typeof window != 'undefined' ? window : this, function() {
@@ -59,8 +59,8 @@ proto.once = function( eventName, listener ) {
// set once flag
// set onceEvents hash
var onceEvents = this._onceEvents = this._onceEvents || {};
- // set onceListeners array
- var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || [];
+ // set onceListeners object
+ var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
// set flag
onceListeners[ listener ] = true;
@@ -85,13 +85,14 @@ proto.emitEvent = function( eventName, args ) {
if ( !listeners || !listeners.length ) {
return;
}
- var i = 0;
- var listener = listeners[i];
+ // copy over to avoid interference if .off() in listener
+ listeners = listeners.slice(0);
args = args || [];
// once stuff
var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
- while ( listener ) {
+ for ( var i=0; i < listeners.length; i++ ) {
+ var listener = listeners[i]
var isOnce = onceListeners && onceListeners[ listener ];
if ( isOnce ) {
// remove listener
@@ -102,20 +103,22 @@ proto.emitEvent = function( eventName, args ) {
}
// trigger listener
listener.apply( this, args );
- // get next listener
- i += isOnce ? 0 : 1;
- listener = listeners[i];
}
return this;
};
+proto.allOff = function() {
+ delete this._events;
+ delete this._onceEvents;
+};
+
return EvEmitter;
}));
/*!
- * imagesLoaded v4.1.0
+ * imagesLoaded v4.1.4
* JavaScript is all like "You images are done yet or what?"
* MIT License
*/
@@ -146,7 +149,7 @@ return EvEmitter;
);
}
-})( window,
+})( typeof window !== 'undefined' ? window : this,
// -------------------------- factory -------------------------- //
@@ -167,22 +170,23 @@ function extend( a, b ) {
return a;
}
+var arraySlice = Array.prototype.slice;
+
// turn element or nodeList into an array
function makeArray( obj ) {
- var ary = [];
if ( Array.isArray( obj ) ) {
// use object if already an array
- ary = obj;
- } else if ( typeof obj.length == 'number' ) {
+ return obj;
+ }
+
+ var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
+ if ( isArrayLike ) {
// 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 arraySlice.call( obj );
}
- return ary;
+
+ // array of single index
+ return [ obj ];
}
// -------------------------- imagesLoaded -------------------------- //
@@ -198,13 +202,19 @@ function ImagesLoaded( elem, options, onAlways ) {
return new ImagesLoaded( elem, options, onAlways );
}
// use elem as selector string
+ var queryElem = elem;
if ( typeof elem == 'string' ) {
- elem = document.querySelectorAll( elem );
+ queryElem = document.querySelectorAll( elem );
+ }
+ // bail if bad element
+ if ( !queryElem ) {
+ console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
+ return;
}
- this.elements = makeArray( elem );
+ this.elements = makeArray( queryElem );
this.options = extend( {}, this.options );
-
+ // shift arguments if no options set
if ( typeof options == 'function' ) {
onAlways = options;
} else {
@@ -223,9 +233,7 @@ function ImagesLoaded( elem, options, onAlways ) {
}
// HACK check async to allow time to bind listeners
- setTimeout( function() {
- this.check();
- }.bind( this ));
+ setTimeout( this.check.bind( this ) );
}
ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
@@ -393,7 +401,9 @@ LoadingImage.prototype.check = function() {
};
LoadingImage.prototype.getIsImageComplete = function() {
- return this.img.complete && this.img.naturalWidth !== undefined;
+ // check for non-zero, non-undefined naturalWidth
+ // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
+ return this.img.complete && this.img.naturalWidth;
};
LoadingImage.prototype.confirm = function( isLoaded, message ) {
diff --git a/vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js b/vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js
new file mode 100644
index 000000000..e443a77d6
--- /dev/null
+++ b/vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js
@@ -0,0 +1,7 @@
+/*!
+ * imagesLoaded PACKAGED v4.1.4
+ * JavaScript is all like "You images are done yet or what?"
+ * MIT License
+ */
+
+!function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o<i.length;o++){var r=i[o],s=n&&n[r];s&&(this.off(e,r),delete n[r]),r.apply(this,t)}return this}},t.allOff=function(){delete this._events,delete this._onceEvents},e}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],function(i){return t(e,i)}):"object"==typeof module&&module.exports?module.exports=t(e,require("ev-emitter")):e.imagesLoaded=t(e,e.EvEmitter)}("undefined"!=typeof window?window:this,function(e,t){function i(e,t){for(var i in t)e[i]=t[i];return e}function n(e){if(Array.isArray(e))return e;var t="object"==typeof e&&"number"==typeof e.length;return t?d.call(e):[e]}function o(e,t,r){if(!(this instanceof o))return new o(e,t,r);var s=e;return"string"==typeof e&&(s=document.querySelectorAll(e)),s?(this.elements=n(s),this.options=i({},this.options),"function"==typeof t?r=t:i(this.options,t),r&&this.on("always",r),this.getImages(),h&&(this.jqDeferred=new h.Deferred),void setTimeout(this.check.bind(this))):void a.error("Bad element for imagesLoaded "+(s||e))}function r(e){this.img=e}function s(e,t){this.url=e,this.element=t,this.img=new Image}var h=e.jQuery,a=e.console,d=Array.prototype.slice;o.prototype=Object.create(t.prototype),o.prototype.options={},o.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},o.prototype.addElementImages=function(e){"IMG"==e.nodeName&&this.addImage(e),this.options.background===!0&&this.addElementBackgroundImages(e);var t=e.nodeType;if(t&&u[t]){for(var i=e.querySelectorAll("img"),n=0;n<i.length;n++){var o=i[n];this.addImage(o)}if("string"==typeof this.options.background){var r=e.querySelectorAll(this.options.background);for(n=0;n<r.length;n++){var s=r[n];this.addElementBackgroundImages(s)}}}};var u={1:!0,9:!0,11:!0};return o.prototype.addElementBackgroundImages=function(e){var t=getComputedStyle(e);if(t)for(var i=/url\((['"])?(.*?)\1\)/gi,n=i.exec(t.backgroundImage);null!==n;){var o=n&&n[2];o&&this.addBackground(o,e),n=i.exec(t.backgroundImage)}},o.prototype.addImage=function(e){var t=new r(e);this.images.push(t)},o.prototype.addBackground=function(e,t){var i=new s(e,t);this.images.push(i)},o.prototype.check=function(){function e(e,i,n){setTimeout(function(){t.progress(e,i,n)})}var t=this;return this.progressedCount=0,this.hasAnyBroken=!1,this.images.length?void this.images.forEach(function(t){t.once("progress",e),t.check()}):void this.complete()},o.prototype.progress=function(e,t,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded,this.emitEvent("progress",[this,e,t]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,e),this.progressedCount==this.images.length&&this.complete(),this.options.debug&&a&&a.log("progress: "+i,e,t)},o.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(e,[this]),this.emitEvent("always",[this]),this.jqDeferred){var t=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[t](this)}},r.prototype=Object.create(t.prototype),r.prototype.check=function(){var e=this.getIsImageComplete();return e?void this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),void(this.proxyImage.src=this.img.src))},r.prototype.getIsImageComplete=function(){return this.img.complete&&this.img.naturalWidth},r.prototype.confirm=function(e,t){this.isLoaded=e,this.emitEvent("progress",[this,this.img,t])},r.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},r.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},r.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},r.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},s.prototype=Object.create(r.prototype),s.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url;var e=this.getIsImageComplete();e&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},s.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},s.prototype.confirm=function(e,t){this.isLoaded=e,this.emitEvent("progress",[this,this.element,t])},o.makeJQueryPlugin=function(t){t=t||e.jQuery,t&&(h=t,h.fn.imagesLoaded=function(e,t){var i=new o(this,e,t);return i.jqDeferred.promise(h(this))})},o.makeJQueryPlugin(),o}); \ No newline at end of file
diff --git a/vendor/desandro/imagesloaded/package.json b/vendor/desandro/imagesloaded/package.json
new file mode 100644
index 000000000..ced516d8e
--- /dev/null
+++ b/vendor/desandro/imagesloaded/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "imagesloaded",
+ "version": "4.1.4",
+ "description": "JavaScript is all like _You images done yet or what?_",
+ "main": "imagesloaded.js",
+ "dependencies": {
+ "ev-emitter": "^1.0.0"
+ },
+ "devDependencies": {
+ "chalk": "^1.1.1",
+ "cheerio": "^0.19.0",
+ "gulp": "^3.9.0",
+ "gulp-jshint": "^1.11.2",
+ "gulp-json-lint": "^0.1.0",
+ "gulp-rename": "^1.2.2",
+ "gulp-replace": "^0.5.4",
+ "gulp-requirejs-optimize": "github:metafizzy/gulp-requirejs-optimize",
+ "gulp-uglify": "^1.4.2",
+ "gulp-util": "^3.0.7",
+ "highlight.js": "^8.9.1",
+ "marked": "^0.3.5",
+ "minimist": "^1.2.0",
+ "transfob": "^1.0.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/desandro/imagesloaded.git"
+ },
+ "keywords": [
+ "images",
+ "loaded",
+ "ui",
+ "dom",
+ "jquery-plugin"
+ ],
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/desandro/imagesloaded/issues"
+ },
+ "homepage": "https://github.com/desandro/imagesloaded",
+ "directories": {
+ "test": "test"
+ },
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "David DeSandro"
+}
diff --git a/vendor/desandro/imagesloaded/sandbox/background/css/background.css b/vendor/desandro/imagesloaded/sandbox/background/css/background.css
new file mode 100644
index 000000000..509966a7d
--- /dev/null
+++ b/vendor/desandro/imagesloaded/sandbox/background/css/background.css
@@ -0,0 +1,29 @@
+.box {
+ width: 300px;
+ height: 300px;
+ margin: 0 20px 20px 0;
+ border: 1px solid;
+ display: inline-block;
+}
+
+.orange-tree {
+ background: url('http://i.imgur.com/bwy74ok.jpg');
+ background-size: cover;
+}
+
+.thunder-cloud {
+ background: url('../../../test/img/thunder-cloud.jpg');
+ background-size: contain;
+}
+
+.multi1 {
+ background:
+ url("http://i.imgur.com/ZAVN3.png"),
+ url('http://i.imgur.com/6UdOxeB.png') bottom right,
+ url(http://i.imgur.com/LkmcILl.jpg);
+ background-size: cover;
+}
+
+.blue {
+ background: #09F;
+} \ No newline at end of file
diff --git a/vendor/desandro/imagesloaded/sandbox/background/index.html b/vendor/desandro/imagesloaded/sandbox/background/index.html
new file mode 100644
index 000000000..853f8ff35
--- /dev/null
+++ b/vendor/desandro/imagesloaded/sandbox/background/index.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width" />
+
+ <title>background</title>
+
+ <!-- put in separate folder so JS path is different from CSS path -->
+ <link rel="stylesheet" href="css/background.css" >
+
+</head>
+<body>
+
+ <h1>background</h1>
+
+<div class="box orange-tree"></div>
+
+<div class="box thunder-cloud"></div>
+
+<div class="box multi1"></div>
+
+<div class="box blue"></div>
+
+<script src="../../bower_components/ev-emitter/ev-emitter.js"></script>
+<script src="../../imagesloaded.js"></script>
+<script>
+
+var imgLoad0 = imagesLoaded( '.orange-tree', { background: true }, function() {
+ console.log('orange tree bg images loaded', imgLoad0.images.length );
+});
+
+var imgLoad1 = imagesLoaded( '.thunder-cloud', { background: true }, function() {
+ console.log('thunder cloud bg images loaded', imgLoad1.images.length);
+});
+
+var imgLoad2 = imagesLoaded( '.multi1', { background: true }, function() {
+ console.log('multi1 bg images loaded', imgLoad2.images.length);
+});
+
+var imgLoad3 = imagesLoaded( '.box', { background: true }, function() {
+ console.log('.box bg images loaded', imgLoad3.images.length);
+});
+imgLoad3.on('progress', function( instance, image, element ) {
+ console.log( 'progress on .box', image.img.src, element.className );
+});
+
+</script>
+
+</body>
+</html>
diff --git a/vendor/desandro/imagesloaded/sandbox/progress/index.html b/vendor/desandro/imagesloaded/sandbox/progress/index.html
new file mode 100644
index 000000000..b01ce28c5
--- /dev/null
+++ b/vendor/desandro/imagesloaded/sandbox/progress/index.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width" />
+
+ <title>progress</title>
+
+ <style>
+ #image-container img {
+ max-height: 140px;
+ }
+
+ li {
+ height: 140px;
+ min-width: 100px;
+ display: block;
+ float: left;
+ list-style: none;
+ margin: 0 5px 5px 0;
+ background-color: black;
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+
+ li img,
+ #status {
+ -webkit-transition: opacity 0.4s;
+ -moz-transition: opacity 0.4s;
+ -ms-transition: opacity 0.4s;
+ transition: opacity 0.4s;
+ }
+
+ li.is-loading {
+ background-color: black;
+ background-image: url('http://desandro.github.io/imagesloaded/assets/loading.gif');
+ }
+
+ li.is-broken {
+ background-image: url('http://desandro.github.io/imagesloaded/assets/broken.png');
+ background-color: #be3730;
+ width: 120px;
+ }
+
+ li.is-loading img,
+ li.is-broken img {
+ opacity: 0;
+ }
+
+ .buttons { margin-bottom: 1.0em; }
+
+ button {
+ font-size: 18px;
+ padding: 0.4em 0.8em;
+ font-family: sans-serif;
+ }
+
+ #status {
+ opacity: 0;
+ position: fixed;
+ right: 20px;
+ top: 20px;
+ background: hsla( 0, 0%, 0%, 0.8);
+ padding: 20px;
+ border-radius: 10px;
+ z-index: 2; /* over other stuff */
+ }
+ </style>
+
+</head>
+<body>
+
+ <h1>progress</h1>
+
+ <div class="buttons">
+ <button id="add">Add images</button>
+ <button id="reset">Reset</button>
+ </div>
+ <div id="status">
+ <progress max="7" value="0"></progress>
+ </div>
+ <div id="image-container"></div>
+
+<script src="../../bower_components/ev-emitter/ev-emitter.js"></script>
+<script src="../../imagesloaded.js"></script>
+<script src="progress.js"></script>
+
+</body>
+</html>
diff --git a/vendor/desandro/imagesloaded/sandbox/progress/progress.js b/vendor/desandro/imagesloaded/sandbox/progress/progress.js
new file mode 100644
index 000000000..7c00003f5
--- /dev/null
+++ b/vendor/desandro/imagesloaded/sandbox/progress/progress.js
@@ -0,0 +1,111 @@
+/* jshint strict: false */
+
+var progressElem, statusElem;
+var supportsProgress;
+var loadedImageCount, imageCount;
+
+var container = document.querySelector('#image-container');
+statusElem = document.querySelector('#status');
+progressElem = document.querySelector('progress');
+
+supportsProgress = progressElem &&
+ // IE does not support progress
+ progressElem.toString().indexOf('Unknown') === -1;
+
+document.querySelector('#add').onclick = function() {
+ // add new images
+ var fragment = getItemsFragment();
+ container.insertBefore( fragment, container.firstChild );
+ // use ImagesLoaded
+ var imgLoad = imagesLoaded( container );
+ imgLoad.on( 'progress', onProgress );
+ imgLoad.on( 'always', onAlways );
+ // reset progress counter
+ imageCount = imgLoad.images.length;
+ resetProgress();
+ updateProgress( 0 );
+};
+
+// reset container
+document.querySelector('#reset').onclick = function() {
+ empty( container );
+};
+
+// ----- set text helper ----- //
+
+var docElem = document.documentElement;
+var textSetter = docElem.textContent !== undefined ? 'textContent' : 'innerText';
+
+function setText( elem, value ) {
+ elem[ textSetter ] = value;
+}
+
+function empty( elem ) {
+ while ( elem.firstChild ) {
+ elem.removeChild( elem.firstChild );
+ }
+}
+
+// ----- ----- //
+
+// return doc fragment with
+function getItemsFragment() {
+ var fragment = document.createDocumentFragment();
+ for ( var i = 0; i < 7; i++ ) {
+ var item = getImageItem();
+ fragment.appendChild( item );
+ }
+ return fragment;
+}
+
+// return an <li> with a <img> in it
+function getImageItem() {
+ var item = document.createElement('li');
+ item.className = 'is-loading';
+ var img = document.createElement('img');
+ var size = Math.random() * 3 + 1;
+ var width = Math.random() * 110 + 100;
+ width = Math.round( width * size );
+ var height = Math.round( 140 * size );
+ var rando = Math.ceil( Math.random() * 1000 );
+ // 10% chance of broken image src
+ // random parameter to prevent cached images
+ img.src = rando < 100 ? '//foo/broken-' + rando + '.jpg' :
+ // use picsum for great random images
+ 'https://picsum.photos/' + width + '/' + height + '/' + '?random';
+ item.appendChild( img );
+ return item;
+}
+
+// ----- ----- //
+
+function resetProgress() {
+ statusElem.style.opacity = 1;
+ loadedImageCount = 0;
+ if ( supportsProgress ) {
+ progressElem.setAttribute( 'max', imageCount );
+ }
+}
+
+function updateProgress( value ) {
+ if ( supportsProgress ) {
+ progressElem.setAttribute( 'value', value );
+ } else {
+ // if you don't support progress elem
+ setText( statusElem, value + ' / ' + imageCount );
+ }
+}
+
+// triggered after each item is loaded
+function onProgress( imgLoad, image ) {
+ // change class if the image is loaded or broken
+ image.img.parentNode.className = image.isLoaded ? '' : 'is-broken';
+ // update progress element
+ loadedImageCount++;
+ updateProgress( loadedImageCount );
+}
+
+// hide status when done
+function onAlways() {
+ statusElem.style.opacity = 0;
+}
diff --git a/vendor/desandro/imagesloaded/test/css/tests.css b/vendor/desandro/imagesloaded/test/css/tests.css
new file mode 100644
index 000000000..af8a7e885
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/css/tests.css
@@ -0,0 +1,41 @@
+img {
+ display: inline-block;
+ max-width: 240px;
+}
+
+/* ---- backgrounds ---- */
+
+.bg-box {
+ width: 240px;
+ height: 240px;
+ margin: 0 20px 20px 0;
+ border: 1px solid;
+ display: inline-block;
+}
+
+.bg-box.tulip {
+ background: url('http://i.imgur.com/9xYjgCk.jpg');
+ background-size: cover;
+}
+
+.bg-box.thunder-cloud {
+ background: url('../img/thunder-cloud.jpg');
+ background-size: contain;
+}
+
+.bg-box.multi {
+ background:
+ url("http://i.imgur.com/ZAVN3.png"),
+ url('http://i.imgur.com/6UdOxeB.png') bottom right,
+ url(https://picsum.photos/601/401/?random);
+ background-size: cover;
+}
+
+.bg-box.blue {
+ background: #09F;
+}
+
+.bg-box.gulls {
+ background-image: url('http://i.imgur.com/qKhkOKC.jpg');
+ background-size: cover;
+}
diff --git a/vendor/desandro/imagesloaded/test/img/blue-shell.jpg b/vendor/desandro/imagesloaded/test/img/blue-shell.jpg
new file mode 100644
index 000000000..b47f1e927
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/img/blue-shell.jpg
Binary files differ
diff --git a/vendor/desandro/imagesloaded/test/img/bowser-jr.jpg b/vendor/desandro/imagesloaded/test/img/bowser-jr.jpg
new file mode 100644
index 000000000..b1de2a76f
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/img/bowser-jr.jpg
Binary files differ
diff --git a/vendor/desandro/imagesloaded/test/img/thunder-cloud.jpg b/vendor/desandro/imagesloaded/test/img/thunder-cloud.jpg
new file mode 100644
index 000000000..54fc9a1b7
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/img/thunder-cloud.jpg
Binary files differ
diff --git a/vendor/desandro/imagesloaded/test/index.html b/vendor/desandro/imagesloaded/test/index.html
new file mode 100644
index 000000000..02b04f4a6
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/index.html
@@ -0,0 +1,104 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <title>imagesLoaded tests</title>
+
+ <link rel="stylesheet" href="../bower_components/qunit/qunit/qunit.css" />
+ <link rel="stylesheet" href="css/tests.css" />
+
+ <script src="../bower_components/ev-emitter/ev-emitter.js"></script>
+ <script src="../bower_components/qunit/qunit/qunit.js"></script>
+ <script src="../bower_components/jquery/dist/jquery.js"></script>
+
+ <script src="../imagesloaded.js"></script>
+
+ <script src="unit/basics.js"></script>
+ <script src="unit/selector-string.js"></script>
+ <script src="unit/single-element.js"></script>
+ <script src="unit/local-files.js"></script>
+ <script src="unit/data-uri.js"></script>
+ <script src="unit/append.js"></script>
+ <script src="unit/no-images.js"></script>
+ <script src="unit/jquery-success.js"></script>
+ <script src="unit/jquery-fail.js"></script>
+ <script src="unit/non-element.js"></script>
+ <script src="unit/background.js"></script>
+
+</head>
+<body>
+
+ <h1>imagesLoaded tests</h1>
+
+ <div id="qunit"></div>
+
+ <h2>Basics</h2>
+
+ <div id="basics">
+ <img src="http://i.imgur.com/xrQHn.jpg" />
+ <img src="http://i.imgur.com/b3fBJ.jpg" />
+ <img src="http://i.imgur.com/xmSh2.jpg" />
+ <img src="http://i.imgur.com/iIpJm.jpg" />
+ <img src="http://i.imgur.com/cvZZl10.gif" />
+ </div>
+
+ <img id="mario-with-shell" src="http://i.imgur.com/ZAVN3.png" >
+
+ <h2>Locals</h2>
+
+ <div id="locals">
+ <img src="img/blue-shell.jpg" />
+ <img src="img/bowser-jr.jpg" />
+ <!-- thunder cloud has bad permissions, should 403 -->
+ <img src="img/not-there.jpg" />
+ </div>
+
+ <h2>Data URI</h2>
+
+ <div id="data-uri">
+ <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAMAAwAwERAAIRAQMRAf/EAJMAAAEFAQEBAAAAAAAAAAAAAAYAAwQHCAUBAgEAAgIDAQEAAAAAAAAAAAAAAAUEBgECAwcIEAABAwMDAgQFAwUAAAAAAAACAQMEEQUGACESMQdBUSIyYUJiExRSIwihgiQVFhEAAQMCBQEFBgcAAAAAAAAAAQARAgMEITFBEgVRYYGRIgZxocHRchPw4TJCIxQH/9oADAMBAAIRAxEAPwDf2hCWhC42R5JBxuF+RJq7JcqMWIC/uOmngnkKfMXh/TSTmOZt+MoGrVP0x1kez4nTwCl21rOvPbHvPRRMHuFzutmcuF2NClPyn1ERSjYNiXEQD4DTx389RvTl/VvrKNxUzqGRA6B2AHgt72lGlVMI/tbxRJqyKCloQloQm31eRlxY4iT6CqtCaqIqVNkVURaJXWk9207W3Ng+T9qyGfFUtPutrbyFIuazTtWRyy+1FbuIKyw9v6QiO7tODVdhEuXmldfM/qbi+arXMql2A2hDmAHQM7D29+Kt9tc04w20Rh7+9FkKZIx1VFhf8bkv3I5biqqu6p5Kvw0u9N+sL3iav9eX8tJ22dPoOnsy7FwrW8bnzZS6/NHkZ4pEdt42yZIxQlaP3DXwXX1LQqmrTjMxMNwfbLMdh7VWJBiQ7p3Xdapt99mMy5JkOC1HZEnHXTVBEQBKkSqvRERN9CFSFx7q5PkqOz8TfZs2ON8lizJDIvyZLadHlFxeLYF1BOKlTdadNWy34emIg1XMjoNElr35EmgEORO4uaXWUNnya2QMpxZ50FemSWBhuxXBJFB9tKGDn219ftAtvStdJvUnEQHHXEqQJIpTaP6jI7SwGrk5KVZ3z1IieDkfgqDkOf8AcEsmQ7FGbs+LspRm7SowzJkh2u7iNGvFhpE9iqJGXVeOvPfQX+Yw4+Iu+Q89zIOIPhSfqdanXSOQxxU6+5oSBhROA9/5Isgd08vxltq5ZQ+zfccNUKZIYZFiUwz4ugjXocEfcQ8UKnRa7a9cuOHpyiftOJDQ6pPR5AmTTCvONJYmR2ZcVwXosgBdYeBeQG2aIQkKp1RUWqaqZDJ0qL7p5U9nz1w7cY887FtMSQLGR3JteKyVb9TkJrxQK0F4/HcE8V1ZONsAwrVMtB8Uru7v7flGaGZlqdt8AGnXUOMwQqTYogjTolUTy1Z4yEkid1DwPIrzLzLKbNdba7GsFo+wlruDraCxL/IqQ/jkgopIAJ+9Ui9dKcemlUjWlUkCPKGbwXWpCAhEjMu697gZHfYmW4pabRbnZVjuzjwXa4NAJsRRZ4kX5JKKqCE2pfaUVH1pvXprANaE4iIwLv4IpxgYSJzGSnwLQ7cbe4DLyNx3iJRbVEIadFoi+emkpiJXEll2O1uXu9u5cLt1fnXZVinS1ZsFwMuSwjfWoRHK7q0p1RkvkqgL6aKlc5Pj3BrQ7x8fmn1pd7/Kc1W9zukjtr3AvuMX0VjPSpsm5WqQ5sEyFMeJ4XGyXYlFSVtxE3Eh36ppnYV4VKMRqAyj3luTJwuxIvzV6bKG2+ipJFRJQXdBXqqeVNMwAEs2mKYKZc7MItPG3NbH2PI4jLnH6gL01+IrocrIAllgkk26XgSaYJuG2XueJxHnOPjxAdq+XJaaHKCBHPFSYeQt2JoYDj9Ejigipruop4rrBiDmsGBlih+DOkdzc8s2K2BFkPtTI1wukltOTcOFDeB43XFTZFLigNoq1Ii26Lpdf3EKdEjUhgmdpbyEnK1plWF4pm8BLZltoi3eEKqTYSm0MmyXqTZ7EBbdQVF1R4VJQLxLJ2Q6zdlX8asvxO5O3TtPLbulofLktiukhWpbH0syTRRcBPAXaEn6i0+teV24T8VFq24mEMOdve/F3f8Awf8AjljPJRClS5sQIqeFeYOGS0+kFXTGXLUgMCosbJl9tdu+/FoeWEuHpKc3QZUSdFKMXxQnHGyT+4E0R5aiRiidk6IsX/jVmOW3Jq5d15bdqsrBcksdrfV2Y/T5XZIIgttr8yNciX9Q6X3XK7g0PFSqVuILSmLYbiuE2/8A1eJ2iLaIKrycbitoCuElfU4XuMt+pqq6QTqSmXkXUoBl/9k=" />
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAwCAMAAAC/knOqAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMBQTFRFkF0QF27/Bgsp/fQF+fr6jqvpDEG2zp4CCx9Ys4IFo5JU8MqQXJH2Ulxj89QDC0bIsrKxIHn//fxztcv2iYqG5ebmCjCHzNjxAzTYRmih2drcCzijMof+OB8U/Pg59PHXE2D9xMK9eUMDAVf8kXNP/fvr2eP0p6WgOUtnAkX7Eljwa3WB5er2UXjVC0jZAh9/EFHa8PHyl5mZJVKt6NM34dzNz87NASGpsbzZDlDytq4tLWfs4bQFyLNp////+/v7DjziEwAAAEB0Uk5T////////////////////////////////////////////////////////////////////////////////////AMJ7sUQAAAPaSURBVHjadNWLdqo6EAZgQKGRA0YUYzRQY1ELqFykiojV93+rM0FQbLt/VlcvfpmVhGQq3V6TjgyjLOWyNIzR9sdn0stvE0MuQrmOZxmjf9pRybln+sJZspWZiSU7o7+twTmXtcU3BmhZ4f6/zLJk2ej+ttsyDIXVN4klsGzqmQP1ZXn9044TQbmcuS5Yx3Ic380cy2rj2qZJktzrui7MFqiDKlutcv1ip0mNseuGFbaedeVd235qGOMkAo4VJYB4AVcUbHG5erjxtN1ME8kwpgHybV0/63vbRF5QrUFk+7ADwpgGD82nva9+p4m+CQKYWFjwUH3YKYNkjPrnCr6/D4fz93f46WsKuIDqu8amPmGE5bnZr2u+fw2Hwwr3N4FYRZKsazshBLCggPv9S79K56saV+NRbU8McO6+ifSavL1dLtVQk2LYT7VtY/hcgnw8HgkGAL9Q2E78tDGJfWBV3CbiFwnqmzlsfmPXUDd2pTtUFAVVj6IIDtVNqmGtmW+aEYJQDZ9puM/gPTX7cNtBYeS7r+z+hVyfAp0+3gUsDsXKP5IXGLPne7uVUJf8TRFPEi1Ln1YVq/sbazzBbN8+v2LGjCguzNBtllVRwovoPtvnvcgYihlpLaueQeFRjY1f79vWhxfCGKpz54gVRYTZ7Nedn8JeiPNG7lhBGS2KIKdZ99edT6cKQjEiBGMf+UhhZRFQSnG02/60J9i0qmCMcsbimPGABkXIRYdQX+2EaaEcinOc57GWlWXpeR7cYqsUPWj0YksKN73QNEpLdZJer9d0rToeVC2LEG5+2rIqLjjXKKPJ6PrMxPJkK6DcsdSn3dIo5DnK8113de22tOHJWhyUDp88rBFFPEJxvruu0jYVOEE0tCyjsSMchQVBOZ3Px+MfeOehmHJLbs76LioKpuT5QND0hV4nnqZoGPrb3Z6iKNIUJc6Os5nA3ZfKTgCvGtq3Kuw2BIpMP5/O/8JGQEzC4N/BGuyuwAyZKYvtw/GOYc7A4RHf1ICNbUIi2blJqocJWt5Skm8OiyPo8aGufX/UQJvd9sSPZFUqKfGPcHRYPF0MBovT8VhXh3TT1cqgFM7kzESslEbqUezdyszJ4HvwKfhi8eCra0incwFm+1N9Hub9ztnffOqf+0/IY8BhpWbnTmfePjurs2iJZ922dXsPqQcMFouqWfbnLfst+ii05t7Stjd2lb0Y1Lt0hkA73y3bexNddzjs93S7yd5e9i4XaPFQ5tLqD5LohxfouG+S5G/u8T8+7l34Al25+7SHpVRlKS312fo4OA0Ws7Fe/1FaLg+V+l+AAQAurhhy+upm/wAAAABJRU5ErkJggg==" />
+ </div>
+
+ <h2>append</h2>
+
+ <div id="append"></div>
+
+ <h2>no images</h2>
+
+ <div id="no-images"></div>
+
+ <h2>jQuery success</h2>
+
+ <div id="jquery-success">
+ <img src="http://i.imgur.com/YbYCPFF.png" />
+ <img src="http://i.imgur.com/6UdOxeB.png" />
+ <img src="http://i.imgur.com/qd8G15D.png" />
+ </div>
+
+ <h2>jQuery fail</h2>
+
+ <div id="jquery-fail">
+ <img src="http://i.imgur.com/xmSh2.jpg" />
+ <img src="img/bowser-jr.jpg" />
+ <img src="http://i.imgur.com/ZAVN3.png">
+ <img src="img/not-there.jpg" />
+ <img src="foobar.jpg" />
+ </div>
+
+ <h2>background</h2>
+
+ <div id="background">
+ <div class="bg-box tulip"></div>
+ <div class="bg-box thunder-cloud"></div>
+ <div class="bg-box multi"></div>
+ <div class="bg-box blue"></div>
+ <div class="bg-box gulls">
+ <img src="https://picsum.photos/400/300/?random" />
+ <img src="https://picsum.photos/800/600/?random" />
+ </div>
+ </div>
+
+</body>
+</html>
diff --git a/vendor/desandro/imagesloaded/test/unit/append.js b/vendor/desandro/imagesloaded/test/unit/append.js
new file mode 100644
index 000000000..7a6b3c827
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/append.js
@@ -0,0 +1,30 @@
+QUnit.test( 'append', function( assert ) {
+ 'use strict';
+
+ var imgUrls = [
+ 'http://i.imgur.com/bwy74ok.jpg',
+ 'http://i.imgur.com/bAZWoqx.jpg',
+ 'http://i.imgur.com/PgmEBSB.jpg',
+ 'http://i.imgur.com/aboaFoB.jpg',
+ 'http://i.imgur.com/LkmcILl.jpg',
+ 'http://i.imgur.com/q9zO6tw.jpg'
+ ];
+
+ // create images
+ var fragment = document.createDocumentFragment();
+ for ( var i=0, len = imgUrls.length; i < len; i++ ) {
+ var img = document.createElement('img');
+ img.src = imgUrls[i];
+ fragment.appendChild( img );
+ }
+
+ var elem = document.querySelector('#append');
+ elem.appendChild( fragment );
+ var done = assert.async();
+
+ imagesLoaded( elem, { debug: false } ).on( 'always', function() {
+ assert.ok( 'appended images loaded' );
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/background.js b/vendor/desandro/imagesloaded/test/unit/background.js
new file mode 100644
index 000000000..ca76fad6f
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/background.js
@@ -0,0 +1,70 @@
+QUnit.test( 'background', function( assert ) {
+ 'use strict';
+
+ // from Modernizr
+ var supportsMultiBGs = ( function() {
+ var style = document.createElement('a').style;
+ style.cssText = 'background:url(https://),url(https://),red url(https://)';
+ return (/(url\s*\(.*?){3}/).test(style.background);
+ })();
+
+ var multiBGCount = supportsMultiBGs ? 3 : 0;
+ var done = assert.async( 14 + multiBGCount );
+
+ var imgLoad0 = imagesLoaded( '#background .tulip', { background: true }, function() {
+ assert.ok( true, 'callback triggered on .orange-tree');
+ done();
+ });
+ assert.equal( imgLoad0.images.length, 1, '1 image on .images' );
+
+ imgLoad0.on( 'progress', function( instance, image, element ) {
+ assert.ok( element.nodeName == 'DIV', 'progress; element is div');
+ assert.ok( image.isLoaded, 'progress; image.isLoaded');
+ done();
+ });
+
+ var imgLoad1 = imagesLoaded( '#background .thunder-cloud', { background: true }, function() {
+ assert.ok( true, 'callback triggered on .thunder-cloud');
+ done();
+ });
+ assert.equal( imgLoad1.images.length, 1, '1 image on .images' );
+
+ // multiple backgrounds
+ var imgLoad2 = imagesLoaded( '#background .multi', { background: true }, function() {
+ assert.ok( true, 'callback triggered on .multi');
+ done();
+ });
+ assert.equal( imgLoad2.images.length, multiBGCount, 'correct multiple BG count on .images' );
+
+ // multiple elements
+ var imgLoad3 = imagesLoaded( '#background .bg-box', { background: true }, function() {
+ assert.ok( true, 'callback triggered on .bg-box');
+ var count = 5 + multiBGCount;
+ assert.equal( imgLoad3.images.length, count, count + ' images on .bg-box' );
+ done();
+ });
+
+ imgLoad3.on('progress', function( instance, image/*, element */) {
+ assert.ok( true, 'progress on .bg-box; ' + image.img.src );
+ assert.equal( image.isLoaded, true, 'image.isLoaded == true' );
+ done();
+ });
+
+ // background and <img> children
+ var imgLoad4 = imagesLoaded( '#background .gulls', { background: true } );
+ assert.equal( imgLoad4.images.length, 3, '3 images: 1 background and 2 <img>' );
+
+ imgLoad4.on( 'progress', function( instance, image ) {
+ assert.equal( image.isLoaded, true, 'image is loaded' );
+ done();
+ });
+
+ // child background selector
+ var imgLoad5 = imagesLoaded( '#background', { background: '.bg-box' }, function() {
+ var count = 5 + multiBGCount;
+ assert.equal( imgLoad5.images.length, count,
+ count + ' images on .bg-box, with {background: .bg-box}' );
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/basics.js b/vendor/desandro/imagesloaded/test/unit/basics.js
new file mode 100644
index 000000000..6c502a793
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/basics.js
@@ -0,0 +1,28 @@
+QUnit.test( 'basics', function( assert ) {
+
+ 'use strict';
+
+ var elem = document.querySelector('#basics');
+ var images = elem.querySelectorAll('img');
+ var done = assert.async( 3 + images.length );
+
+ var imgLoader = new imagesLoaded( elem, function( obj ) {
+ assert.ok( true, 'callback function triggered' );
+ assert.equal( imgLoader, obj, 'callback argument and instance match' );
+ done();
+ });
+ imgLoader.on( 'done', function() {
+ assert.ok( true, 'done event triggered' );
+ done();
+ });
+ imgLoader.on( 'always', function() {
+ assert.ok( true, 'always event triggered' );
+ done();
+ });
+
+ imgLoader.on( 'progress', function( loader, image ) {
+ assert.ok( image.isLoaded, 'image is loaded');
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/data-uri.js b/vendor/desandro/imagesloaded/test/unit/data-uri.js
new file mode 100644
index 000000000..635f69859
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/data-uri.js
@@ -0,0 +1,10 @@
+QUnit.test( 'data-uri', function( assert ) {
+ 'use strict';
+
+ var done = assert.async();
+ imagesLoaded('#data-uri', { debug: false }).on( 'done', function( obj ) {
+ assert.ok( true, 'data-uri images loaded' );
+ assert.equal( obj.images.length, 2, 'instance has 2 images' );
+ done();
+ });
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/jquery-fail.js b/vendor/desandro/imagesloaded/test/unit/jquery-fail.js
new file mode 100644
index 000000000..b2180f6f2
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/jquery-fail.js
@@ -0,0 +1,29 @@
+QUnit.test( 'jquery fail', function( assert ) {
+
+ 'use strict';
+
+ var $ = window.jQuery;
+ var $images = $('#jquery-fail img');
+ var done = assert.async( 3 + $images.length );
+
+ $('#jquery-fail').imagesLoaded( function( instance ) {
+ assert.ok( true, 'callback triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .fail( function( instance ) {
+ assert.ok( true, 'fail triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .always( function( instance ) {
+ assert.ok( true, 'always triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .progress( function(/* instance, image */) {
+ assert.ok( true, 'progress trigged');
+ done();
+ });
+
+ });
diff --git a/vendor/desandro/imagesloaded/test/unit/jquery-success.js b/vendor/desandro/imagesloaded/test/unit/jquery-success.js
new file mode 100644
index 000000000..f16621088
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/jquery-success.js
@@ -0,0 +1,28 @@
+QUnit.test( 'jquery success', function( assert ) {
+
+ 'use strict';
+
+ var $ = window.jQuery;
+ var done = assert.async( 6 );
+
+ $('#jquery-success').imagesLoaded( function( instance ) {
+ assert.ok( true, 'callback triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .done( function( instance ) {
+ assert.ok( true, 'done triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .always( function( instance ) {
+ assert.ok( true, 'always triggered' );
+ assert.ok( instance instanceof imagesLoaded, 'instance instanceof imagesLoaded' );
+ done();
+ })
+ .progress( function( instance, image ) {
+ assert.ok( image.isLoaded, 'progress trigged, image is loaded');
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/local-files.js b/vendor/desandro/imagesloaded/test/unit/local-files.js
new file mode 100644
index 000000000..61da6ae92
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/local-files.js
@@ -0,0 +1,31 @@
+QUnit.test( 'local files', function( assert ) {
+ 'use strict';
+
+ var elem = document.querySelector('#locals');
+ var done = assert.async( 6 );
+
+ var imgLoader = new imagesLoaded( elem, function( obj ) {
+ assert.ok( true, 'callback function triggered' );
+ assert.equal( imgLoader, obj, 'callback argument and instance match' );
+ done();
+ });
+ imgLoader.on( 'fail', function() {
+ assert.ok( true, 'fail event triggered' );
+ done();
+ });
+ imgLoader.on( 'always', function() {
+ assert.ok( true, 'always event triggered' );
+ done();
+ });
+
+ imgLoader.on( 'progress', function( loader, image ) {
+ assert.ok( true, 'image progressed');
+ if ( image.img.src.indexOf('img/not-there.jpg') !== -1 ) {
+ assert.ok( !image.isLoaded, 'thunder cloud is not loaded' );
+ } else {
+ assert.ok( image.isLoaded, 'image is loaded' );
+ }
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/no-images.js b/vendor/desandro/imagesloaded/test/unit/no-images.js
new file mode 100644
index 000000000..841216381
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/no-images.js
@@ -0,0 +1,11 @@
+QUnit.test( 'no images', function( assert ) {
+ 'use strict';
+
+ var elem = document.querySelector('#no-images');
+ var done = assert.async();
+ imagesLoaded( elem, function() {
+ assert.ok( true, 'triggered with no images' );
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/non-element.js b/vendor/desandro/imagesloaded/test/unit/non-element.js
new file mode 100644
index 000000000..4c9986fa6
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/non-element.js
@@ -0,0 +1,24 @@
+QUnit.test( 'dismiss non-element nodes', function( assert ) {
+ 'use strict';
+
+ var $ = window.jQuery;
+ var done = assert.async( 2 );
+
+ $(' <img src="https://picsum.photos/401/301/?random" /> <img src="https://picsum.photos/402/302/?random" /> ')
+ .imagesLoaded(function() {
+ assert.ok( true, 'elements from jQuery string ok' );
+ done();
+ });
+
+ // test fragment
+ var frag = document.createDocumentFragment();
+ var img = new Image();
+ img.src = 'https://picsum.photos/403/303/?random';
+ frag.appendChild( img );
+ var imgLoad = imagesLoaded( frag, function() {
+ assert.ok( true, 'document fragment ok' );
+ assert.equal( imgLoad.images.length, 1, '1 image found' );
+ done();
+ });
+
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/selector-string.js b/vendor/desandro/imagesloaded/test/unit/selector-string.js
new file mode 100644
index 000000000..8c43c4bef
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/selector-string.js
@@ -0,0 +1,12 @@
+QUnit.test( 'selector string', function( assert ) {
+ 'use strict';
+ var images = document.querySelectorAll('#basics img');
+ var done = assert.async();
+ var imgLoad = imagesLoaded('#basics', { debug: true }).on( 'done', function( obj ) {
+ assert.ok( true, 'selector string worked' );
+ assert.ok( obj.images, 'argument has images' );
+ assert.equal( obj.images.length, images.length, 'images.length matches' );
+ done();
+ });
+ assert.ok( imgLoad.options.debug, 'debug option set' );
+});
diff --git a/vendor/desandro/imagesloaded/test/unit/single-element.js b/vendor/desandro/imagesloaded/test/unit/single-element.js
new file mode 100644
index 000000000..42d7e48ee
--- /dev/null
+++ b/vendor/desandro/imagesloaded/test/unit/single-element.js
@@ -0,0 +1,11 @@
+QUnit.test( 'single element', function( assert ) {
+ 'use strict';
+ var elem = document.querySelector('#mario-with-shell');
+ var done = assert.async();
+ imagesLoaded( elem ).on( 'done', function( obj ) {
+ assert.ok( true, 'single element worked' );
+ assert.ok( obj.images, 'argument has images' );
+ assert.equal( obj.images.length, 1, 'images.length = 1' );
+ done();
+ });
+});
diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po
index 3b42394b1..67cb21672 100644
--- a/view/es-es/hmessages.po
+++ b/view/es-es/hmessages.po
@@ -15,7 +15,7 @@ msgstr ""
"Project-Id-Version: hubzilla\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-19 11:04+0200\n"
-"PO-Revision-Date: 2018-10-24 11:35+0000\n"
+"PO-Revision-Date: 2018-11-21 11:04+0000\n"
"Last-Translator: Manuel Jiménez Friaza <mjfriaza@disroot.org>\n"
"Language-Team: Spanish (Spain) (http://www.transifex.com/Friendica/hubzilla/language/es_ES/)\n"
"MIME-Version: 1.0\n"
@@ -1729,7 +1729,7 @@ msgstr "Importar elementos"
#: ../../Zotlabs/Module/Import_items.php:126
msgid ""
"Use this form to import existing posts and content from an export file."
-msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación."
+msgstr "Utilice este formulario para importar entradas y contenido desde un archivo de exportación."
#: ../../Zotlabs/Module/Import_items.php:127
#: ../../Zotlabs/Module/Import.php:548
@@ -1807,7 +1807,7 @@ msgstr "Un canal es una identidad única en la red. Puede representar a una pers
#: ../../Zotlabs/Module/New_channel.php:183
msgid ""
"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "O <a href=\"import\">importar un canal existente</a> desde otro lugar."
+msgstr "O <a href=\"import\">importar un canal </a> desde otro lugar."
#: ../../Zotlabs/Module/New_channel.php:188
msgid "Validate"
@@ -4496,7 +4496,7 @@ msgid ""
"Leave blank to keep your existing channel nickname. You will be randomly "
"assigned a similar nickname if either name is already allocated on this "
"site."
-msgstr "Dejar en blanco para mantener su alias de canal existente. Se le asignará aleatoriamente uno similar si cualquiera de los dos nombres ya está asignado en este sitio."
+msgstr "Dejar en blanco para mantener su alias de canal . Se le asignará aleatoriamente uno similar si cualquiera de los dos nombres ya está asignado en este sitio."
#: ../../Zotlabs/Module/Import.php:562
msgid ""
@@ -4942,7 +4942,7 @@ msgstr "Introducir un nombre de álbum"
#: ../../Zotlabs/Module/Photos.php:698
msgid "or select an existing album (doubleclick)"
-msgstr "o seleccionar uno existente (doble click)"
+msgstr "o seleccionar un álbum (con un doble click)"
#: ../../Zotlabs/Module/Photos.php:699
msgid "Create a status post for this upload"
@@ -5010,7 +5010,7 @@ msgstr "Introducir un nuevo nombre de álbum"
#: ../../Zotlabs/Module/Photos.php:1067
msgid "or select an existing one (doubleclick)"
-msgstr "o seleccionar uno (doble click) existente"
+msgstr "o seleccionar un álbum (con un doble click)"
#: ../../Zotlabs/Module/Photos.php:1072
msgid "Add a Tag"
@@ -5557,7 +5557,7 @@ msgstr "Usar una foto de sus álbumes"
#: ../../Zotlabs/Module/Profile_photo.php:474
#: ../../Zotlabs/Module/Cover_photo.php:409
msgid "Select existing photo"
-msgstr "Seleccionar una foto existente"
+msgstr "Seleccionar una foto"
#: ../../Zotlabs/Module/Profile_photo.php:493
#: ../../Zotlabs/Module/Cover_photo.php:426
@@ -8443,7 +8443,7 @@ msgid ""
"A deleted group with this name was revived. Existing item permissions "
"<strong>may</strong> apply to this group and any future members. If this is "
"not what you intended, please create another group with a different name."
-msgstr "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."
+msgstr "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos que ya existen sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."
#: ../../Zotlabs/Lib/Group.php:270 ../../include/group.php:264
msgid "Add new connections to this privacy group"
@@ -11149,11 +11149,11 @@ msgstr "Por favor visite el sitio web de $Projectname"
#: ../../addon/upgrade_info/upgrade_info.php:46
msgid "app store"
-msgstr "depósito de apps"
+msgstr "aplicaciones disponibles"
#: ../../addon/upgrade_info/upgrade_info.php:47
msgid "and install possibly missing apps."
-msgstr "e instalar aplicaciones que posiblemente falten."
+msgstr "e instale las aplicaciones que posiblemente falten."
#: ../../addon/upgrade_info/upgrade_info.php:52
msgid "Upgrade Info"
@@ -11364,7 +11364,7 @@ msgstr "Eliminar los datos de localización geográfica del navegador"
#: ../../addon/hsse/hsse.php:99 ../../include/conversation.php:1302
msgid "Embed (existing) photo from your photo albums"
-msgstr "Insertar (existente) foto de sus álbumes de fotos"
+msgstr "Insertar una foto de sus álbumes"
#: ../../addon/hsse/hsse.php:135 ../../include/conversation.php:1338
msgid "Tag term:"
@@ -12247,7 +12247,7 @@ msgstr "Crear nuevos eventos aquí."
msgid ""
"You can accept new connections and change permissions for existing ones "
"here. You can also e.g. create groups of contacts."
-msgstr "Puede aceptar nuevas conexiones y cambiar permisos para las existentes aquí. También puede, por ejemplo, crear grupos de contactos."
+msgstr "Puede aceptar nuevas conexiones y cambiar permisos para las que ya existen aquí. También puede, por ejemplo, crear grupos de contactos."
#: ../../addon/tour/tour.php:82
msgid "System notifications will arrive here"
@@ -14455,7 +14455,7 @@ msgstr "Etiquetas de la comunidad"
#: ../../include/features.php:143
msgid "Ability to tag existing posts"
-msgstr "Capacidad de etiquetar entradas existentes"
+msgstr "Capacidad de etiquetar entradas"
#: ../../include/features.php:150
msgid "Emoji Reactions"
diff --git a/view/es-es/hstrings.php b/view/es-es/hstrings.php
index a459e10dd..67f499feb 100644
--- a/view/es-es/hstrings.php
+++ b/view/es-es/hstrings.php
@@ -2,10 +2,10 @@
if(! function_exists("string_plural_select_es_es")) {
function string_plural_select_es_es($n){
- return ($n != 1 ? 1 : 0);
+ return ($n != 1 ? 1 : 0);;
}}
App::$rtl = 0;
-App::$strings["plural_function_code"] = "(n != 1 ? 1 : 0)";
+App::$strings["plural_function_code"] = "(n != 1 ? 1 : 0);";
App::$strings["Can view my channel stream and posts"] = "Pueden verse la actividad y publicaciones de mi canal";
App::$strings["Can send me their channel stream and posts"] = "Se me pueden enviar entradas y contenido de un canal";
App::$strings["Can view my default channel profile"] = "Puede verse mi perfil de canal predeterminado.";
@@ -300,7 +300,7 @@ App::$strings["Imported file is empty."] = "El fichero importado está vacío.";
App::$strings["Warning: Database versions differ by %1\$d updates."] = "Atención: Las versiones de la base de datos difieren en %1\$d actualizaciones.";
App::$strings["Import completed"] = "Importación completada";
App::$strings["Import Items"] = "Importar elementos";
-App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación.";
+App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas y contenido desde un archivo de exportación.";
App::$strings["File to Upload"] = "Fichero para subir";
App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Ha creado %1$.0f de %2$.0f canales permitidos.";
App::$strings["Loading"] = "Cargando";
@@ -315,7 +315,7 @@ App::$strings["Select a channel permission role compatible with your usage needs
App::$strings["Read more about channel permission roles"] = "Leer más sobre los roles y permisos";
App::$strings["Create a Channel"] = "Crear un canal";
App::$strings["A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things."] = "Un canal es una identidad única en la red. Puede representar a una persona (un perfil de una red social), un foro o grupo, un negocio o una página de una celebridad, un \"feed\" de noticias, y muchas otras cosas.";
-App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "O <a href=\"import\">importar un canal existente</a> desde otro lugar.";
+App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "O <a href=\"import\">importar un canal </a> desde otro lugar.";
App::$strings["Validate"] = "Validar";
App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña.";
App::$strings["Remove This Channel"] = "Eliminar este canal";
@@ -914,7 +914,7 @@ App::$strings["For either option, please choose whether to make this hub your ne
App::$strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
App::$strings["Move this channel (disable all previous locations)"] = "Mover este canal (desactivar todas las ubicaciones anteriores)";
App::$strings["Use this channel nickname instead of the one provided"] = "Usa este alias de canal en lugar del que se proporciona";
-App::$strings["Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site."] = "Dejar en blanco para mantener su alias de canal existente. Se le asignará aleatoriamente uno similar si cualquiera de los dos nombres ya está asignado en este sitio.";
+App::$strings["Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site."] = "Dejar en blanco para mantener su alias de canal . Se le asignará aleatoriamente uno similar si cualquiera de los dos nombres ya está asignado en este sitio.";
App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
App::$strings["Authentication failed."] = "Falló la autenticación.";
App::$strings["Remote Authentication"] = "Acceso desde su servidor";
@@ -1014,7 +1014,7 @@ App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.
App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
App::$strings["Upload Photos"] = "Subir fotos";
App::$strings["Enter an album name"] = "Introducir un nombre de álbum";
-App::$strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
+App::$strings["or select an existing album (doubleclick)"] = "o seleccionar un álbum (con un doble click)";
App::$strings["Create a status post for this upload"] = "Crear un mensaje de estado para esta subida";
App::$strings["Description (optional)"] = "Descripción (opcional)";
App::$strings["Show Newest First"] = "Mostrar lo más reciente primero";
@@ -1031,7 +1031,7 @@ App::$strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
App::$strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
App::$strings["Move photo to album"] = "Mover la foto a un álbum";
App::$strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
-App::$strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
+App::$strings["or select an existing one (doubleclick)"] = "o seleccionar un álbum (con un doble click)";
App::$strings["Add a Tag"] = "Añadir una etiqueta";
App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
App::$strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
@@ -1153,7 +1153,7 @@ App::$strings["Use Photo for Profile"] = "Usar la fotografía para el perfil";
App::$strings["Change Profile Photo"] = "Cambiar la foto del perfil";
App::$strings["Use"] = "Usar";
App::$strings["Use a photo from your albums"] = "Usar una foto de sus álbumes";
-App::$strings["Select existing photo"] = "Seleccionar una foto existente";
+App::$strings["Select existing photo"] = "Seleccionar una foto";
App::$strings["Crop Image"] = "Recortar imagen";
App::$strings["Please adjust the image cropping for optimum viewing."] = "Por favor ajuste el recorte de la imagen para una visión óptima.";
App::$strings["Done Editing"] = "Edición completada";
@@ -1829,7 +1829,7 @@ App::$strings["Directory Options"] = "Opciones del directorio";
App::$strings["Safe Mode"] = "Modo seguro";
App::$strings["Public Forums Only"] = "Solo foros públicos";
App::$strings["This Website Only"] = "Solo este sitio web";
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos que ya existen sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales";
App::$strings["edit"] = "editar";
App::$strings["Edit group"] = "Editar grupo";
@@ -2458,8 +2458,8 @@ App::$strings["Jappix Mini Settings"] = "Ajustes de Jappix Mini";
App::$strings["Your channel has been upgraded to the latest \$Projectname version."] = "Su canal ha sido actualizado a la última versión de \$Projectname.";
App::$strings["To improve usability, we have converted some features into installable stand-alone apps."] = "Para mejorar la usabilidad, hemos convertido algunas características en aplicaciones independientes instalables.";
App::$strings["Please visit the \$Projectname"] = "Por favor visite el sitio web de \$Projectname";
-App::$strings["app store"] = "depósito de apps";
-App::$strings["and install possibly missing apps."] = "e instalar aplicaciones que posiblemente falten.";
+App::$strings["app store"] = "aplicaciones disponibles";
+App::$strings["and install possibly missing apps."] = "e instale las aplicaciones que posiblemente falten.";
App::$strings["Upgrade Info"] = "Información de actualización";
App::$strings["Do not show this again"] = "No mostrar esto de nuevo";
App::$strings["Access Denied"] = "Acceso denegado";
@@ -2509,7 +2509,7 @@ App::$strings["WYSIWYG status editor"] = "Editor de estado de WYSIWYG";
App::$strings["WYSIWYG Status"] = "Estado de WYSIWYG";
App::$strings["Set your location"] = "Establecer su ubicación";
App::$strings["Clear browser location"] = "Eliminar los datos de localización geográfica del navegador";
-App::$strings["Embed (existing) photo from your photo albums"] = "Insertar (existente) foto de sus álbumes de fotos";
+App::$strings["Embed (existing) photo from your photo albums"] = "Insertar una foto de sus álbumes";
App::$strings["Tag term:"] = "Término de la etiqueta:";
App::$strings["Where are you right now?"] = "¿Donde está ahora?";
App::$strings["Choose a different album..."] = "Elegir un álbum diferente...";
@@ -2706,7 +2706,7 @@ App::$strings["Click here to see activity from your connections."] = "Pulsar aqu
App::$strings["Click here to see your channel home."] = "Pulsar aquí para ver la página de inicio de su canal.";
App::$strings["You can access your private messages from here."] = "Puede acceder a sus mensajes privados desde aquí.";
App::$strings["Create new events here."] = "Crear nuevos eventos aquí.";
-App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Puede aceptar nuevas conexiones y cambiar permisos para las existentes aquí. También puede, por ejemplo, crear grupos de contactos.";
+App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Puede aceptar nuevas conexiones y cambiar permisos para las que ya existen aquí. También puede, por ejemplo, crear grupos de contactos.";
App::$strings["System notifications will arrive here"] = "Las notificaciones del sistema llegarán aquí";
App::$strings["Search for content and users"] = "Buscar contenido y usuarios";
App::$strings["Browse for new contacts"] = "Buscar nuevos contactos";
@@ -3270,7 +3270,7 @@ App::$strings["Connection Filtering"] = "Filtrado de conexiones";
App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido";
App::$strings["Conversation"] = "Conversación";
App::$strings["Community Tagging"] = "Etiquetas de la comunidad";
-App::$strings["Ability to tag existing posts"] = "Capacidad de etiquetar entradas existentes";
+App::$strings["Ability to tag existing posts"] = "Capacidad de etiquetar entradas";
App::$strings["Emoji Reactions"] = "Emoticonos \"emoji\"";
App::$strings["Add emoji reaction ability to posts"] = "Activar la capacidad de añadir un emoticono \"emoji\" a las entradas";
App::$strings["Dislike Posts"] = "Desagrado de publicaciones";
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index dd8dcb5ee..73e559c45 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -36,7 +36,7 @@ head_add_js('/library/colorbox/jquery.colorbox-min.js');
head_add_js('/library/jquery.AreYouSure/jquery.are-you-sure.js');
head_add_js('/library/tableofcontents/jquery.toc.js');
-head_add_js('/library/imagesloaded/imagesloaded.pkgd.min.js');
+head_add_js('/vendor/desandro/imagesloaded/imagesloaded.pkgd.min.js');
/**
* Those who require this feature will know what to do with it.
* Those who don't, won't.