From 2f291782cf693cc66df3cc222fa92948ce714725 Mon Sep 17 00:00:00 2001 From: Glen Cheney Date: Tue, 26 Sep 2017 10:49:01 -0700 Subject: [PATCH] Release at Tue Sep 26 10:49:01 PDT 2017 --- index.html | 2 +- service-worker.js | 2 +- ...a903b0b1d.css => app.5cace79d77269dfef6f8fd78b1afb458.css} | 2 +- static/css/app.5cace79d77269dfef6f8fd78b1afb458.css.map | 1 + static/css/app.a43ead4422323592cc50eaaa903b0b1d.css.map | 1 - static/js/app.38b0b83eac4be948b9a2.js | 2 -- static/js/app.38b0b83eac4be948b9a2.js.map | 1 - static/js/app.bb7a709aed964124cabe.js | 2 ++ static/js/app.bb7a709aed964124cabe.js.map | 1 + ...17c5dbf72b6c68bfc8.js => manifest.bf2d21396bc74945e79a.js} | 4 ++-- ...2b6c68bfc8.js.map => manifest.bf2d21396bc74945e79a.js.map} | 2 +- 11 files changed, 10 insertions(+), 10 deletions(-) rename static/css/{app.a43ead4422323592cc50eaaa903b0b1d.css => app.5cace79d77269dfef6f8fd78b1afb458.css} (77%) create mode 100644 static/css/app.5cace79d77269dfef6f8fd78b1afb458.css.map delete mode 100644 static/css/app.a43ead4422323592cc50eaaa903b0b1d.css.map delete mode 100644 static/js/app.38b0b83eac4be948b9a2.js delete mode 100644 static/js/app.38b0b83eac4be948b9a2.js.map create mode 100644 static/js/app.bb7a709aed964124cabe.js create mode 100644 static/js/app.bb7a709aed964124cabe.js.map rename static/js/{manifest.b617c5dbf72b6c68bfc8.js => manifest.bf2d21396bc74945e79a.js} (61%) rename static/js/{manifest.b617c5dbf72b6c68bfc8.js.map => manifest.bf2d21396bc74945e79a.js.map} (95%) diff --git a/index.html b/index.html index daf3a38..bd6ffb4 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -compdrop – preview designs in the browser
\ No newline at end of file +compdrop – preview designs in the browser
\ No newline at end of file diff --git a/service-worker.js b/service-worker.js index 02c5c5e..46d4cd5 100644 --- a/service-worker.js +++ b/service-worker.js @@ -1 +1 @@ -"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}var precacheConfig=[["index.html","58423120e4627e4ca3c0cd9270a23dfc"],["service-worker.js","e298cade94714c5fa355f8a1c95de9ae"],["static/css/app.a43ead4422323592cc50eaaa903b0b1d.css","d801215bc915d519cc285acd4ffe8762"],["static/js/app.38b0b83eac4be948b9a2.js","f8ead991a902fbb0d5b513f677947c2d"],["static/js/manifest.b617c5dbf72b6c68bfc8.js","d50d0565a0cbfd342334fd6941dceaa2"],["static/js/vendor.6b4f607634398d2e7080.js","a4c6f38763cf24acfbdca5b24d94a283"]],cacheName="sw-precache-v3-my-vue-app-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,r){var a=new URL(e);return r&&a.pathname.match(r)||(a.search+=(a.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.hash="",n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),a=createCacheKey(r,hashParamName,n,!1);return[r.toString(),a]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var r=new Request(n,{credentials:"same-origin"});return fetch(r).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);(t=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}); \ No newline at end of file +"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}var precacheConfig=[["index.html","628caa40019b2af69b30a4d277455aa9"],["service-worker.js","cb15e2317e4ab57c470cbd293242e6f6"],["static/css/app.5cace79d77269dfef6f8fd78b1afb458.css","3a0531db24a98f8f4fec942bbcca2fd6"],["static/js/app.bb7a709aed964124cabe.js","d502d9cf9219f5cfa1b484fdf23eabec"],["static/js/manifest.bf2d21396bc74945e79a.js","2ca356ad814920210c0a56d1a0e678bd"],["static/js/vendor.6b4f607634398d2e7080.js","a4c6f38763cf24acfbdca5b24d94a283"]],cacheName="sw-precache-v3-my-vue-app-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,r){var a=new URL(e);return r&&a.pathname.match(r)||(a.search+=(a.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.hash="",n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),a=createCacheKey(r,hashParamName,n,!1);return[r.toString(),a]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var r=new Request(n,{credentials:"same-origin"});return fetch(r).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);(t=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}); \ No newline at end of file diff --git a/static/css/app.a43ead4422323592cc50eaaa903b0b1d.css b/static/css/app.5cace79d77269dfef6f8fd78b1afb458.css similarity index 77% rename from static/css/app.a43ead4422323592cc50eaaa903b0b1d.css rename to static/css/app.5cace79d77269dfef6f8fd78b1afb458.css index 4cd894b..7442d13 100644 --- a/static/css/app.a43ead4422323592cc50eaaa903b0b1d.css +++ b/static/css/app.5cace79d77269dfef6f8fd78b1afb458.css @@ -1 +1 @@ -.layout-centered main{overflow:hidden}.user-inactive .fade-when-inactive{opacity:0}body.odo-dialog-open{position:relative;overflow:hidden}.odo-dialog{position:fixed;z-index:1050;top:0;left:0;right:0;bottom:0;display:none;overflow-x:hidden;overflow-y:auto;width:100%;height:100%;height:100vh;-webkit-overflow-scrolling:touch;transition:transform .25s ease,opacity .25s ease}.odo-dialog--open{display:-webkit-box;display:-ms-flexbox;display:flex}.odo-dialog--visible{will-change:transform}.odo-dialog--visible,.odo-dialog--visible+.odo-dialog-backdrop{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.odo-dialog__element:focus{outline:0}.odo-dialog-backdrop{position:fixed;z-index:1040;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.75);transition:opacity .25s ease-out}.odo-dialog--enter+.odo-dialog-backdrop,.odo-dialog--leave-active+.odo-dialog-backdrop{opacity:0}.odo-dialog__content{position:relative;z-index:1;margin:auto}.odo-dialog--enter,.odo-dialog--leave{will-change:transform,opacity}.odo-dialog--enter,.odo-dialog--leave-active{opacity:0;-webkit-transform:scale(1.05);transform:scale(1.05)}.odo-dialog--fade.odo-dialog--enter,.odo-dialog--fade.odo-dialog--leave-active{-webkit-transform:none;transform:none}.odo-dialog--zoom-in.odo-dialog--enter,.odo-dialog--zoom-in.odo-dialog--leave-active{-webkit-transform:scale(.9);transform:scale(.9)}.odo-dialog--full .odo-dialog__content,.odo-dialog--full .odo-dialog__inner{width:inherit;height:inherit;margin:0}.odo-dialog__inner{position:relative;margin-top:2.5vh;margin-bottom:2.5vh;background-color:#fff}.odo-dialog__close{position:absolute;top:0;right:0;display:block;width:40px;height:40px;padding:0;border:0;background-color:transparent;font-weight:700;font-size:32px;text-align:center;line-height:1;cursor:pointer;transition:.15s ease}html{box-sizing:border-box;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}body{margin:0;color:#404040;background-color:#f0f0f0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:1.4}img,main{display:block}img{max-width:100%}.type-header-1,.type-header-2,.type-header-3{margin-top:0;margin-bottom:.5em;font-weight:400;color:#262626}.type-header-1{font-size:2em}.type-header-2{font-size:1.5em}.type-header-3{font-size:1.17em}.container{width:93%;margin-left:auto;margin-right:auto}.row{display:grid;grid-template-columns:repeat(6,1fr);grid-gap:16px}.col-6\@xs{grid-column:span 6}.col-5\@xs{grid-column:span 5}.col-4\@xs{grid-column:span 4}.col-3\@xs{grid-column:span 3}.col-2\@xs{grid-column:span 2}.col-1\@xs{grid-column:span 1}@media screen and (min-width:768px){.container{width:86%;max-width:1200px}.row{grid-template-columns:repeat(12,1fr)}.col-1\@sm{grid-column:span 1}.col-2\@sm{grid-column:span 2}.col-3\@sm{grid-column:span 3}.col-4\@sm{grid-column:span 4}.col-5\@sm{grid-column:span 5}.col-6\@sm{grid-column:span 6}.col-7\@sm{grid-column:span 7}.col-8\@sm{grid-column:span 8}.col-9\@sm{grid-column:span 9}.col-10\@sm{grid-column:span 10}.col-11\@sm{grid-column:span 11}.col-12\@sm{grid-column:span 12}.type-header-1,.type-header-2{font-size:2.25em}.type-header-3{font-size:1.75em}}.unstyled-list{margin:0;padding-left:0;list-style-type:none}.hidden{display:none!important}.type--center{text-align:center}.marginless{margin:0!important}.floating-button{position:fixed;z-index:1;top:12px;width:32px;height:32px}.floating-button button{width:inherit;height:inherit;border:0;padding:0;background-color:transparent;cursor:pointer;transition:opacity .2s ease-out}.floating-button svg{display:block;width:inherit;height:inherit;fill:#fff;filter:drop-shadow(0 0 2px rgba(0,0,0,.3))}.odo-dialog__inner{border-radius:12px;overflow:hidden}.odo-dialog__close{top:16px;right:12px;color:#404040}.dialog-header{padding:12px 24px;background-color:#fff}.dialog-content{padding:12px 24px;background-color:#f7f7f7}.btn{position:relative;display:inline-block;padding:10px 20px;border-bottom:5px solid #3f976d;margin-bottom:0;border-radius:10px;font-size:20px;color:#fff;text-decoration:none;background-color:#4dba87;text-shadow:0 -2px #3f976d;cursor:pointer}.btn:active{transform:translateY(5px);border-bottom-width:1px;margin-bottom:4px}@media screen and (max-width:767px){.dialog-content,.dialog-header{padding-left:16px;padding-right:16px}}.welcome-screen{display:block;padding:52px 40px;height:100vh}.welcome-screen__inner{border:5px dashed #bdbdbd;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;background-color:#fff;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:12px;overflow:hidden}.welcome-screen--can-drop .welcome-screen__inner{border-style:solid;border-color:#3cb371}.welcome-screen__text{margin:0}.welcome-screen__file-input{position:absolute;opacity:0;width:1px}@media screen and (max-width:767px){.welcome-screen{padding-left:16px;padding-right:16px}}.loading-screen{position:relative;z-index:1100;display:block;height:100vh}.loading-screen__inner{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;background-color:rgba(0,0,0,.8);-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden}.loading-screen__text{color:#fff}.image-viewer{position:relative;min-height:100vh;background-color:#f0f0f0}.image-viewer__images{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.layout-centered .image-viewer__images{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.image-viewer__wrap{-webkit-transform-origin:top center;transform-origin:top center}.image-viewer__img{max-width:none}.nav-button{position:fixed;top:50%;display:block;border:0;margin-top:-30px;padding:0;width:60px;height:60px;cursor:pointer;background-color:rgba(0,0,0,.2);border-radius:50%;transition:.2s ease-out;will-change:transform}.nav-button--prev{left:12px}.nav-button--next{right:12px}.nav-button:hover{background-color:rgba(0,0,0,.3)}.nav-button svg{display:block;margin-left:11px;width:40px;height:40px;fill:#fff;transition:.2s ease-out}.nav-button:hover svg{-webkit-transform:scale(1.1);transform:scale(1.1)}.nav-button--prev svg{margin-left:8px}.help-menu{right:12px}.settings-menu{right:52px}.collections-menu{right:90px}.collections-menu__title{margin-top:.5em}.dialog-content>:first-child .collections-menu__title{margin-top:0}.collections-menu__thumb-btn{padding:0;border:0;background:none;cursor:pointer}.collections-menu__thumb--selected{border:4px solid #3cb371}kbd{display:inline-block;vertical-align:middle;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;color:#333;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 2px #fff;border-radius:3px;background-color:#f7f7f7;text-shadow:0 1px 0 #fff;line-height:1;font-size:11px;white-space:nowrap}.shortcut-list{display:grid;grid-template-columns:repeat(2,minmax(auto,-webkit-max-content));grid-template-columns:repeat(2,minmax(auto,max-content))}.shortcut-item__triggers{grid-column:1;justify-self:flex-end}.shortcut-item__description{grid-column:2;margin-top:1px;margin-left:8px} \ No newline at end of file +.layout-centered main{overflow:hidden}.user-inactive .fade-when-inactive{opacity:0}body.odo-dialog-open{position:relative;overflow:hidden}.odo-dialog{position:fixed;z-index:1050;top:0;left:0;right:0;bottom:0;display:none;overflow-x:hidden;overflow-y:auto;width:100%;height:100%;height:100vh;-webkit-overflow-scrolling:touch;transition:transform .25s ease,opacity .25s ease}.odo-dialog--open{display:-webkit-box;display:-ms-flexbox;display:flex}.odo-dialog--visible{will-change:transform}.odo-dialog--visible,.odo-dialog--visible+.odo-dialog-backdrop{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.odo-dialog__element:focus{outline:0}.odo-dialog-backdrop{position:fixed;z-index:1040;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.75);transition:opacity .25s ease-out}.odo-dialog--enter+.odo-dialog-backdrop,.odo-dialog--leave-active+.odo-dialog-backdrop{opacity:0}.odo-dialog__content{position:relative;z-index:1;margin:auto}.odo-dialog--enter,.odo-dialog--leave{will-change:transform,opacity}.odo-dialog--enter,.odo-dialog--leave-active{opacity:0;-webkit-transform:scale(1.05);transform:scale(1.05)}.odo-dialog--fade.odo-dialog--enter,.odo-dialog--fade.odo-dialog--leave-active{-webkit-transform:none;transform:none}.odo-dialog--zoom-in.odo-dialog--enter,.odo-dialog--zoom-in.odo-dialog--leave-active{-webkit-transform:scale(.9);transform:scale(.9)}.odo-dialog--full .odo-dialog__content,.odo-dialog--full .odo-dialog__inner{width:inherit;height:inherit;margin:0}.odo-dialog__inner{position:relative;margin-top:2.5vh;margin-bottom:2.5vh;background-color:#fff}.odo-dialog__close{position:absolute;top:0;right:0;display:block;width:40px;height:40px;padding:0;border:0;background-color:transparent;font-weight:700;font-size:32px;text-align:center;line-height:1;cursor:pointer;transition:.15s ease}html{box-sizing:border-box;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}body{margin:0;color:#404040;background-color:#f0f0f0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:1.4}img,main{display:block}img{max-width:100%}.type-header-1,.type-header-2,.type-header-3{margin-top:0;margin-bottom:.5em;font-weight:400;color:#262626}.type-header-1{font-size:2em}.type-header-2{font-size:1.5em}.type-header-3{font-size:1.17em}.container{width:93%;margin-left:auto;margin-right:auto}.row{display:grid;grid-template-columns:repeat(6,1fr);grid-gap:16px}.col-6\@xs{grid-column:span 6}.col-5\@xs{grid-column:span 5}.col-4\@xs{grid-column:span 4}.col-3\@xs{grid-column:span 3}.col-2\@xs{grid-column:span 2}.col-1\@xs{grid-column:span 1}@media screen and (min-width:768px){.container{width:86%;max-width:1200px}.row{grid-template-columns:repeat(12,1fr)}.col-1\@sm{grid-column:span 1}.col-2\@sm{grid-column:span 2}.col-3\@sm{grid-column:span 3}.col-4\@sm{grid-column:span 4}.col-5\@sm{grid-column:span 5}.col-6\@sm{grid-column:span 6}.col-7\@sm{grid-column:span 7}.col-8\@sm{grid-column:span 8}.col-9\@sm{grid-column:span 9}.col-10\@sm{grid-column:span 10}.col-11\@sm{grid-column:span 11}.col-12\@sm{grid-column:span 12}.type-header-1,.type-header-2{font-size:2.25em}.type-header-3{font-size:1.75em}}.unstyled-list{margin:0;padding-left:0;list-style-type:none}.hidden{display:none!important}.type--center{text-align:center}.marginless{margin:0!important}.floating-button{position:fixed;z-index:1;top:12px;width:32px;height:32px}.floating-button button{width:inherit;height:inherit;border:0;padding:0;background-color:transparent;cursor:pointer;transition:opacity .2s ease-out}.floating-button svg{display:block;width:inherit;height:inherit;fill:#fff;filter:drop-shadow(0 0 2px rgba(0,0,0,.3))}.odo-dialog__inner{border-radius:12px;overflow:hidden}.odo-dialog__close{top:16px;right:12px;color:#404040}.dialog-header{padding:12px 24px;background-color:#fff}.dialog-content{padding:12px 24px;background-color:#f7f7f7}.btn{position:relative;display:inline-block;padding:10px 20px;border-bottom:5px solid #3f976d;margin-bottom:0;border-radius:10px;font-size:20px;color:#fff;text-decoration:none;background-color:#4dba87;text-shadow:0 -2px #3f976d;cursor:pointer}.btn:active{transform:translateY(5px);border-bottom-width:1px;margin-bottom:4px}@media screen and (max-width:767px){.dialog-content,.dialog-header{padding-left:16px;padding-right:16px}}.welcome-screen{display:block;padding:52px 40px;height:100vh}.welcome-screen__inner{border:5px dashed #bdbdbd;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;background-color:#fff;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:12px;overflow:hidden}.welcome-screen--can-drop .welcome-screen__inner{border-style:solid;border-color:#3cb371}.welcome-screen__text{margin:0}.welcome-screen__file-input{position:absolute;opacity:0;width:1px}@media screen and (max-width:767px){.welcome-screen{padding-left:16px;padding-right:16px}}.loading-screen{position:relative;z-index:1100;display:block;height:100vh}.loading-screen__inner{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;background-color:rgba(0,0,0,.8);-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden}.loading-screen__text{color:#fff}.image-viewer{position:relative;min-height:100vh;background-color:#f0f0f0}.image-viewer__images{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.layout-centered .image-viewer__images{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.layout-centered .image-viewer__wrap{-webkit-transform-origin:top center;transform-origin:top center}.image-viewer__wrap{-webkit-transform-origin:top left;transform-origin:top left}.image-viewer__img{max-width:none}.nav-button{position:fixed;top:50%;display:block;border:0;margin-top:-30px;padding:0;width:60px;height:60px;cursor:pointer;background-color:rgba(0,0,0,.2);border-radius:50%;transition:.2s ease-out;will-change:transform}.nav-button--prev{left:12px}.nav-button--next{right:12px}.nav-button:hover{background-color:rgba(0,0,0,.3)}.nav-button svg{display:block;margin-left:11px;width:40px;height:40px;fill:#fff;transition:.2s ease-out}.nav-button:hover svg{-webkit-transform:scale(1.1);transform:scale(1.1)}.nav-button--prev svg{margin-left:8px}.help-menu{right:12px}.settings-menu{right:52px}.collections-menu{right:90px}.collections-menu__title{margin-top:.5em}.dialog-content>:first-child .collections-menu__title{margin-top:0}.collections-menu__thumb-btn{padding:0;border:0;background:none;cursor:pointer}.collections-menu__thumb--selected{border:4px solid #3cb371}kbd{display:inline-block;vertical-align:middle;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;color:#333;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 2px #fff;border-radius:3px;background-color:#f7f7f7;text-shadow:0 1px 0 #fff;line-height:1;font-size:11px;white-space:nowrap}.shortcut-list{display:grid;grid-template-columns:repeat(2,minmax(auto,-webkit-max-content));grid-template-columns:repeat(2,minmax(auto,max-content))}.shortcut-item__triggers{grid-column:1;justify-self:flex-end}.shortcut-item__description{grid-column:2;margin-top:1px;margin-left:8px} \ No newline at end of file diff --git a/static/css/app.5cace79d77269dfef6f8fd78b1afb458.css.map b/static/css/app.5cace79d77269dfef6f8fd78b1afb458.css.map new file mode 100644 index 0000000..e7bab4f --- /dev/null +++ b/static/css/app.5cace79d77269dfef6f8fd78b1afb458.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/App.vue","webpack:///./node_modules/@odopod/odo-dialog/css/odo-dialog.css","webpack:///./src/styles.css","webpack:///./src/components/WelcomeScreen.vue","webpack:///./src/components/LoadingScreen.vue","webpack:///./src/components/ImageViewer.vue","webpack:///./src/components/HelpMenu.vue","webpack:///./src/components/SettingsMenu.vue","webpack:///./src/components/CollectionsMenu.vue","webpack:///./src/components/KeyboardShortcuts.vue"],"names":[],"mappings":"AACA,sBACE,eAAiB,CAEnB,mCACE,SAAW,CCLb,qBACE,kBACA,eAAiB,CAGnB,YACE,eACA,aACA,MACA,OACA,QACA,SACA,aACA,kBACA,gBACA,WACA,YACA,aAEA,iCACA,yDACA,gDAAqD,CAGvD,kBACE,oBACA,oBACA,YAAc,CAIhB,qBACE,qBAAuB,CAOzB,+DANE,gCACQ,wBACR,mCACQ,0BAA4B,CActC,2BACE,SAAW,CAGb,qBACE,eACA,aACA,MACA,QACA,SACA,OACA,WACA,YACA,2BACA,yCACQ,gCAAmC,CAG7C,uFAEE,SAAW,CAGb,qBACE,kBACA,UACA,WAAa,CAGf,sCAEE,6BAAgC,CAIlC,6CAEE,UACA,8BACQ,qBAAuB,CAIjC,+EAEE,uBACQ,cAAgB,CAI1B,qFAEE,4BACQ,mBAAsB,CAGhC,4EAEE,cACA,eACA,QAAU,CAGZ,mBACE,kBACA,iBACA,oBACA,qBAAuB,CAGzB,mBACE,kBACA,MACA,QACA,cACA,WACA,YACA,UACA,SACA,6BACA,gBACA,eACA,kBACA,cACA,eACA,6BACA,oBAAuB,CCxIzB,KACE,sBACA,0BACA,6BAA+B,CAGjC,iBAGE,kBAAoB,CAGtB,KACE,SACA,cACA,yBACA,wFACA,eAAiB,CAOnB,SAHE,aAAe,CAMhB,IADC,cAAgB,CAGlB,6CAGE,aACA,mBACA,gBACA,aAAuB,CAGzB,eACE,aAAe,CAGjB,eACE,eAAiB,CAGnB,eACE,gBAAkB,CAGpB,WACE,UACA,iBACA,iBAAmB,CAGrB,KACE,aACA,oCACA,aAAe,CAGjB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,oCACE,WACE,UACA,gBAAkB,CAGpB,KACE,oCAAuC,CAGzC,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,YACE,mBAAqB,CAGvB,YACE,mBAAqB,CAGvB,YACE,mBAAqB,CAOvB,8BACE,gBAAkB,CAGpB,eACE,gBAAkB,CACnB,CAGH,eACE,SACA,eACA,oBAAsB,CAGxB,QACE,sBAAyB,CAG3B,cACE,iBAAmB,CAGrB,YACE,kBAAqB,CAGvB,iBACE,eACA,UACA,SACA,WACA,WAAa,CAGf,wBACE,cACA,eACA,SACA,UACA,6BACA,eACA,+BAAmC,CAGrC,qBACE,cACA,cACA,eACA,UACA,0CAAoD,CAGtD,mBACE,mBACA,eAAiB,CAGnB,mBACE,SACA,WACA,aAAuB,CAGzB,eACE,kBACA,qBAAwB,CAG1B,gBACE,kBACA,wBAAqC,CAGvC,KACE,kBACA,qBACA,kBACA,gCACA,gBACA,mBACA,eACA,WACA,qBACA,yBACA,2BACA,cAAgB,CAGlB,YACE,0BACA,wBACA,iBAAmB,CAGrB,oCACE,+BAEE,kBACA,kBAAoB,CACrB,CCvPH,gBACE,cACA,kBACA,YAAc,CAEhB,uBACE,0BACA,oBACA,oBACA,aACA,YACA,sBACA,yBACI,sBACI,mBACR,wBACI,qBACI,uBACR,mBACA,eAAiB,CAEnB,iDACE,mBACA,oBAA6B,CAE/B,sBACE,QAAU,CAEZ,4BACE,kBACA,UACA,SAAW,CAEb,oCACA,gBACI,kBACA,kBAAoB,CACvB,CCrCD,gBACE,kBACA,aACA,cACA,YAAc,CAEhB,uBACE,oBACA,oBACA,aACA,YACA,gCACA,yBACI,sBACI,mBACR,wBACI,qBACI,uBACR,eAAiB,CAEnB,sBACE,UAAa,CCrBf,cACE,kBACA,iBACA,wBAAqC,CAEvC,sBACE,yBACG,sBACC,qBACI,gBAAkB,CAE5B,uCACE,oBACA,oBACA,aACA,wBACI,qBACI,sBAAwB,CAElC,qCACE,oCACQ,2BAA6B,CAEvC,oBACE,kCACQ,yBAA2B,CAErC,mBACE,cAAgB,CAElB,YACE,eACA,QACA,cACA,SACA,iBACA,UACA,WACA,YACA,eACA,gCACA,kBACA,gCACA,wBACA,qBAAuB,CAEzB,kBACE,SAAW,CAEb,kBACE,UAAY,CAEd,kBACE,+BAAqC,CAEvC,gBACE,cACA,iBACA,WACA,YACA,UACA,gCACA,uBAA2B,CAE7B,sBACE,6BACQ,oBAAsB,CAEhC,sBACE,eAAiB,CCrEnB,WACE,UAAY,CCDd,eACE,UAAY,CCDd,kBACE,UAAY,CAEd,yBACE,eAAkB,CAEpB,sDACE,YAAc,CAEhB,6BACE,UACA,SACA,gBACA,cAAgB,CAElB,mCACE,wBAAiC,CC2CnC,IACE,qBACA,sBACA,sBACA,cACA,kBACA,WACA,+DACQ,uDACR,kBACA,yBACA,yBACA,cACA,eACA,kBAAoB,CAEtB,eACE,aACA,iEACA,wDAA4D,CAE9D,yBACE,cACA,qBAAuB,CAEzB,4BACE,cACA,eACA,eAAiB","file":"static/css/app.5cace79d77269dfef6f8fd78b1afb458.css","sourcesContent":["\n.layout-centered main {\n overflow: hidden;\n}\n.user-inactive .fade-when-inactive {\n opacity: 0;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/App.vue","body.odo-dialog-open {\n position: relative;\n overflow: hidden;\n}\n\n.odo-dialog {\n position: fixed;\n z-index: 1050;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: none;\n overflow-x: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n height: 100vh;\n /* If you modify the contents of the modal, you may run into issues: https://bugs.webkit.org/show_bug.cgi?id=158342 */\n -webkit-overflow-scrolling: touch;\n -webkit-transition: 250ms ease transform, 250ms ease opacity;\n transition: 250ms ease transform, 250ms ease opacity;\n}\n\n.odo-dialog--open {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n\n/* Layer promote the dialog while it's open to prevent paints on scroll. */\n.odo-dialog--visible {\n will-change: transform;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n}\n\n.odo-dialog--visible + .odo-dialog-backdrop {\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n}\n\n/* Remove focus ring from role=dialog element because the user cannot really\ndo anything with it when it's focused and it looks weird to sighted users. It's\nreally only focused so that the next time the user hits tab, they go to content\nwithin the dialog. */\n.odo-dialog__element:focus {\n outline: 0;\n}\n\n.odo-dialog-backdrop {\n position: fixed;\n z-index: 1040;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, .75);\n -webkit-transition: opacity 250ms ease-out;\n transition: opacity 250ms ease-out;\n}\n\n.odo-dialog--enter + .odo-dialog-backdrop,\n.odo-dialog--leave-active + .odo-dialog-backdrop {\n opacity: 0;\n}\n\n.odo-dialog__content {\n position: relative;\n z-index: 1;\n margin: auto;\n}\n\n.odo-dialog--enter,\n.odo-dialog--leave {\n will-change: transform, opacity;\n}\n\n/* Fade and scale down by default */\n.odo-dialog--enter,\n.odo-dialog--leave-active {\n opacity: 0;\n -webkit-transform: scale(1.05);\n transform: scale(1.05);\n}\n\n/* Fade transition */\n.odo-dialog--fade.odo-dialog--enter,\n.odo-dialog--fade.odo-dialog--leave-active {\n -webkit-transform: none;\n transform: none;\n}\n\n/* Fade and scale up */\n.odo-dialog--zoom-in.odo-dialog--enter,\n.odo-dialog--zoom-in.odo-dialog--leave-active {\n -webkit-transform: scale(0.9);\n transform: scale(0.9);\n}\n\n.odo-dialog--full .odo-dialog__content,\n.odo-dialog--full .odo-dialog__inner {\n width: inherit;\n height: inherit;\n margin: 0;\n}\n\n.odo-dialog__inner {\n position: relative;\n margin-top: 2.5vh;\n margin-bottom: 2.5vh;\n background-color: #fff;\n}\n\n.odo-dialog__close {\n position: absolute;\n top: 0;\n right: 0;\n display: block;\n width: 40px;\n height: 40px;\n padding: 0;\n border: 0;\n background-color: transparent;\n font-weight: bold;\n font-size: 32px;\n text-align: center;\n line-height: 1;\n cursor: pointer;\n -webkit-transition: 150ms ease;\n transition: 150ms ease;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@odopod/odo-dialog/css/odo-dialog.css","html {\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\nbody {\n margin: 0;\n color: rgb(64, 64, 64);\n background-color: rgb(240, 240, 240);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n line-height: 1.4;\n}\n\nmain {\n display: block;\n}\n\nimg {\n display: block;\n max-width: 100%;\n}\n\n.type-header-1,\n.type-header-2,\n.type-header-3 {\n margin-top: 0;\n margin-bottom: 0.5em;\n font-weight: 400;\n color: rgb(38, 38, 38);\n}\n\n.type-header-1 {\n font-size: 2em;\n}\n\n.type-header-2 {\n font-size: 1.5em;\n}\n\n.type-header-3 {\n font-size: 1.17em;\n}\n\n.container {\n width: 93%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.row {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n grid-gap: 16px;\n}\n\n.col-6\\@xs {\n grid-column: span 6;\n}\n\n.col-5\\@xs {\n grid-column: span 5;\n}\n\n.col-4\\@xs {\n grid-column: span 4;\n}\n\n.col-3\\@xs {\n grid-column: span 3;\n}\n\n.col-2\\@xs {\n grid-column: span 2;\n}\n\n.col-1\\@xs {\n grid-column: span 1;\n}\n\n@media screen and (min-width: 768px) {\n .container {\n width: 86%;\n max-width: 1200px;\n }\n\n .row {\n grid-template-columns: repeat(12, 1fr);\n }\n\n .col-1\\@sm {\n grid-column: span 1;\n }\n\n .col-2\\@sm {\n grid-column: span 2;\n }\n\n .col-3\\@sm {\n grid-column: span 3;\n }\n\n .col-4\\@sm {\n grid-column: span 4;\n }\n\n .col-5\\@sm {\n grid-column: span 5;\n }\n\n .col-6\\@sm {\n grid-column: span 6;\n }\n\n .col-7\\@sm {\n grid-column: span 7;\n }\n\n .col-8\\@sm {\n grid-column: span 8;\n }\n\n .col-9\\@sm {\n grid-column: span 9;\n }\n\n .col-10\\@sm {\n grid-column: span 10;\n }\n\n .col-11\\@sm {\n grid-column: span 11;\n }\n\n .col-12\\@sm {\n grid-column: span 12;\n }\n\n .type-header-1 {\n font-size: 2.25em;\n }\n\n .type-header-2 {\n font-size: 2.25em;\n }\n\n .type-header-3 {\n font-size: 1.75em;\n }\n}\n\n.unstyled-list {\n margin: 0;\n padding-left: 0;\n list-style-type: none;\n}\n\n.hidden {\n display: none !important;\n}\n\n.type--center {\n text-align: center;\n}\n\n.marginless {\n margin: 0 !important;\n}\n\n.floating-button {\n position: fixed;\n z-index: 1;\n top: 12px;\n width: 32px;\n height: 32px;\n}\n\n.floating-button button {\n width: inherit;\n height: inherit;\n border: 0;\n padding: 0;\n background-color: transparent;\n cursor: pointer;\n transition: opacity 200ms ease-out;\n}\n\n.floating-button svg {\n display: block;\n width: inherit;\n height: inherit;\n fill: white;\n filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.3));\n}\n\n.odo-dialog__inner {\n border-radius: 12px;\n overflow: hidden;\n}\n\n.odo-dialog__close {\n top: 16px;\n right: 12px;\n color: rgb(64, 64, 64);\n}\n\n.dialog-header {\n padding: 12px 24px;\n background-color: white;\n}\n\n.dialog-content {\n padding: 12px 24px;\n background-color: rgb(247, 247, 247);\n}\n\n.btn {\n position: relative;\n display: inline-block;\n padding: 10px 20px;\n border-bottom: 5px solid #3F976D;\n margin-bottom: 0;\n border-radius: 10px;\n font-size: 20px;\n color: white;\n text-decoration: none;\n background-color: #4DBA87;\n text-shadow: 0px -2px #3F976D;\n cursor: pointer;\n}\n\n.btn:active {\n transform: translateY(5px);\n border-bottom-width: 1px;\n margin-bottom: 4px;\n}\n\n@media screen and (max-width: 767px) {\n .dialog-header,\n .dialog-content {\n padding-left: 16px;\n padding-right: 16px;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/styles.css","\n.welcome-screen {\n display: block;\n padding: 52px 40px;\n height: 100vh;\n}\n.welcome-screen__inner {\n border: 5px dashed rgb(189, 189, 189);\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n height: 100%;\n background-color: white;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n border-radius: 12px;\n overflow: hidden;\n}\n.welcome-screen--can-drop .welcome-screen__inner {\n border-style: solid;\n border-color: mediumseagreen;\n}\n.welcome-screen__text {\n margin: 0;\n}\n.welcome-screen__file-input {\n position: absolute;\n opacity: 0;\n width: 1px;\n}\n@media screen and (max-width: 767px) {\n.welcome-screen {\n padding-left: 16px;\n padding-right: 16px;\n}\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/WelcomeScreen.vue","\n.loading-screen {\n position: relative;\n z-index: 1100;\n display: block;\n height: 100vh;\n}\n.loading-screen__inner {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.8);\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n overflow: hidden;\n}\n.loading-screen__text {\n color: white;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/LoadingScreen.vue","\n.image-viewer {\n position: relative;\n min-height: 100vh;\n background-color: rgb(240, 240, 240);\n}\n.image-viewer__images {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.layout-centered .image-viewer__images {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n.layout-centered .image-viewer__wrap {\n -webkit-transform-origin: top center;\n transform-origin: top center;\n}\n.image-viewer__wrap {\n -webkit-transform-origin: top left;\n transform-origin: top left;\n}\n.image-viewer__img {\n max-width: none;\n}\n.nav-button {\n position: fixed;\n top: 50%;\n display: block;\n border: 0;\n margin-top: -30px;\n padding: 0;\n width: 60px;\n height: 60px;\n cursor: pointer;\n background-color: rgba(0, 0, 0, 0.2);\n border-radius: 50%;\n -webkit-transition: 200ms ease-out;\n transition: 200ms ease-out;\n will-change: transform;\n}\n.nav-button--prev {\n left: 12px;\n}\n.nav-button--next {\n right: 12px;\n}\n.nav-button:hover {\n background-color: rgba(0, 0, 0, 0.3);\n}\n.nav-button svg {\n display: block;\n margin-left: 11px;\n width: 40px;\n height: 40px;\n fill: white;\n -webkit-transition: 200ms ease-out;\n transition: 200ms ease-out;\n}\n.nav-button:hover svg {\n -webkit-transform: scale(1.1);\n transform: scale(1.1);\n}\n.nav-button--prev svg {\n margin-left: 8px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/ImageViewer.vue","\n.help-menu {\n right: 12px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/HelpMenu.vue","\n.settings-menu {\n right: 52px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/SettingsMenu.vue","\n.collections-menu {\n right: 90px;\n}\n.collections-menu__title {\n margin-top: 0.5em;\n}\n.dialog-content > :first-child .collections-menu__title {\n margin-top: 0;\n}\n.collections-menu__thumb-btn {\n padding: 0;\n border: 0;\n background: none;\n cursor: pointer;\n}\n.collections-menu__thumb--selected {\n border: 4px solid mediumseagreen;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/CollectionsMenu.vue","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* Styles from Chrome devtools */\nkbd {\n display: inline-block;\n vertical-align: middle;\n border: 1px solid #ccc;\n margin: 0 0.1em;\n padding: 0.1em 0.6em;\n color: #333;\n -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #ffffff inset;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #ffffff inset;\n border-radius: 3px;\n background-color: #f7f7f7;\n text-shadow: 0 1px 0 #fff;\n line-height: 1;\n font-size: 11px;\n white-space: nowrap;\n}\n.shortcut-list {\n display: grid;\n grid-template-columns: repeat(2, minmax(auto, -webkit-max-content));\n grid-template-columns: repeat(2, minmax(auto, max-content));\n}\n.shortcut-item__triggers {\n grid-column: 1;\n justify-self: flex-end;\n}\n.shortcut-item__description {\n grid-column: 2;\n margin-top: 1px;\n margin-left: 8px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/KeyboardShortcuts.vue"],"sourceRoot":""} \ No newline at end of file diff --git a/static/css/app.a43ead4422323592cc50eaaa903b0b1d.css.map b/static/css/app.a43ead4422323592cc50eaaa903b0b1d.css.map deleted file mode 100644 index bab8afb..0000000 --- a/static/css/app.a43ead4422323592cc50eaaa903b0b1d.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/App.vue","webpack:///./node_modules/@odopod/odo-dialog/css/odo-dialog.css","webpack:///./src/styles.css","webpack:///./src/components/WelcomeScreen.vue","webpack:///./src/components/LoadingScreen.vue","webpack:///./src/components/ImageViewer.vue","webpack:///./src/components/HelpMenu.vue","webpack:///./src/components/SettingsMenu.vue","webpack:///./src/components/CollectionsMenu.vue","webpack:///./src/components/KeyboardShortcuts.vue"],"names":[],"mappings":"AACA,sBACE,eAAiB,CAEnB,mCACE,SAAW,CCLb,qBACE,kBACA,eAAiB,CAGnB,YACE,eACA,aACA,MACA,OACA,QACA,SACA,aACA,kBACA,gBACA,WACA,YACA,aAEA,iCACA,yDACA,gDAAqD,CAGvD,kBACE,oBACA,oBACA,YAAc,CAIhB,qBACE,qBAAuB,CAOzB,+DANE,gCACQ,wBACR,mCACQ,0BAA4B,CActC,2BACE,SAAW,CAGb,qBACE,eACA,aACA,MACA,QACA,SACA,OACA,WACA,YACA,2BACA,yCACQ,gCAAmC,CAG7C,uFAEE,SAAW,CAGb,qBACE,kBACA,UACA,WAAa,CAGf,sCAEE,6BAAgC,CAIlC,6CAEE,UACA,8BACQ,qBAAuB,CAIjC,+EAEE,uBACQ,cAAgB,CAI1B,qFAEE,4BACQ,mBAAsB,CAGhC,4EAEE,cACA,eACA,QAAU,CAGZ,mBACE,kBACA,iBACA,oBACA,qBAAuB,CAGzB,mBACE,kBACA,MACA,QACA,cACA,WACA,YACA,UACA,SACA,6BACA,gBACA,eACA,kBACA,cACA,eACA,6BACA,oBAAuB,CCxIzB,KACE,sBACA,0BACA,6BAA+B,CAGjC,iBAGE,kBAAoB,CAGtB,KACE,SACA,cACA,yBACA,wFACA,eAAiB,CAOnB,SAHE,aAAe,CAMhB,IADC,cAAgB,CAGlB,6CAGE,aACA,mBACA,gBACA,aAAuB,CAGzB,eACE,aAAe,CAGjB,eACE,eAAiB,CAGnB,eACE,gBAAkB,CAGpB,WACE,UACA,iBACA,iBAAmB,CAGrB,KACE,aACA,oCACA,aAAe,CAGjB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,oCACE,WACE,UACA,gBAAkB,CAGpB,KACE,oCAAuC,CAGzC,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,WACE,kBAAoB,CAGtB,YACE,mBAAqB,CAGvB,YACE,mBAAqB,CAGvB,YACE,mBAAqB,CAOvB,8BACE,gBAAkB,CAGpB,eACE,gBAAkB,CACnB,CAGH,eACE,SACA,eACA,oBAAsB,CAGxB,QACE,sBAAyB,CAG3B,cACE,iBAAmB,CAGrB,YACE,kBAAqB,CAGvB,iBACE,eACA,UACA,SACA,WACA,WAAa,CAGf,wBACE,cACA,eACA,SACA,UACA,6BACA,eACA,+BAAmC,CAGrC,qBACE,cACA,cACA,eACA,UACA,0CAAoD,CAGtD,mBACE,mBACA,eAAiB,CAGnB,mBACE,SACA,WACA,aAAuB,CAGzB,eACE,kBACA,qBAAwB,CAG1B,gBACE,kBACA,wBAAqC,CAGvC,KACE,kBACA,qBACA,kBACA,gCACA,gBACA,mBACA,eACA,WACA,qBACA,yBACA,2BACA,cAAgB,CAGlB,YACE,0BACA,wBACA,iBAAmB,CAGrB,oCACE,+BAEE,kBACA,kBAAoB,CACrB,CCvPH,gBACE,cACA,kBACA,YAAc,CAEhB,uBACE,0BACA,oBACA,oBACA,aACA,YACA,sBACA,yBACI,sBACI,mBACR,wBACI,qBACI,uBACR,mBACA,eAAiB,CAEnB,iDACE,mBACA,oBAA6B,CAE/B,sBACE,QAAU,CAEZ,4BACE,kBACA,UACA,SAAW,CAEb,oCACA,gBACI,kBACA,kBAAoB,CACvB,CCrCD,gBACE,kBACA,aACA,cACA,YAAc,CAEhB,uBACE,oBACA,oBACA,aACA,YACA,gCACA,yBACI,sBACI,mBACR,wBACI,qBACI,uBACR,eAAiB,CAEnB,sBACE,UAAa,CCrBf,cACE,kBACA,iBACA,wBAAqC,CAEvC,sBACE,yBACG,sBACC,qBACI,gBAAkB,CAE5B,uCACE,oBACA,oBACA,aACA,wBACI,qBACI,sBAAwB,CAElC,oBACE,oCACQ,2BAA6B,CAEvC,mBACE,cAAgB,CAElB,YACE,eACA,QACA,cACA,SACA,iBACA,UACA,WACA,YACA,eACA,gCACA,kBACA,gCACA,wBACA,qBAAuB,CAEzB,kBACE,SAAW,CAEb,kBACE,UAAY,CAEd,kBACE,+BAAqC,CAEvC,gBACE,cACA,iBACA,WACA,YACA,UACA,gCACA,uBAA2B,CAE7B,sBACE,6BACQ,oBAAsB,CAEhC,sBACE,eAAiB,CCjEnB,WACE,UAAY,CCDd,eACE,UAAY,CCDd,kBACE,UAAY,CAEd,yBACE,eAAkB,CAEpB,sDACE,YAAc,CAEhB,6BACE,UACA,SACA,gBACA,cAAgB,CAElB,mCACE,wBAAiC,CC2CnC,IACE,qBACA,sBACA,sBACA,cACA,kBACA,WACA,+DACQ,uDACR,kBACA,yBACA,yBACA,cACA,eACA,kBAAoB,CAEtB,eACE,aACA,iEACA,wDAA4D,CAE9D,yBACE,cACA,qBAAuB,CAEzB,4BACE,cACA,eACA,eAAiB","file":"static/css/app.a43ead4422323592cc50eaaa903b0b1d.css","sourcesContent":["\n.layout-centered main {\n overflow: hidden;\n}\n.user-inactive .fade-when-inactive {\n opacity: 0;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/App.vue","body.odo-dialog-open {\n position: relative;\n overflow: hidden;\n}\n\n.odo-dialog {\n position: fixed;\n z-index: 1050;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: none;\n overflow-x: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n height: 100vh;\n /* If you modify the contents of the modal, you may run into issues: https://bugs.webkit.org/show_bug.cgi?id=158342 */\n -webkit-overflow-scrolling: touch;\n -webkit-transition: 250ms ease transform, 250ms ease opacity;\n transition: 250ms ease transform, 250ms ease opacity;\n}\n\n.odo-dialog--open {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n\n/* Layer promote the dialog while it's open to prevent paints on scroll. */\n.odo-dialog--visible {\n will-change: transform;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n}\n\n.odo-dialog--visible + .odo-dialog-backdrop {\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n}\n\n/* Remove focus ring from role=dialog element because the user cannot really\ndo anything with it when it's focused and it looks weird to sighted users. It's\nreally only focused so that the next time the user hits tab, they go to content\nwithin the dialog. */\n.odo-dialog__element:focus {\n outline: 0;\n}\n\n.odo-dialog-backdrop {\n position: fixed;\n z-index: 1040;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, .75);\n -webkit-transition: opacity 250ms ease-out;\n transition: opacity 250ms ease-out;\n}\n\n.odo-dialog--enter + .odo-dialog-backdrop,\n.odo-dialog--leave-active + .odo-dialog-backdrop {\n opacity: 0;\n}\n\n.odo-dialog__content {\n position: relative;\n z-index: 1;\n margin: auto;\n}\n\n.odo-dialog--enter,\n.odo-dialog--leave {\n will-change: transform, opacity;\n}\n\n/* Fade and scale down by default */\n.odo-dialog--enter,\n.odo-dialog--leave-active {\n opacity: 0;\n -webkit-transform: scale(1.05);\n transform: scale(1.05);\n}\n\n/* Fade transition */\n.odo-dialog--fade.odo-dialog--enter,\n.odo-dialog--fade.odo-dialog--leave-active {\n -webkit-transform: none;\n transform: none;\n}\n\n/* Fade and scale up */\n.odo-dialog--zoom-in.odo-dialog--enter,\n.odo-dialog--zoom-in.odo-dialog--leave-active {\n -webkit-transform: scale(0.9);\n transform: scale(0.9);\n}\n\n.odo-dialog--full .odo-dialog__content,\n.odo-dialog--full .odo-dialog__inner {\n width: inherit;\n height: inherit;\n margin: 0;\n}\n\n.odo-dialog__inner {\n position: relative;\n margin-top: 2.5vh;\n margin-bottom: 2.5vh;\n background-color: #fff;\n}\n\n.odo-dialog__close {\n position: absolute;\n top: 0;\n right: 0;\n display: block;\n width: 40px;\n height: 40px;\n padding: 0;\n border: 0;\n background-color: transparent;\n font-weight: bold;\n font-size: 32px;\n text-align: center;\n line-height: 1;\n cursor: pointer;\n -webkit-transition: 150ms ease;\n transition: 150ms ease;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@odopod/odo-dialog/css/odo-dialog.css","html {\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\nbody {\n margin: 0;\n color: rgb(64, 64, 64);\n background-color: rgb(240, 240, 240);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n line-height: 1.4;\n}\n\nmain {\n display: block;\n}\n\nimg {\n display: block;\n max-width: 100%;\n}\n\n.type-header-1,\n.type-header-2,\n.type-header-3 {\n margin-top: 0;\n margin-bottom: 0.5em;\n font-weight: 400;\n color: rgb(38, 38, 38);\n}\n\n.type-header-1 {\n font-size: 2em;\n}\n\n.type-header-2 {\n font-size: 1.5em;\n}\n\n.type-header-3 {\n font-size: 1.17em;\n}\n\n.container {\n width: 93%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.row {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n grid-gap: 16px;\n}\n\n.col-6\\@xs {\n grid-column: span 6;\n}\n\n.col-5\\@xs {\n grid-column: span 5;\n}\n\n.col-4\\@xs {\n grid-column: span 4;\n}\n\n.col-3\\@xs {\n grid-column: span 3;\n}\n\n.col-2\\@xs {\n grid-column: span 2;\n}\n\n.col-1\\@xs {\n grid-column: span 1;\n}\n\n@media screen and (min-width: 768px) {\n .container {\n width: 86%;\n max-width: 1200px;\n }\n\n .row {\n grid-template-columns: repeat(12, 1fr);\n }\n\n .col-1\\@sm {\n grid-column: span 1;\n }\n\n .col-2\\@sm {\n grid-column: span 2;\n }\n\n .col-3\\@sm {\n grid-column: span 3;\n }\n\n .col-4\\@sm {\n grid-column: span 4;\n }\n\n .col-5\\@sm {\n grid-column: span 5;\n }\n\n .col-6\\@sm {\n grid-column: span 6;\n }\n\n .col-7\\@sm {\n grid-column: span 7;\n }\n\n .col-8\\@sm {\n grid-column: span 8;\n }\n\n .col-9\\@sm {\n grid-column: span 9;\n }\n\n .col-10\\@sm {\n grid-column: span 10;\n }\n\n .col-11\\@sm {\n grid-column: span 11;\n }\n\n .col-12\\@sm {\n grid-column: span 12;\n }\n\n .type-header-1 {\n font-size: 2.25em;\n }\n\n .type-header-2 {\n font-size: 2.25em;\n }\n\n .type-header-3 {\n font-size: 1.75em;\n }\n}\n\n.unstyled-list {\n margin: 0;\n padding-left: 0;\n list-style-type: none;\n}\n\n.hidden {\n display: none !important;\n}\n\n.type--center {\n text-align: center;\n}\n\n.marginless {\n margin: 0 !important;\n}\n\n.floating-button {\n position: fixed;\n z-index: 1;\n top: 12px;\n width: 32px;\n height: 32px;\n}\n\n.floating-button button {\n width: inherit;\n height: inherit;\n border: 0;\n padding: 0;\n background-color: transparent;\n cursor: pointer;\n transition: opacity 200ms ease-out;\n}\n\n.floating-button svg {\n display: block;\n width: inherit;\n height: inherit;\n fill: white;\n filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.3));\n}\n\n.odo-dialog__inner {\n border-radius: 12px;\n overflow: hidden;\n}\n\n.odo-dialog__close {\n top: 16px;\n right: 12px;\n color: rgb(64, 64, 64);\n}\n\n.dialog-header {\n padding: 12px 24px;\n background-color: white;\n}\n\n.dialog-content {\n padding: 12px 24px;\n background-color: rgb(247, 247, 247);\n}\n\n.btn {\n position: relative;\n display: inline-block;\n padding: 10px 20px;\n border-bottom: 5px solid #3F976D;\n margin-bottom: 0;\n border-radius: 10px;\n font-size: 20px;\n color: white;\n text-decoration: none;\n background-color: #4DBA87;\n text-shadow: 0px -2px #3F976D;\n cursor: pointer;\n}\n\n.btn:active {\n transform: translateY(5px);\n border-bottom-width: 1px;\n margin-bottom: 4px;\n}\n\n@media screen and (max-width: 767px) {\n .dialog-header,\n .dialog-content {\n padding-left: 16px;\n padding-right: 16px;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/styles.css","\n.welcome-screen {\n display: block;\n padding: 52px 40px;\n height: 100vh;\n}\n.welcome-screen__inner {\n border: 5px dashed rgb(189, 189, 189);\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n height: 100%;\n background-color: white;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n border-radius: 12px;\n overflow: hidden;\n}\n.welcome-screen--can-drop .welcome-screen__inner {\n border-style: solid;\n border-color: mediumseagreen;\n}\n.welcome-screen__text {\n margin: 0;\n}\n.welcome-screen__file-input {\n position: absolute;\n opacity: 0;\n width: 1px;\n}\n@media screen and (max-width: 767px) {\n.welcome-screen {\n padding-left: 16px;\n padding-right: 16px;\n}\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/WelcomeScreen.vue","\n.loading-screen {\n position: relative;\n z-index: 1100;\n display: block;\n height: 100vh;\n}\n.loading-screen__inner {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.8);\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n overflow: hidden;\n}\n.loading-screen__text {\n color: white;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/LoadingScreen.vue","\n.image-viewer {\n position: relative;\n min-height: 100vh;\n background-color: rgb(240, 240, 240);\n}\n.image-viewer__images {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.layout-centered .image-viewer__images {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n.image-viewer__wrap {\n -webkit-transform-origin: top center;\n transform-origin: top center;\n}\n.image-viewer__img {\n max-width: none;\n}\n.nav-button {\n position: fixed;\n top: 50%;\n display: block;\n border: 0;\n margin-top: -30px;\n padding: 0;\n width: 60px;\n height: 60px;\n cursor: pointer;\n background-color: rgba(0, 0, 0, 0.2);\n border-radius: 50%;\n -webkit-transition: 200ms ease-out;\n transition: 200ms ease-out;\n will-change: transform;\n}\n.nav-button--prev {\n left: 12px;\n}\n.nav-button--next {\n right: 12px;\n}\n.nav-button:hover {\n background-color: rgba(0, 0, 0, 0.3);\n}\n.nav-button svg {\n display: block;\n margin-left: 11px;\n width: 40px;\n height: 40px;\n fill: white;\n -webkit-transition: 200ms ease-out;\n transition: 200ms ease-out;\n}\n.nav-button:hover svg {\n -webkit-transform: scale(1.1);\n transform: scale(1.1);\n}\n.nav-button--prev svg {\n margin-left: 8px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/ImageViewer.vue","\n.help-menu {\n right: 12px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/HelpMenu.vue","\n.settings-menu {\n right: 52px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/SettingsMenu.vue","\n.collections-menu {\n right: 90px;\n}\n.collections-menu__title {\n margin-top: 0.5em;\n}\n.dialog-content > :first-child .collections-menu__title {\n margin-top: 0;\n}\n.collections-menu__thumb-btn {\n padding: 0;\n border: 0;\n background: none;\n cursor: pointer;\n}\n.collections-menu__thumb--selected {\n border: 4px solid mediumseagreen;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/CollectionsMenu.vue","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* Styles from Chrome devtools */\nkbd {\n display: inline-block;\n vertical-align: middle;\n border: 1px solid #ccc;\n margin: 0 0.1em;\n padding: 0.1em 0.6em;\n color: #333;\n -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #ffffff inset;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #ffffff inset;\n border-radius: 3px;\n background-color: #f7f7f7;\n text-shadow: 0 1px 0 #fff;\n line-height: 1;\n font-size: 11px;\n white-space: nowrap;\n}\n.shortcut-list {\n display: grid;\n grid-template-columns: repeat(2, minmax(auto, -webkit-max-content));\n grid-template-columns: repeat(2, minmax(auto, max-content));\n}\n.shortcut-item__triggers {\n grid-column: 1;\n justify-self: flex-end;\n}\n.shortcut-item__description {\n grid-column: 2;\n margin-top: 1px;\n margin-left: 8px;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/KeyboardShortcuts.vue"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/app.38b0b83eac4be948b9a2.js b/static/js/app.38b0b83eac4be948b9a2.js deleted file mode 100644 index 7382f28..0000000 --- a/static/js/app.38b0b83eac4be948b9a2.js +++ /dev/null @@ -1,2 +0,0 @@ -webpackJsonp([1],[,,,,,function(e,t,n){"use strict";function o(e,t){var n=[],o=[];return e.forEach(function(e){t(e)?n.push(e):o.push(e)}),[n,o]}function i(e){return e.reduce(function(e,t){return e.concat(t)},[])}function s(e){return new Promise(function(t){e.file(t)})}function a(e,t){void 0===t&&(t=[]);var n=l(e.fullPath);return new Promise(function(i){e.createReader().readEntries(function(e){var l=o(e,function(e){return e.isFile});Promise.all(l[0].map(s)).then(function(e){var o={name:n,files:e};t.push(o);var s=l[1].map(function(e){return a(e,t)});Promise.all(s).then(function(){i(t)})})})})}function l(e){var t=e.split("/");return t[t.length-1]||""}function r(e){var t=e&&e.match(/\.([^.]+)$/);return t?t[1].toLowerCase():""}function c(e){if(e.type&&e.type.includes("image/"))return!0;var t=r(e.name);return $.includes(t)}function d(e){var t=Date.now();return new Promise(function(n){var o=new FileReader;o.onload=function(){console.log("Read took "+(Date.now()-t)+" milliseconds"),n(o.result)},o.readAsDataURL(e)})}function u(e){var t=Array.from(e).map(function(e){return e.webkitGetAsEntry()}).filter(function(e){return!!e}),n=o(t,function(e){return e.isFile}),l=n[0],r=n[1];return Promise.all([Promise.all(l.map(s)),Promise.all(r.map(function(e){return a(e)}))]).then(function(e){var t=e[0],n=e[1],o=i(n);return t.length&&o.unshift({name:"",files:t}),o})}function h(){return T+=1}function p(e){n(7)}function g(e){n(11)}function m(e){n(12)}function f(e){n(13)}function v(e){n(14)}function _(e){n(15)}function y(e){n(19)}function C(e){n(20)}function b(e){n(21)}function w(e,t,n){return void 0===n&&(n="s"),e+" "+t+(1!==e?n:"")}Object.defineProperty(t,"__esModule",{value:!0});var x=n(0),I=n(2),k=n(3),D=n.n(k),$=["bmp","gif","jpeg","jpg","jpe","png","svg","tiff","tif","webp","ico"],T=0,E=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.hasContent=!1,t.canDrop=!1,t.isLoading=!1,t.isCenteredImageMode=!0,t.isScaledImageMode=!1,t.isUserActive=!1,t}return I.c(t,e),t.prototype._handleDragHover=function(e){e.preventDefault(),e.dataTransfer.dropEffect="copy",this.canDrop=!0},t.prototype._handleDragCancel=function(e){e.preventDefault(),this.canDrop=!1},t.prototype._handleDrop=function(e){var t=this;e.preventDefault(),this.isLoading=!0;var n=Date.now(),o=function(){t.isLoading=!1,requestAnimationFrame(function(){console.log("Drop took "+(Date.now()-n)+" milliseconds")})};if(e.dataTransfer.items)u(e.dataTransfer.items).then(function(e){Promise.all(e.map(t._addFileList)).then(o)});else{var i={name:"",files:Array.from(e.dataTransfer.files)};this._addFileList(i).then(o)}},t.prototype._handleFilesChosen=function(e){this._addFileList({name:"",files:e})},t.prototype._addFileList=function(e){var t,n=e.files.filter(c).sort(function(e,t){return e.name.localeCompare(t.name)});return t=n.length>0?this.renderFirstImageThenOthers(n,e.name):Promise.resolve(),this.canDrop=!1,t},t.prototype.renderFirstImageThenOthers=function(e,t){return I.a(this,void 0,void 0,function(){var n,o,i,s,a=this;return I.d(this,function(l){switch(l.label){case 0:return n=h(),o=e.shift(),[4,this.getDisplayImage(o)];case 1:return i=l.sent(),s=this.$store.getters.totalCollections,this.$store.commit("addCollection",{id:n,name:t,images:[i]}),this.hasContent=this.$store.state.collections.length>0||e.length>0,[2,new Promise(function(t){requestAnimationFrame(function(){Promise.all(a.getDisplayImages(e)).then(function(e){a.$store.commit("updateCollectionImages",{index:s,images:e}),a.updatePageTitle(),t()})})})]}})})},t.prototype.getDisplayImages=function(e){return e.map(this.getDisplayImage)},t.prototype.getDisplayImage=function(e){return d(e).then(function(t){return{id:h(),filename:e.name,src:t}})},t.prototype.updatePageTitle=function(){document.title=this.$store.getters.pageTitle},t.prototype.mounted=function(){this._handleKeyDown=this._handleKeyDown.bind(this),this._handleDragHover=this._handleDragHover.bind(this),this._handleDragCancel=this._handleDragCancel.bind(this),this._handleDrop=this._handleDrop.bind(this),document.body.addEventListener("keydown",this._handleKeyDown),document.body.addEventListener("dragover",this._handleDragHover),document.body.addEventListener("dragleave",this._handleDragCancel),document.body.addEventListener("drop",this._handleDrop)},t.prototype.beforeDestroy=function(){document.body.removeEventListener("keydown",this._handleKeyDown),document.body.removeEventListener("dragover",this._handleDragHover),document.body.removeEventListener("dragleave",this._handleDragCancel),document.body.removeEventListener("drop",this._handleDrop)},t.prototype._handleKeyDown=function(e){this.handleUserAction();var t=parseInt(e.key,10),n=!isNaN(t);"?"===e.key?this.helpToggle():"s"===e.key?this.settingsToggle():"c"===e.key?this.collectionsToggle():"h"===e.key?this.isUserActive=!1:"r"===e.key?(this.reset(),this.updatePageTitle()):this.hasContent&&n&&!e.metaKey&&!e.shiftKey&&this.$emit("selectgroup",t-1)},t.prototype.helpToggle=function(){this.$emit("helptoggle")},t.prototype.settingsToggle=function(){this.$emit("settingstoggle")},t.prototype.collectionsToggle=function(){this.$emit("collectionstoggle")},t.prototype.reset=function(){this.$store.commit("emptyCollections"),this.hasContent=!1},t.prototype.handleUserAction=function(){var e=this;clearTimeout(this.timer),this.isUserActive=!0,this.timer=setTimeout(function(){e.isUserActive=!1},3e3)},t.prototype.handleLayoutChange=function(e){this.isCenteredImageMode=e},t.prototype.handleRetinaChange=function(e){this.isScaledImageMode=e},t=I.b([D.a],t)}(x.default),L=E,P=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{class:{"layout-centered":e.isCenteredImageMode,"user-inactive":!e.isUserActive,"is-loading":e.isLoading},attrs:{id:"app",tabindex:"-1"},on:{mousemove:e.handleUserAction,mousedown:e.handleUserAction}},[n("help-menu"),e._v(" "),n("settings-menu",{on:{layoutchange:e.handleLayoutChange,retinachange:e.handleRetinaChange}}),e._v(" "),n("collections-menu",{directives:[{name:"show",rawName:"v-show",value:e.hasContent,expression:"hasContent"}]}),e._v(" "),n("main",[n("welcome-screen",{directives:[{name:"show",rawName:"v-show",value:!e.hasContent,expression:"!hasContent"}],attrs:{"can-drop":e.canDrop},on:{fileschosen:e._handleFilesChosen}}),e._v(" "),n("loading-screen",{directives:[{name:"show",rawName:"v-show",value:e.isLoading,expression:"isLoading"}]}),e._v(" "),n("collection-viewer",{directives:[{name:"show",rawName:"v-show",value:e.hasContent,expression:"hasContent"}],attrs:{"scale-images":e.isScaledImageMode}})],1)],1)},F=[],z={render:P,staticRenderFns:F},N=z,M=n(1),A=p,R=M(L,N,A,null,null),S=R.exports,H=(n(9),n(10),function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),t.prototype.handleFiles=function(e){var t=e.target;this.$emit("fileschosen",Array.from(t.files)),t.value=""},t=I.b([D()({props:{canDrop:{type:Boolean,required:!0}}})],t)}(x.default)),B=H,O=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"welcome-screen",class:{"welcome-screen--can-drop":e.canDrop}},[n("div",{staticClass:"welcome-screen__inner"},[n("div",{directives:[{name:"show",rawName:"v-show",value:!e.canDrop,expression:"!canDrop"}],staticClass:"type--center"},[n("p",{staticClass:"type-header-1"},[e._v("Drop images here.")]),e._v(" "),n("p",[e._v("png, jpg, gif, bmp")]),e._v(" "),e._m(0),e._v(" "),n("input",{staticClass:"welcome-screen__file-input",attrs:{type:"file",accept:"image/*",multiple:"",id:"file-input"},on:{change:e.handleFiles}})]),e._v(" "),n("div",{directives:[{name:"show",rawName:"v-show",value:e.canDrop,expression:"canDrop"}]},[n("p",{staticClass:"type-header-1"},[e._v("Release!")])])])])},K=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("p",[n("label",{staticClass:"btn",attrs:{for:"file-input"}},[e._v("Choose files")])])}],U={render:O,staticRenderFns:K},V=U,j=n(1),G=g,q=j(B,V,G,null,null),J=q.exports,W=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),t=I.b([D.a],t)}(x.default),Y=W,Q=function(){var e=this,t=e.$createElement;e._self._c;return e._m(1)},X=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"loading-screen__inner"},[n("h2",{staticClass:"type-header-2 marginless loading-screen__text"},[e._v("Loading files")])])},function(){var e=this,t=e.$createElement;return(e._self._c||t)("div",{staticClass:"loading-screen"},[e._m(0)])}],Z={render:Q,staticRenderFns:X},ee=Z,te=n(1),ne=m,oe=te(Y,ee,ne,null,null),ie=oe.exports,se=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),Object.defineProperty(t.prototype,"images",{get:function(){return this.$store.state.collections[this.collectionIndex].images},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selectedIndex",{get:function(){return this.$store.state.selectedImages[this.collectionIndex]},enumerable:!0,configurable:!0}),t.prototype.setSelectedIndex=function(e,t){void 0===t&&(t=!0),(e>=0||e0&&(this.z=t.getNextTopLayer(),this.element.style.zIndex=""+this.z,this.backdrop.style.zIndex=""+(this.z-5),this.once(De.a.EventType.CLOSED,function(){n.z=$e,n.element.style.zIndex="",n.backdrop.style.zIndex=""})),e.prototype.open.call(this)},t}(De.a),Ee=Te,Le=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),t.prototype.toggle=function(){this.dialog.isOpen?this.dialog.close():this.dialog.open()},t.prototype.mounted=function(){this.$parent.$on("helptoggle",this.toggle),this.dialog=new Ee(document.getElementById("help-dialog"))},t.prototype.beforeDestroy=function(){this.dialog.dispose(),this.dialog=null},t=I.b([D.a],t)}(x.default),Pe=Le,Fe=function(){var e=this,t=e.$createElement;e._self._c;return e._m(2)},ze=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dialog-header"},[n("h2",{staticClass:"type-header-2 marginless",attrs:{id:"help-dialog-title"}},[e._v("Compdrop Help")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"col-6@xs col-6@sm"},[n("h3",{staticClass:"type-header-3"},[e._v("What is this?")]),e._v(" "),n("p",[e._v("Compdrop is a simple way to view website designs in a desktop browser. Just drag and drop your images into the browser. Images are aligned to the top of the window and horizontally centered.")]),e._v(" "),n("p",[e._v("You are viewing files on "),n("em",[e._v("your own machine")]),e._v(". Compdrop "),n("strong",[e._v("does not store any of your data")]),e._v(".")]),e._v(" "),n("p",[e._v("Built by "),n("a",{attrs:{href:"https://glencheney.com"}},[e._v("Glen Cheney")]),e._v(". Based on the original "),n("a",{attrs:{href:"https://github.com/lucasishuman/cmpdrp"}},[e._v("cmpdrp")]),e._v(".")]),e._v(" "),n("p",[e._v("Compdrop is a progressive web app and you can use it even if you’re have no internet connection.")]),e._v(" "),n("p",[e._v("View the project on "),n("a",{attrs:{href:"https://github.com/Vestride/compdrop"}},[e._v("GitHub")]),e._v(".")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"help-menu floating-button"},[n("button",{staticClass:"help-menu__toggle fade-when-inactive",attrs:{"data-odo-dialog-open":"help-dialog",title:"open help menu"}},[n("svg",{attrs:{viewBox:"0 0 14 16","aria-hidden":"true"}},[n("path",{attrs:{d:"M6.3 5.69c-.19-.19-.28-.42-.28-.7 0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7-.19.18-.42.3-.7.3-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z","fill-rule":"evenodd"}})])]),e._v(" "),n("div",{staticClass:"odo-dialog help-dialog",attrs:{id:"help-dialog",role:"dialog","aria-labelledby":"help-dialog-title","aria-hidden":"true"}},[n("div",{staticClass:"odo-dialog__content container",attrs:{role:"document"}},[n("div",{staticClass:"odo-dialog__inner"},[n("button",{staticClass:"odo-dialog__close",attrs:{type:"button","data-odo-dialog-close":"","aria-label":"Close this dialog window"}},[e._v("×")]),e._v(" "),e._m(0),e._v(" "),n("div",{staticClass:"row dialog-content"},[e._m(1),e._v(" "),n("div",{staticClass:"col-6@xs col-6@sm"},[n("h3",{staticClass:"type-header-3"},[e._v("Keyboard Shortcuts")]),e._v(" "),n("keyboard-shortcuts")],1)])])])])])}],Ne={render:Fe,staticRenderFns:ze},Me=Ne,Ae=n(1),Re=_,Se=Ae(Pe,Me,Re,null,null),He=Se.exports,Be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.centeredLayout=!0,t.retina=!1,t}return I.c(t,e),t.prototype.toggle=function(){this.dialog.isOpen?this.dialog.close():this.dialog.open()},t.prototype.mounted=function(){this.$parent.$on("settingstoggle",this.toggle),this.dialog=new Ee(document.getElementById("settings-dialog"))},t.prototype.beforeDestroy=function(){this.dialog.dispose(),this.dialog=null},t.prototype.layoutChange=function(e){var t=e.target;this.centeredLayout=t.checked,this.$emit("layoutchange",this.centeredLayout)},t.prototype.retinaChange=function(e){var t=e.target;this.retina=t.checked,this.$emit("retinachange",this.retina)},t=I.b([D.a],t)}(x.default),Oe=Be,Ke=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"settings-menu floating-button"},[n("button",{staticClass:"settings-menu__toggle fade-when-inactive",attrs:{"data-odo-dialog-open":"settings-dialog",title:"open settings menu"}},[n("svg",{attrs:{viewBox:"0 0 14 16","aria-hidden":"true"}},[n("path",{attrs:{"fill-rule":"evenodd",d:"M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z"}})])]),e._v(" "),n("div",{staticClass:"odo-dialog settings-dialog",attrs:{id:"settings-dialog",role:"dialog","aria-labelledby":"settings-dialog-title","aria-hidden":"true"}},[n("div",{staticClass:"odo-dialog__content container",attrs:{role:"document"}},[n("div",{staticClass:"odo-dialog__inner"},[n("button",{staticClass:"odo-dialog__close",attrs:{type:"button","data-odo-dialog-close":"","aria-label":"Close this dialog window"}},[e._v("×")]),e._v(" "),e._m(0),e._v(" "),n("div",{staticClass:"row dialog-content"},[n("div",{staticClass:"col-6@xs col-12@sm"},[n("div",[n("input",{attrs:{type:"checkbox",id:"checkbox-centered-layout"},domProps:{checked:e.centeredLayout},on:{change:e.layoutChange}}),e._v(" "),n("label",{attrs:{for:"checkbox-centered-layout"}},[e._v("Center images (turn off to scroll them)")])]),e._v(" "),n("div",[n("input",{attrs:{type:"checkbox",id:"checkbox-retina"},domProps:{checked:e.retina},on:{change:e.retinaChange}}),e._v(" "),n("label",{attrs:{for:"checkbox-retina"}},[e._v("Scale images to half size")])])])])])])])])},Ue=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dialog-header"},[n("h2",{staticClass:"type-header-2 marginless",attrs:{id:"settings-dialog-title"}},[e._v("Compdrop Settings")])])}],Ve={render:Ke,staticRenderFns:Ue},je=Ve,Ge=n(1),qe=y,Je=Ge(Oe,je,qe,null,null),We=Je.exports,Ye=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),t.prototype.toggle=function(){this.dialog.isOpen?this.dialog.close():this.dialog.open()},t.prototype.select=function(e,t){this.$store.commit("selectImage",{index:t,collectionIndex:e}),this.dialog.close()},t.prototype.mounted=function(){this.$parent.$on("collectionstoggle",this.toggle),this.dialog=new Ee(document.getElementById("collections-dialog"))},t.prototype.beforeDestroy=function(){this.dialog.dispose(),this.dialog=null},t=I.b([D.a],t)}(x.default),Qe=Ye,Xe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"collections-menu floating-button"},[n("button",{staticClass:"collections-menu__toggle fade-when-inactive",attrs:{"data-odo-dialog-open":"collections-dialog",title:"open collections menu"}},[n("svg",{attrs:{viewBox:"0 0 14 16","aria-hidden":"true"}},[n("path",{attrs:{d:"M13 3H7c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 8H8V5h4v6zM4 4h1v1H4v6h1v1H4c-.55 0-1-.45-1-1V5c0-.55.45-1 1-1zM1 5h1v1H1v4h1v1H1c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1z","fill-rule":"evenodd"}})])]),e._v(" "),n("div",{staticClass:"odo-dialog collections-dialog",attrs:{id:"collections-dialog",role:"dialog","aria-labelledby":"collections-dialog-title","aria-hidden":"true"}},[n("div",{staticClass:"odo-dialog__content container",attrs:{role:"document"}},[n("div",{staticClass:"odo-dialog__inner"},[n("button",{staticClass:"odo-dialog__close",attrs:{type:"button","data-odo-dialog-close":"","aria-label":"Close this dialog window"}},[e._v("×")]),e._v(" "),e._m(0),e._v(" "),n("div",{staticClass:"dialog-content"},e._l(e.$store.state.collections,function(t,o){return n("div",{key:t.id,staticClass:"row"},[n("h3",{staticClass:"col-6@xs col-12@sm type-header-3 collections-menu__title"},[n("span",[e._v(e._s(t.name||"Collection "+(o+1)))]),e._v(" "),n("small",{directives:[{name:"show",rawName:"v-show",value:o===e.$store.state.selectedCollectionIndex,expression:"i === $store.state.selectedCollectionIndex"}]},[e._v("[current]")])]),e._v(" "),e._l(t.images,function(t,i){return n("div",{key:t.id,staticClass:"col-1@xs col-1@sm"},[n("button",{staticClass:"collections-menu__thumb-btn",on:{click:function(t){e.select(o,i)}}},[n("img",{staticClass:"collections-menu__thumb",class:{"collections-menu__thumb--selected":i===e.$store.state.selectedImages[o]},attrs:{src:t.src,alt:t.filename,title:t.filename}})])])})],2)}))])])])])},Ze=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dialog-header"},[n("h2",{staticClass:"type-header-2 marginless",attrs:{id:"collections-dialog-title"}},[e._v("Collections")])])}],et={render:Xe,staticRenderFns:Ze},tt=et,nt=n(1),ot=C,it=nt(Qe,tt,ot,null,null),st=it.exports,at={data:function(){return{shortcuts:[{keys:["→","J"],desc:"Next image"},{keys:["←","K"],desc:"Previous image"},{keys:["⇧ Click"],desc:"Navigate without scrolling to the top"},{keys:["1","2","3"],desc:"Switch collection (numbers 1 through 9)"},{keys:["?"],desc:"Toggle [this] help menu"},{keys:["S"],desc:"Toggle settings menu"},{keys:["C"],desc:"Toggle collection menu"},{keys:["H"],desc:"Hide Compdrop UI elements"},{keys:["R"],desc:"Remove all images"}]}}},lt=function(){var e=this,t=e.$createElement;e._self._c;return e._m(0)},rt=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("dl",{staticClass:"unstyled-list shortcut-list"},[e._l(e.shortcuts,function(t){return[n("dt",{key:t.desc,staticClass:"shortcut-item__triggers"},e._l(t.keys,function(t){return n("kbd",{key:t},[e._v(e._s(t))])})),e._v(" "),n("dd",{key:t.desc,staticClass:"shortcut-item__description"},[e._v(e._s(t.desc))])]})],2)}],ct={render:lt,staticRenderFns:rt},dt=ct,ut=n(1),ht=b,pt=ut(at,dt,ht,null,null),gt=pt.exports,mt=n(22),ft=function(){function e(){this.collections=[],this.selectedCollectionIndex=0,this.selectedImages=[]}return e}(),vt=ft;x.default.use(mt.a);var _t=new mt.a.Store({state:new vt,mutations:{addCollection:function(e,t){e.collections.push(t),x.default.set(e.selectedImages,e.collections.length-1,0)},updateCollectionImages:function(e,t){x.default.set(e.collections,t.index,{id:e.collections[t.index].id,name:e.collections[t.index].name,images:e.collections[t.index].images.concat(t.images)})},emptyCollections:function(e){e.collections=[],e.selectedImages=[],e.selectedCollectionIndex=0},setSelectedGroup:function(e,t){t>-1&&t1){var t=e.collections.reduce(function(e,t){return e+t.images.length},0);return w(e.collections.length,"collection")+" – "+w(t,"image")+" – compdrop"}return e.collections.length>0?w(e.collections[0].images.length,"image")+" – compdrop":"compdrop"}}});x.default.config.productionTip=!1,x.default.component("welcome-screen",J),x.default.component("loading-screen",ie),x.default.component("image-viewer",ge),x.default.component("collection-viewer",Ie),x.default.component("help-menu",He),x.default.component("settings-menu",We),x.default.component("collections-menu",st),x.default.component("keyboard-shortcuts",gt),new x.default({el:"#app",store:_t,template:"",components:{App:S}})},,function(e,t){},,function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},,,,function(e,t){},function(e,t){},function(e,t){}],[5]); -//# sourceMappingURL=app.38b0b83eac4be948b9a2.js.map \ No newline at end of file diff --git a/static/js/app.38b0b83eac4be948b9a2.js.map b/static/js/app.38b0b83eac4be948b9a2.js.map deleted file mode 100644 index 8acfe87..0000000 --- a/static/js/app.38b0b83eac4be948b9a2.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///static/js/app.38b0b83eac4be948b9a2.js","webpack:///./src/FileDropReader.ts","webpack:///./src/App.vue?eb80","webpack:///./src/App.vue?9e04","webpack:///./src/components/WelcomeScreen.vue?dca3","webpack:///./src/components/LoadingScreen.vue?2657","webpack:///./src/components/ImageViewer.vue?cbb1","webpack:///./src/components/CollectionViewer.vue","webpack:///./src/components/HelpMenu.vue?8c22","webpack:///./src/components/SettingsMenu.vue?e090","webpack:///./src/components/CollectionsMenu.vue?517a","webpack:///./src/components/KeyboardShortcuts.vue?8ca6","webpack:///./src/store.ts","webpack:///./src/App.vue?3e7d","webpack:///./src/components/WelcomeScreen.vue?456d","webpack:///./src/components/WelcomeScreen.vue?8a90","webpack:///./src/components/LoadingScreen.vue?9827","webpack:///./src/components/LoadingScreen.vue?0d7b","webpack:///./src/components/ImageViewer.vue?c5d4","webpack:///./src/components/ImageViewer.vue?ada2","webpack:///./src/components/CollectionViewer.vue?c2a6","webpack:///./src/components/CollectionViewer.vue?c485","webpack:///./src/Dialog.ts","webpack:///./src/components/HelpMenu.vue?637a","webpack:///./src/components/HelpMenu.vue?51fe","webpack:///./src/components/SettingsMenu.vue?552c","webpack:///./src/components/SettingsMenu.vue?ecef","webpack:///./src/components/CollectionsMenu.vue?af51","webpack:///./src/components/CollectionsMenu.vue?e964","webpack:///./src/components/KeyboardShortcuts.vue?9c81","webpack:///./src/components/KeyboardShortcuts.vue?2ade","webpack:///./src/state.ts","webpack:///./src/main.ts"],"names":["webpackJsonp","module","__webpack_exports__","__webpack_require__","partition","collection","predicate","truthy","falsy","forEach","item","push","flattenOnce","reduce","result","concat","getFile","entry","Promise","resolve","file","getFilesFromDirectoryEntry","collections","directoryName","getDirectoryName","fullPath","createReader","readEntries","entries","parts","isFile","all","map","then","files","fileCollection","name","directories","pathPieces","split","length","getFileExtension","fileName","matches","match","toLowerCase","isImageFile","type","includes","extension","VALID_IMAGE_EXTENSIONS","readFileAsDataURL","start","Date","now","reader","FileReader","onload","console","log","readAsDataURL","readDroppedItems","itemList","Array","from","webkitGetAsEntry","filter","_a","dirs","looseFiles","groups","unshift","uniqueId","count","injectStyle","ssrContext","WelcomeScreen_injectStyle","LoadingScreen_injectStyle","ImageViewer_injectStyle","CollectionViewer_injectStyle","HelpMenu_injectStyle","SettingsMenu_injectStyle","CollectionsMenu_injectStyle","KeyboardShortcuts_injectStyle","maybePluralize","noun","suffix","Object","defineProperty","value","vue_esm","tslib_es6","vue_class_component_common","vue_class_component_common_default","n","App_App","_super","App","_this","apply","this","arguments","hasContent","canDrop","isLoading","isCenteredImageMode","isScaledImageMode","isUserActive","prototype","_handleDragHover","evt","preventDefault","dataTransfer","dropEffect","_handleDragCancel","_handleDrop","done","requestAnimationFrame","items","_addFileList","_handleFilesChosen","promise","sort","a","b","localeCompare","renderFirstImageThenOthers","collectionName","collectionId","first","image","collectionIndex","label","shift","getDisplayImage","sent","$store","getters","totalCollections","commit","id","images","state","getDisplayImages","index","updatePageTitle","dataURL","filename","src","document","title","pageTitle","mounted","_handleKeyDown","bind","body","addEventListener","beforeDestroy","removeEventListener","handleUserAction","number","parseInt","key","isNumber","isNaN","helpToggle","settingsToggle","collectionsToggle","reset","metaKey","shiftKey","$emit","clearTimeout","timer","setTimeout","handleLayoutChange","isCenteredLayout","handleRetinaChange","isHalfSize","selectortype_script_index_0_src_App","render","_vm","_h","$createElement","_c","_self","class","layout-centered","user-inactive","is-loading","attrs","tabindex","on","mousemove","mousedown","_v","layoutchange","retinachange","directives","rawName","expression","can-drop","fileschosen","scale-images","staticRenderFns","esExports","selectortype_template_index_0_src_App","normalizeComponent","__vue_styles__","Component","src_App","WelcomeScreen_WelcomeScreen","WelcomeScreen","handleFiles","target","props","Boolean","required","components_WelcomeScreen","WelcomeScreen_render","staticClass","welcome-screen--can-drop","_m","accept","multiple","change","WelcomeScreen_staticRenderFns","for","WelcomeScreen_esExports","selectortype_template_index_0_src_components_WelcomeScreen","WelcomeScreen_normalizeComponent","WelcomeScreen___vue_styles__","WelcomeScreen_Component","src_components_WelcomeScreen","LoadingScreen_LoadingScreen","LoadingScreen","components_LoadingScreen","LoadingScreen_render","LoadingScreen_staticRenderFns","LoadingScreen_esExports","selectortype_template_index_0_src_components_LoadingScreen","LoadingScreen_normalizeComponent","LoadingScreen___vue_styles__","LoadingScreen_Component","src_components_LoadingScreen","ImageViewer_ImageViewer","ImageViewer","get","enumerable","configurable","selectedImages","setSelectedIndex","scrollToTop","window","scrollTo","handleNextTrigger","goToNext","handlePreviousTrigger","goToPrevious","selectedIndex","Number","scaleImages","components_ImageViewer","ImageViewer_render","click","keydown","$event","_k","keyCode","button","_l","displayImage","i","hidden","style","transform","alt","aria-label","stopPropagation","viewBox","d","ImageViewer_staticRenderFns","ImageViewer_esExports","selectortype_template_index_0_src_components_ImageViewer","ImageViewer_normalizeComponent","ImageViewer___vue_styles__","ImageViewer_Component","src_components_ImageViewer","CollectionViewer_CollectionViewer","CollectionViewer","selectedCollectionIndex","setSelectedGroup","imageViewer","getImageViewer","$el","focus","$refs","$parent","$on","created","components_CollectionViewer","CollectionViewer_render","ref","refInFor","collection-index","CollectionViewer_staticRenderFns","CollectionViewer_esExports","selectortype_template_index_0_src_components_CollectionViewer","CollectionViewer_normalizeComponent","CollectionViewer___vue_styles__","CollectionViewer_Component","src_components_CollectionViewer","dist_odo_dialog","dist_odo_dialog_default","Z_DIALOG","Dialog_Dialog","Dialog","z","getOpenDialogCount","Instances","instance","isOpen","getNextTopLayer","layers","Math","max","open","element","zIndex","backdrop","once","EventType","CLOSED","call","src_Dialog","HelpMenu_HelpMenu","HelpMenu","toggle","dialog","close","getElementById","dispose","components_HelpMenu","HelpMenu_render","HelpMenu_staticRenderFns","href","data-odo-dialog-open","aria-hidden","fill-rule","role","aria-labelledby","data-odo-dialog-close","HelpMenu_esExports","selectortype_template_index_0_src_components_HelpMenu","HelpMenu_normalizeComponent","HelpMenu___vue_styles__","HelpMenu_Component","src_components_HelpMenu","SettingsMenu_SettingsMenu","SettingsMenu","centeredLayout","retina","layoutChange","event","checked","retinaChange","components_SettingsMenu","SettingsMenu_render","domProps","SettingsMenu_staticRenderFns","SettingsMenu_esExports","selectortype_template_index_0_src_components_SettingsMenu","SettingsMenu_normalizeComponent","SettingsMenu___vue_styles__","SettingsMenu_Component","src_components_SettingsMenu","CollectionsMenu_CollectionsMenu","CollectionsMenu","select","imageIndex","components_CollectionsMenu","CollectionsMenu_render","_s","j","collections-menu__thumb--selected","CollectionsMenu_staticRenderFns","CollectionsMenu_esExports","selectortype_template_index_0_src_components_CollectionsMenu","CollectionsMenu_normalizeComponent","CollectionsMenu___vue_styles__","CollectionsMenu_Component","src_components_CollectionsMenu","KeyboardShortcuts","data","shortcuts","keys","desc","KeyboardShortcuts_render","KeyboardShortcuts_staticRenderFns","trigger","KeyboardShortcuts_esExports","components_KeyboardShortcuts","KeyboardShortcuts_normalizeComponent","KeyboardShortcuts___vue_styles__","KeyboardShortcuts_Component","src_components_KeyboardShortcuts","vuex_esm","State","src_state","use","store","Store","mutations","addCollection","set","updateCollectionImages","payload","emptyCollections","selectImage","totalImages","total","config","productionTip","component","el","template","components","exports"],"mappings":"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","file":"static/js/app.38b0b83eac4be948b9a2.js","sourcesContent":["webpackJsonp([1],[\n/* 0 */,\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */,\n/* 5 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n\n// EXTERNAL MODULE: ./node_modules/vue/dist/vue.esm.js\nvar vue_esm = __webpack_require__(0);\n\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(2);\n\n// EXTERNAL MODULE: ./node_modules/vue-class-component/dist/vue-class-component.common.js\nvar vue_class_component_common = __webpack_require__(3);\nvar vue_class_component_common_default = /*#__PURE__*/__webpack_require__.n(vue_class_component_common);\n\n// CONCATENATED MODULE: ./src/FileDropReader.ts\n/**\n * Does the same thing as lodash's _.partition\n */\nfunction partition(collection, predicate) {\n var truthy = [];\n var falsy = [];\n collection.forEach(function (item) {\n if (predicate(item)) {\n truthy.push(item);\n }\n else {\n falsy.push(item);\n }\n });\n return [truthy, falsy];\n}\n/**\n * Flatten an array, but only a single level deep.\n */\nfunction flattenOnce(collection) {\n return collection.reduce(function (result, collection) {\n return result.concat(collection);\n }, []);\n}\n/**\n * Get a File instance from an entry instance.\n */\nfunction getFile(entry) {\n return new Promise(function (resolve) {\n entry.file(resolve);\n });\n}\nfunction getFilesFromDirectoryEntry(entry, collections) {\n if (collections === void 0) { collections = []; }\n var directoryName = getDirectoryName(entry.fullPath);\n return new Promise(function (resolve) {\n entry.createReader().readEntries(function (entries) {\n // Split files and directories apart.\n var parts = partition(entries, function (entry) { return entry.isFile; });\n // Once all the initial files have been read, add them to the collections\n // array and start reading directories.\n Promise.all(parts[0].map(getFile)).then(function (files) {\n var fileCollection = {\n name: directoryName,\n files: files,\n };\n collections.push(fileCollection);\n // Recursively read directories.\n var directories = parts[1].map(function (entry) { return getFilesFromDirectoryEntry(entry, collections); });\n // Since the collections array is passed as an argument and mutated\n // within this recursive function, we don't care about the resolved\n // promise value for any recursed calls to this function.\n Promise.all(directories).then(function () {\n resolve(collections);\n });\n });\n });\n });\n}\nfunction getDirectoryName(fullPath) {\n var pathPieces = fullPath.split('/');\n return pathPieces[pathPieces.length - 1] || '';\n}\nfunction getFileExtension(fileName) {\n var matches = fileName && fileName.match(/\\.([^.]+)$/);\n if (matches) {\n return matches[1].toLowerCase();\n }\n return '';\n}\nvar VALID_IMAGE_EXTENSIONS = [\n 'bmp',\n 'gif',\n 'jpeg',\n 'jpg',\n 'jpe',\n 'png',\n 'svg',\n 'tiff',\n 'tif',\n 'webp',\n 'ico',\n];\nfunction isImageFile(file) {\n // Firefox doesn't support the `type` property - it's empty.\n if (file.type && file.type.includes('image/')) {\n return true;\n }\n var extension = getFileExtension(file.name);\n return VALID_IMAGE_EXTENSIONS.includes(extension);\n}\nfunction readFileAsDataURL(file) {\n var start = Date.now();\n return new Promise(function (resolve) {\n var reader = new FileReader();\n // Resolve promise when the reader finishes.\n reader.onload = function () {\n console.log(\"Read took \" + (Date.now() - start) + \" milliseconds\");\n resolve(reader.result);\n };\n // Start reader.\n reader.readAsDataURL(file);\n });\n}\nfunction readDroppedItems(itemList) {\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry\n var entries = Array.from(itemList)\n .map(function (item) { return item.webkitGetAsEntry(); })\n .filter(function (entry) { return !!entry; });\n var _a = partition(entries, function (entry) { return entry.isFile; }), files = _a[0], dirs = _a[1];\n return Promise.all([\n Promise.all(files.map(getFile)),\n Promise.all(dirs.map(function (entry) { return getFilesFromDirectoryEntry(entry); })),\n ]).then(function (result) {\n var looseFiles = result[0];\n var groups = result[1];\n // At this point, there we have an array which is 3 levels deep.\n // * Top level is the user's selection which they dropped.\n // * Next is a grouping of collections by directory\n // * Finally, the array of files in that directory.\n var collections = flattenOnce(groups);\n // Add loose files to the front.\n if (looseFiles.length) {\n collections.unshift({\n name: '',\n files: looseFiles,\n });\n }\n return collections;\n });\n}\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/App.vue\n\n\n\n\nvar count = 0;\nfunction uniqueId() {\n count += 1;\n return count;\n}\nvar App_App = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](App, _super);\n function App() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.hasContent = false;\n _this.canDrop = false;\n _this.isLoading = false;\n _this.isCenteredImageMode = true;\n _this.isScaledImageMode = false;\n // Activity watcher.\n _this.isUserActive = false;\n return _this;\n }\n App.prototype._handleDragHover = function (evt) {\n evt.preventDefault();\n evt.dataTransfer.dropEffect = 'copy';\n this.canDrop = true;\n };\n App.prototype._handleDragCancel = function (evt) {\n evt.preventDefault();\n this.canDrop = false;\n };\n App.prototype._handleDrop = function (evt) {\n var _this = this;\n evt.preventDefault();\n this.isLoading = true;\n var start = Date.now();\n var done = function () {\n _this.isLoading = false;\n requestAnimationFrame(function () {\n console.log(\"Drop took \" + (Date.now() - start) + \" milliseconds\");\n });\n };\n // Safari and IE don't support `items` property.\n if (evt.dataTransfer.items) {\n readDroppedItems(evt.dataTransfer.items).then(function (collections) {\n Promise.all(collections.map(_this._addFileList)).then(done);\n });\n }\n else {\n var fileCollection = {\n name: '',\n files: Array.from(evt.dataTransfer.files),\n };\n this._addFileList(fileCollection).then(done);\n }\n };\n App.prototype._handleFilesChosen = function (files) {\n this._addFileList({\n name: '',\n files: files,\n });\n };\n App.prototype._addFileList = function (fileCollection) {\n // Filter out non-images and sort by file name.\n var files = fileCollection.files\n .filter(isImageFile)\n .sort(function (a, b) { return a.name.localeCompare(b.name); });\n var promise;\n if (files.length > 0) {\n // Async load all files with a FileReader and update the images array when done.\n promise = this.renderFirstImageThenOthers(files, fileCollection.name);\n }\n else {\n promise = Promise.resolve();\n }\n // Hide drop messaging.\n this.canDrop = false;\n return promise;\n };\n App.prototype.renderFirstImageThenOthers = function (files, collectionName) {\n return tslib_es6[\"a\" /* __awaiter */](this, void 0, void 0, function () {\n var _this = this;\n var collectionId, first, image, collectionIndex;\n return tslib_es6[\"d\" /* __generator */](this, function (_a) {\n switch (_a.label) {\n case 0:\n collectionId = uniqueId();\n first = files.shift();\n return [4 /*yield*/, this.getDisplayImage(first)];\n case 1:\n image = _a.sent();\n collectionIndex = this.$store.getters.totalCollections;\n this.$store.commit('addCollection', {\n id: collectionId,\n name: collectionName,\n images: [image],\n });\n // Set flag for whether there was content after the first display image has\n // been read.\n this.hasContent = this.$store.state.collections.length > 0 || files.length > 0;\n // Wait a frame, then start reading the remaining files.\n return [2 /*return*/, new Promise(function (resolve) {\n requestAnimationFrame(function () {\n Promise.all(_this.getDisplayImages(files)).then(function (images) {\n _this.$store.commit('updateCollectionImages', {\n index: collectionIndex,\n images: images,\n });\n _this.updatePageTitle();\n resolve();\n });\n });\n })];\n }\n });\n });\n };\n App.prototype.getDisplayImages = function (files) {\n return files.map(this.getDisplayImage);\n };\n App.prototype.getDisplayImage = function (file) {\n return readFileAsDataURL(file).then(function (dataURL) {\n return {\n id: uniqueId(),\n filename: file.name,\n src: dataURL,\n };\n });\n };\n App.prototype.updatePageTitle = function () {\n document.title = this.$store.getters.pageTitle;\n };\n App.prototype.mounted = function () {\n this._handleKeyDown = this._handleKeyDown.bind(this);\n this._handleDragHover = this._handleDragHover.bind(this);\n this._handleDragCancel = this._handleDragCancel.bind(this);\n this._handleDrop = this._handleDrop.bind(this);\n document.body.addEventListener('keydown', this._handleKeyDown);\n document.body.addEventListener('dragover', this._handleDragHover);\n document.body.addEventListener('dragleave', this._handleDragCancel);\n document.body.addEventListener('drop', this._handleDrop);\n };\n App.prototype.beforeDestroy = function () {\n document.body.removeEventListener('keydown', this._handleKeyDown);\n document.body.removeEventListener('dragover', this._handleDragHover);\n document.body.removeEventListener('dragleave', this._handleDragCancel);\n document.body.removeEventListener('drop', this._handleDrop);\n };\n App.prototype._handleKeyDown = function (evt) {\n this.handleUserAction();\n var number = parseInt(evt.key, 10);\n var isNumber = !isNaN(number);\n if (evt.key === '?') {\n this.helpToggle();\n }\n else if (evt.key === 's') {\n this.settingsToggle();\n }\n else if (evt.key === 'c') {\n this.collectionsToggle();\n }\n else if (evt.key === 'h') {\n this.isUserActive = false;\n }\n else if (evt.key === 'r') {\n this.reset();\n this.updatePageTitle();\n }\n else if (this.hasContent && isNumber && !evt.metaKey && !evt.shiftKey) {\n this.$emit('selectgroup', number - 1);\n }\n };\n App.prototype.helpToggle = function () {\n this.$emit('helptoggle');\n };\n App.prototype.settingsToggle = function () {\n this.$emit('settingstoggle');\n };\n App.prototype.collectionsToggle = function () {\n this.$emit('collectionstoggle');\n };\n App.prototype.reset = function () {\n this.$store.commit('emptyCollections');\n this.hasContent = false;\n };\n // Activity watcher\n App.prototype.handleUserAction = function () {\n var _this = this;\n clearTimeout(this.timer);\n this.isUserActive = true;\n this.timer = setTimeout(function () {\n _this.isUserActive = false;\n }, 3000);\n };\n App.prototype.handleLayoutChange = function (isCenteredLayout) {\n this.isCenteredImageMode = isCenteredLayout;\n };\n App.prototype.handleRetinaChange = function (isHalfSize) {\n this.isScaledImageMode = isHalfSize;\n };\n App = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], App);\n return App;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var selectortype_script_index_0_src_App = (App_App);\n;\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6cb1e5d3\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n class: {\n 'layout-centered': _vm.isCenteredImageMode,\n 'user-inactive': !_vm.isUserActive,\n 'is-loading': _vm.isLoading,\n },\n attrs: {\n \"id\": \"app\",\n \"tabindex\": \"-1\"\n },\n on: {\n \"mousemove\": _vm.handleUserAction,\n \"mousedown\": _vm.handleUserAction\n }\n }, [_c('help-menu'), _vm._v(\" \"), _c('settings-menu', {\n on: {\n \"layoutchange\": _vm.handleLayoutChange,\n \"retinachange\": _vm.handleRetinaChange\n }\n }), _vm._v(\" \"), _c('collections-menu', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.hasContent),\n expression: \"hasContent\"\n }]\n }), _vm._v(\" \"), _c('main', [_c('welcome-screen', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (!_vm.hasContent),\n expression: \"!hasContent\"\n }],\n attrs: {\n \"can-drop\": _vm.canDrop\n },\n on: {\n \"fileschosen\": _vm._handleFilesChosen\n }\n }), _vm._v(\" \"), _c('loading-screen', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.isLoading),\n expression: \"isLoading\"\n }]\n }), _vm._v(\" \"), _c('collection-viewer', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.hasContent),\n expression: \"hasContent\"\n }],\n attrs: {\n \"scale-images\": _vm.isScaledImageMode\n }\n })], 1)], 1)\n}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_App = (esExports);\n// CONCATENATED MODULE: ./src/App.vue\nfunction injectStyle (ssrContext) {\n __webpack_require__(7)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n selectortype_script_index_0_src_App,\n selectortype_template_index_0_src_App,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ var src_App = (Component.exports);\n\n// EXTERNAL MODULE: ./node_modules/@odopod/odo-dialog/css/odo-dialog.css\nvar odo_dialog = __webpack_require__(9);\nvar odo_dialog_default = /*#__PURE__*/__webpack_require__.n(odo_dialog);\n\n// EXTERNAL MODULE: ./src/styles.css\nvar styles = __webpack_require__(10);\nvar styles_default = /*#__PURE__*/__webpack_require__.n(styles);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/WelcomeScreen.vue\n\n\n\nvar WelcomeScreen_WelcomeScreen = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](WelcomeScreen, _super);\n function WelcomeScreen() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n WelcomeScreen.prototype.handleFiles = function (evt) {\n var target = evt.target;\n this.$emit('fileschosen', Array.from(target.files));\n target.value = '';\n };\n WelcomeScreen = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default()({\n props: {\n canDrop: {\n type: Boolean,\n required: true,\n },\n },\n })\n ], WelcomeScreen);\n return WelcomeScreen;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_WelcomeScreen = (WelcomeScreen_WelcomeScreen);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5ad0e49a\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/WelcomeScreen.vue\nvar WelcomeScreen_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"welcome-screen\",\n class: {\n 'welcome-screen--can-drop': _vm.canDrop\n }\n }, [_c('div', {\n staticClass: \"welcome-screen__inner\"\n }, [_c('div', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (!_vm.canDrop),\n expression: \"!canDrop\"\n }],\n staticClass: \"type--center\"\n }, [_c('p', {\n staticClass: \"type-header-1\"\n }, [_vm._v(\"Drop images here.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"png, jpg, gif, bmp\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('input', {\n staticClass: \"welcome-screen__file-input\",\n attrs: {\n \"type\": \"file\",\n \"accept\": \"image/*\",\n \"multiple\": \"\",\n \"id\": \"file-input\"\n },\n on: {\n \"change\": _vm.handleFiles\n }\n })]), _vm._v(\" \"), _c('div', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.canDrop),\n expression: \"canDrop\"\n }]\n }, [_c('p', {\n staticClass: \"type-header-1\"\n }, [_vm._v(\"Release!\")])])])])\n}\nvar WelcomeScreen_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('label', {\n staticClass: \"btn\",\n attrs: {\n \"for\": \"file-input\"\n }\n }, [_vm._v(\"Choose files\")])])\n}]\nvar WelcomeScreen_esExports = { render: WelcomeScreen_render, staticRenderFns: WelcomeScreen_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_WelcomeScreen = (WelcomeScreen_esExports);\n// CONCATENATED MODULE: ./src/components/WelcomeScreen.vue\nfunction WelcomeScreen_injectStyle (ssrContext) {\n __webpack_require__(11)\n}\nvar WelcomeScreen_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar WelcomeScreen___vue_styles__ = WelcomeScreen_injectStyle\n/* scopeId */\nvar WelcomeScreen___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar WelcomeScreen___vue_module_identifier__ = null\nvar WelcomeScreen_Component = WelcomeScreen_normalizeComponent(\n components_WelcomeScreen,\n selectortype_template_index_0_src_components_WelcomeScreen,\n WelcomeScreen___vue_styles__,\n WelcomeScreen___vue_scopeId__,\n WelcomeScreen___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_WelcomeScreen = (WelcomeScreen_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/LoadingScreen.vue\n\n\n\nvar LoadingScreen_LoadingScreen = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](LoadingScreen, _super);\n function LoadingScreen() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n LoadingScreen = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], LoadingScreen);\n return LoadingScreen;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_LoadingScreen = (LoadingScreen_LoadingScreen);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6a5269e6\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/LoadingScreen.vue\nvar LoadingScreen_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(1)\n}\nvar LoadingScreen_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"loading-screen__inner\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless loading-screen__text\"\n }, [_vm._v(\"Loading files\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"loading-screen\"\n }, [_vm._m(0)])\n}]\nvar LoadingScreen_esExports = { render: LoadingScreen_render, staticRenderFns: LoadingScreen_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_LoadingScreen = (LoadingScreen_esExports);\n// CONCATENATED MODULE: ./src/components/LoadingScreen.vue\nfunction LoadingScreen_injectStyle (ssrContext) {\n __webpack_require__(12)\n}\nvar LoadingScreen_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar LoadingScreen___vue_styles__ = LoadingScreen_injectStyle\n/* scopeId */\nvar LoadingScreen___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar LoadingScreen___vue_module_identifier__ = null\nvar LoadingScreen_Component = LoadingScreen_normalizeComponent(\n components_LoadingScreen,\n selectortype_template_index_0_src_components_LoadingScreen,\n LoadingScreen___vue_styles__,\n LoadingScreen___vue_scopeId__,\n LoadingScreen___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_LoadingScreen = (LoadingScreen_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/ImageViewer.vue\n\n\n\nvar ImageViewer_ImageViewer = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](ImageViewer, _super);\n function ImageViewer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ImageViewer.prototype, \"images\", {\n get: function () {\n return this.$store.state.collections[this.collectionIndex].images;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ImageViewer.prototype, \"selectedIndex\", {\n get: function () {\n return this.$store.state.selectedImages[this.collectionIndex];\n },\n enumerable: true,\n configurable: true\n });\n ImageViewer.prototype.setSelectedIndex = function (index, scrollToTop) {\n if (scrollToTop === void 0) { scrollToTop = true; }\n if (index >= 0 || index < this.images.length) {\n this.$store.commit('selectImage', {\n index: index,\n collectionIndex: this.collectionIndex,\n });\n if (scrollToTop) {\n window.scrollTo(0, 0);\n }\n }\n };\n ImageViewer.prototype.handleNextTrigger = function (evt) {\n this.goToNext(evt.shiftKey === false);\n };\n ImageViewer.prototype.handlePreviousTrigger = function (evt) {\n this.goToPrevious(evt.shiftKey === false);\n };\n ImageViewer.prototype.goToNext = function (scrollToTop) {\n this.setSelectedIndex(this.selectedIndex === this.images.length - 1 ?\n 0 :\n this.selectedIndex + 1, scrollToTop);\n };\n ImageViewer.prototype.goToPrevious = function (scrollToTop) {\n this.setSelectedIndex(this.selectedIndex === 0 ?\n this.images.length - 1 :\n this.selectedIndex - 1, scrollToTop);\n };\n ImageViewer = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default()({\n props: {\n collectionIndex: Number,\n scaleImages: Boolean,\n },\n })\n ], ImageViewer);\n return ImageViewer;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_ImageViewer = (ImageViewer_ImageViewer);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1b816e52\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/ImageViewer.vue\nvar ImageViewer_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"image-viewer\",\n attrs: {\n \"tabindex\": \"-1\"\n },\n on: {\n \"click\": _vm.handleNextTrigger,\n \"keydown\": [function($event) {\n if (!('button' in $event) && _vm._k($event.keyCode, \"left\", 37)) { return null; }\n if ('button' in $event && $event.button !== 0) { return null; }\n $event.preventDefault();\n _vm.handlePreviousTrigger($event)\n }, function($event) {\n if (!('button' in $event) && $event.keyCode !== 75) { return null; }\n $event.preventDefault();\n _vm.handlePreviousTrigger($event)\n }, function($event) {\n if (!('button' in $event) && _vm._k($event.keyCode, \"right\", 39)) { return null; }\n if ('button' in $event && $event.button !== 2) { return null; }\n $event.preventDefault();\n _vm.handleNextTrigger($event)\n }, function($event) {\n if (!('button' in $event) && $event.keyCode !== 74) { return null; }\n $event.preventDefault();\n _vm.handleNextTrigger($event)\n }]\n }\n }, [_c('div', {\n staticClass: \"image-viewer__images\"\n }, _vm._l((_vm.images), function(displayImage, i) {\n return _c('div', {\n key: displayImage.id,\n staticClass: \"image-viewer__wrap\",\n class: {\n hidden: i !== _vm.selectedIndex\n },\n style: ({\n transform: _vm.scaleImages ? 'scale(0.5)' : 'none'\n })\n }, [_c('img', {\n staticClass: \"image-viewer__img\",\n attrs: {\n \"src\": displayImage.src,\n \"alt\": displayImage.filename\n }\n })])\n })), _vm._v(\" \"), _c('button', {\n staticClass: \"nav-button nav-button--next fade-when-inactive\",\n attrs: {\n \"aria-label\": \"next image\"\n },\n on: {\n \"click\": function($event) {\n $event.stopPropagation();\n _vm.handleNextTrigger($event)\n }\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"75.4 27 461.2 738\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M167.7 27l368.9 369-368.9 369-92.3-92.3 276.7-276.7-276.7-276.7z\"\n }\n })])]), _vm._v(\" \"), _c('button', {\n staticClass: \"nav-button nav-button--prev fade-when-inactive\",\n attrs: {\n \"aria-label\": \"previous image\"\n },\n on: {\n \"click\": function($event) {\n $event.stopPropagation();\n _vm.handlePreviousTrigger($event)\n }\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"75.396 26.994 461.208 738.012\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M444.336 765.006l-368.94-369.006 368.94-369.006 92.268 92.268-276.738 276.738 276.738 276.738z\"\n }\n })])])])\n}\nvar ImageViewer_staticRenderFns = []\nvar ImageViewer_esExports = { render: ImageViewer_render, staticRenderFns: ImageViewer_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_ImageViewer = (ImageViewer_esExports);\n// CONCATENATED MODULE: ./src/components/ImageViewer.vue\nfunction ImageViewer_injectStyle (ssrContext) {\n __webpack_require__(13)\n}\nvar ImageViewer_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar ImageViewer___vue_styles__ = ImageViewer_injectStyle\n/* scopeId */\nvar ImageViewer___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar ImageViewer___vue_module_identifier__ = null\nvar ImageViewer_Component = ImageViewer_normalizeComponent(\n components_ImageViewer,\n selectortype_template_index_0_src_components_ImageViewer,\n ImageViewer___vue_styles__,\n ImageViewer___vue_scopeId__,\n ImageViewer___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_ImageViewer = (ImageViewer_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/CollectionViewer.vue\n\n\n\nvar CollectionViewer_CollectionViewer = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](CollectionViewer, _super);\n function CollectionViewer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(CollectionViewer.prototype, \"selectedIndex\", {\n get: function () {\n return this.$store.state.selectedCollectionIndex;\n },\n enumerable: true,\n configurable: true\n });\n CollectionViewer.prototype.setSelectedGroup = function (index) {\n this.$store.commit('setSelectedGroup', index);\n // Focus on the image viewer element so the bound keyboard events work.\n var imageViewer = this.getImageViewer(index);\n requestAnimationFrame(function () {\n imageViewer.$el.focus();\n });\n };\n CollectionViewer.prototype.getImageViewer = function (index) {\n return this.$refs.imageViewer[index];\n };\n CollectionViewer.prototype.mounted = function () {\n this.$parent.$on('selectgroup', this.setSelectedGroup);\n };\n CollectionViewer.prototype.created = function () {\n this.$store.commit('setSelectedGroup', 0);\n };\n CollectionViewer = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default()({\n props: {\n scaleImages: Boolean,\n },\n })\n ], CollectionViewer);\n return CollectionViewer;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_CollectionViewer = (CollectionViewer_CollectionViewer);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5c68a21b\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CollectionViewer.vue\nvar CollectionViewer_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"collection-viewer\"\n }, _vm._l((_vm.$store.state.collections), function(collection, i) {\n return _c('image-viewer', {\n key: collection.id,\n ref: \"imageViewer\",\n refInFor: true,\n class: {\n hidden: i !== _vm.selectedIndex\n },\n attrs: {\n \"collection-index\": i,\n \"scale-images\": _vm.scaleImages\n }\n })\n }))\n}\nvar CollectionViewer_staticRenderFns = []\nvar CollectionViewer_esExports = { render: CollectionViewer_render, staticRenderFns: CollectionViewer_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_CollectionViewer = (CollectionViewer_esExports);\n// CONCATENATED MODULE: ./src/components/CollectionViewer.vue\nfunction CollectionViewer_injectStyle (ssrContext) {\n __webpack_require__(14)\n}\nvar CollectionViewer_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar CollectionViewer___vue_styles__ = CollectionViewer_injectStyle\n/* scopeId */\nvar CollectionViewer___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar CollectionViewer___vue_module_identifier__ = null\nvar CollectionViewer_Component = CollectionViewer_normalizeComponent(\n components_CollectionViewer,\n selectortype_template_index_0_src_components_CollectionViewer,\n CollectionViewer___vue_styles__,\n CollectionViewer___vue_scopeId__,\n CollectionViewer___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_CollectionViewer = (CollectionViewer_Component.exports);\n\n// EXTERNAL MODULE: ./node_modules/@odopod/odo-dialog/dist/odo-dialog.js\nvar dist_odo_dialog = __webpack_require__(16);\nvar dist_odo_dialog_default = /*#__PURE__*/__webpack_require__.n(dist_odo_dialog);\n\n// CONCATENATED MODULE: ./src/Dialog.ts\n\n\nvar Z_DIALOG = 1050;\nvar Dialog_Dialog = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](Dialog, _super);\n function Dialog() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.z = Z_DIALOG;\n return _this;\n }\n Dialog.getOpenDialogCount = function () {\n return dist_odo_dialog_default.a.Instances.filter(function (instance) { return instance.isOpen; }).length;\n };\n Dialog.getNextTopLayer = function () {\n var layers = dist_odo_dialog_default.a.Instances.map(function (instance) { return instance.z; });\n return Math.max.apply(Math, layers) + 20;\n };\n Dialog.prototype.open = function () {\n var _this = this;\n if (Dialog.getOpenDialogCount() > 0) {\n this.z = Dialog.getNextTopLayer();\n this.element.style.zIndex = '' + this.z;\n this.backdrop.style.zIndex = '' + (this.z - 5);\n this.once(dist_odo_dialog_default.a.EventType.CLOSED, function () {\n _this.z = Z_DIALOG;\n _this.element.style.zIndex = '';\n _this.backdrop.style.zIndex = '';\n });\n }\n _super.prototype.open.call(this);\n };\n return Dialog;\n}(dist_odo_dialog_default.a));\n/* harmony default export */ var src_Dialog = (Dialog_Dialog);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/HelpMenu.vue\n\n\n\n\nvar HelpMenu_HelpMenu = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](HelpMenu, _super);\n function HelpMenu() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n HelpMenu.prototype.toggle = function () {\n if (this.dialog.isOpen) {\n this.dialog.close();\n }\n else {\n this.dialog.open();\n }\n };\n HelpMenu.prototype.mounted = function () {\n this.$parent.$on('helptoggle', this.toggle);\n this.dialog = new src_Dialog(document.getElementById('help-dialog'));\n };\n HelpMenu.prototype.beforeDestroy = function () {\n this.dialog.dispose();\n this.dialog = null;\n };\n HelpMenu = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], HelpMenu);\n return HelpMenu;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_HelpMenu = (HelpMenu_HelpMenu);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4b5401ea\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HelpMenu.vue\nvar HelpMenu_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(2)\n}\nvar HelpMenu_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"help-dialog-title\"\n }\n }, [_vm._v(\"Compdrop Help\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"col-6@xs col-6@sm\"\n }, [_c('h3', {\n staticClass: \"type-header-3\"\n }, [_vm._v(\"What is this?\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Compdrop is a simple way to view website designs in a desktop browser. Just drag and drop your images into the browser. Images are aligned to the top of the window and horizontally centered.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"You are viewing files on \"), _c('em', [_vm._v(\"your own machine\")]), _vm._v(\". Compdrop \"), _c('strong', [_vm._v(\"does not store any of your data\")]), _vm._v(\".\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Built by \"), _c('a', {\n attrs: {\n \"href\": \"https://glencheney.com\"\n }\n }, [_vm._v(\"Glen Cheney\")]), _vm._v(\". Based on the original \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/lucasishuman/cmpdrp\"\n }\n }, [_vm._v(\"cmpdrp\")]), _vm._v(\".\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Compdrop is a progressive web app and you can use it even if you’re have no internet connection.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"View the project on \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/Vestride/compdrop\"\n }\n }, [_vm._v(\"GitHub\")]), _vm._v(\".\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"help-menu floating-button\"\n }, [_c('button', {\n staticClass: \"help-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"help-dialog\",\n \"title\": \"open help menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M6.3 5.69c-.19-.19-.28-.42-.28-.7 0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7-.19.18-.42.3-.7.3-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\",\n \"fill-rule\": \"evenodd\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog help-dialog\",\n attrs: {\n \"id\": \"help-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"help-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"row dialog-content\"\n }, [_vm._m(1), _vm._v(\" \"), _c('div', {\n staticClass: \"col-6@xs col-6@sm\"\n }, [_c('h3', {\n staticClass: \"type-header-3\"\n }, [_vm._v(\"Keyboard Shortcuts\")]), _vm._v(\" \"), _c('keyboard-shortcuts')], 1)])])])])])\n}]\nvar HelpMenu_esExports = { render: HelpMenu_render, staticRenderFns: HelpMenu_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_HelpMenu = (HelpMenu_esExports);\n// CONCATENATED MODULE: ./src/components/HelpMenu.vue\nfunction HelpMenu_injectStyle (ssrContext) {\n __webpack_require__(15)\n}\nvar HelpMenu_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar HelpMenu___vue_styles__ = HelpMenu_injectStyle\n/* scopeId */\nvar HelpMenu___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar HelpMenu___vue_module_identifier__ = null\nvar HelpMenu_Component = HelpMenu_normalizeComponent(\n components_HelpMenu,\n selectortype_template_index_0_src_components_HelpMenu,\n HelpMenu___vue_styles__,\n HelpMenu___vue_scopeId__,\n HelpMenu___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_HelpMenu = (HelpMenu_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/SettingsMenu.vue\n\n\n\n\nvar SettingsMenu_SettingsMenu = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](SettingsMenu, _super);\n function SettingsMenu() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.centeredLayout = true;\n _this.retina = false;\n return _this;\n }\n SettingsMenu.prototype.toggle = function () {\n if (this.dialog.isOpen) {\n this.dialog.close();\n }\n else {\n this.dialog.open();\n }\n };\n SettingsMenu.prototype.mounted = function () {\n this.$parent.$on('settingstoggle', this.toggle);\n this.dialog = new src_Dialog(document.getElementById('settings-dialog'));\n };\n SettingsMenu.prototype.beforeDestroy = function () {\n this.dialog.dispose();\n this.dialog = null;\n };\n SettingsMenu.prototype.layoutChange = function (event) {\n var target = event.target;\n this.centeredLayout = target.checked;\n this.$emit('layoutchange', this.centeredLayout);\n };\n SettingsMenu.prototype.retinaChange = function (event) {\n var target = event.target;\n this.retina = target.checked;\n this.$emit('retinachange', this.retina);\n };\n SettingsMenu = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], SettingsMenu);\n return SettingsMenu;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_SettingsMenu = (SettingsMenu_SettingsMenu);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6f06986d\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/SettingsMenu.vue\nvar SettingsMenu_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"settings-menu floating-button\"\n }, [_c('button', {\n staticClass: \"settings-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"settings-dialog\",\n \"title\": \"open settings menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"fill-rule\": \"evenodd\",\n \"d\": \"M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog settings-dialog\",\n attrs: {\n \"id\": \"settings-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"settings-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"row dialog-content\"\n }, [_c('div', {\n staticClass: \"col-6@xs col-12@sm\"\n }, [_c('div', [_c('input', {\n attrs: {\n \"type\": \"checkbox\",\n \"id\": \"checkbox-centered-layout\"\n },\n domProps: {\n \"checked\": _vm.centeredLayout\n },\n on: {\n \"change\": _vm.layoutChange\n }\n }), _vm._v(\" \"), _c('label', {\n attrs: {\n \"for\": \"checkbox-centered-layout\"\n }\n }, [_vm._v(\"Center images (turn off to scroll them)\")])]), _vm._v(\" \"), _c('div', [_c('input', {\n attrs: {\n \"type\": \"checkbox\",\n \"id\": \"checkbox-retina\"\n },\n domProps: {\n \"checked\": _vm.retina\n },\n on: {\n \"change\": _vm.retinaChange\n }\n }), _vm._v(\" \"), _c('label', {\n attrs: {\n \"for\": \"checkbox-retina\"\n }\n }, [_vm._v(\"Scale images to half size\")])])])])])])])])\n}\nvar SettingsMenu_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"settings-dialog-title\"\n }\n }, [_vm._v(\"Compdrop Settings\")])])\n}]\nvar SettingsMenu_esExports = { render: SettingsMenu_render, staticRenderFns: SettingsMenu_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_SettingsMenu = (SettingsMenu_esExports);\n// CONCATENATED MODULE: ./src/components/SettingsMenu.vue\nfunction SettingsMenu_injectStyle (ssrContext) {\n __webpack_require__(19)\n}\nvar SettingsMenu_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar SettingsMenu___vue_styles__ = SettingsMenu_injectStyle\n/* scopeId */\nvar SettingsMenu___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar SettingsMenu___vue_module_identifier__ = null\nvar SettingsMenu_Component = SettingsMenu_normalizeComponent(\n components_SettingsMenu,\n selectortype_template_index_0_src_components_SettingsMenu,\n SettingsMenu___vue_styles__,\n SettingsMenu___vue_scopeId__,\n SettingsMenu___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_SettingsMenu = (SettingsMenu_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/CollectionsMenu.vue\n\n\n\n\nvar CollectionsMenu_CollectionsMenu = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](CollectionsMenu, _super);\n function CollectionsMenu() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n CollectionsMenu.prototype.toggle = function () {\n if (this.dialog.isOpen) {\n this.dialog.close();\n }\n else {\n this.dialog.open();\n }\n };\n CollectionsMenu.prototype.select = function (collectionIndex, imageIndex) {\n this.$store.commit('selectImage', {\n index: imageIndex,\n collectionIndex: collectionIndex,\n });\n this.dialog.close();\n };\n CollectionsMenu.prototype.mounted = function () {\n this.$parent.$on('collectionstoggle', this.toggle);\n this.dialog = new src_Dialog(document.getElementById('collections-dialog'));\n };\n CollectionsMenu.prototype.beforeDestroy = function () {\n this.dialog.dispose();\n this.dialog = null;\n };\n CollectionsMenu = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], CollectionsMenu);\n return CollectionsMenu;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_CollectionsMenu = (CollectionsMenu_CollectionsMenu);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7c48f999\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CollectionsMenu.vue\nvar CollectionsMenu_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"collections-menu floating-button\"\n }, [_c('button', {\n staticClass: \"collections-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"collections-dialog\",\n \"title\": \"open collections menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M13 3H7c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 8H8V5h4v6zM4 4h1v1H4v6h1v1H4c-.55 0-1-.45-1-1V5c0-.55.45-1 1-1zM1 5h1v1H1v4h1v1H1c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1z\",\n \"fill-rule\": \"evenodd\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog collections-dialog\",\n attrs: {\n \"id\": \"collections-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"collections-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"dialog-content\"\n }, _vm._l((_vm.$store.state.collections), function(collection, i) {\n return _c('div', {\n key: collection.id,\n staticClass: \"row\"\n }, [_c('h3', {\n staticClass: \"col-6@xs col-12@sm type-header-3 collections-menu__title\"\n }, [_c('span', [_vm._v(_vm._s(collection.name || (\"Collection \" + (i + 1))))]), _vm._v(\" \"), _c('small', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (i === _vm.$store.state.selectedCollectionIndex),\n expression: \"i === $store.state.selectedCollectionIndex\"\n }]\n }, [_vm._v(\"[current]\")])]), _vm._v(\" \"), _vm._l((collection.images), function(image, j) {\n return _c('div', {\n key: image.id,\n staticClass: \"col-1@xs col-1@sm\"\n }, [_c('button', {\n staticClass: \"collections-menu__thumb-btn\",\n on: {\n \"click\": function($event) {\n _vm.select(i, j)\n }\n }\n }, [_c('img', {\n staticClass: \"collections-menu__thumb\",\n class: {\n 'collections-menu__thumb--selected': j === _vm.$store.state.selectedImages[i]\n },\n attrs: {\n \"src\": image.src,\n \"alt\": image.filename,\n \"title\": image.filename\n }\n })])])\n })], 2)\n }))])])])])\n}\nvar CollectionsMenu_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"collections-dialog-title\"\n }\n }, [_vm._v(\"Collections\")])])\n}]\nvar CollectionsMenu_esExports = { render: CollectionsMenu_render, staticRenderFns: CollectionsMenu_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_CollectionsMenu = (CollectionsMenu_esExports);\n// CONCATENATED MODULE: ./src/components/CollectionsMenu.vue\nfunction CollectionsMenu_injectStyle (ssrContext) {\n __webpack_require__(20)\n}\nvar CollectionsMenu_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar CollectionsMenu___vue_styles__ = CollectionsMenu_injectStyle\n/* scopeId */\nvar CollectionsMenu___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar CollectionsMenu___vue_module_identifier__ = null\nvar CollectionsMenu_Component = CollectionsMenu_normalizeComponent(\n components_CollectionsMenu,\n selectortype_template_index_0_src_components_CollectionsMenu,\n CollectionsMenu___vue_styles__,\n CollectionsMenu___vue_scopeId__,\n CollectionsMenu___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_CollectionsMenu = (CollectionsMenu_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/KeyboardShortcuts.vue\n/* harmony default export */ var KeyboardShortcuts = ({\n data: function () {\n return {\n shortcuts: [\n {\n keys: ['→', 'J'],\n desc: 'Next image',\n },\n {\n keys: ['←', 'K'],\n desc: 'Previous image',\n },\n {\n keys: ['⇧ Click'],\n desc: 'Navigate without scrolling to the top',\n },\n {\n keys: ['1', '2', '3'],\n desc: 'Switch collection (numbers 1 through 9)',\n },\n {\n keys: ['?'],\n desc: 'Toggle [this] help menu',\n },\n {\n keys: ['S'],\n desc: 'Toggle settings menu',\n },\n {\n keys: ['C'],\n desc: 'Toggle collection menu',\n },\n {\n keys: ['H'],\n desc: 'Hide Compdrop UI elements',\n },\n {\n keys: ['R'],\n desc: 'Remove all images',\n },\n ],\n };\n }\n});\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-57d8198b\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/KeyboardShortcuts.vue\nvar KeyboardShortcuts_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(0)\n}\nvar KeyboardShortcuts_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('dl', {\n staticClass: \"unstyled-list shortcut-list\"\n }, [_vm._l((_vm.shortcuts), function(item) {\n return [_c('dt', {\n key: item.desc,\n staticClass: \"shortcut-item__triggers\"\n }, _vm._l((item.keys), function(trigger) {\n return _c('kbd', {\n key: trigger\n }, [_vm._v(_vm._s(trigger))])\n })), _vm._v(\" \"), _c('dd', {\n key: item.desc,\n staticClass: \"shortcut-item__description\"\n }, [_vm._v(_vm._s(item.desc))])]\n })], 2)\n}]\nvar KeyboardShortcuts_esExports = { render: KeyboardShortcuts_render, staticRenderFns: KeyboardShortcuts_staticRenderFns }\n/* harmony default export */ var components_KeyboardShortcuts = (KeyboardShortcuts_esExports);\n// CONCATENATED MODULE: ./src/components/KeyboardShortcuts.vue\nfunction KeyboardShortcuts_injectStyle (ssrContext) {\n __webpack_require__(21)\n}\nvar KeyboardShortcuts_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar KeyboardShortcuts___vue_styles__ = KeyboardShortcuts_injectStyle\n/* scopeId */\nvar KeyboardShortcuts___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar KeyboardShortcuts___vue_module_identifier__ = null\nvar KeyboardShortcuts_Component = KeyboardShortcuts_normalizeComponent(\n KeyboardShortcuts,\n components_KeyboardShortcuts,\n KeyboardShortcuts___vue_styles__,\n KeyboardShortcuts___vue_scopeId__,\n KeyboardShortcuts___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_KeyboardShortcuts = (KeyboardShortcuts_Component.exports);\n\n// EXTERNAL MODULE: ./node_modules/vuex/dist/vuex.esm.js\nvar vuex_esm = __webpack_require__(22);\n\n// CONCATENATED MODULE: ./src/state.ts\nvar State = /** @class */ (function () {\n function State() {\n this.collections = [];\n this.selectedCollectionIndex = 0;\n this.selectedImages = [];\n }\n return State;\n}());\n/* harmony default export */ var src_state = (State);\n;\n\n// CONCATENATED MODULE: ./src/store.ts\n\n\n\nvue_esm[\"default\"].use(vuex_esm[\"a\" /* default */]);\nfunction maybePluralize(count, noun, suffix) {\n if (suffix === void 0) { suffix = 's'; }\n return count + \" \" + noun + (count !== 1 ? suffix : '');\n}\n/* harmony default export */ var store = (new vuex_esm[\"a\" /* default */].Store({\n state: new src_state(),\n mutations: {\n addCollection: function (state, collection) {\n state.collections.push(collection);\n vue_esm[\"default\"].set(state.selectedImages, state.collections.length - 1, 0);\n },\n updateCollectionImages: function (state, payload) {\n vue_esm[\"default\"].set(state.collections, payload.index, {\n id: state.collections[payload.index].id,\n name: state.collections[payload.index].name,\n images: state.collections[payload.index].images.concat(payload.images),\n });\n },\n emptyCollections: function (state) {\n state.collections = [];\n state.selectedImages = [];\n state.selectedCollectionIndex = 0;\n },\n setSelectedGroup: function (state, index) {\n if (index > -1 && index < state.collections.length) {\n state.selectedCollectionIndex = index;\n }\n },\n selectImage: function (state, payload) {\n vue_esm[\"default\"].set(state.selectedImages, payload.collectionIndex, payload.index);\n state.selectedCollectionIndex = payload.collectionIndex;\n }\n },\n getters: {\n totalCollections: function (state) {\n return state.collections.length;\n },\n pageTitle: function (state) {\n if (state.collections.length > 1) {\n var totalImages = state.collections.reduce(function (total, collection) { return total + collection.images.length; }, 0);\n return maybePluralize(state.collections.length, 'collection') + \" \\u2013 \" + maybePluralize(totalImages, 'image') + \" \\u2013 compdrop\";\n }\n if (state.collections.length > 0) {\n return maybePluralize(state.collections[0].images.length, 'image') + \" \\u2013 compdrop\";\n }\n return 'compdrop';\n }\n }\n}));\n\n// CONCATENATED MODULE: ./src/main.ts\n\n\n\n\n\n\n\n\n\n\n\n\n\nvue_esm[\"default\"].config.productionTip = false;\nvue_esm[\"default\"].component('welcome-screen', src_components_WelcomeScreen);\nvue_esm[\"default\"].component('loading-screen', src_components_LoadingScreen);\nvue_esm[\"default\"].component('image-viewer', src_components_ImageViewer);\nvue_esm[\"default\"].component('collection-viewer', src_components_CollectionViewer);\nvue_esm[\"default\"].component('help-menu', src_components_HelpMenu);\nvue_esm[\"default\"].component('settings-menu', src_components_SettingsMenu);\nvue_esm[\"default\"].component('collections-menu', src_components_CollectionsMenu);\nvue_esm[\"default\"].component('keyboard-shortcuts', src_components_KeyboardShortcuts);\n/* eslint-disable no-new */\nnew vue_esm[\"default\"]({\n el: '#app',\n store: store,\n template: '',\n components: { App: src_App },\n});\n\n\n/***/ }),\n/* 6 */,\n/* 7 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 8 */,\n/* 9 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 16 */,\n/* 17 */,\n/* 18 */,\n/* 19 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ })\n],[5]);\n\n\n// WEBPACK FOOTER //\n// static/js/app.38b0b83eac4be948b9a2.js","import FileCollection from './FileCollection';\n\n// https://wicg.github.io/entries-api/#api-directoryreader\ninterface FileSystemDirectoryReader {\n readEntries(successCallback: (entries: FileSystemEntry[]) => void, errorCallback?: () => void): void;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry\ninterface FileSystemEntry {\n readonly filesystem: any;\n readonly fullPath: string;\n readonly isDirectory: boolean;\n readonly isFile: boolean;\n readonly name: string;\n createReader(): FileSystemDirectoryReader;\n file(callback: (file: File) => void): void;\n}\n\n/**\n * Does the same thing as lodash's _.partition\n */\nfunction partition(collection: T[], predicate: (item: T) => boolean): T[][] {\n const truthy: T[] = [];\n const falsy: T[] = [];\n collection.forEach((item: T) => {\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item);\n }\n });\n return [truthy, falsy];\n}\n\n/**\n * Flatten an array, but only a single level deep.\n */\nfunction flattenOnce(collection: T[][]): T[] {\n return collection.reduce((result: T[], collection: T[]) => {\n return result.concat(collection);\n }, []);\n}\n\n/**\n * Get a File instance from an entry instance.\n */\nfunction getFile(entry: FileSystemEntry): Promise {\n return new Promise((resolve) => {\n entry.file(resolve);\n });\n}\n\nfunction getFilesFromDirectoryEntry(entry: FileSystemEntry, collections: FileCollection[] = []): Promise {\n const directoryName = getDirectoryName(entry.fullPath);\n return new Promise((resolve) => {\n entry.createReader().readEntries((entries: FileSystemEntry[]) => {\n // Split files and directories apart.\n const parts = partition(entries, entry => entry.isFile);\n\n // Once all the initial files have been read, add them to the collections\n // array and start reading directories.\n Promise.all(parts[0].map(getFile)).then((files: File[]) => {\n const fileCollection: FileCollection = {\n name: directoryName,\n files: files,\n };\n collections.push(fileCollection);\n // Recursively read directories.\n const directories = parts[1].map(entry => getFilesFromDirectoryEntry(entry, collections));\n // Since the collections array is passed as an argument and mutated\n // within this recursive function, we don't care about the resolved\n // promise value for any recursed calls to this function.\n Promise.all(directories).then(() => {\n resolve(collections);\n });\n });\n });\n });\n}\n\nfunction getDirectoryName(fullPath: string): string {\n const pathPieces = fullPath.split('/');\n return pathPieces[pathPieces.length - 1] || '';\n}\n\nfunction getFileExtension(fileName: string): string {\n const matches = fileName && fileName.match(/\\.([^.]+)$/);\n if (matches) {\n return matches[1].toLowerCase();\n }\n\n return '';\n}\n\nconst VALID_IMAGE_EXTENSIONS = [\n 'bmp',\n 'gif',\n 'jpeg',\n 'jpg',\n 'jpe',\n 'png',\n 'svg',\n 'tiff',\n 'tif',\n 'webp',\n 'ico',\n];\n\nexport function isImageFile(file: File): boolean {\n // Firefox doesn't support the `type` property - it's empty.\n if (file.type && file.type.includes('image/')) {\n return true;\n }\n\n const extension = getFileExtension(file.name);\n return VALID_IMAGE_EXTENSIONS.includes(extension);\n}\n\nexport function readFileAsDataURL(file: File): Promise {\n const start = Date.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n\n // Resolve promise when the reader finishes.\n reader.onload = () => {\n console.log(`Read took ${Date.now() - start} milliseconds`)\n resolve(reader.result as string);\n };\n\n // Start reader.\n reader.readAsDataURL(file);\n });\n}\n\nexport function readDroppedItems(itemList: DataTransferItemList): Promise {\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry\n const entries = Array.from(itemList)\n .map(item => item.webkitGetAsEntry())\n .filter(entry => !!entry);\n\n const [files, dirs] = partition(entries, (entry: FileSystemEntry) => entry.isFile);\n\n return Promise.all([\n Promise.all(files.map(getFile)),\n Promise.all(dirs.map(entry => getFilesFromDirectoryEntry(entry))),\n ]).then((result) => {\n const looseFiles: File[] = result[0];\n const groups: FileCollection[][] = result[1];\n\n // At this point, there we have an array which is 3 levels deep.\n // * Top level is the user's selection which they dropped.\n // * Next is a grouping of collections by directory\n // * Finally, the array of files in that directory.\n const collections = flattenOnce(groups);\n\n // Add loose files to the front.\n if (looseFiles.length) {\n collections.unshift({\n name: '',\n files: looseFiles,\n });\n }\n\n return collections;\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/FileDropReader.ts","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport DisplayImage from './DisplayImage';\nimport Collection from './Collection';\nimport FileCollection from './FileCollection';\nimport { readDroppedItems, readFileAsDataURL, isImageFile } from './FileDropReader';\n\nlet count = 0;\nfunction uniqueId(): number {\n count += 1;\n return count;\n}\n\n@Component\nexport default class App extends Vue {\n hasContent: boolean = false;\n canDrop: boolean = false;\n isLoading: boolean = false;\n isCenteredImageMode: boolean = true;\n isScaledImageMode: boolean = false;\n\n // Activity watcher.\n isUserActive: boolean = false;\n timer: number;\n\n _handleDragHover(evt: DragEvent): void {\n evt.preventDefault();\n evt.dataTransfer.dropEffect = 'copy';\n this.canDrop = true;\n }\n\n _handleDragCancel(evt: DragEvent): void {\n evt.preventDefault();\n this.canDrop = false;\n }\n\n _handleDrop(evt: DragEvent): void {\n evt.preventDefault();\n\n this.isLoading = true;\n const start = Date.now();\n\n const done = () => {\n this.isLoading = false;\n requestAnimationFrame(() => {\n console.log(`Drop took ${Date.now() - start} milliseconds`)\n });\n };\n\n // Safari and IE don't support `items` property.\n if (evt.dataTransfer.items) {\n readDroppedItems(evt.dataTransfer.items).then((collections: FileCollection[]) => {\n Promise.all(collections.map(this._addFileList)).then(done);\n });\n } else {\n const fileCollection: FileCollection = {\n name: '',\n files: Array.from(evt.dataTransfer.files),\n };\n this._addFileList(fileCollection).then(done);\n }\n }\n\n _handleFilesChosen(files: File[]): void {\n this._addFileList({\n name: '',\n files: files,\n });\n }\n\n _addFileList(fileCollection: FileCollection): Promise {\n // Filter out non-images and sort by file name.\n const files = fileCollection.files\n .filter(isImageFile)\n .sort((a: File, b: File): number => a.name.localeCompare(b.name));\n\n let promise;\n\n if (files.length > 0) {\n // Async load all files with a FileReader and update the images array when done.\n promise = this.renderFirstImageThenOthers(files, fileCollection.name);\n } else {\n promise = Promise.resolve();\n }\n\n // Hide drop messaging.\n this.canDrop = false;\n\n return promise;\n }\n\n async renderFirstImageThenOthers(files: File[], collectionName: string): Promise {\n const collectionId = uniqueId();\n // Remove the first file from the array.\n const first = files.shift();\n\n // Read the file and update the images property so that Vue re-renders.\n // This intentionally blocks execution for reading the other files.\n const image = await this.getDisplayImage(first);\n const collectionIndex = this.$store.getters.totalCollections as number;\n this.$store.commit('addCollection', {\n id: collectionId,\n name: collectionName,\n images: [image],\n });\n\n // Set flag for whether there was content after the first display image has\n // been read.\n this.hasContent = this.$store.state.collections.length > 0 || files.length > 0;\n\n // Wait a frame, then start reading the remaining files.\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n Promise.all(this.getDisplayImages(files)).then((images) => {\n this.$store.commit('updateCollectionImages', {\n index: collectionIndex,\n images: images,\n });\n this.updatePageTitle();\n resolve();\n });\n });\n });\n }\n\n getDisplayImages(files: File[]): Promise[] {\n return files.map(this.getDisplayImage);\n }\n\n getDisplayImage(file: File): Promise {\n return readFileAsDataURL(file).then((dataURL: string) => {\n return {\n id: uniqueId(),\n filename: file.name,\n src: dataURL,\n };\n });\n }\n\n updatePageTitle(): void {\n document.title = this.$store.getters.pageTitle as string;\n }\n\n mounted(): void {\n this._handleKeyDown = this._handleKeyDown.bind(this);\n this._handleDragHover = this._handleDragHover.bind(this);\n this._handleDragCancel = this._handleDragCancel.bind(this);\n this._handleDrop = this._handleDrop.bind(this);\n document.body.addEventListener('keydown', this._handleKeyDown);\n document.body.addEventListener('dragover', this._handleDragHover);\n document.body.addEventListener('dragleave', this._handleDragCancel);\n document.body.addEventListener('drop', this._handleDrop);\n }\n\n beforeDestroy(): void {\n document.body.removeEventListener('keydown', this._handleKeyDown);\n document.body.removeEventListener('dragover', this._handleDragHover);\n document.body.removeEventListener('dragleave', this._handleDragCancel);\n document.body.removeEventListener('drop', this._handleDrop);\n }\n\n _handleKeyDown(evt: KeyboardEvent): void {\n this.handleUserAction();\n const number = parseInt(evt.key, 10);\n const isNumber = !isNaN(number);\n\n if (evt.key === '?') {\n this.helpToggle();\n } else if (evt.key === 's') {\n this.settingsToggle();\n } else if (evt.key === 'c') {\n this.collectionsToggle();\n } else if (evt.key === 'h') {\n this.isUserActive = false;\n } else if (evt.key === 'r') {\n this.reset();\n this.updatePageTitle();\n } else if (this.hasContent && isNumber && !evt.metaKey && !evt.shiftKey) {\n this.$emit('selectgroup', number - 1);\n }\n }\n\n helpToggle(): void {\n this.$emit('helptoggle');\n }\n\n settingsToggle(): void {\n this.$emit('settingstoggle');\n }\n\n collectionsToggle(): void {\n this.$emit('collectionstoggle');\n }\n\n reset(): void {\n this.$store.commit('emptyCollections');\n this.hasContent = false;\n }\n\n // Activity watcher\n handleUserAction(): void {\n clearTimeout(this.timer);\n this.isUserActive = true;\n this.timer = setTimeout(() => {\n this.isUserActive = false;\n }, 3000);\n }\n\n handleLayoutChange(isCenteredLayout: boolean): void {\n this.isCenteredImageMode = isCenteredLayout;\n }\n\n handleRetinaChange(isHalfSize: boolean): void {\n this.isScaledImageMode = isHalfSize;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/App.vue","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6cb1e5d3\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6cb1e5d3\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5ad0e49a\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./WelcomeScreen.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./WelcomeScreen.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5ad0e49a\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./WelcomeScreen.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/WelcomeScreen.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6a5269e6\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./LoadingScreen.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./LoadingScreen.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6a5269e6\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./LoadingScreen.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/LoadingScreen.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1b816e52\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./ImageViewer.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./ImageViewer.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1b816e52\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./ImageViewer.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/ImageViewer.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5c68a21b\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./CollectionViewer.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./CollectionViewer.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5c68a21b\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./CollectionViewer.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/CollectionViewer.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4b5401ea\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./HelpMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HelpMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4b5401ea\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./HelpMenu.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/HelpMenu.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6f06986d\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./SettingsMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./SettingsMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6f06986d\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./SettingsMenu.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/SettingsMenu.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-7c48f999\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./CollectionsMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./CollectionsMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7c48f999\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./CollectionsMenu.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/CollectionsMenu.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-57d8198b\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./KeyboardShortcuts.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./KeyboardShortcuts.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-57d8198b\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./KeyboardShortcuts.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/KeyboardShortcuts.vue\n// module id = null\n// module chunks = ","import Vue from 'vue';\nimport Vuex from 'vuex';\nimport State from './state';\nimport Collection from './Collection';\nimport DisplayImage from './DisplayImage';\n\nVue.use(Vuex);\n\nfunction maybePluralize(count: number, noun: string, suffix: string = 's') {\n return `${count} ${noun}${count !== 1 ? suffix : ''}`;\n}\n\nexport default new Vuex.Store({\n state: new State(),\n mutations: {\n addCollection(state: State, collection: Collection): void {\n state.collections.push(collection);\n Vue.set(state.selectedImages, state.collections.length - 1, 0);\n },\n updateCollectionImages(state: State, payload: { index: number, images: DisplayImage[] }): void {\n Vue.set(state.collections, payload.index, {\n id: state.collections[payload.index].id,\n name: state.collections[payload.index].name,\n images: state.collections[payload.index].images.concat(payload.images),\n });\n },\n emptyCollections(state: State): void {\n state.collections = [];\n state.selectedImages = [];\n state.selectedCollectionIndex = 0;\n },\n setSelectedGroup(state: State, index: number): void {\n if (index > -1 && index < state.collections.length) {\n state.selectedCollectionIndex = index;\n }\n },\n selectImage(state: State, payload: { index: number, collectionIndex: number }): void {\n Vue.set(state.selectedImages, payload.collectionIndex, payload.index);\n state.selectedCollectionIndex = payload.collectionIndex;\n }\n },\n getters: {\n totalCollections(state: State): number {\n return state.collections.length;\n },\n pageTitle(state: State): string {\n if (state.collections.length > 1) {\n const totalImages = state.collections.reduce((total, collection) => total + collection.images.length, 0);\n return `${maybePluralize(state.collections.length, 'collection')} – ${maybePluralize(totalImages, 'image')} – compdrop`;\n }\n\n if (state.collections.length > 0) {\n return `${maybePluralize(state.collections[0].images.length, 'image')} – compdrop`;\n }\n\n return 'compdrop';\n }\n }\n});\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/store.ts","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n class: {\n 'layout-centered': _vm.isCenteredImageMode,\n 'user-inactive': !_vm.isUserActive,\n 'is-loading': _vm.isLoading,\n },\n attrs: {\n \"id\": \"app\",\n \"tabindex\": \"-1\"\n },\n on: {\n \"mousemove\": _vm.handleUserAction,\n \"mousedown\": _vm.handleUserAction\n }\n }, [_c('help-menu'), _vm._v(\" \"), _c('settings-menu', {\n on: {\n \"layoutchange\": _vm.handleLayoutChange,\n \"retinachange\": _vm.handleRetinaChange\n }\n }), _vm._v(\" \"), _c('collections-menu', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.hasContent),\n expression: \"hasContent\"\n }]\n }), _vm._v(\" \"), _c('main', [_c('welcome-screen', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (!_vm.hasContent),\n expression: \"!hasContent\"\n }],\n attrs: {\n \"can-drop\": _vm.canDrop\n },\n on: {\n \"fileschosen\": _vm._handleFilesChosen\n }\n }), _vm._v(\" \"), _c('loading-screen', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.isLoading),\n expression: \"isLoading\"\n }]\n }), _vm._v(\" \"), _c('collection-viewer', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.hasContent),\n expression: \"hasContent\"\n }],\n attrs: {\n \"scale-images\": _vm.isScaledImageMode\n }\n })], 1)], 1)\n}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6cb1e5d3\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\n\n@Component({\n props: {\n canDrop: {\n type: Boolean,\n required: true,\n },\n },\n})\nexport default class WelcomeScreen extends Vue {\n canDrop: boolean;\n\n handleFiles(evt: Event): void {\n const target = evt.target as HTMLInputElement;\n this.$emit('fileschosen', Array.from(target.files));\n target.value = '';\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/WelcomeScreen.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"welcome-screen\",\n class: {\n 'welcome-screen--can-drop': _vm.canDrop\n }\n }, [_c('div', {\n staticClass: \"welcome-screen__inner\"\n }, [_c('div', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (!_vm.canDrop),\n expression: \"!canDrop\"\n }],\n staticClass: \"type--center\"\n }, [_c('p', {\n staticClass: \"type-header-1\"\n }, [_vm._v(\"Drop images here.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"png, jpg, gif, bmp\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('input', {\n staticClass: \"welcome-screen__file-input\",\n attrs: {\n \"type\": \"file\",\n \"accept\": \"image/*\",\n \"multiple\": \"\",\n \"id\": \"file-input\"\n },\n on: {\n \"change\": _vm.handleFiles\n }\n })]), _vm._v(\" \"), _c('div', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.canDrop),\n expression: \"canDrop\"\n }]\n }, [_c('p', {\n staticClass: \"type-header-1\"\n }, [_vm._v(\"Release!\")])])])])\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('label', {\n staticClass: \"btn\",\n attrs: {\n \"for\": \"file-input\"\n }\n }, [_vm._v(\"Choose files\")])])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5ad0e49a\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/WelcomeScreen.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\n\n@Component\nexport default class LoadingScreen extends Vue {\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/LoadingScreen.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(1)\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"loading-screen__inner\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless loading-screen__text\"\n }, [_vm._v(\"Loading files\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"loading-screen\"\n }, [_vm._m(0)])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6a5269e6\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/LoadingScreen.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport DisplayImage from '../DisplayImage';\n\n@Component({\n props: {\n collectionIndex: Number,\n scaleImages: Boolean,\n },\n})\nexport default class ImageViewer extends Vue {\n scaleImages: boolean;\n collectionIndex: number;\n\n get images(): DisplayImage[] {\n return this.$store.state.collections[this.collectionIndex].images;\n }\n\n get selectedIndex(): number {\n return this.$store.state.selectedImages[this.collectionIndex];\n }\n\n setSelectedIndex(index: number, scrollToTop: boolean = true): void {\n if (index >= 0 || index < this.images.length) {\n this.$store.commit('selectImage', {\n index: index,\n collectionIndex: this.collectionIndex,\n });\n\n if (scrollToTop) {\n window.scrollTo(0, 0);\n }\n }\n }\n\n handleNextTrigger(evt: MouseEvent | KeyboardEvent): void {\n this.goToNext(evt.shiftKey === false);\n }\n\n handlePreviousTrigger(evt: MouseEvent | KeyboardEvent): void {\n this.goToPrevious(evt.shiftKey === false);\n }\n\n goToNext(scrollToTop: boolean): void {\n this.setSelectedIndex(this.selectedIndex === this.images.length - 1 ?\n 0 :\n this.selectedIndex + 1, scrollToTop);\n }\n\n goToPrevious(scrollToTop: boolean): void {\n this.setSelectedIndex(this.selectedIndex === 0 ?\n this.images.length - 1 :\n this.selectedIndex - 1, scrollToTop);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/ImageViewer.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"image-viewer\",\n attrs: {\n \"tabindex\": \"-1\"\n },\n on: {\n \"click\": _vm.handleNextTrigger,\n \"keydown\": [function($event) {\n if (!('button' in $event) && _vm._k($event.keyCode, \"left\", 37)) { return null; }\n if ('button' in $event && $event.button !== 0) { return null; }\n $event.preventDefault();\n _vm.handlePreviousTrigger($event)\n }, function($event) {\n if (!('button' in $event) && $event.keyCode !== 75) { return null; }\n $event.preventDefault();\n _vm.handlePreviousTrigger($event)\n }, function($event) {\n if (!('button' in $event) && _vm._k($event.keyCode, \"right\", 39)) { return null; }\n if ('button' in $event && $event.button !== 2) { return null; }\n $event.preventDefault();\n _vm.handleNextTrigger($event)\n }, function($event) {\n if (!('button' in $event) && $event.keyCode !== 74) { return null; }\n $event.preventDefault();\n _vm.handleNextTrigger($event)\n }]\n }\n }, [_c('div', {\n staticClass: \"image-viewer__images\"\n }, _vm._l((_vm.images), function(displayImage, i) {\n return _c('div', {\n key: displayImage.id,\n staticClass: \"image-viewer__wrap\",\n class: {\n hidden: i !== _vm.selectedIndex\n },\n style: ({\n transform: _vm.scaleImages ? 'scale(0.5)' : 'none'\n })\n }, [_c('img', {\n staticClass: \"image-viewer__img\",\n attrs: {\n \"src\": displayImage.src,\n \"alt\": displayImage.filename\n }\n })])\n })), _vm._v(\" \"), _c('button', {\n staticClass: \"nav-button nav-button--next fade-when-inactive\",\n attrs: {\n \"aria-label\": \"next image\"\n },\n on: {\n \"click\": function($event) {\n $event.stopPropagation();\n _vm.handleNextTrigger($event)\n }\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"75.4 27 461.2 738\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M167.7 27l368.9 369-368.9 369-92.3-92.3 276.7-276.7-276.7-276.7z\"\n }\n })])]), _vm._v(\" \"), _c('button', {\n staticClass: \"nav-button nav-button--prev fade-when-inactive\",\n attrs: {\n \"aria-label\": \"previous image\"\n },\n on: {\n \"click\": function($event) {\n $event.stopPropagation();\n _vm.handlePreviousTrigger($event)\n }\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"75.396 26.994 461.208 738.012\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M444.336 765.006l-368.94-369.006 368.94-369.006 92.268 92.268-276.738 276.738 276.738 276.738z\"\n }\n })])])])\n}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1b816e52\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/ImageViewer.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport Collection from '../Collection';\nimport DisplayImage from '../DisplayImage';\nimport ImageViewer from './ImageViewer.vue';\n\n@Component({\n props: {\n scaleImages: Boolean,\n },\n})\nexport default class CollectionViewer extends Vue {\n scaleImages: boolean;\n\n get selectedIndex(): number {\n return this.$store.state.selectedCollectionIndex;\n }\n\n setSelectedGroup(index: number): void {\n this.$store.commit('setSelectedGroup', index);\n // Focus on the image viewer element so the bound keyboard events work.\n const imageViewer = this.getImageViewer(index);\n requestAnimationFrame(() => {\n imageViewer.$el.focus();\n });\n }\n\n getImageViewer(index: number): ImageViewer {\n return (this.$refs.imageViewer)[index] as ImageViewer;\n }\n\n mounted(): void {\n this.$parent.$on('selectgroup', this.setSelectedGroup);\n }\n\n created(): void {\n this.$store.commit('setSelectedGroup', 0);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/CollectionViewer.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"collection-viewer\"\n }, _vm._l((_vm.$store.state.collections), function(collection, i) {\n return _c('image-viewer', {\n key: collection.id,\n ref: \"imageViewer\",\n refInFor: true,\n class: {\n hidden: i !== _vm.selectedIndex\n },\n attrs: {\n \"collection-index\": i,\n \"scale-images\": _vm.scaleImages\n }\n })\n }))\n}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5c68a21b\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CollectionViewer.vue\n// module id = null\n// module chunks = ","import OdoDialog from '@odopod/odo-dialog';\n\nconst Z_DIALOG = 1050;\n\nclass Dialog extends OdoDialog {\n z: number = Z_DIALOG;\n\n static getOpenDialogCount(): number {\n return OdoDialog.Instances.filter((instance: Dialog) => instance.isOpen).length;\n }\n\n static getNextTopLayer(): number {\n const layers = OdoDialog.Instances.map((instance: Dialog) => instance.z);\n return Math.max(...layers) + 20;\n }\n\n open(): void {\n if (Dialog.getOpenDialogCount() > 0) {\n this.z = Dialog.getNextTopLayer();\n (this.element as HTMLElement).style.zIndex = '' + this.z;\n (this.backdrop as HTMLElement).style.zIndex = '' + (this.z - 5);\n\n this.once(OdoDialog.EventType.CLOSED, () => {\n this.z = Z_DIALOG;\n (this.element as HTMLElement).style.zIndex = '';\n (this.backdrop as HTMLElement).style.zIndex = '';\n });\n }\n\n super.open();\n }\n}\n\nexport default Dialog;\n\n\n\n// WEBPACK FOOTER //\n// ./src/Dialog.ts","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport Dialog from '../Dialog';\n\n@Component\nexport default class HelpMenu extends Vue {\n dialog: Dialog;\n\n toggle(): void {\n if (this.dialog.isOpen) {\n this.dialog.close();\n } else {\n this.dialog.open();\n }\n }\n\n mounted(): void {\n this.$parent.$on('helptoggle', this.toggle);\n this.dialog = new Dialog(document.getElementById('help-dialog'));\n }\n\n beforeDestroy(): void {\n this.dialog.dispose();\n this.dialog = null;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/HelpMenu.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(2)\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"help-dialog-title\"\n }\n }, [_vm._v(\"Compdrop Help\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"col-6@xs col-6@sm\"\n }, [_c('h3', {\n staticClass: \"type-header-3\"\n }, [_vm._v(\"What is this?\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Compdrop is a simple way to view website designs in a desktop browser. Just drag and drop your images into the browser. Images are aligned to the top of the window and horizontally centered.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"You are viewing files on \"), _c('em', [_vm._v(\"your own machine\")]), _vm._v(\". Compdrop \"), _c('strong', [_vm._v(\"does not store any of your data\")]), _vm._v(\".\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Built by \"), _c('a', {\n attrs: {\n \"href\": \"https://glencheney.com\"\n }\n }, [_vm._v(\"Glen Cheney\")]), _vm._v(\". Based on the original \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/lucasishuman/cmpdrp\"\n }\n }, [_vm._v(\"cmpdrp\")]), _vm._v(\".\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Compdrop is a progressive web app and you can use it even if you’re have no internet connection.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"View the project on \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/Vestride/compdrop\"\n }\n }, [_vm._v(\"GitHub\")]), _vm._v(\".\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"help-menu floating-button\"\n }, [_c('button', {\n staticClass: \"help-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"help-dialog\",\n \"title\": \"open help menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M6.3 5.69c-.19-.19-.28-.42-.28-.7 0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7-.19.18-.42.3-.7.3-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\",\n \"fill-rule\": \"evenodd\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog help-dialog\",\n attrs: {\n \"id\": \"help-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"help-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"row dialog-content\"\n }, [_vm._m(1), _vm._v(\" \"), _c('div', {\n staticClass: \"col-6@xs col-6@sm\"\n }, [_c('h3', {\n staticClass: \"type-header-3\"\n }, [_vm._v(\"Keyboard Shortcuts\")]), _vm._v(\" \"), _c('keyboard-shortcuts')], 1)])])])])])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4b5401ea\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HelpMenu.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport Dialog from '../Dialog';\n\n@Component\nexport default class SettingsMenu extends Vue {\n dialog: Dialog;\n centeredLayout: boolean = true;\n retina: boolean = false;\n\n toggle(): void {\n if (this.dialog.isOpen) {\n this.dialog.close();\n } else {\n this.dialog.open();\n }\n }\n\n mounted(): void {\n this.$parent.$on('settingstoggle', this.toggle);\n this.dialog = new Dialog(document.getElementById('settings-dialog'));\n }\n\n beforeDestroy(): void {\n this.dialog.dispose();\n this.dialog = null;\n }\n\n layoutChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.centeredLayout = target.checked;\n this.$emit('layoutchange', this.centeredLayout);\n }\n\n retinaChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.retina = target.checked;\n this.$emit('retinachange', this.retina);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/SettingsMenu.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"settings-menu floating-button\"\n }, [_c('button', {\n staticClass: \"settings-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"settings-dialog\",\n \"title\": \"open settings menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"fill-rule\": \"evenodd\",\n \"d\": \"M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog settings-dialog\",\n attrs: {\n \"id\": \"settings-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"settings-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"row dialog-content\"\n }, [_c('div', {\n staticClass: \"col-6@xs col-12@sm\"\n }, [_c('div', [_c('input', {\n attrs: {\n \"type\": \"checkbox\",\n \"id\": \"checkbox-centered-layout\"\n },\n domProps: {\n \"checked\": _vm.centeredLayout\n },\n on: {\n \"change\": _vm.layoutChange\n }\n }), _vm._v(\" \"), _c('label', {\n attrs: {\n \"for\": \"checkbox-centered-layout\"\n }\n }, [_vm._v(\"Center images (turn off to scroll them)\")])]), _vm._v(\" \"), _c('div', [_c('input', {\n attrs: {\n \"type\": \"checkbox\",\n \"id\": \"checkbox-retina\"\n },\n domProps: {\n \"checked\": _vm.retina\n },\n on: {\n \"change\": _vm.retinaChange\n }\n }), _vm._v(\" \"), _c('label', {\n attrs: {\n \"for\": \"checkbox-retina\"\n }\n }, [_vm._v(\"Scale images to half size\")])])])])])])])])\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"settings-dialog-title\"\n }\n }, [_vm._v(\"Compdrop Settings\")])])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6f06986d\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/SettingsMenu.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport Dialog from '../Dialog';\nimport Collection from '../Collection';\n\n@Component\nexport default class CollectionsMenu extends Vue {\n dialog: Dialog;\n\n toggle(): void {\n if (this.dialog.isOpen) {\n this.dialog.close();\n } else {\n this.dialog.open();\n }\n }\n\n select(collectionIndex: number, imageIndex: number): void {\n this.$store.commit('selectImage', {\n index: imageIndex,\n collectionIndex: collectionIndex,\n });\n this.dialog.close();\n }\n\n mounted(): void {\n this.$parent.$on('collectionstoggle', this.toggle);\n this.dialog = new Dialog(document.getElementById('collections-dialog'));\n }\n\n beforeDestroy(): void {\n this.dialog.dispose();\n this.dialog = null;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/CollectionsMenu.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"collections-menu floating-button\"\n }, [_c('button', {\n staticClass: \"collections-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"collections-dialog\",\n \"title\": \"open collections menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M13 3H7c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 8H8V5h4v6zM4 4h1v1H4v6h1v1H4c-.55 0-1-.45-1-1V5c0-.55.45-1 1-1zM1 5h1v1H1v4h1v1H1c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1z\",\n \"fill-rule\": \"evenodd\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog collections-dialog\",\n attrs: {\n \"id\": \"collections-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"collections-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"dialog-content\"\n }, _vm._l((_vm.$store.state.collections), function(collection, i) {\n return _c('div', {\n key: collection.id,\n staticClass: \"row\"\n }, [_c('h3', {\n staticClass: \"col-6@xs col-12@sm type-header-3 collections-menu__title\"\n }, [_c('span', [_vm._v(_vm._s(collection.name || (\"Collection \" + (i + 1))))]), _vm._v(\" \"), _c('small', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (i === _vm.$store.state.selectedCollectionIndex),\n expression: \"i === $store.state.selectedCollectionIndex\"\n }]\n }, [_vm._v(\"[current]\")])]), _vm._v(\" \"), _vm._l((collection.images), function(image, j) {\n return _c('div', {\n key: image.id,\n staticClass: \"col-1@xs col-1@sm\"\n }, [_c('button', {\n staticClass: \"collections-menu__thumb-btn\",\n on: {\n \"click\": function($event) {\n _vm.select(i, j)\n }\n }\n }, [_c('img', {\n staticClass: \"collections-menu__thumb\",\n class: {\n 'collections-menu__thumb--selected': j === _vm.$store.state.selectedImages[i]\n },\n attrs: {\n \"src\": image.src,\n \"alt\": image.filename,\n \"title\": image.filename\n }\n })])])\n })], 2)\n }))])])])])\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"collections-dialog-title\"\n }\n }, [_vm._v(\"Collections\")])])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7c48f999\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CollectionsMenu.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\nexport default {\n data() {\n return {\n shortcuts: [\n {\n keys: ['→', 'J'],\n desc: 'Next image',\n },\n {\n keys: ['←', 'K'],\n desc: 'Previous image',\n },\n {\n keys: ['⇧ Click'],\n desc: 'Navigate without scrolling to the top',\n },\n {\n keys: ['1', '2', '3'],\n desc: 'Switch collection (numbers 1 through 9)',\n },\n {\n keys: ['?'],\n desc: 'Toggle [this] help menu',\n },\n {\n keys: ['S'],\n desc: 'Toggle settings menu',\n },\n {\n keys: ['C'],\n desc: 'Toggle collection menu',\n },\n {\n keys: ['H'],\n desc: 'Hide Compdrop UI elements',\n },\n {\n keys: ['R'],\n desc: 'Remove all images',\n },\n ],\n };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/KeyboardShortcuts.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(0)\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('dl', {\n staticClass: \"unstyled-list shortcut-list\"\n }, [_vm._l((_vm.shortcuts), function(item) {\n return [_c('dt', {\n key: item.desc,\n staticClass: \"shortcut-item__triggers\"\n }, _vm._l((item.keys), function(trigger) {\n return _c('kbd', {\n key: trigger\n }, [_vm._v(_vm._s(trigger))])\n })), _vm._v(\" \"), _c('dd', {\n key: item.desc,\n staticClass: \"shortcut-item__description\"\n }, [_vm._v(_vm._s(item.desc))])]\n })], 2)\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-57d8198b\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/KeyboardShortcuts.vue\n// module id = null\n// module chunks = ","import Collection from './Collection';\n\nexport default class State {\n collections: Collection[] = [];\n selectedCollectionIndex: number = 0;\n selectedImages: number[] = [];\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/state.ts","import Vue from 'vue';\nimport Vuex from 'vuex';\nimport App from './App.vue';\nimport '@odopod/odo-dialog/css/odo-dialog.css';\nimport './styles.css';\nimport WelcomeScreen from './components/WelcomeScreen.vue';\nimport LoadingScreen from './components/LoadingScreen.vue';\nimport ImageViewer from './components/ImageViewer.vue';\nimport CollectionViewer from './components/CollectionViewer.vue';\nimport HelpMenu from './components/HelpMenu.vue';\nimport SettingsMenu from './components/SettingsMenu.vue';\nimport CollectionsMenu from './components/CollectionsMenu.vue';\nimport KeyboardShortcuts from './components/KeyboardShortcuts.vue';\nimport store from './store';\n\nVue.config.productionTip = false;\n\nVue.component('welcome-screen', WelcomeScreen);\nVue.component('loading-screen', LoadingScreen);\nVue.component('image-viewer', ImageViewer);\nVue.component('collection-viewer', CollectionViewer);\nVue.component('help-menu', HelpMenu);\nVue.component('settings-menu', SettingsMenu);\nVue.component('collections-menu', CollectionsMenu);\nVue.component('keyboard-shortcuts', KeyboardShortcuts);\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n store: store,\n template: '',\n components: { App },\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.ts"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/app.bb7a709aed964124cabe.js b/static/js/app.bb7a709aed964124cabe.js new file mode 100644 index 0000000..923bc23 --- /dev/null +++ b/static/js/app.bb7a709aed964124cabe.js @@ -0,0 +1,2 @@ +webpackJsonp([1],[,,,,,function(e,t,n){"use strict";function o(e,t){var n=[],o=[];return e.forEach(function(e){t(e)?n.push(e):o.push(e)}),[n,o]}function i(e){return e.reduce(function(e,t){return e.concat(t)},[])}function s(e){return new Promise(function(t){e.file(t)})}function a(e,t){void 0===t&&(t=[]);var n=l(e.fullPath);return new Promise(function(i){e.createReader().readEntries(function(e){var l=o(e,function(e){return e.isFile});Promise.all(l[0].map(s)).then(function(e){var o={name:n,files:e};t.push(o);var s=l[1].map(function(e){return a(e,t)});Promise.all(s).then(function(){i(t)})})})})}function l(e){var t=e.split("/");return t[t.length-1]||""}function r(e){var t=e&&e.match(/\.([^.]+)$/);return t?t[1].toLowerCase():""}function c(e){if(e.type&&e.type.includes("image/"))return!0;var t=r(e.name);return D.includes(t)}function d(e){var t=Date.now();return new Promise(function(n){var o=new FileReader;o.onload=function(){console.log("Read took "+(Date.now()-t)+" milliseconds"),n(o.result)},o.readAsDataURL(e)})}function u(e){var t=Array.from(e).map(function(e){return e.webkitGetAsEntry()}).filter(function(e){return!!e}),n=o(t,function(e){return e.isFile}),l=n[0],r=n[1];return Promise.all([Promise.all(l.map(s)),Promise.all(r.map(function(e){return a(e)}))]).then(function(e){var t=e[0],n=e[1],o=i(n);return t.length&&o.unshift({name:"",files:t}),o})}function h(){return T+=1}function p(e){n(7)}function g(e){n(11)}function m(e){n(12)}function f(e){n(13)}function v(e){n(14)}function _(e){n(15)}function y(e){n(19)}function C(e){n(20)}function b(e){n(21)}function w(e,t,n){return void 0===n&&(n="s"),e+" "+t+(1!==e?n:"")}Object.defineProperty(t,"__esModule",{value:!0});var x=n(0),I=n(2),$=n(3),k=n.n($),D=["bmp","gif","jpeg","jpg","jpe","png","svg","tiff","tif","webp","ico"],T=0,E=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.hasContent=!1,t.canDrop=!1,t.isLoading=!1,t.isUserActive=!1,t}return I.c(t,e),t.prototype._handleDragHover=function(e){e.preventDefault(),e.dataTransfer.dropEffect="copy",this.canDrop=!0},t.prototype._handleDragCancel=function(e){e.preventDefault(),this.canDrop=!1},t.prototype._handleDrop=function(e){var t=this;e.preventDefault(),this.isLoading=!0;var n=Date.now(),o=function(){t.isLoading=!1,requestAnimationFrame(function(){console.log("Drop took "+(Date.now()-n)+" milliseconds")})};if(e.dataTransfer.items)u(e.dataTransfer.items).then(function(e){Promise.all(e.map(t._addFileList)).then(o)});else{var i={name:"",files:Array.from(e.dataTransfer.files)};this._addFileList(i).then(o)}},t.prototype._handleFilesChosen=function(e){this._addFileList({name:"",files:e})},t.prototype._addFileList=function(e){var t,n=e.files.filter(c).sort(function(e,t){return e.name.localeCompare(t.name)});return t=n.length>0?this.renderFirstImageThenOthers(n,e.name):Promise.resolve(),this.canDrop=!1,t},t.prototype.renderFirstImageThenOthers=function(e,t){return I.a(this,void 0,void 0,function(){var n,o,i,s,a=this;return I.d(this,function(l){switch(l.label){case 0:return n=h(),o=e.shift(),[4,this.getDisplayImage(o)];case 1:return i=l.sent(),s=this.$store.getters.totalCollections,this.$store.commit("addCollection",{id:n,name:t,images:[i]}),this.hasContent=this.$store.state.collections.length>0||e.length>0,[2,new Promise(function(t){requestAnimationFrame(function(){Promise.all(a.getDisplayImages(e)).then(function(e){a.$store.commit("updateCollectionImages",{index:s,images:e}),a.updatePageTitle(),t()})})})]}})})},t.prototype.getDisplayImages=function(e){return e.map(this.getDisplayImage)},t.prototype.getDisplayImage=function(e){return d(e).then(function(t){return{id:h(),filename:e.name,src:t}})},t.prototype.updatePageTitle=function(){document.title=this.$store.getters.pageTitle},t.prototype.mounted=function(){this._handleKeyDown=this._handleKeyDown.bind(this),this._handleDragHover=this._handleDragHover.bind(this),this._handleDragCancel=this._handleDragCancel.bind(this),this._handleDrop=this._handleDrop.bind(this),document.body.addEventListener("keydown",this._handleKeyDown),document.body.addEventListener("dragover",this._handleDragHover),document.body.addEventListener("dragleave",this._handleDragCancel),document.body.addEventListener("drop",this._handleDrop)},t.prototype.beforeDestroy=function(){document.body.removeEventListener("keydown",this._handleKeyDown),document.body.removeEventListener("dragover",this._handleDragHover),document.body.removeEventListener("dragleave",this._handleDragCancel),document.body.removeEventListener("drop",this._handleDrop)},t.prototype._handleKeyDown=function(e){this.handleUserAction();var t=parseInt(e.key,10),n=!isNaN(t);"?"===e.key?this.helpToggle():"s"===e.key?this.settingsToggle():"c"===e.key?this.collectionsToggle():"h"===e.key?this.isUserActive=!1:"r"===e.key?(this.reset(),this.updatePageTitle()):this.hasContent&&n&&!e.metaKey&&!e.shiftKey&&this.$emit("selectgroup",t-1)},t.prototype.helpToggle=function(){this.$emit("helptoggle")},t.prototype.settingsToggle=function(){this.$emit("settingstoggle")},t.prototype.collectionsToggle=function(){this.$emit("collectionstoggle")},t.prototype.reset=function(){this.$store.commit("emptyCollections"),this.hasContent=!1},t.prototype.handleUserAction=function(){var e=this;clearTimeout(this.timer),this.isUserActive=!0,this.timer=setTimeout(function(){e.isUserActive=!1},3e3)},t=I.b([k.a],t)}(x.default),P=E,L=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{class:{"layout-centered":e.$store.state.settings.isCenteredImageMode,"user-inactive":!e.isUserActive,"is-loading":e.isLoading},attrs:{id:"app",tabindex:"-1"},on:{mousemove:e.handleUserAction,mousedown:e.handleUserAction}},[n("help-menu"),e._v(" "),n("settings-menu"),e._v(" "),n("collections-menu",{directives:[{name:"show",rawName:"v-show",value:e.hasContent,expression:"hasContent"}]}),e._v(" "),n("main",[n("welcome-screen",{directives:[{name:"show",rawName:"v-show",value:!e.hasContent,expression:"!hasContent"}],attrs:{"can-drop":e.canDrop},on:{fileschosen:e._handleFilesChosen}}),e._v(" "),n("loading-screen",{directives:[{name:"show",rawName:"v-show",value:e.isLoading,expression:"isLoading"}]}),e._v(" "),n("collection-viewer",{directives:[{name:"show",rawName:"v-show",value:e.hasContent,expression:"hasContent"}]})],1)],1)},F=[],M={render:L,staticRenderFns:F},z=M,N=n(1),S=p,A=N(P,z,S,null,null),H=A.exports,R=(n(9),n(10),function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),t.prototype.handleFiles=function(e){var t=e.target;this.$emit("fileschosen",Array.from(t.files)),t.value=""},t=I.b([k()({props:{canDrop:{type:Boolean,required:!0}}})],t)}(x.default)),O=R,j=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"welcome-screen",class:{"welcome-screen--can-drop":e.canDrop}},[n("div",{staticClass:"welcome-screen__inner"},[n("div",{directives:[{name:"show",rawName:"v-show",value:!e.canDrop,expression:"!canDrop"}],staticClass:"type--center"},[n("p",{staticClass:"type-header-1"},[e._v("Drop images here.")]),e._v(" "),n("p",[e._v("png, jpg, gif, bmp")]),e._v(" "),e._m(0),e._v(" "),n("input",{staticClass:"welcome-screen__file-input",attrs:{type:"file",accept:"image/*",multiple:"",id:"file-input"},on:{change:e.handleFiles}})]),e._v(" "),n("div",{directives:[{name:"show",rawName:"v-show",value:e.canDrop,expression:"canDrop"}]},[n("p",{staticClass:"type-header-1"},[e._v("Release!")])])])])},B=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("p",[n("label",{staticClass:"btn",attrs:{for:"file-input"}},[e._v("Choose files")])])}],K={render:j,staticRenderFns:B},U=K,V=n(1),G=g,q=V(O,U,G,null,null),J=q.exports,W=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),t=I.b([k.a],t)}(x.default),Y=W,Q=function(){var e=this,t=e.$createElement;e._self._c;return e._m(1)},X=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"loading-screen__inner"},[n("h2",{staticClass:"type-header-2 marginless loading-screen__text"},[e._v("Loading files")])])},function(){var e=this,t=e.$createElement;return(e._self._c||t)("div",{staticClass:"loading-screen"},[e._m(0)])}],Z={render:Q,staticRenderFns:X},ee=Z,te=n(1),ne=m,oe=te(Y,ee,ne,null,null),ie=oe.exports,se=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),Object.defineProperty(t.prototype,"images",{get:function(){return this.$store.state.collections[this.collectionIndex].images},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selectedIndex",{get:function(){return this.$store.state.selectedImages[this.collectionIndex]},enumerable:!0,configurable:!0}),t.prototype.setSelectedIndex=function(e,t){void 0===t&&(t=!0),(e>=0||e0&&(this.z=t.getNextTopLayer(),this.element.style.zIndex=""+this.z,this.backdrop.style.zIndex=""+(this.z-5),this.once(ke.a.EventType.CLOSED,function(){n.z=De,n.element.style.zIndex="",n.backdrop.style.zIndex=""})),e.prototype.open.call(this)},t}(ke.a),Ee=Te,Pe=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),t.prototype.toggle=function(){this.dialog.isOpen?this.dialog.close():this.dialog.open()},t.prototype.mounted=function(){this.$parent.$on("helptoggle",this.toggle),this.dialog=new Ee(document.getElementById("help-dialog"))},t.prototype.beforeDestroy=function(){this.dialog.dispose(),this.dialog=null},t=I.b([k.a],t)}(x.default),Le=Pe,Fe=function(){var e=this,t=e.$createElement;e._self._c;return e._m(2)},Me=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dialog-header"},[n("h2",{staticClass:"type-header-2 marginless",attrs:{id:"help-dialog-title"}},[e._v("Compdrop Help")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"col-6@xs col-6@sm"},[n("h3",{staticClass:"type-header-3"},[e._v("What is this?")]),e._v(" "),n("p",[e._v("Compdrop is a simple way to view website designs in a desktop browser. Just drag and drop your images into the browser. Images are aligned to the top of the window and horizontally centered.")]),e._v(" "),n("p",[e._v("You are viewing files on "),n("em",[e._v("your own machine")]),e._v(". Compdrop "),n("strong",[e._v("does not store any of your data")]),e._v(".")]),e._v(" "),n("p",[e._v("Built by "),n("a",{attrs:{href:"https://glencheney.com"}},[e._v("Glen Cheney")]),e._v(". Based on the original "),n("a",{attrs:{href:"https://github.com/lucasishuman/cmpdrp"}},[e._v("cmpdrp")]),e._v(".")]),e._v(" "),n("p",[e._v("Compdrop is a progressive web app and you can use it even if you’re have no internet connection.")]),e._v(" "),n("p",[e._v("View the project on "),n("a",{attrs:{href:"https://github.com/Vestride/compdrop"}},[e._v("GitHub")]),e._v(".")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"help-menu floating-button"},[n("button",{staticClass:"help-menu__toggle fade-when-inactive",attrs:{"data-odo-dialog-open":"help-dialog",title:"open help menu"}},[n("svg",{attrs:{viewBox:"0 0 14 16","aria-hidden":"true"}},[n("path",{attrs:{d:"M6.3 5.69c-.19-.19-.28-.42-.28-.7 0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7-.19.18-.42.3-.7.3-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z","fill-rule":"evenodd"}})])]),e._v(" "),n("div",{staticClass:"odo-dialog help-dialog",attrs:{id:"help-dialog",role:"dialog","aria-labelledby":"help-dialog-title","aria-hidden":"true"}},[n("div",{staticClass:"odo-dialog__content container",attrs:{role:"document"}},[n("div",{staticClass:"odo-dialog__inner"},[n("button",{staticClass:"odo-dialog__close",attrs:{type:"button","data-odo-dialog-close":"","aria-label":"Close this dialog window"}},[e._v("×")]),e._v(" "),e._m(0),e._v(" "),n("div",{staticClass:"row dialog-content"},[e._m(1),e._v(" "),n("div",{staticClass:"col-6@xs col-6@sm"},[n("h3",{staticClass:"type-header-3"},[e._v("Keyboard Shortcuts")]),e._v(" "),n("keyboard-shortcuts")],1)])])])])])}],ze={render:Fe,staticRenderFns:Me},Ne=ze,Se=n(1),Ae=_,He=Se(Le,Ne,Ae,null,null),Re=He.exports,Oe=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),Object.defineProperty(t.prototype,"centeredLayout",{get:function(){return this.$store.state.settings.isCenteredImageMode},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"retina",{get:function(){return this.$store.state.settings.isScaledImageMode},enumerable:!0,configurable:!0}),t.prototype.toggle=function(){this.dialog.isOpen?this.dialog.close():this.dialog.open()},t.prototype.mounted=function(){this.$parent.$on("settingstoggle",this.toggle),this.dialog=new Ee(document.getElementById("settings-dialog"))},t.prototype.beforeDestroy=function(){this.dialog.dispose(),this.dialog=null},t.prototype.layoutChange=function(e){var t=e.target;this.$store.commit("setIsCenteredImageMode",t.checked)},t.prototype.retinaChange=function(e){var t=e.target;this.$store.commit("setIsScaledImageMode",t.checked)},t=I.b([k.a],t)}(x.default),je=Oe,Be=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"settings-menu floating-button"},[n("button",{staticClass:"settings-menu__toggle fade-when-inactive",attrs:{"data-odo-dialog-open":"settings-dialog",title:"open settings menu"}},[n("svg",{attrs:{viewBox:"0 0 14 16","aria-hidden":"true"}},[n("path",{attrs:{"fill-rule":"evenodd",d:"M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z"}})])]),e._v(" "),n("div",{staticClass:"odo-dialog settings-dialog",attrs:{id:"settings-dialog",role:"dialog","aria-labelledby":"settings-dialog-title","aria-hidden":"true"}},[n("div",{staticClass:"odo-dialog__content container",attrs:{role:"document"}},[n("div",{staticClass:"odo-dialog__inner"},[n("button",{staticClass:"odo-dialog__close",attrs:{type:"button","data-odo-dialog-close":"","aria-label":"Close this dialog window"}},[e._v("×")]),e._v(" "),e._m(0),e._v(" "),n("div",{staticClass:"row dialog-content"},[n("div",{staticClass:"col-6@xs col-12@sm"},[n("div",[n("input",{attrs:{type:"checkbox",id:"checkbox-centered-layout"},domProps:{checked:e.centeredLayout},on:{change:e.layoutChange}}),e._v(" "),n("label",{attrs:{for:"checkbox-centered-layout"}},[e._v("Center images (turn off to scroll them)")])]),e._v(" "),n("div",[n("input",{attrs:{type:"checkbox",id:"checkbox-retina"},domProps:{checked:e.retina},on:{change:e.retinaChange}}),e._v(" "),n("label",{attrs:{for:"checkbox-retina"}},[e._v("Scale images to half size")])])])])])])])])},Ke=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dialog-header"},[n("h2",{staticClass:"type-header-2 marginless",attrs:{id:"settings-dialog-title"}},[e._v("Compdrop Settings")])])}],Ue={render:Be,staticRenderFns:Ke},Ve=Ue,Ge=n(1),qe=y,Je=Ge(je,Ve,qe,null,null),We=Je.exports,Ye=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return I.c(t,e),t.prototype.toggle=function(){this.dialog.isOpen?this.dialog.close():this.dialog.open()},t.prototype.select=function(e,t){this.$store.commit("selectImage",{index:t,collectionIndex:e}),this.dialog.close()},t.prototype.mounted=function(){this.$parent.$on("collectionstoggle",this.toggle),this.dialog=new Ee(document.getElementById("collections-dialog"))},t.prototype.beforeDestroy=function(){this.dialog.dispose(),this.dialog=null},t=I.b([k.a],t)}(x.default),Qe=Ye,Xe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"collections-menu floating-button"},[n("button",{staticClass:"collections-menu__toggle fade-when-inactive",attrs:{"data-odo-dialog-open":"collections-dialog",title:"open collections menu"}},[n("svg",{attrs:{viewBox:"0 0 14 16","aria-hidden":"true"}},[n("path",{attrs:{d:"M13 3H7c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 8H8V5h4v6zM4 4h1v1H4v6h1v1H4c-.55 0-1-.45-1-1V5c0-.55.45-1 1-1zM1 5h1v1H1v4h1v1H1c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1z","fill-rule":"evenodd"}})])]),e._v(" "),n("div",{staticClass:"odo-dialog collections-dialog",attrs:{id:"collections-dialog",role:"dialog","aria-labelledby":"collections-dialog-title","aria-hidden":"true"}},[n("div",{staticClass:"odo-dialog__content container",attrs:{role:"document"}},[n("div",{staticClass:"odo-dialog__inner"},[n("button",{staticClass:"odo-dialog__close",attrs:{type:"button","data-odo-dialog-close":"","aria-label":"Close this dialog window"}},[e._v("×")]),e._v(" "),e._m(0),e._v(" "),n("div",{staticClass:"dialog-content"},e._l(e.$store.state.collections,function(t,o){return n("div",{key:t.id,staticClass:"row"},[n("h3",{staticClass:"col-6@xs col-12@sm type-header-3 collections-menu__title"},[n("span",[e._v(e._s(t.name||"Collection "+(o+1)))]),e._v(" "),n("small",{directives:[{name:"show",rawName:"v-show",value:o===e.$store.state.selectedCollectionIndex,expression:"i === $store.state.selectedCollectionIndex"}]},[e._v("[current]")])]),e._v(" "),e._l(t.images,function(t,i){return n("div",{key:t.id,staticClass:"col-1@xs col-1@sm"},[n("button",{staticClass:"collections-menu__thumb-btn",on:{click:function(t){e.select(o,i)}}},[n("img",{staticClass:"collections-menu__thumb",class:{"collections-menu__thumb--selected":i===e.$store.state.selectedImages[o]},attrs:{src:t.src,alt:t.filename,title:t.filename}})])])})],2)}))])])])])},Ze=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dialog-header"},[n("h2",{staticClass:"type-header-2 marginless",attrs:{id:"collections-dialog-title"}},[e._v("Collections")])])}],et={render:Xe,staticRenderFns:Ze},tt=et,nt=n(1),ot=C,it=nt(Qe,tt,ot,null,null),st=it.exports,at={data:function(){return{shortcuts:[{keys:["→","J"],desc:"Next image"},{keys:["←","K"],desc:"Previous image"},{keys:["⇧ Click"],desc:"Navigate without scrolling to the top"},{keys:["1","2","3"],desc:"Switch collection (numbers 1 through 9)"},{keys:["?"],desc:"Toggle [this] help menu"},{keys:["S"],desc:"Toggle settings menu"},{keys:["C"],desc:"Toggle collection menu"},{keys:["H"],desc:"Hide Compdrop UI elements"},{keys:["R"],desc:"Remove all images"}]}}},lt=function(){var e=this,t=e.$createElement;e._self._c;return e._m(0)},rt=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("dl",{staticClass:"unstyled-list shortcut-list"},[e._l(e.shortcuts,function(t){return[n("dt",{key:t.desc,staticClass:"shortcut-item__triggers"},e._l(t.keys,function(t){return n("kbd",{key:t},[e._v(e._s(t))])})),e._v(" "),n("dd",{key:t.desc,staticClass:"shortcut-item__description"},[e._v(e._s(t.desc))])]})],2)}],ct={render:lt,staticRenderFns:rt},dt=ct,ut=n(1),ht=b,pt=ut(at,dt,ht,null,null),gt=pt.exports,mt=n(22),ft=function(){function e(){this.collections=[],this.selectedCollectionIndex=0,this.selectedImages=[],this.settings={isCenteredImageMode:!0,isScaledImageMode:!1}}return e}(),vt=ft;x.default.use(mt.a);var _t=new mt.a.Store({state:new vt,mutations:{addCollection:function(e,t){e.collections.push(t),x.default.set(e.selectedImages,e.collections.length-1,0)},updateCollectionImages:function(e,t){x.default.set(e.collections,t.index,{id:e.collections[t.index].id,name:e.collections[t.index].name,images:e.collections[t.index].images.concat(t.images)})},emptyCollections:function(e){e.collections=[],e.selectedImages=[],e.selectedCollectionIndex=0},setSelectedGroup:function(e,t){t>-1&&t1){var t=e.collections.reduce(function(e,t){return e+t.images.length},0);return w(e.collections.length,"collection")+" – "+w(t,"image")+" – compdrop"}return e.collections.length>0?w(e.collections[0].images.length,"image")+" – compdrop":"compdrop"}}});x.default.config.productionTip=!1,x.default.component("welcome-screen",J),x.default.component("loading-screen",ie),x.default.component("image-viewer",ge),x.default.component("collection-viewer",Ie),x.default.component("help-menu",Re),x.default.component("settings-menu",We),x.default.component("collections-menu",st),x.default.component("keyboard-shortcuts",gt),new x.default({el:"#app",store:_t,template:"",components:{App:H}})},,function(e,t){},,function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},,,,function(e,t){},function(e,t){},function(e,t){}],[5]); +//# sourceMappingURL=app.bb7a709aed964124cabe.js.map \ No newline at end of file diff --git a/static/js/app.bb7a709aed964124cabe.js.map b/static/js/app.bb7a709aed964124cabe.js.map new file mode 100644 index 0000000..f7aac86 --- /dev/null +++ b/static/js/app.bb7a709aed964124cabe.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///static/js/app.bb7a709aed964124cabe.js","webpack:///./src/FileDropReader.ts","webpack:///./src/App.vue?eb80","webpack:///./src/App.vue?9e04","webpack:///./src/components/WelcomeScreen.vue?dca3","webpack:///./src/components/LoadingScreen.vue?2657","webpack:///./src/components/ImageViewer.vue?cbb1","webpack:///./src/components/CollectionViewer.vue","webpack:///./src/components/HelpMenu.vue?8c22","webpack:///./src/components/SettingsMenu.vue?e090","webpack:///./src/components/CollectionsMenu.vue?517a","webpack:///./src/components/KeyboardShortcuts.vue?8ca6","webpack:///./src/store.ts","webpack:///./src/App.vue?3e7d","webpack:///./src/components/WelcomeScreen.vue?456d","webpack:///./src/components/WelcomeScreen.vue?8a90","webpack:///./src/components/LoadingScreen.vue?9827","webpack:///./src/components/LoadingScreen.vue?0d7b","webpack:///./src/components/ImageViewer.vue?c5d4","webpack:///./src/components/ImageViewer.vue?ada2","webpack:///./src/components/CollectionViewer.vue?c2a6","webpack:///./src/components/CollectionViewer.vue?c485","webpack:///./src/Dialog.ts","webpack:///./src/components/HelpMenu.vue?637a","webpack:///./src/components/HelpMenu.vue?51fe","webpack:///./src/components/SettingsMenu.vue?552c","webpack:///./src/components/SettingsMenu.vue?ecef","webpack:///./src/components/CollectionsMenu.vue?af51","webpack:///./src/components/CollectionsMenu.vue?e964","webpack:///./src/components/KeyboardShortcuts.vue?9c81","webpack:///./src/components/KeyboardShortcuts.vue?2ade","webpack:///./src/state.ts","webpack:///./src/main.ts"],"names":["webpackJsonp","module","__webpack_exports__","__webpack_require__","partition","collection","predicate","truthy","falsy","forEach","item","push","flattenOnce","reduce","result","concat","getFile","entry","Promise","resolve","file","getFilesFromDirectoryEntry","collections","directoryName","getDirectoryName","fullPath","createReader","readEntries","entries","parts","isFile","all","map","then","files","fileCollection","name","directories","pathPieces","split","length","getFileExtension","fileName","matches","match","toLowerCase","isImageFile","type","includes","extension","VALID_IMAGE_EXTENSIONS","readFileAsDataURL","start","Date","now","reader","FileReader","onload","console","log","readAsDataURL","readDroppedItems","itemList","Array","from","webkitGetAsEntry","filter","_a","dirs","looseFiles","groups","unshift","uniqueId","count","injectStyle","ssrContext","WelcomeScreen_injectStyle","LoadingScreen_injectStyle","ImageViewer_injectStyle","CollectionViewer_injectStyle","HelpMenu_injectStyle","SettingsMenu_injectStyle","CollectionsMenu_injectStyle","KeyboardShortcuts_injectStyle","maybePluralize","noun","suffix","Object","defineProperty","value","vue_esm","tslib_es6","vue_class_component_common","vue_class_component_common_default","n","App_App","_super","App","_this","apply","this","arguments","hasContent","canDrop","isLoading","isUserActive","prototype","_handleDragHover","evt","preventDefault","dataTransfer","dropEffect","_handleDragCancel","_handleDrop","done","requestAnimationFrame","items","_addFileList","_handleFilesChosen","promise","sort","a","b","localeCompare","renderFirstImageThenOthers","collectionName","collectionId","first","image","collectionIndex","label","shift","getDisplayImage","sent","$store","getters","totalCollections","commit","id","images","state","getDisplayImages","index","updatePageTitle","dataURL","filename","src","document","title","pageTitle","mounted","_handleKeyDown","bind","body","addEventListener","beforeDestroy","removeEventListener","handleUserAction","number","parseInt","key","isNumber","isNaN","helpToggle","settingsToggle","collectionsToggle","reset","metaKey","shiftKey","$emit","clearTimeout","timer","setTimeout","selectortype_script_index_0_src_App","render","_vm","_h","$createElement","_c","_self","class","layout-centered","settings","isCenteredImageMode","user-inactive","is-loading","attrs","tabindex","on","mousemove","mousedown","_v","directives","rawName","expression","can-drop","fileschosen","staticRenderFns","esExports","selectortype_template_index_0_src_App","normalizeComponent","__vue_styles__","Component","src_App","WelcomeScreen_WelcomeScreen","WelcomeScreen","handleFiles","target","props","Boolean","required","components_WelcomeScreen","WelcomeScreen_render","staticClass","welcome-screen--can-drop","_m","accept","multiple","change","WelcomeScreen_staticRenderFns","for","WelcomeScreen_esExports","selectortype_template_index_0_src_components_WelcomeScreen","WelcomeScreen_normalizeComponent","WelcomeScreen___vue_styles__","WelcomeScreen_Component","src_components_WelcomeScreen","LoadingScreen_LoadingScreen","LoadingScreen","components_LoadingScreen","LoadingScreen_render","LoadingScreen_staticRenderFns","LoadingScreen_esExports","selectortype_template_index_0_src_components_LoadingScreen","LoadingScreen_normalizeComponent","LoadingScreen___vue_styles__","LoadingScreen_Component","src_components_LoadingScreen","ImageViewer_ImageViewer","ImageViewer","get","enumerable","configurable","selectedImages","setSelectedIndex","scrollToTop","window","scrollTo","handleNextTrigger","goToNext","handlePreviousTrigger","goToPrevious","selectedIndex","Number","components_ImageViewer","ImageViewer_render","click","keydown","$event","_k","keyCode","button","_l","displayImage","i","hidden","style","transform","isScaledImageMode","alt","aria-label","stopPropagation","viewBox","d","ImageViewer_staticRenderFns","ImageViewer_esExports","selectortype_template_index_0_src_components_ImageViewer","ImageViewer_normalizeComponent","ImageViewer___vue_styles__","ImageViewer_Component","src_components_ImageViewer","CollectionViewer_CollectionViewer","CollectionViewer","selectedCollectionIndex","setSelectedGroup","imageViewer","getImageViewer","$el","focus","$refs","$parent","$on","created","components_CollectionViewer","CollectionViewer_render","ref","refInFor","collection-index","CollectionViewer_staticRenderFns","CollectionViewer_esExports","selectortype_template_index_0_src_components_CollectionViewer","CollectionViewer_normalizeComponent","CollectionViewer___vue_styles__","CollectionViewer_Component","src_components_CollectionViewer","dist_odo_dialog","dist_odo_dialog_default","Z_DIALOG","Dialog_Dialog","Dialog","z","getOpenDialogCount","Instances","instance","isOpen","getNextTopLayer","layers","Math","max","open","element","zIndex","backdrop","once","EventType","CLOSED","call","src_Dialog","HelpMenu_HelpMenu","HelpMenu","toggle","dialog","close","getElementById","dispose","components_HelpMenu","HelpMenu_render","HelpMenu_staticRenderFns","href","data-odo-dialog-open","aria-hidden","fill-rule","role","aria-labelledby","data-odo-dialog-close","HelpMenu_esExports","selectortype_template_index_0_src_components_HelpMenu","HelpMenu_normalizeComponent","HelpMenu___vue_styles__","HelpMenu_Component","src_components_HelpMenu","SettingsMenu_SettingsMenu","SettingsMenu","layoutChange","event","checked","retinaChange","components_SettingsMenu","SettingsMenu_render","domProps","centeredLayout","retina","SettingsMenu_staticRenderFns","SettingsMenu_esExports","selectortype_template_index_0_src_components_SettingsMenu","SettingsMenu_normalizeComponent","SettingsMenu___vue_styles__","SettingsMenu_Component","src_components_SettingsMenu","CollectionsMenu_CollectionsMenu","CollectionsMenu","select","imageIndex","components_CollectionsMenu","CollectionsMenu_render","_s","j","collections-menu__thumb--selected","CollectionsMenu_staticRenderFns","CollectionsMenu_esExports","selectortype_template_index_0_src_components_CollectionsMenu","CollectionsMenu_normalizeComponent","CollectionsMenu___vue_styles__","CollectionsMenu_Component","src_components_CollectionsMenu","KeyboardShortcuts","data","shortcuts","keys","desc","KeyboardShortcuts_render","KeyboardShortcuts_staticRenderFns","trigger","KeyboardShortcuts_esExports","components_KeyboardShortcuts","KeyboardShortcuts_normalizeComponent","KeyboardShortcuts___vue_styles__","KeyboardShortcuts_Component","src_components_KeyboardShortcuts","vuex_esm","State","src_state","use","store","Store","mutations","addCollection","set","updateCollectionImages","payload","emptyCollections","selectImage","setIsCenteredImageMode","setIsScaledImageMode","totalImages","total","config","productionTip","component","el","template","components","exports"],"mappings":"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","file":"static/js/app.bb7a709aed964124cabe.js","sourcesContent":["webpackJsonp([1],[\n/* 0 */,\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */,\n/* 5 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n\n// EXTERNAL MODULE: ./node_modules/vue/dist/vue.esm.js\nvar vue_esm = __webpack_require__(0);\n\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(2);\n\n// EXTERNAL MODULE: ./node_modules/vue-class-component/dist/vue-class-component.common.js\nvar vue_class_component_common = __webpack_require__(3);\nvar vue_class_component_common_default = /*#__PURE__*/__webpack_require__.n(vue_class_component_common);\n\n// CONCATENATED MODULE: ./src/FileDropReader.ts\n/**\n * Does the same thing as lodash's _.partition\n */\nfunction partition(collection, predicate) {\n var truthy = [];\n var falsy = [];\n collection.forEach(function (item) {\n if (predicate(item)) {\n truthy.push(item);\n }\n else {\n falsy.push(item);\n }\n });\n return [truthy, falsy];\n}\n/**\n * Flatten an array, but only a single level deep.\n */\nfunction flattenOnce(collection) {\n return collection.reduce(function (result, collection) {\n return result.concat(collection);\n }, []);\n}\n/**\n * Get a File instance from an entry instance.\n */\nfunction getFile(entry) {\n return new Promise(function (resolve) {\n entry.file(resolve);\n });\n}\nfunction getFilesFromDirectoryEntry(entry, collections) {\n if (collections === void 0) { collections = []; }\n var directoryName = getDirectoryName(entry.fullPath);\n return new Promise(function (resolve) {\n entry.createReader().readEntries(function (entries) {\n // Split files and directories apart.\n var parts = partition(entries, function (entry) { return entry.isFile; });\n // Once all the initial files have been read, add them to the collections\n // array and start reading directories.\n Promise.all(parts[0].map(getFile)).then(function (files) {\n var fileCollection = {\n name: directoryName,\n files: files,\n };\n collections.push(fileCollection);\n // Recursively read directories.\n var directories = parts[1].map(function (entry) { return getFilesFromDirectoryEntry(entry, collections); });\n // Since the collections array is passed as an argument and mutated\n // within this recursive function, we don't care about the resolved\n // promise value for any recursed calls to this function.\n Promise.all(directories).then(function () {\n resolve(collections);\n });\n });\n });\n });\n}\nfunction getDirectoryName(fullPath) {\n var pathPieces = fullPath.split('/');\n return pathPieces[pathPieces.length - 1] || '';\n}\nfunction getFileExtension(fileName) {\n var matches = fileName && fileName.match(/\\.([^.]+)$/);\n if (matches) {\n return matches[1].toLowerCase();\n }\n return '';\n}\nvar VALID_IMAGE_EXTENSIONS = [\n 'bmp',\n 'gif',\n 'jpeg',\n 'jpg',\n 'jpe',\n 'png',\n 'svg',\n 'tiff',\n 'tif',\n 'webp',\n 'ico',\n];\nfunction isImageFile(file) {\n // Firefox doesn't support the `type` property - it's empty.\n if (file.type && file.type.includes('image/')) {\n return true;\n }\n var extension = getFileExtension(file.name);\n return VALID_IMAGE_EXTENSIONS.includes(extension);\n}\nfunction readFileAsDataURL(file) {\n var start = Date.now();\n return new Promise(function (resolve) {\n var reader = new FileReader();\n // Resolve promise when the reader finishes.\n reader.onload = function () {\n console.log(\"Read took \" + (Date.now() - start) + \" milliseconds\");\n resolve(reader.result);\n };\n // Start reader.\n reader.readAsDataURL(file);\n });\n}\nfunction readDroppedItems(itemList) {\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry\n var entries = Array.from(itemList)\n .map(function (item) { return item.webkitGetAsEntry(); })\n .filter(function (entry) { return !!entry; });\n var _a = partition(entries, function (entry) { return entry.isFile; }), files = _a[0], dirs = _a[1];\n return Promise.all([\n Promise.all(files.map(getFile)),\n Promise.all(dirs.map(function (entry) { return getFilesFromDirectoryEntry(entry); })),\n ]).then(function (result) {\n var looseFiles = result[0];\n var groups = result[1];\n // At this point, there we have an array which is 3 levels deep.\n // * Top level is the user's selection which they dropped.\n // * Next is a grouping of collections by directory\n // * Finally, the array of files in that directory.\n var collections = flattenOnce(groups);\n // Add loose files to the front.\n if (looseFiles.length) {\n collections.unshift({\n name: '',\n files: looseFiles,\n });\n }\n return collections;\n });\n}\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/App.vue\n\n\n\n\nvar count = 0;\nfunction uniqueId() {\n count += 1;\n return count;\n}\nvar App_App = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](App, _super);\n function App() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.hasContent = false;\n _this.canDrop = false;\n _this.isLoading = false;\n // Activity watcher.\n _this.isUserActive = false;\n return _this;\n }\n App.prototype._handleDragHover = function (evt) {\n evt.preventDefault();\n evt.dataTransfer.dropEffect = 'copy';\n this.canDrop = true;\n };\n App.prototype._handleDragCancel = function (evt) {\n evt.preventDefault();\n this.canDrop = false;\n };\n App.prototype._handleDrop = function (evt) {\n var _this = this;\n evt.preventDefault();\n this.isLoading = true;\n var start = Date.now();\n var done = function () {\n _this.isLoading = false;\n requestAnimationFrame(function () {\n console.log(\"Drop took \" + (Date.now() - start) + \" milliseconds\");\n });\n };\n // Safari and IE don't support `items` property.\n if (evt.dataTransfer.items) {\n readDroppedItems(evt.dataTransfer.items).then(function (collections) {\n Promise.all(collections.map(_this._addFileList)).then(done);\n });\n }\n else {\n var fileCollection = {\n name: '',\n files: Array.from(evt.dataTransfer.files),\n };\n this._addFileList(fileCollection).then(done);\n }\n };\n App.prototype._handleFilesChosen = function (files) {\n this._addFileList({\n name: '',\n files: files,\n });\n };\n App.prototype._addFileList = function (fileCollection) {\n // Filter out non-images and sort by file name.\n var files = fileCollection.files\n .filter(isImageFile)\n .sort(function (a, b) { return a.name.localeCompare(b.name); });\n var promise;\n if (files.length > 0) {\n // Async load all files with a FileReader and update the images array when done.\n promise = this.renderFirstImageThenOthers(files, fileCollection.name);\n }\n else {\n promise = Promise.resolve();\n }\n // Hide drop messaging.\n this.canDrop = false;\n return promise;\n };\n App.prototype.renderFirstImageThenOthers = function (files, collectionName) {\n return tslib_es6[\"a\" /* __awaiter */](this, void 0, void 0, function () {\n var _this = this;\n var collectionId, first, image, collectionIndex;\n return tslib_es6[\"d\" /* __generator */](this, function (_a) {\n switch (_a.label) {\n case 0:\n collectionId = uniqueId();\n first = files.shift();\n return [4 /*yield*/, this.getDisplayImage(first)];\n case 1:\n image = _a.sent();\n collectionIndex = this.$store.getters.totalCollections;\n this.$store.commit('addCollection', {\n id: collectionId,\n name: collectionName,\n images: [image],\n });\n // Set flag for whether there was content after the first display image has\n // been read.\n this.hasContent = this.$store.state.collections.length > 0 || files.length > 0;\n // Wait a frame, then start reading the remaining files.\n return [2 /*return*/, new Promise(function (resolve) {\n requestAnimationFrame(function () {\n Promise.all(_this.getDisplayImages(files)).then(function (images) {\n _this.$store.commit('updateCollectionImages', {\n index: collectionIndex,\n images: images,\n });\n _this.updatePageTitle();\n resolve();\n });\n });\n })];\n }\n });\n });\n };\n App.prototype.getDisplayImages = function (files) {\n return files.map(this.getDisplayImage);\n };\n App.prototype.getDisplayImage = function (file) {\n return readFileAsDataURL(file).then(function (dataURL) {\n return {\n id: uniqueId(),\n filename: file.name,\n src: dataURL,\n };\n });\n };\n App.prototype.updatePageTitle = function () {\n document.title = this.$store.getters.pageTitle;\n };\n App.prototype.mounted = function () {\n this._handleKeyDown = this._handleKeyDown.bind(this);\n this._handleDragHover = this._handleDragHover.bind(this);\n this._handleDragCancel = this._handleDragCancel.bind(this);\n this._handleDrop = this._handleDrop.bind(this);\n document.body.addEventListener('keydown', this._handleKeyDown);\n document.body.addEventListener('dragover', this._handleDragHover);\n document.body.addEventListener('dragleave', this._handleDragCancel);\n document.body.addEventListener('drop', this._handleDrop);\n };\n App.prototype.beforeDestroy = function () {\n document.body.removeEventListener('keydown', this._handleKeyDown);\n document.body.removeEventListener('dragover', this._handleDragHover);\n document.body.removeEventListener('dragleave', this._handleDragCancel);\n document.body.removeEventListener('drop', this._handleDrop);\n };\n App.prototype._handleKeyDown = function (evt) {\n this.handleUserAction();\n var number = parseInt(evt.key, 10);\n var isNumber = !isNaN(number);\n if (evt.key === '?') {\n this.helpToggle();\n }\n else if (evt.key === 's') {\n this.settingsToggle();\n }\n else if (evt.key === 'c') {\n this.collectionsToggle();\n }\n else if (evt.key === 'h') {\n this.isUserActive = false;\n }\n else if (evt.key === 'r') {\n this.reset();\n this.updatePageTitle();\n }\n else if (this.hasContent && isNumber && !evt.metaKey && !evt.shiftKey) {\n this.$emit('selectgroup', number - 1);\n }\n };\n App.prototype.helpToggle = function () {\n this.$emit('helptoggle');\n };\n App.prototype.settingsToggle = function () {\n this.$emit('settingstoggle');\n };\n App.prototype.collectionsToggle = function () {\n this.$emit('collectionstoggle');\n };\n App.prototype.reset = function () {\n this.$store.commit('emptyCollections');\n this.hasContent = false;\n };\n // Activity watcher\n App.prototype.handleUserAction = function () {\n var _this = this;\n clearTimeout(this.timer);\n this.isUserActive = true;\n this.timer = setTimeout(function () {\n _this.isUserActive = false;\n }, 3000);\n };\n App = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], App);\n return App;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var selectortype_script_index_0_src_App = (App_App);\n;\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6cb1e5d3\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n class: {\n 'layout-centered': _vm.$store.state.settings.isCenteredImageMode,\n 'user-inactive': !_vm.isUserActive,\n 'is-loading': _vm.isLoading,\n },\n attrs: {\n \"id\": \"app\",\n \"tabindex\": \"-1\"\n },\n on: {\n \"mousemove\": _vm.handleUserAction,\n \"mousedown\": _vm.handleUserAction\n }\n }, [_c('help-menu'), _vm._v(\" \"), _c('settings-menu'), _vm._v(\" \"), _c('collections-menu', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.hasContent),\n expression: \"hasContent\"\n }]\n }), _vm._v(\" \"), _c('main', [_c('welcome-screen', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (!_vm.hasContent),\n expression: \"!hasContent\"\n }],\n attrs: {\n \"can-drop\": _vm.canDrop\n },\n on: {\n \"fileschosen\": _vm._handleFilesChosen\n }\n }), _vm._v(\" \"), _c('loading-screen', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.isLoading),\n expression: \"isLoading\"\n }]\n }), _vm._v(\" \"), _c('collection-viewer', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.hasContent),\n expression: \"hasContent\"\n }]\n })], 1)], 1)\n}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_App = (esExports);\n// CONCATENATED MODULE: ./src/App.vue\nfunction injectStyle (ssrContext) {\n __webpack_require__(7)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n selectortype_script_index_0_src_App,\n selectortype_template_index_0_src_App,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ var src_App = (Component.exports);\n\n// EXTERNAL MODULE: ./node_modules/@odopod/odo-dialog/css/odo-dialog.css\nvar odo_dialog = __webpack_require__(9);\nvar odo_dialog_default = /*#__PURE__*/__webpack_require__.n(odo_dialog);\n\n// EXTERNAL MODULE: ./src/styles.css\nvar styles = __webpack_require__(10);\nvar styles_default = /*#__PURE__*/__webpack_require__.n(styles);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/WelcomeScreen.vue\n\n\n\nvar WelcomeScreen_WelcomeScreen = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](WelcomeScreen, _super);\n function WelcomeScreen() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n WelcomeScreen.prototype.handleFiles = function (evt) {\n var target = evt.target;\n this.$emit('fileschosen', Array.from(target.files));\n target.value = '';\n };\n WelcomeScreen = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default()({\n props: {\n canDrop: {\n type: Boolean,\n required: true,\n },\n },\n })\n ], WelcomeScreen);\n return WelcomeScreen;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_WelcomeScreen = (WelcomeScreen_WelcomeScreen);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5ad0e49a\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/WelcomeScreen.vue\nvar WelcomeScreen_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"welcome-screen\",\n class: {\n 'welcome-screen--can-drop': _vm.canDrop\n }\n }, [_c('div', {\n staticClass: \"welcome-screen__inner\"\n }, [_c('div', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (!_vm.canDrop),\n expression: \"!canDrop\"\n }],\n staticClass: \"type--center\"\n }, [_c('p', {\n staticClass: \"type-header-1\"\n }, [_vm._v(\"Drop images here.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"png, jpg, gif, bmp\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('input', {\n staticClass: \"welcome-screen__file-input\",\n attrs: {\n \"type\": \"file\",\n \"accept\": \"image/*\",\n \"multiple\": \"\",\n \"id\": \"file-input\"\n },\n on: {\n \"change\": _vm.handleFiles\n }\n })]), _vm._v(\" \"), _c('div', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.canDrop),\n expression: \"canDrop\"\n }]\n }, [_c('p', {\n staticClass: \"type-header-1\"\n }, [_vm._v(\"Release!\")])])])])\n}\nvar WelcomeScreen_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('label', {\n staticClass: \"btn\",\n attrs: {\n \"for\": \"file-input\"\n }\n }, [_vm._v(\"Choose files\")])])\n}]\nvar WelcomeScreen_esExports = { render: WelcomeScreen_render, staticRenderFns: WelcomeScreen_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_WelcomeScreen = (WelcomeScreen_esExports);\n// CONCATENATED MODULE: ./src/components/WelcomeScreen.vue\nfunction WelcomeScreen_injectStyle (ssrContext) {\n __webpack_require__(11)\n}\nvar WelcomeScreen_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar WelcomeScreen___vue_styles__ = WelcomeScreen_injectStyle\n/* scopeId */\nvar WelcomeScreen___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar WelcomeScreen___vue_module_identifier__ = null\nvar WelcomeScreen_Component = WelcomeScreen_normalizeComponent(\n components_WelcomeScreen,\n selectortype_template_index_0_src_components_WelcomeScreen,\n WelcomeScreen___vue_styles__,\n WelcomeScreen___vue_scopeId__,\n WelcomeScreen___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_WelcomeScreen = (WelcomeScreen_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/LoadingScreen.vue\n\n\n\nvar LoadingScreen_LoadingScreen = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](LoadingScreen, _super);\n function LoadingScreen() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n LoadingScreen = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], LoadingScreen);\n return LoadingScreen;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_LoadingScreen = (LoadingScreen_LoadingScreen);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6a5269e6\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/LoadingScreen.vue\nvar LoadingScreen_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(1)\n}\nvar LoadingScreen_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"loading-screen__inner\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless loading-screen__text\"\n }, [_vm._v(\"Loading files\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"loading-screen\"\n }, [_vm._m(0)])\n}]\nvar LoadingScreen_esExports = { render: LoadingScreen_render, staticRenderFns: LoadingScreen_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_LoadingScreen = (LoadingScreen_esExports);\n// CONCATENATED MODULE: ./src/components/LoadingScreen.vue\nfunction LoadingScreen_injectStyle (ssrContext) {\n __webpack_require__(12)\n}\nvar LoadingScreen_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar LoadingScreen___vue_styles__ = LoadingScreen_injectStyle\n/* scopeId */\nvar LoadingScreen___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar LoadingScreen___vue_module_identifier__ = null\nvar LoadingScreen_Component = LoadingScreen_normalizeComponent(\n components_LoadingScreen,\n selectortype_template_index_0_src_components_LoadingScreen,\n LoadingScreen___vue_styles__,\n LoadingScreen___vue_scopeId__,\n LoadingScreen___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_LoadingScreen = (LoadingScreen_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/ImageViewer.vue\n\n\n\nvar ImageViewer_ImageViewer = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](ImageViewer, _super);\n function ImageViewer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ImageViewer.prototype, \"images\", {\n get: function () {\n return this.$store.state.collections[this.collectionIndex].images;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ImageViewer.prototype, \"selectedIndex\", {\n get: function () {\n return this.$store.state.selectedImages[this.collectionIndex];\n },\n enumerable: true,\n configurable: true\n });\n ImageViewer.prototype.setSelectedIndex = function (index, scrollToTop) {\n if (scrollToTop === void 0) { scrollToTop = true; }\n if (index >= 0 || index < this.images.length) {\n this.$store.commit('selectImage', {\n index: index,\n collectionIndex: this.collectionIndex,\n });\n if (scrollToTop) {\n window.scrollTo(0, 0);\n }\n }\n };\n ImageViewer.prototype.handleNextTrigger = function (evt) {\n this.goToNext(evt.shiftKey === false);\n };\n ImageViewer.prototype.handlePreviousTrigger = function (evt) {\n this.goToPrevious(evt.shiftKey === false);\n };\n ImageViewer.prototype.goToNext = function (scrollToTop) {\n this.setSelectedIndex(this.selectedIndex === this.images.length - 1 ?\n 0 :\n this.selectedIndex + 1, scrollToTop);\n };\n ImageViewer.prototype.goToPrevious = function (scrollToTop) {\n this.setSelectedIndex(this.selectedIndex === 0 ?\n this.images.length - 1 :\n this.selectedIndex - 1, scrollToTop);\n };\n ImageViewer = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default()({\n props: {\n collectionIndex: Number,\n },\n })\n ], ImageViewer);\n return ImageViewer;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_ImageViewer = (ImageViewer_ImageViewer);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1b816e52\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/ImageViewer.vue\nvar ImageViewer_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"image-viewer\",\n attrs: {\n \"tabindex\": \"-1\"\n },\n on: {\n \"click\": _vm.handleNextTrigger,\n \"keydown\": [function($event) {\n if (!('button' in $event) && _vm._k($event.keyCode, \"left\", 37)) { return null; }\n if ('button' in $event && $event.button !== 0) { return null; }\n $event.preventDefault();\n _vm.handlePreviousTrigger($event)\n }, function($event) {\n if (!('button' in $event) && $event.keyCode !== 75) { return null; }\n $event.preventDefault();\n _vm.handlePreviousTrigger($event)\n }, function($event) {\n if (!('button' in $event) && _vm._k($event.keyCode, \"right\", 39)) { return null; }\n if ('button' in $event && $event.button !== 2) { return null; }\n $event.preventDefault();\n _vm.handleNextTrigger($event)\n }, function($event) {\n if (!('button' in $event) && $event.keyCode !== 74) { return null; }\n $event.preventDefault();\n _vm.handleNextTrigger($event)\n }]\n }\n }, [_c('div', {\n staticClass: \"image-viewer__images\"\n }, _vm._l((_vm.images), function(displayImage, i) {\n return _c('div', {\n key: displayImage.id,\n staticClass: \"image-viewer__wrap\",\n class: {\n hidden: i !== _vm.selectedIndex\n },\n style: ({\n transform: _vm.$store.state.settings.isScaledImageMode ? 'scale(0.5)' : 'none'\n })\n }, [_c('img', {\n staticClass: \"image-viewer__img\",\n attrs: {\n \"src\": displayImage.src,\n \"alt\": displayImage.filename\n }\n })])\n })), _vm._v(\" \"), _c('button', {\n staticClass: \"nav-button nav-button--next fade-when-inactive\",\n attrs: {\n \"aria-label\": \"next image\"\n },\n on: {\n \"click\": function($event) {\n $event.stopPropagation();\n _vm.handleNextTrigger($event)\n }\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"75.4 27 461.2 738\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M167.7 27l368.9 369-368.9 369-92.3-92.3 276.7-276.7-276.7-276.7z\"\n }\n })])]), _vm._v(\" \"), _c('button', {\n staticClass: \"nav-button nav-button--prev fade-when-inactive\",\n attrs: {\n \"aria-label\": \"previous image\"\n },\n on: {\n \"click\": function($event) {\n $event.stopPropagation();\n _vm.handlePreviousTrigger($event)\n }\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"75.396 26.994 461.208 738.012\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M444.336 765.006l-368.94-369.006 368.94-369.006 92.268 92.268-276.738 276.738 276.738 276.738z\"\n }\n })])])])\n}\nvar ImageViewer_staticRenderFns = []\nvar ImageViewer_esExports = { render: ImageViewer_render, staticRenderFns: ImageViewer_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_ImageViewer = (ImageViewer_esExports);\n// CONCATENATED MODULE: ./src/components/ImageViewer.vue\nfunction ImageViewer_injectStyle (ssrContext) {\n __webpack_require__(13)\n}\nvar ImageViewer_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar ImageViewer___vue_styles__ = ImageViewer_injectStyle\n/* scopeId */\nvar ImageViewer___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar ImageViewer___vue_module_identifier__ = null\nvar ImageViewer_Component = ImageViewer_normalizeComponent(\n components_ImageViewer,\n selectortype_template_index_0_src_components_ImageViewer,\n ImageViewer___vue_styles__,\n ImageViewer___vue_scopeId__,\n ImageViewer___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_ImageViewer = (ImageViewer_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/CollectionViewer.vue\n\n\n\nvar CollectionViewer_CollectionViewer = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](CollectionViewer, _super);\n function CollectionViewer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(CollectionViewer.prototype, \"selectedIndex\", {\n get: function () {\n return this.$store.state.selectedCollectionIndex;\n },\n enumerable: true,\n configurable: true\n });\n CollectionViewer.prototype.setSelectedGroup = function (index) {\n this.$store.commit('setSelectedGroup', index);\n // Focus on the image viewer element so the bound keyboard events work.\n var imageViewer = this.getImageViewer(index);\n requestAnimationFrame(function () {\n imageViewer.$el.focus();\n });\n };\n CollectionViewer.prototype.getImageViewer = function (index) {\n return this.$refs.imageViewer[index];\n };\n CollectionViewer.prototype.mounted = function () {\n this.$parent.$on('selectgroup', this.setSelectedGroup);\n };\n CollectionViewer.prototype.created = function () {\n this.$store.commit('setSelectedGroup', 0);\n };\n CollectionViewer = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], CollectionViewer);\n return CollectionViewer;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_CollectionViewer = (CollectionViewer_CollectionViewer);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5c68a21b\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CollectionViewer.vue\nvar CollectionViewer_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"collection-viewer\"\n }, _vm._l((_vm.$store.state.collections), function(collection, i) {\n return _c('image-viewer', {\n key: collection.id,\n ref: \"imageViewer\",\n refInFor: true,\n class: {\n hidden: i !== _vm.selectedIndex\n },\n attrs: {\n \"collection-index\": i\n }\n })\n }))\n}\nvar CollectionViewer_staticRenderFns = []\nvar CollectionViewer_esExports = { render: CollectionViewer_render, staticRenderFns: CollectionViewer_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_CollectionViewer = (CollectionViewer_esExports);\n// CONCATENATED MODULE: ./src/components/CollectionViewer.vue\nfunction CollectionViewer_injectStyle (ssrContext) {\n __webpack_require__(14)\n}\nvar CollectionViewer_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar CollectionViewer___vue_styles__ = CollectionViewer_injectStyle\n/* scopeId */\nvar CollectionViewer___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar CollectionViewer___vue_module_identifier__ = null\nvar CollectionViewer_Component = CollectionViewer_normalizeComponent(\n components_CollectionViewer,\n selectortype_template_index_0_src_components_CollectionViewer,\n CollectionViewer___vue_styles__,\n CollectionViewer___vue_scopeId__,\n CollectionViewer___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_CollectionViewer = (CollectionViewer_Component.exports);\n\n// EXTERNAL MODULE: ./node_modules/@odopod/odo-dialog/dist/odo-dialog.js\nvar dist_odo_dialog = __webpack_require__(16);\nvar dist_odo_dialog_default = /*#__PURE__*/__webpack_require__.n(dist_odo_dialog);\n\n// CONCATENATED MODULE: ./src/Dialog.ts\n\n\nvar Z_DIALOG = 1050;\nvar Dialog_Dialog = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](Dialog, _super);\n function Dialog() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.z = Z_DIALOG;\n return _this;\n }\n Dialog.getOpenDialogCount = function () {\n return dist_odo_dialog_default.a.Instances.filter(function (instance) { return instance.isOpen; }).length;\n };\n Dialog.getNextTopLayer = function () {\n var layers = dist_odo_dialog_default.a.Instances.map(function (instance) { return instance.z; });\n return Math.max.apply(Math, layers) + 20;\n };\n Dialog.prototype.open = function () {\n var _this = this;\n if (Dialog.getOpenDialogCount() > 0) {\n this.z = Dialog.getNextTopLayer();\n this.element.style.zIndex = '' + this.z;\n this.backdrop.style.zIndex = '' + (this.z - 5);\n this.once(dist_odo_dialog_default.a.EventType.CLOSED, function () {\n _this.z = Z_DIALOG;\n _this.element.style.zIndex = '';\n _this.backdrop.style.zIndex = '';\n });\n }\n _super.prototype.open.call(this);\n };\n return Dialog;\n}(dist_odo_dialog_default.a));\n/* harmony default export */ var src_Dialog = (Dialog_Dialog);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/HelpMenu.vue\n\n\n\n\nvar HelpMenu_HelpMenu = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](HelpMenu, _super);\n function HelpMenu() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n HelpMenu.prototype.toggle = function () {\n if (this.dialog.isOpen) {\n this.dialog.close();\n }\n else {\n this.dialog.open();\n }\n };\n HelpMenu.prototype.mounted = function () {\n this.$parent.$on('helptoggle', this.toggle);\n this.dialog = new src_Dialog(document.getElementById('help-dialog'));\n };\n HelpMenu.prototype.beforeDestroy = function () {\n this.dialog.dispose();\n this.dialog = null;\n };\n HelpMenu = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], HelpMenu);\n return HelpMenu;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_HelpMenu = (HelpMenu_HelpMenu);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4b5401ea\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HelpMenu.vue\nvar HelpMenu_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(2)\n}\nvar HelpMenu_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"help-dialog-title\"\n }\n }, [_vm._v(\"Compdrop Help\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"col-6@xs col-6@sm\"\n }, [_c('h3', {\n staticClass: \"type-header-3\"\n }, [_vm._v(\"What is this?\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Compdrop is a simple way to view website designs in a desktop browser. Just drag and drop your images into the browser. Images are aligned to the top of the window and horizontally centered.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"You are viewing files on \"), _c('em', [_vm._v(\"your own machine\")]), _vm._v(\". Compdrop \"), _c('strong', [_vm._v(\"does not store any of your data\")]), _vm._v(\".\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Built by \"), _c('a', {\n attrs: {\n \"href\": \"https://glencheney.com\"\n }\n }, [_vm._v(\"Glen Cheney\")]), _vm._v(\". Based on the original \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/lucasishuman/cmpdrp\"\n }\n }, [_vm._v(\"cmpdrp\")]), _vm._v(\".\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Compdrop is a progressive web app and you can use it even if you’re have no internet connection.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"View the project on \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/Vestride/compdrop\"\n }\n }, [_vm._v(\"GitHub\")]), _vm._v(\".\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"help-menu floating-button\"\n }, [_c('button', {\n staticClass: \"help-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"help-dialog\",\n \"title\": \"open help menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M6.3 5.69c-.19-.19-.28-.42-.28-.7 0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7-.19.18-.42.3-.7.3-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\",\n \"fill-rule\": \"evenodd\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog help-dialog\",\n attrs: {\n \"id\": \"help-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"help-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"row dialog-content\"\n }, [_vm._m(1), _vm._v(\" \"), _c('div', {\n staticClass: \"col-6@xs col-6@sm\"\n }, [_c('h3', {\n staticClass: \"type-header-3\"\n }, [_vm._v(\"Keyboard Shortcuts\")]), _vm._v(\" \"), _c('keyboard-shortcuts')], 1)])])])])])\n}]\nvar HelpMenu_esExports = { render: HelpMenu_render, staticRenderFns: HelpMenu_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_HelpMenu = (HelpMenu_esExports);\n// CONCATENATED MODULE: ./src/components/HelpMenu.vue\nfunction HelpMenu_injectStyle (ssrContext) {\n __webpack_require__(15)\n}\nvar HelpMenu_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar HelpMenu___vue_styles__ = HelpMenu_injectStyle\n/* scopeId */\nvar HelpMenu___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar HelpMenu___vue_module_identifier__ = null\nvar HelpMenu_Component = HelpMenu_normalizeComponent(\n components_HelpMenu,\n selectortype_template_index_0_src_components_HelpMenu,\n HelpMenu___vue_styles__,\n HelpMenu___vue_scopeId__,\n HelpMenu___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_HelpMenu = (HelpMenu_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/SettingsMenu.vue\n\n\n\n\nvar SettingsMenu_SettingsMenu = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](SettingsMenu, _super);\n function SettingsMenu() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(SettingsMenu.prototype, \"centeredLayout\", {\n get: function () {\n return this.$store.state.settings.isCenteredImageMode;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SettingsMenu.prototype, \"retina\", {\n get: function () {\n return this.$store.state.settings.isScaledImageMode;\n },\n enumerable: true,\n configurable: true\n });\n SettingsMenu.prototype.toggle = function () {\n if (this.dialog.isOpen) {\n this.dialog.close();\n }\n else {\n this.dialog.open();\n }\n };\n SettingsMenu.prototype.mounted = function () {\n this.$parent.$on('settingstoggle', this.toggle);\n this.dialog = new src_Dialog(document.getElementById('settings-dialog'));\n };\n SettingsMenu.prototype.beforeDestroy = function () {\n this.dialog.dispose();\n this.dialog = null;\n };\n SettingsMenu.prototype.layoutChange = function (event) {\n var target = event.target;\n this.$store.commit('setIsCenteredImageMode', target.checked);\n };\n SettingsMenu.prototype.retinaChange = function (event) {\n var target = event.target;\n this.$store.commit('setIsScaledImageMode', target.checked);\n };\n SettingsMenu = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], SettingsMenu);\n return SettingsMenu;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_SettingsMenu = (SettingsMenu_SettingsMenu);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6f06986d\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/SettingsMenu.vue\nvar SettingsMenu_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"settings-menu floating-button\"\n }, [_c('button', {\n staticClass: \"settings-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"settings-dialog\",\n \"title\": \"open settings menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"fill-rule\": \"evenodd\",\n \"d\": \"M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog settings-dialog\",\n attrs: {\n \"id\": \"settings-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"settings-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"row dialog-content\"\n }, [_c('div', {\n staticClass: \"col-6@xs col-12@sm\"\n }, [_c('div', [_c('input', {\n attrs: {\n \"type\": \"checkbox\",\n \"id\": \"checkbox-centered-layout\"\n },\n domProps: {\n \"checked\": _vm.centeredLayout\n },\n on: {\n \"change\": _vm.layoutChange\n }\n }), _vm._v(\" \"), _c('label', {\n attrs: {\n \"for\": \"checkbox-centered-layout\"\n }\n }, [_vm._v(\"Center images (turn off to scroll them)\")])]), _vm._v(\" \"), _c('div', [_c('input', {\n attrs: {\n \"type\": \"checkbox\",\n \"id\": \"checkbox-retina\"\n },\n domProps: {\n \"checked\": _vm.retina\n },\n on: {\n \"change\": _vm.retinaChange\n }\n }), _vm._v(\" \"), _c('label', {\n attrs: {\n \"for\": \"checkbox-retina\"\n }\n }, [_vm._v(\"Scale images to half size\")])])])])])])])])\n}\nvar SettingsMenu_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"settings-dialog-title\"\n }\n }, [_vm._v(\"Compdrop Settings\")])])\n}]\nvar SettingsMenu_esExports = { render: SettingsMenu_render, staticRenderFns: SettingsMenu_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_SettingsMenu = (SettingsMenu_esExports);\n// CONCATENATED MODULE: ./src/components/SettingsMenu.vue\nfunction SettingsMenu_injectStyle (ssrContext) {\n __webpack_require__(19)\n}\nvar SettingsMenu_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar SettingsMenu___vue_styles__ = SettingsMenu_injectStyle\n/* scopeId */\nvar SettingsMenu___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar SettingsMenu___vue_module_identifier__ = null\nvar SettingsMenu_Component = SettingsMenu_normalizeComponent(\n components_SettingsMenu,\n selectortype_template_index_0_src_components_SettingsMenu,\n SettingsMenu___vue_styles__,\n SettingsMenu___vue_scopeId__,\n SettingsMenu___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_SettingsMenu = (SettingsMenu_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/CollectionsMenu.vue\n\n\n\n\nvar CollectionsMenu_CollectionsMenu = /** @class */ (function (_super) {\n tslib_es6[\"c\" /* __extends */](CollectionsMenu, _super);\n function CollectionsMenu() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n CollectionsMenu.prototype.toggle = function () {\n if (this.dialog.isOpen) {\n this.dialog.close();\n }\n else {\n this.dialog.open();\n }\n };\n CollectionsMenu.prototype.select = function (collectionIndex, imageIndex) {\n this.$store.commit('selectImage', {\n index: imageIndex,\n collectionIndex: collectionIndex,\n });\n this.dialog.close();\n };\n CollectionsMenu.prototype.mounted = function () {\n this.$parent.$on('collectionstoggle', this.toggle);\n this.dialog = new src_Dialog(document.getElementById('collections-dialog'));\n };\n CollectionsMenu.prototype.beforeDestroy = function () {\n this.dialog.dispose();\n this.dialog = null;\n };\n CollectionsMenu = tslib_es6[\"b\" /* __decorate */]([\n vue_class_component_common_default.a\n ], CollectionsMenu);\n return CollectionsMenu;\n}(vue_esm[\"default\"]));\n/* harmony default export */ var components_CollectionsMenu = (CollectionsMenu_CollectionsMenu);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7c48f999\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CollectionsMenu.vue\nvar CollectionsMenu_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"collections-menu floating-button\"\n }, [_c('button', {\n staticClass: \"collections-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"collections-dialog\",\n \"title\": \"open collections menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M13 3H7c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 8H8V5h4v6zM4 4h1v1H4v6h1v1H4c-.55 0-1-.45-1-1V5c0-.55.45-1 1-1zM1 5h1v1H1v4h1v1H1c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1z\",\n \"fill-rule\": \"evenodd\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog collections-dialog\",\n attrs: {\n \"id\": \"collections-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"collections-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"dialog-content\"\n }, _vm._l((_vm.$store.state.collections), function(collection, i) {\n return _c('div', {\n key: collection.id,\n staticClass: \"row\"\n }, [_c('h3', {\n staticClass: \"col-6@xs col-12@sm type-header-3 collections-menu__title\"\n }, [_c('span', [_vm._v(_vm._s(collection.name || (\"Collection \" + (i + 1))))]), _vm._v(\" \"), _c('small', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (i === _vm.$store.state.selectedCollectionIndex),\n expression: \"i === $store.state.selectedCollectionIndex\"\n }]\n }, [_vm._v(\"[current]\")])]), _vm._v(\" \"), _vm._l((collection.images), function(image, j) {\n return _c('div', {\n key: image.id,\n staticClass: \"col-1@xs col-1@sm\"\n }, [_c('button', {\n staticClass: \"collections-menu__thumb-btn\",\n on: {\n \"click\": function($event) {\n _vm.select(i, j)\n }\n }\n }, [_c('img', {\n staticClass: \"collections-menu__thumb\",\n class: {\n 'collections-menu__thumb--selected': j === _vm.$store.state.selectedImages[i]\n },\n attrs: {\n \"src\": image.src,\n \"alt\": image.filename,\n \"title\": image.filename\n }\n })])])\n })], 2)\n }))])])])])\n}\nvar CollectionsMenu_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"collections-dialog-title\"\n }\n }, [_vm._v(\"Collections\")])])\n}]\nvar CollectionsMenu_esExports = { render: CollectionsMenu_render, staticRenderFns: CollectionsMenu_staticRenderFns }\n/* harmony default export */ var selectortype_template_index_0_src_components_CollectionsMenu = (CollectionsMenu_esExports);\n// CONCATENATED MODULE: ./src/components/CollectionsMenu.vue\nfunction CollectionsMenu_injectStyle (ssrContext) {\n __webpack_require__(20)\n}\nvar CollectionsMenu_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar CollectionsMenu___vue_styles__ = CollectionsMenu_injectStyle\n/* scopeId */\nvar CollectionsMenu___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar CollectionsMenu___vue_module_identifier__ = null\nvar CollectionsMenu_Component = CollectionsMenu_normalizeComponent(\n components_CollectionsMenu,\n selectortype_template_index_0_src_components_CollectionsMenu,\n CollectionsMenu___vue_styles__,\n CollectionsMenu___vue_scopeId__,\n CollectionsMenu___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_CollectionsMenu = (CollectionsMenu_Component.exports);\n\n// CONCATENATED MODULE: ./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/KeyboardShortcuts.vue\n/* harmony default export */ var KeyboardShortcuts = ({\n data: function () {\n return {\n shortcuts: [\n {\n keys: ['→', 'J'],\n desc: 'Next image',\n },\n {\n keys: ['←', 'K'],\n desc: 'Previous image',\n },\n {\n keys: ['⇧ Click'],\n desc: 'Navigate without scrolling to the top',\n },\n {\n keys: ['1', '2', '3'],\n desc: 'Switch collection (numbers 1 through 9)',\n },\n {\n keys: ['?'],\n desc: 'Toggle [this] help menu',\n },\n {\n keys: ['S'],\n desc: 'Toggle settings menu',\n },\n {\n keys: ['C'],\n desc: 'Toggle collection menu',\n },\n {\n keys: ['H'],\n desc: 'Hide Compdrop UI elements',\n },\n {\n keys: ['R'],\n desc: 'Remove all images',\n },\n ],\n };\n }\n});\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-57d8198b\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/KeyboardShortcuts.vue\nvar KeyboardShortcuts_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(0)\n}\nvar KeyboardShortcuts_staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('dl', {\n staticClass: \"unstyled-list shortcut-list\"\n }, [_vm._l((_vm.shortcuts), function(item) {\n return [_c('dt', {\n key: item.desc,\n staticClass: \"shortcut-item__triggers\"\n }, _vm._l((item.keys), function(trigger) {\n return _c('kbd', {\n key: trigger\n }, [_vm._v(_vm._s(trigger))])\n })), _vm._v(\" \"), _c('dd', {\n key: item.desc,\n staticClass: \"shortcut-item__description\"\n }, [_vm._v(_vm._s(item.desc))])]\n })], 2)\n}]\nvar KeyboardShortcuts_esExports = { render: KeyboardShortcuts_render, staticRenderFns: KeyboardShortcuts_staticRenderFns }\n/* harmony default export */ var components_KeyboardShortcuts = (KeyboardShortcuts_esExports);\n// CONCATENATED MODULE: ./src/components/KeyboardShortcuts.vue\nfunction KeyboardShortcuts_injectStyle (ssrContext) {\n __webpack_require__(21)\n}\nvar KeyboardShortcuts_normalizeComponent = __webpack_require__(1)\n/* script */\n\n/* template */\n\n/* styles */\nvar KeyboardShortcuts___vue_styles__ = KeyboardShortcuts_injectStyle\n/* scopeId */\nvar KeyboardShortcuts___vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar KeyboardShortcuts___vue_module_identifier__ = null\nvar KeyboardShortcuts_Component = KeyboardShortcuts_normalizeComponent(\n KeyboardShortcuts,\n components_KeyboardShortcuts,\n KeyboardShortcuts___vue_styles__,\n KeyboardShortcuts___vue_scopeId__,\n KeyboardShortcuts___vue_module_identifier__\n)\n\n/* harmony default export */ var src_components_KeyboardShortcuts = (KeyboardShortcuts_Component.exports);\n\n// EXTERNAL MODULE: ./node_modules/vuex/dist/vuex.esm.js\nvar vuex_esm = __webpack_require__(22);\n\n// CONCATENATED MODULE: ./src/state.ts\nvar State = /** @class */ (function () {\n function State() {\n this.collections = [];\n this.selectedCollectionIndex = 0;\n this.selectedImages = [];\n this.settings = {\n isCenteredImageMode: true,\n isScaledImageMode: false,\n };\n }\n return State;\n}());\n/* harmony default export */ var src_state = (State);\n;\n\n// CONCATENATED MODULE: ./src/store.ts\n\n\n\nvue_esm[\"default\"].use(vuex_esm[\"a\" /* default */]);\nfunction maybePluralize(count, noun, suffix) {\n if (suffix === void 0) { suffix = 's'; }\n return count + \" \" + noun + (count !== 1 ? suffix : '');\n}\n/* harmony default export */ var store = (new vuex_esm[\"a\" /* default */].Store({\n state: new src_state(),\n mutations: {\n addCollection: function (state, collection) {\n state.collections.push(collection);\n vue_esm[\"default\"].set(state.selectedImages, state.collections.length - 1, 0);\n },\n updateCollectionImages: function (state, payload) {\n vue_esm[\"default\"].set(state.collections, payload.index, {\n id: state.collections[payload.index].id,\n name: state.collections[payload.index].name,\n images: state.collections[payload.index].images.concat(payload.images),\n });\n },\n emptyCollections: function (state) {\n state.collections = [];\n state.selectedImages = [];\n state.selectedCollectionIndex = 0;\n },\n setSelectedGroup: function (state, index) {\n if (index > -1 && index < state.collections.length) {\n state.selectedCollectionIndex = index;\n }\n },\n selectImage: function (state, payload) {\n vue_esm[\"default\"].set(state.selectedImages, payload.collectionIndex, payload.index);\n state.selectedCollectionIndex = payload.collectionIndex;\n },\n setIsCenteredImageMode: function (state, payload) {\n state.settings.isCenteredImageMode = payload;\n },\n setIsScaledImageMode: function (state, payload) {\n state.settings.isScaledImageMode = payload;\n },\n },\n getters: {\n totalCollections: function (state) {\n return state.collections.length;\n },\n pageTitle: function (state) {\n if (state.collections.length > 1) {\n var totalImages = state.collections.reduce(function (total, collection) { return total + collection.images.length; }, 0);\n return maybePluralize(state.collections.length, 'collection') + \" \\u2013 \" + maybePluralize(totalImages, 'image') + \" \\u2013 compdrop\";\n }\n if (state.collections.length > 0) {\n return maybePluralize(state.collections[0].images.length, 'image') + \" \\u2013 compdrop\";\n }\n return 'compdrop';\n }\n }\n}));\n\n// CONCATENATED MODULE: ./src/main.ts\n\n\n\n\n\n\n\n\n\n\n\n\n\nvue_esm[\"default\"].config.productionTip = false;\nvue_esm[\"default\"].component('welcome-screen', src_components_WelcomeScreen);\nvue_esm[\"default\"].component('loading-screen', src_components_LoadingScreen);\nvue_esm[\"default\"].component('image-viewer', src_components_ImageViewer);\nvue_esm[\"default\"].component('collection-viewer', src_components_CollectionViewer);\nvue_esm[\"default\"].component('help-menu', src_components_HelpMenu);\nvue_esm[\"default\"].component('settings-menu', src_components_SettingsMenu);\nvue_esm[\"default\"].component('collections-menu', src_components_CollectionsMenu);\nvue_esm[\"default\"].component('keyboard-shortcuts', src_components_KeyboardShortcuts);\n/* eslint-disable no-new */\nnew vue_esm[\"default\"]({\n el: '#app',\n store: store,\n template: '',\n components: { App: src_App },\n});\n\n\n/***/ }),\n/* 6 */,\n/* 7 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 8 */,\n/* 9 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 16 */,\n/* 17 */,\n/* 18 */,\n/* 19 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ })\n],[5]);\n\n\n// WEBPACK FOOTER //\n// static/js/app.bb7a709aed964124cabe.js","import FileCollection from './FileCollection';\n\n// https://wicg.github.io/entries-api/#api-directoryreader\ninterface FileSystemDirectoryReader {\n readEntries(successCallback: (entries: FileSystemEntry[]) => void, errorCallback?: () => void): void;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry\ninterface FileSystemEntry {\n readonly filesystem: any;\n readonly fullPath: string;\n readonly isDirectory: boolean;\n readonly isFile: boolean;\n readonly name: string;\n createReader(): FileSystemDirectoryReader;\n file(callback: (file: File) => void): void;\n}\n\n/**\n * Does the same thing as lodash's _.partition\n */\nfunction partition(collection: T[], predicate: (item: T) => boolean): T[][] {\n const truthy: T[] = [];\n const falsy: T[] = [];\n collection.forEach((item: T) => {\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item);\n }\n });\n return [truthy, falsy];\n}\n\n/**\n * Flatten an array, but only a single level deep.\n */\nfunction flattenOnce(collection: T[][]): T[] {\n return collection.reduce((result: T[], collection: T[]) => {\n return result.concat(collection);\n }, []);\n}\n\n/**\n * Get a File instance from an entry instance.\n */\nfunction getFile(entry: FileSystemEntry): Promise {\n return new Promise((resolve) => {\n entry.file(resolve);\n });\n}\n\nfunction getFilesFromDirectoryEntry(entry: FileSystemEntry, collections: FileCollection[] = []): Promise {\n const directoryName = getDirectoryName(entry.fullPath);\n return new Promise((resolve) => {\n entry.createReader().readEntries((entries: FileSystemEntry[]) => {\n // Split files and directories apart.\n const parts = partition(entries, entry => entry.isFile);\n\n // Once all the initial files have been read, add them to the collections\n // array and start reading directories.\n Promise.all(parts[0].map(getFile)).then((files: File[]) => {\n const fileCollection: FileCollection = {\n name: directoryName,\n files: files,\n };\n collections.push(fileCollection);\n // Recursively read directories.\n const directories = parts[1].map(entry => getFilesFromDirectoryEntry(entry, collections));\n // Since the collections array is passed as an argument and mutated\n // within this recursive function, we don't care about the resolved\n // promise value for any recursed calls to this function.\n Promise.all(directories).then(() => {\n resolve(collections);\n });\n });\n });\n });\n}\n\nfunction getDirectoryName(fullPath: string): string {\n const pathPieces = fullPath.split('/');\n return pathPieces[pathPieces.length - 1] || '';\n}\n\nfunction getFileExtension(fileName: string): string {\n const matches = fileName && fileName.match(/\\.([^.]+)$/);\n if (matches) {\n return matches[1].toLowerCase();\n }\n\n return '';\n}\n\nconst VALID_IMAGE_EXTENSIONS = [\n 'bmp',\n 'gif',\n 'jpeg',\n 'jpg',\n 'jpe',\n 'png',\n 'svg',\n 'tiff',\n 'tif',\n 'webp',\n 'ico',\n];\n\nexport function isImageFile(file: File): boolean {\n // Firefox doesn't support the `type` property - it's empty.\n if (file.type && file.type.includes('image/')) {\n return true;\n }\n\n const extension = getFileExtension(file.name);\n return VALID_IMAGE_EXTENSIONS.includes(extension);\n}\n\nexport function readFileAsDataURL(file: File): Promise {\n const start = Date.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n\n // Resolve promise when the reader finishes.\n reader.onload = () => {\n console.log(`Read took ${Date.now() - start} milliseconds`)\n resolve(reader.result as string);\n };\n\n // Start reader.\n reader.readAsDataURL(file);\n });\n}\n\nexport function readDroppedItems(itemList: DataTransferItemList): Promise {\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry\n const entries = Array.from(itemList)\n .map(item => item.webkitGetAsEntry())\n .filter(entry => !!entry);\n\n const [files, dirs] = partition(entries, (entry: FileSystemEntry) => entry.isFile);\n\n return Promise.all([\n Promise.all(files.map(getFile)),\n Promise.all(dirs.map(entry => getFilesFromDirectoryEntry(entry))),\n ]).then((result) => {\n const looseFiles: File[] = result[0];\n const groups: FileCollection[][] = result[1];\n\n // At this point, there we have an array which is 3 levels deep.\n // * Top level is the user's selection which they dropped.\n // * Next is a grouping of collections by directory\n // * Finally, the array of files in that directory.\n const collections = flattenOnce(groups);\n\n // Add loose files to the front.\n if (looseFiles.length) {\n collections.unshift({\n name: '',\n files: looseFiles,\n });\n }\n\n return collections;\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/FileDropReader.ts","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport DisplayImage from './DisplayImage';\nimport Collection from './Collection';\nimport FileCollection from './FileCollection';\nimport { readDroppedItems, readFileAsDataURL, isImageFile } from './FileDropReader';\n\nlet count = 0;\nfunction uniqueId(): number {\n count += 1;\n return count;\n}\n\n@Component\nexport default class App extends Vue {\n hasContent: boolean = false;\n canDrop: boolean = false;\n isLoading: boolean = false;\n\n // Activity watcher.\n isUserActive: boolean = false;\n timer: number;\n\n _handleDragHover(evt: DragEvent): void {\n evt.preventDefault();\n evt.dataTransfer.dropEffect = 'copy';\n this.canDrop = true;\n }\n\n _handleDragCancel(evt: DragEvent): void {\n evt.preventDefault();\n this.canDrop = false;\n }\n\n _handleDrop(evt: DragEvent): void {\n evt.preventDefault();\n\n this.isLoading = true;\n const start = Date.now();\n\n const done = () => {\n this.isLoading = false;\n requestAnimationFrame(() => {\n console.log(`Drop took ${Date.now() - start} milliseconds`)\n });\n };\n\n // Safari and IE don't support `items` property.\n if (evt.dataTransfer.items) {\n readDroppedItems(evt.dataTransfer.items).then((collections: FileCollection[]) => {\n Promise.all(collections.map(this._addFileList)).then(done);\n });\n } else {\n const fileCollection: FileCollection = {\n name: '',\n files: Array.from(evt.dataTransfer.files),\n };\n this._addFileList(fileCollection).then(done);\n }\n }\n\n _handleFilesChosen(files: File[]): void {\n this._addFileList({\n name: '',\n files: files,\n });\n }\n\n _addFileList(fileCollection: FileCollection): Promise {\n // Filter out non-images and sort by file name.\n const files = fileCollection.files\n .filter(isImageFile)\n .sort((a: File, b: File): number => a.name.localeCompare(b.name));\n\n let promise;\n\n if (files.length > 0) {\n // Async load all files with a FileReader and update the images array when done.\n promise = this.renderFirstImageThenOthers(files, fileCollection.name);\n } else {\n promise = Promise.resolve();\n }\n\n // Hide drop messaging.\n this.canDrop = false;\n\n return promise;\n }\n\n async renderFirstImageThenOthers(files: File[], collectionName: string): Promise {\n const collectionId = uniqueId();\n // Remove the first file from the array.\n const first = files.shift();\n\n // Read the file and update the images property so that Vue re-renders.\n // This intentionally blocks execution for reading the other files.\n const image = await this.getDisplayImage(first);\n const collectionIndex = this.$store.getters.totalCollections as number;\n this.$store.commit('addCollection', {\n id: collectionId,\n name: collectionName,\n images: [image],\n });\n\n // Set flag for whether there was content after the first display image has\n // been read.\n this.hasContent = this.$store.state.collections.length > 0 || files.length > 0;\n\n // Wait a frame, then start reading the remaining files.\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n Promise.all(this.getDisplayImages(files)).then((images) => {\n this.$store.commit('updateCollectionImages', {\n index: collectionIndex,\n images: images,\n });\n this.updatePageTitle();\n resolve();\n });\n });\n });\n }\n\n getDisplayImages(files: File[]): Promise[] {\n return files.map(this.getDisplayImage);\n }\n\n getDisplayImage(file: File): Promise {\n return readFileAsDataURL(file).then((dataURL: string) => {\n return {\n id: uniqueId(),\n filename: file.name,\n src: dataURL,\n };\n });\n }\n\n updatePageTitle(): void {\n document.title = this.$store.getters.pageTitle as string;\n }\n\n mounted(): void {\n this._handleKeyDown = this._handleKeyDown.bind(this);\n this._handleDragHover = this._handleDragHover.bind(this);\n this._handleDragCancel = this._handleDragCancel.bind(this);\n this._handleDrop = this._handleDrop.bind(this);\n document.body.addEventListener('keydown', this._handleKeyDown);\n document.body.addEventListener('dragover', this._handleDragHover);\n document.body.addEventListener('dragleave', this._handleDragCancel);\n document.body.addEventListener('drop', this._handleDrop);\n }\n\n beforeDestroy(): void {\n document.body.removeEventListener('keydown', this._handleKeyDown);\n document.body.removeEventListener('dragover', this._handleDragHover);\n document.body.removeEventListener('dragleave', this._handleDragCancel);\n document.body.removeEventListener('drop', this._handleDrop);\n }\n\n _handleKeyDown(evt: KeyboardEvent): void {\n this.handleUserAction();\n const number = parseInt(evt.key, 10);\n const isNumber = !isNaN(number);\n\n if (evt.key === '?') {\n this.helpToggle();\n } else if (evt.key === 's') {\n this.settingsToggle();\n } else if (evt.key === 'c') {\n this.collectionsToggle();\n } else if (evt.key === 'h') {\n this.isUserActive = false;\n } else if (evt.key === 'r') {\n this.reset();\n this.updatePageTitle();\n } else if (this.hasContent && isNumber && !evt.metaKey && !evt.shiftKey) {\n this.$emit('selectgroup', number - 1);\n }\n }\n\n helpToggle(): void {\n this.$emit('helptoggle');\n }\n\n settingsToggle(): void {\n this.$emit('settingstoggle');\n }\n\n collectionsToggle(): void {\n this.$emit('collectionstoggle');\n }\n\n reset(): void {\n this.$store.commit('emptyCollections');\n this.hasContent = false;\n }\n\n // Activity watcher\n handleUserAction(): void {\n clearTimeout(this.timer);\n this.isUserActive = true;\n this.timer = setTimeout(() => {\n this.isUserActive = false;\n }, 3000);\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/App.vue","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6cb1e5d3\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6cb1e5d3\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5ad0e49a\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./WelcomeScreen.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./WelcomeScreen.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5ad0e49a\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./WelcomeScreen.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/WelcomeScreen.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6a5269e6\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./LoadingScreen.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./LoadingScreen.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6a5269e6\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./LoadingScreen.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/LoadingScreen.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1b816e52\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./ImageViewer.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./ImageViewer.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1b816e52\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./ImageViewer.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/ImageViewer.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5c68a21b\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./CollectionViewer.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./CollectionViewer.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5c68a21b\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./CollectionViewer.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/CollectionViewer.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4b5401ea\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./HelpMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HelpMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4b5401ea\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./HelpMenu.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/HelpMenu.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6f06986d\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./SettingsMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./SettingsMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6f06986d\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./SettingsMenu.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/SettingsMenu.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-7c48f999\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./CollectionsMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./CollectionsMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7c48f999\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./CollectionsMenu.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/CollectionsMenu.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-57d8198b\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./KeyboardShortcuts.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./KeyboardShortcuts.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-57d8198b\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":\\\"src\\\",\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./KeyboardShortcuts.vue\"\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/KeyboardShortcuts.vue\n// module id = null\n// module chunks = ","import Vue from 'vue';\nimport Vuex from 'vuex';\nimport State from './state';\nimport Collection from './Collection';\nimport DisplayImage from './DisplayImage';\n\nVue.use(Vuex);\n\nfunction maybePluralize(count: number, noun: string, suffix: string = 's') {\n return `${count} ${noun}${count !== 1 ? suffix : ''}`;\n}\n\nexport default new Vuex.Store({\n state: new State(),\n mutations: {\n addCollection(state: State, collection: Collection): void {\n state.collections.push(collection);\n Vue.set(state.selectedImages, state.collections.length - 1, 0);\n },\n updateCollectionImages(state: State, payload: { index: number, images: DisplayImage[] }): void {\n Vue.set(state.collections, payload.index, {\n id: state.collections[payload.index].id,\n name: state.collections[payload.index].name,\n images: state.collections[payload.index].images.concat(payload.images),\n });\n },\n emptyCollections(state: State): void {\n state.collections = [];\n state.selectedImages = [];\n state.selectedCollectionIndex = 0;\n },\n setSelectedGroup(state: State, index: number): void {\n if (index > -1 && index < state.collections.length) {\n state.selectedCollectionIndex = index;\n }\n },\n selectImage(state: State, payload: { index: number, collectionIndex: number }): void {\n Vue.set(state.selectedImages, payload.collectionIndex, payload.index);\n state.selectedCollectionIndex = payload.collectionIndex;\n },\n setIsCenteredImageMode(state: State, payload: boolean): void {\n state.settings.isCenteredImageMode = payload;\n },\n setIsScaledImageMode(state: State, payload: boolean): void {\n state.settings.isScaledImageMode = payload;\n },\n },\n getters: {\n totalCollections(state: State): number {\n return state.collections.length;\n },\n pageTitle(state: State): string {\n if (state.collections.length > 1) {\n const totalImages = state.collections.reduce((total, collection) => total + collection.images.length, 0);\n return `${maybePluralize(state.collections.length, 'collection')} – ${maybePluralize(totalImages, 'image')} – compdrop`;\n }\n\n if (state.collections.length > 0) {\n return `${maybePluralize(state.collections[0].images.length, 'image')} – compdrop`;\n }\n\n return 'compdrop';\n }\n }\n});\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/store.ts","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n class: {\n 'layout-centered': _vm.$store.state.settings.isCenteredImageMode,\n 'user-inactive': !_vm.isUserActive,\n 'is-loading': _vm.isLoading,\n },\n attrs: {\n \"id\": \"app\",\n \"tabindex\": \"-1\"\n },\n on: {\n \"mousemove\": _vm.handleUserAction,\n \"mousedown\": _vm.handleUserAction\n }\n }, [_c('help-menu'), _vm._v(\" \"), _c('settings-menu'), _vm._v(\" \"), _c('collections-menu', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.hasContent),\n expression: \"hasContent\"\n }]\n }), _vm._v(\" \"), _c('main', [_c('welcome-screen', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (!_vm.hasContent),\n expression: \"!hasContent\"\n }],\n attrs: {\n \"can-drop\": _vm.canDrop\n },\n on: {\n \"fileschosen\": _vm._handleFilesChosen\n }\n }), _vm._v(\" \"), _c('loading-screen', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.isLoading),\n expression: \"isLoading\"\n }]\n }), _vm._v(\" \"), _c('collection-viewer', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.hasContent),\n expression: \"hasContent\"\n }]\n })], 1)], 1)\n}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6cb1e5d3\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\n\n@Component({\n props: {\n canDrop: {\n type: Boolean,\n required: true,\n },\n },\n})\nexport default class WelcomeScreen extends Vue {\n canDrop: boolean;\n\n handleFiles(evt: Event): void {\n const target = evt.target as HTMLInputElement;\n this.$emit('fileschosen', Array.from(target.files));\n target.value = '';\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/WelcomeScreen.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"welcome-screen\",\n class: {\n 'welcome-screen--can-drop': _vm.canDrop\n }\n }, [_c('div', {\n staticClass: \"welcome-screen__inner\"\n }, [_c('div', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (!_vm.canDrop),\n expression: \"!canDrop\"\n }],\n staticClass: \"type--center\"\n }, [_c('p', {\n staticClass: \"type-header-1\"\n }, [_vm._v(\"Drop images here.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"png, jpg, gif, bmp\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('input', {\n staticClass: \"welcome-screen__file-input\",\n attrs: {\n \"type\": \"file\",\n \"accept\": \"image/*\",\n \"multiple\": \"\",\n \"id\": \"file-input\"\n },\n on: {\n \"change\": _vm.handleFiles\n }\n })]), _vm._v(\" \"), _c('div', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (_vm.canDrop),\n expression: \"canDrop\"\n }]\n }, [_c('p', {\n staticClass: \"type-header-1\"\n }, [_vm._v(\"Release!\")])])])])\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('p', [_c('label', {\n staticClass: \"btn\",\n attrs: {\n \"for\": \"file-input\"\n }\n }, [_vm._v(\"Choose files\")])])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5ad0e49a\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/WelcomeScreen.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\n\n@Component\nexport default class LoadingScreen extends Vue {\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/LoadingScreen.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(1)\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"loading-screen__inner\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless loading-screen__text\"\n }, [_vm._v(\"Loading files\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"loading-screen\"\n }, [_vm._m(0)])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6a5269e6\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/LoadingScreen.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport DisplayImage from '../DisplayImage';\n\n@Component({\n props: {\n collectionIndex: Number,\n },\n})\nexport default class ImageViewer extends Vue {\n collectionIndex: number;\n\n get images(): DisplayImage[] {\n return this.$store.state.collections[this.collectionIndex].images;\n }\n\n get selectedIndex(): number {\n return this.$store.state.selectedImages[this.collectionIndex];\n }\n\n setSelectedIndex(index: number, scrollToTop: boolean = true): void {\n if (index >= 0 || index < this.images.length) {\n this.$store.commit('selectImage', {\n index: index,\n collectionIndex: this.collectionIndex,\n });\n\n if (scrollToTop) {\n window.scrollTo(0, 0);\n }\n }\n }\n\n handleNextTrigger(evt: MouseEvent | KeyboardEvent): void {\n this.goToNext(evt.shiftKey === false);\n }\n\n handlePreviousTrigger(evt: MouseEvent | KeyboardEvent): void {\n this.goToPrevious(evt.shiftKey === false);\n }\n\n goToNext(scrollToTop: boolean): void {\n this.setSelectedIndex(this.selectedIndex === this.images.length - 1 ?\n 0 :\n this.selectedIndex + 1, scrollToTop);\n }\n\n goToPrevious(scrollToTop: boolean): void {\n this.setSelectedIndex(this.selectedIndex === 0 ?\n this.images.length - 1 :\n this.selectedIndex - 1, scrollToTop);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/ImageViewer.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"image-viewer\",\n attrs: {\n \"tabindex\": \"-1\"\n },\n on: {\n \"click\": _vm.handleNextTrigger,\n \"keydown\": [function($event) {\n if (!('button' in $event) && _vm._k($event.keyCode, \"left\", 37)) { return null; }\n if ('button' in $event && $event.button !== 0) { return null; }\n $event.preventDefault();\n _vm.handlePreviousTrigger($event)\n }, function($event) {\n if (!('button' in $event) && $event.keyCode !== 75) { return null; }\n $event.preventDefault();\n _vm.handlePreviousTrigger($event)\n }, function($event) {\n if (!('button' in $event) && _vm._k($event.keyCode, \"right\", 39)) { return null; }\n if ('button' in $event && $event.button !== 2) { return null; }\n $event.preventDefault();\n _vm.handleNextTrigger($event)\n }, function($event) {\n if (!('button' in $event) && $event.keyCode !== 74) { return null; }\n $event.preventDefault();\n _vm.handleNextTrigger($event)\n }]\n }\n }, [_c('div', {\n staticClass: \"image-viewer__images\"\n }, _vm._l((_vm.images), function(displayImage, i) {\n return _c('div', {\n key: displayImage.id,\n staticClass: \"image-viewer__wrap\",\n class: {\n hidden: i !== _vm.selectedIndex\n },\n style: ({\n transform: _vm.$store.state.settings.isScaledImageMode ? 'scale(0.5)' : 'none'\n })\n }, [_c('img', {\n staticClass: \"image-viewer__img\",\n attrs: {\n \"src\": displayImage.src,\n \"alt\": displayImage.filename\n }\n })])\n })), _vm._v(\" \"), _c('button', {\n staticClass: \"nav-button nav-button--next fade-when-inactive\",\n attrs: {\n \"aria-label\": \"next image\"\n },\n on: {\n \"click\": function($event) {\n $event.stopPropagation();\n _vm.handleNextTrigger($event)\n }\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"75.4 27 461.2 738\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M167.7 27l368.9 369-368.9 369-92.3-92.3 276.7-276.7-276.7-276.7z\"\n }\n })])]), _vm._v(\" \"), _c('button', {\n staticClass: \"nav-button nav-button--prev fade-when-inactive\",\n attrs: {\n \"aria-label\": \"previous image\"\n },\n on: {\n \"click\": function($event) {\n $event.stopPropagation();\n _vm.handlePreviousTrigger($event)\n }\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"75.396 26.994 461.208 738.012\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M444.336 765.006l-368.94-369.006 368.94-369.006 92.268 92.268-276.738 276.738 276.738 276.738z\"\n }\n })])])])\n}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1b816e52\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/ImageViewer.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport Collection from '../Collection';\nimport DisplayImage from '../DisplayImage';\nimport ImageViewer from './ImageViewer.vue';\n\n@Component\nexport default class CollectionViewer extends Vue {\n\n get selectedIndex(): number {\n return this.$store.state.selectedCollectionIndex;\n }\n\n setSelectedGroup(index: number): void {\n this.$store.commit('setSelectedGroup', index);\n // Focus on the image viewer element so the bound keyboard events work.\n const imageViewer = this.getImageViewer(index);\n requestAnimationFrame(() => {\n imageViewer.$el.focus();\n });\n }\n\n getImageViewer(index: number): ImageViewer {\n return (this.$refs.imageViewer)[index] as ImageViewer;\n }\n\n mounted(): void {\n this.$parent.$on('selectgroup', this.setSelectedGroup);\n }\n\n created(): void {\n this.$store.commit('setSelectedGroup', 0);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/CollectionViewer.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"collection-viewer\"\n }, _vm._l((_vm.$store.state.collections), function(collection, i) {\n return _c('image-viewer', {\n key: collection.id,\n ref: \"imageViewer\",\n refInFor: true,\n class: {\n hidden: i !== _vm.selectedIndex\n },\n attrs: {\n \"collection-index\": i\n }\n })\n }))\n}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5c68a21b\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CollectionViewer.vue\n// module id = null\n// module chunks = ","import OdoDialog from '@odopod/odo-dialog';\n\nconst Z_DIALOG = 1050;\n\nclass Dialog extends OdoDialog {\n z: number = Z_DIALOG;\n\n static getOpenDialogCount(): number {\n return OdoDialog.Instances.filter((instance: Dialog) => instance.isOpen).length;\n }\n\n static getNextTopLayer(): number {\n const layers = OdoDialog.Instances.map((instance: Dialog) => instance.z);\n return Math.max(...layers) + 20;\n }\n\n open(): void {\n if (Dialog.getOpenDialogCount() > 0) {\n this.z = Dialog.getNextTopLayer();\n (this.element as HTMLElement).style.zIndex = '' + this.z;\n (this.backdrop as HTMLElement).style.zIndex = '' + (this.z - 5);\n\n this.once(OdoDialog.EventType.CLOSED, () => {\n this.z = Z_DIALOG;\n (this.element as HTMLElement).style.zIndex = '';\n (this.backdrop as HTMLElement).style.zIndex = '';\n });\n }\n\n super.open();\n }\n}\n\nexport default Dialog;\n\n\n\n// WEBPACK FOOTER //\n// ./src/Dialog.ts","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport Dialog from '../Dialog';\n\n@Component\nexport default class HelpMenu extends Vue {\n dialog: Dialog;\n\n toggle(): void {\n if (this.dialog.isOpen) {\n this.dialog.close();\n } else {\n this.dialog.open();\n }\n }\n\n mounted(): void {\n this.$parent.$on('helptoggle', this.toggle);\n this.dialog = new Dialog(document.getElementById('help-dialog'));\n }\n\n beforeDestroy(): void {\n this.dialog.dispose();\n this.dialog = null;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/HelpMenu.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(2)\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"help-dialog-title\"\n }\n }, [_vm._v(\"Compdrop Help\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"col-6@xs col-6@sm\"\n }, [_c('h3', {\n staticClass: \"type-header-3\"\n }, [_vm._v(\"What is this?\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Compdrop is a simple way to view website designs in a desktop browser. Just drag and drop your images into the browser. Images are aligned to the top of the window and horizontally centered.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"You are viewing files on \"), _c('em', [_vm._v(\"your own machine\")]), _vm._v(\". Compdrop \"), _c('strong', [_vm._v(\"does not store any of your data\")]), _vm._v(\".\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Built by \"), _c('a', {\n attrs: {\n \"href\": \"https://glencheney.com\"\n }\n }, [_vm._v(\"Glen Cheney\")]), _vm._v(\". Based on the original \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/lucasishuman/cmpdrp\"\n }\n }, [_vm._v(\"cmpdrp\")]), _vm._v(\".\")]), _vm._v(\" \"), _c('p', [_vm._v(\"Compdrop is a progressive web app and you can use it even if you’re have no internet connection.\")]), _vm._v(\" \"), _c('p', [_vm._v(\"View the project on \"), _c('a', {\n attrs: {\n \"href\": \"https://github.com/Vestride/compdrop\"\n }\n }, [_vm._v(\"GitHub\")]), _vm._v(\".\")])])\n},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"help-menu floating-button\"\n }, [_c('button', {\n staticClass: \"help-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"help-dialog\",\n \"title\": \"open help menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M6.3 5.69c-.19-.19-.28-.42-.28-.7 0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7-.19.18-.42.3-.7.3-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\",\n \"fill-rule\": \"evenodd\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog help-dialog\",\n attrs: {\n \"id\": \"help-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"help-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"row dialog-content\"\n }, [_vm._m(1), _vm._v(\" \"), _c('div', {\n staticClass: \"col-6@xs col-6@sm\"\n }, [_c('h3', {\n staticClass: \"type-header-3\"\n }, [_vm._v(\"Keyboard Shortcuts\")]), _vm._v(\" \"), _c('keyboard-shortcuts')], 1)])])])])])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4b5401ea\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HelpMenu.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport Dialog from '../Dialog';\n\n@Component\nexport default class SettingsMenu extends Vue {\n dialog: Dialog;\n\n get centeredLayout(): boolean {\n return this.$store.state.settings.isCenteredImageMode;\n }\n\n get retina(): boolean {\n return this.$store.state.settings.isScaledImageMode;\n }\n\n toggle(): void {\n if (this.dialog.isOpen) {\n this.dialog.close();\n } else {\n this.dialog.open();\n }\n }\n\n mounted(): void {\n this.$parent.$on('settingstoggle', this.toggle);\n this.dialog = new Dialog(document.getElementById('settings-dialog'));\n }\n\n beforeDestroy(): void {\n this.dialog.dispose();\n this.dialog = null;\n }\n\n layoutChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.$store.commit('setIsCenteredImageMode', target.checked);\n }\n\n retinaChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.$store.commit('setIsScaledImageMode', target.checked);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/SettingsMenu.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"settings-menu floating-button\"\n }, [_c('button', {\n staticClass: \"settings-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"settings-dialog\",\n \"title\": \"open settings menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"fill-rule\": \"evenodd\",\n \"d\": \"M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog settings-dialog\",\n attrs: {\n \"id\": \"settings-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"settings-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"row dialog-content\"\n }, [_c('div', {\n staticClass: \"col-6@xs col-12@sm\"\n }, [_c('div', [_c('input', {\n attrs: {\n \"type\": \"checkbox\",\n \"id\": \"checkbox-centered-layout\"\n },\n domProps: {\n \"checked\": _vm.centeredLayout\n },\n on: {\n \"change\": _vm.layoutChange\n }\n }), _vm._v(\" \"), _c('label', {\n attrs: {\n \"for\": \"checkbox-centered-layout\"\n }\n }, [_vm._v(\"Center images (turn off to scroll them)\")])]), _vm._v(\" \"), _c('div', [_c('input', {\n attrs: {\n \"type\": \"checkbox\",\n \"id\": \"checkbox-retina\"\n },\n domProps: {\n \"checked\": _vm.retina\n },\n on: {\n \"change\": _vm.retinaChange\n }\n }), _vm._v(\" \"), _c('label', {\n attrs: {\n \"for\": \"checkbox-retina\"\n }\n }, [_vm._v(\"Scale images to half size\")])])])])])])])])\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"settings-dialog-title\"\n }\n }, [_vm._v(\"Compdrop Settings\")])])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6f06986d\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/SettingsMenu.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport Dialog from '../Dialog';\nimport Collection from '../Collection';\n\n@Component\nexport default class CollectionsMenu extends Vue {\n dialog: Dialog;\n\n toggle(): void {\n if (this.dialog.isOpen) {\n this.dialog.close();\n } else {\n this.dialog.open();\n }\n }\n\n select(collectionIndex: number, imageIndex: number): void {\n this.$store.commit('selectImage', {\n index: imageIndex,\n collectionIndex: collectionIndex,\n });\n this.dialog.close();\n }\n\n mounted(): void {\n this.$parent.$on('collectionstoggle', this.toggle);\n this.dialog = new Dialog(document.getElementById('collections-dialog'));\n }\n\n beforeDestroy(): void {\n this.dialog.dispose();\n this.dialog = null;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/CollectionsMenu.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"collections-menu floating-button\"\n }, [_c('button', {\n staticClass: \"collections-menu__toggle fade-when-inactive\",\n attrs: {\n \"data-odo-dialog-open\": \"collections-dialog\",\n \"title\": \"open collections menu\"\n }\n }, [_c('svg', {\n attrs: {\n \"viewBox\": \"0 0 14 16\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('path', {\n attrs: {\n \"d\": \"M13 3H7c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 8H8V5h4v6zM4 4h1v1H4v6h1v1H4c-.55 0-1-.45-1-1V5c0-.55.45-1 1-1zM1 5h1v1H1v4h1v1H1c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1z\",\n \"fill-rule\": \"evenodd\"\n }\n })])]), _vm._v(\" \"), _c('div', {\n staticClass: \"odo-dialog collections-dialog\",\n attrs: {\n \"id\": \"collections-dialog\",\n \"role\": \"dialog\",\n \"aria-labelledby\": \"collections-dialog-title\",\n \"aria-hidden\": \"true\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__content container\",\n attrs: {\n \"role\": \"document\"\n }\n }, [_c('div', {\n staticClass: \"odo-dialog__inner\"\n }, [_c('button', {\n staticClass: \"odo-dialog__close\",\n attrs: {\n \"type\": \"button\",\n \"data-odo-dialog-close\": \"\",\n \"aria-label\": \"Close this dialog window\"\n }\n }, [_vm._v(\"×\")]), _vm._v(\" \"), _vm._m(0), _vm._v(\" \"), _c('div', {\n staticClass: \"dialog-content\"\n }, _vm._l((_vm.$store.state.collections), function(collection, i) {\n return _c('div', {\n key: collection.id,\n staticClass: \"row\"\n }, [_c('h3', {\n staticClass: \"col-6@xs col-12@sm type-header-3 collections-menu__title\"\n }, [_c('span', [_vm._v(_vm._s(collection.name || (\"Collection \" + (i + 1))))]), _vm._v(\" \"), _c('small', {\n directives: [{\n name: \"show\",\n rawName: \"v-show\",\n value: (i === _vm.$store.state.selectedCollectionIndex),\n expression: \"i === $store.state.selectedCollectionIndex\"\n }]\n }, [_vm._v(\"[current]\")])]), _vm._v(\" \"), _vm._l((collection.images), function(image, j) {\n return _c('div', {\n key: image.id,\n staticClass: \"col-1@xs col-1@sm\"\n }, [_c('button', {\n staticClass: \"collections-menu__thumb-btn\",\n on: {\n \"click\": function($event) {\n _vm.select(i, j)\n }\n }\n }, [_c('img', {\n staticClass: \"collections-menu__thumb\",\n class: {\n 'collections-menu__thumb--selected': j === _vm.$store.state.selectedImages[i]\n },\n attrs: {\n \"src\": image.src,\n \"alt\": image.filename,\n \"title\": image.filename\n }\n })])])\n })], 2)\n }))])])])])\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"dialog-header\"\n }, [_c('h2', {\n staticClass: \"type-header-2 marginless\",\n attrs: {\n \"id\": \"collections-dialog-title\"\n }\n }, [_vm._v(\"Collections\")])])\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7c48f999\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CollectionsMenu.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\nexport default {\n data() {\n return {\n shortcuts: [\n {\n keys: ['→', 'J'],\n desc: 'Next image',\n },\n {\n keys: ['←', 'K'],\n desc: 'Previous image',\n },\n {\n keys: ['⇧ Click'],\n desc: 'Navigate without scrolling to the top',\n },\n {\n keys: ['1', '2', '3'],\n desc: 'Switch collection (numbers 1 through 9)',\n },\n {\n keys: ['?'],\n desc: 'Toggle [this] help menu',\n },\n {\n keys: ['S'],\n desc: 'Toggle settings menu',\n },\n {\n keys: ['C'],\n desc: 'Toggle collection menu',\n },\n {\n keys: ['H'],\n desc: 'Hide Compdrop UI elements',\n },\n {\n keys: ['R'],\n desc: 'Remove all images',\n },\n ],\n };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/KeyboardShortcuts.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(0)\n}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('dl', {\n staticClass: \"unstyled-list shortcut-list\"\n }, [_vm._l((_vm.shortcuts), function(item) {\n return [_c('dt', {\n key: item.desc,\n staticClass: \"shortcut-item__triggers\"\n }, _vm._l((item.keys), function(trigger) {\n return _c('kbd', {\n key: trigger\n }, [_vm._v(_vm._s(trigger))])\n })), _vm._v(\" \"), _c('dd', {\n key: item.desc,\n staticClass: \"shortcut-item__description\"\n }, [_vm._v(_vm._s(item.desc))])]\n })], 2)\n}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-57d8198b\",\"hasScoped\":false,\"transformToRequire\":{\"video\":\"src\",\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/KeyboardShortcuts.vue\n// module id = null\n// module chunks = ","import Collection from './Collection';\n\nexport default class State {\n collections: Collection[] = [];\n selectedCollectionIndex: number = 0;\n selectedImages: number[] = [];\n\n settings: {\n isCenteredImageMode: boolean,\n isScaledImageMode: boolean,\n } = {\n isCenteredImageMode: true,\n isScaledImageMode: false,\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/state.ts","import Vue from 'vue';\nimport Vuex from 'vuex';\nimport App from './App.vue';\nimport '@odopod/odo-dialog/css/odo-dialog.css';\nimport './styles.css';\nimport WelcomeScreen from './components/WelcomeScreen.vue';\nimport LoadingScreen from './components/LoadingScreen.vue';\nimport ImageViewer from './components/ImageViewer.vue';\nimport CollectionViewer from './components/CollectionViewer.vue';\nimport HelpMenu from './components/HelpMenu.vue';\nimport SettingsMenu from './components/SettingsMenu.vue';\nimport CollectionsMenu from './components/CollectionsMenu.vue';\nimport KeyboardShortcuts from './components/KeyboardShortcuts.vue';\nimport store from './store';\n\nVue.config.productionTip = false;\n\nVue.component('welcome-screen', WelcomeScreen);\nVue.component('loading-screen', LoadingScreen);\nVue.component('image-viewer', ImageViewer);\nVue.component('collection-viewer', CollectionViewer);\nVue.component('help-menu', HelpMenu);\nVue.component('settings-menu', SettingsMenu);\nVue.component('collections-menu', CollectionsMenu);\nVue.component('keyboard-shortcuts', KeyboardShortcuts);\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n store: store,\n template: '',\n components: { App },\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.ts"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/manifest.b617c5dbf72b6c68bfc8.js b/static/js/manifest.bf2d21396bc74945e79a.js similarity index 61% rename from static/js/manifest.b617c5dbf72b6c68bfc8.js rename to static/js/manifest.bf2d21396bc74945e79a.js index e2f6975..eb84ed7 100644 --- a/static/js/manifest.b617c5dbf72b6c68bfc8.js +++ b/static/js/manifest.bf2d21396bc74945e79a.js @@ -1,2 +1,2 @@ -!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var i,u,f,s=0,l=[];s