Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/photos.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2021-08-04 10:20:41 +0300
committernpmbuildbot-nextcloud[bot] <npmbuildbot-nextcloud[bot]@users.noreply.github.com>2021-08-04 10:25:11 +0300
commit4c682bb9c5ab882ec2fdfbebaffa57b434f618a6 (patch)
treebc91e05c0b4e53bc4ff1aa515fe12040cc7f8fc7 /js/photos-src_views_Albums_vue.js.map
parenta025f47ef92355361da4db44ba0e6fada2e86bd5 (diff)
Lint fix
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com> Signed-off-by: npmbuildbot-nextcloud[bot] <npmbuildbot-nextcloud[bot]@users.noreply.github.com>
Diffstat (limited to 'js/photos-src_views_Albums_vue.js.map')
-rw-r--r--js/photos-src_views_Albums_vue.js.map2
1 files changed, 1 insertions, 1 deletions
diff --git a/js/photos-src_views_Albums_vue.js.map b/js/photos-src_views_Albums_vue.js.map
index 934203b3..bbee0dc8 100644
--- a/js/photos-src_views_Albums_vue.js.map
+++ b/js/photos-src_views_Albums_vue.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///photos/src/components/Folder.vue?vue&type=style&index=0&id=95e00322&lang=scss&scoped=true&","webpack:///photos/src/components/FolderTagPreview.vue?vue&type=style&index=0&id=72c8239b&lang=scss&scoped=true&","webpack:///photos/src/views/Albums.vue?vue&type=style&index=0&id=26fc5baa&lang=scss&scoped=true&","webpack:///photos/src/components/FolderTagPreview.vue?vue&type=template&id=72c8239b&scoped=true&","webpack:///photos/src/components/FolderTagPreview.vue","webpack:///photos/src/components/FolderTagPreview.vue?vue&type=script&lang=js&","webpack://photos/./src/components/FolderTagPreview.vue?d7f4","webpack://photos/./src/components/FolderTagPreview.vue?9d8b","webpack:///photos/src/views/Albums.vue?vue&type=template&id=26fc5baa&scoped=true&","webpack:///photos/src/services/AlbumContent.js","webpack:///photos/src/components/Folder.vue","webpack:///photos/src/components/Folder.vue?vue&type=script&lang=js&","webpack://photos/./src/components/Folder.vue?dcad","webpack://photos/./src/components/Folder.vue?c398","webpack:///photos/src/components/Folder.vue?vue&type=template&id=95e00322&scoped=true&","webpack:///photos/src/views/Albums.vue","webpack:///photos/src/views/Albums.vue?vue&type=script&lang=js&","webpack://photos/./src/views/Albums.vue?7f9f","webpack://photos/./src/views/Albums.vue?2029"],"names":["___CSS_LOADER_EXPORT___","push","module","id","options","_vm","this","_h","$createElement","_c","_self","staticClass","class","isEmpty","attrs","to","ariaLabel","directives","name","rawName","value","expression","previewList","_l","file","key","fileid","generateImgSrc","on","$event","loaded","onPreviewFail","_v","icon","ariaUuid","_s","path","prefixPath","generateUrl","shared","axios","encodeFilePath","response","list","data","map","genFileInfo","folder","folders","files","entry","filename","type","allowedMimes","mime","item","injected","basename","previewFiles","error","t","loading","_e","_b","rootTitle","ref","contentList","gridConfig","count","gap"],"mappings":"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","file":"photos-src_views_Albums_vue.js?v=92cf311419c6516a1ed0","sourcesContent":["// Imports\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(true);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".file[data-v-95e00322],.folder[data-v-95e00322]{position:relative;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:var(--border-radius);overflow:hidden}.file .cover[data-v-95e00322],.folder .cover[data-v-95e00322]{z-index:2;width:100%;padding-bottom:100%;transition:opacity var(--animation-quick) ease-in-out;opacity:0;background-color:var(--color-main-text)}.file.active .cover[data-v-95e00322],.file:active .cover[data-v-95e00322],.file:hover .cover[data-v-95e00322],.file:focus .cover[data-v-95e00322],.folder.active .cover[data-v-95e00322],.folder:active .cover[data-v-95e00322],.folder:hover .cover[data-v-95e00322],.folder:focus .cover[data-v-95e00322]{opacity:.3}.file--clear.active .cover[data-v-95e00322],.file--clear:active .cover[data-v-95e00322],.file--clear:hover .cover[data-v-95e00322],.file--clear:focus .cover[data-v-95e00322],.folder--clear.active .cover[data-v-95e00322],.folder--clear:active .cover[data-v-95e00322],.folder--clear:hover .cover[data-v-95e00322],.folder--clear:focus .cover[data-v-95e00322]{opacity:.1}.fade-enter-active[data-v-95e00322],.fade-leave-active[data-v-95e00322]{transition:opacity var(--animation-quick) ease-in-out}.fade-enter[data-v-95e00322],.fade-leave-to[data-v-95e00322]{opacity:0}.folder-content[data-v-95e00322]{position:absolute;display:grid;width:100%;height:100%}.folder-content--grid-1[data-v-95e00322]{grid-template-columns:1fr;grid-template-rows:1fr}.folder-content--grid-2[data-v-95e00322]{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.folder-content--grid-3[data-v-95e00322]{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.folder-content--grid-3 img[data-v-95e00322]:first-child{grid-column:span 2}.folder-content--grid-4[data-v-95e00322]{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.folder-content img[data-v-95e00322]{width:100%;height:100%;object-fit:cover}.folder-name[data-v-95e00322]{position:absolute;z-index:3;display:flex;overflow:hidden;flex-direction:column;width:100%;height:100%;transition:opacity var(--animation-quick) ease-in-out;opacity:1}.folder-name__icon[data-v-95e00322]{height:40%;margin-top:calc(30% - 1rem / 2);background-size:40%}.folder-name__name[data-v-95e00322]{overflow:hidden;height:1rem;padding:0 10px;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:var(--color-main-background);text-shadow:0 0 8px var(--color-main-text);font-size:1rem;line-height:1rem}.folder--clear .folder-name__icon[data-v-95e00322]{opacity:.3}.folder--clear .folder-name__name[data-v-95e00322]{color:var(--color-main-text);text-shadow:0 0 8px var(--color-main-background)}.folder:not(.folder--clear) .cover[data-v-95e00322]{opacity:.3}.folder:not(.folder--clear).active .folder-name[data-v-95e00322],.folder:not(.folder--clear).active .cover[data-v-95e00322],.folder:not(.folder--clear):active .folder-name[data-v-95e00322],.folder:not(.folder--clear):active .cover[data-v-95e00322],.folder:not(.folder--clear):hover .folder-name[data-v-95e00322],.folder:not(.folder--clear):hover .cover[data-v-95e00322],.folder:not(.folder--clear):focus .folder-name[data-v-95e00322],.folder:not(.folder--clear):focus .cover[data-v-95e00322]{opacity:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://src/mixins/FileFolder.scss\",\"webpack://src/components/Folder.vue\"],\"names\":[],\"mappings\":\"AAsBA,gDAEC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,wBAAA,CAAA,gBAAA,CACA,kCAAA,CACA,eAAA,CAEA,8DACC,SAAA,CAMA,UAAA,CACA,mBAAA,CACA,qDAAA,CACA,SAAA,CACA,uCAAA,CAOA,4SACC,UAAA,CAQD,oWACC,UAAA,CAKH,wEACC,qDAAA,CAGD,6DACC,SAAA,CCwED,iCACC,iBAAA,CACA,YAAA,CACA,UAAA,CACA,WAAA,CAEA,yCACC,yBAAA,CACA,sBAAA,CAED,yCACC,yBAAA,CACA,0BAAA,CAED,yCACC,6BAAA,CACA,0BAAA,CACA,yDACC,kBAAA,CAGF,yCACC,6BAAA,CACA,0BAAA,CAED,qCACC,UAAA,CACA,WAAA,CAEA,gBAAA,CAMF,8BACC,iBAAA,CACA,SAAA,CACA,YAAA,CACA,eAAA,CACA,qBAAA,CACA,UAAA,CACA,WAAA,CACA,qDAAA,CACA,SAAA,CACA,oCACC,UAAA,CACA,+BAAA,CACA,mBAAA,CAED,oCACC,eAAA,CACA,WAnBY,CAoBZ,cAAA,CACA,iBAAA,CACA,kBAAA,CACA,sBAAA,CACA,kCAAA,CACA,0CAAA,CACA,cA1BY,CA2BZ,gBA3BY,CAmCZ,mDACC,UAAA,CAED,mDACC,4BAAA,CACA,gDAAA,CAQD,oDACC,UAAA,CASA,4eAEC,SAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @author John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @license GNU AGPL version 3 or any later version\\n *\\n * This program is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU Affero General Public License as\\n * published by the Free Software Foundation, either version 3 of the\\n * License, or (at your option) any later version.\\n *\\n * This program is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU Affero General Public License for more details.\\n *\\n * You should have received a copy of the GNU Affero General Public License\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\n *\\n */\\n\\n.file,\\n.folder {\\n\\tposition: relative;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tuser-select: none;\\n\\tborder-radius: var(--border-radius);\\n\\toverflow: hidden;\\n\\n\\t.cover {\\n\\t\\tz-index: 2;\\n\\t\\t// We want nice squares despite anything that is in it.\\n\\t\\t// The .cover is what makes the exact square size of the grid.\\n\\t\\t// We use padding-bottom because padding with percentage\\n\\t\\t// always refers to the width. And we only want to fit\\n\\t\\t// the css grid's width.\\n\\t\\twidth: 100%;\\n\\t\\tpadding-bottom: 100%;\\n\\t\\ttransition: opacity var(--animation-quick) ease-in-out;\\n\\t\\topacity: 0;\\n\\t\\tbackground-color: var(--color-main-text);\\n\\t}\\n\\n\\t&.active,\\n\\t&:active,\\n\\t&:hover,\\n\\t&:focus {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t}\\n\\n\\t&--clear.active,\\n\\t&--clear:active,\\n\\t&--clear:hover,\\n\\t&--clear:focus {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .1;\\n\\t\\t}\\n\\t}\\n}\\n\\n.fade-enter-active, .fade-leave-active {\\n\\ttransition: opacity var(--animation-quick) ease-in-out;\\n}\\n\\n.fade-enter, .fade-leave-to {\\n\\topacity: 0;\\n}\\n\",\"$sizes: (400: (count: 3, marginTop: 66, marginW: 8), 700: (count: 4, marginTop: 66, marginW: 8), 1024: (count: 5, marginTop: 66, marginW: 44), 1280: (count: 4, marginTop: 66, marginW: 44), 1440: (count: 5, marginTop: 88, marginW: 66), 1600: (count: 6, marginTop: 88, marginW: 66), 2048: (count: 7, marginTop: 88, marginW: 66), 2560: (count: 8, marginTop: 88, marginW: 88), 3440: (count: 9, marginTop: 88, marginW: 88), max: (count: 10, marginTop: 88, marginW: 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n@import '../mixins/FileFolder.scss';\\n\\n.folder-content {\\n\\tposition: absolute;\\n\\tdisplay: grid;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\t// folder layout if less than 4 pictures\\n\\t&--grid-1 {\\n\\t\\tgrid-template-columns: 1fr;\\n\\t\\tgrid-template-rows: 1fr;\\n\\t}\\n\\t&--grid-2 {\\n\\t\\tgrid-template-columns: 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t}\\n\\t&--grid-3 {\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t\\timg:first-child {\\n\\t\\t\\tgrid-column: span 2;\\n\\t\\t}\\n\\t}\\n\\t&--grid-4 {\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t}\\n\\timg {\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\n\\t\\tobject-fit: cover;\\n\\t}\\n}\\n\\n$name-height: 1rem;\\n\\n.folder-name {\\n\\tposition: absolute;\\n\\tz-index: 3;\\n\\tdisplay: flex;\\n\\toverflow: hidden;\\n\\tflex-direction: column;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\ttransition: opacity var(--animation-quick) ease-in-out;\\n\\topacity: 1;\\n\\t&__icon {\\n\\t\\theight: 40%;\\n\\t\\tmargin-top: calc(30% - #{$name-height} / 2); // center name+icon\\n\\t\\tbackground-size: 40%;\\n\\t}\\n\\t&__name {\\n\\t\\toverflow: hidden;\\n\\t\\theight: $name-height;\\n\\t\\tpadding: 0 10px;\\n\\t\\ttext-align: center;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\tcolor: var(--color-main-background);\\n\\t\\ttext-shadow: 0 0 8px var(--color-main-text);\\n\\t\\tfont-size: $name-height;\\n\\t\\tline-height: $name-height;\\n\\t}\\n}\\n\\n// Cover management empty/full\\n.folder {\\n\\t// if no img, let's display the folder icon as default black\\n\\t&--clear {\\n\\t\\t.folder-name__icon {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t\\t.folder-name__name {\\n\\t\\t\\tcolor: var(--color-main-text);\\n\\t\\t\\ttext-shadow: 0 0 8px var(--color-main-background);\\n\\t\\t}\\n\\t}\\n\\n\\t// show the cover as background\\n\\t// if there are pictures in it\\n\\t// so we can sho the folder+name above it\\n\\t&:not(.folder--clear) {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\n\\t\\t// hide everything but pictures\\n\\t\\t// on hover/active/focus\\n\\t\\t&.active,\\n\\t\\t&:active,\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\t.folder-name,\\n\\t\\t\\t.cover {\\n\\t\\t\\t\\topacity: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(true);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".file[data-v-72c8239b],.folder[data-v-72c8239b]{position:relative;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:var(--border-radius);overflow:hidden}.file .cover[data-v-72c8239b],.folder .cover[data-v-72c8239b]{z-index:2;width:100%;padding-bottom:100%;transition:opacity var(--animation-quick) ease-in-out;opacity:0;background-color:var(--color-main-text)}.file.active .cover[data-v-72c8239b],.file:active .cover[data-v-72c8239b],.file:hover .cover[data-v-72c8239b],.file:focus .cover[data-v-72c8239b],.folder.active .cover[data-v-72c8239b],.folder:active .cover[data-v-72c8239b],.folder:hover .cover[data-v-72c8239b],.folder:focus .cover[data-v-72c8239b]{opacity:.3}.file--clear.active .cover[data-v-72c8239b],.file--clear:active .cover[data-v-72c8239b],.file--clear:hover .cover[data-v-72c8239b],.file--clear:focus .cover[data-v-72c8239b],.folder--clear.active .cover[data-v-72c8239b],.folder--clear:active .cover[data-v-72c8239b],.folder--clear:hover .cover[data-v-72c8239b],.folder--clear:focus .cover[data-v-72c8239b]{opacity:.1}.fade-enter-active[data-v-72c8239b],.fade-leave-active[data-v-72c8239b]{transition:opacity var(--animation-quick) ease-in-out}.fade-enter[data-v-72c8239b],.fade-leave-to[data-v-72c8239b]{opacity:0}.folder-content[data-v-72c8239b]{position:absolute;display:grid;width:100%;height:100%}.folder-content--grid-1[data-v-72c8239b]{grid-template-columns:1fr;grid-template-rows:1fr}.folder-content--grid-2[data-v-72c8239b]{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.folder-content--grid-3[data-v-72c8239b]{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.folder-content--grid-3 img[data-v-72c8239b]:first-child{grid-column:span 2}.folder-content--grid-4[data-v-72c8239b]{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.folder-content img[data-v-72c8239b]{width:100%;height:100%;object-fit:cover}.folder-name[data-v-72c8239b]{position:absolute;z-index:3;display:flex;overflow:hidden;flex-direction:column;width:100%;height:100%;transition:opacity var(--animation-quick) ease-in-out;opacity:1}.folder-name__icon[data-v-72c8239b]{height:40%;margin-top:calc(30% - 1rem / 2);background-size:40%}.folder-name__name[data-v-72c8239b]{overflow:hidden;height:1rem;padding:0 10px;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:var(--color-main-background);text-shadow:0 0 8px var(--color-main-text);font-size:1rem;line-height:1rem}.folder--clear .folder-name__icon[data-v-72c8239b]{opacity:.3}.folder--clear .folder-name__name[data-v-72c8239b]{color:var(--color-main-text);text-shadow:0 0 8px var(--color-main-background)}.folder:not(.folder--clear) .cover[data-v-72c8239b]{opacity:.3}.folder:not(.folder--clear):active .folder-name[data-v-72c8239b],.folder:not(.folder--clear):active .cover[data-v-72c8239b],.folder:not(.folder--clear):hover .folder-name[data-v-72c8239b],.folder:not(.folder--clear):hover .cover[data-v-72c8239b],.folder:not(.folder--clear):focus .folder-name[data-v-72c8239b],.folder:not(.folder--clear):focus .cover[data-v-72c8239b]{opacity:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://src/mixins/FileFolder.scss\",\"webpack://src/components/FolderTagPreview.vue\"],\"names\":[],\"mappings\":\"AAsBA,gDAEC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,wBAAA,CAAA,gBAAA,CACA,kCAAA,CACA,eAAA,CAEA,8DACC,SAAA,CAMA,UAAA,CACA,mBAAA,CACA,qDAAA,CACA,SAAA,CACA,uCAAA,CAOA,4SACC,UAAA,CAQD,oWACC,UAAA,CAKH,wEACC,qDAAA,CAGD,6DACC,SAAA,CCiFD,iCACC,iBAAA,CACA,YAAA,CACA,UAAA,CACA,WAAA,CAEA,yCACC,yBAAA,CACA,sBAAA,CAED,yCACC,yBAAA,CACA,0BAAA,CAED,yCACC,6BAAA,CACA,0BAAA,CACA,yDACC,kBAAA,CAGF,yCACC,6BAAA,CACA,0BAAA,CAED,qCACC,UAAA,CACA,WAAA,CAEA,gBAAA,CAMF,8BACC,iBAAA,CACA,SAAA,CACA,YAAA,CACA,eAAA,CACA,qBAAA,CACA,UAAA,CACA,WAAA,CACA,qDAAA,CACA,SAAA,CACA,oCACC,UAAA,CACA,+BAAA,CACA,mBAAA,CAED,oCACC,eAAA,CACA,WAnBY,CAoBZ,cAAA,CACA,iBAAA,CACA,kBAAA,CACA,sBAAA,CACA,kCAAA,CACA,0CAAA,CACA,cA1BY,CA2BZ,gBA3BY,CAmCZ,mDACC,UAAA,CAED,mDACC,4BAAA,CACA,gDAAA,CAQD,oDACC,UAAA,CAQA,gXAEC,SAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @author John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @license GNU AGPL version 3 or any later version\\n *\\n * This program is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU Affero General Public License as\\n * published by the Free Software Foundation, either version 3 of the\\n * License, or (at your option) any later version.\\n *\\n * This program is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU Affero General Public License for more details.\\n *\\n * You should have received a copy of the GNU Affero General Public License\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\n *\\n */\\n\\n.file,\\n.folder {\\n\\tposition: relative;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tuser-select: none;\\n\\tborder-radius: var(--border-radius);\\n\\toverflow: hidden;\\n\\n\\t.cover {\\n\\t\\tz-index: 2;\\n\\t\\t// We want nice squares despite anything that is in it.\\n\\t\\t// The .cover is what makes the exact square size of the grid.\\n\\t\\t// We use padding-bottom because padding with percentage\\n\\t\\t// always refers to the width. And we only want to fit\\n\\t\\t// the css grid's width.\\n\\t\\twidth: 100%;\\n\\t\\tpadding-bottom: 100%;\\n\\t\\ttransition: opacity var(--animation-quick) ease-in-out;\\n\\t\\topacity: 0;\\n\\t\\tbackground-color: var(--color-main-text);\\n\\t}\\n\\n\\t&.active,\\n\\t&:active,\\n\\t&:hover,\\n\\t&:focus {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t}\\n\\n\\t&--clear.active,\\n\\t&--clear:active,\\n\\t&--clear:hover,\\n\\t&--clear:focus {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .1;\\n\\t\\t}\\n\\t}\\n}\\n\\n.fade-enter-active, .fade-leave-active {\\n\\ttransition: opacity var(--animation-quick) ease-in-out;\\n}\\n\\n.fade-enter, .fade-leave-to {\\n\\topacity: 0;\\n}\\n\",\"$sizes: (400: (count: 3, marginTop: 66, marginW: 8), 700: (count: 4, marginTop: 66, marginW: 8), 1024: (count: 5, marginTop: 66, marginW: 44), 1280: (count: 4, marginTop: 66, marginW: 44), 1440: (count: 5, marginTop: 88, marginW: 66), 1600: (count: 6, marginTop: 88, marginW: 66), 2048: (count: 7, marginTop: 88, marginW: 66), 2560: (count: 8, marginTop: 88, marginW: 88), 3440: (count: 9, marginTop: 88, marginW: 88), max: (count: 10, marginTop: 88, marginW: 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n@import '../mixins/FileFolder.scss';\\n\\n.folder-content {\\n\\tposition: absolute;\\n\\tdisplay: grid;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\t// folder layout if less than 4 pictures\\n\\t&--grid-1 {\\n\\t\\tgrid-template-columns: 1fr;\\n\\t\\tgrid-template-rows: 1fr;\\n\\t}\\n\\t&--grid-2 {\\n\\t\\tgrid-template-columns: 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t}\\n\\t&--grid-3 {\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t\\timg:first-child {\\n\\t\\t\\tgrid-column: span 2;\\n\\t\\t}\\n\\t}\\n\\t&--grid-4 {\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t}\\n\\timg {\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\n\\t\\tobject-fit: cover;\\n\\t}\\n}\\n\\n$name-height: 1rem;\\n\\n.folder-name {\\n\\tposition: absolute;\\n\\tz-index: 3;\\n\\tdisplay: flex;\\n\\toverflow: hidden;\\n\\tflex-direction: column;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\ttransition: opacity var(--animation-quick) ease-in-out;\\n\\topacity: 1;\\n\\t&__icon {\\n\\t\\theight: 40%;\\n\\t\\tmargin-top: calc(30% - #{$name-height} / 2); // center name+icon\\n\\t\\tbackground-size: 40%;\\n\\t}\\n\\t&__name {\\n\\t\\toverflow: hidden;\\n\\t\\theight: $name-height;\\n\\t\\tpadding: 0 10px;\\n\\t\\ttext-align: center;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\tcolor: var(--color-main-background);\\n\\t\\ttext-shadow: 0 0 8px var(--color-main-text);\\n\\t\\tfont-size: $name-height;\\n\\t\\tline-height: $name-height;\\n\\t}\\n}\\n\\n// Cover management empty/full\\n.folder {\\n\\t// if no img, let's display the folder icon as default black\\n\\t&--clear {\\n\\t\\t.folder-name__icon {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t\\t.folder-name__name {\\n\\t\\t\\tcolor: var(--color-main-text);\\n\\t\\t\\ttext-shadow: 0 0 8px var(--color-main-background);\\n\\t\\t}\\n\\t}\\n\\n\\t// show the cover as background\\n\\t// if there are pictures in it\\n\\t// so we can sho the folder+name above it\\n\\t&:not(.folder--clear) {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\n\\t\\t// hide everything but pictures\\n\\t\\t// on hover/active/focus\\n\\t\\t&:active,\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\t.folder-name,\\n\\t\\t\\t.cover {\\n\\t\\t\\t\\topacity: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(true);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@media(min-width: 0px)and (max-width: 400px){.grid-container[data-v-26fc5baa]{padding:0px 8px 256px 8px}}@media(min-width: 400px)and (max-width: 700px){.grid-container[data-v-26fc5baa]{padding:0px 8px 256px 8px}}@media(min-width: 700px)and (max-width: 1024px){.grid-container[data-v-26fc5baa]{padding:0px 44px 256px 44px}}@media(min-width: 1024px)and (max-width: 1280px){.grid-container[data-v-26fc5baa]{padding:0px 44px 256px 44px}}@media(min-width: 1280px)and (max-width: 1440px){.grid-container[data-v-26fc5baa]{padding:0px 66px 256px 66px}}@media(min-width: 1440px)and (max-width: 1600px){.grid-container[data-v-26fc5baa]{padding:0px 66px 256px 66px}}@media(min-width: 1600px)and (max-width: 2048px){.grid-container[data-v-26fc5baa]{padding:0px 66px 256px 66px}}@media(min-width: 2048px)and (max-width: 2560px){.grid-container[data-v-26fc5baa]{padding:0px 88px 256px 88px}}@media(min-width: 2560px)and (max-width: 3440px){.grid-container[data-v-26fc5baa]{padding:0px 88px 256px 88px}}@media(min-width: 3440px){.grid-container[data-v-26fc5baa]{padding:0px 88px 256px 88px}}\", \"\",{\"version\":3,\"sources\":[\"webpack://src/mixins/GridSizes.scss\",\"webpack://src/views/Albums.vue\"],\"names\":[],\"mappings\":\"AAoCG,6CC4NH,iCAEE,yBAAA,CAAA,CD9NC,+CC4NH,iCAEE,yBAAA,CAAA,CD9NC,gDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CDlOC,0BCgOH,iCAEE,2BAAA,CAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @author John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @license GNU AGPL version 3 or any later version\\n *\\n * This program is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU Affero General Public License as\\n * published by the Free Software Foundation, either version 3 of the\\n * License, or (at your option) any later version.\\n *\\n * This program is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU Affero General Public License for more details.\\n *\\n * You should have received a copy of the GNU Affero General Public License\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\n *\\n */\\n@use 'sass:map';\\n\\n@mixin grid-sizes() {\\n\\t$previous: 0;\\n\\n\\t@each $size, $config in $sizes {\\n\\t\\t$count: map-get($config, 'count');\\n\\t\\t$marginTop: map-get($config, 'marginTop');\\n\\t\\t$marginW: map-get($config, 'marginW');\\n\\n\\t\\t@if $size == 'max' {\\n\\t\\t\\t@media (min-width: #{$previous}px) {\\n\\t\\t\\t\\t@content($marginTop, $marginW);\\n\\t\\t\\t}\\n\\t\\t} @else {\\n\\t\\t\\t@media (min-width: #{$previous}px) and (max-width: #{$size}px) {\\n\\t\\t\\t\\t@content($marginTop, $marginW);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t$previous: $size;\\n\\t}\\n}\\n\",\"$sizes: (400: (count: 3, marginTop: 66, marginW: 8), 700: (count: 4, marginTop: 66, marginW: 8), 1024: (count: 5, marginTop: 66, marginW: 44), 1280: (count: 4, marginTop: 66, marginW: 44), 1440: (count: 5, marginTop: 88, marginW: 66), 1600: (count: 6, marginTop: 88, marginW: 66), 2048: (count: 7, marginTop: 88, marginW: 66), 2560: (count: 8, marginTop: 88, marginW: 88), 3440: (count: 9, marginTop: 88, marginW: 88), max: (count: 10, marginTop: 88, marginW: 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n@import '../mixins/GridSizes.scss';\\n\\n.grid-container {\\n\\t@include grid-sizes using ($marginTop, $marginW) {\\n\\t\\tpadding: 0px #{$marginW}px 256px #{$marginW}px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('router-link',{staticClass:\"folder\",class:{'folder--clear': _vm.isEmpty},attrs:{\"to\":_vm.to,\"aria-label\":_vm.ariaLabel}},[_c('transition',{attrs:{\"name\":\"fade\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.loaded),expression:\"loaded\"}],staticClass:\"folder-content\",class:(\"folder-content--grid-\" + (_vm.previewList.length)),attrs:{\"role\":\"none\"}},_vm._l((_vm.previewList),function(file){return _c('img',{key:file.fileid,attrs:{\"src\":_vm.generateImgSrc(file),\"alt\":\"\"},on:{\"load\":function($event){_vm.loaded = true},\"error\":function($event){return _vm.onPreviewFail(file)}}})}),0)]),_vm._v(\" \"),_c('div',{staticClass:\"folder-name\"},[_c('span',{staticClass:\"folder-name__icon\",class:[!_vm.isEmpty ? 'icon-white' : 'icon-dark', _vm.icon],attrs:{\"role\":\"img\"}}),_vm._v(\" \"),_c('p',{staticClass:\"folder-name__name\",attrs:{\"id\":_vm.ariaUuid}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.name)+\"\\n\\t\\t\")])]),_vm._v(\" \"),_c('div',{staticClass:\"cover\",attrs:{\"role\":\"none\"}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<router-link :class=\"{'folder--clear': isEmpty}\"\n\t\tclass=\"folder\"\n\t\t:to=\"to\"\n\t\t:aria-label=\"ariaLabel\">\n\t\t<!-- Images preview -->\n\t\t<transition name=\"fade\">\n\t\t\t<div v-show=\"loaded\"\n\t\t\t\t:class=\"`folder-content--grid-${previewList.length}`\"\n\t\t\t\tclass=\"folder-content\"\n\t\t\t\trole=\"none\">\n\t\t\t\t<img v-for=\"file in previewList\"\n\t\t\t\t\t:key=\"file.fileid\"\n\t\t\t\t\t:src=\"generateImgSrc(file)\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\t@load=\"loaded = true\"\n\t\t\t\t\t@error=\"onPreviewFail(file)\">\n\t\t\t</div>\n\t\t</transition>\n\n\t\t<div\n\t\t\tclass=\"folder-name\">\n\t\t\t<span :class=\"[!isEmpty ? 'icon-white' : 'icon-dark', icon]\"\n\t\t\t\tclass=\"folder-name__icon\"\n\t\t\t\trole=\"img\" />\n\t\t\t<p :id=\"ariaUuid\" class=\"folder-name__name\">\n\t\t\t\t{{ name }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<div class=\"cover\" role=\"none\" />\n\t</router-link>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'FolderTagPreview',\n\n\tprops: {\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\tdefault: 'icon-folder',\n\t\t},\n\t\tid: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tfileList: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloaded: false,\n\t\t\tfailed: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// folder is empty\n\t\tisEmpty() {\n\t\t\treturn this.previewList.length === 0\n\t\t},\n\n\t\tariaUuid() {\n\t\t\treturn `folder-${this.id}`\n\t\t},\n\t\tariaLabel() {\n\t\t\treturn t('photos', 'Open the \"{name}\" sub-directory', { name: this.name })\n\t\t},\n\n\t\t/**\n\t\t * Previews list without the failed ones\n\t\t * @returns {Object[]} the previews fileinfo\n\t\t */\n\t\tpreviewList() {\n\t\t\treturn this.fileList\n\t\t\t\t.filter(file => this.failed.indexOf(file.fileid) === -1)\n\t\t},\n\n\t\t/**\n\t\t * We do not want encoded slashes when browsing by folder\n\t\t * so we generate a new valid route object based on the\n\t\t * current named route, get the final url back, decode it\n\t\t * and use it as a direct string.\n\t\t * Which vue-router does not encode afterwards!\n\t\t * @returns {string}\n\t\t */\n\t\tto() {\n\t\t\t// always remove first slash, the router\n\t\t\t// manage it automatically\n\t\t\tconst regex = /^\\/?(.+)/i\n\t\t\tconst path = regex.exec(this.path)[1]\n\n\t\t\t// apply to current route\n\t\t\treturn Object.assign({}, this.$route, {\n\t\t\t\tparams: { path: path.split('/') },\n\t\t\t})\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgenerateImgSrc({ fileid, etag }) {\n\t\t\t// use etag to force cache reload if file changed\n\t\t\treturn generateUrl(`/core/preview?fileId=${fileid}&x=${256}&y=${256}&a=true&v=${etag}`)\n\t\t},\n\t\tonPreviewFail({ fileid }) {\n\t\t\tthis.failed.push(fileid)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../mixins/FileFolder.scss';\n\n.folder-content {\n\tposition: absolute;\n\tdisplay: grid;\n\twidth: 100%;\n\theight: 100%;\n\t// folder layout if less than 4 pictures\n\t&--grid-1 {\n\t\tgrid-template-columns: 1fr;\n\t\tgrid-template-rows: 1fr;\n\t}\n\t&--grid-2 {\n\t\tgrid-template-columns: 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t}\n\t&--grid-3 {\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t\timg:first-child {\n\t\t\tgrid-column: span 2;\n\t\t}\n\t}\n\t&--grid-4 {\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t}\n\timg {\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tobject-fit: cover;\n\t}\n}\n\n$name-height: 1rem;\n\n.folder-name {\n\tposition: absolute;\n\tz-index: 3;\n\tdisplay: flex;\n\toverflow: hidden;\n\tflex-direction: column;\n\twidth: 100%;\n\theight: 100%;\n\ttransition: opacity var(--animation-quick) ease-in-out;\n\topacity: 1;\n\t&__icon {\n\t\theight: 40%;\n\t\tmargin-top: calc(30% - #{$name-height} / 2); // center name+icon\n\t\tbackground-size: 40%;\n\t}\n\t&__name {\n\t\toverflow: hidden;\n\t\theight: $name-height;\n\t\tpadding: 0 10px;\n\t\ttext-align: center;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-main-background);\n\t\ttext-shadow: 0 0 8px var(--color-main-text);\n\t\tfont-size: $name-height;\n\t\tline-height: $name-height;\n\t}\n}\n\n// Cover management empty/full\n.folder {\n\t// if no img, let's display the folder icon as default black\n\t&--clear {\n\t\t.folder-name__icon {\n\t\t\topacity: .3;\n\t\t}\n\t\t.folder-name__name {\n\t\t\tcolor: var(--color-main-text);\n\t\t\ttext-shadow: 0 0 8px var(--color-main-background);\n\t\t}\n\t}\n\n\t// show the cover as background\n\t// if there are pictures in it\n\t// so we can sho the folder+name above it\n\t&:not(.folder--clear) {\n\t\t.cover {\n\t\t\topacity: .3;\n\t\t}\n\n\t\t// hide everything but pictures\n\t\t// on hover/active/focus\n\t\t&:active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\t.folder-name,\n\t\t\t.cover {\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FolderTagPreview.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FolderTagPreview.vue?vue&type=script&lang=js&\"","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FolderTagPreview.vue?vue&type=style&index=0&id=72c8239b&lang=scss&scoped=true&\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import { render, staticRenderFns } from \"./FolderTagPreview.vue?vue&type=template&id=72c8239b&scoped=true&\"\nimport script from \"./FolderTagPreview.vue?vue&type=script&lang=js&\"\nexport * from \"./FolderTagPreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FolderTagPreview.vue?vue&type=style&index=0&id=72c8239b&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"72c8239b\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.error === 404)?_c('EmptyContent',{attrs:{\"illustration-name\":\"folder\"}},[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'This folder does not exist'))+\"\\n\")]):(_vm.error)?_c('EmptyContent',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'An error occurred'))+\"\\n\")]):(!_vm.loading)?_c('div',[(_vm.folder)?_c('Navigation',_vm._b({key:\"navigation\",attrs:{\"root-title\":_vm.rootTitle,\"show-actions\":true}},'Navigation',_vm.folder,false)):_vm._e(),_vm._v(\" \"),(_vm.isEmpty)?_c('EmptyContent',{key:\"emptycontent\",attrs:{\"illustration-name\":\"empty\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('photos', 'No photos in here'))+\"\\n\\t\")]):_c('div',{staticClass:\"grid-container\"},[_c('VirtualGrid',{ref:\"virtualgrid\",attrs:{\"items\":_vm.contentList,\"get-column-count\":function () { return _vm.gridConfig.count; },\"get-grid-gap\":function () { return _vm.gridConfig.gap; }}})],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { genFileInfo, encodeFilePath } from '../utils/fileUtils'\nimport allowedMimes from './AllowedMimes'\n\n/**\n * List files from a folder and filter out unwanted mimes\n *\n * @param {String} path the path relative to the user root\n * @param {Object} [options] optional options for axios\n * @param {boolean} [shared] fetch shared albums ?\n * @returns {Array} the file list\n */\nexport default async function(path = '/', options = {}) {\n\tconst prefixPath = generateUrl(`/apps/photos/api/v1/${options.shared ? 'shared' : 'albums'}`)\n\n\t// fetch listing\n\tconst response = await axios.get(prefixPath + encodeFilePath(path), options)\n\tconst list = response.data.map(data => genFileInfo(data))\n\n\t// filter all the files and folders\n\tlet folder = {}\n\tconst folders = []\n\tconst files = []\n\n\tfor (const entry of list) {\n\t\t// is this the current provided path ?\n\t\tif (entry.filename === path) {\n\t\t\tfolder = entry\n\t\t} else if (entry.type !== 'file') {\n\t\t\tfolders.push(entry)\n\t\t} else if (allowedMimes.indexOf(entry.mime) > -1) {\n\t\t\tfiles.push(entry)\n\t\t}\n\t}\n\n\t// return current folder, subfolders and files\n\treturn { folder, folders, files }\n}\n","<!--\n - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Corentin Mors <medias@pixelswap.fr>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<FolderTagPreview :id=\"item.injected.fileid\"\n\t\t:name=\"item.injected.basename\"\n\t\t:path=\"item.injected.filename\"\n\t\t:file-list=\"previewFiles\" />\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\n\nimport getAlbumContent from '../services/AlbumContent'\nimport cancelableRequest from '../utils/CancelableRequest'\nimport FolderTagPreview from './FolderTagPreview'\n\nexport default {\n\tname: 'Folder',\n\n\tcomponents: {\n\t\tFolderTagPreview,\n\t},\n\tinheritAttrs: false,\n\n\tprops: {\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tcancelRequest: null,\n\t\t\tpreviewFolder: this.item.injected.fileid,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// global lists\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t\t'folders',\n\t\t]),\n\n\t\t// files list of the current folder\n\t\tfolderContent() {\n\t\t\treturn this.folders[this.item.injected.fileid]\n\t\t},\n\t\tpreviewFiles() {\n\t\t\tconst previewFolderContent = this.folders[this.previewFolder]\n\n\t\t\tconst previewFiles = previewFolderContent\n\t\t\t\t? previewFolderContent\n\t\t\t\t\t.map(id => this.files[id])\n\t\t\t\t\t.slice(0, 4) // only get the 4 first images\n\t\t\t\t: []\n\n\t\t\t// If we didn't found any previews in the folder we try the next subfolder\n\t\t\t// We limit to one subfolder for performance concerns\n\t\t\tif (previewFiles.length === 0\n\t\t\t\t&& this.files[this.previewFolder].folders\n\t\t\t\t&& this.previewFolder === this.item.injected.fileid) {\n\n\t\t\t\tconst firstChildFolder = this.files[this.previewFolder].folders[0]\n\t\t\t\tthis.updatePreviewFolder(firstChildFolder)\n\n\t\t\t\tif (!this.folders[this.previewFolder]) {\n\t\t\t\t\tthis.getFolderData(this.files[this.previewFolder].filename)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn previewFiles\n\t\t},\n\t},\n\n\tasync created() {\n\t\tif (!this.folderContent) {\n\t\t\tawait this.getFolderData(this.item.injected.filename)\n\t\t}\n\t},\n\n\tbeforeDestroy() {\n\t\t// cancel any pending requests\n\t\tif (this.cancelRequest) {\n\t\t\tthis.cancelRequest('Navigated away')\n\t\t}\n\t},\n\n\tmethods: {\n\t\tasync getFolderData(filename) {\n\t\t\t// init cancellable request\n\t\t\tconst { request, cancel } = cancelableRequest(getAlbumContent)\n\t\t\tthis.cancelRequest = cancel\n\n\t\t\ttry {\n\t\t\t\t// get data\n\t\t\t\tconst { folder, folders, files } = await request(filename, { shared: this.item.injected.showShared })\n\t\t\t\tthis.$store.dispatch('updateFolders', { fileid: folder.fileid, files, folders })\n\t\t\t\tthis.$store.dispatch('updateFiles', { folder, files, folders })\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\tconsole.error('Failed to get folder content', filename, error.response)\n\t\t\t\t}\n\t\t\t\t// else we just cancelled the request\n\t\t\t} finally {\n\t\t\t\tthis.cancelRequest = null\n\t\t\t}\n\t\t},\n\n\t\tupdatePreviewFolder(path) {\n\t\t\tthis.previewFolder = path\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../mixins/FileFolder.scss';\n\n.folder-content {\n\tposition: absolute;\n\tdisplay: grid;\n\twidth: 100%;\n\theight: 100%;\n\t// folder layout if less than 4 pictures\n\t&--grid-1 {\n\t\tgrid-template-columns: 1fr;\n\t\tgrid-template-rows: 1fr;\n\t}\n\t&--grid-2 {\n\t\tgrid-template-columns: 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t}\n\t&--grid-3 {\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t\timg:first-child {\n\t\t\tgrid-column: span 2;\n\t\t}\n\t}\n\t&--grid-4 {\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t}\n\timg {\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tobject-fit: cover;\n\t}\n}\n\n$name-height: 1rem;\n\n.folder-name {\n\tposition: absolute;\n\tz-index: 3;\n\tdisplay: flex;\n\toverflow: hidden;\n\tflex-direction: column;\n\twidth: 100%;\n\theight: 100%;\n\ttransition: opacity var(--animation-quick) ease-in-out;\n\topacity: 1;\n\t&__icon {\n\t\theight: 40%;\n\t\tmargin-top: calc(30% - #{$name-height} / 2); // center name+icon\n\t\tbackground-size: 40%;\n\t}\n\t&__name {\n\t\toverflow: hidden;\n\t\theight: $name-height;\n\t\tpadding: 0 10px;\n\t\ttext-align: center;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-main-background);\n\t\ttext-shadow: 0 0 8px var(--color-main-text);\n\t\tfont-size: $name-height;\n\t\tline-height: $name-height;\n\t}\n}\n\n// Cover management empty/full\n.folder {\n\t// if no img, let's display the folder icon as default black\n\t&--clear {\n\t\t.folder-name__icon {\n\t\t\topacity: .3;\n\t\t}\n\t\t.folder-name__name {\n\t\t\tcolor: var(--color-main-text);\n\t\t\ttext-shadow: 0 0 8px var(--color-main-background);\n\t\t}\n\t}\n\n\t// show the cover as background\n\t// if there are pictures in it\n\t// so we can sho the folder+name above it\n\t&:not(.folder--clear) {\n\t\t.cover {\n\t\t\topacity: .3;\n\t\t}\n\n\t\t// hide everything but pictures\n\t\t// on hover/active/focus\n\t\t&.active,\n\t\t&:active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\t.folder-name,\n\t\t\t.cover {\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Folder.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Folder.vue?vue&type=script&lang=js&\"","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Folder.vue?vue&type=style&index=0&id=95e00322&lang=scss&scoped=true&\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import { render, staticRenderFns } from \"./Folder.vue?vue&type=template&id=95e00322&scoped=true&\"\nimport script from \"./Folder.vue?vue&type=script&lang=js&\"\nexport * from \"./Folder.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Folder.vue?vue&type=style&index=0&id=95e00322&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"95e00322\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('FolderTagPreview',{attrs:{\"id\":_vm.item.injected.fileid,\"name\":_vm.item.injected.basename,\"path\":_vm.item.injected.filename,\"file-list\":_vm.previewFiles}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Corentin Mors <medias@pixelswap.fr>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<!-- Errors handlers-->\n\t<EmptyContent v-if=\"error === 404\" illustration-name=\"folder\">\n\t\t{{ t('photos', 'This folder does not exist') }}\n\t</EmptyContent>\n\t<EmptyContent v-else-if=\"error\">\n\t\t{{ t('photos', 'An error occurred') }}\n\t</EmptyContent>\n\n\t<!-- Folder content -->\n\t<div v-else-if=\"!loading\">\n\t\t<Navigation v-if=\"folder\"\n\t\t\tkey=\"navigation\"\n\t\t\tv-bind=\"folder\"\n\t\t\t:root-title=\"rootTitle\"\n\t\t\t:show-actions=\"true\" />\n\t\t<!-- Empty folder, should only happen via direct link -->\n\t\t<EmptyContent v-if=\"isEmpty\" key=\"emptycontent\" illustration-name=\"empty\">\n\t\t\t{{ t('photos', 'No photos in here') }}\n\t\t</EmptyContent>\n\n\t\t<div v-else class=\"grid-container\">\n\t\t\t<VirtualGrid\n\t\t\t\tref=\"virtualgrid\"\n\t\t\t\t:items=\"contentList\"\n\t\t\t\t:get-column-count=\"() => gridConfig.count\"\n\t\t\t\t:get-grid-gap=\"() => gridConfig.gap\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\n\nimport getAlbumContent from '../services/AlbumContent'\n\nimport VirtualGrid from 'vue-virtual-grid'\nimport EmptyContent from '../components/EmptyContent'\nimport Folder from '../components/Folder'\nimport File from '../components/File'\nimport Navigation from '../components/Navigation'\n\nimport GridConfigMixin from '../mixins/GridConfig'\n\nimport cancelableRequest from '../utils/CancelableRequest'\n\nexport default {\n\tname: 'Albums',\n\tcomponents: {\n\t\tVirtualGrid,\n\t\tEmptyContent,\n\t\tNavigation,\n\t},\n\tmixins: [GridConfigMixin],\n\tprops: {\n\t\trootTitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\tdefault: '/',\n\t\t},\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t\tshowShared: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\terror: null,\n\t\t\tcancelRequest: () => {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// global lists\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t\t'folders',\n\t\t]),\n\n\t\t// current folder id from current path\n\t\tfolderId() {\n\t\t\treturn this.$store.getters.folderId(this.path)\n\t\t},\n\n\t\t// files list of the current folder\n\t\tfolder() {\n\t\t\treturn this.files[this.folderId]\n\t\t},\n\t\tfolderContent() {\n\t\t\treturn this.folders[this.folderId]\n\t\t},\n\t\tfileList() {\n\t\t\tconst list = this.folderContent\n\t\t\t\t&& this.folderContent\n\t\t\t\t\t.map(id => this.files[id])\n\t\t\t\t\t.filter(file => !!file)\n\t\t\treturn list\n\t\t},\n\n\t\t// subfolders of the current folder\n\t\tsubFolders() {\n\t\t\treturn this.folderId\n\t\t\t\t&& this.files[this.folderId]\n\t\t\t\t&& this.files[this.folderId].folders\n\t\t},\n\t\tfolderList() {\n\t\t\tconst list = this.subFolders\n\t\t\t\t&& this.subFolders\n\t\t\t\t\t.map(id => this.files[id])\n\t\t\t\t\t.filter(file => !!file)\n\t\t\treturn list\n\t\t},\n\t\tcontentList() {\n\t\t\tconst folders = this.folderList?.map((folder) => {\n\t\t\t\treturn {\n\t\t\t\t\tid: `folder-${folder.fileid}`,\n\t\t\t\t\tinjected: {\n\t\t\t\t\t\t...folder,\n\t\t\t\t\t\tshowShared: this.showShared,\n\t\t\t\t\t},\n\t\t\t\t\twidth: 256,\n\t\t\t\t\theight: 256,\n\t\t\t\t\tcolumnSpan: 1,\n\t\t\t\t\trenderComponent: Folder,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst files = this.fileList?.map((file) => {\n\t\t\t\treturn {\n\t\t\t\t\tid: `file-${file.fileid}`,\n\t\t\t\t\tinjected: {\n\t\t\t\t\t\t...file,\n\t\t\t\t\t\tlist: this.fileList,\n\t\t\t\t\t},\n\t\t\t\t\twidth: 256,\n\t\t\t\t\theight: 256,\n\t\t\t\t\tcolumnSpan: 1,\n\t\t\t\t\trenderComponent: File,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn [...(folders || []), ...(files || [])]\n\t\t},\n\n\t\t// is current folder empty?\n\t\tisEmpty() {\n\t\t\treturn !this.haveFiles && !this.haveFolders\n\t\t},\n\t\thaveFiles() {\n\t\t\treturn !!this.fileList && this.fileList.length !== 0\n\t\t},\n\t\thaveFolders() {\n\t\t\treturn !!this.folderList && this.folderList.length !== 0\n\t\t},\n\t},\n\n\twatch: {\n\t\tpath() {\n\t\t\tthis.fetchFolderContent()\n\t\t},\n\t\tshowShared() {\n\t\t\tthis.fetchFolderContent()\n\t\t},\n\t},\n\n\tasync beforeMount() {\n\t\tthis.fetchFolderContent()\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.cancelRequest('Changed view')\n\t},\n\n\tmethods: {\n\t\tasync fetchFolderContent() {\n\t\t\t// cancel any pending requests\n\t\t\tthis.cancelRequest('Changed folder')\n\n\t\t\t// close any potential opened viewer & sidebar\n\t\t\tOCA.Viewer && OCA.Viewer.close && OCA.Viewer.close()\n\t\t\tOCA.Files && OCA.Files.Sidebar.close && OCA.Files.Sidebar.close()\n\n\t\t\t// if we don't already have some cached data let's show a loader\n\t\t\tif (!this.files[this.folderId] || !this.folders[this.folderId]) {\n\t\t\t\tthis.$emit('update:loading', true)\n\t\t\t}\n\t\t\tthis.error = null\n\n\t\t\t// init cancellable request\n\t\t\tconst { request, cancel } = cancelableRequest(getAlbumContent)\n\t\t\tthis.cancelRequest = cancel\n\n\t\t\ttry {\n\t\t\t\t// get content and current folder info\n\t\t\t\tconst { folder, folders, files } = await request(this.path, { shared: this.showShared })\n\t\t\t\tthis.$store.dispatch('addPath', { path: this.path, fileid: folder.fileid })\n\t\t\t\tthis.$store.dispatch('updateFolders', { fileid: folder.fileid, files, folders })\n\t\t\t\tthis.$store.dispatch('updateFiles', { folder, files, folders })\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\tif (error.response.status === 404) {\n\t\t\t\t\t\tthis.error = 404\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.$router.push({ name: this.$route.name })\n\t\t\t\t\t\t}, 3000)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// cancelled request, moving on...\n\t\t\t\tconsole.error('Error fetching album data', error)\n\t\t\t} finally {\n\t\t\t\t// done loading even with errors\n\t\t\t\tthis.$emit('update:loading', false)\n\t\t\t}\n\t\t},\n\t},\n\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../mixins/GridSizes.scss';\n\n.grid-container {\n\t@include grid-sizes using ($marginTop, $marginW) {\n\t\tpadding: 0px #{$marginW}px 256px #{$marginW}px;\n\t}\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Albums.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Albums.vue?vue&type=script&lang=js&\"","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Albums.vue?vue&type=style&index=0&id=26fc5baa&lang=scss&scoped=true&\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import { render, staticRenderFns } from \"./Albums.vue?vue&type=template&id=26fc5baa&scoped=true&\"\nimport script from \"./Albums.vue?vue&type=script&lang=js&\"\nexport * from \"./Albums.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Albums.vue?vue&type=style&index=0&id=26fc5baa&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"26fc5baa\",\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///photos/src/components/Folder.vue?vue&type=style&index=0&id=51e636c4&lang=scss&scoped=true&","webpack:///photos/src/components/FolderTagPreview.vue?vue&type=style&index=0&id=f33ea62c&lang=scss&scoped=true&","webpack:///photos/src/views/Albums.vue?vue&type=style&index=0&id=593c4f4a&lang=scss&scoped=true&","webpack:///photos/src/components/FolderTagPreview.vue?vue&type=template&id=f33ea62c&scoped=true&","webpack:///photos/src/components/FolderTagPreview.vue","webpack:///photos/src/components/FolderTagPreview.vue?vue&type=script&lang=js&","webpack://photos/./src/components/FolderTagPreview.vue?0e06","webpack://photos/./src/components/FolderTagPreview.vue?9d8b","webpack:///photos/src/views/Albums.vue?vue&type=template&id=593c4f4a&scoped=true&","webpack:///photos/src/services/AlbumContent.js","webpack:///photos/src/components/Folder.vue","webpack:///photos/src/components/Folder.vue?vue&type=script&lang=js&","webpack://photos/./src/components/Folder.vue?b70b","webpack://photos/./src/components/Folder.vue?c398","webpack:///photos/src/components/Folder.vue?vue&type=template&id=51e636c4&scoped=true&","webpack:///photos/src/views/Albums.vue","webpack:///photos/src/views/Albums.vue?vue&type=script&lang=js&","webpack://photos/./src/views/Albums.vue?98be","webpack://photos/./src/views/Albums.vue?2029"],"names":["___CSS_LOADER_EXPORT___","push","module","id","options","_vm","this","_h","$createElement","_c","_self","staticClass","class","isEmpty","attrs","to","ariaLabel","directives","name","rawName","value","expression","previewList","_l","file","key","fileid","generateImgSrc","on","$event","loaded","onPreviewFail","_v","icon","ariaUuid","_s","path","prefixPath","generateUrl","shared","axios","encodeFilePath","response","list","data","map","genFileInfo","folder","folders","files","entry","filename","type","allowedMimes","mime","item","injected","basename","previewFiles","error","t","loading","_e","_b","rootTitle","ref","contentList","gridConfig","count","gap"],"mappings":"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","file":"photos-src_views_Albums_vue.js?v=dd16c261a515d6bd7466","sourcesContent":["// Imports\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(true);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".file[data-v-51e636c4],.folder[data-v-51e636c4]{position:relative;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:var(--border-radius);overflow:hidden}.file .cover[data-v-51e636c4],.folder .cover[data-v-51e636c4]{z-index:2;width:100%;padding-bottom:100%;transition:opacity var(--animation-quick) ease-in-out;opacity:0;background-color:var(--color-main-text)}.file.active .cover[data-v-51e636c4],.file:active .cover[data-v-51e636c4],.file:hover .cover[data-v-51e636c4],.file:focus .cover[data-v-51e636c4],.folder.active .cover[data-v-51e636c4],.folder:active .cover[data-v-51e636c4],.folder:hover .cover[data-v-51e636c4],.folder:focus .cover[data-v-51e636c4]{opacity:.3}.file--clear.active .cover[data-v-51e636c4],.file--clear:active .cover[data-v-51e636c4],.file--clear:hover .cover[data-v-51e636c4],.file--clear:focus .cover[data-v-51e636c4],.folder--clear.active .cover[data-v-51e636c4],.folder--clear:active .cover[data-v-51e636c4],.folder--clear:hover .cover[data-v-51e636c4],.folder--clear:focus .cover[data-v-51e636c4]{opacity:.1}.fade-enter-active[data-v-51e636c4],.fade-leave-active[data-v-51e636c4]{transition:opacity var(--animation-quick) ease-in-out}.fade-enter[data-v-51e636c4],.fade-leave-to[data-v-51e636c4]{opacity:0}.folder-content[data-v-51e636c4]{position:absolute;display:grid;width:100%;height:100%}.folder-content--grid-1[data-v-51e636c4]{grid-template-columns:1fr;grid-template-rows:1fr}.folder-content--grid-2[data-v-51e636c4]{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.folder-content--grid-3[data-v-51e636c4]{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.folder-content--grid-3 img[data-v-51e636c4]:first-child{grid-column:span 2}.folder-content--grid-4[data-v-51e636c4]{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.folder-content img[data-v-51e636c4]{width:100%;height:100%;object-fit:cover}.folder-name[data-v-51e636c4]{position:absolute;z-index:3;display:flex;overflow:hidden;flex-direction:column;width:100%;height:100%;transition:opacity var(--animation-quick) ease-in-out;opacity:1}.folder-name__icon[data-v-51e636c4]{height:40%;margin-top:calc(30% - 1rem / 2);background-size:40%}.folder-name__name[data-v-51e636c4]{overflow:hidden;height:1rem;padding:0 10px;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:var(--color-main-background);text-shadow:0 0 8px var(--color-main-text);font-size:1rem;line-height:1rem}.folder--clear .folder-name__icon[data-v-51e636c4]{opacity:.3}.folder--clear .folder-name__name[data-v-51e636c4]{color:var(--color-main-text);text-shadow:0 0 8px var(--color-main-background)}.folder:not(.folder--clear) .cover[data-v-51e636c4]{opacity:.3}.folder:not(.folder--clear).active .folder-name[data-v-51e636c4],.folder:not(.folder--clear).active .cover[data-v-51e636c4],.folder:not(.folder--clear):active .folder-name[data-v-51e636c4],.folder:not(.folder--clear):active .cover[data-v-51e636c4],.folder:not(.folder--clear):hover .folder-name[data-v-51e636c4],.folder:not(.folder--clear):hover .cover[data-v-51e636c4],.folder:not(.folder--clear):focus .folder-name[data-v-51e636c4],.folder:not(.folder--clear):focus .cover[data-v-51e636c4]{opacity:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://src/mixins/FileFolder.scss\",\"webpack://src/components/Folder.vue\"],\"names\":[],\"mappings\":\"AAsBA,gDAEC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,wBAAA,CAAA,gBAAA,CACA,kCAAA,CACA,eAAA,CAEA,8DACC,SAAA,CAMA,UAAA,CACA,mBAAA,CACA,qDAAA,CACA,SAAA,CACA,uCAAA,CAOA,4SACC,UAAA,CAQD,oWACC,UAAA,CAKH,wEACC,qDAAA,CAGD,6DACC,SAAA,CCwED,iCACC,iBAAA,CACA,YAAA,CACA,UAAA,CACA,WAAA,CAEA,yCACC,yBAAA,CACA,sBAAA,CAED,yCACC,yBAAA,CACA,0BAAA,CAED,yCACC,6BAAA,CACA,0BAAA,CACA,yDACC,kBAAA,CAGF,yCACC,6BAAA,CACA,0BAAA,CAED,qCACC,UAAA,CACA,WAAA,CAEA,gBAAA,CAMF,8BACC,iBAAA,CACA,SAAA,CACA,YAAA,CACA,eAAA,CACA,qBAAA,CACA,UAAA,CACA,WAAA,CACA,qDAAA,CACA,SAAA,CACA,oCACC,UAAA,CACA,+BAAA,CACA,mBAAA,CAED,oCACC,eAAA,CACA,WAnBY,CAoBZ,cAAA,CACA,iBAAA,CACA,kBAAA,CACA,sBAAA,CACA,kCAAA,CACA,0CAAA,CACA,cA1BY,CA2BZ,gBA3BY,CAmCZ,mDACC,UAAA,CAED,mDACC,4BAAA,CACA,gDAAA,CAQD,oDACC,UAAA,CASA,4eAEC,SAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @author John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @license AGPL-3.0-or-later\\n *\\n * This program is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU Affero General Public License as\\n * published by the Free Software Foundation, either version 3 of the\\n * License, or (at your option) any later version.\\n *\\n * This program is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU Affero General Public License for more details.\\n *\\n * You should have received a copy of the GNU Affero General Public License\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\n *\\n */\\n\\n.file,\\n.folder {\\n\\tposition: relative;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tuser-select: none;\\n\\tborder-radius: var(--border-radius);\\n\\toverflow: hidden;\\n\\n\\t.cover {\\n\\t\\tz-index: 2;\\n\\t\\t// We want nice squares despite anything that is in it.\\n\\t\\t// The .cover is what makes the exact square size of the grid.\\n\\t\\t// We use padding-bottom because padding with percentage\\n\\t\\t// always refers to the width. And we only want to fit\\n\\t\\t// the css grid's width.\\n\\t\\twidth: 100%;\\n\\t\\tpadding-bottom: 100%;\\n\\t\\ttransition: opacity var(--animation-quick) ease-in-out;\\n\\t\\topacity: 0;\\n\\t\\tbackground-color: var(--color-main-text);\\n\\t}\\n\\n\\t&.active,\\n\\t&:active,\\n\\t&:hover,\\n\\t&:focus {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t}\\n\\n\\t&--clear.active,\\n\\t&--clear:active,\\n\\t&--clear:hover,\\n\\t&--clear:focus {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .1;\\n\\t\\t}\\n\\t}\\n}\\n\\n.fade-enter-active, .fade-leave-active {\\n\\ttransition: opacity var(--animation-quick) ease-in-out;\\n}\\n\\n.fade-enter, .fade-leave-to {\\n\\topacity: 0;\\n}\\n\",\"$sizes: (400: (count: 3, marginTop: 66, marginW: 8), 700: (count: 4, marginTop: 66, marginW: 8), 1024: (count: 5, marginTop: 66, marginW: 44), 1280: (count: 4, marginTop: 66, marginW: 44), 1440: (count: 5, marginTop: 88, marginW: 66), 1600: (count: 6, marginTop: 88, marginW: 66), 2048: (count: 7, marginTop: 88, marginW: 66), 2560: (count: 8, marginTop: 88, marginW: 88), 3440: (count: 9, marginTop: 88, marginW: 88), max: (count: 10, marginTop: 88, marginW: 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n@import '../mixins/FileFolder.scss';\\n\\n.folder-content {\\n\\tposition: absolute;\\n\\tdisplay: grid;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\t// folder layout if less than 4 pictures\\n\\t&--grid-1 {\\n\\t\\tgrid-template-columns: 1fr;\\n\\t\\tgrid-template-rows: 1fr;\\n\\t}\\n\\t&--grid-2 {\\n\\t\\tgrid-template-columns: 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t}\\n\\t&--grid-3 {\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t\\timg:first-child {\\n\\t\\t\\tgrid-column: span 2;\\n\\t\\t}\\n\\t}\\n\\t&--grid-4 {\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t}\\n\\timg {\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\n\\t\\tobject-fit: cover;\\n\\t}\\n}\\n\\n$name-height: 1rem;\\n\\n.folder-name {\\n\\tposition: absolute;\\n\\tz-index: 3;\\n\\tdisplay: flex;\\n\\toverflow: hidden;\\n\\tflex-direction: column;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\ttransition: opacity var(--animation-quick) ease-in-out;\\n\\topacity: 1;\\n\\t&__icon {\\n\\t\\theight: 40%;\\n\\t\\tmargin-top: calc(30% - #{$name-height} / 2); // center name+icon\\n\\t\\tbackground-size: 40%;\\n\\t}\\n\\t&__name {\\n\\t\\toverflow: hidden;\\n\\t\\theight: $name-height;\\n\\t\\tpadding: 0 10px;\\n\\t\\ttext-align: center;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\tcolor: var(--color-main-background);\\n\\t\\ttext-shadow: 0 0 8px var(--color-main-text);\\n\\t\\tfont-size: $name-height;\\n\\t\\tline-height: $name-height;\\n\\t}\\n}\\n\\n// Cover management empty/full\\n.folder {\\n\\t// if no img, let's display the folder icon as default black\\n\\t&--clear {\\n\\t\\t.folder-name__icon {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t\\t.folder-name__name {\\n\\t\\t\\tcolor: var(--color-main-text);\\n\\t\\t\\ttext-shadow: 0 0 8px var(--color-main-background);\\n\\t\\t}\\n\\t}\\n\\n\\t// show the cover as background\\n\\t// if there are pictures in it\\n\\t// so we can sho the folder+name above it\\n\\t&:not(.folder--clear) {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\n\\t\\t// hide everything but pictures\\n\\t\\t// on hover/active/focus\\n\\t\\t&.active,\\n\\t\\t&:active,\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\t.folder-name,\\n\\t\\t\\t.cover {\\n\\t\\t\\t\\topacity: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(true);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".file[data-v-f33ea62c],.folder[data-v-f33ea62c]{position:relative;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:var(--border-radius);overflow:hidden}.file .cover[data-v-f33ea62c],.folder .cover[data-v-f33ea62c]{z-index:2;width:100%;padding-bottom:100%;transition:opacity var(--animation-quick) ease-in-out;opacity:0;background-color:var(--color-main-text)}.file.active .cover[data-v-f33ea62c],.file:active .cover[data-v-f33ea62c],.file:hover .cover[data-v-f33ea62c],.file:focus .cover[data-v-f33ea62c],.folder.active .cover[data-v-f33ea62c],.folder:active .cover[data-v-f33ea62c],.folder:hover .cover[data-v-f33ea62c],.folder:focus .cover[data-v-f33ea62c]{opacity:.3}.file--clear.active .cover[data-v-f33ea62c],.file--clear:active .cover[data-v-f33ea62c],.file--clear:hover .cover[data-v-f33ea62c],.file--clear:focus .cover[data-v-f33ea62c],.folder--clear.active .cover[data-v-f33ea62c],.folder--clear:active .cover[data-v-f33ea62c],.folder--clear:hover .cover[data-v-f33ea62c],.folder--clear:focus .cover[data-v-f33ea62c]{opacity:.1}.fade-enter-active[data-v-f33ea62c],.fade-leave-active[data-v-f33ea62c]{transition:opacity var(--animation-quick) ease-in-out}.fade-enter[data-v-f33ea62c],.fade-leave-to[data-v-f33ea62c]{opacity:0}.folder-content[data-v-f33ea62c]{position:absolute;display:grid;width:100%;height:100%}.folder-content--grid-1[data-v-f33ea62c]{grid-template-columns:1fr;grid-template-rows:1fr}.folder-content--grid-2[data-v-f33ea62c]{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.folder-content--grid-3[data-v-f33ea62c]{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.folder-content--grid-3 img[data-v-f33ea62c]:first-child{grid-column:span 2}.folder-content--grid-4[data-v-f33ea62c]{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.folder-content img[data-v-f33ea62c]{width:100%;height:100%;object-fit:cover}.folder-name[data-v-f33ea62c]{position:absolute;z-index:3;display:flex;overflow:hidden;flex-direction:column;width:100%;height:100%;transition:opacity var(--animation-quick) ease-in-out;opacity:1}.folder-name__icon[data-v-f33ea62c]{height:40%;margin-top:calc(30% - 1rem / 2);background-size:40%}.folder-name__name[data-v-f33ea62c]{overflow:hidden;height:1rem;padding:0 10px;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:var(--color-main-background);text-shadow:0 0 8px var(--color-main-text);font-size:1rem;line-height:1rem}.folder--clear .folder-name__icon[data-v-f33ea62c]{opacity:.3}.folder--clear .folder-name__name[data-v-f33ea62c]{color:var(--color-main-text);text-shadow:0 0 8px var(--color-main-background)}.folder:not(.folder--clear) .cover[data-v-f33ea62c]{opacity:.3}.folder:not(.folder--clear):active .folder-name[data-v-f33ea62c],.folder:not(.folder--clear):active .cover[data-v-f33ea62c],.folder:not(.folder--clear):hover .folder-name[data-v-f33ea62c],.folder:not(.folder--clear):hover .cover[data-v-f33ea62c],.folder:not(.folder--clear):focus .folder-name[data-v-f33ea62c],.folder:not(.folder--clear):focus .cover[data-v-f33ea62c]{opacity:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://src/mixins/FileFolder.scss\",\"webpack://src/components/FolderTagPreview.vue\"],\"names\":[],\"mappings\":\"AAsBA,gDAEC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,wBAAA,CAAA,gBAAA,CACA,kCAAA,CACA,eAAA,CAEA,8DACC,SAAA,CAMA,UAAA,CACA,mBAAA,CACA,qDAAA,CACA,SAAA,CACA,uCAAA,CAOA,4SACC,UAAA,CAQD,oWACC,UAAA,CAKH,wEACC,qDAAA,CAGD,6DACC,SAAA,CCmFD,iCACC,iBAAA,CACA,YAAA,CACA,UAAA,CACA,WAAA,CAEA,yCACC,yBAAA,CACA,sBAAA,CAED,yCACC,yBAAA,CACA,0BAAA,CAED,yCACC,6BAAA,CACA,0BAAA,CACA,yDACC,kBAAA,CAGF,yCACC,6BAAA,CACA,0BAAA,CAED,qCACC,UAAA,CACA,WAAA,CAEA,gBAAA,CAMF,8BACC,iBAAA,CACA,SAAA,CACA,YAAA,CACA,eAAA,CACA,qBAAA,CACA,UAAA,CACA,WAAA,CACA,qDAAA,CACA,SAAA,CACA,oCACC,UAAA,CACA,+BAAA,CACA,mBAAA,CAED,oCACC,eAAA,CACA,WAnBY,CAoBZ,cAAA,CACA,iBAAA,CACA,kBAAA,CACA,sBAAA,CACA,kCAAA,CACA,0CAAA,CACA,cA1BY,CA2BZ,gBA3BY,CAmCZ,mDACC,UAAA,CAED,mDACC,4BAAA,CACA,gDAAA,CAQD,oDACC,UAAA,CAQA,gXAEC,SAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @author John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @license AGPL-3.0-or-later\\n *\\n * This program is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU Affero General Public License as\\n * published by the Free Software Foundation, either version 3 of the\\n * License, or (at your option) any later version.\\n *\\n * This program is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU Affero General Public License for more details.\\n *\\n * You should have received a copy of the GNU Affero General Public License\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\n *\\n */\\n\\n.file,\\n.folder {\\n\\tposition: relative;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tuser-select: none;\\n\\tborder-radius: var(--border-radius);\\n\\toverflow: hidden;\\n\\n\\t.cover {\\n\\t\\tz-index: 2;\\n\\t\\t// We want nice squares despite anything that is in it.\\n\\t\\t// The .cover is what makes the exact square size of the grid.\\n\\t\\t// We use padding-bottom because padding with percentage\\n\\t\\t// always refers to the width. And we only want to fit\\n\\t\\t// the css grid's width.\\n\\t\\twidth: 100%;\\n\\t\\tpadding-bottom: 100%;\\n\\t\\ttransition: opacity var(--animation-quick) ease-in-out;\\n\\t\\topacity: 0;\\n\\t\\tbackground-color: var(--color-main-text);\\n\\t}\\n\\n\\t&.active,\\n\\t&:active,\\n\\t&:hover,\\n\\t&:focus {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t}\\n\\n\\t&--clear.active,\\n\\t&--clear:active,\\n\\t&--clear:hover,\\n\\t&--clear:focus {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .1;\\n\\t\\t}\\n\\t}\\n}\\n\\n.fade-enter-active, .fade-leave-active {\\n\\ttransition: opacity var(--animation-quick) ease-in-out;\\n}\\n\\n.fade-enter, .fade-leave-to {\\n\\topacity: 0;\\n}\\n\",\"$sizes: (400: (count: 3, marginTop: 66, marginW: 8), 700: (count: 4, marginTop: 66, marginW: 8), 1024: (count: 5, marginTop: 66, marginW: 44), 1280: (count: 4, marginTop: 66, marginW: 44), 1440: (count: 5, marginTop: 88, marginW: 66), 1600: (count: 6, marginTop: 88, marginW: 66), 2048: (count: 7, marginTop: 88, marginW: 66), 2560: (count: 8, marginTop: 88, marginW: 88), 3440: (count: 9, marginTop: 88, marginW: 88), max: (count: 10, marginTop: 88, marginW: 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n@import '../mixins/FileFolder.scss';\\n\\n.folder-content {\\n\\tposition: absolute;\\n\\tdisplay: grid;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\t// folder layout if less than 4 pictures\\n\\t&--grid-1 {\\n\\t\\tgrid-template-columns: 1fr;\\n\\t\\tgrid-template-rows: 1fr;\\n\\t}\\n\\t&--grid-2 {\\n\\t\\tgrid-template-columns: 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t}\\n\\t&--grid-3 {\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t\\timg:first-child {\\n\\t\\t\\tgrid-column: span 2;\\n\\t\\t}\\n\\t}\\n\\t&--grid-4 {\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t\\tgrid-template-rows: 1fr 1fr;\\n\\t}\\n\\timg {\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\n\\t\\tobject-fit: cover;\\n\\t}\\n}\\n\\n$name-height: 1rem;\\n\\n.folder-name {\\n\\tposition: absolute;\\n\\tz-index: 3;\\n\\tdisplay: flex;\\n\\toverflow: hidden;\\n\\tflex-direction: column;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\ttransition: opacity var(--animation-quick) ease-in-out;\\n\\topacity: 1;\\n\\t&__icon {\\n\\t\\theight: 40%;\\n\\t\\tmargin-top: calc(30% - #{$name-height} / 2); // center name+icon\\n\\t\\tbackground-size: 40%;\\n\\t}\\n\\t&__name {\\n\\t\\toverflow: hidden;\\n\\t\\theight: $name-height;\\n\\t\\tpadding: 0 10px;\\n\\t\\ttext-align: center;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\tcolor: var(--color-main-background);\\n\\t\\ttext-shadow: 0 0 8px var(--color-main-text);\\n\\t\\tfont-size: $name-height;\\n\\t\\tline-height: $name-height;\\n\\t}\\n}\\n\\n// Cover management empty/full\\n.folder {\\n\\t// if no img, let's display the folder icon as default black\\n\\t&--clear {\\n\\t\\t.folder-name__icon {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t\\t.folder-name__name {\\n\\t\\t\\tcolor: var(--color-main-text);\\n\\t\\t\\ttext-shadow: 0 0 8px var(--color-main-background);\\n\\t\\t}\\n\\t}\\n\\n\\t// show the cover as background\\n\\t// if there are pictures in it\\n\\t// so we can sho the folder+name above it\\n\\t&:not(.folder--clear) {\\n\\t\\t.cover {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\n\\t\\t// hide everything but pictures\\n\\t\\t// on hover/active/focus\\n\\t\\t&:active,\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\t.folder-name,\\n\\t\\t\\t.cover {\\n\\t\\t\\t\\topacity: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(true);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@media(min-width: 0px)and (max-width: 400px){.grid-container[data-v-593c4f4a]{padding:0px 8px 256px 8px}}@media(min-width: 400px)and (max-width: 700px){.grid-container[data-v-593c4f4a]{padding:0px 8px 256px 8px}}@media(min-width: 700px)and (max-width: 1024px){.grid-container[data-v-593c4f4a]{padding:0px 44px 256px 44px}}@media(min-width: 1024px)and (max-width: 1280px){.grid-container[data-v-593c4f4a]{padding:0px 44px 256px 44px}}@media(min-width: 1280px)and (max-width: 1440px){.grid-container[data-v-593c4f4a]{padding:0px 66px 256px 66px}}@media(min-width: 1440px)and (max-width: 1600px){.grid-container[data-v-593c4f4a]{padding:0px 66px 256px 66px}}@media(min-width: 1600px)and (max-width: 2048px){.grid-container[data-v-593c4f4a]{padding:0px 66px 256px 66px}}@media(min-width: 2048px)and (max-width: 2560px){.grid-container[data-v-593c4f4a]{padding:0px 88px 256px 88px}}@media(min-width: 2560px)and (max-width: 3440px){.grid-container[data-v-593c4f4a]{padding:0px 88px 256px 88px}}@media(min-width: 3440px){.grid-container[data-v-593c4f4a]{padding:0px 88px 256px 88px}}\", \"\",{\"version\":3,\"sources\":[\"webpack://src/mixins/GridSizes.scss\",\"webpack://src/views/Albums.vue\"],\"names\":[],\"mappings\":\"AAoCG,6CC4NH,iCAEE,yBAAA,CAAA,CD9NC,+CC4NH,iCAEE,yBAAA,CAAA,CD9NC,gDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CD9NC,iDC4NH,iCAEE,2BAAA,CAAA,CDlOC,0BCgOH,iCAEE,2BAAA,CAAA\",\"sourcesContent\":[\"/**\\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @author John Molakvoæ <skjnldsv@protonmail.com>\\n *\\n * @license AGPL-3.0-or-later\\n *\\n * This program is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU Affero General Public License as\\n * published by the Free Software Foundation, either version 3 of the\\n * License, or (at your option) any later version.\\n *\\n * This program is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU Affero General Public License for more details.\\n *\\n * You should have received a copy of the GNU Affero General Public License\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\n *\\n */\\n@use 'sass:map';\\n\\n@mixin grid-sizes() {\\n\\t$previous: 0;\\n\\n\\t@each $size, $config in $sizes {\\n\\t\\t$count: map-get($config, 'count');\\n\\t\\t$marginTop: map-get($config, 'marginTop');\\n\\t\\t$marginW: map-get($config, 'marginW');\\n\\n\\t\\t@if $size == 'max' {\\n\\t\\t\\t@media (min-width: #{$previous}px) {\\n\\t\\t\\t\\t@content($marginTop, $marginW);\\n\\t\\t\\t}\\n\\t\\t} @else {\\n\\t\\t\\t@media (min-width: #{$previous}px) and (max-width: #{$size}px) {\\n\\t\\t\\t\\t@content($marginTop, $marginW);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t$previous: $size;\\n\\t}\\n}\\n\",\"$sizes: (400: (count: 3, marginTop: 66, marginW: 8), 700: (count: 4, marginTop: 66, marginW: 8), 1024: (count: 5, marginTop: 66, marginW: 44), 1280: (count: 4, marginTop: 66, marginW: 44), 1440: (count: 5, marginTop: 88, marginW: 66), 1600: (count: 6, marginTop: 88, marginW: 66), 2048: (count: 7, marginTop: 88, marginW: 66), 2560: (count: 8, marginTop: 88, marginW: 88), 3440: (count: 9, marginTop: 88, marginW: 88), max: (count: 10, marginTop: 88, marginW: 88));\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n@import '../mixins/GridSizes.scss';\\n\\n.grid-container {\\n\\t@include grid-sizes using ($marginTop, $marginW) {\\n\\t\\tpadding: 0px #{$marginW}px 256px #{$marginW}px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('router-link',{staticClass:\"folder\",class:{'folder--clear': _vm.isEmpty},attrs:{\"to\":_vm.to,\"aria-label\":_vm.ariaLabel}},[_c('transition',{attrs:{\"name\":\"fade\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.loaded),expression:\"loaded\"}],staticClass:\"folder-content\",class:(\"folder-content--grid-\" + (_vm.previewList.length)),attrs:{\"role\":\"none\"}},_vm._l((_vm.previewList),function(file){return _c('img',{key:file.fileid,attrs:{\"src\":_vm.generateImgSrc(file),\"alt\":\"\"},on:{\"load\":function($event){_vm.loaded = true},\"error\":function($event){return _vm.onPreviewFail(file)}}})}),0)]),_vm._v(\" \"),_c('div',{staticClass:\"folder-name\"},[_c('span',{staticClass:\"folder-name__icon\",class:[!_vm.isEmpty ? 'icon-white' : 'icon-dark', _vm.icon],attrs:{\"role\":\"img\"}}),_vm._v(\" \"),_c('p',{staticClass:\"folder-name__name\",attrs:{\"id\":_vm.ariaUuid}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.name)+\"\\n\\t\\t\")])]),_vm._v(\" \"),_c('div',{staticClass:\"cover\",attrs:{\"role\":\"none\"}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<router-link :class=\"{'folder--clear': isEmpty}\"\n\t\tclass=\"folder\"\n\t\t:to=\"to\"\n\t\t:aria-label=\"ariaLabel\">\n\t\t<!-- Images preview -->\n\t\t<transition name=\"fade\">\n\t\t\t<div v-show=\"loaded\"\n\t\t\t\t:class=\"`folder-content--grid-${previewList.length}`\"\n\t\t\t\tclass=\"folder-content\"\n\t\t\t\trole=\"none\">\n\t\t\t\t<img v-for=\"file in previewList\"\n\t\t\t\t\t:key=\"file.fileid\"\n\t\t\t\t\t:src=\"generateImgSrc(file)\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\t@load=\"loaded = true\"\n\t\t\t\t\t@error=\"onPreviewFail(file)\">\n\t\t\t</div>\n\t\t</transition>\n\n\t\t<div\n\t\t\tclass=\"folder-name\">\n\t\t\t<span :class=\"[!isEmpty ? 'icon-white' : 'icon-dark', icon]\"\n\t\t\t\tclass=\"folder-name__icon\"\n\t\t\t\trole=\"img\" />\n\t\t\t<p :id=\"ariaUuid\" class=\"folder-name__name\">\n\t\t\t\t{{ name }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<div class=\"cover\" role=\"none\" />\n\t</router-link>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'FolderTagPreview',\n\n\tprops: {\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\tdefault: 'icon-folder',\n\t\t},\n\t\tid: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tfileList: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloaded: false,\n\t\t\tfailed: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// folder is empty\n\t\tisEmpty() {\n\t\t\treturn this.previewList.length === 0\n\t\t},\n\n\t\tariaUuid() {\n\t\t\treturn `folder-${this.id}`\n\t\t},\n\t\tariaLabel() {\n\t\t\treturn t('photos', 'Open the \"{name}\" sub-directory', { name: this.name })\n\t\t},\n\n\t\t/**\n\t\t * Previews list without the failed ones\n\t\t *\n\t\t * @return {object[]} the previews fileinfo\n\t\t */\n\t\tpreviewList() {\n\t\t\treturn this.fileList\n\t\t\t\t.filter(file => this.failed.indexOf(file.fileid) === -1)\n\t\t},\n\n\t\t/**\n\t\t * We do not want encoded slashes when browsing by folder\n\t\t * so we generate a new valid route object based on the\n\t\t * current named route, get the final url back, decode it\n\t\t * and use it as a direct string.\n\t\t * Which vue-router does not encode afterwards!\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tto() {\n\t\t\t// always remove first slash, the router\n\t\t\t// manage it automatically\n\t\t\tconst regex = /^\\/?(.+)/i\n\t\t\tconst path = regex.exec(this.path)[1]\n\n\t\t\t// apply to current route\n\t\t\treturn Object.assign({}, this.$route, {\n\t\t\t\tparams: { path: path.split('/') },\n\t\t\t})\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgenerateImgSrc({ fileid, etag }) {\n\t\t\t// use etag to force cache reload if file changed\n\t\t\treturn generateUrl(`/core/preview?fileId=${fileid}&x=${256}&y=${256}&a=true&v=${etag}`)\n\t\t},\n\t\tonPreviewFail({ fileid }) {\n\t\t\tthis.failed.push(fileid)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../mixins/FileFolder.scss';\n\n.folder-content {\n\tposition: absolute;\n\tdisplay: grid;\n\twidth: 100%;\n\theight: 100%;\n\t// folder layout if less than 4 pictures\n\t&--grid-1 {\n\t\tgrid-template-columns: 1fr;\n\t\tgrid-template-rows: 1fr;\n\t}\n\t&--grid-2 {\n\t\tgrid-template-columns: 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t}\n\t&--grid-3 {\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t\timg:first-child {\n\t\t\tgrid-column: span 2;\n\t\t}\n\t}\n\t&--grid-4 {\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t}\n\timg {\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tobject-fit: cover;\n\t}\n}\n\n$name-height: 1rem;\n\n.folder-name {\n\tposition: absolute;\n\tz-index: 3;\n\tdisplay: flex;\n\toverflow: hidden;\n\tflex-direction: column;\n\twidth: 100%;\n\theight: 100%;\n\ttransition: opacity var(--animation-quick) ease-in-out;\n\topacity: 1;\n\t&__icon {\n\t\theight: 40%;\n\t\tmargin-top: calc(30% - #{$name-height} / 2); // center name+icon\n\t\tbackground-size: 40%;\n\t}\n\t&__name {\n\t\toverflow: hidden;\n\t\theight: $name-height;\n\t\tpadding: 0 10px;\n\t\ttext-align: center;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-main-background);\n\t\ttext-shadow: 0 0 8px var(--color-main-text);\n\t\tfont-size: $name-height;\n\t\tline-height: $name-height;\n\t}\n}\n\n// Cover management empty/full\n.folder {\n\t// if no img, let's display the folder icon as default black\n\t&--clear {\n\t\t.folder-name__icon {\n\t\t\topacity: .3;\n\t\t}\n\t\t.folder-name__name {\n\t\t\tcolor: var(--color-main-text);\n\t\t\ttext-shadow: 0 0 8px var(--color-main-background);\n\t\t}\n\t}\n\n\t// show the cover as background\n\t// if there are pictures in it\n\t// so we can sho the folder+name above it\n\t&:not(.folder--clear) {\n\t\t.cover {\n\t\t\topacity: .3;\n\t\t}\n\n\t\t// hide everything but pictures\n\t\t// on hover/active/focus\n\t\t&:active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\t.folder-name,\n\t\t\t.cover {\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FolderTagPreview.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FolderTagPreview.vue?vue&type=script&lang=js&\"","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FolderTagPreview.vue?vue&type=style&index=0&id=f33ea62c&lang=scss&scoped=true&\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import { render, staticRenderFns } from \"./FolderTagPreview.vue?vue&type=template&id=f33ea62c&scoped=true&\"\nimport script from \"./FolderTagPreview.vue?vue&type=script&lang=js&\"\nexport * from \"./FolderTagPreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FolderTagPreview.vue?vue&type=style&index=0&id=f33ea62c&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f33ea62c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.error === 404)?_c('EmptyContent',{attrs:{\"illustration-name\":\"folder\"}},[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'This folder does not exist'))+\"\\n\")]):(_vm.error)?_c('EmptyContent',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('photos', 'An error occurred'))+\"\\n\")]):(!_vm.loading)?_c('div',[(_vm.folder)?_c('Navigation',_vm._b({key:\"navigation\",attrs:{\"root-title\":_vm.rootTitle,\"show-actions\":true}},'Navigation',_vm.folder,false)):_vm._e(),_vm._v(\" \"),(_vm.isEmpty)?_c('EmptyContent',{key:\"emptycontent\",attrs:{\"illustration-name\":\"empty\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('photos', 'No photos in here'))+\"\\n\\t\")]):_c('div',{staticClass:\"grid-container\"},[_c('VirtualGrid',{ref:\"virtualgrid\",attrs:{\"items\":_vm.contentList,\"get-column-count\":function () { return _vm.gridConfig.count; },\"get-grid-gap\":function () { return _vm.gridConfig.gap; }}})],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { genFileInfo, encodeFilePath } from '../utils/fileUtils'\nimport allowedMimes from './AllowedMimes'\n\n/**\n * List files from a folder and filter out unwanted mimes\n *\n * @param {string} path the path relative to the user root\n * @param {object} [options] optional options for axios\n * @param {boolean} [options.shared] fetch shared albums ?\n * @return {Array} the file list\n */\nexport default async function(path = '/', options = {}) {\n\tconst prefixPath = generateUrl(`/apps/photos/api/v1/${options.shared ? 'shared' : 'albums'}`)\n\n\t// fetch listing\n\tconst response = await axios.get(prefixPath + encodeFilePath(path), options)\n\tconst list = response.data.map(data => genFileInfo(data))\n\n\t// filter all the files and folders\n\tlet folder = {}\n\tconst folders = []\n\tconst files = []\n\n\tfor (const entry of list) {\n\t\t// is this the current provided path ?\n\t\tif (entry.filename === path) {\n\t\t\tfolder = entry\n\t\t} else if (entry.type !== 'file') {\n\t\t\tfolders.push(entry)\n\t\t} else if (allowedMimes.indexOf(entry.mime) > -1) {\n\t\t\tfiles.push(entry)\n\t\t}\n\t}\n\n\t// return current folder, subfolders and files\n\treturn { folder, folders, files }\n}\n","<!--\n - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Corentin Mors <medias@pixelswap.fr>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<FolderTagPreview :id=\"item.injected.fileid\"\n\t\t:name=\"item.injected.basename\"\n\t\t:path=\"item.injected.filename\"\n\t\t:file-list=\"previewFiles\" />\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\n\nimport getAlbumContent from '../services/AlbumContent'\nimport cancelableRequest from '../utils/CancelableRequest'\nimport FolderTagPreview from './FolderTagPreview'\n\nexport default {\n\tname: 'Folder',\n\n\tcomponents: {\n\t\tFolderTagPreview,\n\t},\n\tinheritAttrs: false,\n\n\tprops: {\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tcancelRequest: null,\n\t\t\tpreviewFolder: this.item.injected.fileid,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// global lists\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t\t'folders',\n\t\t]),\n\n\t\t// files list of the current folder\n\t\tfolderContent() {\n\t\t\treturn this.folders[this.item.injected.fileid]\n\t\t},\n\t\tpreviewFiles() {\n\t\t\tconst previewFolderContent = this.folders[this.previewFolder]\n\n\t\t\tconst previewFiles = previewFolderContent\n\t\t\t\t? previewFolderContent\n\t\t\t\t\t.map(id => this.files[id])\n\t\t\t\t\t.slice(0, 4) // only get the 4 first images\n\t\t\t\t: []\n\n\t\t\t// If we didn't found any previews in the folder we try the next subfolder\n\t\t\t// We limit to one subfolder for performance concerns\n\t\t\tif (previewFiles.length === 0\n\t\t\t\t&& this.files[this.previewFolder].folders\n\t\t\t\t&& this.previewFolder === this.item.injected.fileid) {\n\n\t\t\t\tconst firstChildFolder = this.files[this.previewFolder].folders[0]\n\t\t\t\tthis.updatePreviewFolder(firstChildFolder)\n\n\t\t\t\tif (!this.folders[this.previewFolder]) {\n\t\t\t\t\tthis.getFolderData(this.files[this.previewFolder].filename)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn previewFiles\n\t\t},\n\t},\n\n\tasync created() {\n\t\tif (!this.folderContent) {\n\t\t\tawait this.getFolderData(this.item.injected.filename)\n\t\t}\n\t},\n\n\tbeforeDestroy() {\n\t\t// cancel any pending requests\n\t\tif (this.cancelRequest) {\n\t\t\tthis.cancelRequest('Navigated away')\n\t\t}\n\t},\n\n\tmethods: {\n\t\tasync getFolderData(filename) {\n\t\t\t// init cancellable request\n\t\t\tconst { request, cancel } = cancelableRequest(getAlbumContent)\n\t\t\tthis.cancelRequest = cancel\n\n\t\t\ttry {\n\t\t\t\t// get data\n\t\t\t\tconst { folder, folders, files } = await request(filename, { shared: this.item.injected.showShared })\n\t\t\t\tthis.$store.dispatch('updateFolders', { fileid: folder.fileid, files, folders })\n\t\t\t\tthis.$store.dispatch('updateFiles', { folder, files, folders })\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\tconsole.error('Failed to get folder content', filename, error.response)\n\t\t\t\t}\n\t\t\t\t// else we just cancelled the request\n\t\t\t} finally {\n\t\t\t\tthis.cancelRequest = null\n\t\t\t}\n\t\t},\n\n\t\tupdatePreviewFolder(path) {\n\t\t\tthis.previewFolder = path\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../mixins/FileFolder.scss';\n\n.folder-content {\n\tposition: absolute;\n\tdisplay: grid;\n\twidth: 100%;\n\theight: 100%;\n\t// folder layout if less than 4 pictures\n\t&--grid-1 {\n\t\tgrid-template-columns: 1fr;\n\t\tgrid-template-rows: 1fr;\n\t}\n\t&--grid-2 {\n\t\tgrid-template-columns: 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t}\n\t&--grid-3 {\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t\timg:first-child {\n\t\t\tgrid-column: span 2;\n\t\t}\n\t}\n\t&--grid-4 {\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgrid-template-rows: 1fr 1fr;\n\t}\n\timg {\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tobject-fit: cover;\n\t}\n}\n\n$name-height: 1rem;\n\n.folder-name {\n\tposition: absolute;\n\tz-index: 3;\n\tdisplay: flex;\n\toverflow: hidden;\n\tflex-direction: column;\n\twidth: 100%;\n\theight: 100%;\n\ttransition: opacity var(--animation-quick) ease-in-out;\n\topacity: 1;\n\t&__icon {\n\t\theight: 40%;\n\t\tmargin-top: calc(30% - #{$name-height} / 2); // center name+icon\n\t\tbackground-size: 40%;\n\t}\n\t&__name {\n\t\toverflow: hidden;\n\t\theight: $name-height;\n\t\tpadding: 0 10px;\n\t\ttext-align: center;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-main-background);\n\t\ttext-shadow: 0 0 8px var(--color-main-text);\n\t\tfont-size: $name-height;\n\t\tline-height: $name-height;\n\t}\n}\n\n// Cover management empty/full\n.folder {\n\t// if no img, let's display the folder icon as default black\n\t&--clear {\n\t\t.folder-name__icon {\n\t\t\topacity: .3;\n\t\t}\n\t\t.folder-name__name {\n\t\t\tcolor: var(--color-main-text);\n\t\t\ttext-shadow: 0 0 8px var(--color-main-background);\n\t\t}\n\t}\n\n\t// show the cover as background\n\t// if there are pictures in it\n\t// so we can sho the folder+name above it\n\t&:not(.folder--clear) {\n\t\t.cover {\n\t\t\topacity: .3;\n\t\t}\n\n\t\t// hide everything but pictures\n\t\t// on hover/active/focus\n\t\t&.active,\n\t\t&:active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\t.folder-name,\n\t\t\t.cover {\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Folder.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Folder.vue?vue&type=script&lang=js&\"","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Folder.vue?vue&type=style&index=0&id=51e636c4&lang=scss&scoped=true&\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import { render, staticRenderFns } from \"./Folder.vue?vue&type=template&id=51e636c4&scoped=true&\"\nimport script from \"./Folder.vue?vue&type=script&lang=js&\"\nexport * from \"./Folder.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Folder.vue?vue&type=style&index=0&id=51e636c4&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"51e636c4\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('FolderTagPreview',{attrs:{\"id\":_vm.item.injected.fileid,\"name\":_vm.item.injected.basename,\"path\":_vm.item.injected.filename,\"file-list\":_vm.previewFiles}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Corentin Mors <medias@pixelswap.fr>\n -\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<!-- Errors handlers-->\n\t<EmptyContent v-if=\"error === 404\" illustration-name=\"folder\">\n\t\t{{ t('photos', 'This folder does not exist') }}\n\t</EmptyContent>\n\t<EmptyContent v-else-if=\"error\">\n\t\t{{ t('photos', 'An error occurred') }}\n\t</EmptyContent>\n\n\t<!-- Folder content -->\n\t<div v-else-if=\"!loading\">\n\t\t<Navigation v-if=\"folder\"\n\t\t\tkey=\"navigation\"\n\t\t\tv-bind=\"folder\"\n\t\t\t:root-title=\"rootTitle\"\n\t\t\t:show-actions=\"true\" />\n\t\t<!-- Empty folder, should only happen via direct link -->\n\t\t<EmptyContent v-if=\"isEmpty\" key=\"emptycontent\" illustration-name=\"empty\">\n\t\t\t{{ t('photos', 'No photos in here') }}\n\t\t</EmptyContent>\n\n\t\t<div v-else class=\"grid-container\">\n\t\t\t<VirtualGrid\n\t\t\t\tref=\"virtualgrid\"\n\t\t\t\t:items=\"contentList\"\n\t\t\t\t:get-column-count=\"() => gridConfig.count\"\n\t\t\t\t:get-grid-gap=\"() => gridConfig.gap\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\n\nimport getAlbumContent from '../services/AlbumContent'\n\nimport VirtualGrid from 'vue-virtual-grid'\nimport EmptyContent from '../components/EmptyContent'\nimport Folder from '../components/Folder'\nimport File from '../components/File'\nimport Navigation from '../components/Navigation'\n\nimport GridConfigMixin from '../mixins/GridConfig'\n\nimport cancelableRequest from '../utils/CancelableRequest'\n\nexport default {\n\tname: 'Albums',\n\tcomponents: {\n\t\tVirtualGrid,\n\t\tEmptyContent,\n\t\tNavigation,\n\t},\n\tmixins: [GridConfigMixin],\n\tprops: {\n\t\trootTitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\tdefault: '/',\n\t\t},\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t\tshowShared: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\terror: null,\n\t\t\tcancelRequest: () => {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// global lists\n\t\t...mapGetters([\n\t\t\t'files',\n\t\t\t'folders',\n\t\t]),\n\n\t\t// current folder id from current path\n\t\tfolderId() {\n\t\t\treturn this.$store.getters.folderId(this.path)\n\t\t},\n\n\t\t// files list of the current folder\n\t\tfolder() {\n\t\t\treturn this.files[this.folderId]\n\t\t},\n\t\tfolderContent() {\n\t\t\treturn this.folders[this.folderId]\n\t\t},\n\t\tfileList() {\n\t\t\tconst list = this.folderContent\n\t\t\t\t&& this.folderContent\n\t\t\t\t\t.map(id => this.files[id])\n\t\t\t\t\t.filter(file => !!file)\n\t\t\treturn list\n\t\t},\n\n\t\t// subfolders of the current folder\n\t\tsubFolders() {\n\t\t\treturn this.folderId\n\t\t\t\t&& this.files[this.folderId]\n\t\t\t\t&& this.files[this.folderId].folders\n\t\t},\n\t\tfolderList() {\n\t\t\tconst list = this.subFolders\n\t\t\t\t&& this.subFolders\n\t\t\t\t\t.map(id => this.files[id])\n\t\t\t\t\t.filter(file => !!file)\n\t\t\treturn list\n\t\t},\n\t\tcontentList() {\n\t\t\tconst folders = this.folderList?.map((folder) => {\n\t\t\t\treturn {\n\t\t\t\t\tid: `folder-${folder.fileid}`,\n\t\t\t\t\tinjected: {\n\t\t\t\t\t\t...folder,\n\t\t\t\t\t\tshowShared: this.showShared,\n\t\t\t\t\t},\n\t\t\t\t\twidth: 256,\n\t\t\t\t\theight: 256,\n\t\t\t\t\tcolumnSpan: 1,\n\t\t\t\t\trenderComponent: Folder,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst files = this.fileList?.map((file) => {\n\t\t\t\treturn {\n\t\t\t\t\tid: `file-${file.fileid}`,\n\t\t\t\t\tinjected: {\n\t\t\t\t\t\t...file,\n\t\t\t\t\t\tlist: this.fileList,\n\t\t\t\t\t},\n\t\t\t\t\twidth: 256,\n\t\t\t\t\theight: 256,\n\t\t\t\t\tcolumnSpan: 1,\n\t\t\t\t\trenderComponent: File,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn [...(folders || []), ...(files || [])]\n\t\t},\n\n\t\t// is current folder empty?\n\t\tisEmpty() {\n\t\t\treturn !this.haveFiles && !this.haveFolders\n\t\t},\n\t\thaveFiles() {\n\t\t\treturn !!this.fileList && this.fileList.length !== 0\n\t\t},\n\t\thaveFolders() {\n\t\t\treturn !!this.folderList && this.folderList.length !== 0\n\t\t},\n\t},\n\n\twatch: {\n\t\tpath() {\n\t\t\tthis.fetchFolderContent()\n\t\t},\n\t\tshowShared() {\n\t\t\tthis.fetchFolderContent()\n\t\t},\n\t},\n\n\tasync beforeMount() {\n\t\tthis.fetchFolderContent()\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.cancelRequest('Changed view')\n\t},\n\n\tmethods: {\n\t\tasync fetchFolderContent() {\n\t\t\t// cancel any pending requests\n\t\t\tthis.cancelRequest('Changed folder')\n\n\t\t\t// close any potential opened viewer & sidebar\n\t\t\tOCA.Viewer && OCA.Viewer.close && OCA.Viewer.close()\n\t\t\tOCA.Files && OCA.Files.Sidebar.close && OCA.Files.Sidebar.close()\n\n\t\t\t// if we don't already have some cached data let's show a loader\n\t\t\tif (!this.files[this.folderId] || !this.folders[this.folderId]) {\n\t\t\t\tthis.$emit('update:loading', true)\n\t\t\t}\n\t\t\tthis.error = null\n\n\t\t\t// init cancellable request\n\t\t\tconst { request, cancel } = cancelableRequest(getAlbumContent)\n\t\t\tthis.cancelRequest = cancel\n\n\t\t\ttry {\n\t\t\t\t// get content and current folder info\n\t\t\t\tconst { folder, folders, files } = await request(this.path, { shared: this.showShared })\n\t\t\t\tthis.$store.dispatch('addPath', { path: this.path, fileid: folder.fileid })\n\t\t\t\tthis.$store.dispatch('updateFolders', { fileid: folder.fileid, files, folders })\n\t\t\t\tthis.$store.dispatch('updateFiles', { folder, files, folders })\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\tif (error.response.status === 404) {\n\t\t\t\t\t\tthis.error = 404\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.$router.push({ name: this.$route.name })\n\t\t\t\t\t\t}, 3000)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// cancelled request, moving on...\n\t\t\t\tconsole.error('Error fetching album data', error)\n\t\t\t} finally {\n\t\t\t\t// done loading even with errors\n\t\t\t\tthis.$emit('update:loading', false)\n\t\t\t}\n\t\t},\n\t},\n\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../mixins/GridSizes.scss';\n\n.grid-container {\n\t@include grid-sizes using ($marginTop, $marginW) {\n\t\tpadding: 0px #{$marginW}px 256px #{$marginW}px;\n\t}\n}\n</style>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Albums.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Albums.vue?vue&type=script&lang=js&\"","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-2[0].rules[0].use[3]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Albums.vue?vue&type=style&index=0&id=593c4f4a&lang=scss&scoped=true&\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import { render, staticRenderFns } from \"./Albums.vue?vue&type=template&id=593c4f4a&scoped=true&\"\nimport script from \"./Albums.vue?vue&type=script&lang=js&\"\nexport * from \"./Albums.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Albums.vue?vue&type=style&index=0&id=593c4f4a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"593c4f4a\",\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file