diff --git a/.stylelintrc.json b/.stylelintrc.json index 2f47076..e89085b 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -2,6 +2,7 @@ "extends": "stylelint-config-standard", "rules": { "declaration-block-trailing-semicolon": "never", - "indentation": 2 + "indentation": 2, + "no-descending-specificity": null } } diff --git a/controllers/uploadController.js b/controllers/uploadController.js index 4cfe417..2b75927 100644 --- a/controllers/uploadController.js +++ b/controllers/uploadController.js @@ -534,7 +534,7 @@ self.scanFiles = async (req, infoMap) => { if (!reply.includes('OK') || reply.includes('FOUND')) { // eslint-disable-next-line no-control-regex foundThreat = reply.replace(/^stream: /, '').replace(/ FOUND\u0000$/, '') - logger.log(`[ClamAV]: ${infoMap[i].path.data.filename}: ${foundThreat} FOUND.`) + logger.log(`[ClamAV]: ${infoMap[i].data.filename}: ${foundThreat} FOUND.`) lastIteration = i === infoMap.length - 1 break } diff --git a/dist/css/dashboard.css b/dist/css/dashboard.css index f7e3e92..def1fca 100644 --- a/dist/css/dashboard.css +++ b/dist/css/dashboard.css @@ -1,2 +1,2 @@ -body{-webkit-animation:none;animation:none}#dashboard{-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}.section{background:none}.menu-list a{color:#3794d2}.menu-list a:hover{color:#60a8dc;background-color:#4d4d4d}.menu-list a.is-active{color:#eff0f1;background-color:#3794d2}.menu-list a[disabled]{color:#7a7a7a;cursor:not-allowed}.menu-list a[disabled]:hover{background:none}.menu-list a.is-loading:after{-webkit-animation:spinAround .5s linear infinite;animation:spinAround .5s linear infinite;border-radius:290486px;border-color:transparent transparent #dbdbdb #dbdbdb;border-style:solid;border-width:2px;content:"";display:block;height:1em;width:1em;right:.5em;top:calc(50% - .5em);position:absolute!important}ul#albumsContainer{border-left:0;padding-left:0}ul#albumsContainer li{border-left:1px solid #898b8d;padding-left:.75em}#page.fade-in,ul#albumsContainer li{-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}.pagination{margin-bottom:1.25rem}.pagination a:not([disabled]){color:#eff0f1;border-color:#4d4d4d;background-color:#31363b}a.pagination-link:not(.is-current):hover,a.pagination-next:not([disabled]):hover,a.pagination-previous:not([disabled]):hover{color:#eff0f1;border-color:#60a8dc;background-color:#31363b}a.pagination-link.is-current{background-color:#3794d2;border-color:#3794d2}a.pagination-link.is-current:hover{border-color:#60a8dc}li[data-action=page-ellipsis]{cursor:pointer}.label{color:#bdc3c7}.menu-list li ul{border-left-color:#898b8d}.image-container .checkbox{position:absolute;top:12px;left:12px}.no-touch .image-container .checkbox{opacity:.5}.no-touch .image-container .controls,.no-touch .image-container .details{opacity:0}.no-touch .image-container:hover .checkbox,.no-touch .image-container:hover .controls,.no-touch .image-container:hover .details{opacity:1}#page{min-width:0}.table{color:#bdc3c7;background-color:#31363b;font-size:.75rem}.table.is-striped tbody tr:nth-child(2n),.table tr:hover{background:none}.table.is-striped tbody tr:hover,.table.is-striped tbody tr:nth-child(2n):hover,.tag{background-color:#4d4d4d}.table td,.table th{border:0;white-space:nowrap}.table th{color:#eff0f1;height:2.25em}.table thead td,.table thead th{color:#eff0f1;background-color:#ff3860}.table .cell-indent{padding-left:2.25em}.is-linethrough{text-decoration:line-through}#menu.is-loading .menu-list a{cursor:progress}#statistics tr :first-child{width:50%}.expirydate{color:#bdc3c7} +body{-webkit-animation:none;animation:none}#dashboard{-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}.section{background:none}.menu-list a{color:#209cee;border:1px solid transparent;margin-top:-1px}.menu-list a.is-active{color:#fff;background:#209cee;border-color:#209cee}.menu-list a:not(.is-active):hover{color:#209cee;background:none;border-color:#209cee}.menu-list a[disabled]{color:#7a7a7a;pointer-events:none}.menu-list a.is-loading:after{-webkit-animation:spinAround .5s linear infinite;animation:spinAround .5s linear infinite;border-radius:290486px;border-color:transparent transparent #dbdbdb #dbdbdb;border-style:solid;border-width:2px;content:"";display:block;height:1em;width:1em;right:.5em;top:calc(50% - .5em);position:absolute!important}ul#albumsContainer{border-left:0;padding-left:0}ul#albumsContainer li{border-left:2px solid #585858;padding-left:.75em}#page.fade-in,ul#albumsContainer li{-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}.pagination{margin-bottom:1.25rem}.pagination a:not([disabled]){color:#eff0f1;border-color:#eff0f1;background:none}.pagination a.is-loading:not(.is-current):not([disabled]):after{border-bottom-color:#eff0f1;border-left-color:#eff0f1}.pagination a.pagination-link:hover,.pagination a.pagination-next:not([disabled]):hover,.pagination a.pagination-previous:not([disabled]):hover{color:#000;background-color:#eff0f1;border-color:#eff0f1}.pagination a.pagination-link.is-current{color:#000;background-color:#eff0f1}.pagination a.pagination-link.is-current.is-loading:after{border-bottom-color:#000;border-left-color:#000}li[data-action=page-ellipsis]{cursor:pointer}.label{color:#bdc3c7}.menu-list li ul{border-left-color:#898b8d}.image-container .checkbox{position:absolute;top:11px;left:11px}.image-container .controls{display:flex;position:absolute;top:11px;right:11px}.image-container .controls .button{border-radius:0}.image-container .controls .button:not(:active):not(:hover){color:#fff;background-color:rgba(0,0,0,.56078)}.no-touch .image-container .checkbox{opacity:.5}.no-touch .image-container .controls,.no-touch .image-container .details{opacity:0}.no-touch .image-container:hover .checkbox,.no-touch .image-container:hover .controls,.no-touch .image-container:hover .details{opacity:1}#page{min-width:0}.table{color:#bdc3c7;background-color:#000;font-size:.75rem}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#2f2f2f}.table td,.table th{white-space:nowrap;vertical-align:middle;border-bottom:1px solid #585858}.table th{color:#eff0f1;height:2.25em;font-weight:400}.table thead td,.table thead th{color:#eff0f1;background-color:#585858;border-bottom:0;height:33px}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:1px}.table .cell-indent{padding-left:2.25em}.is-linethrough{text-decoration:line-through}#menu.is-loading .menu-list a{cursor:progress}#statistics tr :first-child{width:50%}.expirydate{color:#bdc3c7} /*# sourceMappingURL=dashboard.css.map */ diff --git a/dist/css/dashboard.css.map b/dist/css/dashboard.css.map index 3b49687..978d812 100644 --- a/dist/css/dashboard.css.map +++ b/dist/css/dashboard.css.map @@ -1 +1 @@ -{"version":3,"sources":["css/dashboard.css"],"names":[],"mappings":"AAAA,KACE,sBAAc,CAAd,cACF,CAEA,WACE,mCAA4B,CAA5B,2BACF,CAEA,SACE,eACF,CAEA,aACE,aACF,CAEA,mBACE,aAAc,CACd,wBACF,CAEA,uBACE,aAAc,CACd,wBACF,CAEA,uBACE,aAAc,CACd,kBACF,CAEA,6BACE,eACF,CAEA,8BACE,gDAA0C,CAA1C,wCAA0C,CAE1C,sBAAuB,CAEvB,oDAA6B,CAA7B,kBAA6B,CAA7B,gBAA6B,CAC7B,UAAW,CACX,aAAc,CACd,UAAW,CACX,SAAU,CACV,UAA2B,CAC3B,oBAA0B,CAC1B,2BACF,CAEA,mBACE,aAAc,CACd,cACF,CAEA,sBACE,6BAA8B,CAC9B,kBAEF,CAEA,oCAHE,mCAA4B,CAA5B,2BAKF,CAEA,YACE,qBACF,CAEA,8BACE,aAAc,CACd,oBAAqB,CACrB,wBACF,CAEA,6HAGE,aAAc,CACd,oBAAqB,CACrB,wBACF,CAEA,6BACE,wBAAyB,CACzB,oBACF,CAEA,mCACE,oBACF,CAEA,8BACE,cACF,CAEA,OACE,aACF,CAEA,iBACE,yBACF,CAEA,2BACE,iBAAkB,CAClB,QAAS,CACT,SACF,CAEA,qCACE,UACF,CAEA,yEAEE,SACF,CAEA,gIAGE,SACF,CAEA,MAEE,WACF,CAEA,OACE,aAAc,CACd,wBAAyB,CACzB,gBACF,CAEA,yDAEE,eACF,CAEA,qFAGE,wBACF,CAEA,oBAEE,QAAS,CACT,kBACF,CAEA,UACE,aAAc,CACd,aACF,CAEA,gCAEE,aAAc,CACd,wBACF,CAEA,oBACE,mBACF,CAEA,gBACE,4BACF,CAEA,8BACE,eACF,CAEA,4BACE,SACF,CAEA,YACE,aACF","file":"dashboard.css","sourcesContent":["body {\n animation: none\n}\n\n#dashboard {\n animation: fadeInOpacity 0.5s\n}\n\n.section {\n background: none\n}\n\n.menu-list a {\n color: #3794d2\n}\n\n.menu-list a:hover {\n color: #60a8dc;\n background-color: #4d4d4d\n}\n\n.menu-list a.is-active {\n color: #eff0f1;\n background-color: #3794d2\n}\n\n.menu-list a[disabled] {\n color: #7a7a7a;\n cursor: not-allowed\n}\n\n.menu-list a[disabled]:hover {\n background: none\n}\n\n.menu-list a.is-loading::after {\n animation: spinAround 0.5s infinite linear;\n border: 2px solid #dbdbdb;\n border-radius: 290486px;\n border-right-color: transparent;\n border-top-color: transparent;\n content: \"\";\n display: block;\n height: 1em;\n width: 1em;\n right: calc(0% + (1em / 2));\n top: calc(50% - (1em / 2));\n position: absolute !important\n}\n\nul#albumsContainer {\n border-left: 0;\n padding-left: 0\n}\n\nul#albumsContainer li {\n border-left: 1px solid #898b8d;\n padding-left: 0.75em;\n animation: fadeInOpacity 0.5s\n}\n\n#page.fade-in {\n animation: fadeInOpacity 0.5s\n}\n\n.pagination {\n margin-bottom: 1.25rem\n}\n\n.pagination a:not([disabled]) {\n color: #eff0f1;\n border-color: #4d4d4d;\n background-color: #31363b\n}\n\na.pagination-link:not(.is-current):hover,\na.pagination-next:not([disabled]):hover,\na.pagination-previous:not([disabled]):hover {\n color: #eff0f1;\n border-color: #60a8dc;\n background-color: #31363b\n}\n\na.pagination-link.is-current {\n background-color: #3794d2;\n border-color: #3794d2\n}\n\na.pagination-link.is-current:hover {\n border-color: #60a8dc\n}\n\nli[data-action=\"page-ellipsis\"] {\n cursor: pointer\n}\n\n.label {\n color: #bdc3c7\n}\n\n.menu-list li ul {\n border-left-color: #898b8d\n}\n\n.image-container .checkbox {\n position: absolute;\n top: 12px;\n left: 12px\n}\n\n.no-touch .image-container .checkbox {\n opacity: 0.5\n}\n\n.no-touch .image-container .controls,\n.no-touch .image-container .details {\n opacity: 0\n}\n\n.no-touch .image-container:hover .checkbox,\n.no-touch .image-container:hover .controls,\n.no-touch .image-container:hover .details {\n opacity: 1\n}\n\n#page {\n /* fix overflow issue with flex */\n min-width: 0\n}\n\n.table {\n color: #bdc3c7;\n background-color: #31363b;\n font-size: 0.75rem\n}\n\n.table tr:hover,\n.table.is-striped tbody tr:nth-child(2n) {\n background: none\n}\n\n.table.is-striped tbody tr:hover,\n.table.is-striped tbody tr:nth-child(2n):hover,\n.tag {\n background-color: #4d4d4d\n}\n\n.table td,\n.table th {\n border: 0;\n white-space: nowrap\n}\n\n.table th {\n color: #eff0f1;\n height: 2.25em\n}\n\n.table thead td,\n.table thead th {\n color: #eff0f1;\n background-color: #ff3860\n}\n\n.table .cell-indent {\n padding-left: 2.25em\n}\n\n.is-linethrough {\n text-decoration: line-through\n}\n\n#menu.is-loading .menu-list a {\n cursor: progress\n}\n\n#statistics tr *:nth-child(1) {\n width: 50%\n}\n\n.expirydate {\n color: #bdc3c7\n}\n"]} \ No newline at end of file +{"version":3,"sources":["css/dashboard.css"],"names":[],"mappings":"AAAA,KACE,sBAAc,CAAd,cACF,CAEA,WACE,mCAA4B,CAA5B,2BACF,CAEA,SACE,eACF,CAEA,aACE,aAAc,CACd,4BAA6B,CAC7B,eACF,CAEA,uBACE,UAAW,CACX,kBAAmB,CACnB,oBACF,CAEA,mCACE,aAAc,CACd,eAAgB,CAChB,oBACF,CAEA,uBACE,aAAc,CACd,mBACF,CAEA,8BACE,gDAA0C,CAA1C,wCAA0C,CAE1C,sBAAuB,CAEvB,oDAA6B,CAA7B,kBAA6B,CAA7B,gBAA6B,CAC7B,UAAW,CACX,aAAc,CACd,UAAW,CACX,SAAU,CACV,UAA2B,CAC3B,oBAA0B,CAC1B,2BACF,CAEA,mBACE,aAAc,CACd,cACF,CAEA,sBACE,6BAA8B,CAC9B,kBAEF,CAEA,oCAHE,mCAA4B,CAA5B,2BAKF,CAEA,YACE,qBACF,CAEA,8BACE,aAAc,CACd,oBAAqB,CACrB,eACF,CAEA,gEACE,2BAA4B,CAC5B,yBACF,CAEA,gJAGE,UAAW,CACX,wBAAyB,CACzB,oBACF,CAEA,yCACE,UAAW,CACX,wBACF,CAEA,0DACE,wBAAyB,CACzB,sBACF,CAEA,8BACE,cACF,CAEA,OACE,aACF,CAEA,iBACE,yBACF,CAEA,2BACE,iBAAkB,CAClB,QAAS,CACT,SACF,CAEA,2BACE,YAAa,CACb,iBAAkB,CAClB,QAAS,CACT,UACF,CAEA,mCACE,eACF,CAEA,4DACE,UAAW,CACX,mCACF,CAEA,qCACE,UACF,CAEA,yEAEE,SACF,CAEA,gIAGE,SACF,CAEA,MAEE,WACF,CAEA,OACE,aAAc,CACd,qBAAsB,CACtB,gBACF,CAEA,qDACE,wBACF,CAEA,oBAEE,kBAAmB,CACnB,qBAAsB,CACtB,+BACF,CAEA,UACE,aAAc,CACd,aAAc,CACd,eACF,CAEA,gCAEE,aAAc,CACd,wBAAyB,CACzB,eAAgB,CAChB,WACF,CAEA,4DAEE,uBACF,CAEA,oBACE,mBACF,CAEA,gBACE,4BACF,CAEA,8BACE,eACF,CAEA,4BACE,SACF,CAEA,YACE,aACF","file":"dashboard.css","sourcesContent":["body {\n animation: none\n}\n\n#dashboard {\n animation: fadeInOpacity 0.5s\n}\n\n.section {\n background: none\n}\n\n.menu-list a {\n color: #209cee;\n border: 1px solid transparent;\n margin-top: -1px\n}\n\n.menu-list a.is-active {\n color: #fff;\n background: #209cee;\n border-color: #209cee\n}\n\n.menu-list a:not(.is-active):hover {\n color: #209cee;\n background: none;\n border-color: #209cee\n}\n\n.menu-list a[disabled] {\n color: #7a7a7a;\n pointer-events: none\n}\n\n.menu-list a.is-loading::after {\n animation: spinAround 0.5s infinite linear;\n border: 2px solid #dbdbdb;\n border-radius: 290486px;\n border-right-color: transparent;\n border-top-color: transparent;\n content: \"\";\n display: block;\n height: 1em;\n width: 1em;\n right: calc(0% + (1em / 2));\n top: calc(50% - (1em / 2));\n position: absolute !important\n}\n\nul#albumsContainer {\n border-left: 0;\n padding-left: 0\n}\n\nul#albumsContainer li {\n border-left: 2px solid #585858;\n padding-left: 0.75em;\n animation: fadeInOpacity 0.5s\n}\n\n#page.fade-in {\n animation: fadeInOpacity 0.5s\n}\n\n.pagination {\n margin-bottom: 1.25rem\n}\n\n.pagination a:not([disabled]) {\n color: #eff0f1;\n border-color: #eff0f1;\n background: none\n}\n\n.pagination a.is-loading:not(.is-current):not([disabled])::after {\n border-bottom-color: #eff0f1;\n border-left-color: #eff0f1\n}\n\n.pagination a.pagination-link:hover,\n.pagination a.pagination-next:not([disabled]):hover,\n.pagination a.pagination-previous:not([disabled]):hover {\n color: #000;\n background-color: #eff0f1;\n border-color: #eff0f1\n}\n\n.pagination a.pagination-link.is-current {\n color: #000;\n background-color: #eff0f1\n}\n\n.pagination a.pagination-link.is-current.is-loading::after {\n border-bottom-color: #000;\n border-left-color: #000\n}\n\nli[data-action=\"page-ellipsis\"] {\n cursor: pointer\n}\n\n.label {\n color: #bdc3c7\n}\n\n.menu-list li ul {\n border-left-color: #898b8d\n}\n\n.image-container .checkbox {\n position: absolute;\n top: 11px;\n left: 11px\n}\n\n.image-container .controls {\n display: flex;\n position: absolute;\n top: 11px;\n right: 11px\n}\n\n.image-container .controls .button {\n border-radius: 0\n}\n\n.image-container .controls .button:not(:active):not(:hover) {\n color: #fff;\n background-color: #0000008f\n}\n\n.no-touch .image-container .checkbox {\n opacity: 0.5\n}\n\n.no-touch .image-container .controls,\n.no-touch .image-container .details {\n opacity: 0\n}\n\n.no-touch .image-container:hover .checkbox,\n.no-touch .image-container:hover .controls,\n.no-touch .image-container:hover .details {\n opacity: 1\n}\n\n#page {\n /* fix overflow issue with flex */\n min-width: 0\n}\n\n.table {\n color: #bdc3c7;\n background-color: #000;\n font-size: 0.75rem\n}\n\n.table.is-hoverable tbody tr:not(.is-selected):hover {\n background-color: #2f2f2f\n}\n\n.table td,\n.table th {\n white-space: nowrap;\n vertical-align: middle;\n border-bottom: 1px solid #585858\n}\n\n.table th {\n color: #eff0f1;\n height: 2.25em;\n font-weight: normal\n}\n\n.table thead td,\n.table thead th {\n color: #eff0f1;\n background-color: #585858;\n border-bottom: 0;\n height: 33px\n}\n\n.table tbody tr:last-child td,\n.table tbody tr:last-child th {\n border-bottom-width: 1px\n}\n\n.table .cell-indent {\n padding-left: 2.25em\n}\n\n.is-linethrough {\n text-decoration: line-through\n}\n\n#menu.is-loading .menu-list a {\n cursor: progress\n}\n\n#statistics tr *:nth-child(1) {\n width: 50%\n}\n\n.expirydate {\n color: #bdc3c7\n}\n"]} \ No newline at end of file diff --git a/dist/css/home.css b/dist/css/home.css index c2a1d17..3d5e361 100644 --- a/dist/css/home.css +++ b/dist/css/home.css @@ -1,2 +1,2 @@ -#b{width:200px;height:200px;border-radius:100%;display:inline-block;margin-bottom:40px;vertical-align:top;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:floatUp;animation-name:floatUp;-webkit-animation-timing-function:cubic-bezier(0,.71,.29,1);animation-timing-function:cubic-bezier(0,.71,.29,1);box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2)}#b img.logo{max-height:200px}#dropzone *{pointer-events:none}#panel,#tokenContainer{display:none}#maxSize{font-size:1rem}.dz-preview .dz-details{display:flex}.dz-preview .dz-details .dz-filename,.dz-preview .dz-details .dz-size{flex:1}.dz-preview .dz-error-mark,.dz-preview .dz-success-mark,.dz-preview img{display:none}@-webkit-keyframes floatUp{0%{opacity:0;box-shadow:0 0 0 rgba(10,10,10,0),0 0 0 rgba(10,10,10,0),0 0 0 rgba(10,10,10,0);transform:scale(.86)}25%{opacity:1}67%{box-shadow:0 0 0 rgba(10,10,10,0),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2);transform:scale(1)}to{box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2);transform:scale(1)}}@keyframes floatUp{0%{opacity:0;box-shadow:0 0 0 rgba(10,10,10,0),0 0 0 rgba(10,10,10,0),0 0 0 rgba(10,10,10,0);transform:scale(.86)}25%{opacity:1}67%{box-shadow:0 0 0 rgba(10,10,10,0),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2);transform:scale(1)}to{box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2);transform:scale(1)}}.uploads.is-reversed{display:flex;flex-direction:column-reverse}.uploads>div{-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s;margin:1rem}.uploads.is-reversed>div{flex:0 0 auto}.uploads>div:first-child{margin-top:1.5rem}.uploads.nojs{margin-bottom:0}.uploads>div>.icon:not(.icon-block){color:#3794d2}.uploads>div>.icon.icon-block{color:#da4453}.uploads progress{margin-top:.5rem;margin-bottom:1rem}.uploads img{max-width:200px}.name{font-size:1rem;color:#bdc3c7}.link>a,.name{word-break:break-all}.clipboard-mobile{margin-top:5px}#albumDiv{-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}#albumDiv .control{text-align:inherit}#linksColumn{margin-top:-.25rem;margin-left:-.25rem;margin-right:-.25rem;-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}#linksColumn .column{padding:.25rem}#linksColumn>span{padding:0 .3rem;color:#7f8c8d}.git-commit a{display:inline-block;word-break:break-all}#tabs{margin-bottom:1rem;-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}#tabs ul{border-bottom:1px solid #898b8d}#tabs li a{color:#bdc3c7;border-bottom-color:#898b8d}#tabs.is-boxed li.is-active a{color:#3794d2;background:#232629;border-color:#898b8d #898b8d #232629}#tabs.is-boxed li:not(.is-active) a:hover{background:#4d4d4d}.tab-content{margin-bottom:-.75rem;-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}.tab-content .label{color:#bdc3c7;font-weight:400}#tab-config.tab-content form{margin-bottom:.75rem}#urlMaxSize{font-weight:700}.render{position:fixed;right:0;bottom:0;font-size:1rem;color:#bdc3c7;cursor:pointer}.render.button{border-bottom-left-radius:0;border-bottom-right-radius:0;right:1%;opacity:.25;transition:opacity .25s}.render.button:hover{opacity:1}input[type=file].is-fullwidth{width:100%} +#b{width:200px;height:200px;border-radius:100%;display:inline-block;margin-bottom:40px;vertical-align:top;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:floatUp;animation-name:floatUp;-webkit-animation-timing-function:cubic-bezier(0,.71,.29,1);animation-timing-function:cubic-bezier(0,.71,.29,1);box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2)}#b img.logo{max-height:200px}#dropzone *{pointer-events:none}#panel,#tokenContainer{display:none}#maxSize{font-size:1rem}.dz-preview .dz-details{display:flex}.dz-preview .dz-details .dz-filename,.dz-preview .dz-details .dz-size{flex:1}.dz-preview .dz-error-mark,.dz-preview .dz-success-mark,.dz-preview img{display:none}@-webkit-keyframes floatUp{0%{opacity:0;box-shadow:0 0 0 rgba(10,10,10,0),0 0 0 rgba(10,10,10,0),0 0 0 rgba(10,10,10,0);transform:scale(.86)}25%{opacity:1}67%{box-shadow:0 0 0 rgba(10,10,10,0),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2);transform:scale(1)}to{box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2);transform:scale(1)}}@keyframes floatUp{0%{opacity:0;box-shadow:0 0 0 rgba(10,10,10,0),0 0 0 rgba(10,10,10,0),0 0 0 rgba(10,10,10,0);transform:scale(.86)}25%{opacity:1}67%{box-shadow:0 0 0 rgba(10,10,10,0),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2);transform:scale(1)}to{box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2);transform:scale(1)}}.uploads.is-reversed{display:flex;flex-direction:column-reverse}.uploads>div{-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s;margin:1rem}.uploads.is-reversed>div{flex:0 0 auto}.uploads>div:first-child{margin-top:1.5rem}.uploads.nojs{margin-bottom:0}.uploads>div>.icon:not(.icon-block){color:#209cee}.uploads>div>.icon.icon-block{color:#da4453}.uploads progress{margin-top:.5rem;margin-bottom:1rem}.uploads img{max-width:200px}.name{font-size:1rem;color:#eff0f1}.link>a,.name{word-break:break-all}.clipboard-mobile{margin-top:5px}#albumDiv{-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}#albumDiv .control{text-align:inherit}#linksColumn{margin-top:-.25rem;margin-left:-.25rem;margin-right:-.25rem;-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}#linksColumn .column{padding:.25rem}#linksColumn>span{padding:0 .3rem;color:#7f8c8d}.git-commit a{display:inline-block;word-break:break-all}#tabs{margin-bottom:1rem;-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}#tabs ul{border-bottom:1px solid #585858}#tabs li a{color:#bdc3c7;border-bottom-color:#585858}#tabs.is-boxed li.is-active a{color:#209cee;background:#000;border-color:#585858 #585858 #000}#tabs.is-boxed li:not(.is-active) a:hover{background:#585858}.tab-content{margin-bottom:-.75rem;-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}#tab-config.tab-content form{margin-bottom:.75rem}#urlMaxSize{font-weight:700}.render{position:fixed;right:0;bottom:0;font-size:1rem;color:#bdc3c7;cursor:pointer}.render.button{border-bottom-left-radius:0;border-bottom-right-radius:0;right:1%;opacity:.25;transition:opacity .25s}.render.button:hover{opacity:1}input[type=file].is-fullwidth{width:100%} /*# sourceMappingURL=home.css.map */ diff --git a/dist/css/home.css.map b/dist/css/home.css.map index 470025f..435ec1e 100644 --- a/dist/css/home.css.map +++ b/dist/css/home.css.map @@ -1 +1 @@ -{"version":3,"sources":["css/home.css"],"names":[],"mappings":"AAAA,GACE,WAAY,CACZ,YAAa,CACb,kBAAmB,CACnB,oBAAqB,CACrB,kBAAmB,CACnB,kBAAmB,CACnB,2BAAqB,CAArB,mBAAqB,CACrB,+BAAwB,CAAxB,uBAAwB,CACxB,gCAAyB,CAAzB,wBAAyB,CACzB,8BAAuB,CAAvB,sBAAuB,CACvB,2DAAyD,CAAzD,mDAAyD,CACzD,kGACF,CAEA,YACE,gBACF,CAEA,YACE,mBACF,CAEA,uBAEE,YACF,CAEA,SACE,cACF,CAEA,wBACE,YACF,CAEA,sEAEE,MACF,CAEA,wEAGE,YACF,CAEA,2BACE,GACE,SAAU,CACV,+EAA2F,CAC3F,oBACF,CAEA,IACE,SACF,CAEA,IACE,0FAAwG,CACxG,kBACF,CAEA,GACE,kGAAiH,CACjH,kBACF,CACF,CAEA,mBACE,GACE,SAAU,CACV,+EAA2F,CAC3F,oBACF,CAEA,IACE,SACF,CAEA,IACE,0FAAwG,CACxG,kBACF,CAEA,GACE,kGAAiH,CACjH,kBACF,CACF,CAEA,qBACE,YAAa,CACb,6BACF,CAEA,aACE,mCAA6B,CAA7B,2BAA6B,CAC7B,WACF,CAEA,yBACE,aACF,CAEA,yBACE,iBACF,CAEA,cACE,eACF,CAEA,oCACE,aACF,CAEA,8BACE,aACF,CAEA,kBACE,gBAAkB,CAClB,kBACF,CAEA,aACE,eACF,CAEA,MACE,cAAe,CACf,aAEF,CAEA,cAHE,oBAKF,CAEA,kBACE,cACF,CAEA,UACE,mCAA4B,CAA5B,2BACF,CAEA,mBACE,kBACF,CAEA,aACE,kBAAoB,CACpB,mBAAqB,CACrB,oBAAsB,CACtB,mCAA4B,CAA5B,2BACF,CAEA,qBACE,cACF,CAEA,kBACE,eAAiB,CACjB,aACF,CAEA,cACE,oBAAqB,CACrB,oBACF,CAEA,MACE,kBAAmB,CACnB,mCAA4B,CAA5B,2BACF,CAEA,SACE,+BACF,CAEA,WACE,aAAc,CACd,2BACF,CAEA,8BACE,aAAc,CACd,kBAAmB,CAEnB,oCACF,CAEA,0CACE,kBACF,CAEA,aACE,qBAAuB,CACvB,mCAA4B,CAA5B,2BACF,CAEA,oBACE,aAAc,CACd,eACF,CAEA,6BACE,oBACF,CAEA,YACE,eACF,CAEA,QACE,cAAe,CACf,OAAQ,CACR,QAAS,CACT,cAAe,CACf,aAAc,CACd,cACF,CAEA,eACE,2BAA4B,CAC5B,4BAA6B,CAC7B,QAAS,CACT,WAAa,CACb,uBACF,CAEA,qBACE,SACF,CAEA,8BACE,UACF","file":"home.css","sourcesContent":["#b {\n width: 200px;\n height: 200px;\n border-radius: 100%;\n display: inline-block;\n margin-bottom: 40px;\n vertical-align: top;\n animation-delay: 0.5s;\n animation-duration: 1.5s;\n animation-fill-mode: both;\n animation-name: floatUp;\n animation-timing-function: cubic-bezier(0, 0.71, 0.29, 1);\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2)\n}\n\n#b img.logo {\n max-height: 200px\n}\n\n#dropzone * {\n pointer-events: none\n}\n\n#tokenContainer,\n#panel {\n display: none\n}\n\n#maxSize {\n font-size: 1rem\n}\n\n.dz-preview .dz-details {\n display: flex\n}\n\n.dz-preview .dz-details .dz-size,\n.dz-preview .dz-details .dz-filename {\n flex: 1\n}\n\n.dz-preview img,\n.dz-preview .dz-success-mark,\n.dz-preview .dz-error-mark {\n display: none\n}\n\n@-webkit-keyframes floatUp {\n 0% {\n opacity: 0;\n box-shadow: 0 0 0 rgba(10, 10, 10, 0), 0 0 0 rgba(10, 10, 10, 0), 0 0 0 rgba(10, 10, 10, 0);\n transform: scale(0.86)\n }\n\n 25% {\n opacity: 100\n }\n\n 67% {\n box-shadow: 0 0 0 rgba(10, 10, 10, 0), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2);\n transform: scale(1)\n }\n\n 100% {\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2);\n transform: scale(1)\n }\n}\n\n@keyframes floatUp {\n 0% {\n opacity: 0;\n box-shadow: 0 0 0 rgba(10, 10, 10, 0), 0 0 0 rgba(10, 10, 10, 0), 0 0 0 rgba(10, 10, 10, 0);\n transform: scale(0.86)\n }\n\n 25% {\n opacity: 100\n }\n\n 67% {\n box-shadow: 0 0 0 rgba(10, 10, 10, 0), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2);\n transform: scale(1)\n }\n\n 100% {\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2);\n transform: scale(1)\n }\n}\n\n.uploads.is-reversed {\n display: flex;\n flex-direction: column-reverse\n}\n\n.uploads > div {\n animation: fadeInOpacity 0.5s;\n margin: 1rem\n}\n\n.uploads.is-reversed > div {\n flex: 0 0 auto\n}\n\n.uploads > div:first-child {\n margin-top: 1.5rem\n}\n\n.uploads.nojs {\n margin-bottom: 0\n}\n\n.uploads > div > .icon:not(.icon-block) {\n color: #3794d2\n}\n\n.uploads > div > .icon.icon-block {\n color: #da4453\n}\n\n.uploads progress {\n margin-top: 0.5rem;\n margin-bottom: 1rem\n}\n\n.uploads img {\n max-width: 200px\n}\n\n.name {\n font-size: 1rem;\n color: #bdc3c7;\n word-break: break-all\n}\n\n.link > a {\n word-break: break-all\n}\n\n.clipboard-mobile {\n margin-top: 5px\n}\n\n#albumDiv {\n animation: fadeInOpacity 0.5s\n}\n\n#albumDiv .control {\n text-align: inherit\n}\n\n#linksColumn {\n margin-top: -0.25rem;\n margin-left: -0.25rem;\n margin-right: -0.25rem;\n animation: fadeInOpacity 0.5s\n}\n\n#linksColumn .column {\n padding: 0.25rem\n}\n\n#linksColumn > span {\n padding: 0 0.3rem;\n color: #7f8c8d\n}\n\n.git-commit a {\n display: inline-block;\n word-break: break-all\n}\n\n#tabs {\n margin-bottom: 1rem;\n animation: fadeInOpacity 0.5s\n}\n\n#tabs ul {\n border-bottom: 1px solid #898b8d\n}\n\n#tabs li a {\n color: #bdc3c7;\n border-bottom-color: #898b8d\n}\n\n#tabs.is-boxed li.is-active a {\n color: #3794d2;\n background: #232629;\n border-color: #898b8d;\n border-bottom-color: #232629\n}\n\n#tabs.is-boxed li:not(.is-active) a:hover {\n background: #4d4d4d\n}\n\n.tab-content {\n margin-bottom: -0.75rem;\n animation: fadeInOpacity 0.5s\n}\n\n.tab-content .label {\n color: #bdc3c7;\n font-weight: normal\n}\n\n#tab-config.tab-content form {\n margin-bottom: 0.75rem\n}\n\n#urlMaxSize {\n font-weight: bold\n}\n\n.render {\n position: fixed;\n right: 0;\n bottom: 0;\n font-size: 1rem;\n color: #bdc3c7;\n cursor: pointer\n}\n\n.render.button {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n right: 1%;\n opacity: 0.25;\n transition: opacity 0.25s\n}\n\n.render.button:hover {\n opacity: 1\n}\n\ninput[type=\"file\"].is-fullwidth {\n width: 100%\n}\n"]} \ No newline at end of file +{"version":3,"sources":["css/home.css"],"names":[],"mappings":"AAAA,GACE,WAAY,CACZ,YAAa,CACb,kBAAmB,CACnB,oBAAqB,CACrB,kBAAmB,CACnB,kBAAmB,CACnB,2BAAqB,CAArB,mBAAqB,CACrB,+BAAwB,CAAxB,uBAAwB,CACxB,gCAAyB,CAAzB,wBAAyB,CACzB,8BAAuB,CAAvB,sBAAuB,CACvB,2DAAyD,CAAzD,mDAAyD,CACzD,kGACF,CAEA,YACE,gBACF,CAEA,YACE,mBACF,CAEA,uBAEE,YACF,CAEA,SACE,cACF,CAEA,wBACE,YACF,CAEA,sEAEE,MACF,CAEA,wEAGE,YACF,CAEA,2BACE,GACE,SAAU,CACV,+EAA2F,CAC3F,oBACF,CAEA,IACE,SACF,CAEA,IACE,0FAAwG,CACxG,kBACF,CAEA,GACE,kGAAiH,CACjH,kBACF,CACF,CAEA,mBACE,GACE,SAAU,CACV,+EAA2F,CAC3F,oBACF,CAEA,IACE,SACF,CAEA,IACE,0FAAwG,CACxG,kBACF,CAEA,GACE,kGAAiH,CACjH,kBACF,CACF,CAEA,qBACE,YAAa,CACb,6BACF,CAEA,aACE,mCAA6B,CAA7B,2BAA6B,CAC7B,WACF,CAEA,yBACE,aACF,CAEA,yBACE,iBACF,CAEA,cACE,eACF,CAEA,oCACE,aACF,CAEA,8BACE,aACF,CAEA,kBACE,gBAAkB,CAClB,kBACF,CAEA,aACE,eACF,CAEA,MACE,cAAe,CACf,aAEF,CAEA,cAHE,oBAKF,CAEA,kBACE,cACF,CAEA,UACE,mCAA4B,CAA5B,2BACF,CAEA,mBACE,kBACF,CAEA,aACE,kBAAoB,CACpB,mBAAqB,CACrB,oBAAsB,CACtB,mCAA4B,CAA5B,2BACF,CAEA,qBACE,cACF,CAEA,kBACE,eAAiB,CACjB,aACF,CAEA,cACE,oBAAqB,CACrB,oBACF,CAEA,MACE,kBAAmB,CACnB,mCAA4B,CAA5B,2BACF,CAEA,SACE,+BACF,CAEA,WACE,aAAc,CACd,2BACF,CAEA,8BACE,aAAc,CACd,eAAgB,CAEhB,iCACF,CAEA,0CACE,kBACF,CAEA,aACE,qBAAuB,CACvB,mCAA4B,CAA5B,2BACF,CAEA,6BACE,oBACF,CAEA,YACE,eACF,CAEA,QACE,cAAe,CACf,OAAQ,CACR,QAAS,CACT,cAAe,CACf,aAAc,CACd,cACF,CAEA,eACE,2BAA4B,CAC5B,4BAA6B,CAC7B,QAAS,CACT,WAAa,CACb,uBACF,CAEA,qBACE,SACF,CAEA,8BACE,UACF","file":"home.css","sourcesContent":["#b {\n width: 200px;\n height: 200px;\n border-radius: 100%;\n display: inline-block;\n margin-bottom: 40px;\n vertical-align: top;\n animation-delay: 0.5s;\n animation-duration: 1.5s;\n animation-fill-mode: both;\n animation-name: floatUp;\n animation-timing-function: cubic-bezier(0, 0.71, 0.29, 1);\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2)\n}\n\n#b img.logo {\n max-height: 200px\n}\n\n#dropzone * {\n pointer-events: none\n}\n\n#tokenContainer,\n#panel {\n display: none\n}\n\n#maxSize {\n font-size: 1rem\n}\n\n.dz-preview .dz-details {\n display: flex\n}\n\n.dz-preview .dz-details .dz-size,\n.dz-preview .dz-details .dz-filename {\n flex: 1\n}\n\n.dz-preview img,\n.dz-preview .dz-success-mark,\n.dz-preview .dz-error-mark {\n display: none\n}\n\n@-webkit-keyframes floatUp {\n 0% {\n opacity: 0;\n box-shadow: 0 0 0 rgba(10, 10, 10, 0), 0 0 0 rgba(10, 10, 10, 0), 0 0 0 rgba(10, 10, 10, 0);\n transform: scale(0.86)\n }\n\n 25% {\n opacity: 100\n }\n\n 67% {\n box-shadow: 0 0 0 rgba(10, 10, 10, 0), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2);\n transform: scale(1)\n }\n\n 100% {\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2);\n transform: scale(1)\n }\n}\n\n@keyframes floatUp {\n 0% {\n opacity: 0;\n box-shadow: 0 0 0 rgba(10, 10, 10, 0), 0 0 0 rgba(10, 10, 10, 0), 0 0 0 rgba(10, 10, 10, 0);\n transform: scale(0.86)\n }\n\n 25% {\n opacity: 100\n }\n\n 67% {\n box-shadow: 0 0 0 rgba(10, 10, 10, 0), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2);\n transform: scale(1)\n }\n\n 100% {\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2);\n transform: scale(1)\n }\n}\n\n.uploads.is-reversed {\n display: flex;\n flex-direction: column-reverse\n}\n\n.uploads > div {\n animation: fadeInOpacity 0.5s;\n margin: 1rem\n}\n\n.uploads.is-reversed > div {\n flex: 0 0 auto\n}\n\n.uploads > div:first-child {\n margin-top: 1.5rem\n}\n\n.uploads.nojs {\n margin-bottom: 0\n}\n\n.uploads > div > .icon:not(.icon-block) {\n color: #209cee\n}\n\n.uploads > div > .icon.icon-block {\n color: #da4453\n}\n\n.uploads progress {\n margin-top: 0.5rem;\n margin-bottom: 1rem\n}\n\n.uploads img {\n max-width: 200px\n}\n\n.name {\n font-size: 1rem;\n color: #eff0f1;\n word-break: break-all\n}\n\n.link > a {\n word-break: break-all\n}\n\n.clipboard-mobile {\n margin-top: 5px\n}\n\n#albumDiv {\n animation: fadeInOpacity 0.5s\n}\n\n#albumDiv .control {\n text-align: inherit\n}\n\n#linksColumn {\n margin-top: -0.25rem;\n margin-left: -0.25rem;\n margin-right: -0.25rem;\n animation: fadeInOpacity 0.5s\n}\n\n#linksColumn .column {\n padding: 0.25rem\n}\n\n#linksColumn > span {\n padding: 0 0.3rem;\n color: #7f8c8d\n}\n\n.git-commit a {\n display: inline-block;\n word-break: break-all\n}\n\n#tabs {\n margin-bottom: 1rem;\n animation: fadeInOpacity 0.5s\n}\n\n#tabs ul {\n border-bottom: 1px solid #585858\n}\n\n#tabs li a {\n color: #bdc3c7;\n border-bottom-color: #585858\n}\n\n#tabs.is-boxed li.is-active a {\n color: #209cee;\n background: #000;\n border-color: #585858;\n border-bottom-color: #000\n}\n\n#tabs.is-boxed li:not(.is-active) a:hover {\n background: #585858\n}\n\n.tab-content {\n margin-bottom: -0.75rem;\n animation: fadeInOpacity 0.5s\n}\n\n#tab-config.tab-content form {\n margin-bottom: 0.75rem\n}\n\n#urlMaxSize {\n font-weight: bold\n}\n\n.render {\n position: fixed;\n right: 0;\n bottom: 0;\n font-size: 1rem;\n color: #bdc3c7;\n cursor: pointer\n}\n\n.render.button {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n right: 1%;\n opacity: 0.25;\n transition: opacity 0.25s\n}\n\n.render.button:hover {\n opacity: 1\n}\n\ninput[type=\"file\"].is-fullwidth {\n width: 100%\n}\n"]} \ No newline at end of file diff --git a/dist/css/style.css b/dist/css/style.css index 91467ae..1765d14 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -1,2 +1,2 @@ -html{background-color:#232629;overflow-y:auto}body{color:#eff0f1;-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}@-webkit-keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}@keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}a{color:#3794d2}a:hover{color:#60a8dc}hr{background-color:#898b8d}.message-body code,code{background-color:#222528;border-radius:5px}.title{color:#eff0f1}.subtitle,.subtitle strong{color:#bdc3c7}.input::-moz-placeholder,.textarea::-moz-placeholder{color:#7f8c8d}.input::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:#7f8c8d}.input:-moz-placeholder,.textarea:-moz-placeholder{color:#7f8c8d}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:#7f8c8d}.input.is-active,.input.is-focused,.input:active,.input:focus,.textarea.is-active,.textarea.is-focused,.textarea:active,.textarea:focus{border-color:#3794d2}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#4d4d4d}.table td,.table th{vertical-align:middle}.help{color:#7f8c8d}.button.is-info.is-hovered [class*=" icon-"]:before,.button.is-info.is-hovered [class^=icon-]:before,.button.is-info:hover [class*=" icon-"]:before,.button.is-info:hover [class^=icon-]:before{fill:#fff}.checkbox:hover,.radio:hover{color:#7f8c8d}.message{background-color:#31363b}.message-body{color:#eff0f1;border:0;box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2)}.hero.is-fullheight>.hero-body{min-height:100vh;height:100%}.hero.is-fullheight>.hero-body>.container{width:100%} +html{background-color:#000;overflow-y:auto}body{color:#eff0f1;-webkit-animation:fadeInOpacity .5s;animation:fadeInOpacity .5s}@-webkit-keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}@keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}a{color:#209cee}a:hover{color:#67c3ff}hr{background-color:#585858}.message-body code,code{background-color:#222528;border-radius:5px}.title{color:#eff0f1}.subtitle,.subtitle strong{color:#bdc3c7}.input,.select select,.textarea{color:#eff0f1;border-color:#585858;background-color:#000}.input::-moz-placeholder,.textarea::-moz-placeholder{color:#bdc3c7}.input::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:#bdc3c7}.input:-moz-placeholder,.textarea:-moz-placeholder{color:#bdc3c7}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:#bdc3c7}.input.is-active,.input.is-focused,.input:active,.input:focus,.input:hover,.select select:hover,.textarea.is-active,.textarea.is-focused,.textarea:active,.textarea:focus,.textarea:hover{border-color:#209cee}.label{color:#eff0f1;font-weight:400}.help{color:#bdc3c7}.progress{background-color:#030303}.button.is-info.is-hovered [class*=" icon-"]:before,.button.is-info.is-hovered [class^=icon-]:before,.button.is-info:hover [class*=" icon-"]:before,.button.is-info:hover [class^=icon-]:before{fill:#fff}.checkbox:hover,.radio:hover{color:#7f8c8d}.select:not(.is-multiple):not(.is-loading):after,.select:not(.is-multiple):not(.is-loading):hover:after{border-color:#eff0f1}.message{background-color:#030303}.message-body{color:#eff0f1;border:0;box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2)}.hero.is-fullheight>.hero-body{min-height:100vh;height:100%}.hero.is-fullheight>.hero-body>.container{width:100%} /*# sourceMappingURL=style.css.map */ diff --git a/dist/css/style.css.map b/dist/css/style.css.map index 22ee2d0..7c4e137 100644 --- a/dist/css/style.css.map +++ b/dist/css/style.css.map @@ -1 +1 @@ -{"version":3,"sources":["css/style.css"],"names":[],"mappings":"AAAA,KACE,wBAAyB,CACzB,eACF,CAEA,KACE,aAAc,CACd,mCAA4B,CAA5B,2BACF,CAEA,iCACE,GACE,SACF,CAEA,GACE,SACF,CACF,CAEA,yBACE,GACE,SACF,CAEA,GACE,SACF,CACF,CAEA,EACE,aACF,CAEA,QACE,aACF,CAEA,GACE,wBACF,CAEA,wBAEE,wBAAyB,CACzB,iBACF,CAEA,OACE,aACF,CAMA,2BACE,aACF,CAEA,qDAEE,aACF,CAEA,uEAEE,aACF,CAEA,mDAEE,aACF,CAEA,6DAEE,aACF,CAEA,wIAQE,oBACF,CAEA,qDACE,wBACF,CAEA,oBAEE,qBACF,CAEA,MACE,aACF,CAEA,gMAIE,SACF,CAEA,6BAEE,aACF,CAEA,SACE,wBACF,CAEA,cACE,aAAc,CACd,QAAS,CACT,kGACF,CAGA,+BACE,gBAAiB,CACjB,WACF,CAGA,0CACE,UACF","file":"style.css","sourcesContent":["html {\n background-color: #232629;\n overflow-y: auto\n}\n\nbody {\n color: #eff0f1;\n animation: fadeInOpacity 0.5s\n}\n\n@-webkit-keyframes fadeInOpacity {\n 0% {\n opacity: 0\n }\n\n 100% {\n opacity: 1\n }\n}\n\n@keyframes fadeInOpacity {\n 0% {\n opacity: 0\n }\n\n 100% {\n opacity: 1\n }\n}\n\na {\n color: #3794d2\n}\n\na:hover {\n color: #60a8dc\n}\n\nhr {\n background-color: #898b8d\n}\n\ncode,\n.message-body code {\n background-color: #222528;\n border-radius: 5px\n}\n\n.title {\n color: #eff0f1\n}\n\n.subtitle {\n color: #bdc3c7\n}\n\n.subtitle strong {\n color: #bdc3c7\n}\n\n.input::-moz-placeholder,\n.textarea::-moz-placeholder {\n color: #7f8c8d\n}\n\n.input::-webkit-input-placeholder,\n.textarea::-webkit-input-placeholder {\n color: #7f8c8d\n}\n\n.input:-moz-placeholder,\n.textarea:-moz-placeholder {\n color: #7f8c8d\n}\n\n.input:-ms-input-placeholder,\n.textarea:-ms-input-placeholder {\n color: #7f8c8d\n}\n\n.input.is-active,\n.input.is-focused,\n.input:active,\n.input:focus,\n.textarea.is-active,\n.textarea.is-focused,\n.textarea:active,\n.textarea:focus {\n border-color: #3794d2\n}\n\n.table.is-hoverable tbody tr:not(.is-selected):hover {\n background-color: #4d4d4d\n}\n\n.table td,\n.table th {\n vertical-align: middle\n}\n\n.help {\n color: #7f8c8d\n}\n\n.button.is-info.is-hovered [class^=\"icon-\"]::before,\n.button.is-info.is-hovered [class*=\" icon-\"]::before,\n.button.is-info:hover [class^=\"icon-\"]::before,\n.button.is-info:hover [class*=\" icon-\"]::before {\n fill: #fff\n}\n\n.checkbox:hover,\n.radio:hover {\n color: #7f8c8d\n}\n\n.message {\n background-color: #31363b\n}\n\n.message-body {\n color: #eff0f1;\n border: 0;\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2)\n}\n\n/* https://github.com/philipwalton/flexbugs#flexbug-3 */\n.hero.is-fullheight > .hero-body {\n min-height: 100vh;\n height: 100%\n}\n\n/* https://github.com/philipwalton/flexbugs#flexbug-2 */\n.hero.is-fullheight > .hero-body > .container {\n width: 100%\n}\n"]} \ No newline at end of file +{"version":3,"sources":["css/style.css"],"names":[],"mappings":"AAAA,KACE,qBAAsB,CACtB,eACF,CAEA,KACE,aAAc,CACd,mCAA4B,CAA5B,2BACF,CAEA,iCACE,GACE,SACF,CAEA,GACE,SACF,CACF,CAEA,yBACE,GACE,SACF,CAEA,GACE,SACF,CACF,CAEA,EACE,aACF,CAEA,QACE,aACF,CAEA,GACE,wBACF,CAEA,wBAEE,wBAAyB,CACzB,iBACF,CAEA,OACE,aACF,CAMA,2BACE,aACF,CAEA,gCAGE,aAAc,CACd,oBAAqB,CACrB,qBACF,CAEA,qDAEE,aACF,CAEA,uEAEE,aACF,CAEA,mDAEE,aACF,CAEA,6DAEE,aACF,CAQA,0LAQE,oBACF,CAEA,OACE,aAAc,CACd,eACF,CAEA,MACE,aACF,CAEA,UACE,wBACF,CAEA,gMAIE,SACF,CAEA,6BAEE,aACF,CAMA,wGACE,oBACF,CAEA,SACE,wBACF,CAEA,cACE,aAAc,CACd,QAAS,CACT,kGACF,CAGA,+BACE,gBAAiB,CACjB,WACF,CAGA,0CACE,UACF","file":"style.css","sourcesContent":["html {\n background-color: #000;\n overflow-y: auto\n}\n\nbody {\n color: #eff0f1;\n animation: fadeInOpacity 0.5s\n}\n\n@-webkit-keyframes fadeInOpacity {\n 0% {\n opacity: 0\n }\n\n 100% {\n opacity: 1\n }\n}\n\n@keyframes fadeInOpacity {\n 0% {\n opacity: 0\n }\n\n 100% {\n opacity: 1\n }\n}\n\na {\n color: #209cee\n}\n\na:hover {\n color: #67c3ff\n}\n\nhr {\n background-color: #585858\n}\n\ncode,\n.message-body code {\n background-color: #222528;\n border-radius: 5px\n}\n\n.title {\n color: #eff0f1\n}\n\n.subtitle {\n color: #bdc3c7\n}\n\n.subtitle strong {\n color: #bdc3c7\n}\n\n.input,\n.select select,\n.textarea {\n color: #eff0f1;\n border-color: #585858;\n background-color: #000\n}\n\n.input::-moz-placeholder,\n.textarea::-moz-placeholder {\n color: #bdc3c7\n}\n\n.input::-webkit-input-placeholder,\n.textarea::-webkit-input-placeholder {\n color: #bdc3c7\n}\n\n.input:-moz-placeholder,\n.textarea:-moz-placeholder {\n color: #bdc3c7\n}\n\n.input:-ms-input-placeholder,\n.textarea:-ms-input-placeholder {\n color: #bdc3c7\n}\n\n.input:hover,\n.select select:hover,\n.textarea:hover {\n border-color: #209cee\n}\n\n.input.is-active,\n.input.is-focused,\n.input:active,\n.input:focus,\n.textarea.is-active,\n.textarea.is-focused,\n.textarea:active,\n.textarea:focus {\n border-color: #209cee\n}\n\n.label {\n color: #eff0f1;\n font-weight: normal\n}\n\n.help {\n color: #bdc3c7\n}\n\n.progress {\n background-color: #030303\n}\n\n.button.is-info.is-hovered [class^=\"icon-\"]::before,\n.button.is-info.is-hovered [class*=\" icon-\"]::before,\n.button.is-info:hover [class^=\"icon-\"]::before,\n.button.is-info:hover [class*=\" icon-\"]::before {\n fill: #fff\n}\n\n.checkbox:hover,\n.radio:hover {\n color: #7f8c8d\n}\n\n.select:not(.is-multiple):not(.is-loading)::after {\n border-color: #eff0f1\n}\n\n.select:not(.is-multiple):not(.is-loading):hover::after {\n border-color: #eff0f1\n}\n\n.message {\n background-color: #030303\n}\n\n.message-body {\n color: #eff0f1;\n border: 0;\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2)\n}\n\n/* https://github.com/philipwalton/flexbugs#flexbug-3 */\n.hero.is-fullheight > .hero-body {\n min-height: 100vh;\n height: 100%\n}\n\n/* https://github.com/philipwalton/flexbugs#flexbug-2 */\n.hero.is-fullheight > .hero-body > .container {\n width: 100%\n}\n"]} \ No newline at end of file diff --git a/dist/css/sweetalert.css b/dist/css/sweetalert.css index 4aed0f0..7845d36 100644 --- a/dist/css/sweetalert.css +++ b/dist/css/sweetalert.css @@ -1,2 +1,2 @@ -.swal-modal{background-color:#31363b}.swal-modal .field{text-align:left;text-align:initial}.swal-modal.is-expanded{width:auto;max-width:90%}.swal-text,.swal-title{color:#eff0f1}.swal-text{text-align:center}.swal-content .checkbox,.swal-content .label,.swal-content .radio{color:#eff0f1}.swal-content .checkbox:hover,.swal-content .radio:hover{color:#bdc3c7}.swal-button{background-color:#3794d2;color:#eff0f1}.swal-button:hover{background-color:#60a8dc}.swal-button:focus{box-shadow:0 0 0 1px #31363b,0 0 0 3px rgba(55,148,210,.29)}.swal-button--loading{color:transparent}.swal-button--danger{background-color:#da4453}.swal-icon--info{border-color:#3794d2}.swal-icon--info:after,.swal-icon--info:before{background-color:#3794d2}.swal-icon--error{border-color:#da4453}.swal-icon--error__line{background-color:#da4453}.swal-icon--warning{border-color:#f67400;-webkit-animation:pulseWarning .5s infinite alternate;animation:pulseWarning .5s infinite alternate}.swal-icon--warning__body,.swal-icon--warning__dot{background-color:#f67400;-webkit-animation:pulseWarningBody .5s infinite alternate;animation:pulseWarningBody .5s infinite alternate}@-webkit-keyframes pulseWarning{0%{border-color:#ffaa60}to{border-color:#f67400}}@keyframes pulseWarning{0%{border-color:#ffaa60}to{border-color:#f67400}}@-webkit-keyframes pulseWarningBody{0%{background-color:#ffaa60}to{background-color:#f67400}}@keyframes pulseWarningBody{0%{background-color:#ffaa60}to{background-color:#f67400}}.swal-icon--success{border-color:#27ae60}.swal-icon--success__line{background-color:#27ae60}.swal-icon--success__hide-corners{background-color:#31363b}.swal-icon--success:after,.swal-icon--success:before{background:#31363b}.swal-display-thumb-container{min-width:200px;min-height:200px;display:flex;align-items:center;justify-content:center} +.swal-modal{background-color:#2f2f2f}.swal-modal .field{text-align:left;text-align:initial}.swal-modal.is-expanded{width:auto;max-width:90%}.swal-text,.swal-title{color:#eff0f1}.swal-text{text-align:center}.swal-content .checkbox,.swal-content .label,.swal-content .radio{color:#eff0f1}.swal-content .checkbox:hover,.swal-content .radio:hover{color:#bdc3c7}.swal-button{background-color:#3794d2;color:#eff0f1}.swal-button:hover{background-color:#1496ed}.swal-button:focus{box-shadow:0 0 0 1px #030303,0 0 0 3px rgba(55,148,210,.29)}.swal-button--loading{color:transparent}.swal-button--danger{background-color:#da4453}.swal-icon--info{border-color:#3794d2}.swal-icon--info:after,.swal-icon--info:before{background-color:#3794d2}.swal-icon--error{border-color:#da4453}.swal-icon--error__line{background-color:#da4453}.swal-icon--warning{border-color:#f67400;-webkit-animation:pulseWarning .5s infinite alternate;animation:pulseWarning .5s infinite alternate}.swal-icon--warning__body,.swal-icon--warning__dot{background-color:#f67400;-webkit-animation:pulseWarningBody .5s infinite alternate;animation:pulseWarningBody .5s infinite alternate}@-webkit-keyframes pulseWarning{0%{border-color:#ffaa60}to{border-color:#f67400}}@keyframes pulseWarning{0%{border-color:#ffaa60}to{border-color:#f67400}}@-webkit-keyframes pulseWarningBody{0%{background-color:#ffaa60}to{background-color:#f67400}}@keyframes pulseWarningBody{0%{background-color:#ffaa60}to{background-color:#f67400}}.swal-icon--success{border-color:#27ae60}.swal-icon--success__line{background-color:#27ae60}.swal-icon--success__hide-corners{background-color:#2f2f2f}.swal-icon--success:after,.swal-icon--success:before{background:#2f2f2f}.swal-display-thumb-container{min-width:200px;min-height:200px;display:flex;align-items:center;justify-content:center} /*# sourceMappingURL=sweetalert.css.map */ diff --git a/dist/css/sweetalert.css.map b/dist/css/sweetalert.css.map index d7cc2af..4e92f9a 100644 --- a/dist/css/sweetalert.css.map +++ b/dist/css/sweetalert.css.map @@ -1 +1 @@ -{"version":3,"sources":["css/sweetalert.css"],"names":[],"mappings":"AAAA,YACE,wBACF,CAEA,mBACE,eAAkB,CAAlB,kBACF,CAEA,wBACE,UAAW,CACX,aACF,CAEA,uBAEE,aACF,CAEA,WACE,iBACF,CAEA,kEAGE,aACF,CAEA,yDAEE,aACF,CAEA,aACE,wBAAyB,CACzB,aACF,CAEA,mBACE,wBACF,CAEA,mBACE,2DACF,CAEA,sBACE,iBACF,CAEA,qBACE,wBACF,CAEA,iBACE,oBACF,CAEA,+CAEE,wBACF,CAEA,kBACE,oBACF,CAEA,wBACE,wBACF,CAEA,oBACE,oBAAqB,CACrB,qDAA8C,CAA9C,6CACF,CAEA,mDAEE,wBAAyB,CACzB,yDAAkD,CAAlD,iDACF,CAEA,gCACE,GACE,oBACF,CAEA,GACE,oBACF,CACF,CAEA,wBACE,GACE,oBACF,CAEA,GACE,oBACF,CACF,CAEA,oCACE,GACE,wBACF,CAEA,GACE,wBACF,CACF,CAEA,4BACE,GACE,wBACF,CAEA,GACE,wBACF,CACF,CAEA,oBACE,oBACF,CAEA,0BACE,wBACF,CAEA,kCACE,wBACF,CAEA,qDAEE,kBACF,CAEA,8BACE,eAAgB,CAChB,gBAAiB,CACjB,YAAa,CACb,kBAAmB,CACnB,sBACF","file":"sweetalert.css","sourcesContent":[".swal-modal {\n background-color: #31363b\n}\n\n.swal-modal .field {\n text-align: initial\n}\n\n.swal-modal.is-expanded {\n width: auto;\n max-width: 90%\n}\n\n.swal-title,\n.swal-text {\n color: #eff0f1\n}\n\n.swal-text {\n text-align: center\n}\n\n.swal-content .label,\n.swal-content .checkbox,\n.swal-content .radio {\n color: #eff0f1\n}\n\n.swal-content .checkbox:hover,\n.swal-content .radio:hover {\n color: #bdc3c7\n}\n\n.swal-button {\n background-color: #3794d2;\n color: #eff0f1\n}\n\n.swal-button:hover {\n background-color: #60a8dc\n}\n\n.swal-button:focus {\n box-shadow: 0 0 0 1px #31363b, 0 0 0 3px rgba(55, 148, 210, 0.29)\n}\n\n.swal-button--loading {\n color: transparent\n}\n\n.swal-button--danger {\n background-color: #da4453\n}\n\n.swal-icon--info {\n border-color: #3794d2\n}\n\n.swal-icon--info::after,\n.swal-icon--info::before {\n background-color: #3794d2\n}\n\n.swal-icon--error {\n border-color: #da4453\n}\n\n.swal-icon--error__line {\n background-color: #da4453\n}\n\n.swal-icon--warning {\n border-color: #f67400;\n animation: pulseWarning 0.5s infinite alternate\n}\n\n.swal-icon--warning__body,\n.swal-icon--warning__dot {\n background-color: #f67400;\n animation: pulseWarningBody 0.5s infinite alternate\n}\n\n@-webkit-keyframes pulseWarning {\n 0% {\n border-color: #ffaa60\n }\n\n to {\n border-color: #f67400\n }\n}\n\n@keyframes pulseWarning {\n 0% {\n border-color: #ffaa60\n }\n\n to {\n border-color: #f67400\n }\n}\n\n@-webkit-keyframes pulseWarningBody {\n 0% {\n background-color: #ffaa60\n }\n\n to {\n background-color: #f67400\n }\n}\n\n@keyframes pulseWarningBody {\n 0% {\n background-color: #ffaa60\n }\n\n to {\n background-color: #f67400\n }\n}\n\n.swal-icon--success {\n border-color: #27ae60\n}\n\n.swal-icon--success__line {\n background-color: #27ae60\n}\n\n.swal-icon--success__hide-corners {\n background-color: #31363b\n}\n\n.swal-icon--success::after,\n.swal-icon--success::before {\n background: #31363b\n}\n\n.swal-display-thumb-container {\n min-width: 200px;\n min-height: 200px;\n display: flex;\n align-items: center;\n justify-content: center\n}\n"]} \ No newline at end of file +{"version":3,"sources":["css/sweetalert.css"],"names":[],"mappings":"AAAA,YACE,wBACF,CAEA,mBACE,eAAkB,CAAlB,kBACF,CAEA,wBACE,UAAW,CACX,aACF,CAEA,uBAEE,aACF,CAEA,WACE,iBACF,CAEA,kEAGE,aACF,CAEA,yDAEE,aACF,CAEA,aACE,wBAAyB,CACzB,aACF,CAEA,mBACE,wBACF,CAEA,mBACE,2DACF,CAEA,sBACE,iBACF,CAEA,qBACE,wBACF,CAEA,iBACE,oBACF,CAEA,+CAEE,wBACF,CAEA,kBACE,oBACF,CAEA,wBACE,wBACF,CAEA,oBACE,oBAAqB,CACrB,qDAA8C,CAA9C,6CACF,CAEA,mDAEE,wBAAyB,CACzB,yDAAkD,CAAlD,iDACF,CAEA,gCACE,GACE,oBACF,CAEA,GACE,oBACF,CACF,CAEA,wBACE,GACE,oBACF,CAEA,GACE,oBACF,CACF,CAEA,oCACE,GACE,wBACF,CAEA,GACE,wBACF,CACF,CAEA,4BACE,GACE,wBACF,CAEA,GACE,wBACF,CACF,CAEA,oBACE,oBACF,CAEA,0BACE,wBACF,CAEA,kCACE,wBACF,CAEA,qDAEE,kBACF,CAEA,8BACE,eAAgB,CAChB,gBAAiB,CACjB,YAAa,CACb,kBAAmB,CACnB,sBACF","file":"sweetalert.css","sourcesContent":[".swal-modal {\n background-color: #2f2f2f\n}\n\n.swal-modal .field {\n text-align: initial\n}\n\n.swal-modal.is-expanded {\n width: auto;\n max-width: 90%\n}\n\n.swal-title,\n.swal-text {\n color: #eff0f1\n}\n\n.swal-text {\n text-align: center\n}\n\n.swal-content .label,\n.swal-content .checkbox,\n.swal-content .radio {\n color: #eff0f1\n}\n\n.swal-content .checkbox:hover,\n.swal-content .radio:hover {\n color: #bdc3c7\n}\n\n.swal-button {\n background-color: #3794d2;\n color: #eff0f1\n}\n\n.swal-button:hover {\n background-color: #1496ed\n}\n\n.swal-button:focus {\n box-shadow: 0 0 0 1px #030303, 0 0 0 3px rgba(55, 148, 210, 0.29)\n}\n\n.swal-button--loading {\n color: transparent\n}\n\n.swal-button--danger {\n background-color: #da4453\n}\n\n.swal-icon--info {\n border-color: #3794d2\n}\n\n.swal-icon--info::after,\n.swal-icon--info::before {\n background-color: #3794d2\n}\n\n.swal-icon--error {\n border-color: #da4453\n}\n\n.swal-icon--error__line {\n background-color: #da4453\n}\n\n.swal-icon--warning {\n border-color: #f67400;\n animation: pulseWarning 0.5s infinite alternate\n}\n\n.swal-icon--warning__body,\n.swal-icon--warning__dot {\n background-color: #f67400;\n animation: pulseWarningBody 0.5s infinite alternate\n}\n\n@-webkit-keyframes pulseWarning {\n 0% {\n border-color: #ffaa60\n }\n\n to {\n border-color: #f67400\n }\n}\n\n@keyframes pulseWarning {\n 0% {\n border-color: #ffaa60\n }\n\n to {\n border-color: #f67400\n }\n}\n\n@-webkit-keyframes pulseWarningBody {\n 0% {\n background-color: #ffaa60\n }\n\n to {\n background-color: #f67400\n }\n}\n\n@keyframes pulseWarningBody {\n 0% {\n background-color: #ffaa60\n }\n\n to {\n background-color: #f67400\n }\n}\n\n.swal-icon--success {\n border-color: #27ae60\n}\n\n.swal-icon--success__line {\n background-color: #27ae60\n}\n\n.swal-icon--success__hide-corners {\n background-color: #2f2f2f\n}\n\n.swal-icon--success::after,\n.swal-icon--success::before {\n background: #2f2f2f\n}\n\n.swal-display-thumb-container {\n min-width: 200px;\n min-height: 200px;\n display: flex;\n align-items: center;\n justify-content: center\n}\n"]} \ No newline at end of file diff --git a/dist/css/thumbs.css b/dist/css/thumbs.css index d2fc5c4..256a782 100644 --- a/dist/css/thumbs.css +++ b/dist/css/thumbs.css @@ -1,2 +1,2 @@ -.image-container{flex:none;position:relative;width:224px;height:224px;margin:.75rem;padding:12px;background-color:#31363b;overflow:hidden;align-items:center;box-shadow:0 20px 60px rgba(10,10,10,.05),0 5px 10px rgba(10,10,10,.1),0 1px 1px rgba(10,10,10,.2)}.image-container .title{font-weight:400;word-break:break-all}.image-container .image{display:flex;height:100%;width:100%;align-items:center;justify-content:center}.image-container .image img{max-height:100%;max-width:100%;height:auto;width:auto}.image-container .controls{display:flex;position:absolute;top:12px;right:12px}.image-container .controls .button{border-radius:0}.image-container .controls .button:not(:active):not(:hover){color:#fff;background-color:rgba(49,54,59,.75)}.image-container .details{position:absolute;left:12px;bottom:12px;right:12px;background-color:rgba(49,54,59,.75);color:#eff0f1;padding:3px;font-size:.75rem}.image-container .details p{display:block;text-overflow:ellipsis;overflow:hidden}.image-container .details p span{font-weight:700} +.image-container{flex:none;position:relative;width:224px;height:224px;margin:.75rem;padding:11px;overflow:hidden;align-items:center;border:1px solid #585858}.image-container .title{font-weight:400;word-break:break-all}.image-container .image{display:flex;height:200px;width:200px;align-items:center;justify-content:center}.image-container .image img{max-height:100%;max-width:100%;height:auto;width:auto}.image-container .details{position:absolute;left:11px;bottom:11px;right:11px;background-color:rgba(0,0,0,.56078);color:#eff0f1;padding:3px;font-size:.75rem}.image-container .details p{display:block;text-overflow:ellipsis;overflow:hidden}.image-container .details p span{font-weight:700} /*# sourceMappingURL=thumbs.css.map */ diff --git a/dist/css/thumbs.css.map b/dist/css/thumbs.css.map index 06eb477..349a299 100644 --- a/dist/css/thumbs.css.map +++ b/dist/css/thumbs.css.map @@ -1 +1 @@ -{"version":3,"sources":["css/thumbs.css"],"names":[],"mappings":"AAAA,iBACE,SAAU,CACV,iBAAkB,CAClB,WAAY,CACZ,YAAa,CACb,aAAe,CACf,YAAa,CACb,wBAAyB,CACzB,eAAgB,CAChB,kBAAmB,CACnB,kGACF,CAEA,wBACE,eAAmB,CACnB,oBACF,CAEA,wBACE,YAAa,CACb,WAAY,CACZ,UAAW,CACX,kBAAmB,CACnB,sBACF,CAEA,4BACE,eAAgB,CAChB,cAAe,CACf,WAAY,CACZ,UACF,CAEA,2BACE,YAAa,CACb,iBAAkB,CAClB,QAAS,CACT,UACF,CAEA,mCACE,eACF,CAEA,4DACE,UAAW,CACX,mCACF,CAEA,0BACE,iBAAkB,CAClB,SAAU,CACV,WAAY,CACZ,UAAW,CACX,mCAAwC,CACxC,aAAc,CACd,WAAY,CACZ,gBACF,CAEA,4BACE,aAAc,CACd,sBAAuB,CACvB,eACF,CAEA,iCACE,eACF","file":"thumbs.css","sourcesContent":[".image-container {\n flex: none;\n position: relative;\n width: 224px;\n height: 224px;\n margin: 0.75rem;\n padding: 12px;\n background-color: #31363b;\n overflow: hidden;\n align-items: center;\n box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2)\n}\n\n.image-container .title {\n font-weight: normal;\n word-break: break-all\n}\n\n.image-container .image {\n display: flex;\n height: 100%;\n width: 100%;\n align-items: center;\n justify-content: center\n}\n\n.image-container .image img {\n max-height: 100%;\n max-width: 100%;\n height: auto;\n width: auto\n}\n\n.image-container .controls {\n display: flex;\n position: absolute;\n top: 12px;\n right: 12px\n}\n\n.image-container .controls .button {\n border-radius: 0\n}\n\n.image-container .controls .button:not(:active):not(:hover) {\n color: #fff;\n background-color: rgba(49, 54, 59, 0.75)\n}\n\n.image-container .details {\n position: absolute;\n left: 12px;\n bottom: 12px;\n right: 12px;\n background-color: rgba(49, 54, 59, 0.75);\n color: #eff0f1;\n padding: 3px;\n font-size: 0.75rem\n}\n\n.image-container .details p {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden\n}\n\n.image-container .details p span {\n font-weight: bold\n}\n"]} \ No newline at end of file +{"version":3,"sources":["css/thumbs.css"],"names":[],"mappings":"AAAA,iBACE,SAAU,CACV,iBAAkB,CAClB,WAAY,CACZ,YAAa,CACb,aAAe,CACf,YAAa,CACb,eAAgB,CAChB,kBAAmB,CACnB,wBACF,CAEA,wBACE,eAAmB,CACnB,oBACF,CAEA,wBACE,YAAa,CACb,YAAa,CACb,WAAY,CACZ,kBAAmB,CACnB,sBACF,CAEA,4BACE,eAAgB,CAChB,cAAe,CACf,WAAY,CACZ,UACF,CAEA,0BACE,iBAAkB,CAClB,SAAU,CACV,WAAY,CACZ,UAAW,CACX,mCAA2B,CAC3B,aAAc,CACd,WAAY,CACZ,gBACF,CAEA,4BACE,aAAc,CACd,sBAAuB,CACvB,eACF,CAEA,iCACE,eACF","file":"thumbs.css","sourcesContent":[".image-container {\n flex: none;\n position: relative;\n width: 224px;\n height: 224px;\n margin: 0.75rem;\n padding: 11px;\n overflow: hidden;\n align-items: center;\n border: 1px solid #585858\n}\n\n.image-container .title {\n font-weight: normal;\n word-break: break-all\n}\n\n.image-container .image {\n display: flex;\n height: 200px;\n width: 200px;\n align-items: center;\n justify-content: center\n}\n\n.image-container .image img {\n max-height: 100%;\n max-width: 100%;\n height: auto;\n width: auto\n}\n\n.image-container .details {\n position: absolute;\n left: 11px;\n bottom: 11px;\n right: 11px;\n background-color: #0000008f;\n color: #eff0f1;\n padding: 3px;\n font-size: 0.75rem\n}\n\n.image-container .details p {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden\n}\n\n.image-container .details p span {\n font-weight: bold\n}\n"]} \ No newline at end of file diff --git a/dist/js/home.js b/dist/js/home.js index 14ffc8c..b765aee 100644 --- a/dist/js/home.js +++ b/dist/js/home.js @@ -1,2 +1,2 @@ -var lsKeys={token:"token",chunkSize:"chunkSize",parallelUploads:"parallelUploads",uploadsHistoryOrder:"uploadsHistoryOrder",previewImages:"previewImages",fileLength:"fileLength",uploadAge:"uploadAge"},page={token:localStorage[lsKeys.token],private:null,enableUserAccounts:null,maxSize:null,chunkSize:null,temporaryUploadAges:null,fileIdentifierLength:null,album:null,parallelUploads:null,previewImages:null,fileLength:null,uploadAge:null,maxSizeBytes:null,urlMaxSize:null,urlMaxSizeBytes:null,tabs:[],activeTab:null,albumSelect:null,previewTemplate:null,dropzone:null,clipboardJS:null,lazyLoad:null,imageExts:[".webp",".jpg",".jpeg",".bmp",".gif",".png",".tiff",".tif",".svg"],videoExts:[".webm",".mp4",".wmv",".avi",".mov",".mkv"],albumTitleMaxLength:70,albumDescMaxLength:4e3,onInitError:function(e){document.querySelector("#albumDiv").classList.add("is-hidden"),document.querySelector("#tabs").classList.add("is-hidden"),document.querySelectorAll(".tab-content").forEach((function(e){return e.classList.add("is-hidden")}));var a=document.querySelector("#loginToUpload");a.innerText="An error occurred. Try to reload?",a.classList.remove("is-loading"),a.classList.remove("is-hidden"),a.addEventListener("click",(function(){location.reload()})),e.response?page.onAxiosError(e):page.onError(e)},onError:function(e){console.error(e);var a=document.createElement("div");return a.innerHTML=""+e.toString()+"",swal({title:"An error occurred!",icon:"error",content:a})},onAxiosError:function(e){console.error(e);var a={520:"Unknown Error",521:"Web Server Is Down",522:"Connection Timed Out",523:"Origin Is Unreachable",524:"A Timeout Occurred",525:"SSL Handshake Failed",526:"Invalid SSL Certificate",527:"Railgun Error",530:"Origin DNS Error"}[e.response.status]||e.response.statusText,t=e.response.data&&e.response.data.description?e.response.data.description:"There was an error with the request, please check the console for more information.";return swal(e.response.status+" "+a,t,"error")},checkIfPublic:function(){var e=!1;return axios.get("api/check",{onDownloadProgress:function(){e||"function"!=typeof page.doRender||(page.doRender(),e=!0)}}).then((function(e){return page.private=e.data.private,page.enableUserAccounts=e.data.enableUserAccounts,page.maxSize=parseInt(e.data.maxSize),page.maxSizeBytes=1e6*page.maxSize,page.chunkSize=parseInt(e.data.chunkSize),page.temporaryUploadAges=e.data.temporaryUploadAges,page.fileIdentifierLength=e.data.fileIdentifierLength,page.preparePage()})).catch(page.onInitError)},preparePage:function(){if(!page.private)return page.prepareUpload();if(page.token)return page.verifyToken(page.token,!0);var e=document.querySelector("#loginToUpload");e.href="auth",e.classList.remove("is-loading"),page.enableUserAccounts?e.innerText="Anonymous upload is disabled. Log in to upload.":e.innerText="Running in private mode. Log in to upload."},verifyToken:function(e,a){return axios.post("api/tokens/verify",{token:e}).then((function(t){return!1===t.data.success?swal({title:"An error occurred!",text:t.data.description,icon:"error"}).then((function(){a&&(localStorage.removeItem("token"),location.reload())})):(localStorage[lsKeys.token]=e,page.token=e,page.prepareUpload())})).catch(page.onInitError)},prepareUpload:function(){page.token&&(document.querySelector("#albumDiv").classList.remove("is-hidden"),page.albumSelect=document.querySelector("#albumSelect"),page.albumSelect.addEventListener("change",(function(){page.album=parseInt(page.albumSelect.value),"function"==typeof page.prepareShareX&&page.prepareShareX()})),page.fetchAlbums()),page.prepareUploadConfig(),document.querySelector("#maxSize > span").innerHTML=page.getPrettyBytes(page.maxSizeBytes),document.querySelector("#loginToUpload").classList.add("is-hidden"),!page.token&&page.enableUserAccounts&&(document.querySelector("#loginLinkText").innerHTML="Create an account and keep track of your uploads"),page.prepareDropzone(),"function"==typeof page.prepareShareX&&page.prepareShareX();var e=document.querySelector("#urlMaxSize");e&&(page.urlMaxSize=parseInt(e.innerHTML),page.urlMaxSizeBytes=1e6*page.urlMaxSize,e.innerHTML=page.getPrettyBytes(page.urlMaxSizeBytes),document.querySelector("#uploadUrls").addEventListener("click",(function(e){page.uploadUrls(e.currentTarget)})));for(var a=document.querySelector("#tabs"),t=a.querySelectorAll("li"),r=function(e){var a=t[e].dataset.id,r=document.querySelector("#"+a);r&&(t[e].addEventListener("click",(function(){page.setActiveTab(e)})),page.tabs.push({tab:t[e],content:r}))},n=0;n a"),r=e.previewElement.querySelector(".clipboard-mobile > .clipboard-js");t.href=t.innerHTML=r.dataset.clipboardText=a.url,r.parentElement.classList.remove("is-hidden");var n=/.[\w]+(\?|$)/.exec(a.url),l=n&&n[0]?n[0].toLowerCase():null;if(page.imageExts.includes(l))if(page.previewImages){var i=e.previewElement.querySelector("img");i.setAttribute("alt",a.name||""),i.dataset.src=a.url,i.classList.remove("is-hidden"),i.onerror=function(a){a.currentTarget.classList.add("is-hidden"),page.updateTemplateIcon(e.previewElement,"icon-picture")},page.lazyLoad.update(e.previewElement.querySelectorAll("img"))}else page.updateTemplateIcon(e.previewElement,"icon-picture");else page.videoExts.includes(l)?page.updateTemplateIcon(e.previewElement,"icon-video"):page.updateTemplateIcon(e.previewElement,"icon-doc-inv");if(a.expirydate){var o=e.previewElement.querySelector(".expiry-date");o.innerHTML="EXP: "+page.getPrettyDate(new Date(1e3*a.expirydate)),o.classList.remove("is-hidden")}}},createAlbum:function(){var e=document.createElement("div");e.innerHTML='\n
\n
\n \n
\n

Max length is '+page.albumTitleMaxLength+' characters.

\n
\n
\n
\n \n
\n

Max length is '+page.albumDescMaxLength+' characters.

\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n ',swal({title:"Create new album",icon:"info",content:e,buttons:{cancel:!0,confirm:{closeModal:!1}}}).then((function(e){if(e){var a=document.querySelector("#swalName").value.trim();axios.post("api/albums",{name:a,description:document.querySelector("#swalDescription").value.trim(),download:document.querySelector("#swalDownload").checked,public:document.querySelector("#swalPublic").checked},{headers:{token:page.token}}).then((function(e){if(!1===e.data.success)return swal("An error occurred!",e.data.description,"error");var t=document.createElement("option");page.albumSelect.appendChild(t),t.value=e.data.id,t.innerHTML=a,t.selected=!0,swal("Woohoo!","Album was created successfully.","success")})).catch(page.onError)}}))},prepareUploadConfig:function(){var e={chunkSize:page.chunkSize,parallelUploads:2};page.chunkSize=parseInt(localStorage[lsKeys.chunkSize])||e.chunkSize,page.parallelUploads=parseInt(localStorage[lsKeys.parallelUploads])||e.parallelUploads,document.querySelector("#chunkSize").value=page.chunkSize,document.querySelector("#parallelUploads").value=page.parallelUploads;var a={chunkSize:{min:1,max:95},parallelUploads:{min:1,max:10}};document.querySelector("#chunkSizeDiv .help").innerHTML="Default is "+e.chunkSize+" MB. Max is "+a.chunkSize.max+" MB.",document.querySelector("#parallelUploadsDiv .help").innerHTML="Default is "+e.parallelUploads+". Max is "+a.parallelUploads.max+".";var t=document.querySelector("#fileLengthDiv");if(page.fileIdentifierLength&&t){var r=document.querySelector("#fileLength"),n=parseInt(localStorage[lsKeys.fileLength]);e.fileLength=page.fileIdentifierLength.default;var l="Default is "+page.fileIdentifierLength.default+".",i="number"==typeof page.fileIdentifierLength.min&&"number"==typeof page.fileIdentifierLength.max;i&&(l+=" Min is "+page.fileIdentifierLength.min+". Max is "+page.fileIdentifierLength.max,a.fileLength={min:page.fileIdentifierLength.min,max:page.fileIdentifierLength.max}),page.fileIdentifierLength.force&&(l+=" This option is currently disabled.",r.disabled=!0),page.fileIdentifierLength.force||isNaN(n)||!i||npage.fileIdentifierLength.max?(r.value=e.fileLength,page.fileLength=null):(r.value=n,page.fileLength=n),t.classList.remove("is-hidden"),t.querySelector(".help").innerHTML=l}Object.keys(a).forEach((function(e){document.querySelector("#"+e).setAttribute("min",a[e].min),document.querySelector("#"+e).setAttribute("max",a[e].max)}));var o=document.querySelector("#uploadAgeDiv");if(Array.isArray(page.temporaryUploadAges)&&page.temporaryUploadAges.length&&o){for(var s=document.querySelector("#uploadAge"),c=parseFloat(localStorage[lsKeys.uploadAge]),p=0;p .uploads"),f=0;f0&&s!==e[l[i]]?localStorage[lsKeys[l[i]]]=s:localStorage.removeItem(lsKeys[l[i]])}swal({title:"Woohoo!",text:"Configuration saved into this browser.",icon:"success"}).then((function(){location.reload()}))}}))},getPrettyUploadAge:function(e){if(0===e)return"Permanent";if(e<1){var a=60*e;return a+" minute"+(1===a?"":"s")}if(e>=24){var t=e/24;return t+" day"+(1===t?"":"s")}return e+" hour"+(1===e?"":"s")}};window.addEventListener("paste",(function(e){for(var a=(e.clipboardData||e.originalEvent.clipboardData).items,t=Object.keys(a),r=0;r",swal({title:"An error occurred!",icon:"error",content:a})},onAxiosError:function(e){console.error(e);var a={520:"Unknown Error",521:"Web Server Is Down",522:"Connection Timed Out",523:"Origin Is Unreachable",524:"A Timeout Occurred",525:"SSL Handshake Failed",526:"Invalid SSL Certificate",527:"Railgun Error",530:"Origin DNS Error"}[e.response.status]||e.response.statusText,t=e.response.data&&e.response.data.description?e.response.data.description:"There was an error with the request, please check the console for more information.";return swal(e.response.status+" "+a,t,"error")},checkIfPublic:function(){var e=!1;return axios.get("api/check",{onDownloadProgress:function(){e||"function"!=typeof page.doRender||(page.doRender(),e=!0)}}).then((function(e){return page.private=e.data.private,page.enableUserAccounts=e.data.enableUserAccounts,page.maxSize=parseInt(e.data.maxSize),page.maxSizeBytes=1e6*page.maxSize,page.chunkSize=parseInt(e.data.chunkSize),page.temporaryUploadAges=e.data.temporaryUploadAges,page.fileIdentifierLength=e.data.fileIdentifierLength,page.preparePage()})).catch(page.onInitError)},preparePage:function(){if(!page.private)return page.prepareUpload();if(page.token)return page.verifyToken(page.token,!0);var e=document.querySelector("#loginToUpload");e.href="auth",e.classList.remove("is-loading"),page.enableUserAccounts?e.innerText="Anonymous upload is disabled. Log in to upload.":e.innerText="Running in private mode. Log in to upload."},verifyToken:function(e,a){return axios.post("api/tokens/verify",{token:e}).then((function(t){return!1===t.data.success?swal({title:"An error occurred!",text:t.data.description,icon:"error"}).then((function(){a&&(localStorage.removeItem("token"),location.reload())})):(localStorage[lsKeys.token]=e,page.token=e,page.prepareUpload())})).catch(page.onInitError)},prepareUpload:function(){page.token&&(document.querySelector("#albumDiv").classList.remove("is-hidden"),page.albumSelect=document.querySelector("#albumSelect"),page.albumSelect.addEventListener("change",(function(){page.album=parseInt(page.albumSelect.value),"function"==typeof page.prepareShareX&&page.prepareShareX()})),page.fetchAlbums()),page.prepareUploadConfig(),document.querySelector("#maxSize > span").innerHTML=page.getPrettyBytes(page.maxSizeBytes),document.querySelector("#loginToUpload").classList.add("is-hidden"),!page.token&&page.enableUserAccounts&&(document.querySelector("#loginLinkText").innerHTML="Create an account and keep track of your uploads"),page.prepareDropzone(),"function"==typeof page.prepareShareX&&page.prepareShareX();var e=document.querySelector("#urlMaxSize");e&&(page.urlMaxSize=parseInt(e.innerHTML),page.urlMaxSizeBytes=1e6*page.urlMaxSize,e.innerHTML=page.getPrettyBytes(page.urlMaxSizeBytes),document.querySelector("#uploadUrls").addEventListener("click",(function(e){page.uploadUrls(e.currentTarget)})));for(var a=document.querySelector("#tabs"),t=a.querySelectorAll("li"),r=function(e){var a=t[e].dataset.id,r=document.querySelector("#"+a);r&&(t[e].addEventListener("click",(function(){page.setActiveTab(e)})),page.tabs.push({tab:t[e],content:r}))},n=0;n a"),r=e.previewElement.querySelector(".clipboard-mobile > .clipboard-js");t.href=t.innerHTML=r.dataset.clipboardText=a.url,r.parentElement.classList.remove("is-hidden");var n=/.[\w]+(\?|$)/.exec(a.url),l=n&&n[0]?n[0].toLowerCase():null;if(page.imageExts.includes(l))if(page.previewImages){var i=e.previewElement.querySelector("img");i.setAttribute("alt",a.name||""),i.dataset.src=a.url,i.classList.remove("is-hidden"),i.onerror=function(a){a.currentTarget.classList.add("is-hidden"),page.updateTemplateIcon(e.previewElement,"icon-picture")},page.lazyLoad.update(e.previewElement.querySelectorAll("img"))}else page.updateTemplateIcon(e.previewElement,"icon-picture");else page.videoExts.includes(l)?page.updateTemplateIcon(e.previewElement,"icon-video"):page.updateTemplateIcon(e.previewElement,"icon-doc-inv");if(a.expirydate){var o=e.previewElement.querySelector(".expiry-date");o.innerHTML="EXP: "+page.getPrettyDate(new Date(1e3*a.expirydate)),o.classList.remove("is-hidden")}}},createAlbum:function(){var e=document.createElement("div");e.innerHTML='\n
\n
\n \n
\n

Max length is '+page.albumTitleMaxLength+' characters.

\n
\n
\n
\n \n
\n

Max length is '+page.albumDescMaxLength+' characters.

\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n ',swal({title:"Create new album",icon:"info",content:e,buttons:{cancel:!0,confirm:{closeModal:!1}}}).then((function(e){if(e){var a=document.querySelector("#swalName").value.trim();axios.post("api/albums",{name:a,description:document.querySelector("#swalDescription").value.trim(),download:document.querySelector("#swalDownload").checked,public:document.querySelector("#swalPublic").checked},{headers:{token:page.token}}).then((function(e){if(!1===e.data.success)return swal("An error occurred!",e.data.description,"error");var t=document.createElement("option");page.albumSelect.appendChild(t),t.value=e.data.id,t.innerHTML=a,t.selected=!0,swal("Woohoo!","Album was created successfully.","success")})).catch(page.onError)}}))},prepareUploadConfig:function(){var e={chunkSize:page.chunkSize,parallelUploads:2};page.chunkSize=parseInt(localStorage[lsKeys.chunkSize])||e.chunkSize,page.parallelUploads=parseInt(localStorage[lsKeys.parallelUploads])||e.parallelUploads,document.querySelector("#chunkSize").value=page.chunkSize,document.querySelector("#parallelUploads").value=page.parallelUploads;var a={chunkSize:{min:1,max:95},parallelUploads:{min:1,max:10}};document.querySelector("#chunkSizeDiv .help").innerHTML="Default is "+e.chunkSize+" MB. Max is "+a.chunkSize.max+" MB.",document.querySelector("#parallelUploadsDiv .help").innerHTML="Default is "+e.parallelUploads+". Max is "+a.parallelUploads.max+".";var t=document.querySelector("#fileLengthDiv");if(page.fileIdentifierLength&&t){var r=document.querySelector("#fileLength"),n=parseInt(localStorage[lsKeys.fileLength]);e.fileLength=page.fileIdentifierLength.default;var l="Default is "+page.fileIdentifierLength.default+".",i="number"==typeof page.fileIdentifierLength.min&&"number"==typeof page.fileIdentifierLength.max;i&&(l+=" Min is "+page.fileIdentifierLength.min+". Max is "+page.fileIdentifierLength.max,a.fileLength={min:page.fileIdentifierLength.min,max:page.fileIdentifierLength.max}),page.fileIdentifierLength.force&&(l+=" This option is currently disabled.",r.disabled=!0),page.fileIdentifierLength.force||isNaN(n)||!i||npage.fileIdentifierLength.max?(r.value=e.fileLength,page.fileLength=null):(r.value=n,page.fileLength=n),t.classList.remove("is-hidden"),t.querySelector(".help").innerHTML=l}Object.keys(a).forEach((function(e){document.querySelector("#"+e).setAttribute("min",a[e].min),document.querySelector("#"+e).setAttribute("max",a[e].max)}));var o=document.querySelector("#uploadAgeDiv");if(Array.isArray(page.temporaryUploadAges)&&page.temporaryUploadAges.length&&o){for(var s=document.querySelector("#uploadAge"),c=parseFloat(localStorage[lsKeys.uploadAge]),p=0;p .uploads"),f=0;f0&&s!==e[l[i]]?localStorage[lsKeys[l[i]]]=s:localStorage.removeItem(lsKeys[l[i]])}swal({title:"Woohoo!",text:"Configuration saved into this browser.",icon:"success"}).then((function(){location.reload()}))}}))},getPrettyUploadAge:function(e){if(0===e)return"Permanent";if(e<1){var a=60*e;return a+" minute"+(1===a?"":"s")}if(e>=24){var t=e/24;return t+" day"+(1===t?"":"s")}return e+" hour"+(1===e?"":"s")}};window.addEventListener("paste",(function(e){for(var a=(e.clipboardData||e.originalEvent.clipboardData).items,t=Object.keys(a),r=0;r {\n // Hide these elements\n document.querySelector('#albumDiv').classList.add('is-hidden')\n document.querySelector('#tabs').classList.add('is-hidden')\n document.querySelectorAll('.tab-content').forEach(element => {\n return element.classList.add('is-hidden')\n })\n\n // Update upload button\n const uploadButton = document.querySelector('#loginToUpload')\n uploadButton.innerText = 'An error occurred. Try to reload?'\n uploadButton.classList.remove('is-loading')\n uploadButton.classList.remove('is-hidden')\n\n uploadButton.addEventListener('click', () => {\n location.reload()\n })\n\n if (error.response)\n page.onAxiosError(error)\n else\n page.onError(error)\n}\n\n// Handler for regular JS errors\npage.onError = error => {\n console.error(error)\n\n const content = document.createElement('div')\n content.innerHTML = `${error.toString()}`\n return swal({\n title: 'An error occurred!',\n icon: 'error',\n content\n })\n}\n\n// Handler for Axios errors\npage.onAxiosError = error => {\n console.error(error)\n\n // Better Cloudflare errors\n const cloudflareErrors = {\n 520: 'Unknown Error',\n 521: 'Web Server Is Down',\n 522: 'Connection Timed Out',\n 523: 'Origin Is Unreachable',\n 524: 'A Timeout Occurred',\n 525: 'SSL Handshake Failed',\n 526: 'Invalid SSL Certificate',\n 527: 'Railgun Error',\n 530: 'Origin DNS Error'\n }\n\n const statusText = cloudflareErrors[error.response.status] || error.response.statusText\n const description = error.response.data && error.response.data.description\n ? error.response.data.description\n : 'There was an error with the request, please check the console for more information.'\n\n return swal(`${error.response.status} ${statusText}`, description, 'error')\n}\n\npage.checkIfPublic = () => {\n let renderShown = false\n return axios.get('api/check', {\n onDownloadProgress: () => {\n // Only show render after this request has been initiated\n if (!renderShown && typeof page.doRender === 'function') {\n page.doRender()\n renderShown = true\n }\n }\n }).then(response => {\n page.private = response.data.private\n page.enableUserAccounts = response.data.enableUserAccounts\n page.maxSize = parseInt(response.data.maxSize)\n page.maxSizeBytes = page.maxSize * 1e6\n page.chunkSize = parseInt(response.data.chunkSize)\n page.temporaryUploadAges = response.data.temporaryUploadAges\n page.fileIdentifierLength = response.data.fileIdentifierLength\n return page.preparePage()\n }).catch(page.onInitError)\n}\n\npage.preparePage = () => {\n if (page.private)\n if (page.token) {\n return page.verifyToken(page.token, true)\n } else {\n const button = document.querySelector('#loginToUpload')\n button.href = 'auth'\n button.classList.remove('is-loading')\n if (page.enableUserAccounts)\n button.innerText = 'Anonymous upload is disabled. Log in to upload.'\n else\n button.innerText = 'Running in private mode. Log in to upload.'\n }\n else\n return page.prepareUpload()\n}\n\npage.verifyToken = (token, reloadOnError) => {\n return axios.post('api/tokens/verify', { token }).then(response => {\n if (response.data.success === false)\n return swal({\n title: 'An error occurred!',\n text: response.data.description,\n icon: 'error'\n }).then(() => {\n if (!reloadOnError) return\n localStorage.removeItem('token')\n location.reload()\n })\n\n localStorage[lsKeys.token] = token\n page.token = token\n return page.prepareUpload()\n }).catch(page.onInitError)\n}\n\npage.prepareUpload = () => {\n // I think this fits best here because we need to check for a valid token before we can get the albums\n if (page.token) {\n // Display the album selection\n document.querySelector('#albumDiv').classList.remove('is-hidden')\n\n page.albumSelect = document.querySelector('#albumSelect')\n page.albumSelect.addEventListener('change', () => {\n page.album = parseInt(page.albumSelect.value)\n // Re-generate ShareX config file\n if (typeof page.prepareShareX === 'function')\n page.prepareShareX()\n })\n\n // Fetch albums\n page.fetchAlbums()\n }\n\n // Prepare & generate config tab\n page.prepareUploadConfig()\n\n // Update elements wherever applicable\n document.querySelector('#maxSize > span').innerHTML = page.getPrettyBytes(page.maxSizeBytes)\n document.querySelector('#loginToUpload').classList.add('is-hidden')\n\n if (!page.token && page.enableUserAccounts)\n document.querySelector('#loginLinkText').innerHTML = 'Create an account and keep track of your uploads'\n\n // Prepare & generate files upload tab\n page.prepareDropzone()\n\n // Generate ShareX config file\n if (typeof page.prepareShareX === 'function')\n page.prepareShareX()\n\n // Prepare urls upload tab\n const urlMaxSize = document.querySelector('#urlMaxSize')\n if (urlMaxSize) {\n page.urlMaxSize = parseInt(urlMaxSize.innerHTML)\n page.urlMaxSizeBytes = page.urlMaxSize * 1e6\n urlMaxSize.innerHTML = page.getPrettyBytes(page.urlMaxSizeBytes)\n document.querySelector('#uploadUrls').addEventListener('click', event => {\n page.uploadUrls(event.currentTarget)\n })\n }\n\n // Get all tabs\n const tabsContainer = document.querySelector('#tabs')\n const tabs = tabsContainer.querySelectorAll('li')\n for (let i = 0; i < tabs.length; i++) {\n const id = tabs[i].dataset.id\n const tabContent = document.querySelector(`#${id}`)\n if (!tabContent) continue\n\n tabs[i].addEventListener('click', () => {\n page.setActiveTab(i)\n })\n page.tabs.push({ tab: tabs[i], content: tabContent })\n }\n\n // Set first valid tab as the default active tab\n if (page.tabs.length) {\n page.setActiveTab(0)\n tabsContainer.classList.remove('is-hidden')\n }\n}\n\npage.setActiveTab = index => {\n for (let i = 0; i < page.tabs.length; i++)\n if (i === index) {\n page.tabs[i].tab.classList.add('is-active')\n page.tabs[i].content.classList.remove('is-hidden')\n page.activeTab = index\n } else {\n page.tabs[i].tab.classList.remove('is-active')\n page.tabs[i].content.classList.add('is-hidden')\n }\n}\n\npage.fetchAlbums = () => {\n return axios.get('api/albums', { headers: { token: page.token } }).then(response => {\n if (response.data.success === false)\n return swal('An error occurred!', response.data.description, 'error')\n\n // Create an option for each album\n if (Array.isArray(response.data.albums) && response.data.albums.length)\n for (let i = 0; i < response.data.albums.length; i++) {\n const album = response.data.albums[i]\n const option = document.createElement('option')\n option.value = album.id\n option.innerHTML = album.name\n page.albumSelect.appendChild(option)\n }\n }).catch(page.onInitError)\n}\n\npage.prepareDropzone = () => {\n // Parse template element\n const previewNode = document.querySelector('#tpl')\n page.previewTemplate = previewNode.innerHTML\n previewNode.parentNode.removeChild(previewNode)\n\n // Generate files upload tab\n const tabDiv = document.querySelector('#tab-files')\n const div = document.createElement('div')\n div.className = 'control is-expanded'\n div.innerHTML = `\n
\n \n \n \n Click here or drag & drop files\n
\n `\n tabDiv.querySelector('.dz-container').appendChild(div)\n\n const previewsContainer = tabDiv.querySelector('#tab-files .field.uploads')\n\n page.dropzone = new Dropzone(document.body, {\n url: 'api/upload',\n paramName: 'files[]',\n clickable: tabDiv.querySelector('#dropzone'),\n maxFilesize: page.maxSizeBytes / 1024 / 1024, // this option expects MiB\n parallelUploads: page.parallelUploads,\n uploadMultiple: false,\n previewsContainer,\n previewTemplate: page.previewTemplate,\n createImageThumbnails: false,\n autoProcessQueue: true,\n headers: { token: page.token },\n chunking: Boolean(page.chunkSize),\n chunkSize: page.chunkSize * 1e6, // the option below expects Bytes\n parallelChunkUploads: false, // when set to true, it often hangs with hundreds of parallel uploads\n chunksUploaded (file, done) {\n file.previewElement.querySelector('.progress').setAttribute('value', 100)\n file.previewElement.querySelector('.progress').innerHTML = '100%'\n\n return axios.post('api/upload/finishchunks', {\n // This API supports an array of multiple files\n files: [{\n uuid: file.upload.uuid,\n original: file.name,\n type: file.type,\n albumid: page.album,\n filelength: page.fileLength,\n age: page.uploadAge\n }]\n }, { headers: { token: page.token } }).catch(error => {\n // Format error for display purpose\n return error.response.data ? error.response : {\n data: {\n success: false,\n description: error.toString()\n }\n }\n }).then(response => {\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n\n if (response.data.success === false)\n file.previewElement.querySelector('.error').innerHTML = response.data.description\n\n if (response.data.files && response.data.files[0])\n page.updateTemplate(file, response.data.files[0])\n\n return done()\n })\n }\n })\n\n page.dropzone.on('addedfile', file => {\n // Set active tab to file uploads, if necessary\n if (page.activeTab !== 0)\n page.setActiveTab(0)\n // Add file entry\n tabDiv.querySelector('.uploads').classList.remove('is-hidden')\n file.previewElement.querySelector('.name').innerHTML = file.name\n })\n\n page.dropzone.on('sending', (file, xhr) => {\n if (file.upload.chunked) return\n // Add headers if not uploading chunks\n if (page.album !== null) xhr.setRequestHeader('albumid', page.album)\n if (page.fileLength !== null) xhr.setRequestHeader('filelength', page.fileLength)\n if (page.uploadAge !== null) xhr.setRequestHeader('age', page.uploadAge)\n })\n\n // Update the total progress bar\n page.dropzone.on('uploadprogress', (file, progress) => {\n // For some reason, chunked uploads fire 100% progress event\n // for each chunk's successful uploads\n if (file.upload.chunked && progress === 100) return\n file.previewElement.querySelector('.progress').setAttribute('value', progress)\n file.previewElement.querySelector('.progress').innerHTML = `${progress}%`\n })\n\n page.dropzone.on('success', (file, response) => {\n if (!response) return\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n\n if (response.success === false)\n file.previewElement.querySelector('.error').innerHTML = response.description\n\n if (response.files && response.files[0])\n page.updateTemplate(file, response.files[0])\n })\n\n page.dropzone.on('error', (file, error) => {\n // Clean up file size errors\n if ((typeof error === 'string' && /^File is too big/.test(error)) ||\n (typeof error === 'object' && /File too large/.test(error.description)))\n error = `File too large (${page.getPrettyBytes(file.size)}).`\n\n page.updateTemplateIcon(file.previewElement, 'icon-block')\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n file.previewElement.querySelector('.name').innerHTML = file.name\n file.previewElement.querySelector('.error').innerHTML = error.description || error\n })\n}\n\npage.uploadUrls = button => {\n const tabDiv = document.querySelector('#tab-urls')\n if (!tabDiv || button.classList.contains('is-loading'))\n return\n\n button.classList.add('is-loading')\n\n function done (error) {\n if (error) swal('An error occurred!', error, 'error')\n button.classList.remove('is-loading')\n }\n\n function run () {\n const headers = {\n token: page.token,\n albumid: page.album,\n age: page.uploadAge,\n filelength: page.fileLength\n }\n\n const previewsContainer = tabDiv.querySelector('.uploads')\n const urls = document.querySelector('#urls').value\n .split(/\\r?\\n/)\n .filter(url => {\n return url.trim().length\n })\n document.querySelector('#urls').value = urls.join('\\n')\n\n if (!urls.length)\n return done('You have not entered any URLs.')\n\n tabDiv.querySelector('.uploads').classList.remove('is-hidden')\n const files = urls.map(url => {\n const previewTemplate = document.createElement('template')\n previewTemplate.innerHTML = page.previewTemplate.trim()\n const previewElement = previewTemplate.content.firstChild\n previewElement.querySelector('.name').innerHTML = url\n previewsContainer.appendChild(previewElement)\n return { url, previewElement }\n })\n\n function post (i) {\n if (i === files.length)\n return done()\n\n function posted (result) {\n files[i].previewElement.querySelector('.progress').classList.add('is-hidden')\n if (result.success) {\n page.updateTemplate(files[i], result.files[0])\n } else {\n page.updateTemplateIcon(files[i].previewElement, 'icon-block')\n files[i].previewElement.querySelector('.error').innerHTML = result.description\n }\n return post(i + 1)\n }\n\n // Animate progress bar\n files[i].previewElement.querySelector('.progress').removeAttribute('value')\n\n return axios.post('api/upload', { urls: [files[i].url] }, { headers }).then(response => {\n return posted(response.data)\n }).catch(error => {\n return posted({\n success: false,\n description: error.response ? error.response.data.description : error.toString()\n })\n })\n }\n return post(0)\n }\n return run()\n}\n\npage.updateTemplateIcon = (templateElement, iconClass) => {\n const iconElement = templateElement.querySelector('.icon')\n if (!iconElement) return\n iconElement.classList.add(iconClass)\n iconElement.classList.remove('is-hidden')\n}\n\npage.updateTemplate = (file, response) => {\n if (!response.url) return\n\n const a = file.previewElement.querySelector('.link > a')\n const clipboard = file.previewElement.querySelector('.clipboard-mobile > .clipboard-js')\n a.href = a.innerHTML = clipboard.dataset.clipboardText = response.url\n clipboard.parentElement.classList.remove('is-hidden')\n\n const exec = /.[\\w]+(\\?|$)/.exec(response.url)\n const extname = exec && exec[0]\n ? exec[0].toLowerCase()\n : null\n\n if (page.imageExts.includes(extname))\n if (page.previewImages) {\n const img = file.previewElement.querySelector('img')\n img.setAttribute('alt', response.name || '')\n img.dataset.src = response.url\n img.classList.remove('is-hidden')\n img.onerror = event => {\n // Hide image elements that fail to load\n // Consequently include WEBP in browsers that do not have WEBP support (e.i. IE)\n event.currentTarget.classList.add('is-hidden')\n page.updateTemplateIcon(file.previewElement, 'icon-picture')\n }\n page.lazyLoad.update(file.previewElement.querySelectorAll('img'))\n } else {\n page.updateTemplateIcon(file.previewElement, 'icon-picture')\n }\n else if (page.videoExts.includes(extname))\n page.updateTemplateIcon(file.previewElement, 'icon-video')\n else\n page.updateTemplateIcon(file.previewElement, 'icon-doc-inv')\n\n if (response.expirydate) {\n const expiryDate = file.previewElement.querySelector('.expiry-date')\n expiryDate.innerHTML = `EXP: ${page.getPrettyDate(new Date(response.expirydate * 1000))}`\n expiryDate.classList.remove('is-hidden')\n }\n}\n\npage.createAlbum = () => {\n const div = document.createElement('div')\n div.innerHTML = `\n
\n
\n \n
\n

Max length is ${page.albumTitleMaxLength} characters.

\n
\n
\n
\n \n
\n

Max length is ${page.albumDescMaxLength} characters.

\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n `\n\n swal({\n title: 'Create new album',\n icon: 'info',\n content: div,\n buttons: {\n cancel: true,\n confirm: {\n closeModal: false\n }\n }\n }).then(value => {\n if (!value) return\n\n const name = document.querySelector('#swalName').value.trim()\n axios.post('api/albums', {\n name,\n description: document.querySelector('#swalDescription').value.trim(),\n download: document.querySelector('#swalDownload').checked,\n public: document.querySelector('#swalPublic').checked\n }, {\n headers: {\n token: page.token\n }\n }).then(response => {\n if (response.data.success === false)\n return swal('An error occurred!', response.data.description, 'error')\n\n const option = document.createElement('option')\n page.albumSelect.appendChild(option)\n option.value = response.data.id\n option.innerHTML = name\n option.selected = true\n\n swal('Woohoo!', 'Album was created successfully.', 'success')\n }).catch(page.onError)\n })\n}\n\npage.prepareUploadConfig = () => {\n const fallback = {\n chunkSize: page.chunkSize,\n parallelUploads: 2\n }\n\n page.chunkSize = parseInt(localStorage[lsKeys.chunkSize]) || fallback.chunkSize\n page.parallelUploads = parseInt(localStorage[lsKeys.parallelUploads]) || fallback.parallelUploads\n document.querySelector('#chunkSize').value = page.chunkSize\n document.querySelector('#parallelUploads').value = page.parallelUploads\n\n const numConfig = {\n chunkSize: { min: 1, max: 95 },\n parallelUploads: { min: 1, max: 10 }\n }\n\n document.querySelector('#chunkSizeDiv .help').innerHTML =\n `Default is ${fallback.chunkSize} MB. Max is ${numConfig.chunkSize.max} MB.`\n document.querySelector('#parallelUploadsDiv .help').innerHTML =\n `Default is ${fallback.parallelUploads}. Max is ${numConfig.parallelUploads.max}.`\n\n const fileLengthDiv = document.querySelector('#fileLengthDiv')\n if (page.fileIdentifierLength && fileLengthDiv) {\n const element = document.querySelector('#fileLength')\n const stored = parseInt(localStorage[lsKeys.fileLength])\n\n fallback.fileLength = page.fileIdentifierLength.default\n let helpText = `Default is ${page.fileIdentifierLength.default}.`\n\n const range = typeof page.fileIdentifierLength.min === 'number' &&\n typeof page.fileIdentifierLength.max === 'number'\n\n if (range) {\n helpText += ` Min is ${page.fileIdentifierLength.min}. Max is ${page.fileIdentifierLength.max}`\n numConfig.fileLength = {\n min: page.fileIdentifierLength.min,\n max: page.fileIdentifierLength.max\n }\n }\n\n if (page.fileIdentifierLength.force) {\n helpText += ' This option is currently disabled.'\n element.disabled = true\n }\n\n if (page.fileIdentifierLength.force ||\n isNaN(stored) ||\n !range ||\n stored < page.fileIdentifierLength.min ||\n stored > page.fileIdentifierLength.max) {\n element.value = fallback.fileLength\n page.fileLength = null\n } else {\n element.value = stored\n page.fileLength = stored\n }\n\n fileLengthDiv.classList.remove('is-hidden')\n fileLengthDiv.querySelector('.help').innerHTML = helpText\n }\n\n Object.keys(numConfig).forEach(key => {\n document.querySelector(`#${key}`).setAttribute('min', numConfig[key].min)\n document.querySelector(`#${key}`).setAttribute('max', numConfig[key].max)\n })\n\n const uploadAgeDiv = document.querySelector('#uploadAgeDiv')\n if (Array.isArray(page.temporaryUploadAges) && page.temporaryUploadAges.length && uploadAgeDiv) {\n const element = document.querySelector('#uploadAge')\n const stored = parseFloat(localStorage[lsKeys.uploadAge])\n for (let i = 0; i < page.temporaryUploadAges.length; i++) {\n const age = page.temporaryUploadAges[i]\n const option = document.createElement('option')\n option.value = i === 0 ? 'default' : age\n option.innerHTML = page.getPrettyUploadAge(age) +\n (i === 0 ? ' (default)' : '')\n element.appendChild(option)\n if (age === stored) {\n element.value = option.value\n page.uploadAge = stored\n }\n }\n uploadAgeDiv.classList.remove('is-hidden')\n }\n\n const tabContent = document.querySelector('#tab-config')\n const form = tabContent.querySelector('form')\n form.addEventListener('submit', event => {\n event.preventDefault()\n })\n\n const siBytes = localStorage[lsKeys.siBytes] !== '0'\n if (!siBytes) document.querySelector('#siBytes').value = '0'\n\n const olderOnTop = localStorage[lsKeys.uploadsHistoryOrder] !== '0'\n if (!olderOnTop) {\n document.querySelector('#uploadsHistoryOrder').value = '0'\n const uploadFields = document.querySelectorAll('.tab-content > .uploads')\n for (let i = 0; i < uploadFields.length; i++)\n uploadFields[i].classList.add('is-reversed')\n }\n\n page.previewImages = localStorage[lsKeys.previewImages] !== '0'\n if (!page.previewImages) document.querySelector('#previewImages').value = '0'\n\n document.querySelector('#saveConfig').addEventListener('click', () => {\n if (!form.checkValidity())\n return\n\n const prefKeys = ['siBytes', 'uploadsHistoryOrder', 'previewImages', 'uploadAge']\n for (let i = 0; i < prefKeys.length; i++) {\n const value = form.elements[prefKeys[i]].value\n if (value !== 'default' && value !== fallback[prefKeys[i]])\n localStorage[lsKeys[prefKeys[i]]] = value\n else\n localStorage.removeItem(lsKeys[prefKeys[i]])\n }\n\n const numKeys = Object.keys(numConfig)\n for (let i = 0; i < numKeys.length; i++) {\n const parsed = parseInt(form.elements[numKeys[i]].value) || 0\n const value = Math.min(Math.max(parsed, numConfig[numKeys[i]].min), numConfig[numKeys[i]].max)\n if (value > 0 && value !== fallback[numKeys[i]])\n localStorage[lsKeys[numKeys[i]]] = value\n else\n localStorage.removeItem(lsKeys[numKeys[i]])\n }\n\n swal({\n title: 'Woohoo!',\n text: 'Configuration saved into this browser.',\n icon: 'success'\n }).then(() => {\n location.reload()\n })\n })\n}\n\npage.getPrettyUploadAge = hours => {\n if (hours === 0) {\n return 'Permanent'\n } else if (hours < 1) {\n const minutes = hours * 60\n return `${minutes} minute${minutes === 1 ? '' : 's'}`\n } else if (hours >= 24) {\n const days = hours / 24\n return `${days} day${days === 1 ? '' : 's'}`\n } else {\n return `${hours} hour${hours === 1 ? '' : 's'}`\n }\n}\n\n// Handle image paste event\nwindow.addEventListener('paste', event => {\n const items = (event.clipboardData || event.originalEvent.clipboardData).items\n const index = Object.keys(items)\n for (let i = 0; i < index.length; i++) {\n const item = items[index[i]]\n if (item.kind === 'file') {\n const blob = item.getAsFile()\n const file = new File([blob], `pasted-image.${blob.type.match(/(?:[^/]*\\/)([^;]*)/)[1]}`, {\n type: blob.type\n })\n page.dropzone.addFile(file)\n }\n }\n})\n\nwindow.onload = () => {\n page.checkIfPublic()\n\n page.clipboardJS = new ClipboardJS('.clipboard-js')\n\n page.clipboardJS.on('success', () => {\n return swal('Copied!', 'The link has been copied to clipboard.', 'success')\n })\n\n page.clipboardJS.on('error', page.onError)\n\n page.lazyLoad = new LazyLoad({\n elements_selector: '.field.uploads img'\n })\n\n document.querySelector('#createAlbum').addEventListener('click', () => {\n page.createAlbum()\n })\n}\n"]} \ No newline at end of file +{"version":3,"sources":["home.js"],"names":["const","lsKeys","token","chunkSize","parallelUploads","uploadsHistoryOrder","previewImages","fileLength","uploadAge","page","localStorage","private","enableUserAccounts","maxSize","temporaryUploadAges","fileIdentifierLength","album","maxSizeBytes","urlMaxSize","urlMaxSizeBytes","tabs","activeTab","albumSelect","previewTemplate","dropzone","clipboardJS","lazyLoad","imageExts","videoExts","albumTitleMaxLength","albumDescMaxLength","onInitError","error","document","querySelector","classList","add","querySelectorAll","forEach","element","uploadButton","innerText","remove","addEventListener","location","reload","response","onAxiosError","onError","console","content","createElement","innerHTML","toString","swal","title","icon","statusText","520","521","522","523","524","525","526","527","530","status","description","data","checkIfPublic","let","renderShown","axios","get","onDownloadProgress","doRender","then","parseInt","preparePage","catch","prepareUpload","verifyToken","button","href","reloadOnError","post","success","text","removeItem","value","prepareShareX","fetchAlbums","prepareUploadConfig","getPrettyBytes","prepareDropzone","event","uploadUrls","currentTarget","tabsContainer","loop","i","id","dataset","tabContent","setActiveTab","push","tab","length","index","headers","Array","isArray","albums","option","name","appendChild","previewNode","parentNode","removeChild","tabDiv","div","className","previewsContainer","Dropzone","body","url","paramName","clickable","maxFilesize","uploadMultiple","createImageThumbnails","autoProcessQueue","chunking","Boolean","parallelChunkUploads","chunksUploaded","file","done","previewElement","setAttribute","files","uuid","upload","original","type","albumid","filelength","age","updateTemplate","on","xhr","chunked","setRequestHeader","progress","test","size","updateTemplateIcon","contains","urls","split","filter","trim","join","map","firstChild","posted","result","removeAttribute","run","templateElement","iconClass","iconElement","a","clipboard","clipboardText","parentElement","exec","extname","toLowerCase","includes","img","src","onerror","update","expirydate","expiryDate","getPrettyDate","Date","createAlbum","buttons","cancel","confirm","closeModal","download","checked","public","selected","fallback","numConfig","min","max","fileLengthDiv","stored","default","helpText","range","force","disabled","isNaN","Object","keys","key","uploadAgeDiv","parseFloat","getPrettyUploadAge","form","preventDefault","siBytes","uploadFields","checkValidity","prefKeys","elements","numKeys","parsed","Math","hours","minutes","days","window","items","clipboardData","originalEvent","item","kind","blob","getAsFile","File","match","addFile","onload","ClipboardJS","LazyLoad","elements_selector"],"mappings":"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","file":"home.js","sourcesContent":["/* global swal, axios, Dropzone, ClipboardJS, LazyLoad */\n\nconst lsKeys = {\n token: 'token',\n chunkSize: 'chunkSize',\n parallelUploads: 'parallelUploads',\n uploadsHistoryOrder: 'uploadsHistoryOrder',\n previewImages: 'previewImages',\n fileLength: 'fileLength',\n uploadAge: 'uploadAge'\n}\n\nconst page = {\n // user token\n token: localStorage[lsKeys.token],\n\n // configs from api/check\n private: null,\n enableUserAccounts: null,\n maxSize: null,\n chunkSize: null,\n temporaryUploadAges: null,\n fileIdentifierLength: null,\n\n // store album id that will be used with upload requests\n album: null,\n\n parallelUploads: null,\n previewImages: null,\n fileLength: null,\n uploadAge: null,\n\n maxSizeBytes: null,\n urlMaxSize: null,\n urlMaxSizeBytes: null,\n\n tabs: [],\n activeTab: null,\n albumSelect: null,\n previewTemplate: null,\n\n dropzone: null,\n clipboardJS: null,\n lazyLoad: null,\n\n // Include BMP for uploads preview only, cause the real images will be used\n // Sharp isn't capable of making their thumbnails for dashboard and album public pages\n imageExts: ['.webp', '.jpg', '.jpeg', '.bmp', '.gif', '.png', '.tiff', '.tif', '.svg'],\n videoExts: ['.webm', '.mp4', '.wmv', '.avi', '.mov', '.mkv'],\n\n albumTitleMaxLength: 70,\n albumDescMaxLength: 4000\n}\n\n// Handler for errors during initialization\npage.onInitError = error => {\n // Hide these elements\n document.querySelector('#albumDiv').classList.add('is-hidden')\n document.querySelector('#tabs').classList.add('is-hidden')\n document.querySelectorAll('.tab-content').forEach(element => {\n return element.classList.add('is-hidden')\n })\n\n // Update upload button\n const uploadButton = document.querySelector('#loginToUpload')\n uploadButton.innerText = 'An error occurred. Try to reload?'\n uploadButton.classList.remove('is-loading')\n uploadButton.classList.remove('is-hidden')\n\n uploadButton.addEventListener('click', () => {\n location.reload()\n })\n\n if (error.response)\n page.onAxiosError(error)\n else\n page.onError(error)\n}\n\n// Handler for regular JS errors\npage.onError = error => {\n console.error(error)\n\n const content = document.createElement('div')\n content.innerHTML = `${error.toString()}`\n return swal({\n title: 'An error occurred!',\n icon: 'error',\n content\n })\n}\n\n// Handler for Axios errors\npage.onAxiosError = error => {\n console.error(error)\n\n // Better Cloudflare errors\n const cloudflareErrors = {\n 520: 'Unknown Error',\n 521: 'Web Server Is Down',\n 522: 'Connection Timed Out',\n 523: 'Origin Is Unreachable',\n 524: 'A Timeout Occurred',\n 525: 'SSL Handshake Failed',\n 526: 'Invalid SSL Certificate',\n 527: 'Railgun Error',\n 530: 'Origin DNS Error'\n }\n\n const statusText = cloudflareErrors[error.response.status] || error.response.statusText\n const description = error.response.data && error.response.data.description\n ? error.response.data.description\n : 'There was an error with the request, please check the console for more information.'\n\n return swal(`${error.response.status} ${statusText}`, description, 'error')\n}\n\npage.checkIfPublic = () => {\n let renderShown = false\n return axios.get('api/check', {\n onDownloadProgress: () => {\n // Only show render after this request has been initiated\n if (!renderShown && typeof page.doRender === 'function') {\n page.doRender()\n renderShown = true\n }\n }\n }).then(response => {\n page.private = response.data.private\n page.enableUserAccounts = response.data.enableUserAccounts\n page.maxSize = parseInt(response.data.maxSize)\n page.maxSizeBytes = page.maxSize * 1e6\n page.chunkSize = parseInt(response.data.chunkSize)\n page.temporaryUploadAges = response.data.temporaryUploadAges\n page.fileIdentifierLength = response.data.fileIdentifierLength\n return page.preparePage()\n }).catch(page.onInitError)\n}\n\npage.preparePage = () => {\n if (page.private)\n if (page.token) {\n return page.verifyToken(page.token, true)\n } else {\n const button = document.querySelector('#loginToUpload')\n button.href = 'auth'\n button.classList.remove('is-loading')\n if (page.enableUserAccounts)\n button.innerText = 'Anonymous upload is disabled. Log in to upload.'\n else\n button.innerText = 'Running in private mode. Log in to upload.'\n }\n else\n return page.prepareUpload()\n}\n\npage.verifyToken = (token, reloadOnError) => {\n return axios.post('api/tokens/verify', { token }).then(response => {\n if (response.data.success === false)\n return swal({\n title: 'An error occurred!',\n text: response.data.description,\n icon: 'error'\n }).then(() => {\n if (!reloadOnError) return\n localStorage.removeItem('token')\n location.reload()\n })\n\n localStorage[lsKeys.token] = token\n page.token = token\n return page.prepareUpload()\n }).catch(page.onInitError)\n}\n\npage.prepareUpload = () => {\n // I think this fits best here because we need to check for a valid token before we can get the albums\n if (page.token) {\n // Display the album selection\n document.querySelector('#albumDiv').classList.remove('is-hidden')\n\n page.albumSelect = document.querySelector('#albumSelect')\n page.albumSelect.addEventListener('change', () => {\n page.album = parseInt(page.albumSelect.value)\n // Re-generate ShareX config file\n if (typeof page.prepareShareX === 'function')\n page.prepareShareX()\n })\n\n // Fetch albums\n page.fetchAlbums()\n }\n\n // Prepare & generate config tab\n page.prepareUploadConfig()\n\n // Update elements wherever applicable\n document.querySelector('#maxSize > span').innerHTML = page.getPrettyBytes(page.maxSizeBytes)\n document.querySelector('#loginToUpload').classList.add('is-hidden')\n\n if (!page.token && page.enableUserAccounts)\n document.querySelector('#loginLinkText').innerHTML = 'Create an account and keep track of your uploads'\n\n // Prepare & generate files upload tab\n page.prepareDropzone()\n\n // Generate ShareX config file\n if (typeof page.prepareShareX === 'function')\n page.prepareShareX()\n\n // Prepare urls upload tab\n const urlMaxSize = document.querySelector('#urlMaxSize')\n if (urlMaxSize) {\n page.urlMaxSize = parseInt(urlMaxSize.innerHTML)\n page.urlMaxSizeBytes = page.urlMaxSize * 1e6\n urlMaxSize.innerHTML = page.getPrettyBytes(page.urlMaxSizeBytes)\n document.querySelector('#uploadUrls').addEventListener('click', event => {\n page.uploadUrls(event.currentTarget)\n })\n }\n\n // Get all tabs\n const tabsContainer = document.querySelector('#tabs')\n const tabs = tabsContainer.querySelectorAll('li')\n for (let i = 0; i < tabs.length; i++) {\n const id = tabs[i].dataset.id\n const tabContent = document.querySelector(`#${id}`)\n if (!tabContent) continue\n\n tabs[i].addEventListener('click', () => {\n page.setActiveTab(i)\n })\n page.tabs.push({ tab: tabs[i], content: tabContent })\n }\n\n // Set first valid tab as the default active tab\n if (page.tabs.length) {\n page.setActiveTab(0)\n tabsContainer.classList.remove('is-hidden')\n }\n}\n\npage.setActiveTab = index => {\n for (let i = 0; i < page.tabs.length; i++)\n if (i === index) {\n page.tabs[i].tab.classList.add('is-active')\n page.tabs[i].content.classList.remove('is-hidden')\n page.activeTab = index\n } else {\n page.tabs[i].tab.classList.remove('is-active')\n page.tabs[i].content.classList.add('is-hidden')\n }\n}\n\npage.fetchAlbums = () => {\n return axios.get('api/albums', { headers: { token: page.token } }).then(response => {\n if (response.data.success === false)\n return swal('An error occurred!', response.data.description, 'error')\n\n // Create an option for each album\n if (Array.isArray(response.data.albums) && response.data.albums.length)\n for (let i = 0; i < response.data.albums.length; i++) {\n const album = response.data.albums[i]\n const option = document.createElement('option')\n option.value = album.id\n option.innerHTML = album.name\n page.albumSelect.appendChild(option)\n }\n }).catch(page.onInitError)\n}\n\npage.prepareDropzone = () => {\n // Parse template element\n const previewNode = document.querySelector('#tpl')\n page.previewTemplate = previewNode.innerHTML\n previewNode.parentNode.removeChild(previewNode)\n\n // Generate files upload tab\n const tabDiv = document.querySelector('#tab-files')\n const div = document.createElement('div')\n div.className = 'control is-expanded'\n div.innerHTML = `\n
\n \n \n \n Click here or drag & drop files\n
\n `\n tabDiv.querySelector('.dz-container').appendChild(div)\n\n const previewsContainer = tabDiv.querySelector('#tab-files .field.uploads')\n\n page.dropzone = new Dropzone(document.body, {\n url: 'api/upload',\n paramName: 'files[]',\n clickable: tabDiv.querySelector('#dropzone'),\n maxFilesize: page.maxSizeBytes / 1024 / 1024, // this option expects MiB\n parallelUploads: page.parallelUploads,\n uploadMultiple: false,\n previewsContainer,\n previewTemplate: page.previewTemplate,\n createImageThumbnails: false,\n autoProcessQueue: true,\n headers: { token: page.token },\n chunking: Boolean(page.chunkSize),\n chunkSize: page.chunkSize * 1e6, // the option below expects Bytes\n parallelChunkUploads: false, // when set to true, it often hangs with hundreds of parallel uploads\n chunksUploaded (file, done) {\n file.previewElement.querySelector('.progress').setAttribute('value', 100)\n file.previewElement.querySelector('.progress').innerHTML = '100%'\n\n return axios.post('api/upload/finishchunks', {\n // This API supports an array of multiple files\n files: [{\n uuid: file.upload.uuid,\n original: file.name,\n type: file.type,\n albumid: page.album,\n filelength: page.fileLength,\n age: page.uploadAge\n }]\n }, { headers: { token: page.token } }).catch(error => {\n // Format error for display purpose\n return error.response.data ? error.response : {\n data: {\n success: false,\n description: error.toString()\n }\n }\n }).then(response => {\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n\n if (response.data.success === false)\n file.previewElement.querySelector('.error').innerHTML = response.data.description\n\n if (response.data.files && response.data.files[0])\n page.updateTemplate(file, response.data.files[0])\n\n return done()\n })\n }\n })\n\n page.dropzone.on('addedfile', file => {\n // Set active tab to file uploads, if necessary\n if (page.activeTab !== 0)\n page.setActiveTab(0)\n // Add file entry\n tabDiv.querySelector('.uploads').classList.remove('is-hidden')\n file.previewElement.querySelector('.name').innerHTML = file.name\n })\n\n page.dropzone.on('sending', (file, xhr) => {\n if (file.upload.chunked) return\n // Add headers if not uploading chunks\n if (page.album !== null) xhr.setRequestHeader('albumid', page.album)\n if (page.fileLength !== null) xhr.setRequestHeader('filelength', page.fileLength)\n if (page.uploadAge !== null) xhr.setRequestHeader('age', page.uploadAge)\n })\n\n // Update the total progress bar\n page.dropzone.on('uploadprogress', (file, progress) => {\n // For some reason, chunked uploads fire 100% progress event\n // for each chunk's successful uploads\n if (file.upload.chunked && progress === 100) return\n file.previewElement.querySelector('.progress').setAttribute('value', progress)\n file.previewElement.querySelector('.progress').innerHTML = `${progress}%`\n })\n\n page.dropzone.on('success', (file, response) => {\n if (!response) return\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n\n if (response.success === false)\n file.previewElement.querySelector('.error').innerHTML = response.description\n\n if (response.files && response.files[0])\n page.updateTemplate(file, response.files[0])\n })\n\n page.dropzone.on('error', (file, error) => {\n // Clean up file size errors\n if ((typeof error === 'string' && /^File is too big/.test(error)) ||\n (typeof error === 'object' && /File too large/.test(error.description)))\n error = `File too large (${page.getPrettyBytes(file.size)}).`\n\n page.updateTemplateIcon(file.previewElement, 'icon-block')\n file.previewElement.querySelector('.progress').classList.add('is-hidden')\n file.previewElement.querySelector('.name').innerHTML = file.name\n file.previewElement.querySelector('.error').innerHTML = error.description || error\n })\n}\n\npage.uploadUrls = button => {\n const tabDiv = document.querySelector('#tab-urls')\n if (!tabDiv || button.classList.contains('is-loading'))\n return\n\n button.classList.add('is-loading')\n\n function done (error) {\n if (error) swal('An error occurred!', error, 'error')\n button.classList.remove('is-loading')\n }\n\n function run () {\n const headers = {\n token: page.token,\n albumid: page.album,\n age: page.uploadAge,\n filelength: page.fileLength\n }\n\n const previewsContainer = tabDiv.querySelector('.uploads')\n const urls = document.querySelector('#urls').value\n .split(/\\r?\\n/)\n .filter(url => {\n return url.trim().length\n })\n document.querySelector('#urls').value = urls.join('\\n')\n\n if (!urls.length)\n return done('You have not entered any URLs.')\n\n tabDiv.querySelector('.uploads').classList.remove('is-hidden')\n const files = urls.map(url => {\n const previewTemplate = document.createElement('template')\n previewTemplate.innerHTML = page.previewTemplate.trim()\n const previewElement = previewTemplate.content.firstChild\n previewElement.querySelector('.name').innerHTML = url\n previewsContainer.appendChild(previewElement)\n return { url, previewElement }\n })\n\n function post (i) {\n if (i === files.length)\n return done()\n\n function posted (result) {\n files[i].previewElement.querySelector('.progress').classList.add('is-hidden')\n if (result.success) {\n page.updateTemplate(files[i], result.files[0])\n } else {\n page.updateTemplateIcon(files[i].previewElement, 'icon-block')\n files[i].previewElement.querySelector('.error').innerHTML = result.description\n }\n return post(i + 1)\n }\n\n // Animate progress bar\n files[i].previewElement.querySelector('.progress').removeAttribute('value')\n\n return axios.post('api/upload', { urls: [files[i].url] }, { headers }).then(response => {\n return posted(response.data)\n }).catch(error => {\n return posted({\n success: false,\n description: error.response ? error.response.data.description : error.toString()\n })\n })\n }\n return post(0)\n }\n return run()\n}\n\npage.updateTemplateIcon = (templateElement, iconClass) => {\n const iconElement = templateElement.querySelector('.icon')\n if (!iconElement) return\n iconElement.classList.add(iconClass)\n iconElement.classList.remove('is-hidden')\n}\n\npage.updateTemplate = (file, response) => {\n if (!response.url) return\n\n const a = file.previewElement.querySelector('.link > a')\n const clipboard = file.previewElement.querySelector('.clipboard-mobile > .clipboard-js')\n a.href = a.innerHTML = clipboard.dataset.clipboardText = response.url\n clipboard.parentElement.classList.remove('is-hidden')\n\n const exec = /.[\\w]+(\\?|$)/.exec(response.url)\n const extname = exec && exec[0]\n ? exec[0].toLowerCase()\n : null\n\n if (page.imageExts.includes(extname))\n if (page.previewImages) {\n const img = file.previewElement.querySelector('img')\n img.setAttribute('alt', response.name || '')\n img.dataset.src = response.url\n img.classList.remove('is-hidden')\n img.onerror = event => {\n // Hide image elements that fail to load\n // Consequently include WEBP in browsers that do not have WEBP support (e.i. IE)\n event.currentTarget.classList.add('is-hidden')\n page.updateTemplateIcon(file.previewElement, 'icon-picture')\n }\n page.lazyLoad.update(file.previewElement.querySelectorAll('img'))\n } else {\n page.updateTemplateIcon(file.previewElement, 'icon-picture')\n }\n else if (page.videoExts.includes(extname))\n page.updateTemplateIcon(file.previewElement, 'icon-video')\n else\n page.updateTemplateIcon(file.previewElement, 'icon-doc-inv')\n\n if (response.expirydate) {\n const expiryDate = file.previewElement.querySelector('.expiry-date')\n expiryDate.innerHTML = `EXP: ${page.getPrettyDate(new Date(response.expirydate * 1000))}`\n expiryDate.classList.remove('is-hidden')\n }\n}\n\npage.createAlbum = () => {\n const div = document.createElement('div')\n div.innerHTML = `\n
\n
\n \n
\n

Max length is ${page.albumTitleMaxLength} characters.

\n
\n
\n
\n \n
\n

Max length is ${page.albumDescMaxLength} characters.

\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n `\n\n swal({\n title: 'Create new album',\n icon: 'info',\n content: div,\n buttons: {\n cancel: true,\n confirm: {\n closeModal: false\n }\n }\n }).then(value => {\n if (!value) return\n\n const name = document.querySelector('#swalName').value.trim()\n axios.post('api/albums', {\n name,\n description: document.querySelector('#swalDescription').value.trim(),\n download: document.querySelector('#swalDownload').checked,\n public: document.querySelector('#swalPublic').checked\n }, {\n headers: {\n token: page.token\n }\n }).then(response => {\n if (response.data.success === false)\n return swal('An error occurred!', response.data.description, 'error')\n\n const option = document.createElement('option')\n page.albumSelect.appendChild(option)\n option.value = response.data.id\n option.innerHTML = name\n option.selected = true\n\n swal('Woohoo!', 'Album was created successfully.', 'success')\n }).catch(page.onError)\n })\n}\n\npage.prepareUploadConfig = () => {\n const fallback = {\n chunkSize: page.chunkSize,\n parallelUploads: 2\n }\n\n page.chunkSize = parseInt(localStorage[lsKeys.chunkSize]) || fallback.chunkSize\n page.parallelUploads = parseInt(localStorage[lsKeys.parallelUploads]) || fallback.parallelUploads\n document.querySelector('#chunkSize').value = page.chunkSize\n document.querySelector('#parallelUploads').value = page.parallelUploads\n\n const numConfig = {\n chunkSize: { min: 1, max: 95 },\n parallelUploads: { min: 1, max: 10 }\n }\n\n document.querySelector('#chunkSizeDiv .help').innerHTML =\n `Default is ${fallback.chunkSize} MB. Max is ${numConfig.chunkSize.max} MB.`\n document.querySelector('#parallelUploadsDiv .help').innerHTML =\n `Default is ${fallback.parallelUploads}. Max is ${numConfig.parallelUploads.max}.`\n\n const fileLengthDiv = document.querySelector('#fileLengthDiv')\n if (page.fileIdentifierLength && fileLengthDiv) {\n const element = document.querySelector('#fileLength')\n const stored = parseInt(localStorage[lsKeys.fileLength])\n\n fallback.fileLength = page.fileIdentifierLength.default\n let helpText = `Default is ${page.fileIdentifierLength.default}.`\n\n const range = typeof page.fileIdentifierLength.min === 'number' &&\n typeof page.fileIdentifierLength.max === 'number'\n\n if (range) {\n helpText += ` Min is ${page.fileIdentifierLength.min}. Max is ${page.fileIdentifierLength.max}`\n numConfig.fileLength = {\n min: page.fileIdentifierLength.min,\n max: page.fileIdentifierLength.max\n }\n }\n\n if (page.fileIdentifierLength.force) {\n helpText += ' This option is currently disabled.'\n element.disabled = true\n }\n\n if (page.fileIdentifierLength.force ||\n isNaN(stored) ||\n !range ||\n stored < page.fileIdentifierLength.min ||\n stored > page.fileIdentifierLength.max) {\n element.value = fallback.fileLength\n page.fileLength = null\n } else {\n element.value = stored\n page.fileLength = stored\n }\n\n fileLengthDiv.classList.remove('is-hidden')\n fileLengthDiv.querySelector('.help').innerHTML = helpText\n }\n\n Object.keys(numConfig).forEach(key => {\n document.querySelector(`#${key}`).setAttribute('min', numConfig[key].min)\n document.querySelector(`#${key}`).setAttribute('max', numConfig[key].max)\n })\n\n const uploadAgeDiv = document.querySelector('#uploadAgeDiv')\n if (Array.isArray(page.temporaryUploadAges) && page.temporaryUploadAges.length && uploadAgeDiv) {\n const element = document.querySelector('#uploadAge')\n const stored = parseFloat(localStorage[lsKeys.uploadAge])\n for (let i = 0; i < page.temporaryUploadAges.length; i++) {\n const age = page.temporaryUploadAges[i]\n const option = document.createElement('option')\n option.value = i === 0 ? 'default' : age\n option.innerHTML = page.getPrettyUploadAge(age) +\n (i === 0 ? ' (default)' : '')\n element.appendChild(option)\n if (age === stored) {\n element.value = option.value\n page.uploadAge = stored\n }\n }\n uploadAgeDiv.classList.remove('is-hidden')\n }\n\n const tabContent = document.querySelector('#tab-config')\n const form = tabContent.querySelector('form')\n form.addEventListener('submit', event => {\n event.preventDefault()\n })\n\n const siBytes = localStorage[lsKeys.siBytes] !== '0'\n if (!siBytes) document.querySelector('#siBytes').value = '0'\n\n const olderOnTop = localStorage[lsKeys.uploadsHistoryOrder] !== '0'\n if (!olderOnTop) {\n document.querySelector('#uploadsHistoryOrder').value = '0'\n const uploadFields = document.querySelectorAll('.tab-content > .uploads')\n for (let i = 0; i < uploadFields.length; i++)\n uploadFields[i].classList.add('is-reversed')\n }\n\n page.previewImages = localStorage[lsKeys.previewImages] !== '0'\n if (!page.previewImages) document.querySelector('#previewImages').value = '0'\n\n document.querySelector('#saveConfig').addEventListener('click', () => {\n if (!form.checkValidity())\n return\n\n const prefKeys = ['siBytes', 'uploadsHistoryOrder', 'previewImages', 'uploadAge']\n for (let i = 0; i < prefKeys.length; i++) {\n const value = form.elements[prefKeys[i]].value\n if (value !== 'default' && value !== fallback[prefKeys[i]])\n localStorage[lsKeys[prefKeys[i]]] = value\n else\n localStorage.removeItem(lsKeys[prefKeys[i]])\n }\n\n const numKeys = Object.keys(numConfig)\n for (let i = 0; i < numKeys.length; i++) {\n const parsed = parseInt(form.elements[numKeys[i]].value) || 0\n const value = Math.min(Math.max(parsed, numConfig[numKeys[i]].min), numConfig[numKeys[i]].max)\n if (value > 0 && value !== fallback[numKeys[i]])\n localStorage[lsKeys[numKeys[i]]] = value\n else\n localStorage.removeItem(lsKeys[numKeys[i]])\n }\n\n swal({\n title: 'Woohoo!',\n text: 'Configuration saved into this browser.',\n icon: 'success'\n }).then(() => {\n location.reload()\n })\n })\n}\n\npage.getPrettyUploadAge = hours => {\n if (hours === 0) {\n return 'Permanent'\n } else if (hours < 1) {\n const minutes = hours * 60\n return `${minutes} minute${minutes === 1 ? '' : 's'}`\n } else if (hours >= 24) {\n const days = hours / 24\n return `${days} day${days === 1 ? '' : 's'}`\n } else {\n return `${hours} hour${hours === 1 ? '' : 's'}`\n }\n}\n\n// Handle image paste event\nwindow.addEventListener('paste', event => {\n const items = (event.clipboardData || event.originalEvent.clipboardData).items\n const index = Object.keys(items)\n for (let i = 0; i < index.length; i++) {\n const item = items[index[i]]\n if (item.kind === 'file') {\n const blob = item.getAsFile()\n const file = new File([blob], `pasted-image.${blob.type.match(/(?:[^/]*\\/)([^;]*)/)[1]}`, {\n type: blob.type\n })\n page.dropzone.addFile(file)\n }\n }\n})\n\nwindow.onload = () => {\n page.checkIfPublic()\n\n page.clipboardJS = new ClipboardJS('.clipboard-js')\n\n page.clipboardJS.on('success', () => {\n return swal('Copied!', 'The link has been copied to clipboard.', 'success')\n })\n\n page.clipboardJS.on('error', page.onError)\n\n page.lazyLoad = new LazyLoad({\n elements_selector: '.field.uploads img'\n })\n\n document.querySelector('#createAlbum').addEventListener('click', () => {\n page.createAlbum()\n })\n}\n"]} \ No newline at end of file diff --git a/src/css/dashboard.css b/src/css/dashboard.css index 492d382..a5e5c9c 100644 --- a/src/css/dashboard.css +++ b/src/css/dashboard.css @@ -11,26 +11,26 @@ body { } .menu-list a { - color: #3794d2 -} - -.menu-list a:hover { - color: #60a8dc; - background-color: #4d4d4d + color: #209cee; + border: 1px solid transparent; + margin-top: -1px } .menu-list a.is-active { - color: #eff0f1; - background-color: #3794d2 + color: #fff; + background: #209cee; + border-color: #209cee +} + +.menu-list a:not(.is-active):hover { + color: #209cee; + background: none; + border-color: #209cee } .menu-list a[disabled] { color: #7a7a7a; - cursor: not-allowed -} - -.menu-list a[disabled]:hover { - background: none + pointer-events: none } .menu-list a.is-loading::after { @@ -54,7 +54,7 @@ ul#albumsContainer { } ul#albumsContainer li { - border-left: 1px solid #898b8d; + border-left: 2px solid #585858; padding-left: 0.75em; animation: fadeInOpacity 0.5s } @@ -69,25 +69,31 @@ ul#albumsContainer li { .pagination a:not([disabled]) { color: #eff0f1; - border-color: #4d4d4d; - background-color: #31363b + border-color: #eff0f1; + background: none } -a.pagination-link:not(.is-current):hover, -a.pagination-next:not([disabled]):hover, -a.pagination-previous:not([disabled]):hover { - color: #eff0f1; - border-color: #60a8dc; - background-color: #31363b +.pagination a.is-loading:not(.is-current):not([disabled])::after { + border-bottom-color: #eff0f1; + border-left-color: #eff0f1 } -a.pagination-link.is-current { - background-color: #3794d2; - border-color: #3794d2 +.pagination a.pagination-link:hover, +.pagination a.pagination-next:not([disabled]):hover, +.pagination a.pagination-previous:not([disabled]):hover { + color: #000; + background-color: #eff0f1; + border-color: #eff0f1 } -a.pagination-link.is-current:hover { - border-color: #60a8dc +.pagination a.pagination-link.is-current { + color: #000; + background-color: #eff0f1 +} + +.pagination a.pagination-link.is-current.is-loading::after { + border-bottom-color: #000; + border-left-color: #000 } li[data-action="page-ellipsis"] { @@ -104,8 +110,24 @@ li[data-action="page-ellipsis"] { .image-container .checkbox { position: absolute; - top: 12px; - left: 12px + top: 11px; + left: 11px +} + +.image-container .controls { + display: flex; + position: absolute; + top: 11px; + right: 11px +} + +.image-container .controls .button { + border-radius: 0 +} + +.image-container .controls .button:not(:active):not(:hover) { + color: #fff; + background-color: #0000008f } .no-touch .image-container .checkbox { @@ -130,36 +152,38 @@ li[data-action="page-ellipsis"] { .table { color: #bdc3c7; - background-color: #31363b; + background-color: #000; font-size: 0.75rem } -.table tr:hover, -.table.is-striped tbody tr:nth-child(2n) { - background: none -} - -.table.is-striped tbody tr:hover, -.table.is-striped tbody tr:nth-child(2n):hover, -.tag { - background-color: #4d4d4d +.table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #2f2f2f } .table td, .table th { - border: 0; - white-space: nowrap + white-space: nowrap; + vertical-align: middle; + border-bottom: 1px solid #585858 } .table th { color: #eff0f1; - height: 2.25em + height: 2.25em; + font-weight: normal } .table thead td, .table thead th { color: #eff0f1; - background-color: #ff3860 + background-color: #585858; + border-bottom: 0; + height: 33px +} + +.table tbody tr:last-child td, +.table tbody tr:last-child th { + border-bottom-width: 1px } .table .cell-indent { diff --git a/src/css/home.css b/src/css/home.css index 4ecb31d..102beb2 100644 --- a/src/css/home.css +++ b/src/css/home.css @@ -112,7 +112,7 @@ } .uploads > div > .icon:not(.icon-block) { - color: #3794d2 + color: #209cee } .uploads > div > .icon.icon-block { @@ -130,7 +130,7 @@ .name { font-size: 1rem; - color: #bdc3c7; + color: #eff0f1; word-break: break-all } @@ -177,23 +177,23 @@ } #tabs ul { - border-bottom: 1px solid #898b8d + border-bottom: 1px solid #585858 } #tabs li a { color: #bdc3c7; - border-bottom-color: #898b8d + border-bottom-color: #585858 } #tabs.is-boxed li.is-active a { - color: #3794d2; - background: #232629; - border-color: #898b8d; - border-bottom-color: #232629 + color: #209cee; + background: #000; + border-color: #585858; + border-bottom-color: #000 } #tabs.is-boxed li:not(.is-active) a:hover { - background: #4d4d4d + background: #585858 } .tab-content { @@ -201,11 +201,6 @@ animation: fadeInOpacity 0.5s } -.tab-content .label { - color: #bdc3c7; - font-weight: normal -} - #tab-config.tab-content form { margin-bottom: 0.75rem } diff --git a/src/css/style.css b/src/css/style.css index 9720d37..8b819b9 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -1,5 +1,5 @@ html { - background-color: #232629; + background-color: #000; overflow-y: auto } @@ -29,15 +29,15 @@ body { } a { - color: #3794d2 + color: #209cee } a:hover { - color: #60a8dc + color: #67c3ff } hr { - background-color: #898b8d + background-color: #585858 } code, @@ -58,24 +58,38 @@ code, color: #bdc3c7 } +.input, +.select select, +.textarea { + color: #eff0f1; + border-color: #585858; + background-color: #000 +} + .input::-moz-placeholder, .textarea::-moz-placeholder { - color: #7f8c8d + color: #bdc3c7 } .input::-webkit-input-placeholder, .textarea::-webkit-input-placeholder { - color: #7f8c8d + color: #bdc3c7 } .input:-moz-placeholder, .textarea:-moz-placeholder { - color: #7f8c8d + color: #bdc3c7 } .input:-ms-input-placeholder, .textarea:-ms-input-placeholder { - color: #7f8c8d + color: #bdc3c7 +} + +.input:hover, +.select select:hover, +.textarea:hover { + border-color: #209cee } .input.is-active, @@ -86,20 +100,20 @@ code, .textarea.is-focused, .textarea:active, .textarea:focus { - border-color: #3794d2 + border-color: #209cee } -.table.is-hoverable tbody tr:not(.is-selected):hover { - background-color: #4d4d4d -} - -.table td, -.table th { - vertical-align: middle +.label { + color: #eff0f1; + font-weight: normal } .help { - color: #7f8c8d + color: #bdc3c7 +} + +.progress { + background-color: #030303 } .button.is-info.is-hovered [class^="icon-"]::before, @@ -114,8 +128,16 @@ code, color: #7f8c8d } +.select:not(.is-multiple):not(.is-loading)::after { + border-color: #eff0f1 +} + +.select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #eff0f1 +} + .message { - background-color: #31363b + background-color: #030303 } .message-body { diff --git a/src/css/sweetalert.css b/src/css/sweetalert.css index 8d38dac..15323ad 100644 --- a/src/css/sweetalert.css +++ b/src/css/sweetalert.css @@ -1,5 +1,5 @@ .swal-modal { - background-color: #31363b + background-color: #2f2f2f } .swal-modal .field { @@ -37,11 +37,11 @@ } .swal-button:hover { - background-color: #60a8dc + background-color: #1496ed } .swal-button:focus { - box-shadow: 0 0 0 1px #31363b, 0 0 0 3px rgba(55, 148, 210, 0.29) + box-shadow: 0 0 0 1px #030303, 0 0 0 3px rgba(55, 148, 210, 0.29) } .swal-button--loading { @@ -129,12 +129,12 @@ } .swal-icon--success__hide-corners { - background-color: #31363b + background-color: #2f2f2f } .swal-icon--success::after, .swal-icon--success::before { - background: #31363b + background: #2f2f2f } .swal-display-thumb-container { diff --git a/src/css/thumbs.css b/src/css/thumbs.css index 2c1daed..227b5ab 100644 --- a/src/css/thumbs.css +++ b/src/css/thumbs.css @@ -4,11 +4,10 @@ width: 224px; height: 224px; margin: 0.75rem; - padding: 12px; - background-color: #31363b; + padding: 11px; overflow: hidden; align-items: center; - box-shadow: 0 20px 60px rgba(10, 10, 10, 0.05), 0 5px 10px rgba(10, 10, 10, 0.1), 0 1px 1px rgba(10, 10, 10, 0.2) + border: 1px solid #585858 } .image-container .title { @@ -18,8 +17,8 @@ .image-container .image { display: flex; - height: 100%; - width: 100%; + height: 200px; + width: 200px; align-items: center; justify-content: center } @@ -31,28 +30,12 @@ width: auto } -.image-container .controls { - display: flex; - position: absolute; - top: 12px; - right: 12px -} - -.image-container .controls .button { - border-radius: 0 -} - -.image-container .controls .button:not(:active):not(:hover) { - color: #fff; - background-color: rgba(49, 54, 59, 0.75) -} - .image-container .details { position: absolute; - left: 12px; - bottom: 12px; - right: 12px; - background-color: rgba(49, 54, 59, 0.75); + left: 11px; + bottom: 11px; + right: 11px; + background-color: #0000008f; color: #eff0f1; padding: 3px; font-size: 0.75rem diff --git a/src/versions.json b/src/versions.json index b0ca11e..6853aa5 100644 --- a/src/versions.json +++ b/src/versions.json @@ -1,5 +1,5 @@ { - "1": "1569663759", + "1": "1570313940", "2": "1568894058", "3": "1568894058", "4": "1568894058", diff --git a/todo.md b/todo.md index 51c7d7d..9c66227 100644 --- a/todo.md +++ b/todo.md @@ -24,6 +24,7 @@ Normal priority: * [x] I forsaked all `Promise.all()` in favor of `await-in-for-loop` a while back. I personally think it was fine, considering a lot of them were tasks that required serial processing (continuation be dependant on previous iterations), but maybe I should review the current codes to find any sections that would do just fine, or maybe even great, with `Promise.all()`. * [ ] Find a way to detect whether a user had disabled their browser's built-in smooth scrolling capability. We will then use that to decide whether we should use smooth scrolling when auto-scrolling during navigation (for now smooth scrolling is always enabled; and polified if applicable). * [ ] Parallel URL uploads. +* [x] Black-ish colorscheme. Low priority: diff --git a/views/_globals.njk b/views/_globals.njk index 87c2b0b..8a211e0 100644 --- a/views/_globals.njk +++ b/views/_globals.njk @@ -3,14 +3,14 @@ {% set description = "A pomf-like file uploading service that doesn't suck." %} {% set keywords = "upload,lolisafe,file,images,hosting,bobby,fiery" %} +{# Used in home.njk and nojs.njk #} {% set home_subtitle = "A modern self-hosted file upload service" %} -{% set google_site_verification = null %} - {# - These will be the links in the homepage and the No-JS uploader. - You may remove icons by changing "home_icons" to false. - It will then automatically use "attrs.title" as the display text. + These are the footer links in the homepage and the No-JS uploader (home.njk & nojs.njk respectively). + In the homepage uploader, they will be displayed as icons, + but you can choose to display them as texts by setting "home_icons" to false. + It will then use the text in "attrs.title" of each links. Note: No-JS uploader page will have icons disabled by default (it will also not load fontello.css). #} {% set home_icons = true %} diff --git a/views/home.njk b/views/home.njk index 8f64670..9899bc0 100644 --- a/views/home.njk +++ b/views/home.njk @@ -8,13 +8,6 @@ {% set urlExtensionsFilterEnabled = urlExtensionsFilterMode and urlExtensionsFilterMode !== 'inherit' and urlExtensionsFilter.length %} {% set temporaryUploadAges = config.uploads.temporaryUploadAges %} -{% block endmeta %} -{{ super() }} -{% if globals.google_site_verification %} - -{% endif %} -{% endblock %} - {% block stylesheets %} {{ super() }}