diff --git a/css/app.f8fa2665.css b/css/app.f8fa2665.css new file mode 100644 index 0000000000000000000000000000000000000000..6c019af8aa3a6f3af635e3c97cf1730bb8370472 --- /dev/null +++ b/css/app.f8fa2665.css @@ -0,0 +1,5 @@ +#image-container[data-v-58445a1f]{position:relative}img[data-v-58445a1f]{height:100%;width:100%}#checkmark[data-v-58445a1f]{font-family:Lucida Console,monospace;font-weight:700;color:#fff;background:#d12727;position:absolute;top:.4em;left:.4em;padding:.4em .6em}.login-button[data-v-b6e9e1e8]{margin-left:.5rem;display:inline-block;stroke:currentColor;--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.login-button[data-v-b6e9e1e8]:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}img[data-v-b47bc4fe]{height:100%}#image-container[data-v-b47bc4fe]{height:100vh;display:flex;justify-content:center} + +/*! tailwindcss v2.2.4 | MIT License | https://tailwindcss.com */ + +/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:currentColor}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}*,:after,:before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.top-0{top:0}.top-0\.5{top:.125rem}.right-0{right:0}.right-0\.5{right:.125rem}.bottom-0{bottom:0}.z-10{z-index:10}.m-2{margin:.5rem}.m-4{margin:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.last\:mr-0:last-child{margin-right:0}.inline-block{display:inline-block}.flex{display:flex}.table{display:table}.h-48{height:12rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-28{max-height:7rem}.w-1\/3{width:33.333333%}.w-full{width:100%}.max-w-xs{max-width:20rem}.max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.cursor-pointer{cursor:pointer}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.overflow-y-auto{overflow-y:auto}.whitespace-normal{white-space:normal}.rounded{border-radius:.25rem}.border-4{border-width:4px}.border{border-width:1px}.border-dotted{border-style:dotted}.border-transparent{border-color:transparent}.border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.stroke-current{stroke:currentColor}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.font-semibold{font-weight:600}.font-bold{font-weight:700}.text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-40{opacity:.4}.hover\:opacity-75:hover{opacity:.75}*,:after,:before{--tw-shadow:0 0 transparent}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}*,:after,:before{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.focus\:ring-2:focus,.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)} \ No newline at end of file diff --git a/index.html b/index.html index c53e9e1fe2877b65e948a2f26909f13a87f9acc8..90f6d694e09cbd29e9fe71fee7d0e561e9467105 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/web/favicon.ico"><title>imageboard-web</title><link href="/web/css/app.d5673b45.css" rel="preload" as="style"><link href="/web/js/app.1d48c5ce.js" rel="preload" as="script"><link href="/web/js/chunk-vendors.ca44873e.js" rel="preload" as="script"><link href="/web/css/app.d5673b45.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but imageboard-web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/web/js/chunk-vendors.ca44873e.js"></script><script src="/web/js/app.1d48c5ce.js"></script></body></html> \ No newline at end of file +<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/web/favicon.ico"><title>imageboard-web</title><link href="/web/css/app.f8fa2665.css" rel="preload" as="style"><link href="/web/js/app.e837c338.js" rel="preload" as="script"><link href="/web/js/chunk-vendors.ca44873e.js" rel="preload" as="script"><link href="/web/css/app.f8fa2665.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but imageboard-web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/web/js/chunk-vendors.ca44873e.js"></script><script src="/web/js/app.e837c338.js"></script></body></html> \ No newline at end of file diff --git a/js/app.e837c338.js b/js/app.e837c338.js new file mode 100644 index 0000000000000000000000000000000000000000..ab66ff7e2c0858053da2f406244cf13da8bad81f --- /dev/null +++ b/js/app.e837c338.js @@ -0,0 +1,2 @@ +(function(e){function t(t){for(var a,s,c=t[0],o=t[1],l=t[2],g=0,d=[];g<c.length;g++)s=c[g],Object.prototype.hasOwnProperty.call(r,s)&&r[s]&&d.push(r[s][0]),r[s]=0;for(a in o)Object.prototype.hasOwnProperty.call(o,a)&&(e[a]=o[a]);u&&u(t);while(d.length)d.shift()();return i.push.apply(i,l||[]),n()}function n(){for(var e,t=0;t<i.length;t++){for(var n=i[t],a=!0,c=1;c<n.length;c++){var o=n[c];0!==r[o]&&(a=!1)}a&&(i.splice(t--,1),e=s(s.s=n[0]))}return e}var a={},r={app:0},i=[];function s(t){if(a[t])return a[t].exports;var n=a[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,s),n.l=!0,n.exports}s.m=e,s.c=a,s.d=function(e,t,n){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},s.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(s.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)s.d(n,a,function(t){return e[t]}.bind(null,a));return n},s.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="/web/";var c=window["webpackJsonp"]=window["webpackJsonp"]||[],o=c.push.bind(c);c.push=t,c=c.slice();for(var l=0;l<c.length;l++)t(c[l]);var u=o;i.push([0,"chunk-vendors"]),n()})({0:function(e,t,n){e.exports=n("56d7")},"31f9":function(e,t,n){},"4feb":function(e,t,n){"use strict";n("a595")},"56d7":function(e,t,n){"use strict";n.r(t);n("e260"),n("e6cf"),n("cca6"),n("a79d");var a=n("2b0e"),r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("header",[n("nav",[n("router-link",{staticClass:"p-4",attrs:{to:"/"}},[e._v("Home")]),n("router-link",{attrs:{to:"/upload"}},[e._v("Upload")])],1)]),n("router-view")],1)},i=[],s=n("2877"),c={},o=Object(s["a"])(c,r,i,!1,null,null,null),l=o.exports,u=n("8c4f"),g=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"flex flex-row"},[n("section",{directives:[{name:"show",rawName:"v-show",value:!e.sideBarHidden,expression:"!sideBarHidden"}],staticClass:"flex flex-col sticky top-0 h-screen w-1/3"},[n("button",{staticClass:"self-end mt-2",on:{click:function(t){e.sideBarHidden=!0}}},[n("IconXCircle",{staticClass:"stroke-current text-gray-500 hover:text-gray-600"})],1),n("TagCreation"),n("UserAuthentication",{staticClass:"absolute bottom-0"})],1),n("button",{directives:[{name:"show",rawName:"v-show",value:e.sideBarHidden,expression:"sideBarHidden"}],staticClass:"self-start sticky top-0",on:{click:function(t){e.sideBarHidden=!1}}},[n("IconChevronsRight",{staticClass:"mt-1 stroke-current text-gray-500 hover:text-gray-600",attrs:{width:"27",height:"27"}})],1),n("ImageList")],1)},d=[],p=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("section",{staticClass:"w-full"},[n("PaginationBar",{attrs:{"current-page":e.currentPage,"last-page":e.lastPage},on:{onPageChange:e.pageChange}}),n("div",{staticClass:"w-full flex flex-row flex-wrap justify-center"},e._l(e.stateImageSnowflakes,(function(t,a){return n("div",{key:a,staticClass:"max-w-xs flex flex-col"},[n("ImageItem",{attrs:{flake:t},on:{checked:e.appendToDeleteArray}})],1)})),0),n("PaginationBar",{attrs:{"current-page":e.currentPage,"last-page":e.lastPage},on:{onPageChange:e.pageChange}}),n("button",{directives:[{name:"show",rawName:"v-show",value:e.deleteArray.length,expression:"deleteArray.length"}],staticClass:"fixed bottom-0 right-0 p-1 bg-blue-300",on:{click:function(t){return e.deleteImages(e.deleteArray)}}},[e._v(" Delete ")])],1)},f=[],h=n("1da1"),m=n("5530"),v=(n("96cf"),n("a9e3"),n("ac1f"),n("466d"),n("1276"),n("d3b7"),n("a434"),function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"image-container"},on:{click:function(t){return t.ctrlKey&&t.shiftKey?t.altKey||t.metaKey?null:(e.checked=!e.checked,void e.$emit("checked",e.checked,e.flake)):null}}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.checked,expression:"checked"}],attrs:{id:"checkmark"},on:{click:function(t){e.checked=!e.checked,e.$emit("checked",e.checked,e.flake)}}},[e._v(" X ")]),n("router-link",{attrs:{to:"/image/"+e.flake},nativeOn:{click:function(e){return e.ctrlKey&&e.shiftKey?void e.preventDefault():null}}},[n("img",{attrs:{src:"/api/image/"+e.flake+"/preview"}})])],1)}),w=[],b={data:function(){return{checked:!1}},props:{flake:{required:!0}},methods:{}},y=b,x=(n("b5d5"),Object(s["a"])(y,v,w,!1,null,"58445a1f",null)),k=x.exports,_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"mx-auto max-w-max"},e._l(e.pages,(function(t,a){return n("router-link",{key:a,staticClass:"mr-2 last:mr-0 text-lg",class:{"text-red-800":t===e.currentPage,"font-bold":t===e.currentPage},attrs:{to:"/"+t},nativeOn:{click:function(t){return e.$emit("onPageChange")}}},[e._v(" "+e._s(t)+" ")])})),1)},j=[],O=(n("4de4"),{props:{currentPage:{type:Number,required:!0},lastPage:{type:Number,required:!0}},computed:{pages:function(){return[this.currentPage>1?0:null,this.currentPage>2?"...":null,this.currentPage>0?this.currentPage-1:null,this.currentPage,this.currentPage<this.lastPage-1?this.currentPage+1:null,this.currentPage<this.lastPage-3?"...":null,this.currentPage<this.lastPage-2?this.lastPage-1:null].filter((function(e){return null!==e}))}}}),C=O,T=Object(s["a"])(C,_,j,!1,null,null,null),P=T.exports,I=n("2f62"),S={components:{ImageItem:k,PaginationBar:P},data:function(){return{deleteArray:[],currentPage:0,lastPage:0}},computed:Object(m["a"])({},Object(I["c"])(["stateUser","stateImageSnowflakes"])),created:function(){var e=this;return Object(h["a"])(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.t0=Number,t.next=3,e.getLastPage();case 3:t.t1=t.sent,e.lastPage=(0,t.t0)(t.t1),e.pageChange();case 6:case"end":return t.stop()}}),t)})))()},methods:Object(m["a"])({pageChange:function(){var e=this;return Object(h["a"])(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.currentPage=Number(window.location.pathname.split("/").pop().match(/^\d+$/)),window.scrollTo(0,0),t.t0=e,t.next=5,e.getSnowflakes(e.currentPage);case 5:t.t1=t.sent,t.t0.setStateImageSnowflakes.call(t.t0,t.t1);case 7:case"end":return t.stop()}}),t)})))()},getSnowflakes:function(e){return Object(h["a"])(regeneratorRuntime.mark((function t(){var n,a;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,fetch("/api/image/page/".concat(e,"/"));case 2:return n=t.sent,t.next=5,n.json();case 5:return a=t.sent,t.abrupt("return",a);case 7:case"end":return t.stop()}}),t)})))()},getLastPage:function(){return Object(h["a"])(regeneratorRuntime.mark((function e(){var t,n;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,fetch("/api/image/page");case 2:return t=e.sent,e.next=5,t.text();case 5:return n=e.sent,e.abrupt("return",n);case 7:case"end":return e.stop()}}),e)})))()},appendToDeleteArray:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var a=t[0],r=t[1];a?this.deleteArray.push(r):this.deleteArray.splice(this.deleteArray.indexOf(r),1)},deleteImages:function(e){for(var t={method:"DELETE",headers:{secret:this.stateUser.secret}},n=0;n<e.length;n++)fetch("/api/image/".concat(e[n]),t);this.deleteArray=[]}},Object(I["b"])(["setStateImageSnowflakes"]))},U=S,L=Object(s["a"])(U,p,f,!1,null,null,null),$=L.exports,A=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticClass:"h-48 m-4 border-dotted border-4 border-gray-400",on:{drop:function(t){t.preventDefault(),e.updateWrapper(t),t.currentTarget.classList.remove("bg-gray-200")},dragover:function(e){return e.preventDefault(),e.currentTarget.classList.add("bg-gray-200")},dragleave:function(e){return e.preventDefault(),e.currentTarget.classList.remove("bg-gray-200")}}},[n("div",{staticClass:"relative h-full"},[n("input",{ref:"imageInput",staticClass:"h-full w-full opacity-0 absolute z-10 cursor-pointer",attrs:{type:"file",accept:"image/png, image/jpeg,\n image/gif",multiple:""},on:{change:function(t){return e.updateWrapper()}}}),n("div",{directives:[{name:"show",rawName:"v-show",value:!e.imageList.length,expression:"!imageList.length"}],staticClass:"\n h-full\n font-semibold\n opacity-25\n flex\n justify-center\n items-center\n "},[e._v(" Drag and drop images here or click here to browse. ")]),n("div",{directives:[{name:"show",rawName:"v-show",value:e.imageList.length,expression:"imageList.length"}],staticClass:"h-full flex flex-row flex-wrap content-start overflow-y-auto"},e._l(e.previews,(function(t,a){return n("img",{key:a,staticClass:"max-h-28 relative z-10",attrs:{src:t.url,alt:""},on:{click:function(n){return e.removeImage(t.image)}}})})),0)])]),n("div",{staticClass:"flex flex-col items-center m-4"},[e.invalidType?n("WarningBox",{on:{click:function(t){e.invalidType=!1}}},[e._v(" Please upload PNG, JPEG or GIF image only. ")]):e._e(),n("button",{directives:[{name:"show",rawName:"v-show",value:e.imageList.length,expression:"imageList.length"}],staticClass:"\n border border-gray-500\n p-2\n rounded\n mx-auto\n font-semibold\n text-gray-800\n hover:bg-gray-800 hover:text-gray-100\n ",on:{click:e.submitImage}},[e._v(" Submit ")])],1)])},E=[],R=n("2909"),B=(n("159b"),n("3ca3"),n("ddb0"),n("2b3d"),n("99af"),n("caad"),function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"\n p-5\n m-2\n font-semibold\n bg-red-400\n ring-2 ring-red-500\n rounded\n text-gray-50\n relative\n max-w-xs\n whitespace-normal\n "},[e._t("default"),n("XCircle",{staticClass:"\n absolute\n top-0.5\n right-0.5\n stroke-current\n text-red-600\n opacity-40\n hover:opacity-75\n ",nativeOn:{click:function(t){return e.$emit("click")}}})],2)}),N=[],D=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("svg",{attrs:{xmlns:"http://www.w3.org/2000/svg",width:e.width,height:e.height,viewBox:"0 0 24 24",fill:"none",stroke:"#000000","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}},[n("circle",{attrs:{cx:"12",cy:"12",r:"10"}}),n("line",{attrs:{x1:"15",y1:"9",x2:"9",y2:"15"}}),n("line",{attrs:{x1:"9",y1:"9",x2:"15",y2:"15"}})])},H=[],M={props:{width:{default:24},height:{default:24}}},W=M,F=Object(s["a"])(W,D,H,!1,null,null,null),X=F.exports,K={components:{XCircle:X}},G=K,z=Object(s["a"])(G,B,N,!1,null,null,null),J=z.exports,q={components:{WarningBox:J},data:function(){return{imageList:[],invalidType:!1}},computed:Object(m["a"])({previews:function(){var e=[];return this.imageList.forEach((function(t){return e.push({url:URL.createObjectURL(t),image:t})})),e}},Object(I["c"])(["stateUser"])),methods:Object(m["a"])({updateWrapper:function(e){this.checkImageType(e)?this.updateImageList(e):this.$refs.imageInput.value=""},updateImageList:function(e){this.imageList=this.imageList.concat(e?Object(R["a"])(e.dataTransfer.files):Object(R["a"])(this.$refs.imageInput.files))},checkImageType:function(e){for(var t=["image/png","image/jpeg","image/gif"],n=e?Object(R["a"])(e.dataTransfer.files):Object(R["a"])(this.$refs.imageInput.files),a=0;a<n.length;a++)if(!t.includes(n[a].type))return this.invalidType=!0,!1;return this.invalidType=!1,!0},removeImage:function(e){this.imageList.splice(this.imageList.indexOf(e),1)},submitImage:function(){for(var e=new FormData,t=0;t<this.imageList.length;t++)e.set("image",this.imageList[t]),this.postImage(e);this.invalidType=!1,this.imageList=[]},postImage:function(e){var t=this;return Object(h["a"])(regeneratorRuntime.mark((function n(){var a,r,i;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:return n.prev=0,a={method:"POST",headers:{secret:t.stateUser.secret},body:e},n.next=4,fetch("/api/image",a);case 4:return r=n.sent,n.next=7,r.json();case 7:i=n.sent,t.addStateImageSnowflake(i.snowflake),n.next=14;break;case 11:n.prev=11,n.t0=n["catch"](0);case 14:case"end":return n.stop()}}),n,null,[[0,11]])})))()}},Object(I["b"])(["addStateImageSnowflake"]))},V=q,Q=Object(s["a"])(V,A,E,!1,null,null,null),Y=Q.exports,Z=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[e._v("Add tag/Change tag type")]),n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.tag,expression:"tag"}],attrs:{placeholder:"Tag to add"},domProps:{value:e.tag},on:{input:function(t){t.target.composing||(e.tag=t.target.value)}}}),n("select",{directives:[{name:"model",rawName:"v-model",value:e.tagType,expression:"tagType"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.tagType=t.target.multiple?n:n[0]}}},[n("option",{attrs:{disabled:""}},[e._v("Tag type")]),n("option",{attrs:{value:"artist"}},[e._v("Artist")]),n("option",{attrs:{value:"character"}},[e._v("Character")]),n("option",{attrs:{value:"copyright"}},[e._v("Copyright")]),n("option",{attrs:{value:"generic"}},[e._v("Generic")]),n("option",{attrs:{value:"group"}},[e._v("Group")]),n("option",{attrs:{value:"meta"}},[e._v("Meta")])])]),n("div",[n("button",{attrs:{disabled:e.tagIncorrect},on:{click:function(t){e.setTag(),e.setType(),e.resetTagAndType()}}},[e._v(" Submit ")])]),e.tagIncorrect?n("div",[e._v(" Tag incorrect. Make sure your tag doesn't exceed 128 characters and matches "),n("b",[e._v("/^[a-z0-9()_-]*$/g")])]):e._e(),n("div",[e._v("Type: "+e._s(e.tagType)+", Tag: "+e._s(e.tag))])])},ee=[],te={data:function(){return{tag:"",tagType:"generic"}},computed:Object(m["a"])({tagIncorrect:function(){var e=/^[a-z0-9()_-]*$/g;return!this.tag.match(e)||this.tag.length>128}},Object(I["c"])(["stateUser"])),methods:{setTag:function(){fetch("/api/tag/".concat(this.tag),{method:"PUT",headers:{secret:this.stateUser.secret}}).then((function(e){console.log(e)})).catch((function(e){return console.error(e)}))},setType:function(){var e={method:"PATCH",headers:{"Content-Type":"application/json",secret:this.stateUser.secret},body:JSON.stringify({type:this.tagType})};fetch("/api/tag/".concat(this.tag,"/info"),e).then((function(e){return console.log(e)})).catch((function(e){return console.error(e)}))},resetTagAndType:function(){this.tag="",this.tagType="generic"}}},ne=te,ae=Object(s["a"])(ne,Z,ee,!1,null,null,null),re=ae.exports,ie=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.stateUser.id?n("div",{staticClass:"text-lg ml-1 mb-1"},[e._v(" Welcome, "+e._s(e.stateUser.username)+" ")]):n("div",[e.authenticating?e._e():n("button",{staticClass:"\n hover:text-gray-600\n focus:outline-none\n text-gray-800\n font-semibold\n p-2\n ",on:{click:function(t){e.authenticating=!0}}},[e._v(" Authenticate ")]),e.authenticating?n("div",[e.authenticationFailed?n("WarningBox",{on:{click:function(t){e.authenticationFailed=!1}}},[e._v(" Authentication failed. Please check your secret token. ")]):e._e(),n("input",{directives:[{name:"model",rawName:"v-model",value:e.secret,expression:"secret"}],staticClass:"\n border border-transparent\n rounded\n m-4\n p-1\n shadow-inner\n bg-gray-200\n focus:ring-2 focus:ring-gray-400\n ",attrs:{type:"text",placeholder:"Secret token"},domProps:{value:e.secret},on:{keyup:function(t){if(!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter"))return null;e.authenticate(e.secret.trim())},input:function(t){t.target.composing||(e.secret=t.target.value)}}}),n("span",[n("button",{on:{click:function(t){e.authenticate(e.secret.trim())}}},[n("Checkmark",{staticClass:"login-button",attrs:{width:"30",height:"30"}})],1),n("button",{on:{click:function(t){e.authenticating=!1,e.authenticationFailed=!1,e.secret=""}}},[n("XCircle",{staticClass:"login-button",attrs:{width:"30",height:"30"}})],1)])],1):e._e()])])},se=[],ce=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("svg",{attrs:{xmlns:"http://www.w3.org/2000/svg",width:e.width,height:e.height,viewBox:"0 0 24 24",fill:"none",stroke:"#000000","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}},[n("path",{attrs:{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"}}),n("polyline",{attrs:{points:"22 4 12 14.01 9 11.01"}})])},oe=[],le={props:{width:{default:24},height:{default:24}}},ue=le,ge=Object(s["a"])(ue,ce,oe,!1,null,null,null),de=ge.exports,pe={components:{Checkmark:de,XCircle:X,WarningBox:J},data:function(){return{authenticating:!1,authenticationFailed:!1,secret:""}},computed:Object(m["a"])({},Object(I["c"])(["stateUser"])),methods:Object(m["a"])({authenticate:function(e){var t=this;return Object(h["a"])(regeneratorRuntime.mark((function n(){var a,r;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:return n.prev=0,n.next=3,fetch("/api/user/this",{headers:{secret:e}});case 3:return a=n.sent,n.next=6,a.json();case 6:r=n.sent,a.ok?t.saveStateUser({id:r.id,privileged:r.privileged,username:r.username,secret:e}):t.authenticationFailed=!0,n.next=13;break;case 10:n.prev=10,n.t0=n["catch"](0);case 13:case"end":return n.stop()}}),n,null,[[0,10]])})))()}},Object(I["b"])(["saveStateUser"]))},fe=pe,he=(n("4feb"),Object(s["a"])(fe,ie,se,!1,null,"b6e9e1e8",null)),me=he.exports,ve=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("svg",{attrs:{xmlns:"http://www.w3.org/2000/svg",width:e.width,height:e.height,viewBox:"0 0 24 24",fill:"none",stroke:"#000000","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}},[n("path",{attrs:{d:"M13 17l5-5-5-5M6 17l5-5-5-5"}})])},we=[],be={props:{width:{default:24},height:{default:24}}},ye=be,xe=Object(s["a"])(ye,ve,we,!1,null,null,null),ke=xe.exports,_e={components:{ImageList:$,ImageUpload:Y,TagCreation:re,UserAuthentication:me,IconXCircle:X,IconChevronsRight:ke},data:function(){return{sideBarHidden:!1}}},je=_e,Oe=Object(s["a"])(je,g,d,!1,null,null,null),Ce=Oe.exports,Te=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("image-upload")],1)},Pe=[],Ie={components:{ImageUpload:Y}},Se=Ie,Ue=Object(s["a"])(Se,Te,Pe,!1,null,null,null),Le=Ue.exports,$e=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"flex flex-row"},[n("section",{staticClass:"flex flex-col sticky top-0 h-screen w-1/3"},[n("div",[e._v(" Tags: "),e._l(e.imageTags,(function(t){return n("span",[e._v(" "+e._s(t)+" ")])}))],2)]),n("div",{attrs:{id:"image-container"}},[n("img",{attrs:{src:"/api/image/"+e.flake+"/file",alt:""}})])])},Ae=[],Ee={data:function(){return{imageTags:Array}},computed:{flake:function(){return window.location.pathname.split("/").pop()}},methods:{getImageTags:function(){var e=this;return Object(h["a"])(regeneratorRuntime.mark((function t(){var n,a;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,fetch("/api/image/".concat(e.flake,"/tag"));case 2:return n=t.sent,t.next=5,n.json();case 5:return a=t.sent,t.abrupt("return",a);case 7:case"end":return t.stop()}}),t)})))()}},created:function(){var e=this;return Object(h["a"])(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,e.getImageTags();case 2:e.imageTags=t.sent;case 3:case"end":return t.stop()}}),t)})))()}},Re=Ee,Be=(n("a69b"),Object(s["a"])(Re,$e,Ae,!1,null,"b47bc4fe",null)),Ne=Be.exports;a["a"].use(u["a"]);var De=[{path:"/",name:"Home",component:Ce},{path:"/upload",name:"UploadNew",component:Le},{path:"/:page",name:"Page",component:Ce},{path:"/image/:hash",name:"ImageView",component:Ne}],He=new u["a"]({mode:"history",base:"/web/",routes:De}),Me=He,We=n("0e44");a["a"].use(I["a"]);var Fe=Object(We["a"])({key:"imageboard",paths:["stateUser"]}),Xe=new I["a"].Store({state:{stateImageSnowflakes:[],stateUser:{id:null,privileged:null,username:null,secret:null}},mutations:{setStateImageSnowflakes:function(e,t){e.stateImageSnowflakes=t},addStateImageSnowflake:function(e,t){e.stateImageSnowflakes.push(t)},saveStateUser:function(e,t){e.stateUser.id=t.id,e.stateUser.privileged=t.privileged,e.stateUser.username=t.username,e.stateUser.secret=t.secret}},actions:{setStateImageSnowflakes:function(e,t){e.commit("setStateImageSnowflakes",t)},addStateImageSnowflake:function(e,t){e.commit("addStateImageSnowflake",t)},saveStateUser:function(e,t){e.commit("saveStateUser",t)}},modules:{},plugins:[Fe]});n("def6");a["a"].config.productionTip=!1,new a["a"]({router:Me,store:Xe,render:function(e){return e(l)}}).$mount("#app")},a595:function(e,t,n){},a69b:function(e,t,n){"use strict";n("ff7e")},b5d5:function(e,t,n){"use strict";n("31f9")},def6:function(e,t,n){},ff7e:function(e,t,n){}}); +//# sourceMappingURL=app.e837c338.js.map \ No newline at end of file diff --git a/js/app.e837c338.js.map b/js/app.e837c338.js.map new file mode 100644 index 0000000000000000000000000000000000000000..d90d6c7878e49b9ae85575e1bf641ac8ddb95159 --- /dev/null +++ b/js/app.e837c338.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/UserAuthentication.vue?894f","webpack:///./src/App.vue?8b40","webpack:///./src/App.vue","webpack:///./src/views/Home.vue?c752","webpack:///./src/components/ImageList.vue?75be","webpack:///./src/components/ImageItem.vue?562a","webpack:///src/components/ImageItem.vue","webpack:///./src/components/ImageItem.vue?457b","webpack:///./src/components/ImageItem.vue","webpack:///./src/components/PaginationBar.vue?97d8","webpack:///src/components/PaginationBar.vue","webpack:///./src/components/PaginationBar.vue?4402","webpack:///./src/components/PaginationBar.vue","webpack:///src/components/ImageList.vue","webpack:///./src/components/ImageList.vue?7e18","webpack:///./src/components/ImageList.vue","webpack:///./src/components/ImageUpload.vue?fe05","webpack:///./src/components/WarningBox.vue?8182","webpack:///./src/components/icons/IconXCircle.vue?f45d","webpack:///src/components/icons/IconXCircle.vue","webpack:///./src/components/icons/IconXCircle.vue?9e44","webpack:///./src/components/icons/IconXCircle.vue","webpack:///src/components/WarningBox.vue","webpack:///./src/components/WarningBox.vue?d19e","webpack:///./src/components/WarningBox.vue","webpack:///src/components/ImageUpload.vue","webpack:///./src/components/ImageUpload.vue?1bcd","webpack:///./src/components/ImageUpload.vue","webpack:///./src/components/TagCreation.vue?17b7","webpack:///src/components/TagCreation.vue","webpack:///./src/components/TagCreation.vue?bc0d","webpack:///./src/components/TagCreation.vue","webpack:///./src/components/UserAuthentication.vue?a8c0","webpack:///./src/components/icons/IconCheckmark.vue?6723","webpack:///src/components/icons/IconCheckmark.vue","webpack:///./src/components/icons/IconCheckmark.vue?cd82","webpack:///./src/components/icons/IconCheckmark.vue","webpack:///src/components/UserAuthentication.vue","webpack:///./src/components/UserAuthentication.vue?4e14","webpack:///./src/components/UserAuthentication.vue","webpack:///./src/components/icons/IconChevronsRight.vue?2f15","webpack:///src/components/icons/IconChevronsRight.vue","webpack:///./src/components/icons/IconChevronsRight.vue?43da","webpack:///./src/components/icons/IconChevronsRight.vue","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?2b8c","webpack:///./src/views/Home.vue","webpack:///./src/views/UploadNew.vue?6e57","webpack:///src/views/UploadNew.vue","webpack:///./src/views/UploadNew.vue?96a2","webpack:///./src/views/UploadNew.vue","webpack:///./src/views/ImageView.vue?ec52","webpack:///src/views/ImageView.vue","webpack:///./src/views/ImageView.vue?2152","webpack:///./src/views/ImageView.vue","webpack:///./src/router/index.js","webpack:///./src/store/index.js","webpack:///./src/main.js","webpack:///./src/views/ImageView.vue?be50","webpack:///./src/components/ImageItem.vue?e6b8"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_vm","this","_h","$createElement","_c","_self","attrs","staticClass","_v","staticRenderFns","script","component","directives","rawName","sideBarHidden","expression","on","$event","currentPage","lastPage","pageChange","_l","flake","index","appendToDeleteArray","deleteArray","deleteImages","ctrlKey","shiftKey","altKey","metaKey","checked","$emit","nativeOn","preventDefault","props","required","methods","page","class","_s","type","Number","computed","pages","components","ImageItem","PaginationBar","method","headers","fetch","updateWrapper","currentTarget","classList","remove","add","ref","imageList","preview","url","removeImage","image","invalidType","_e","submitImage","_t","width","height","default","XCircle","WarningBox","previews","forEach","tempArray","checkImageType","event","updateImageList","concat","acceptedTypes","includes","indexOf","formData","set","postImage","domProps","target","composing","tag","$$selectedVal","Array","filter","options","selected","map","val","_value","tagType","multiple","tagIncorrect","setTag","setType","resetTagAndType","match","regex","secret","stateUser","body","JSON","stringify","id","username","authenticating","authenticationFailed","_k","keyCode","authenticate","trim","Checkmark","ImageList","ImageUpload","TagCreation","UserAuthentication","IconXCircle","IconChevronsRight","imageTag","imageTags","location","pathname","split","pop","Vue","use","VueRouter","routes","path","Home","UploadNew","ImageView","router","base","process","Vuex","vuexLocal","VuexPersistedState","paths","Store","state","stateImageSnowflakes","privileged","mutations","setStateImageSnowflakes","array","addStateImageSnowflake","hash","saveStateUser","payload","actions","context","commit","plugins","config","productionTip","store","render","h","App","$mount"],"mappings":"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","file":"js/app.e837c338.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/web/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserAuthentication.vue?vue&type=style&index=0&id=b6e9e1e8&lang=postcss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('header',[_c('nav',[_c('router-link',{staticClass:\"p-4\",attrs:{\"to\":\"/\"}},[_vm._v(\"Home\")]),_c('router-link',{attrs:{\"to\":\"/upload\"}},[_vm._v(\"Upload\")])],1)]),_c('router-view')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=2fe87f47&\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"flex flex-row\"},[_c('section',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.sideBarHidden),expression:\"!sideBarHidden\"}],staticClass:\"flex flex-col sticky top-0 h-screen w-1/3\"},[_c('button',{staticClass:\"self-end mt-2\",on:{\"click\":function($event){_vm.sideBarHidden = true}}},[_c('IconXCircle',{staticClass:\"stroke-current text-gray-500 hover:text-gray-600\"})],1),_c('TagCreation'),_c('UserAuthentication',{staticClass:\"absolute bottom-0\"})],1),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.sideBarHidden),expression:\"sideBarHidden\"}],staticClass:\"self-start sticky top-0\",on:{\"click\":function($event){_vm.sideBarHidden = false}}},[_c('IconChevronsRight',{staticClass:\"mt-1 stroke-current text-gray-500 hover:text-gray-600\",attrs:{\"width\":\"27\",\"height\":\"27\"}})],1),_c('ImageList')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"w-full\"},[_c('PaginationBar',{attrs:{\"current-page\":_vm.currentPage,\"last-page\":_vm.lastPage},on:{\"onPageChange\":_vm.pageChange}}),_c('div',{staticClass:\"w-full flex flex-row flex-wrap justify-center\"},_vm._l((_vm.stateImageSnowflakes),function(flake,index){return _c('div',{key:index,staticClass:\"max-w-xs flex flex-col\"},[_c('ImageItem',{attrs:{\"flake\":flake},on:{\"checked\":_vm.appendToDeleteArray}})],1)}),0),_c('PaginationBar',{attrs:{\"current-page\":_vm.currentPage,\"last-page\":_vm.lastPage},on:{\"onPageChange\":_vm.pageChange}}),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.deleteArray.length),expression:\"deleteArray.length\"}],staticClass:\"fixed bottom-0 right-0 p-1 bg-blue-300\",on:{\"click\":function($event){return _vm.deleteImages(_vm.deleteArray)}}},[_vm._v(\" Delete \")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"image-container\"},on:{\"click\":function($event){if(!$event.ctrlKey){ return null; }if(!$event.shiftKey){ return null; }if($event.altKey||$event.metaKey){ return null; }_vm.checked = !_vm.checked;\n _vm.$emit('checked', _vm.checked, _vm.flake);}}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.checked),expression:\"checked\"}],attrs:{\"id\":\"checkmark\"},on:{\"click\":function($event){_vm.checked = !_vm.checked;\n _vm.$emit('checked', _vm.checked, _vm.flake);}}},[_vm._v(\" X \")]),_c('router-link',{attrs:{\"to\":(\"/image/\" + _vm.flake)},nativeOn:{\"click\":function($event){if(!$event.ctrlKey){ return null; }if(!$event.shiftKey){ return null; }$event.preventDefault();}}},[_c('img',{attrs:{\"src\":(\"/api/image/\" + _vm.flake + \"/preview\")}})])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n @click.ctrl.shift.exact=\"\n checked = !checked;\n $emit('checked', checked, flake);\n \"\n id=\"image-container\"\n >\n <div\n @click=\"\n checked = !checked;\n $emit('checked', checked, flake);\n \"\n v-show=\"checked\"\n id=\"checkmark\"\n >\n X\n </div>\n <router-link @click.ctrl.shift.native.prevent :to=\"`/image/${flake}`\">\n <img :src=\"`/api/image/${flake}/preview`\" />\n </router-link>\n </div>\n</template>\n\n<script>\nexport default {\n data: () => {\n return {\n checked: false,\n };\n },\n props: {\n flake: {\n required: true,\n },\n },\n methods: {},\n};\n</script>\n\n<style scoped>\n#image-container {\n position: relative;\n}\nimg {\n height: 100%;\n width: 100%;\n}\n#checkmark {\n font-family: \"Lucida Console\", monospace;\n font-weight: bold;\n color: white;\n background: rgb(209, 39, 39);\n position: absolute;\n top: 0.4em;\n left: 0.4em;\n padding: 0.4em 0.6em;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ImageItem.vue?vue&type=template&id=58445a1f&scoped=true&\"\nimport script from \"./ImageItem.vue?vue&type=script&lang=js&\"\nexport * from \"./ImageItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ImageItem.vue?vue&type=style&index=0&id=58445a1f&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"58445a1f\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"mx-auto max-w-max\"},_vm._l((_vm.pages),function(page,index){return _c('router-link',{key:index,staticClass:\"mr-2 last:mr-0 text-lg\",class:{\n 'text-red-800': page === _vm.currentPage,\n 'font-bold': page === _vm.currentPage,\n },attrs:{\"to\":(\"/\" + page)},nativeOn:{\"click\":function($event){return _vm.$emit('onPageChange')}}},[_vm._v(\" \"+_vm._s(page)+\" \")])}),1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"mx-auto max-w-max\">\n <router-link\n v-for=\"(page, index) in pages\"\n :key=\"index\"\n :to=\"`/${page}`\"\n @click.native=\"$emit('onPageChange')\"\n :class=\"{\n 'text-red-800': page === currentPage,\n 'font-bold': page === currentPage,\n }\"\n class=\"mr-2 last:mr-0 text-lg\"\n >\n {{ page }}\n </router-link>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n currentPage: {\n type: Number,\n required: true,\n },\n lastPage: {\n type: Number,\n required: true,\n },\n },\n computed: {\n // TODO: Rewrite this less confusingly if possible.\n // This returns an array that represents the pagination bar\n pages: function () {\n return [\n this.currentPage > 1 ? 0 : null,\n this.currentPage > 2 ? \"...\" : null,\n this.currentPage > 0 ? this.currentPage - 1 : null,\n this.currentPage,\n this.currentPage < this.lastPage - 1 ? this.currentPage + 1 : null,\n this.currentPage < this.lastPage - 3 ? \"...\" : null,\n this.currentPage < this.lastPage - 2 ? this.lastPage - 1 : null,\n ].filter((element) => element !== null);\n },\n },\n};\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PaginationBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PaginationBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PaginationBar.vue?vue&type=template&id=62f30345&\"\nimport script from \"./PaginationBar.vue?vue&type=script&lang=js&\"\nexport * from \"./PaginationBar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <section class=\"w-full\">\n <PaginationBar\n :current-page=\"currentPage\"\n :last-page=\"lastPage\"\n @onPageChange=\"pageChange\"\n />\n <div class=\"w-full flex flex-row flex-wrap justify-center\">\n <div\n v-for=\"(flake, index) in stateImageSnowflakes\"\n :key=\"index\"\n class=\"max-w-xs flex flex-col\"\n >\n <ImageItem :flake=\"flake\" @checked=\"appendToDeleteArray\"></ImageItem>\n </div>\n </div>\n <PaginationBar\n :current-page=\"currentPage\"\n :last-page=\"lastPage\"\n @onPageChange=\"pageChange\"\n />\n <button\n v-show=\"deleteArray.length\"\n @click=\"deleteImages(deleteArray)\"\n class=\"fixed bottom-0 right-0 p-1 bg-blue-300\"\n >\n Delete\n </button>\n </section>\n</template>\n\n<script>\nimport ImageItem from \"@/components/ImageItem.vue\";\nimport PaginationBar from \"@/components/PaginationBar.vue\";\nimport { mapState, mapActions } from \"vuex\";\n\nexport default {\n components: {\n ImageItem,\n PaginationBar,\n },\n data: () => {\n return {\n deleteArray: [],\n currentPage: 0,\n lastPage: 0,\n };\n },\n computed: {\n ...mapState([\"stateUser\", \"stateImageSnowflakes\"]),\n },\n async created() {\n this.lastPage = Number(await this.getLastPage());\n this.pageChange();\n },\n methods: {\n async pageChange() {\n this.currentPage = Number(\n window.location.pathname.split(\"/\").pop().match(/^\\d+$/)\n );\n window.scrollTo(0, 0);\n this.setStateImageSnowflakes(await this.getSnowflakes(this.currentPage));\n },\n async getSnowflakes(pageEntry) {\n const response = await fetch(`/api/image/page/${pageEntry}/`);\n const snowflakes = await response.json();\n return snowflakes;\n },\n async getLastPage() {\n const response = await fetch(\"/api/image/page\");\n const lastPage = await response.text();\n return lastPage;\n },\n appendToDeleteArray(...args) {\n const [checked, hash] = args;\n checked\n ? this.deleteArray.push(hash)\n : this.deleteArray.splice(this.deleteArray.indexOf(hash), 1);\n },\n deleteImages(deleteArray) {\n const options = {\n method: \"DELETE\",\n headers: { secret: this.stateUser.secret },\n };\n for (let i = 0; i < deleteArray.length; i++) {\n fetch(`/api/image/${deleteArray[i]}`, options);\n }\n this.deleteArray = [];\n },\n ...mapActions([\"setStateImageSnowflakes\"]),\n },\n};\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageList.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageList.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ImageList.vue?vue&type=template&id=250650ed&\"\nimport script from \"./ImageList.vue?vue&type=script&lang=js&\"\nexport * from \"./ImageList.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"h-48 m-4 border-dotted border-4 border-gray-400\",on:{\"drop\":function($event){$event.preventDefault();_vm.updateWrapper($event);\n $event.currentTarget.classList.remove('bg-gray-200');},\"dragover\":function($event){$event.preventDefault();return $event.currentTarget.classList.add('bg-gray-200')},\"dragleave\":function($event){$event.preventDefault();return $event.currentTarget.classList.remove('bg-gray-200')}}},[_c('div',{staticClass:\"relative h-full\"},[_c('input',{ref:\"imageInput\",staticClass:\"h-full w-full opacity-0 absolute z-10 cursor-pointer\",attrs:{\"type\":\"file\",\"accept\":\"image/png, image/jpeg,\\n image/gif\",\"multiple\":\"\"},on:{\"change\":function($event){return _vm.updateWrapper()}}}),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.imageList.length),expression:\"!imageList.length\"}],staticClass:\"\\n h-full\\n font-semibold\\n opacity-25\\n flex\\n justify-center\\n items-center\\n \"},[_vm._v(\" Drag and drop images here or click here to browse. \")]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.imageList.length),expression:\"imageList.length\"}],staticClass:\"h-full flex flex-row flex-wrap content-start overflow-y-auto\"},_vm._l((_vm.previews),function(preview,index){return _c('img',{key:index,staticClass:\"max-h-28 relative z-10\",attrs:{\"src\":preview.url,\"alt\":\"\"},on:{\"click\":function($event){return _vm.removeImage(preview.image)}}})}),0)])]),_c('div',{staticClass:\"flex flex-col items-center m-4\"},[(_vm.invalidType)?_c('WarningBox',{on:{\"click\":function($event){_vm.invalidType = false}}},[_vm._v(\" Please upload PNG, JPEG or GIF image only. \")]):_vm._e(),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.imageList.length),expression:\"imageList.length\"}],staticClass:\"\\n border border-gray-500\\n p-2\\n rounded\\n mx-auto\\n font-semibold\\n text-gray-800\\n hover:bg-gray-800 hover:text-gray-100\\n \",on:{\"click\":_vm.submitImage}},[_vm._v(\" Submit \")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"\\n p-5\\n m-2\\n font-semibold\\n bg-red-400\\n ring-2 ring-red-500\\n rounded\\n text-gray-50\\n relative\\n max-w-xs\\n whitespace-normal\\n \"},[_vm._t(\"default\"),_c('XCircle',{staticClass:\"\\n absolute\\n top-0.5\\n right-0.5\\n stroke-current\\n text-red-600\\n opacity-40\\n hover:opacity-75\\n \",nativeOn:{\"click\":function($event){return _vm.$emit('click')}}})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{attrs:{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":_vm.width,\"height\":_vm.height,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"#000000\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"}},[_c('circle',{attrs:{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}}),_c('line',{attrs:{\"x1\":\"15\",\"y1\":\"9\",\"x2\":\"9\",\"y2\":\"15\"}}),_c('line',{attrs:{\"x1\":\"9\",\"y1\":\"9\",\"x2\":\"15\",\"y2\":\"15\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n :width=\"width\"\n :height=\"height\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#000000\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\n </svg>\n</template>\n\n<script>\nexport default {\n props: {\n width: {\n default: 24,\n },\n height: {\n default: 24,\n },\n },\n};\n</script>","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconXCircle.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconXCircle.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./IconXCircle.vue?vue&type=template&id=5479a6fd&\"\nimport script from \"./IconXCircle.vue?vue&type=script&lang=js&\"\nexport * from \"./IconXCircle.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div\n class=\"\n p-5\n m-2\n font-semibold\n bg-red-400\n ring-2 ring-red-500\n rounded\n text-gray-50\n relative\n max-w-xs\n whitespace-normal\n \"\n >\n <slot></slot>\n <XCircle\n @click.native=\"$emit('click')\"\n class=\"\n absolute\n top-0.5\n right-0.5\n stroke-current\n text-red-600\n opacity-40\n hover:opacity-75\n \"\n ></XCircle>\n </div>\n</template>\n\n<script>\nimport XCircle from \"@/components/icons/IconXCircle.vue\";\nexport default {\n components: {\n XCircle,\n },\n};\n</script>","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WarningBox.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WarningBox.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./WarningBox.vue?vue&type=template&id=4b591be2&\"\nimport script from \"./WarningBox.vue?vue&type=script&lang=js&\"\nexport * from \"./WarningBox.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div>\n <div\n class=\"h-48 m-4 border-dotted border-4 border-gray-400\"\n @drop.prevent=\"\n updateWrapper($event);\n $event.currentTarget.classList.remove('bg-gray-200');\n \"\n @dragover.prevent=\"$event.currentTarget.classList.add('bg-gray-200')\"\n @dragleave.prevent=\"$event.currentTarget.classList.remove('bg-gray-200')\"\n >\n <div class=\"relative h-full\">\n <input\n type=\"file\"\n ref=\"imageInput\"\n accept=\"image/png, image/jpeg,\n image/gif\"\n @change=\"updateWrapper()\"\n multiple\n class=\"h-full w-full opacity-0 absolute z-10 cursor-pointer\"\n />\n <div\n v-show=\"!imageList.length\"\n class=\"\n h-full\n font-semibold\n opacity-25\n flex\n justify-center\n items-center\n \"\n >\n Drag and drop images here or click here to browse.\n </div>\n <div\n v-show=\"imageList.length\"\n class=\"h-full flex flex-row flex-wrap content-start overflow-y-auto\"\n >\n <img\n v-for=\"(preview, index) in previews\"\n :key=\"index\"\n :src=\"preview.url\"\n @click=\"removeImage(preview.image)\"\n alt=\"\"\n class=\"max-h-28 relative z-10\"\n />\n </div>\n </div>\n </div>\n <div class=\"flex flex-col items-center m-4\">\n <WarningBox v-if=\"invalidType\" @click=\"invalidType = false\">\n Please upload PNG, JPEG or GIF image only.\n </WarningBox>\n <button\n v-show=\"imageList.length\"\n @click=\"submitImage\"\n class=\"\n border border-gray-500\n p-2\n rounded\n mx-auto\n font-semibold\n text-gray-800\n hover:bg-gray-800 hover:text-gray-100\n \"\n >\n Submit\n </button>\n </div>\n </div>\n</template>\n\n<script>\nimport { mapActions, mapState } from \"vuex\";\nimport WarningBox from \"@/components/WarningBox.vue\";\n\nexport default {\n components: {\n WarningBox,\n },\n data: () => {\n return {\n imageList: [],\n invalidType: false,\n };\n },\n computed: {\n previews: function () {\n let tempArray = [];\n this.imageList.forEach((image) =>\n tempArray.push({ url: URL.createObjectURL(image), image })\n );\n return tempArray;\n },\n ...mapState([\"stateUser\"]),\n },\n methods: {\n updateWrapper(event) {\n this.checkImageType(event)\n ? this.updateImageList(event)\n : (this.$refs.imageInput.value = \"\");\n },\n updateImageList(event) {\n this.imageList = this.imageList.concat(\n event ? [...event.dataTransfer.files] : [...this.$refs.imageInput.files]\n );\n },\n checkImageType(event) {\n const acceptedTypes = [\"image/png\", \"image/jpeg\", \"image/gif\"];\n let imageList = event\n ? [...event.dataTransfer.files]\n : [...this.$refs.imageInput.files];\n for (let i = 0; i < imageList.length; i++) {\n if (!acceptedTypes.includes(imageList[i].type)) {\n this.invalidType = true;\n return false;\n }\n }\n this.invalidType = false;\n return true;\n },\n removeImage(image) {\n this.imageList.splice(this.imageList.indexOf(image), 1);\n },\n submitImage() {\n let formData = new FormData();\n for (let i = 0; i < this.imageList.length; i++) {\n formData.set(\"image\", this.imageList[i]);\n this.postImage(formData);\n }\n // Clean up\n this.invalidType = false;\n this.imageList = [];\n },\n async postImage(fd) {\n try {\n const options = {\n method: \"POST\",\n headers: {\n secret: this.stateUser.secret,\n },\n body: fd,\n };\n const response = await fetch(\"/api/image\", options);\n const data = await response.json();\n this.addStateImageSnowflake(data.snowflake);\n } catch {\n (error) => console.error(error);\n }\n },\n ...mapActions([\"addStateImageSnowflake\"]),\n },\n};\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageUpload.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageUpload.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ImageUpload.vue?vue&type=template&id=b99b0820&\"\nimport script from \"./ImageUpload.vue?vue&type=script&lang=js&\"\nexport * from \"./ImageUpload.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',[_vm._v(\"Add tag/Change tag type\")]),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.tag),expression:\"tag\"}],attrs:{\"placeholder\":\"Tag to add\"},domProps:{\"value\":(_vm.tag)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.tag=$event.target.value}}}),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.tagType),expression:\"tagType\"}],on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.tagType=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{attrs:{\"disabled\":\"\"}},[_vm._v(\"Tag type\")]),_c('option',{attrs:{\"value\":\"artist\"}},[_vm._v(\"Artist\")]),_c('option',{attrs:{\"value\":\"character\"}},[_vm._v(\"Character\")]),_c('option',{attrs:{\"value\":\"copyright\"}},[_vm._v(\"Copyright\")]),_c('option',{attrs:{\"value\":\"generic\"}},[_vm._v(\"Generic\")]),_c('option',{attrs:{\"value\":\"group\"}},[_vm._v(\"Group\")]),_c('option',{attrs:{\"value\":\"meta\"}},[_vm._v(\"Meta\")])])]),_c('div',[_c('button',{attrs:{\"disabled\":_vm.tagIncorrect},on:{\"click\":function($event){_vm.setTag();\n _vm.setType();\n _vm.resetTagAndType();}}},[_vm._v(\" Submit \")])]),(_vm.tagIncorrect)?_c('div',[_vm._v(\" Tag incorrect. Make sure your tag doesn't exceed 128 characters and matches \"),_c('b',[_vm._v(\"/^[a-z0-9()_-]*$/g\")])]):_vm._e(),_c('div',[_vm._v(\"Type: \"+_vm._s(_vm.tagType)+\", Tag: \"+_vm._s(_vm.tag))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <div>Add tag/Change tag type</div>\n <div>\n <input v-model=\"tag\" placeholder=\"Tag to add\" />\n <select v-model=\"tagType\">\n <option disabled>Tag type</option>\n <option value=\"artist\">Artist</option>\n <option value=\"character\">Character</option>\n <option value=\"copyright\">Copyright</option>\n <option value=\"generic\">Generic</option>\n <option value=\"group\">Group</option>\n <option value=\"meta\">Meta</option>\n </select>\n </div>\n <div>\n <button\n @click=\"\n setTag();\n setType();\n resetTagAndType();\n \"\n :disabled=\"tagIncorrect\"\n >\n Submit\n </button>\n </div>\n <div v-if=\"tagIncorrect\">\n Tag incorrect. Make sure your tag doesn't exceed 128 characters and\n matches <b>/^[a-z0-9()_-]*$/g</b>\n </div>\n <div>Type: {{ tagType }}, Tag: {{ tag }}</div>\n </div>\n</template>\n\n<script>\nimport { mapState } from \"vuex\";\nexport default {\n data: () => {\n return {\n tag: \"\",\n tagType: \"generic\",\n };\n },\n computed: {\n tagIncorrect: function () {\n const regex = /^[a-z0-9()_-]*$/g;\n if (!this.tag.match(regex) || this.tag.length > 128) {\n return true;\n }\n return false;\n },\n ...mapState([\"stateUser\"]),\n },\n methods: {\n setTag() {\n fetch(`/api/tag/${this.tag}`, {\n method: \"PUT\",\n headers: {\n secret: this.stateUser.secret,\n },\n })\n .then((response) => {\n console.log(response);\n })\n .catch((error) => console.error(error));\n },\n setType() {\n let options = {\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\",\n secret: this.stateUser.secret,\n },\n body: JSON.stringify({ type: this.tagType }),\n };\n fetch(`/api/tag/${this.tag}/info`, options)\n .then((response) => console.log(response))\n .catch((error) => console.error(error));\n },\n resetTagAndType() {\n this.tag = \"\";\n this.tagType = \"generic\";\n },\n },\n};\n</script>","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagCreation.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagCreation.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TagCreation.vue?vue&type=template&id=6c8cff3c&\"\nimport script from \"./TagCreation.vue?vue&type=script&lang=js&\"\nexport * from \"./TagCreation.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(!_vm.stateUser.id)?_c('div',[(!_vm.authenticating)?_c('button',{staticClass:\"\\n hover:text-gray-600\\n focus:outline-none\\n text-gray-800\\n font-semibold\\n p-2\\n \",on:{\"click\":function($event){_vm.authenticating = true}}},[_vm._v(\" Authenticate \")]):_vm._e(),(_vm.authenticating)?_c('div',[(_vm.authenticationFailed)?_c('WarningBox',{on:{\"click\":function($event){_vm.authenticationFailed = false}}},[_vm._v(\" Authentication failed. Please check your secret token. \")]):_vm._e(),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.secret),expression:\"secret\"}],staticClass:\"\\n border border-transparent\\n rounded\\n m-4\\n p-1\\n shadow-inner\\n bg-gray-200\\n focus:ring-2 focus:ring-gray-400\\n \",attrs:{\"type\":\"text\",\"placeholder\":\"Secret token\"},domProps:{\"value\":(_vm.secret)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }_vm.authenticate(_vm.secret.trim())},\"input\":function($event){if($event.target.composing){ return; }_vm.secret=$event.target.value}}}),_c('span',[_c('button',{on:{\"click\":function($event){_vm.authenticate(_vm.secret.trim())}}},[_c('Checkmark',{staticClass:\"login-button\",attrs:{\"width\":\"30\",\"height\":\"30\"}})],1),_c('button',{on:{\"click\":function($event){_vm.authenticating = false;\n _vm.authenticationFailed = false;\n _vm.secret = '';}}},[_c('XCircle',{staticClass:\"login-button\",attrs:{\"width\":\"30\",\"height\":\"30\"}})],1)])],1):_vm._e()]):_c('div',{staticClass:\"text-lg ml-1 mb-1\"},[_vm._v(\" Welcome, \"+_vm._s(_vm.stateUser.username)+\" \")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{attrs:{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":_vm.width,\"height\":_vm.height,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"#000000\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"}},[_c('path',{attrs:{\"d\":\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"}}),_c('polyline',{attrs:{\"points\":\"22 4 12 14.01 9 11.01\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n :width=\"width\"\n :height=\"height\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#000000\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\n <polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\n </svg>\n</template>\n\n<script>\nexport default {\n props: {\n width: {\n default: 24,\n },\n height: {\n default: 24,\n },\n },\n};\n</script>","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconCheckmark.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconCheckmark.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./IconCheckmark.vue?vue&type=template&id=05c13968&\"\nimport script from \"./IconCheckmark.vue?vue&type=script&lang=js&\"\nexport * from \"./IconCheckmark.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div>\n <div v-if=\"!stateUser.id\">\n <button\n v-if=\"!authenticating\"\n @click=\"authenticating = true\"\n class=\"\n hover:text-gray-600\n focus:outline-none\n text-gray-800\n font-semibold\n p-2\n \"\n >\n Authenticate\n </button>\n <div v-if=\"authenticating\">\n <WarningBox\n v-if=\"authenticationFailed\"\n @click=\"authenticationFailed = false\"\n >\n Authentication failed. Please check your secret token.\n </WarningBox>\n <input\n type=\"text\"\n placeholder=\"Secret token\"\n v-model=\"secret\"\n @keyup.enter=\"authenticate(secret.trim())\"\n class=\"\n border border-transparent\n rounded\n m-4\n p-1\n shadow-inner\n bg-gray-200\n focus:ring-2 focus:ring-gray-400\n \"\n />\n <span>\n <button @click=\"authenticate(secret.trim())\">\n <Checkmark width=\"30\" height=\"30\" class=\"login-button\"></Checkmark>\n </button>\n <button\n @click=\"\n authenticating = false;\n authenticationFailed = false;\n secret = '';\n \"\n >\n <XCircle width=\"30\" height=\"30\" class=\"login-button\"></XCircle>\n </button>\n </span>\n </div>\n </div>\n <div v-else class=\"text-lg ml-1 mb-1\">\n Welcome, {{ stateUser.username }}\n </div>\n </div>\n</template>\n\n<script>\nimport { mapActions, mapState } from \"vuex\";\nimport Checkmark from \"@/components/icons/IconCheckmark.vue\";\nimport XCircle from \"@/components/icons/IconXCircle.vue\";\nimport WarningBox from \"@/components/WarningBox.vue\";\n\nexport default {\n components: {\n Checkmark,\n XCircle,\n WarningBox,\n },\n data: function () {\n return {\n authenticating: false,\n authenticationFailed: false,\n secret: \"\",\n };\n },\n computed: {\n ...mapState([\"stateUser\"]),\n },\n methods: {\n async authenticate(secret) {\n try {\n const response = await fetch(`/api/user/this`, {\n headers: { secret: secret },\n });\n const data = await response.json();\n if (response.ok) {\n this.saveStateUser({\n id: data.id,\n privileged: data.privileged,\n username: data.username,\n secret,\n });\n } else {\n this.authenticationFailed = true;\n }\n } catch {\n (error) => console.error(\"Something went terribly wrong... \", error);\n }\n },\n ...mapActions([\"saveStateUser\"]),\n },\n};\n</script>\n\n<style lang=\"postcss\" scoped>\n.login-button {\n @apply stroke-current text-gray-600 hover:text-gray-800 inline-block ml-2;\n}\n</style>","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserAuthentication.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserAuthentication.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UserAuthentication.vue?vue&type=template&id=b6e9e1e8&scoped=true&\"\nimport script from \"./UserAuthentication.vue?vue&type=script&lang=js&\"\nexport * from \"./UserAuthentication.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserAuthentication.vue?vue&type=style&index=0&id=b6e9e1e8&lang=postcss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b6e9e1e8\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{attrs:{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":_vm.width,\"height\":_vm.height,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"#000000\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"}},[_c('path',{attrs:{\"d\":\"M13 17l5-5-5-5M6 17l5-5-5-5\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n :width=\"width\"\n :height=\"height\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#000000\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M13 17l5-5-5-5M6 17l5-5-5-5\" />\n </svg>\n</template>\n\n<script>\nexport default {\n props: {\n width: {\n default: 24,\n },\n height: {\n default: 24,\n },\n },\n};\n</script>","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconChevronsRight.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconChevronsRight.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./IconChevronsRight.vue?vue&type=template&id=603ce9fc&\"\nimport script from \"./IconChevronsRight.vue?vue&type=script&lang=js&\"\nexport * from \"./IconChevronsRight.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"flex flex-row\">\n <section\n v-show=\"!sideBarHidden\"\n class=\"flex flex-col sticky top-0 h-screen w-1/3\"\n >\n <button @click=\"sideBarHidden = true\" class=\"self-end mt-2\">\n <IconXCircle\n class=\"stroke-current text-gray-500 hover:text-gray-600\"\n ></IconXCircle>\n </button>\n <TagCreation></TagCreation>\n <UserAuthentication class=\"absolute bottom-0\"></UserAuthentication>\n </section>\n <button\n v-show=\"sideBarHidden\"\n @click=\"sideBarHidden = false\"\n class=\"self-start sticky top-0\"\n >\n <IconChevronsRight\n class=\"mt-1 stroke-current text-gray-500 hover:text-gray-600\"\n width=\"27\"\n height=\"27\"\n ></IconChevronsRight>\n </button>\n <ImageList></ImageList>\n </div>\n</template>\n\n<script>\nimport ImageList from \"@/components/ImageList.vue\";\nimport ImageUpload from \"@/components/ImageUpload.vue\";\nimport TagCreation from \"@/components/TagCreation.vue\";\nimport UserAuthentication from \"@/components/UserAuthentication.vue\";\nimport IconXCircle from \"@/components/icons/IconXCircle.vue\";\nimport IconChevronsRight from \"@/components/icons/IconChevronsRight.vue\";\n\nexport default {\n components: {\n ImageList,\n ImageUpload,\n TagCreation,\n UserAuthentication,\n IconXCircle,\n IconChevronsRight,\n },\n data: function () {\n return {\n sideBarHidden: false,\n };\n },\n};\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=5e4cc451&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('image-upload')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <image-upload></image-upload>\n </div>\n</template>\n\n<script>\nimport ImageUpload from \"../components/ImageUpload.vue\";\n\nexport default {\n components: {\n ImageUpload,\n },\n};\n</script>","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UploadNew.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UploadNew.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UploadNew.vue?vue&type=template&id=fb433ab6&\"\nimport script from \"./UploadNew.vue?vue&type=script&lang=js&\"\nexport * from \"./UploadNew.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"flex flex-row\"},[_c('section',{staticClass:\"flex flex-col sticky top-0 h-screen w-1/3\"},[_c('div',[_vm._v(\" Tags: \"),_vm._l((_vm.imageTags),function(imageTag){return _c('span',[_vm._v(\" \"+_vm._s(imageTag)+\" \")])})],2)]),_c('div',{attrs:{\"id\":\"image-container\"}},[_c('img',{attrs:{\"src\":(\"/api/image/\" + _vm.flake + \"/file\"),\"alt\":\"\"}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"flex flex-row\">\n <section class=\"flex flex-col sticky top-0 h-screen w-1/3\">\n <div>\n Tags:\n <span v-for=\"imageTag in imageTags\">\n {{ imageTag }}\n </span>\n </div>\n </section>\n <div id=\"image-container\">\n <img :src=\"`/api/image/${flake}/file`\" alt=\"\" />\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n data: function () {\n return {\n imageTags: Array,\n };\n },\n computed: {\n flake: () => {\n return window.location.pathname.split(\"/\").pop();\n },\n },\n methods: {\n async getImageTags() {\n const response = await fetch(`/api/image/${this.flake}/tag`);\n const imageTags = await response.json();\n return imageTags;\n },\n },\n async created() {\n this.imageTags = await this.getImageTags();\n },\n};\n</script>\n\n<style scoped>\nimg {\n height: 100%;\n}\n#image-container {\n height: 100vh;\n display: flex;\n justify-content: center;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageView.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageView.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ImageView.vue?vue&type=template&id=b47bc4fe&scoped=true&\"\nimport script from \"./ImageView.vue?vue&type=script&lang=js&\"\nexport * from \"./ImageView.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ImageView.vue?vue&type=style&index=0&id=b47bc4fe&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b47bc4fe\",\n null\n \n)\n\nexport default component.exports","import Vue from \"vue\";\nimport VueRouter from \"vue-router\";\nimport Home from \"../views/Home.vue\";\nimport UploadNew from \"../views/UploadNew.vue\"\nimport ImageView from \"../views/ImageView.vue\";\n\nVue.use(VueRouter);\n\nconst routes = [\n {\n path: \"/\",\n name: \"Home\",\n component: Home,\n },\n {\n path: \"/upload\",\n name: \"UploadNew\",\n component: UploadNew,\n },\n {\n path: \"/:page\",\n name: \"Page\",\n component: Home,\n },\n {\n path: \"/image/:hash\",\n name: \"ImageView\",\n component: ImageView,\n },\n];\n\nconst router = new VueRouter({\n mode: \"history\",\n base: process.env.BASE_URL,\n routes,\n});\n\nexport default router;\n","import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport VuexPersistedState from \"vuex-persistedstate\";\n\nVue.use(Vuex);\nconst vuexLocal = VuexPersistedState({\n key: \"imageboard\",\n paths: [\"stateUser\"],\n});\n\nexport default new Vuex.Store({\n state: {\n stateImageSnowflakes: [],\n stateUser: {\n id: null,\n privileged: null,\n username: null,\n secret: null,\n },\n },\n mutations: {\n setStateImageSnowflakes(state, array) {\n state.stateImageSnowflakes = array;\n },\n addStateImageSnowflake(state, hash) {\n state.stateImageSnowflakes.push(hash);\n },\n saveStateUser(state, payload) {\n state.stateUser.id = payload.id;\n state.stateUser.privileged = payload.privileged;\n state.stateUser.username = payload.username;\n state.stateUser.secret = payload.secret;\n },\n },\n actions: {\n setStateImageSnowflakes(context, payload) {\n context.commit(\"setStateImageSnowflakes\", payload);\n },\n addStateImageSnowflake(context, payload) {\n context.commit(\"addStateImageSnowflake\", payload);\n },\n saveStateUser(context, payload) {\n context.commit(\"saveStateUser\", payload);\n },\n },\n modules: {},\n plugins: [vuexLocal],\n});\n","import Vue from 'vue'\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\nimport './assets/css/tailwind.css'\n\nVue.config.productionTip = false\n\nnew Vue({\n router,\n store,\n render: h => h(App)\n}).$mount('#app')\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageView.vue?vue&type=style&index=0&id=b47bc4fe&scoped=true&lang=css&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageItem.vue?vue&type=style&index=0&id=58445a1f&scoped=true&lang=css&\""],"sourceRoot":""} \ No newline at end of file