diff options
author | Vincent Petry <vincent@nextcloud.com> | 2022-10-14 12:54:51 +0200 |
---|---|---|
committer | Vincent Petry <vincent@nextcloud.com> | 2022-10-14 16:18:41 +0200 |
commit | 19f35f42bcd527a08952681b07d84d008e583437 (patch) | |
tree | 036366319296ae16690e6c5b632373358fea5419 | |
parent | d77e8322239754ef68f9dfe8c3687a39f94cc881 (diff) | |
download | nextcloud-server-19f35f42bcd527a08952681b07d84d008e583437.tar.gz nextcloud-server-19f35f42bcd527a08952681b07d84d008e583437.zip |
Improve cache buster for user backgrounds
Signed-off-by: Vincent Petry <vincent@nextcloud.com>
-rw-r--r-- | apps/theming/lib/Controller/UserThemeController.php | 4 | ||||
-rw-r--r-- | apps/theming/lib/Listener/BeforeTemplateRenderedListener.php | 5 | ||||
-rw-r--r-- | apps/theming/lib/Service/ThemeInjectionService.php | 30 | ||||
-rw-r--r-- | apps/theming/lib/Themes/DefaultTheme.php | 5 | ||||
-rw-r--r-- | apps/theming/src/UserThemes.vue | 3 | ||||
-rw-r--r-- | dist/theming-theming-settings.js | 4 | ||||
-rw-r--r-- | dist/theming-theming-settings.js.map | 2 |
7 files changed, 34 insertions, 19 deletions
diff --git a/apps/theming/lib/Controller/UserThemeController.php b/apps/theming/lib/Controller/UserThemeController.php index 31acfc1d97c..635dad34736 100644 --- a/apps/theming/lib/Controller/UserThemeController.php +++ b/apps/theming/lib/Controller/UserThemeController.php @@ -156,7 +156,7 @@ class UserThemeController extends OCSController { * @NoAdminRequired */ public function setBackground(string $type = 'default', string $value = ''): JSONResponse { - $currentVersion = (int)$this->config->getUserValue($this->userId, Application::APP_ID, 'backgroundVersion', '0'); + $currentVersion = (int)$this->config->getUserValue($this->userId, Application::APP_ID, 'userCacheBuster', '0'); try { switch ($type) { @@ -182,7 +182,7 @@ class UserThemeController extends OCSController { } $currentVersion++; - $this->config->setUserValue($this->userId, Application::APP_ID, 'backgroundVersion', (string)$currentVersion); + $this->config->setUserValue($this->userId, Application::APP_ID, 'userCacheBuster', (string)$currentVersion); return new JSONResponse([ 'type' => $type, diff --git a/apps/theming/lib/Listener/BeforeTemplateRenderedListener.php b/apps/theming/lib/Listener/BeforeTemplateRenderedListener.php index bbe7963f99e..a6e0923e643 100644 --- a/apps/theming/lib/Listener/BeforeTemplateRenderedListener.php +++ b/apps/theming/lib/Listener/BeforeTemplateRenderedListener.php @@ -90,11 +90,6 @@ class BeforeTemplateRenderedListener implements IEventListener { ); $this->initialState->provideInitialState( - 'backgroundVersion', - (int)$this->config->getUserValue($userId, Application::APP_ID, 'backgroundVersion', '0'), - ); - - $this->initialState->provideInitialState( 'themingDefaultBackground', $this->config->getAppValue('theming', 'backgroundMime', ''), ); diff --git a/apps/theming/lib/Service/ThemeInjectionService.php b/apps/theming/lib/Service/ThemeInjectionService.php index fec14de96cf..27b65457e7f 100644 --- a/apps/theming/lib/Service/ThemeInjectionService.php +++ b/apps/theming/lib/Service/ThemeInjectionService.php @@ -22,8 +22,11 @@ */ namespace OCA\Theming\Service; +use OCA\Theming\AppInfo\Application; use OCA\Theming\Themes\DefaultTheme; +use OCP\IConfig; use OCP\IURLGenerator; +use OCP\IUserSession; use OCP\Util; class ThemeInjectionService { @@ -31,13 +34,23 @@ class ThemeInjectionService { private IURLGenerator $urlGenerator; private ThemesService $themesService; private DefaultTheme $defaultTheme; + private IConfig $config; + private ?string $userId; public function __construct(IURLGenerator $urlGenerator, ThemesService $themesService, - DefaultTheme $defaultTheme) { + DefaultTheme $defaultTheme, + IConfig $config, + IUserSession $userSession) { $this->urlGenerator = $urlGenerator; $this->themesService = $themesService; $this->defaultTheme = $defaultTheme; + $this->config = $config; + if ($userSession->getUser() !== null) { + $this->userId = $userSession->getUser()->getUID(); + } else { + $this->userId = null; + } } public function injectHeaders() { @@ -50,13 +63,13 @@ class ThemeInjectionService { // Default theme fallback $this->addThemeHeader($defaultTheme->getId()); - + // Themes applied by media queries foreach($mediaThemes as $theme) { $this->addThemeHeader($theme->getId(), true, $theme->getMediaQuery()); } - // Themes + // Themes foreach($this->themesService->getThemes() as $theme) { // Ignore default theme as already processed first if ($theme->getId() === $this->defaultTheme->getId()) { @@ -68,15 +81,24 @@ class ThemeInjectionService { /** * Inject theme header into rendered page - * + * * @param string $themeId the theme ID * @param bool $plain request the :root syntax * @param string $media media query to use in the <link> element */ private function addThemeHeader(string $themeId, bool $plain = true, string $media = null) { + $cacheBuster = $this->config->getAppValue('theming', 'cachebuster', '0'); + if ($this->userId !== null) { + // need to bust the cache for the CSS file when the user background changed as its + // URL is served in those files + $userCacheBuster = $this->config->getUserValue($this->userId, Application::APP_ID, 'userCacheBuster', '0'); + $cacheBuster .= $this->userId . '_' . $userCacheBuster; + } + $linkToCSS = $this->urlGenerator->linkToRoute('theming.Theming.getThemeStylesheet', [ 'themeId' => $themeId, 'plain' => $plain, + 'v' => substr(sha1($cacheBuster), 0, 8), ]); Util::addHeader('link', [ 'rel' => 'stylesheet', diff --git a/apps/theming/lib/Themes/DefaultTheme.php b/apps/theming/lib/Themes/DefaultTheme.php index 12ed8c765f9..aae4c4eca4c 100644 --- a/apps/theming/lib/Themes/DefaultTheme.php +++ b/apps/theming/lib/Themes/DefaultTheme.php @@ -239,10 +239,11 @@ class DefaultTheme implements ITheme { $user = $this->userSession->getUser(); if ($appManager->isEnabledForUser(Application::APP_ID) && $user !== null) { $themingBackground = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background', 'default'); - $currentVersion = (int)$this->config->getUserValue($user->getUID(), Application::APP_ID, 'backgroundVersion', '0'); + $currentVersion = (int)$this->config->getUserValue($user->getUID(), Application::APP_ID, 'userCacheBuster', '0'); if ($themingBackground === 'custom') { - $variables['--image-main-background'] = "url('" . $this->urlGenerator->linkToRouteAbsolute('theming.userTheme.getBackground') . "?v=$currentVersion')"; + $cacheBuster = substr(sha1($user->getUID() . '_' . $currentVersion), 0, 8); + $variables['--image-main-background'] = "url('" . $this->urlGenerator->linkToRouteAbsolute('theming.userTheme.getBackground') . "?v=$cacheBuster')"; } elseif (isset(BackgroundService::SHIPPED_BACKGROUNDS[$themingBackground])) { $variables['--image-main-background'] = "url('" . $this->urlGenerator->linkTo(Application::APP_ID, "/img/background/$themingBackground") . "')"; } elseif (substr($themingBackground, 0, 1) === '#') { diff --git a/apps/theming/src/UserThemes.vue b/apps/theming/src/UserThemes.vue index 1f14d3bb8f4..f9e729afecb 100644 --- a/apps/theming/src/UserThemes.vue +++ b/apps/theming/src/UserThemes.vue @@ -88,7 +88,6 @@ const enforceTheme = loadState('theming', 'enforceTheme', '') const shortcutsDisabled = loadState('theming', 'shortcutsDisabled', false) const background = loadState('theming', 'background') -const backgroundVersion = loadState('theming', 'backgroundVersion') const themingDefaultBackground = loadState('theming', 'themingDefaultBackground') const shippedBackgroundList = loadState('theming', 'shippedBackgrounds') @@ -109,7 +108,6 @@ export default { enforceTheme, shortcutsDisabled, background, - backgroundVersion, themingDefaultBackground, } }, @@ -169,7 +167,6 @@ export default { methods: { updateBackground(data) { this.background = (data.type === 'custom' || data.type === 'default') ? data.type : data.value - this.backgroundVersion = data.version this.updateGlobalStyles() this.$emit('update:background') }, diff --git a/dist/theming-theming-settings.js b/dist/theming-theming-settings.js index e0bd3b3dc80..00add4c57d4 100644 --- a/dist/theming-theming-settings.js +++ b/dist/theming-theming-settings.js @@ -1,3 +1,3 @@ /*! For license information please see theming-theming-settings.js.LICENSE.txt */ -!function(){"use strict";var n,e={53184:function(n,e,r){var a=r(20144),o=r(79753),i=r(16453),c=r(4820),s=r(20571),u=r.n(s),l=r(13299),d=r.n(l),g=function(n){return(0,o.generateFilePath)("theming","","img/background/")+n},h=function(n){var e,t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=(null===(e=window.OCA)||void 0===e||null===(t=e.Theming)||void 0===t?void 0:t.enabledThemes)||[],c=0===i.length||"default"===i[0]?window.matchMedia("(prefers-color-scheme: dark)").matches:-1!==i.join("").indexOf("dark");return"default"===n?a&&"backgroundColor"!==a?(0,o.generateUrl)("/apps/theming/image/background")+"?v="+window.OCA.Theming.cacheBuster:g(c?"eduardo-neves-pedra-azul.jpg":"kamil-porembinski-clouds.jpg"):"custom"===n?(0,o.generateUrl)("/apps/theming/background")+"?v="+r:g(n)},p=r(20296),m=r.n(p),f=r(69867),A=r.n(f),v=r(15168),b=r.n(v);function k(n,e,t,r,a,o,i){try{var c=n[o](i),s=c.value}catch(n){return void t(n)}c.done?e(s):Promise.resolve(s).then(r,a)}function C(n){return function(){var e=this,t=arguments;return new Promise((function(r,a){var o=n.apply(e,t);function i(n){k(o,r,a,i,c,"next",n)}function c(n){k(o,r,a,i,c,"throw",n)}i(void 0)}))}}function y(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=new Array(e);t<e;t++)r[t]=n[t];return r}var w=(0,i.loadState)("theming","shippedBackgrounds"),x={name:"BackgroundSettings",directives:{Tooltip:b()},components:{NcColorPicker:A()},props:{background:{type:String,default:"default"},themingDefaultBackground:{type:String,default:""}},data:function(){return{backgroundImage:(0,o.generateUrl)("/apps/theming/background")+"?v="+Date.now(),loading:!1,Theming:(0,i.loadState)("theming","data",{})}},computed:{shippedBackgrounds:function(){return Object.keys(w).map((function(n){return{name:n,url:g(n),preview:g("preview/"+n),details:w[n]}}))}},methods:{invertTextColor:function(n){return this.calculateLuma(n)>.6},calculateLuma:function(n){var e,t,r=(e=this.hexToRGB(n),t=3,function(n){if(Array.isArray(n))return n}(e)||function(n,e){var t=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null!=t){var r,a,o=[],i=!0,c=!1;try{for(t=t.call(n);!(i=(r=t.next()).done)&&(o.push(r.value),!e||o.length!==e);i=!0);}catch(n){c=!0,a=n}finally{try{i||null==t.return||t.return()}finally{if(c)throw a}}return o}}(e,t)||function(n,e){if(n){if("string"==typeof n)return y(n,e);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?y(n,e):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());return(.2126*r[0]+.7152*r[1]+.0722*r[2])/255},hexToRGB:function(n){var e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(n);return e?[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]:null},update:function(n){var e=this;return C(regeneratorRuntime.mark((function t(){var r,a;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r="custom"===n.type||"default"===n.type?n.type:n.value,e.backgroundImage=h(r,n.version,e.themingDefaultBackground),"color"!==n.type&&("default"!==n.type||"backgroundColor"!==e.themingDefaultBackground)){t.next=6;break}return e.$emit("update:background",n),e.loading=!1,t.abrupt("return");case 6:(a=new Image).onload=function(){e.$emit("update:background",n),e.loading=!1},a.src=e.backgroundImage;case 9:case"end":return t.stop()}}),t)})))()},setDefault:function(){var n=this;return C(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading="default",e.next=3,c.default.post((0,o.generateUrl)("/apps/theming/background/default"));case 3:t=e.sent,n.update(t.data);case 5:case"end":return e.stop()}}),e)})))()},setShipped:function(n){var e=this;return C(regeneratorRuntime.mark((function t(){var r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading=n,t.next=3,c.default.post((0,o.generateUrl)("/apps/theming/background/shipped"),{value:n});case 3:r=t.sent,e.update(r.data);case 5:case"end":return t.stop()}}),t)})))()},setFile:function(n){var e=this;return C(regeneratorRuntime.mark((function t(){var r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading="custom",t.next=3,c.default.post((0,o.generateUrl)("/apps/theming/background/custom"),{value:n});case 3:r=t.sent,e.update(r.data);case 5:case"end":return t.stop()}}),t)})))()},debouncePickColor:m()((function(){this.pickColor.apply(this,arguments)}),200),pickColor:function(n){var e=this;return C(regeneratorRuntime.mark((function t(){var r,a,i,s,u;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading="color",s=(null==n||null===(r=n.target)||void 0===r||null===(a=r.dataset)||void 0===a?void 0:a.color)||(null===(i=e.Theming)||void 0===i?void 0:i.color)||"#0082c9",t.next=4,c.default.post((0,o.generateUrl)("/apps/theming/background/color"),{value:s});case 4:u=t.sent,e.update(u.data);case 6:case"end":return t.stop()}}),t)})))()},pickFile:function(){var n=this;window.OC.dialogs.filepicker(t("theming","Insert from {productName}",{productName:OC.theme.name}),(function(e,t){t===OC.dialogs.FILEPICKER_TYPE_CHOOSE&&n.setFile(e)}),!1,["image/png","image/gif","image/jpeg","image/svg"],!0,OC.dialogs.FILEPICKER_TYPE_CHOOSE)}}},_=x,S=r(93379),T=r.n(S),B=r(7795),I=r.n(B),E=r(90569),P=r.n(E),O=r(3565),D=r.n(O),j=r(19216),R=r.n(j),U=r(44589),q=r.n(U),Z=r(95066),F={};F.styleTagTransform=q(),F.setAttributes=D(),F.insert=P().bind(null,"head"),F.domAPI=I(),F.insertStyleElement=R(),T()(Z.Z,F),Z.Z&&Z.Z.locals&&Z.Z.locals;var L=r(51900),G=(0,L.Z)(_,(function(){var n=this,e=n.$createElement,t=n._self._c||e;return t("div",{staticClass:"background-selector"},[t("button",{staticClass:"background filepicker",class:{active:"custom"===n.background},attrs:{tabindex:"0"},on:{click:n.pickFile}},[n._v("\n\t\t"+n._s(n.t("theming","Pick from Files"))+"\n\t")]),n._v(" "),t("button",{staticClass:"background default",class:{"icon-loading":"default"===n.loading,active:"default"===n.background},attrs:{tabindex:"0"},on:{click:n.setDefault}},[n._v("\n\t\t"+n._s(n.t("theming","Default image"))+"\n\t")]),n._v(" "),t("NcColorPicker",{on:{input:n.debouncePickColor},model:{value:n.Theming.color,callback:function(e){n.$set(n.Theming,"color",e)},expression:"Theming.color"}},[t("button",{staticClass:"background color",class:{active:n.background===n.Theming.color},style:{backgroundColor:n.Theming.color,color:n.invertTextColor(n.Theming.color)?"#000000":"#ffffff"},attrs:{tabindex:"0","data-color":n.Theming.color,"data-color-bright":n.invertTextColor(n.Theming.color)}},[n._v("\n\t\t\t"+n._s(n.t("theming","Custom color"))+"\n\t\t")])]),n._v(" "),t("button",{staticClass:"background color",class:{active:n.background===n.Theming.defaultColor},style:{color:n.invertTextColor(n.Theming.defaultColor)?"#000000":"#ffffff"},attrs:{tabindex:"0","data-color":n.Theming.defaultColor,"data-color-bright":n.invertTextColor(n.Theming.defaultColor)},on:{click:n.debouncePickColor}},[n._v("\n\t\t"+n._s(n.t("theming","Plain background"))+"\n\t")]),n._v(" "),n._l(n.shippedBackgrounds,(function(e){return t("button",{directives:[{name:"tooltip",rawName:"v-tooltip",value:e.details.attribution,expression:"shippedBackground.details.attribution"}],key:e.name,staticClass:"background",class:{"icon-loading":n.loading===e.name,active:n.background===e.name},style:{"background-image":"url("+e.preview+")"},attrs:{tabindex:"0","data-color-bright":"dark"===e.details.theming},on:{click:function(t){return n.setShipped(e.name)}}})}))],2)}),[],!1,null,"57fc0570",null).exports,N={name:"ItemPreview",components:{NcCheckboxRadioSwitch:u()},props:{enforced:{type:Boolean,default:!1},selected:{type:Boolean,default:!1},theme:{type:Object,required:!0},type:{type:String,default:""},unique:{type:Boolean,default:!1}},computed:{switchType:function(){return this.unique?"switch":"radio"},name:function(){return this.unique?null:this.type},img:function(){return(0,o.generateFilePath)("theming","img",this.theme.id+".jpg")},checked:{get:function(){return this.selected},set:function(n){console.debug("Changed theme",this.theme.id,n),this.unique?this.$emit("change",{enabled:!0===n,id:this.theme.id}):this.$emit("change",{enabled:!0,id:this.theme.id})}}},methods:{onToggle:function(){"radio"!==this.switchType?this.checked=!this.checked:this.checked=!0}}},$=r(83005),K={};K.styleTagTransform=q(),K.setAttributes=D(),K.insert=P().bind(null,"head"),K.domAPI=I(),K.insertStyleElement=R(),T()($.Z,K),$.Z&&$.Z.locals&&$.Z.locals;var W=(0,L.Z)(N,(function(){var n=this,e=n.$createElement,t=n._self._c||e;return t("div",{staticClass:"theming__preview",class:"theming__preview--"+n.theme.id},[t("div",{staticClass:"theming__preview-image",style:{backgroundImage:"url("+n.img+")"},on:{click:n.onToggle}}),n._v(" "),t("div",{staticClass:"theming__preview-description"},[t("h3",[n._v(n._s(n.theme.title))]),n._v(" "),t("p",[n._v(n._s(n.theme.description))]),n._v(" "),n.enforced?t("span",{staticClass:"theming__preview-warning",attrs:{role:"note"}},[n._v("\n\t\t\t"+n._s(n.t("theming","Theme selection is enforced"))+"\n\t\t")]):n._e(),n._v(" "),t("NcCheckboxRadioSwitch",{staticClass:"theming__preview-toggle",attrs:{checked:n.checked,disabled:n.enforced,name:n.name,type:n.switchType},on:{"update:checked":function(e){n.checked=e}}},[n._v("\n\t\t\t"+n._s(n.theme.enableLabel)+"\n\t\t")])],1)])}),[],!1,null,"37ca8ab2",null).exports;function M(n){return function(n){if(Array.isArray(n))return z(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,e){if(n){if("string"==typeof n)return z(n,e);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?z(n,e):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function z(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=new Array(e);t<e;t++)r[t]=n[t];return r}function Y(n,e,t,r,a,o,i){try{var c=n[o](i),s=c.value}catch(n){return void t(n)}c.done?e(s):Promise.resolve(s).then(r,a)}function H(n){return function(){var e=this,t=arguments;return new Promise((function(r,a){var o=n.apply(e,t);function i(n){Y(o,r,a,i,c,"next",n)}function c(n){Y(o,r,a,i,c,"throw",n)}i(void 0)}))}}var V=(0,i.loadState)("theming","themes",[]),Q=(0,i.loadState)("theming","enforceTheme",""),J=(0,i.loadState)("theming","shortcutsDisabled",!1),X=(0,i.loadState)("theming","background"),nn=(0,i.loadState)("theming","backgroundVersion"),en=(0,i.loadState)("theming","themingDefaultBackground"),tn=(0,i.loadState)("theming","shippedBackgrounds");console.debug("Available themes",V);var rn={name:"UserThemes",components:{ItemPreview:W,NcCheckboxRadioSwitch:u(),NcSettingsSection:d(),BackgroundSettings:G},data:function(){return{availableThemes:V,enforceTheme:Q,shortcutsDisabled:J,background:X,backgroundVersion:nn,themingDefaultBackground:en}},computed:{themes:function(){return this.availableThemes.filter((function(n){return 1===n.type}))},fonts:function(){return this.availableThemes.filter((function(n){return 2===n.type}))},selectedTheme:function(){return this.themes.find((function(n){return!0===n.enabled}))||this.themes[0]},description:function(){return t("theming","Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.").replace("{guidelines}",this.guidelinesLink).replace("{linkend}","</a>")},guidelinesLink:function(){return'<a target="_blank" href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noreferrer nofollow">'},descriptionDetail:function(){return t("theming","If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!").replace("{issuetracker}",this.issuetrackerLink).replace("{designteam}",this.designteamLink).replace(/\{linkend\}/g,"</a>")},issuetrackerLink:function(){return'<a target="_blank" href="https://github.com/nextcloud/server/issues/" rel="noreferrer nofollow">'},designteamLink:function(){return'<a target="_blank" href="https://nextcloud.com/design" rel="noreferrer nofollow">'}},watch:{shortcutsDisabled:function(n){this.changeShortcutsDisabled(n)}},mounted:function(){this.updateGlobalStyles()},methods:{updateBackground:function(n){this.background="custom"===n.type||"default"===n.type?n.type:n.value,this.backgroundVersion=n.version,this.updateGlobalStyles(),this.$emit("update:background")},updateGlobalStyles:function(){var n;"dark"===(null===(n=tn[this.background])||void 0===n?void 0:n.theming)?(document.querySelector("#header").style.setProperty("--primary-invert-if-bright","invert(100%)"),document.querySelector("#header").style.setProperty("--color-primary-text","#000000")):(document.querySelector("#header").style.setProperty("--primary-invert-if-bright","no"),document.querySelector("#header").style.setProperty("--color-primary-text","#ffffff"))},changeTheme:function(n){var e=n.enabled,t=n.id;this.themes.forEach((function(n){n.id===t&&e?n.enabled=!0:n.enabled=!1})),this.updateBodyAttributes(),this.selectItem(e,t)},changeFont:function(n){var e=n.enabled,t=n.id;this.fonts.forEach((function(n){n.id===t&&e?n.enabled=!0:n.enabled=!1})),this.updateBodyAttributes(),this.selectItem(e,t)},changeShortcutsDisabled:function(n){return H(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!n){e.next=5;break}return e.next=3,(0,c.default)({url:(0,o.generateOcsUrl)("apps/provisioning_api/api/v1/config/users/{appId}/{configKey}",{appId:"theming",configKey:"shortcuts_disabled"}),data:{configValue:"yes"},method:"POST"});case 3:e.next=7;break;case 5:return e.next=7,(0,c.default)({url:(0,o.generateOcsUrl)("apps/provisioning_api/api/v1/config/users/{appId}/{configKey}",{appId:"theming",configKey:"shortcuts_disabled"}),method:"DELETE"});case 7:case"end":return e.stop()}}),e)})))()},updateBodyAttributes:function(){var n=this.themes.filter((function(n){return!0===n.enabled})).map((function(n){return n.id})),e=this.fonts.filter((function(n){return!0===n.enabled})).map((function(n){return n.id}));this.themes.forEach((function(n){document.body.toggleAttribute("data-theme-".concat(n.id),n.enabled)})),this.fonts.forEach((function(n){document.body.toggleAttribute("data-theme-".concat(n.id),n.enabled)})),document.body.setAttribute("data-themes",[].concat(M(n),M(e)).join(","))},selectItem:function(n,e){return H(regeneratorRuntime.mark((function r(){return regeneratorRuntime.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(r.prev=0,!n){r.next=6;break}return r.next=4,(0,c.default)({url:(0,o.generateOcsUrl)("apps/theming/api/v1/theme/{themeId}/enable",{themeId:e}),method:"PUT"});case 4:r.next=8;break;case 6:return r.next=8,(0,c.default)({url:(0,o.generateOcsUrl)("apps/theming/api/v1/theme/{themeId}",{themeId:e}),method:"DELETE"});case 8:r.next=14;break;case 10:r.prev=10,r.t0=r.catch(0),console.error(r.t0,r.t0.response),OC.Notification.showTemporary(t("theming",r.t0.response.data.ocs.meta.message+". Unable to apply the setting."));case 14:case"end":return r.stop()}}),r,null,[[0,10]])})))()}}},an=r(22955),on={};on.styleTagTransform=q(),on.setAttributes=D(),on.insert=P().bind(null,"head"),on.domAPI=I(),on.insertStyleElement=R(),T()(an.Z,on),an.Z&&an.Z.locals&&an.Z.locals;var cn=(0,L.Z)(rn,(function(){var n=this,e=n.$createElement,t=n._self._c||e;return t("section",[t("NcSettingsSection",{staticClass:"theming",attrs:{title:n.t("theming","Appearance and accessibility"),"limit-width":!1}},[t("p",{domProps:{innerHTML:n._s(n.description)}}),n._v(" "),t("p",{domProps:{innerHTML:n._s(n.descriptionDetail)}}),n._v(" "),t("div",{staticClass:"theming__preview-list"},n._l(n.themes,(function(e){return t("ItemPreview",{key:e.id,attrs:{enforced:e.id===n.enforceTheme,selected:n.selectedTheme.id===e.id,theme:e,unique:1===n.themes.length,type:"theme"},on:{change:n.changeTheme}})})),1),n._v(" "),t("div",{staticClass:"theming__preview-list"},n._l(n.fonts,(function(e){return t("ItemPreview",{key:e.id,attrs:{selected:e.enabled,theme:e,unique:1===n.fonts.length,type:"font"},on:{change:n.changeFont}})})),1)]),n._v(" "),t("NcSettingsSection",{attrs:{title:n.t("theming","Keyboard shortcuts")}},[t("p",[n._v(n._s(n.t("theming","In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.")))]),n._v(" "),t("NcCheckboxRadioSwitch",{staticClass:"theming__preview-toggle",attrs:{checked:n.shortcutsDisabled,name:"shortcuts_disabled",type:"switch"},on:{"update:checked":function(e){n.shortcutsDisabled=e},change:n.changeShortcutsDisabled}},[n._v("\n\t\t\t"+n._s(n.t("theming","Disable all keyboard shortcuts"))+"\n\t\t")])],1),n._v(" "),t("NcSettingsSection",{staticClass:"background",attrs:{title:n.t("theming","Background")}},[t("p",[n._v(n._s(n.t("theming","Set a custom background")))]),n._v(" "),t("BackgroundSettings",{staticClass:"background__grid",attrs:{background:n.background,"theming-default-background":n.themingDefaultBackground},on:{"update:background":n.updateBackground}})],1)],1)}),[],!1,null,"205ad124",null).exports;function sn(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=new Array(e);t<e;t++)r[t]=n[t];return r}a.ZP.prototype.OC=OC,a.ZP.prototype.t=t;var un=new(a.ZP.extend(cn));un.$mount("#theming"),un.$on("update:background",(function(){var n;(n=document.head.querySelectorAll("link.theme"),function(n){if(Array.isArray(n))return sn(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,e){if(n){if("string"==typeof n)return sn(n,e);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?sn(n,e):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).forEach((function(n){var e=new URL(n.href);e.searchParams.set("v",Date.now());var t=n.cloneNode();t.href=e.toString(),t.onload=function(){return n.remove()},document.head.append(t)}))}))},22955:function(n,e,t){var r=t(87537),a=t.n(r),o=t(23645),i=t.n(o)()(a());i.push([n.id,".theming p[data-v-205ad124]{max-width:800px}.theming[data-v-205ad124] a{font-weight:bold}.theming[data-v-205ad124] a:hover,.theming[data-v-205ad124] a:focus{text-decoration:underline}.theming__preview-list[data-v-205ad124]{--gap: 30px;display:grid;margin-top:var(--gap);column-gap:var(--gap);row-gap:var(--gap);grid-template-columns:1fr 1fr}.background__grid[data-v-205ad124]{margin-top:30px}@media(max-width: 1440px){.theming__preview-list[data-v-205ad124]{display:flex;flex-direction:column}}","",{version:3,sources:["webpack://./apps/theming/src/UserThemes.vue"],names:[],mappings:"AA+RC,4BACC,eAAA,CAID,4BACC,gBAAA,CAEA,oEAEC,yBAAA,CAIF,wCACC,WAAA,CAEA,YAAA,CACA,qBAAA,CACA,qBAAA,CACA,kBAAA,CACA,6BAAA,CAKD,mCACC,eAAA,CAIF,0BACC,wCACC,YAAA,CACA,qBAAA,CAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.theming {\n\t// Limit width of settings sections for readability\n\tp {\n\t\tmax-width: 800px;\n\t}\n\n\t// Proper highlight for links and focus feedback\n\t&::v-deep a {\n\t\tfont-weight: bold;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t}\n\n\t&__preview-list {\n\t\t--gap: 30px;\n\n\t\tdisplay: grid;\n\t\tmargin-top: var(--gap);\n\t\tcolumn-gap: var(--gap);\n\t\trow-gap: var(--gap);\n\t\tgrid-template-columns: 1fr 1fr;\n\t}\n}\n\n.background {\n\t&__grid {\n\t\tmargin-top: 30px;\n\t}\n}\n\n@media (max-width: 1440px) {\n\t.theming__preview-list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n}\n"],sourceRoot:""}]),e.Z=i},95066:function(n,e,t){var r=t(87537),a=t.n(r),o=t(23645),i=t.n(o)()(a());i.push([n.id,'.background-selector[data-v-57fc0570]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-57fc0570]{width:176px;height:96px;margin:8px;background-size:cover;background-position:center center;text-align:center;border-radius:var(--border-radius-large);border:2px solid var(--color-main-background);overflow:hidden}.background-selector .background.current[data-v-57fc0570]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-57fc0570],.background-selector .background.default[data-v-57fc0570],.background-selector .background.color[data-v-57fc0570]{border-color:var(--color-border)}.background-selector .background.color[data-v-57fc0570]{background-color:var(--color-primary-default);color:var(--color-primary-text)}.background-selector .background.active[data-v-57fc0570],.background-selector .background[data-v-57fc0570]:hover,.background-selector .background[data-v-57fc0570]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-57fc0570]:not(.icon-loading):after{background-image:var(--icon-checkmark-white);background-repeat:no-repeat;background-position:center;background-size:44px;content:"";display:block;height:100%}.background-selector .background.active:not(.icon-loading)[data-color-bright][data-v-57fc0570]:after{background-image:var(--icon-checkmark-dark)}',"",{version:3,sources:["webpack://./apps/theming/src/components/BackgroundSettings.vue"],names:[],mappings:"AA6NA,sCACC,YAAA,CACA,cAAA,CACA,sBAAA,CAEA,kDACC,WAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,iCAAA,CACA,iBAAA,CACA,wCAAA,CACA,6CAAA,CACA,eAAA,CAEA,0DACC,6CAAA,CAGD,+KACC,gCAAA,CAGD,wDACC,6CAAA,CACA,+BAAA,CAGD,yKAGC,qCAAA,CAIA,kFACC,4CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CAGD,qGACC,2CAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.background-selector {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\n\t.background {\n\t\twidth: 176px;\n\t\theight: 96px;\n\t\tmargin: 8px;\n\t\tbackground-size: cover;\n\t\tbackground-position: center center;\n\t\ttext-align: center;\n\t\tborder-radius: var(--border-radius-large);\n\t\tborder: 2px solid var(--color-main-background);\n\t\toverflow: hidden;\n\n\t\t&.current {\n\t\t\tbackground-image: var(--color-background-dark);\n\t\t}\n\n\t\t&.filepicker, &.default, &.color {\n\t\t\tborder-color: var(--color-border);\n\t\t}\n\n\t\t&.color {\n\t\t\tbackground-color: var(--color-primary-default);\n\t\t\tcolor: var(--color-primary-text);\n\t\t}\n\n\t\t&.active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tborder: 2px solid var(--color-primary);\n\t\t}\n\n\t\t&.active:not(.icon-loading) {\n\t\t\t&:after {\n\t\t\t\tbackground-image: var(--icon-checkmark-white);\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-size: 44px;\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t}\n\n\t\t\t&[data-color-bright]:after {\n\t\t\t\tbackground-image: var(--icon-checkmark-dark);\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),e.Z=i},83005:function(n,e,t){var r=t(87537),a=t.n(r),o=t(23645),i=t.n(o)()(a());i.push([n.id,".theming__preview[data-v-37ca8ab2]{--ratio: 16;position:relative;display:flex;justify-content:flex-start;max-width:800px}.theming__preview[data-v-37ca8ab2],.theming__preview *[data-v-37ca8ab2]{user-select:none}.theming__preview-image[data-v-37ca8ab2]{flex-basis:calc(16px*var(--ratio));flex-shrink:0;height:calc(10px*var(--ratio));margin-right:var(--gap);cursor:pointer;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:top left;background-size:cover}.theming__preview-description[data-v-37ca8ab2]{display:flex;flex-direction:column}.theming__preview-description label[data-v-37ca8ab2]{padding:12px 0}.theming__preview--default[data-v-37ca8ab2]{grid-column:span 2}.theming__preview-warning[data-v-37ca8ab2]{color:var(--color-warning)}@media(max-width: 682.6666666667px){.theming__preview[data-v-37ca8ab2]{flex-direction:column}.theming__preview-image[data-v-37ca8ab2]{margin:0}}","",{version:3,sources:["webpack://./apps/theming/src/components/ItemPreview.vue"],names:[],mappings:"AAiGA,mCAEC,WAAA,CAEA,iBAAA,CACA,YAAA,CACA,0BAAA,CACA,eAAA,CAEA,wEAEC,gBAAA,CAGD,yCACC,kCAAA,CACA,aAAA,CACA,8BAAA,CACA,uBAAA,CACA,cAAA,CACA,kCAAA,CACA,2BAAA,CACA,4BAAA,CACA,qBAAA,CAGD,+CACC,YAAA,CACA,qBAAA,CAEA,qDACC,cAAA,CAIF,4CACC,kBAAA,CAGD,2CACC,0BAAA,CAIF,oCACC,mCACC,qBAAA,CAEA,yCACC,QAAA,CAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.theming__preview {\n\t// We make previews on 16/10 screens\n\t--ratio: 16;\n\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-content: flex-start;\n\tmax-width: 800px;\n\n\t&,\n\t* {\n\t\tuser-select: none;\n\t}\n\n\t&-image {\n\t\tflex-basis: calc(16px * var(--ratio));\n\t\tflex-shrink: 0;\n\t\theight: calc(10px * var(--ratio));\n\t\tmargin-right: var(--gap);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: top left;\n\t\tbackground-size: cover;\n\t}\n\n\t&-description {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\n\t\tlabel {\n\t\t\tpadding: 12px 0;\n\t\t}\n\t}\n\n\t&--default {\n\t\tgrid-column: span 2;\n\t}\n\n\t&-warning {\n\t\tcolor: var(--color-warning);\n\t}\n}\n\n@media (max-width: (1024px / 1.5)) {\n\t.theming__preview {\n\t\tflex-direction: column;\n\n\t\t&-image {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n\n"],sourceRoot:""}]),e.Z=i}},r={};function a(n){var t=r[n];if(void 0!==t)return t.exports;var o=r[n]={id:n,loaded:!1,exports:{}};return e[n].call(o.exports,o,o.exports,a),o.loaded=!0,o.exports}a.m=e,a.amdD=function(){throw new Error("define cannot be used indirect")},a.amdO={},n=[],a.O=function(e,t,r,o){if(!t){var i=1/0;for(l=0;l<n.length;l++){t=n[l][0],r=n[l][1],o=n[l][2];for(var c=!0,s=0;s<t.length;s++)(!1&o||i>=o)&&Object.keys(a.O).every((function(n){return a.O[n](t[s])}))?t.splice(s--,1):(c=!1,o<i&&(i=o));if(c){n.splice(l--,1);var u=r();void 0!==u&&(e=u)}}return e}o=o||0;for(var l=n.length;l>0&&n[l-1][2]>o;l--)n[l]=n[l-1];n[l]=[t,r,o]},a.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return a.d(e,{a:e}),e},a.d=function(n,e){for(var t in e)a.o(e,t)&&!a.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),a.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},a.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},a.nmd=function(n){return n.paths=[],n.children||(n.children=[]),n},a.j=6755,function(){a.b=document.baseURI||self.location.href;var n={6755:0};a.O.j=function(e){return 0===n[e]};var e=function(e,t){var r,o,i=t[0],c=t[1],s=t[2],u=0;if(i.some((function(e){return 0!==n[e]}))){for(r in c)a.o(c,r)&&(a.m[r]=c[r]);if(s)var l=s(a)}for(e&&e(t);u<i.length;u++)o=i[u],a.o(n,o)&&n[o]&&n[o][0](),n[o]=0;return a.O(l)},t=self.webpackChunknextcloud=self.webpackChunknextcloud||[];t.forEach(e.bind(null,0)),t.push=e.bind(null,t.push.bind(t))}(),a.nc=void 0;var o=a.O(void 0,[7874],(function(){return a(53184)}));o=a.O(o)}(); -//# sourceMappingURL=theming-theming-settings.js.map?v=2a26747350033d639cfd
\ No newline at end of file +!function(){"use strict";var n,e={35400:function(n,e,r){var a=r(20144),o=r(79753),i=r(16453),c=r(4820),s=r(20571),u=r.n(s),l=r(13299),d=r.n(l),g=function(n){return(0,o.generateFilePath)("theming","","img/background/")+n},h=function(n){var e,t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=(null===(e=window.OCA)||void 0===e||null===(t=e.Theming)||void 0===t?void 0:t.enabledThemes)||[],c=0===i.length||"default"===i[0]?window.matchMedia("(prefers-color-scheme: dark)").matches:-1!==i.join("").indexOf("dark");return"default"===n?a&&"backgroundColor"!==a?(0,o.generateUrl)("/apps/theming/image/background")+"?v="+window.OCA.Theming.cacheBuster:g(c?"eduardo-neves-pedra-azul.jpg":"kamil-porembinski-clouds.jpg"):"custom"===n?(0,o.generateUrl)("/apps/theming/background")+"?v="+r:g(n)},p=r(20296),m=r.n(p),f=r(69867),A=r.n(f),v=r(15168),b=r.n(v);function k(n,e,t,r,a,o,i){try{var c=n[o](i),s=c.value}catch(n){return void t(n)}c.done?e(s):Promise.resolve(s).then(r,a)}function C(n){return function(){var e=this,t=arguments;return new Promise((function(r,a){var o=n.apply(e,t);function i(n){k(o,r,a,i,c,"next",n)}function c(n){k(o,r,a,i,c,"throw",n)}i(void 0)}))}}function y(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=new Array(e);t<e;t++)r[t]=n[t];return r}var w=(0,i.loadState)("theming","shippedBackgrounds"),x={name:"BackgroundSettings",directives:{Tooltip:b()},components:{NcColorPicker:A()},props:{background:{type:String,default:"default"},themingDefaultBackground:{type:String,default:""}},data:function(){return{backgroundImage:(0,o.generateUrl)("/apps/theming/background")+"?v="+Date.now(),loading:!1,Theming:(0,i.loadState)("theming","data",{})}},computed:{shippedBackgrounds:function(){return Object.keys(w).map((function(n){return{name:n,url:g(n),preview:g("preview/"+n),details:w[n]}}))}},methods:{invertTextColor:function(n){return this.calculateLuma(n)>.6},calculateLuma:function(n){var e,t,r=(e=this.hexToRGB(n),t=3,function(n){if(Array.isArray(n))return n}(e)||function(n,e){var t=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null!=t){var r,a,o=[],i=!0,c=!1;try{for(t=t.call(n);!(i=(r=t.next()).done)&&(o.push(r.value),!e||o.length!==e);i=!0);}catch(n){c=!0,a=n}finally{try{i||null==t.return||t.return()}finally{if(c)throw a}}return o}}(e,t)||function(n,e){if(n){if("string"==typeof n)return y(n,e);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?y(n,e):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());return(.2126*r[0]+.7152*r[1]+.0722*r[2])/255},hexToRGB:function(n){var e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(n);return e?[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]:null},update:function(n){var e=this;return C(regeneratorRuntime.mark((function t(){var r,a;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r="custom"===n.type||"default"===n.type?n.type:n.value,e.backgroundImage=h(r,n.version,e.themingDefaultBackground),"color"!==n.type&&("default"!==n.type||"backgroundColor"!==e.themingDefaultBackground)){t.next=6;break}return e.$emit("update:background",n),e.loading=!1,t.abrupt("return");case 6:(a=new Image).onload=function(){e.$emit("update:background",n),e.loading=!1},a.src=e.backgroundImage;case 9:case"end":return t.stop()}}),t)})))()},setDefault:function(){var n=this;return C(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading="default",e.next=3,c.default.post((0,o.generateUrl)("/apps/theming/background/default"));case 3:t=e.sent,n.update(t.data);case 5:case"end":return e.stop()}}),e)})))()},setShipped:function(n){var e=this;return C(regeneratorRuntime.mark((function t(){var r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading=n,t.next=3,c.default.post((0,o.generateUrl)("/apps/theming/background/shipped"),{value:n});case 3:r=t.sent,e.update(r.data);case 5:case"end":return t.stop()}}),t)})))()},setFile:function(n){var e=this;return C(regeneratorRuntime.mark((function t(){var r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading="custom",t.next=3,c.default.post((0,o.generateUrl)("/apps/theming/background/custom"),{value:n});case 3:r=t.sent,e.update(r.data);case 5:case"end":return t.stop()}}),t)})))()},debouncePickColor:m()((function(){this.pickColor.apply(this,arguments)}),200),pickColor:function(n){var e=this;return C(regeneratorRuntime.mark((function t(){var r,a,i,s,u;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading="color",s=(null==n||null===(r=n.target)||void 0===r||null===(a=r.dataset)||void 0===a?void 0:a.color)||(null===(i=e.Theming)||void 0===i?void 0:i.color)||"#0082c9",t.next=4,c.default.post((0,o.generateUrl)("/apps/theming/background/color"),{value:s});case 4:u=t.sent,e.update(u.data);case 6:case"end":return t.stop()}}),t)})))()},pickFile:function(){var n=this;window.OC.dialogs.filepicker(t("theming","Insert from {productName}",{productName:OC.theme.name}),(function(e,t){t===OC.dialogs.FILEPICKER_TYPE_CHOOSE&&n.setFile(e)}),!1,["image/png","image/gif","image/jpeg","image/svg"],!0,OC.dialogs.FILEPICKER_TYPE_CHOOSE)}}},_=x,S=r(93379),T=r.n(S),B=r(7795),I=r.n(B),E=r(90569),P=r.n(E),O=r(3565),D=r.n(O),j=r(19216),R=r.n(j),U=r(44589),q=r.n(U),Z=r(95066),F={};F.styleTagTransform=q(),F.setAttributes=D(),F.insert=P().bind(null,"head"),F.domAPI=I(),F.insertStyleElement=R(),T()(Z.Z,F),Z.Z&&Z.Z.locals&&Z.Z.locals;var L=r(51900),G=(0,L.Z)(_,(function(){var n=this,e=n.$createElement,t=n._self._c||e;return t("div",{staticClass:"background-selector"},[t("button",{staticClass:"background filepicker",class:{active:"custom"===n.background},attrs:{tabindex:"0"},on:{click:n.pickFile}},[n._v("\n\t\t"+n._s(n.t("theming","Pick from Files"))+"\n\t")]),n._v(" "),t("button",{staticClass:"background default",class:{"icon-loading":"default"===n.loading,active:"default"===n.background},attrs:{tabindex:"0"},on:{click:n.setDefault}},[n._v("\n\t\t"+n._s(n.t("theming","Default image"))+"\n\t")]),n._v(" "),t("NcColorPicker",{on:{input:n.debouncePickColor},model:{value:n.Theming.color,callback:function(e){n.$set(n.Theming,"color",e)},expression:"Theming.color"}},[t("button",{staticClass:"background color",class:{active:n.background===n.Theming.color},style:{backgroundColor:n.Theming.color,color:n.invertTextColor(n.Theming.color)?"#000000":"#ffffff"},attrs:{tabindex:"0","data-color":n.Theming.color,"data-color-bright":n.invertTextColor(n.Theming.color)}},[n._v("\n\t\t\t"+n._s(n.t("theming","Custom color"))+"\n\t\t")])]),n._v(" "),t("button",{staticClass:"background color",class:{active:n.background===n.Theming.defaultColor},style:{color:n.invertTextColor(n.Theming.defaultColor)?"#000000":"#ffffff"},attrs:{tabindex:"0","data-color":n.Theming.defaultColor,"data-color-bright":n.invertTextColor(n.Theming.defaultColor)},on:{click:n.debouncePickColor}},[n._v("\n\t\t"+n._s(n.t("theming","Plain background"))+"\n\t")]),n._v(" "),n._l(n.shippedBackgrounds,(function(e){return t("button",{directives:[{name:"tooltip",rawName:"v-tooltip",value:e.details.attribution,expression:"shippedBackground.details.attribution"}],key:e.name,staticClass:"background",class:{"icon-loading":n.loading===e.name,active:n.background===e.name},style:{"background-image":"url("+e.preview+")"},attrs:{tabindex:"0","data-color-bright":"dark"===e.details.theming},on:{click:function(t){return n.setShipped(e.name)}}})}))],2)}),[],!1,null,"57fc0570",null).exports,N={name:"ItemPreview",components:{NcCheckboxRadioSwitch:u()},props:{enforced:{type:Boolean,default:!1},selected:{type:Boolean,default:!1},theme:{type:Object,required:!0},type:{type:String,default:""},unique:{type:Boolean,default:!1}},computed:{switchType:function(){return this.unique?"switch":"radio"},name:function(){return this.unique?null:this.type},img:function(){return(0,o.generateFilePath)("theming","img",this.theme.id+".jpg")},checked:{get:function(){return this.selected},set:function(n){console.debug("Changed theme",this.theme.id,n),this.unique?this.$emit("change",{enabled:!0===n,id:this.theme.id}):this.$emit("change",{enabled:!0,id:this.theme.id})}}},methods:{onToggle:function(){"radio"!==this.switchType?this.checked=!this.checked:this.checked=!0}}},$=r(83005),K={};K.styleTagTransform=q(),K.setAttributes=D(),K.insert=P().bind(null,"head"),K.domAPI=I(),K.insertStyleElement=R(),T()($.Z,K),$.Z&&$.Z.locals&&$.Z.locals;var W=(0,L.Z)(N,(function(){var n=this,e=n.$createElement,t=n._self._c||e;return t("div",{staticClass:"theming__preview",class:"theming__preview--"+n.theme.id},[t("div",{staticClass:"theming__preview-image",style:{backgroundImage:"url("+n.img+")"},on:{click:n.onToggle}}),n._v(" "),t("div",{staticClass:"theming__preview-description"},[t("h3",[n._v(n._s(n.theme.title))]),n._v(" "),t("p",[n._v(n._s(n.theme.description))]),n._v(" "),n.enforced?t("span",{staticClass:"theming__preview-warning",attrs:{role:"note"}},[n._v("\n\t\t\t"+n._s(n.t("theming","Theme selection is enforced"))+"\n\t\t")]):n._e(),n._v(" "),t("NcCheckboxRadioSwitch",{staticClass:"theming__preview-toggle",attrs:{checked:n.checked,disabled:n.enforced,name:n.name,type:n.switchType},on:{"update:checked":function(e){n.checked=e}}},[n._v("\n\t\t\t"+n._s(n.theme.enableLabel)+"\n\t\t")])],1)])}),[],!1,null,"37ca8ab2",null).exports;function M(n){return function(n){if(Array.isArray(n))return z(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,e){if(n){if("string"==typeof n)return z(n,e);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?z(n,e):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function z(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=new Array(e);t<e;t++)r[t]=n[t];return r}function Y(n,e,t,r,a,o,i){try{var c=n[o](i),s=c.value}catch(n){return void t(n)}c.done?e(s):Promise.resolve(s).then(r,a)}function H(n){return function(){var e=this,t=arguments;return new Promise((function(r,a){var o=n.apply(e,t);function i(n){Y(o,r,a,i,c,"next",n)}function c(n){Y(o,r,a,i,c,"throw",n)}i(void 0)}))}}var Q=(0,i.loadState)("theming","themes",[]),V=(0,i.loadState)("theming","enforceTheme",""),J=(0,i.loadState)("theming","shortcutsDisabled",!1),X=(0,i.loadState)("theming","background"),nn=(0,i.loadState)("theming","themingDefaultBackground"),en=(0,i.loadState)("theming","shippedBackgrounds");console.debug("Available themes",Q);var tn={name:"UserThemes",components:{ItemPreview:W,NcCheckboxRadioSwitch:u(),NcSettingsSection:d(),BackgroundSettings:G},data:function(){return{availableThemes:Q,enforceTheme:V,shortcutsDisabled:J,background:X,themingDefaultBackground:nn}},computed:{themes:function(){return this.availableThemes.filter((function(n){return 1===n.type}))},fonts:function(){return this.availableThemes.filter((function(n){return 2===n.type}))},selectedTheme:function(){return this.themes.find((function(n){return!0===n.enabled}))||this.themes[0]},description:function(){return t("theming","Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.").replace("{guidelines}",this.guidelinesLink).replace("{linkend}","</a>")},guidelinesLink:function(){return'<a target="_blank" href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noreferrer nofollow">'},descriptionDetail:function(){return t("theming","If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!").replace("{issuetracker}",this.issuetrackerLink).replace("{designteam}",this.designteamLink).replace(/\{linkend\}/g,"</a>")},issuetrackerLink:function(){return'<a target="_blank" href="https://github.com/nextcloud/server/issues/" rel="noreferrer nofollow">'},designteamLink:function(){return'<a target="_blank" href="https://nextcloud.com/design" rel="noreferrer nofollow">'}},watch:{shortcutsDisabled:function(n){this.changeShortcutsDisabled(n)}},mounted:function(){this.updateGlobalStyles()},methods:{updateBackground:function(n){this.background="custom"===n.type||"default"===n.type?n.type:n.value,this.updateGlobalStyles(),this.$emit("update:background")},updateGlobalStyles:function(){var n;"dark"===(null===(n=en[this.background])||void 0===n?void 0:n.theming)?(document.querySelector("#header").style.setProperty("--primary-invert-if-bright","invert(100%)"),document.querySelector("#header").style.setProperty("--color-primary-text","#000000")):(document.querySelector("#header").style.setProperty("--primary-invert-if-bright","no"),document.querySelector("#header").style.setProperty("--color-primary-text","#ffffff"))},changeTheme:function(n){var e=n.enabled,t=n.id;this.themes.forEach((function(n){n.id===t&&e?n.enabled=!0:n.enabled=!1})),this.updateBodyAttributes(),this.selectItem(e,t)},changeFont:function(n){var e=n.enabled,t=n.id;this.fonts.forEach((function(n){n.id===t&&e?n.enabled=!0:n.enabled=!1})),this.updateBodyAttributes(),this.selectItem(e,t)},changeShortcutsDisabled:function(n){return H(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!n){e.next=5;break}return e.next=3,(0,c.default)({url:(0,o.generateOcsUrl)("apps/provisioning_api/api/v1/config/users/{appId}/{configKey}",{appId:"theming",configKey:"shortcuts_disabled"}),data:{configValue:"yes"},method:"POST"});case 3:e.next=7;break;case 5:return e.next=7,(0,c.default)({url:(0,o.generateOcsUrl)("apps/provisioning_api/api/v1/config/users/{appId}/{configKey}",{appId:"theming",configKey:"shortcuts_disabled"}),method:"DELETE"});case 7:case"end":return e.stop()}}),e)})))()},updateBodyAttributes:function(){var n=this.themes.filter((function(n){return!0===n.enabled})).map((function(n){return n.id})),e=this.fonts.filter((function(n){return!0===n.enabled})).map((function(n){return n.id}));this.themes.forEach((function(n){document.body.toggleAttribute("data-theme-".concat(n.id),n.enabled)})),this.fonts.forEach((function(n){document.body.toggleAttribute("data-theme-".concat(n.id),n.enabled)})),document.body.setAttribute("data-themes",[].concat(M(n),M(e)).join(","))},selectItem:function(n,e){return H(regeneratorRuntime.mark((function r(){return regeneratorRuntime.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(r.prev=0,!n){r.next=6;break}return r.next=4,(0,c.default)({url:(0,o.generateOcsUrl)("apps/theming/api/v1/theme/{themeId}/enable",{themeId:e}),method:"PUT"});case 4:r.next=8;break;case 6:return r.next=8,(0,c.default)({url:(0,o.generateOcsUrl)("apps/theming/api/v1/theme/{themeId}",{themeId:e}),method:"DELETE"});case 8:r.next=14;break;case 10:r.prev=10,r.t0=r.catch(0),console.error(r.t0,r.t0.response),OC.Notification.showTemporary(t("theming",r.t0.response.data.ocs.meta.message+". Unable to apply the setting."));case 14:case"end":return r.stop()}}),r,null,[[0,10]])})))()}}},rn=r(15004),an={};an.styleTagTransform=q(),an.setAttributes=D(),an.insert=P().bind(null,"head"),an.domAPI=I(),an.insertStyleElement=R(),T()(rn.Z,an),rn.Z&&rn.Z.locals&&rn.Z.locals;var on=(0,L.Z)(tn,(function(){var n=this,e=n.$createElement,t=n._self._c||e;return t("section",[t("NcSettingsSection",{staticClass:"theming",attrs:{title:n.t("theming","Appearance and accessibility"),"limit-width":!1}},[t("p",{domProps:{innerHTML:n._s(n.description)}}),n._v(" "),t("p",{domProps:{innerHTML:n._s(n.descriptionDetail)}}),n._v(" "),t("div",{staticClass:"theming__preview-list"},n._l(n.themes,(function(e){return t("ItemPreview",{key:e.id,attrs:{enforced:e.id===n.enforceTheme,selected:n.selectedTheme.id===e.id,theme:e,unique:1===n.themes.length,type:"theme"},on:{change:n.changeTheme}})})),1),n._v(" "),t("div",{staticClass:"theming__preview-list"},n._l(n.fonts,(function(e){return t("ItemPreview",{key:e.id,attrs:{selected:e.enabled,theme:e,unique:1===n.fonts.length,type:"font"},on:{change:n.changeFont}})})),1)]),n._v(" "),t("NcSettingsSection",{attrs:{title:n.t("theming","Keyboard shortcuts")}},[t("p",[n._v(n._s(n.t("theming","In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.")))]),n._v(" "),t("NcCheckboxRadioSwitch",{staticClass:"theming__preview-toggle",attrs:{checked:n.shortcutsDisabled,name:"shortcuts_disabled",type:"switch"},on:{"update:checked":function(e){n.shortcutsDisabled=e},change:n.changeShortcutsDisabled}},[n._v("\n\t\t\t"+n._s(n.t("theming","Disable all keyboard shortcuts"))+"\n\t\t")])],1),n._v(" "),t("NcSettingsSection",{staticClass:"background",attrs:{title:n.t("theming","Background")}},[t("p",[n._v(n._s(n.t("theming","Set a custom background")))]),n._v(" "),t("BackgroundSettings",{staticClass:"background__grid",attrs:{background:n.background,"theming-default-background":n.themingDefaultBackground},on:{"update:background":n.updateBackground}})],1)],1)}),[],!1,null,"92936166",null).exports;function cn(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=new Array(e);t<e;t++)r[t]=n[t];return r}a.ZP.prototype.OC=OC,a.ZP.prototype.t=t;var sn=new(a.ZP.extend(on));sn.$mount("#theming"),sn.$on("update:background",(function(){var n;(n=document.head.querySelectorAll("link.theme"),function(n){if(Array.isArray(n))return cn(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,e){if(n){if("string"==typeof n)return cn(n,e);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?cn(n,e):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).forEach((function(n){var e=new URL(n.href);e.searchParams.set("v",Date.now());var t=n.cloneNode();t.href=e.toString(),t.onload=function(){return n.remove()},document.head.append(t)}))}))},15004:function(n,e,t){var r=t(87537),a=t.n(r),o=t(23645),i=t.n(o)()(a());i.push([n.id,".theming p[data-v-92936166]{max-width:800px}.theming[data-v-92936166] a{font-weight:bold}.theming[data-v-92936166] a:hover,.theming[data-v-92936166] a:focus{text-decoration:underline}.theming__preview-list[data-v-92936166]{--gap: 30px;display:grid;margin-top:var(--gap);column-gap:var(--gap);row-gap:var(--gap);grid-template-columns:1fr 1fr}.background__grid[data-v-92936166]{margin-top:30px}@media(max-width: 1440px){.theming__preview-list[data-v-92936166]{display:flex;flex-direction:column}}","",{version:3,sources:["webpack://./apps/theming/src/UserThemes.vue"],names:[],mappings:"AA6RC,4BACC,eAAA,CAID,4BACC,gBAAA,CAEA,oEAEC,yBAAA,CAIF,wCACC,WAAA,CAEA,YAAA,CACA,qBAAA,CACA,qBAAA,CACA,kBAAA,CACA,6BAAA,CAKD,mCACC,eAAA,CAIF,0BACC,wCACC,YAAA,CACA,qBAAA,CAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.theming {\n\t// Limit width of settings sections for readability\n\tp {\n\t\tmax-width: 800px;\n\t}\n\n\t// Proper highlight for links and focus feedback\n\t&::v-deep a {\n\t\tfont-weight: bold;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t}\n\n\t&__preview-list {\n\t\t--gap: 30px;\n\n\t\tdisplay: grid;\n\t\tmargin-top: var(--gap);\n\t\tcolumn-gap: var(--gap);\n\t\trow-gap: var(--gap);\n\t\tgrid-template-columns: 1fr 1fr;\n\t}\n}\n\n.background {\n\t&__grid {\n\t\tmargin-top: 30px;\n\t}\n}\n\n@media (max-width: 1440px) {\n\t.theming__preview-list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n}\n"],sourceRoot:""}]),e.Z=i},95066:function(n,e,t){var r=t(87537),a=t.n(r),o=t(23645),i=t.n(o)()(a());i.push([n.id,'.background-selector[data-v-57fc0570]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-57fc0570]{width:176px;height:96px;margin:8px;background-size:cover;background-position:center center;text-align:center;border-radius:var(--border-radius-large);border:2px solid var(--color-main-background);overflow:hidden}.background-selector .background.current[data-v-57fc0570]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-57fc0570],.background-selector .background.default[data-v-57fc0570],.background-selector .background.color[data-v-57fc0570]{border-color:var(--color-border)}.background-selector .background.color[data-v-57fc0570]{background-color:var(--color-primary-default);color:var(--color-primary-text)}.background-selector .background.active[data-v-57fc0570],.background-selector .background[data-v-57fc0570]:hover,.background-selector .background[data-v-57fc0570]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-57fc0570]:not(.icon-loading):after{background-image:var(--icon-checkmark-white);background-repeat:no-repeat;background-position:center;background-size:44px;content:"";display:block;height:100%}.background-selector .background.active:not(.icon-loading)[data-color-bright][data-v-57fc0570]:after{background-image:var(--icon-checkmark-dark)}',"",{version:3,sources:["webpack://./apps/theming/src/components/BackgroundSettings.vue"],names:[],mappings:"AA6NA,sCACC,YAAA,CACA,cAAA,CACA,sBAAA,CAEA,kDACC,WAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,iCAAA,CACA,iBAAA,CACA,wCAAA,CACA,6CAAA,CACA,eAAA,CAEA,0DACC,6CAAA,CAGD,+KACC,gCAAA,CAGD,wDACC,6CAAA,CACA,+BAAA,CAGD,yKAGC,qCAAA,CAIA,kFACC,4CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CAGD,qGACC,2CAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.background-selector {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\n\t.background {\n\t\twidth: 176px;\n\t\theight: 96px;\n\t\tmargin: 8px;\n\t\tbackground-size: cover;\n\t\tbackground-position: center center;\n\t\ttext-align: center;\n\t\tborder-radius: var(--border-radius-large);\n\t\tborder: 2px solid var(--color-main-background);\n\t\toverflow: hidden;\n\n\t\t&.current {\n\t\t\tbackground-image: var(--color-background-dark);\n\t\t}\n\n\t\t&.filepicker, &.default, &.color {\n\t\t\tborder-color: var(--color-border);\n\t\t}\n\n\t\t&.color {\n\t\t\tbackground-color: var(--color-primary-default);\n\t\t\tcolor: var(--color-primary-text);\n\t\t}\n\n\t\t&.active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tborder: 2px solid var(--color-primary);\n\t\t}\n\n\t\t&.active:not(.icon-loading) {\n\t\t\t&:after {\n\t\t\t\tbackground-image: var(--icon-checkmark-white);\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-size: 44px;\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t}\n\n\t\t\t&[data-color-bright]:after {\n\t\t\t\tbackground-image: var(--icon-checkmark-dark);\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),e.Z=i},83005:function(n,e,t){var r=t(87537),a=t.n(r),o=t(23645),i=t.n(o)()(a());i.push([n.id,".theming__preview[data-v-37ca8ab2]{--ratio: 16;position:relative;display:flex;justify-content:flex-start;max-width:800px}.theming__preview[data-v-37ca8ab2],.theming__preview *[data-v-37ca8ab2]{user-select:none}.theming__preview-image[data-v-37ca8ab2]{flex-basis:calc(16px*var(--ratio));flex-shrink:0;height:calc(10px*var(--ratio));margin-right:var(--gap);cursor:pointer;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:top left;background-size:cover}.theming__preview-description[data-v-37ca8ab2]{display:flex;flex-direction:column}.theming__preview-description label[data-v-37ca8ab2]{padding:12px 0}.theming__preview--default[data-v-37ca8ab2]{grid-column:span 2}.theming__preview-warning[data-v-37ca8ab2]{color:var(--color-warning)}@media(max-width: 682.6666666667px){.theming__preview[data-v-37ca8ab2]{flex-direction:column}.theming__preview-image[data-v-37ca8ab2]{margin:0}}","",{version:3,sources:["webpack://./apps/theming/src/components/ItemPreview.vue"],names:[],mappings:"AAiGA,mCAEC,WAAA,CAEA,iBAAA,CACA,YAAA,CACA,0BAAA,CACA,eAAA,CAEA,wEAEC,gBAAA,CAGD,yCACC,kCAAA,CACA,aAAA,CACA,8BAAA,CACA,uBAAA,CACA,cAAA,CACA,kCAAA,CACA,2BAAA,CACA,4BAAA,CACA,qBAAA,CAGD,+CACC,YAAA,CACA,qBAAA,CAEA,qDACC,cAAA,CAIF,4CACC,kBAAA,CAGD,2CACC,0BAAA,CAIF,oCACC,mCACC,qBAAA,CAEA,yCACC,QAAA,CAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.theming__preview {\n\t// We make previews on 16/10 screens\n\t--ratio: 16;\n\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-content: flex-start;\n\tmax-width: 800px;\n\n\t&,\n\t* {\n\t\tuser-select: none;\n\t}\n\n\t&-image {\n\t\tflex-basis: calc(16px * var(--ratio));\n\t\tflex-shrink: 0;\n\t\theight: calc(10px * var(--ratio));\n\t\tmargin-right: var(--gap);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: top left;\n\t\tbackground-size: cover;\n\t}\n\n\t&-description {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\n\t\tlabel {\n\t\t\tpadding: 12px 0;\n\t\t}\n\t}\n\n\t&--default {\n\t\tgrid-column: span 2;\n\t}\n\n\t&-warning {\n\t\tcolor: var(--color-warning);\n\t}\n}\n\n@media (max-width: (1024px / 1.5)) {\n\t.theming__preview {\n\t\tflex-direction: column;\n\n\t\t&-image {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n\n"],sourceRoot:""}]),e.Z=i}},r={};function a(n){var t=r[n];if(void 0!==t)return t.exports;var o=r[n]={id:n,loaded:!1,exports:{}};return e[n].call(o.exports,o,o.exports,a),o.loaded=!0,o.exports}a.m=e,a.amdD=function(){throw new Error("define cannot be used indirect")},a.amdO={},n=[],a.O=function(e,t,r,o){if(!t){var i=1/0;for(l=0;l<n.length;l++){t=n[l][0],r=n[l][1],o=n[l][2];for(var c=!0,s=0;s<t.length;s++)(!1&o||i>=o)&&Object.keys(a.O).every((function(n){return a.O[n](t[s])}))?t.splice(s--,1):(c=!1,o<i&&(i=o));if(c){n.splice(l--,1);var u=r();void 0!==u&&(e=u)}}return e}o=o||0;for(var l=n.length;l>0&&n[l-1][2]>o;l--)n[l]=n[l-1];n[l]=[t,r,o]},a.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return a.d(e,{a:e}),e},a.d=function(n,e){for(var t in e)a.o(e,t)&&!a.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),a.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},a.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},a.nmd=function(n){return n.paths=[],n.children||(n.children=[]),n},a.j=6755,function(){a.b=document.baseURI||self.location.href;var n={6755:0};a.O.j=function(e){return 0===n[e]};var e=function(e,t){var r,o,i=t[0],c=t[1],s=t[2],u=0;if(i.some((function(e){return 0!==n[e]}))){for(r in c)a.o(c,r)&&(a.m[r]=c[r]);if(s)var l=s(a)}for(e&&e(t);u<i.length;u++)o=i[u],a.o(n,o)&&n[o]&&n[o][0](),n[o]=0;return a.O(l)},t=self.webpackChunknextcloud=self.webpackChunknextcloud||[];t.forEach(e.bind(null,0)),t.push=e.bind(null,t.push.bind(t))}(),a.nc=void 0;var o=a.O(void 0,[7874],(function(){return a(35400)}));o=a.O(o)}(); +//# sourceMappingURL=theming-theming-settings.js.map?v=2d6f75fbf75c0b292481
\ No newline at end of file diff --git a/dist/theming-theming-settings.js.map b/dist/theming-theming-settings.js.map index 7b910c62419..e6f83645823 100644 --- a/dist/theming-theming-settings.js.map +++ b/dist/theming-theming-settings.js.map @@ -1 +1 @@ -{"version":3,"file":"theming-theming-settings.js?v=2a26747350033d639cfd","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/theming/src/helpers/prefixWithBaseUrl.js","webpack:///nextcloud/apps/theming/src/helpers/getBackgroundUrl.js","webpack:///nextcloud/apps/theming/src/components/BackgroundSettings.vue","webpack:///nextcloud/apps/theming/src/components/BackgroundSettings.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/theming/src/components/BackgroundSettings.vue?065d","webpack://nextcloud/./apps/theming/src/components/BackgroundSettings.vue?65db","webpack:///nextcloud/apps/theming/src/components/BackgroundSettings.vue?vue&type=template&id=57fc0570&scoped=true&","webpack:///nextcloud/apps/theming/src/components/ItemPreview.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/theming/src/components/ItemPreview.vue","webpack://nextcloud/./apps/theming/src/components/ItemPreview.vue?f1c6","webpack://nextcloud/./apps/theming/src/components/ItemPreview.vue?8797","webpack:///nextcloud/apps/theming/src/components/ItemPreview.vue?vue&type=template&id=37ca8ab2&scoped=true&","webpack:///nextcloud/apps/theming/src/UserThemes.vue","webpack:///nextcloud/apps/theming/src/UserThemes.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/theming/src/UserThemes.vue?523e","webpack://nextcloud/./apps/theming/src/UserThemes.vue?7eb2","webpack:///nextcloud/apps/theming/src/UserThemes.vue?vue&type=template&id=205ad124&scoped=true&","webpack:///nextcloud/apps/theming/src/settings.js","webpack:///nextcloud/apps/theming/src/UserThemes.vue?vue&type=style&index=0&id=205ad124&lang=scss&scoped=true&","webpack:///nextcloud/apps/theming/src/components/BackgroundSettings.vue?vue&type=style&index=0&id=57fc0570&scoped=true&lang=scss&","webpack:///nextcloud/apps/theming/src/components/ItemPreview.vue?vue&type=style&index=0&id=37ca8ab2&lang=scss&scoped=true&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\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\nimport { generateFilePath } from '@nextcloud/router'\n\nexport const prefixWithBaseUrl = (url) => generateFilePath('theming', '', 'img/background/') + url\n","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Avior <florian.bouillon@delta-wings.net>\n * @author Julien Veyssier <eneiluj@posteo.net>\n * @author Julius Härtl <jus@bitgrid.net>\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\nimport { generateUrl } from '@nextcloud/router'\nimport { prefixWithBaseUrl } from './prefixWithBaseUrl.js'\n\nexport const getBackgroundUrl = (background, time = 0, themingDefaultBackground = '') => {\n\tconst enabledThemes = window.OCA?.Theming?.enabledThemes || []\n\tconst isDarkTheme = (enabledThemes.length === 0 || enabledThemes[0] === 'default')\n\t\t? window.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t: enabledThemes.join('').indexOf('dark') !== -1\n\n\tif (background === 'default') {\n\t\tif (themingDefaultBackground && themingDefaultBackground !== 'backgroundColor') {\n\t\t\treturn generateUrl('/apps/theming/image/background') + '?v=' + window.OCA.Theming.cacheBuster\n\t\t}\n\n\t\tif (isDarkTheme) {\n\t\t\treturn prefixWithBaseUrl('eduardo-neves-pedra-azul.jpg')\n\t\t}\n\n\t\treturn prefixWithBaseUrl('kamil-porembinski-clouds.jpg')\n\t} else if (background === 'custom') {\n\t\treturn generateUrl('/apps/theming/background') + '?v=' + time\n\t}\n\n\treturn prefixWithBaseUrl(background)\n}\n","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n - @copyright Copyright (c) 2022 Greta Doci <gretadoci@gmail.com>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n - @author Greta Doci <gretadoci@gmail.com>\n - @author Christopher Ng <chrng8@gmail.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<div class=\"background-selector\">\n\t\t<!-- Custom background -->\n\t\t<button class=\"background filepicker\"\n\t\t\t:class=\"{ active: background === 'custom' }\"\n\t\t\ttabindex=\"0\"\n\t\t\t@click=\"pickFile\">\n\t\t\t{{ t('theming', 'Pick from Files') }}\n\t\t</button>\n\n\t\t<!-- Default background -->\n\t\t<button class=\"background default\"\n\t\t\ttabindex=\"0\"\n\t\t\t:class=\"{ 'icon-loading': loading === 'default', active: background === 'default' }\"\n\t\t\t@click=\"setDefault\">\n\t\t\t{{ t('theming', 'Default image') }}\n\t\t</button>\n\n\t\t<!-- Custom color picker -->\n\t\t<NcColorPicker v-model=\"Theming.color\" @input=\"debouncePickColor\">\n\t\t\t<button class=\"background color\"\n\t\t\t\t:class=\"{ active: background === Theming.color}\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t:data-color=\"Theming.color\"\n\t\t\t\t:data-color-bright=\"invertTextColor(Theming.color)\"\n\t\t\t\t:style=\"{ backgroundColor: Theming.color, color: invertTextColor(Theming.color) ? '#000000' : '#ffffff'}\">\n\t\t\t\t{{ t('theming', 'Custom color') }}\n\t\t\t</button>\n\t\t</NcColorPicker>\n\n\t\t<!-- Default admin primary color -->\n\t\t<button class=\"background color\"\n\t\t\t:class=\"{ active: background === Theming.defaultColor }\"\n\t\t\ttabindex=\"0\"\n\t\t\t:data-color=\"Theming.defaultColor\"\n\t\t\t:data-color-bright=\"invertTextColor(Theming.defaultColor)\"\n\t\t\t:style=\"{ color: invertTextColor(Theming.defaultColor) ? '#000000' : '#ffffff'}\"\n\t\t\t@click=\"debouncePickColor\">\n\t\t\t{{ t('theming', 'Plain background') }}\n\t\t</button>\n\n\t\t<!-- Background set selection -->\n\t\t<button v-for=\"shippedBackground in shippedBackgrounds\"\n\t\t\t:key=\"shippedBackground.name\"\n\t\t\tv-tooltip=\"shippedBackground.details.attribution\"\n\t\t\t:class=\"{ 'icon-loading': loading === shippedBackground.name, active: background === shippedBackground.name }\"\n\t\t\ttabindex=\"0\"\n\t\t\tclass=\"background\"\n\t\t\t:data-color-bright=\"shippedBackground.details.theming === 'dark'\"\n\t\t\t:style=\"{ 'background-image': 'url(' + shippedBackground.preview + ')' }\"\n\t\t\t@click=\"setShipped(shippedBackground.name)\" />\n\t</div>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { getBackgroundUrl } from '../helpers/getBackgroundUrl.js'\nimport { loadState } from '@nextcloud/initial-state'\nimport { prefixWithBaseUrl } from '../helpers/prefixWithBaseUrl.js'\nimport axios from '@nextcloud/axios'\nimport debounce from 'debounce'\nimport NcColorPicker from '@nextcloud/vue/dist/Components/NcColorPicker'\nimport Tooltip from '@nextcloud/vue/dist/Directives/Tooltip'\n\nconst shippedBackgroundList = loadState('theming', 'shippedBackgrounds')\n\nexport default {\n\tname: 'BackgroundSettings',\n\tdirectives: {\n\t\tTooltip,\n\t},\n\n\tcomponents: {\n\t\tNcColorPicker,\n\t},\n\n\tprops: {\n\t\tbackground: {\n\t\t\ttype: String,\n\t\t\tdefault: 'default',\n\t\t},\n\t\tthemingDefaultBackground: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tbackgroundImage: generateUrl('/apps/theming/background') + '?v=' + Date.now(),\n\t\t\tloading: false,\n\t\t\tTheming: loadState('theming', 'data', {}),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tshippedBackgrounds() {\n\t\t\treturn Object.keys(shippedBackgroundList).map(fileName => {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\turl: prefixWithBaseUrl(fileName),\n\t\t\t\t\tpreview: prefixWithBaseUrl('preview/' + fileName),\n\t\t\t\t\tdetails: shippedBackgroundList[fileName],\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Do we need to invert the text if color is too bright?\n\t\t *\n\t\t * @param {string} color the hex color\n\t\t */\n\t\tinvertTextColor(color) {\n\t\t\treturn this.calculateLuma(color) > 0.6\n\t\t},\n\n\t\t/**\n\t\t * Calculate luminance of provided hex color\n\t\t *\n\t\t * @param {string} color the hex color\n\t\t */\n\t\tcalculateLuma(color) {\n\t\t\tconst [red, green, blue] = this.hexToRGB(color)\n\t\t\treturn (0.2126 * red + 0.7152 * green + 0.0722 * blue) / 255\n\t\t},\n\n\t\t/**\n\t\t * Convert hex color to RGB\n\t\t *\n\t\t * @param {string} hex the hex color\n\t\t */\n\t\thexToRGB(hex) {\n\t\t\tconst result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n\t\t\treturn result\n\t\t\t\t? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)]\n\t\t\t\t: null\n\t\t},\n\n\t\tasync update(data) {\n\t\t\tconst background = data.type === 'custom' || data.type === 'default' ? data.type : data.value\n\t\t\tthis.backgroundImage = getBackgroundUrl(background, data.version, this.themingDefaultBackground)\n\t\t\tif (data.type === 'color' || (data.type === 'default' && this.themingDefaultBackground === 'backgroundColor')) {\n\t\t\t\tthis.$emit('update:background', data)\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst image = new Image()\n\t\t\timage.onload = () => {\n\t\t\t\tthis.$emit('update:background', data)\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t\timage.src = this.backgroundImage\n\t\t},\n\n\t\tasync setDefault() {\n\t\t\tthis.loading = 'default'\n\t\t\tconst result = await axios.post(generateUrl('/apps/theming/background/default'))\n\t\t\tthis.update(result.data)\n\t\t},\n\n\t\tasync setShipped(shipped) {\n\t\t\tthis.loading = shipped\n\t\t\tconst result = await axios.post(generateUrl('/apps/theming/background/shipped'), { value: shipped })\n\t\t\tthis.update(result.data)\n\t\t},\n\n\t\tasync setFile(path) {\n\t\t\tthis.loading = 'custom'\n\t\t\tconst result = await axios.post(generateUrl('/apps/theming/background/custom'), { value: path })\n\t\t\tthis.update(result.data)\n\t\t},\n\n\t\tdebouncePickColor: debounce(function() {\n\t\t\tthis.pickColor(...arguments)\n\t\t}, 200),\n\t\tasync pickColor(event) {\n\t\t\tthis.loading = 'color'\n\t\t\tconst color = event?.target?.dataset?.color || this.Theming?.color || '#0082c9'\n\t\t\tconst result = await axios.post(generateUrl('/apps/theming/background/color'), { value: color })\n\t\t\tthis.update(result.data)\n\t\t},\n\n\t\tpickFile() {\n\t\t\twindow.OC.dialogs.filepicker(t('theming', 'Insert from {productName}', { productName: OC.theme.name }), (path, type) => {\n\t\t\t\tif (type === OC.dialogs.FILEPICKER_TYPE_CHOOSE) {\n\t\t\t\t\tthis.setFile(path)\n\t\t\t\t}\n\t\t\t}, false, ['image/png', 'image/gif', 'image/jpeg', 'image/svg'], true, OC.dialogs.FILEPICKER_TYPE_CHOOSE)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.background-selector {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\n\t.background {\n\t\twidth: 176px;\n\t\theight: 96px;\n\t\tmargin: 8px;\n\t\tbackground-size: cover;\n\t\tbackground-position: center center;\n\t\ttext-align: center;\n\t\tborder-radius: var(--border-radius-large);\n\t\tborder: 2px solid var(--color-main-background);\n\t\toverflow: hidden;\n\n\t\t&.current {\n\t\t\tbackground-image: var(--color-background-dark);\n\t\t}\n\n\t\t&.filepicker, &.default, &.color {\n\t\t\tborder-color: var(--color-border);\n\t\t}\n\n\t\t&.color {\n\t\t\tbackground-color: var(--color-primary-default);\n\t\t\tcolor: var(--color-primary-text);\n\t\t}\n\n\t\t&.active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tborder: 2px solid var(--color-primary);\n\t\t}\n\n\t\t&.active:not(.icon-loading) {\n\t\t\t&:after {\n\t\t\t\tbackground-image: var(--icon-checkmark-white);\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-size: 44px;\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t}\n\n\t\t\t&[data-color-bright]:after {\n\t\t\t\tbackground-image: var(--icon-checkmark-dark);\n\t\t\t}\n\t\t}\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!./BackgroundSettings.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!./BackgroundSettings.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=style&index=0&id=57fc0570&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=style&index=0&id=57fc0570&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./BackgroundSettings.vue?vue&type=template&id=57fc0570&scoped=true&\"\nimport script from \"./BackgroundSettings.vue?vue&type=script&lang=js&\"\nexport * from \"./BackgroundSettings.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BackgroundSettings.vue?vue&type=style&index=0&id=57fc0570&scoped=true&lang=scss&\"\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 \"57fc0570\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"background-selector\"},[_c('button',{staticClass:\"background filepicker\",class:{ active: _vm.background === 'custom' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.pickFile}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('theming', 'Pick from Files'))+\"\\n\\t\")]),_vm._v(\" \"),_c('button',{staticClass:\"background default\",class:{ 'icon-loading': _vm.loading === 'default', active: _vm.background === 'default' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.setDefault}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('theming', 'Default image'))+\"\\n\\t\")]),_vm._v(\" \"),_c('NcColorPicker',{on:{\"input\":_vm.debouncePickColor},model:{value:(_vm.Theming.color),callback:function ($$v) {_vm.$set(_vm.Theming, \"color\", $$v)},expression:\"Theming.color\"}},[_c('button',{staticClass:\"background color\",class:{ active: _vm.background === _vm.Theming.color},style:({ backgroundColor: _vm.Theming.color, color: _vm.invertTextColor(_vm.Theming.color) ? '#000000' : '#ffffff'}),attrs:{\"tabindex\":\"0\",\"data-color\":_vm.Theming.color,\"data-color-bright\":_vm.invertTextColor(_vm.Theming.color)}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('theming', 'Custom color'))+\"\\n\\t\\t\")])]),_vm._v(\" \"),_c('button',{staticClass:\"background color\",class:{ active: _vm.background === _vm.Theming.defaultColor },style:({ color: _vm.invertTextColor(_vm.Theming.defaultColor) ? '#000000' : '#ffffff'}),attrs:{\"tabindex\":\"0\",\"data-color\":_vm.Theming.defaultColor,\"data-color-bright\":_vm.invertTextColor(_vm.Theming.defaultColor)},on:{\"click\":_vm.debouncePickColor}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('theming', 'Plain background'))+\"\\n\\t\")]),_vm._v(\" \"),_vm._l((_vm.shippedBackgrounds),function(shippedBackground){return _c('button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(shippedBackground.details.attribution),expression:\"shippedBackground.details.attribution\"}],key:shippedBackground.name,staticClass:\"background\",class:{ 'icon-loading': _vm.loading === shippedBackground.name, active: _vm.background === shippedBackground.name },style:({ 'background-image': 'url(' + shippedBackground.preview + ')' }),attrs:{\"tabindex\":\"0\",\"data-color-bright\":shippedBackground.details.theming === 'dark'},on:{\"click\":function($event){return _vm.setShipped(shippedBackground.name)}}})})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemPreview.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!./ItemPreview.vue?vue&type=script&lang=js&\"","<template>\n\t<div :class=\"'theming__preview--' + theme.id\" class=\"theming__preview\">\n\t\t<div class=\"theming__preview-image\" :style=\"{ backgroundImage: 'url(' + img + ')' }\" @click=\"onToggle\" />\n\t\t<div class=\"theming__preview-description\">\n\t\t\t<h3>{{ theme.title }}</h3>\n\t\t\t<p>{{ theme.description }}</p>\n\t\t\t<span v-if=\"enforced\" class=\"theming__preview-warning\" role=\"note\">\n\t\t\t\t{{ t('theming', 'Theme selection is enforced') }}\n\t\t\t</span>\n\t\t\t<NcCheckboxRadioSwitch class=\"theming__preview-toggle\"\n\t\t\t\t:checked.sync=\"checked\"\n\t\t\t\t:disabled=\"enforced\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:type=\"switchType\">\n\t\t\t\t{{ theme.enableLabel }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { generateFilePath } from '@nextcloud/router'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch'\n\nexport default {\n\tname: 'ItemPreview',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t},\n\tprops: {\n\t\tenforced: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tselected: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttheme: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tunique: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\tswitchType() {\n\t\t\treturn this.unique ? 'switch' : 'radio'\n\t\t},\n\n\t\tname() {\n\t\t\treturn !this.unique ? this.type : null\n\t\t},\n\n\t\timg() {\n\t\t\treturn generateFilePath('theming', 'img', this.theme.id + '.jpg')\n\t\t},\n\n\t\tchecked: {\n\t\t\tget() {\n\t\t\t\treturn this.selected\n\t\t\t},\n\t\t\tset(checked) {\n\t\t\t\tconsole.debug('Changed theme', this.theme.id, checked)\n\n\t\t\t\t// If this is a radio, we can only enable\n\t\t\t\tif (!this.unique) {\n\t\t\t\t\tthis.$emit('change', { enabled: true, id: this.theme.id })\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// If this is a switch, we can disable the theme\n\t\t\t\tthis.$emit('change', { enabled: checked === true, id: this.theme.id })\n\t\t\t},\n\t\t},\n\t},\n\n\tmethods: {\n\t\tonToggle() {\n\t\t\tif (this.switchType === 'radio') {\n\t\t\t\tthis.checked = true\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Invert state\n\t\t\tthis.checked = !this.checked\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.theming__preview {\n\t// We make previews on 16/10 screens\n\t--ratio: 16;\n\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-content: flex-start;\n\tmax-width: 800px;\n\n\t&,\n\t* {\n\t\tuser-select: none;\n\t}\n\n\t&-image {\n\t\tflex-basis: calc(16px * var(--ratio));\n\t\tflex-shrink: 0;\n\t\theight: calc(10px * var(--ratio));\n\t\tmargin-right: var(--gap);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: top left;\n\t\tbackground-size: cover;\n\t}\n\n\t&-description {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\n\t\tlabel {\n\t\t\tpadding: 12px 0;\n\t\t}\n\t}\n\n\t&--default {\n\t\tgrid-column: span 2;\n\t}\n\n\t&-warning {\n\t\tcolor: var(--color-warning);\n\t}\n}\n\n@media (max-width: (1024px / 1.5)) {\n\t.theming__preview {\n\t\tflex-direction: column;\n\n\t\t&-image {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemPreview.vue?vue&type=style&index=0&id=37ca8ab2&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemPreview.vue?vue&type=style&index=0&id=37ca8ab2&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./ItemPreview.vue?vue&type=template&id=37ca8ab2&scoped=true&\"\nimport script from \"./ItemPreview.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemPreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemPreview.vue?vue&type=style&index=0&id=37ca8ab2&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 \"37ca8ab2\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"theming__preview\",class:'theming__preview--' + _vm.theme.id},[_c('div',{staticClass:\"theming__preview-image\",style:({ backgroundImage: 'url(' + _vm.img + ')' }),on:{\"click\":_vm.onToggle}}),_vm._v(\" \"),_c('div',{staticClass:\"theming__preview-description\"},[_c('h3',[_vm._v(_vm._s(_vm.theme.title))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.theme.description))]),_vm._v(\" \"),(_vm.enforced)?_c('span',{staticClass:\"theming__preview-warning\",attrs:{\"role\":\"note\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('theming', 'Theme selection is enforced'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('NcCheckboxRadioSwitch',{staticClass:\"theming__preview-toggle\",attrs:{\"checked\":_vm.checked,\"disabled\":_vm.enforced,\"name\":_vm.name,\"type\":_vm.switchType},on:{\"update:checked\":function($event){_vm.checked=$event}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.theme.enableLabel)+\"\\n\\t\\t\")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n - @copyright Copyright (c) 2022 Greta Doci <gretadoci@gmail.com>\n -\n - @author Christopher Ng <chrng8@gmail.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<section>\n\t\t<NcSettingsSection :title=\"t('theming', 'Appearance and accessibility')\"\n\t\t\t:limit-width=\"false\"\n\t\t\tclass=\"theming\">\n\t\t\t<p v-html=\"description\" />\n\t\t\t<p v-html=\"descriptionDetail\" />\n\n\t\t\t<div class=\"theming__preview-list\">\n\t\t\t\t<ItemPreview v-for=\"theme in themes\"\n\t\t\t\t\t:key=\"theme.id\"\n\t\t\t\t\t:enforced=\"theme.id === enforceTheme\"\n\t\t\t\t\t:selected=\"selectedTheme.id === theme.id\"\n\t\t\t\t\t:theme=\"theme\"\n\t\t\t\t\t:unique=\"themes.length === 1\"\n\t\t\t\t\ttype=\"theme\"\n\t\t\t\t\t@change=\"changeTheme\" />\n\t\t\t</div>\n\n\t\t\t<div class=\"theming__preview-list\">\n\t\t\t\t<ItemPreview v-for=\"theme in fonts\"\n\t\t\t\t\t:key=\"theme.id\"\n\t\t\t\t\t:selected=\"theme.enabled\"\n\t\t\t\t\t:theme=\"theme\"\n\t\t\t\t\t:unique=\"fonts.length === 1\"\n\t\t\t\t\ttype=\"font\"\n\t\t\t\t\t@change=\"changeFont\" />\n\t\t\t</div>\n\t\t</NcSettingsSection>\n\n\t\t<NcSettingsSection :title=\"t('theming', 'Keyboard shortcuts')\">\n\t\t\t<p>{{ t('theming', 'In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.') }}</p>\n\t\t\t<NcCheckboxRadioSwitch class=\"theming__preview-toggle\"\n\t\t\t\t:checked.sync=\"shortcutsDisabled\"\n\t\t\t\tname=\"shortcuts_disabled\"\n\t\t\t\ttype=\"switch\"\n\t\t\t\t@change=\"changeShortcutsDisabled\">\n\t\t\t\t{{ t('theming', 'Disable all keyboard shortcuts') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</NcSettingsSection>\n\n\t\t<NcSettingsSection :title=\"t('theming', 'Background')\"\n\t\t\tclass=\"background\">\n\t\t\t<p>{{ t('theming', 'Set a custom background') }}</p>\n\t\t\t<BackgroundSettings class=\"background__grid\"\n\t\t\t\t:background=\"background\"\n\t\t\t\t:theming-default-background=\"themingDefaultBackground\"\n\t\t\t\t@update:background=\"updateBackground\" />\n\t\t</NcSettingsSection>\n\t</section>\n</template>\n\n<script>\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection'\n\nimport BackgroundSettings from './components/BackgroundSettings.vue'\nimport ItemPreview from './components/ItemPreview.vue'\n\nconst availableThemes = loadState('theming', 'themes', [])\nconst enforceTheme = loadState('theming', 'enforceTheme', '')\nconst shortcutsDisabled = loadState('theming', 'shortcutsDisabled', false)\n\nconst background = loadState('theming', 'background')\nconst backgroundVersion = loadState('theming', 'backgroundVersion')\nconst themingDefaultBackground = loadState('theming', 'themingDefaultBackground')\nconst shippedBackgroundList = loadState('theming', 'shippedBackgrounds')\n\nconsole.debug('Available themes', availableThemes)\n\nexport default {\n\tname: 'UserThemes',\n\tcomponents: {\n\t\tItemPreview,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t\tBackgroundSettings,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tavailableThemes,\n\t\t\tenforceTheme,\n\t\t\tshortcutsDisabled,\n\t\t\tbackground,\n\t\t\tbackgroundVersion,\n\t\t\tthemingDefaultBackground,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tthemes() {\n\t\t\treturn this.availableThemes.filter(theme => theme.type === 1)\n\t\t},\n\t\tfonts() {\n\t\t\treturn this.availableThemes.filter(theme => theme.type === 2)\n\t\t},\n\n\t\t// Selected theme, fallback on first (default) if none\n\t\tselectedTheme() {\n\t\t\treturn this.themes.find(theme => theme.enabled === true) || this.themes[0]\n\t\t},\n\n\t\tdescription() {\n\t\t\t// using the `t` replace method escape html, we have to do it manually :/\n\t\t\treturn t(\n\t\t\t\t'theming',\n\t\t\t\t'Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.'\n\t\t\t)\n\t\t\t\t.replace('{guidelines}', this.guidelinesLink)\n\t\t\t\t.replace('{linkend}', '</a>')\n\t\t},\n\t\tguidelinesLink() {\n\t\t\treturn '<a target=\"_blank\" href=\"https://www.w3.org/WAI/standards-guidelines/wcag/\" rel=\"noreferrer nofollow\">'\n\t\t},\n\t\tdescriptionDetail() {\n\t\t\treturn t(\n\t\t\t\t'theming',\n\t\t\t\t'If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!'\n\t\t\t)\n\t\t\t\t.replace('{issuetracker}', this.issuetrackerLink)\n\t\t\t\t.replace('{designteam}', this.designteamLink)\n\t\t\t\t.replace(/\\{linkend\\}/g, '</a>')\n\t\t},\n\t\tissuetrackerLink() {\n\t\t\treturn '<a target=\"_blank\" href=\"https://github.com/nextcloud/server/issues/\" rel=\"noreferrer nofollow\">'\n\t\t},\n\t\tdesignteamLink() {\n\t\t\treturn '<a target=\"_blank\" href=\"https://nextcloud.com/design\" rel=\"noreferrer nofollow\">'\n\t\t},\n\t},\n\n\twatch: {\n\t\tshortcutsDisabled(newState) {\n\t\t\tthis.changeShortcutsDisabled(newState)\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.updateGlobalStyles()\n\t},\n\n\tmethods: {\n\t\tupdateBackground(data) {\n\t\t\tthis.background = (data.type === 'custom' || data.type === 'default') ? data.type : data.value\n\t\t\tthis.backgroundVersion = data.version\n\t\t\tthis.updateGlobalStyles()\n\t\t\tthis.$emit('update:background')\n\t\t},\n\t\tupdateGlobalStyles() {\n\t\t\t// Override primary-invert-if-bright and color-primary-text if background is set\n\t\t\tconst isBackgroundBright = shippedBackgroundList[this.background]?.theming === 'dark'\n\t\t\tif (isBackgroundBright) {\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'invert(100%)')\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--color-primary-text', '#000000')\n\t\t\t\t// document.body.removeAttribute('data-theme-dark')\n\t\t\t\t// document.body.setAttribute('data-theme-light', 'true')\n\t\t\t} else {\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'no')\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--color-primary-text', '#ffffff')\n\t\t\t\t// document.body.removeAttribute('data-theme-light')\n\t\t\t\t// document.body.setAttribute('data-theme-dark', 'true')\n\t\t\t}\n\t\t},\n\t\tchangeTheme({ enabled, id }) {\n\t\t\t// Reset selected and select new one\n\t\t\tthis.themes.forEach(theme => {\n\t\t\t\tif (theme.id === id && enabled) {\n\t\t\t\t\ttheme.enabled = true\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\ttheme.enabled = false\n\t\t\t})\n\n\t\t\tthis.updateBodyAttributes()\n\t\t\tthis.selectItem(enabled, id)\n\t\t},\n\t\tchangeFont({ enabled, id }) {\n\t\t\t// Reset selected and select new one\n\t\t\tthis.fonts.forEach(font => {\n\t\t\t\tif (font.id === id && enabled) {\n\t\t\t\t\tfont.enabled = true\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfont.enabled = false\n\t\t\t})\n\n\t\t\tthis.updateBodyAttributes()\n\t\t\tthis.selectItem(enabled, id)\n\t\t},\n\n\t\tasync changeShortcutsDisabled(newState) {\n\t\t\tif (newState) {\n\t\t\t\tawait axios({\n\t\t\t\t\turl: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {\n\t\t\t\t\t\tappId: 'theming',\n\t\t\t\t\t\tconfigKey: 'shortcuts_disabled',\n\t\t\t\t\t}),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tconfigValue: 'yes',\n\t\t\t\t\t},\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tawait axios({\n\t\t\t\t\turl: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {\n\t\t\t\t\t\tappId: 'theming',\n\t\t\t\t\t\tconfigKey: 'shortcuts_disabled',\n\t\t\t\t\t}),\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\n\t\tupdateBodyAttributes() {\n\t\t\tconst enabledThemesIDs = this.themes.filter(theme => theme.enabled === true).map(theme => theme.id)\n\t\t\tconst enabledFontsIDs = this.fonts.filter(font => font.enabled === true).map(font => font.id)\n\n\t\t\tthis.themes.forEach(theme => {\n\t\t\t\tdocument.body.toggleAttribute(`data-theme-${theme.id}`, theme.enabled)\n\t\t\t})\n\t\t\tthis.fonts.forEach(font => {\n\t\t\t\tdocument.body.toggleAttribute(`data-theme-${font.id}`, font.enabled)\n\t\t\t})\n\n\t\t\tdocument.body.setAttribute('data-themes', [...enabledThemesIDs, ...enabledFontsIDs].join(','))\n\t\t},\n\n\t\t/**\n\t\t * Commit a change and force reload css\n\t\t * Fetching the file again will trigger the server update\n\t\t *\n\t\t * @param {boolean} enabled the theme state\n\t\t * @param {string} themeId the theme ID to change\n\t\t */\n\t\tasync selectItem(enabled, themeId) {\n\t\t\ttry {\n\t\t\t\tif (enabled) {\n\t\t\t\t\tawait axios({\n\t\t\t\t\t\turl: generateOcsUrl('apps/theming/api/v1/theme/{themeId}/enable', { themeId }),\n\t\t\t\t\t\tmethod: 'PUT',\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tawait axios({\n\t\t\t\t\t\turl: generateOcsUrl('apps/theming/api/v1/theme/{themeId}', { themeId }),\n\t\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err, err.response)\n\t\t\t\tOC.Notification.showTemporary(t('theming', err.response.data.ocs.meta.message + '. Unable to apply the setting.'))\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.theming {\n\t// Limit width of settings sections for readability\n\tp {\n\t\tmax-width: 800px;\n\t}\n\n\t// Proper highlight for links and focus feedback\n\t&::v-deep a {\n\t\tfont-weight: bold;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t}\n\n\t&__preview-list {\n\t\t--gap: 30px;\n\n\t\tdisplay: grid;\n\t\tmargin-top: var(--gap);\n\t\tcolumn-gap: var(--gap);\n\t\trow-gap: var(--gap);\n\t\tgrid-template-columns: 1fr 1fr;\n\t}\n}\n\n.background {\n\t&__grid {\n\t\tmargin-top: 30px;\n\t}\n}\n\n@media (max-width: 1440px) {\n\t.theming__preview-list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\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!./UserThemes.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!./UserThemes.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserThemes.vue?vue&type=style&index=0&id=205ad124&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserThemes.vue?vue&type=style&index=0&id=205ad124&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserThemes.vue?vue&type=template&id=205ad124&scoped=true&\"\nimport script from \"./UserThemes.vue?vue&type=script&lang=js&\"\nexport * from \"./UserThemes.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserThemes.vue?vue&type=style&index=0&id=205ad124&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 \"205ad124\",\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('section',[_c('NcSettingsSection',{staticClass:\"theming\",attrs:{\"title\":_vm.t('theming', 'Appearance and accessibility'),\"limit-width\":false}},[_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.description)}}),_vm._v(\" \"),_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.descriptionDetail)}}),_vm._v(\" \"),_c('div',{staticClass:\"theming__preview-list\"},_vm._l((_vm.themes),function(theme){return _c('ItemPreview',{key:theme.id,attrs:{\"enforced\":theme.id === _vm.enforceTheme,\"selected\":_vm.selectedTheme.id === theme.id,\"theme\":theme,\"unique\":_vm.themes.length === 1,\"type\":\"theme\"},on:{\"change\":_vm.changeTheme}})}),1),_vm._v(\" \"),_c('div',{staticClass:\"theming__preview-list\"},_vm._l((_vm.fonts),function(theme){return _c('ItemPreview',{key:theme.id,attrs:{\"selected\":theme.enabled,\"theme\":theme,\"unique\":_vm.fonts.length === 1,\"type\":\"font\"},on:{\"change\":_vm.changeFont}})}),1)]),_vm._v(\" \"),_c('NcSettingsSection',{attrs:{\"title\":_vm.t('theming', 'Keyboard shortcuts')}},[_c('p',[_vm._v(_vm._s(_vm.t('theming', 'In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.')))]),_vm._v(\" \"),_c('NcCheckboxRadioSwitch',{staticClass:\"theming__preview-toggle\",attrs:{\"checked\":_vm.shortcutsDisabled,\"name\":\"shortcuts_disabled\",\"type\":\"switch\"},on:{\"update:checked\":function($event){_vm.shortcutsDisabled=$event},\"change\":_vm.changeShortcutsDisabled}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('theming', 'Disable all keyboard shortcuts'))+\"\\n\\t\\t\")])],1),_vm._v(\" \"),_c('NcSettingsSection',{staticClass:\"background\",attrs:{\"title\":_vm.t('theming', 'Background')}},[_c('p',[_vm._v(_vm._s(_vm.t('theming', 'Set a custom background')))]),_vm._v(\" \"),_c('BackgroundSettings',{staticClass:\"background__grid\",attrs:{\"background\":_vm.background,\"theming-default-background\":_vm.themingDefaultBackground},on:{\"update:background\":_vm.updateBackground}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 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\nimport Vue from 'vue'\nimport App from './UserThemes.vue'\n\n// bind to window\nVue.prototype.OC = OC\nVue.prototype.t = t\n\nconst View = Vue.extend(App)\nconst theming = new View()\ntheming.$mount('#theming')\n\ntheming.$on('update:background', () => {\n\t// Refresh server-side generated theming CSS\n\t[...document.head.querySelectorAll('link.theme')].forEach(theme => {\n\t\tconst url = new URL(theme.href)\n\t\turl.searchParams.set('v', Date.now())\n\t\tconst newTheme = theme.cloneNode()\n\t\tnewTheme.href = url.toString()\n\t\tnewTheme.onload = () => theme.remove()\n\t\tdocument.head.append(newTheme)\n\t})\n})\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".theming p[data-v-205ad124]{max-width:800px}.theming[data-v-205ad124] a{font-weight:bold}.theming[data-v-205ad124] a:hover,.theming[data-v-205ad124] a:focus{text-decoration:underline}.theming__preview-list[data-v-205ad124]{--gap: 30px;display:grid;margin-top:var(--gap);column-gap:var(--gap);row-gap:var(--gap);grid-template-columns:1fr 1fr}.background__grid[data-v-205ad124]{margin-top:30px}@media(max-width: 1440px){.theming__preview-list[data-v-205ad124]{display:flex;flex-direction:column}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/theming/src/UserThemes.vue\"],\"names\":[],\"mappings\":\"AA+RC,4BACC,eAAA,CAID,4BACC,gBAAA,CAEA,oEAEC,yBAAA,CAIF,wCACC,WAAA,CAEA,YAAA,CACA,qBAAA,CACA,qBAAA,CACA,kBAAA,CACA,6BAAA,CAKD,mCACC,eAAA,CAIF,0BACC,wCACC,YAAA,CACA,qBAAA,CAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.theming {\\n\\t// Limit width of settings sections for readability\\n\\tp {\\n\\t\\tmax-width: 800px;\\n\\t}\\n\\n\\t// Proper highlight for links and focus feedback\\n\\t&::v-deep a {\\n\\t\\tfont-weight: bold;\\n\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\ttext-decoration: underline;\\n\\t\\t}\\n\\t}\\n\\n\\t&__preview-list {\\n\\t\\t--gap: 30px;\\n\\n\\t\\tdisplay: grid;\\n\\t\\tmargin-top: var(--gap);\\n\\t\\tcolumn-gap: var(--gap);\\n\\t\\trow-gap: var(--gap);\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t}\\n}\\n\\n.background {\\n\\t&__grid {\\n\\t\\tmargin-top: 30px;\\n\\t}\\n}\\n\\n@media (max-width: 1440px) {\\n\\t.theming__preview-list {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".background-selector[data-v-57fc0570]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-57fc0570]{width:176px;height:96px;margin:8px;background-size:cover;background-position:center center;text-align:center;border-radius:var(--border-radius-large);border:2px solid var(--color-main-background);overflow:hidden}.background-selector .background.current[data-v-57fc0570]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-57fc0570],.background-selector .background.default[data-v-57fc0570],.background-selector .background.color[data-v-57fc0570]{border-color:var(--color-border)}.background-selector .background.color[data-v-57fc0570]{background-color:var(--color-primary-default);color:var(--color-primary-text)}.background-selector .background.active[data-v-57fc0570],.background-selector .background[data-v-57fc0570]:hover,.background-selector .background[data-v-57fc0570]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-57fc0570]:not(.icon-loading):after{background-image:var(--icon-checkmark-white);background-repeat:no-repeat;background-position:center;background-size:44px;content:\\\"\\\";display:block;height:100%}.background-selector .background.active:not(.icon-loading)[data-color-bright][data-v-57fc0570]:after{background-image:var(--icon-checkmark-dark)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/theming/src/components/BackgroundSettings.vue\"],\"names\":[],\"mappings\":\"AA6NA,sCACC,YAAA,CACA,cAAA,CACA,sBAAA,CAEA,kDACC,WAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,iCAAA,CACA,iBAAA,CACA,wCAAA,CACA,6CAAA,CACA,eAAA,CAEA,0DACC,6CAAA,CAGD,+KACC,gCAAA,CAGD,wDACC,6CAAA,CACA,+BAAA,CAGD,yKAGC,qCAAA,CAIA,kFACC,4CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CAGD,qGACC,2CAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.background-selector {\\n\\tdisplay: flex;\\n\\tflex-wrap: wrap;\\n\\tjustify-content: center;\\n\\n\\t.background {\\n\\t\\twidth: 176px;\\n\\t\\theight: 96px;\\n\\t\\tmargin: 8px;\\n\\t\\tbackground-size: cover;\\n\\t\\tbackground-position: center center;\\n\\t\\ttext-align: center;\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\t\\tborder: 2px solid var(--color-main-background);\\n\\t\\toverflow: hidden;\\n\\n\\t\\t&.current {\\n\\t\\t\\tbackground-image: var(--color-background-dark);\\n\\t\\t}\\n\\n\\t\\t&.filepicker, &.default, &.color {\\n\\t\\t\\tborder-color: var(--color-border);\\n\\t\\t}\\n\\n\\t\\t&.color {\\n\\t\\t\\tbackground-color: var(--color-primary-default);\\n\\t\\t\\tcolor: var(--color-primary-text);\\n\\t\\t}\\n\\n\\t\\t&.active,\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\tborder: 2px solid var(--color-primary);\\n\\t\\t}\\n\\n\\t\\t&.active:not(.icon-loading) {\\n\\t\\t\\t&:after {\\n\\t\\t\\t\\tbackground-image: var(--icon-checkmark-white);\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t\\tbackground-position: center;\\n\\t\\t\\t\\tbackground-size: 44px;\\n\\t\\t\\t\\tcontent: '';\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t\\theight: 100%;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&[data-color-bright]:after {\\n\\t\\t\\t\\tbackground-image: var(--icon-checkmark-dark);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".theming__preview[data-v-37ca8ab2]{--ratio: 16;position:relative;display:flex;justify-content:flex-start;max-width:800px}.theming__preview[data-v-37ca8ab2],.theming__preview *[data-v-37ca8ab2]{user-select:none}.theming__preview-image[data-v-37ca8ab2]{flex-basis:calc(16px*var(--ratio));flex-shrink:0;height:calc(10px*var(--ratio));margin-right:var(--gap);cursor:pointer;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:top left;background-size:cover}.theming__preview-description[data-v-37ca8ab2]{display:flex;flex-direction:column}.theming__preview-description label[data-v-37ca8ab2]{padding:12px 0}.theming__preview--default[data-v-37ca8ab2]{grid-column:span 2}.theming__preview-warning[data-v-37ca8ab2]{color:var(--color-warning)}@media(max-width: 682.6666666667px){.theming__preview[data-v-37ca8ab2]{flex-direction:column}.theming__preview-image[data-v-37ca8ab2]{margin:0}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/theming/src/components/ItemPreview.vue\"],\"names\":[],\"mappings\":\"AAiGA,mCAEC,WAAA,CAEA,iBAAA,CACA,YAAA,CACA,0BAAA,CACA,eAAA,CAEA,wEAEC,gBAAA,CAGD,yCACC,kCAAA,CACA,aAAA,CACA,8BAAA,CACA,uBAAA,CACA,cAAA,CACA,kCAAA,CACA,2BAAA,CACA,4BAAA,CACA,qBAAA,CAGD,+CACC,YAAA,CACA,qBAAA,CAEA,qDACC,cAAA,CAIF,4CACC,kBAAA,CAGD,2CACC,0BAAA,CAIF,oCACC,mCACC,qBAAA,CAEA,yCACC,QAAA,CAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.theming__preview {\\n\\t// We make previews on 16/10 screens\\n\\t--ratio: 16;\\n\\n\\tposition: relative;\\n\\tdisplay: flex;\\n\\tjustify-content: flex-start;\\n\\tmax-width: 800px;\\n\\n\\t&,\\n\\t* {\\n\\t\\tuser-select: none;\\n\\t}\\n\\n\\t&-image {\\n\\t\\tflex-basis: calc(16px * var(--ratio));\\n\\t\\tflex-shrink: 0;\\n\\t\\theight: calc(10px * var(--ratio));\\n\\t\\tmargin-right: var(--gap);\\n\\t\\tcursor: pointer;\\n\\t\\tborder-radius: var(--border-radius);\\n\\t\\tbackground-repeat: no-repeat;\\n\\t\\tbackground-position: top left;\\n\\t\\tbackground-size: cover;\\n\\t}\\n\\n\\t&-description {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\n\\t\\tlabel {\\n\\t\\t\\tpadding: 12px 0;\\n\\t\\t}\\n\\t}\\n\\n\\t&--default {\\n\\t\\tgrid-column: span 2;\\n\\t}\\n\\n\\t&-warning {\\n\\t\\tcolor: var(--color-warning);\\n\\t}\\n}\\n\\n@media (max-width: (1024px / 1.5)) {\\n\\t.theming__preview {\\n\\t\\tflex-direction: column;\\n\\n\\t\\t&-image {\\n\\t\\t\\tmargin: 0;\\n\\t\\t}\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 6755;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t6755: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(53184); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","prefixWithBaseUrl","url","generateFilePath","getBackgroundUrl","background","time","themingDefaultBackground","enabledThemes","window","OCA","Theming","isDarkTheme","length","matchMedia","matches","join","indexOf","generateUrl","cacheBuster","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_h","$createElement","_c","_self","staticClass","class","active","attrs","on","pickFile","_v","_s","t","loading","setDefault","debouncePickColor","model","value","callback","$$v","$set","expression","color","style","backgroundColor","invertTextColor","defaultColor","_l","shippedBackground","directives","name","rawName","details","key","preview","theming","$event","setShipped","theme","id","backgroundImage","img","onToggle","title","description","_e","checked","enforced","switchType","enableLabel","console","debug","availableThemes","domProps","descriptionDetail","enforceTheme","selectedTheme","themes","changeTheme","enabled","fonts","changeFont","shortcutsDisabled","changeShortcutsDisabled","updateBackground","Vue","OC","App","$mount","$on","document","head","querySelectorAll","forEach","URL","href","searchParams","set","Date","now","newTheme","cloneNode","toString","onload","remove","append","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","Object","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","baseURI","self","location","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"theming-theming-settings.js?v=2d6f75fbf75c0b292481","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/theming/src/helpers/prefixWithBaseUrl.js","webpack:///nextcloud/apps/theming/src/helpers/getBackgroundUrl.js","webpack:///nextcloud/apps/theming/src/components/BackgroundSettings.vue","webpack:///nextcloud/apps/theming/src/components/BackgroundSettings.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/theming/src/components/BackgroundSettings.vue?065d","webpack://nextcloud/./apps/theming/src/components/BackgroundSettings.vue?65db","webpack:///nextcloud/apps/theming/src/components/BackgroundSettings.vue?vue&type=template&id=57fc0570&scoped=true&","webpack:///nextcloud/apps/theming/src/components/ItemPreview.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/theming/src/components/ItemPreview.vue","webpack://nextcloud/./apps/theming/src/components/ItemPreview.vue?f1c6","webpack://nextcloud/./apps/theming/src/components/ItemPreview.vue?8797","webpack:///nextcloud/apps/theming/src/components/ItemPreview.vue?vue&type=template&id=37ca8ab2&scoped=true&","webpack:///nextcloud/apps/theming/src/UserThemes.vue","webpack:///nextcloud/apps/theming/src/UserThemes.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/theming/src/UserThemes.vue?743b","webpack://nextcloud/./apps/theming/src/UserThemes.vue?7eb2","webpack:///nextcloud/apps/theming/src/UserThemes.vue?vue&type=template&id=92936166&scoped=true&","webpack:///nextcloud/apps/theming/src/settings.js","webpack:///nextcloud/apps/theming/src/UserThemes.vue?vue&type=style&index=0&id=92936166&lang=scss&scoped=true&","webpack:///nextcloud/apps/theming/src/components/BackgroundSettings.vue?vue&type=style&index=0&id=57fc0570&scoped=true&lang=scss&","webpack:///nextcloud/apps/theming/src/components/ItemPreview.vue?vue&type=style&index=0&id=37ca8ab2&lang=scss&scoped=true&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\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\nimport { generateFilePath } from '@nextcloud/router'\n\nexport const prefixWithBaseUrl = (url) => generateFilePath('theming', '', 'img/background/') + url\n","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Avior <florian.bouillon@delta-wings.net>\n * @author Julien Veyssier <eneiluj@posteo.net>\n * @author Julius Härtl <jus@bitgrid.net>\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\nimport { generateUrl } from '@nextcloud/router'\nimport { prefixWithBaseUrl } from './prefixWithBaseUrl.js'\n\nexport const getBackgroundUrl = (background, time = 0, themingDefaultBackground = '') => {\n\tconst enabledThemes = window.OCA?.Theming?.enabledThemes || []\n\tconst isDarkTheme = (enabledThemes.length === 0 || enabledThemes[0] === 'default')\n\t\t? window.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t: enabledThemes.join('').indexOf('dark') !== -1\n\n\tif (background === 'default') {\n\t\tif (themingDefaultBackground && themingDefaultBackground !== 'backgroundColor') {\n\t\t\treturn generateUrl('/apps/theming/image/background') + '?v=' + window.OCA.Theming.cacheBuster\n\t\t}\n\n\t\tif (isDarkTheme) {\n\t\t\treturn prefixWithBaseUrl('eduardo-neves-pedra-azul.jpg')\n\t\t}\n\n\t\treturn prefixWithBaseUrl('kamil-porembinski-clouds.jpg')\n\t} else if (background === 'custom') {\n\t\treturn generateUrl('/apps/theming/background') + '?v=' + time\n\t}\n\n\treturn prefixWithBaseUrl(background)\n}\n","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n - @copyright Copyright (c) 2022 Greta Doci <gretadoci@gmail.com>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n - @author Greta Doci <gretadoci@gmail.com>\n - @author Christopher Ng <chrng8@gmail.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<div class=\"background-selector\">\n\t\t<!-- Custom background -->\n\t\t<button class=\"background filepicker\"\n\t\t\t:class=\"{ active: background === 'custom' }\"\n\t\t\ttabindex=\"0\"\n\t\t\t@click=\"pickFile\">\n\t\t\t{{ t('theming', 'Pick from Files') }}\n\t\t</button>\n\n\t\t<!-- Default background -->\n\t\t<button class=\"background default\"\n\t\t\ttabindex=\"0\"\n\t\t\t:class=\"{ 'icon-loading': loading === 'default', active: background === 'default' }\"\n\t\t\t@click=\"setDefault\">\n\t\t\t{{ t('theming', 'Default image') }}\n\t\t</button>\n\n\t\t<!-- Custom color picker -->\n\t\t<NcColorPicker v-model=\"Theming.color\" @input=\"debouncePickColor\">\n\t\t\t<button class=\"background color\"\n\t\t\t\t:class=\"{ active: background === Theming.color}\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t:data-color=\"Theming.color\"\n\t\t\t\t:data-color-bright=\"invertTextColor(Theming.color)\"\n\t\t\t\t:style=\"{ backgroundColor: Theming.color, color: invertTextColor(Theming.color) ? '#000000' : '#ffffff'}\">\n\t\t\t\t{{ t('theming', 'Custom color') }}\n\t\t\t</button>\n\t\t</NcColorPicker>\n\n\t\t<!-- Default admin primary color -->\n\t\t<button class=\"background color\"\n\t\t\t:class=\"{ active: background === Theming.defaultColor }\"\n\t\t\ttabindex=\"0\"\n\t\t\t:data-color=\"Theming.defaultColor\"\n\t\t\t:data-color-bright=\"invertTextColor(Theming.defaultColor)\"\n\t\t\t:style=\"{ color: invertTextColor(Theming.defaultColor) ? '#000000' : '#ffffff'}\"\n\t\t\t@click=\"debouncePickColor\">\n\t\t\t{{ t('theming', 'Plain background') }}\n\t\t</button>\n\n\t\t<!-- Background set selection -->\n\t\t<button v-for=\"shippedBackground in shippedBackgrounds\"\n\t\t\t:key=\"shippedBackground.name\"\n\t\t\tv-tooltip=\"shippedBackground.details.attribution\"\n\t\t\t:class=\"{ 'icon-loading': loading === shippedBackground.name, active: background === shippedBackground.name }\"\n\t\t\ttabindex=\"0\"\n\t\t\tclass=\"background\"\n\t\t\t:data-color-bright=\"shippedBackground.details.theming === 'dark'\"\n\t\t\t:style=\"{ 'background-image': 'url(' + shippedBackground.preview + ')' }\"\n\t\t\t@click=\"setShipped(shippedBackground.name)\" />\n\t</div>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { getBackgroundUrl } from '../helpers/getBackgroundUrl.js'\nimport { loadState } from '@nextcloud/initial-state'\nimport { prefixWithBaseUrl } from '../helpers/prefixWithBaseUrl.js'\nimport axios from '@nextcloud/axios'\nimport debounce from 'debounce'\nimport NcColorPicker from '@nextcloud/vue/dist/Components/NcColorPicker'\nimport Tooltip from '@nextcloud/vue/dist/Directives/Tooltip'\n\nconst shippedBackgroundList = loadState('theming', 'shippedBackgrounds')\n\nexport default {\n\tname: 'BackgroundSettings',\n\tdirectives: {\n\t\tTooltip,\n\t},\n\n\tcomponents: {\n\t\tNcColorPicker,\n\t},\n\n\tprops: {\n\t\tbackground: {\n\t\t\ttype: String,\n\t\t\tdefault: 'default',\n\t\t},\n\t\tthemingDefaultBackground: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tbackgroundImage: generateUrl('/apps/theming/background') + '?v=' + Date.now(),\n\t\t\tloading: false,\n\t\t\tTheming: loadState('theming', 'data', {}),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tshippedBackgrounds() {\n\t\t\treturn Object.keys(shippedBackgroundList).map(fileName => {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\turl: prefixWithBaseUrl(fileName),\n\t\t\t\t\tpreview: prefixWithBaseUrl('preview/' + fileName),\n\t\t\t\t\tdetails: shippedBackgroundList[fileName],\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Do we need to invert the text if color is too bright?\n\t\t *\n\t\t * @param {string} color the hex color\n\t\t */\n\t\tinvertTextColor(color) {\n\t\t\treturn this.calculateLuma(color) > 0.6\n\t\t},\n\n\t\t/**\n\t\t * Calculate luminance of provided hex color\n\t\t *\n\t\t * @param {string} color the hex color\n\t\t */\n\t\tcalculateLuma(color) {\n\t\t\tconst [red, green, blue] = this.hexToRGB(color)\n\t\t\treturn (0.2126 * red + 0.7152 * green + 0.0722 * blue) / 255\n\t\t},\n\n\t\t/**\n\t\t * Convert hex color to RGB\n\t\t *\n\t\t * @param {string} hex the hex color\n\t\t */\n\t\thexToRGB(hex) {\n\t\t\tconst result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n\t\t\treturn result\n\t\t\t\t? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)]\n\t\t\t\t: null\n\t\t},\n\n\t\tasync update(data) {\n\t\t\tconst background = data.type === 'custom' || data.type === 'default' ? data.type : data.value\n\t\t\tthis.backgroundImage = getBackgroundUrl(background, data.version, this.themingDefaultBackground)\n\t\t\tif (data.type === 'color' || (data.type === 'default' && this.themingDefaultBackground === 'backgroundColor')) {\n\t\t\t\tthis.$emit('update:background', data)\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst image = new Image()\n\t\t\timage.onload = () => {\n\t\t\t\tthis.$emit('update:background', data)\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t\timage.src = this.backgroundImage\n\t\t},\n\n\t\tasync setDefault() {\n\t\t\tthis.loading = 'default'\n\t\t\tconst result = await axios.post(generateUrl('/apps/theming/background/default'))\n\t\t\tthis.update(result.data)\n\t\t},\n\n\t\tasync setShipped(shipped) {\n\t\t\tthis.loading = shipped\n\t\t\tconst result = await axios.post(generateUrl('/apps/theming/background/shipped'), { value: shipped })\n\t\t\tthis.update(result.data)\n\t\t},\n\n\t\tasync setFile(path) {\n\t\t\tthis.loading = 'custom'\n\t\t\tconst result = await axios.post(generateUrl('/apps/theming/background/custom'), { value: path })\n\t\t\tthis.update(result.data)\n\t\t},\n\n\t\tdebouncePickColor: debounce(function() {\n\t\t\tthis.pickColor(...arguments)\n\t\t}, 200),\n\t\tasync pickColor(event) {\n\t\t\tthis.loading = 'color'\n\t\t\tconst color = event?.target?.dataset?.color || this.Theming?.color || '#0082c9'\n\t\t\tconst result = await axios.post(generateUrl('/apps/theming/background/color'), { value: color })\n\t\t\tthis.update(result.data)\n\t\t},\n\n\t\tpickFile() {\n\t\t\twindow.OC.dialogs.filepicker(t('theming', 'Insert from {productName}', { productName: OC.theme.name }), (path, type) => {\n\t\t\t\tif (type === OC.dialogs.FILEPICKER_TYPE_CHOOSE) {\n\t\t\t\t\tthis.setFile(path)\n\t\t\t\t}\n\t\t\t}, false, ['image/png', 'image/gif', 'image/jpeg', 'image/svg'], true, OC.dialogs.FILEPICKER_TYPE_CHOOSE)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.background-selector {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\n\t.background {\n\t\twidth: 176px;\n\t\theight: 96px;\n\t\tmargin: 8px;\n\t\tbackground-size: cover;\n\t\tbackground-position: center center;\n\t\ttext-align: center;\n\t\tborder-radius: var(--border-radius-large);\n\t\tborder: 2px solid var(--color-main-background);\n\t\toverflow: hidden;\n\n\t\t&.current {\n\t\t\tbackground-image: var(--color-background-dark);\n\t\t}\n\n\t\t&.filepicker, &.default, &.color {\n\t\t\tborder-color: var(--color-border);\n\t\t}\n\n\t\t&.color {\n\t\t\tbackground-color: var(--color-primary-default);\n\t\t\tcolor: var(--color-primary-text);\n\t\t}\n\n\t\t&.active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tborder: 2px solid var(--color-primary);\n\t\t}\n\n\t\t&.active:not(.icon-loading) {\n\t\t\t&:after {\n\t\t\t\tbackground-image: var(--icon-checkmark-white);\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-size: 44px;\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t}\n\n\t\t\t&[data-color-bright]:after {\n\t\t\t\tbackground-image: var(--icon-checkmark-dark);\n\t\t\t}\n\t\t}\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!./BackgroundSettings.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!./BackgroundSettings.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=style&index=0&id=57fc0570&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=style&index=0&id=57fc0570&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./BackgroundSettings.vue?vue&type=template&id=57fc0570&scoped=true&\"\nimport script from \"./BackgroundSettings.vue?vue&type=script&lang=js&\"\nexport * from \"./BackgroundSettings.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BackgroundSettings.vue?vue&type=style&index=0&id=57fc0570&scoped=true&lang=scss&\"\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 \"57fc0570\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"background-selector\"},[_c('button',{staticClass:\"background filepicker\",class:{ active: _vm.background === 'custom' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.pickFile}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('theming', 'Pick from Files'))+\"\\n\\t\")]),_vm._v(\" \"),_c('button',{staticClass:\"background default\",class:{ 'icon-loading': _vm.loading === 'default', active: _vm.background === 'default' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.setDefault}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('theming', 'Default image'))+\"\\n\\t\")]),_vm._v(\" \"),_c('NcColorPicker',{on:{\"input\":_vm.debouncePickColor},model:{value:(_vm.Theming.color),callback:function ($$v) {_vm.$set(_vm.Theming, \"color\", $$v)},expression:\"Theming.color\"}},[_c('button',{staticClass:\"background color\",class:{ active: _vm.background === _vm.Theming.color},style:({ backgroundColor: _vm.Theming.color, color: _vm.invertTextColor(_vm.Theming.color) ? '#000000' : '#ffffff'}),attrs:{\"tabindex\":\"0\",\"data-color\":_vm.Theming.color,\"data-color-bright\":_vm.invertTextColor(_vm.Theming.color)}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('theming', 'Custom color'))+\"\\n\\t\\t\")])]),_vm._v(\" \"),_c('button',{staticClass:\"background color\",class:{ active: _vm.background === _vm.Theming.defaultColor },style:({ color: _vm.invertTextColor(_vm.Theming.defaultColor) ? '#000000' : '#ffffff'}),attrs:{\"tabindex\":\"0\",\"data-color\":_vm.Theming.defaultColor,\"data-color-bright\":_vm.invertTextColor(_vm.Theming.defaultColor)},on:{\"click\":_vm.debouncePickColor}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('theming', 'Plain background'))+\"\\n\\t\")]),_vm._v(\" \"),_vm._l((_vm.shippedBackgrounds),function(shippedBackground){return _c('button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(shippedBackground.details.attribution),expression:\"shippedBackground.details.attribution\"}],key:shippedBackground.name,staticClass:\"background\",class:{ 'icon-loading': _vm.loading === shippedBackground.name, active: _vm.background === shippedBackground.name },style:({ 'background-image': 'url(' + shippedBackground.preview + ')' }),attrs:{\"tabindex\":\"0\",\"data-color-bright\":shippedBackground.details.theming === 'dark'},on:{\"click\":function($event){return _vm.setShipped(shippedBackground.name)}}})})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemPreview.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!./ItemPreview.vue?vue&type=script&lang=js&\"","<template>\n\t<div :class=\"'theming__preview--' + theme.id\" class=\"theming__preview\">\n\t\t<div class=\"theming__preview-image\" :style=\"{ backgroundImage: 'url(' + img + ')' }\" @click=\"onToggle\" />\n\t\t<div class=\"theming__preview-description\">\n\t\t\t<h3>{{ theme.title }}</h3>\n\t\t\t<p>{{ theme.description }}</p>\n\t\t\t<span v-if=\"enforced\" class=\"theming__preview-warning\" role=\"note\">\n\t\t\t\t{{ t('theming', 'Theme selection is enforced') }}\n\t\t\t</span>\n\t\t\t<NcCheckboxRadioSwitch class=\"theming__preview-toggle\"\n\t\t\t\t:checked.sync=\"checked\"\n\t\t\t\t:disabled=\"enforced\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:type=\"switchType\">\n\t\t\t\t{{ theme.enableLabel }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { generateFilePath } from '@nextcloud/router'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch'\n\nexport default {\n\tname: 'ItemPreview',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t},\n\tprops: {\n\t\tenforced: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tselected: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttheme: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tunique: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\tswitchType() {\n\t\t\treturn this.unique ? 'switch' : 'radio'\n\t\t},\n\n\t\tname() {\n\t\t\treturn !this.unique ? this.type : null\n\t\t},\n\n\t\timg() {\n\t\t\treturn generateFilePath('theming', 'img', this.theme.id + '.jpg')\n\t\t},\n\n\t\tchecked: {\n\t\t\tget() {\n\t\t\t\treturn this.selected\n\t\t\t},\n\t\t\tset(checked) {\n\t\t\t\tconsole.debug('Changed theme', this.theme.id, checked)\n\n\t\t\t\t// If this is a radio, we can only enable\n\t\t\t\tif (!this.unique) {\n\t\t\t\t\tthis.$emit('change', { enabled: true, id: this.theme.id })\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// If this is a switch, we can disable the theme\n\t\t\t\tthis.$emit('change', { enabled: checked === true, id: this.theme.id })\n\t\t\t},\n\t\t},\n\t},\n\n\tmethods: {\n\t\tonToggle() {\n\t\t\tif (this.switchType === 'radio') {\n\t\t\t\tthis.checked = true\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Invert state\n\t\t\tthis.checked = !this.checked\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.theming__preview {\n\t// We make previews on 16/10 screens\n\t--ratio: 16;\n\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-content: flex-start;\n\tmax-width: 800px;\n\n\t&,\n\t* {\n\t\tuser-select: none;\n\t}\n\n\t&-image {\n\t\tflex-basis: calc(16px * var(--ratio));\n\t\tflex-shrink: 0;\n\t\theight: calc(10px * var(--ratio));\n\t\tmargin-right: var(--gap);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: top left;\n\t\tbackground-size: cover;\n\t}\n\n\t&-description {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\n\t\tlabel {\n\t\t\tpadding: 12px 0;\n\t\t}\n\t}\n\n\t&--default {\n\t\tgrid-column: span 2;\n\t}\n\n\t&-warning {\n\t\tcolor: var(--color-warning);\n\t}\n}\n\n@media (max-width: (1024px / 1.5)) {\n\t.theming__preview {\n\t\tflex-direction: column;\n\n\t\t&-image {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemPreview.vue?vue&type=style&index=0&id=37ca8ab2&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemPreview.vue?vue&type=style&index=0&id=37ca8ab2&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./ItemPreview.vue?vue&type=template&id=37ca8ab2&scoped=true&\"\nimport script from \"./ItemPreview.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemPreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemPreview.vue?vue&type=style&index=0&id=37ca8ab2&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 \"37ca8ab2\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"theming__preview\",class:'theming__preview--' + _vm.theme.id},[_c('div',{staticClass:\"theming__preview-image\",style:({ backgroundImage: 'url(' + _vm.img + ')' }),on:{\"click\":_vm.onToggle}}),_vm._v(\" \"),_c('div',{staticClass:\"theming__preview-description\"},[_c('h3',[_vm._v(_vm._s(_vm.theme.title))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.theme.description))]),_vm._v(\" \"),(_vm.enforced)?_c('span',{staticClass:\"theming__preview-warning\",attrs:{\"role\":\"note\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('theming', 'Theme selection is enforced'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('NcCheckboxRadioSwitch',{staticClass:\"theming__preview-toggle\",attrs:{\"checked\":_vm.checked,\"disabled\":_vm.enforced,\"name\":_vm.name,\"type\":_vm.switchType},on:{\"update:checked\":function($event){_vm.checked=$event}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.theme.enableLabel)+\"\\n\\t\\t\")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n - @copyright Copyright (c) 2022 Greta Doci <gretadoci@gmail.com>\n -\n - @author Christopher Ng <chrng8@gmail.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<section>\n\t\t<NcSettingsSection :title=\"t('theming', 'Appearance and accessibility')\"\n\t\t\t:limit-width=\"false\"\n\t\t\tclass=\"theming\">\n\t\t\t<p v-html=\"description\" />\n\t\t\t<p v-html=\"descriptionDetail\" />\n\n\t\t\t<div class=\"theming__preview-list\">\n\t\t\t\t<ItemPreview v-for=\"theme in themes\"\n\t\t\t\t\t:key=\"theme.id\"\n\t\t\t\t\t:enforced=\"theme.id === enforceTheme\"\n\t\t\t\t\t:selected=\"selectedTheme.id === theme.id\"\n\t\t\t\t\t:theme=\"theme\"\n\t\t\t\t\t:unique=\"themes.length === 1\"\n\t\t\t\t\ttype=\"theme\"\n\t\t\t\t\t@change=\"changeTheme\" />\n\t\t\t</div>\n\n\t\t\t<div class=\"theming__preview-list\">\n\t\t\t\t<ItemPreview v-for=\"theme in fonts\"\n\t\t\t\t\t:key=\"theme.id\"\n\t\t\t\t\t:selected=\"theme.enabled\"\n\t\t\t\t\t:theme=\"theme\"\n\t\t\t\t\t:unique=\"fonts.length === 1\"\n\t\t\t\t\ttype=\"font\"\n\t\t\t\t\t@change=\"changeFont\" />\n\t\t\t</div>\n\t\t</NcSettingsSection>\n\n\t\t<NcSettingsSection :title=\"t('theming', 'Keyboard shortcuts')\">\n\t\t\t<p>{{ t('theming', 'In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.') }}</p>\n\t\t\t<NcCheckboxRadioSwitch class=\"theming__preview-toggle\"\n\t\t\t\t:checked.sync=\"shortcutsDisabled\"\n\t\t\t\tname=\"shortcuts_disabled\"\n\t\t\t\ttype=\"switch\"\n\t\t\t\t@change=\"changeShortcutsDisabled\">\n\t\t\t\t{{ t('theming', 'Disable all keyboard shortcuts') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</NcSettingsSection>\n\n\t\t<NcSettingsSection :title=\"t('theming', 'Background')\"\n\t\t\tclass=\"background\">\n\t\t\t<p>{{ t('theming', 'Set a custom background') }}</p>\n\t\t\t<BackgroundSettings class=\"background__grid\"\n\t\t\t\t:background=\"background\"\n\t\t\t\t:theming-default-background=\"themingDefaultBackground\"\n\t\t\t\t@update:background=\"updateBackground\" />\n\t\t</NcSettingsSection>\n\t</section>\n</template>\n\n<script>\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection'\n\nimport BackgroundSettings from './components/BackgroundSettings.vue'\nimport ItemPreview from './components/ItemPreview.vue'\n\nconst availableThemes = loadState('theming', 'themes', [])\nconst enforceTheme = loadState('theming', 'enforceTheme', '')\nconst shortcutsDisabled = loadState('theming', 'shortcutsDisabled', false)\n\nconst background = loadState('theming', 'background')\nconst themingDefaultBackground = loadState('theming', 'themingDefaultBackground')\nconst shippedBackgroundList = loadState('theming', 'shippedBackgrounds')\n\nconsole.debug('Available themes', availableThemes)\n\nexport default {\n\tname: 'UserThemes',\n\tcomponents: {\n\t\tItemPreview,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t\tBackgroundSettings,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tavailableThemes,\n\t\t\tenforceTheme,\n\t\t\tshortcutsDisabled,\n\t\t\tbackground,\n\t\t\tthemingDefaultBackground,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tthemes() {\n\t\t\treturn this.availableThemes.filter(theme => theme.type === 1)\n\t\t},\n\t\tfonts() {\n\t\t\treturn this.availableThemes.filter(theme => theme.type === 2)\n\t\t},\n\n\t\t// Selected theme, fallback on first (default) if none\n\t\tselectedTheme() {\n\t\t\treturn this.themes.find(theme => theme.enabled === true) || this.themes[0]\n\t\t},\n\n\t\tdescription() {\n\t\t\t// using the `t` replace method escape html, we have to do it manually :/\n\t\t\treturn t(\n\t\t\t\t'theming',\n\t\t\t\t'Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.'\n\t\t\t)\n\t\t\t\t.replace('{guidelines}', this.guidelinesLink)\n\t\t\t\t.replace('{linkend}', '</a>')\n\t\t},\n\t\tguidelinesLink() {\n\t\t\treturn '<a target=\"_blank\" href=\"https://www.w3.org/WAI/standards-guidelines/wcag/\" rel=\"noreferrer nofollow\">'\n\t\t},\n\t\tdescriptionDetail() {\n\t\t\treturn t(\n\t\t\t\t'theming',\n\t\t\t\t'If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!'\n\t\t\t)\n\t\t\t\t.replace('{issuetracker}', this.issuetrackerLink)\n\t\t\t\t.replace('{designteam}', this.designteamLink)\n\t\t\t\t.replace(/\\{linkend\\}/g, '</a>')\n\t\t},\n\t\tissuetrackerLink() {\n\t\t\treturn '<a target=\"_blank\" href=\"https://github.com/nextcloud/server/issues/\" rel=\"noreferrer nofollow\">'\n\t\t},\n\t\tdesignteamLink() {\n\t\t\treturn '<a target=\"_blank\" href=\"https://nextcloud.com/design\" rel=\"noreferrer nofollow\">'\n\t\t},\n\t},\n\n\twatch: {\n\t\tshortcutsDisabled(newState) {\n\t\t\tthis.changeShortcutsDisabled(newState)\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.updateGlobalStyles()\n\t},\n\n\tmethods: {\n\t\tupdateBackground(data) {\n\t\t\tthis.background = (data.type === 'custom' || data.type === 'default') ? data.type : data.value\n\t\t\tthis.updateGlobalStyles()\n\t\t\tthis.$emit('update:background')\n\t\t},\n\n\t\tupdateGlobalStyles() {\n\t\t\t// Override primary-invert-if-bright and color-primary-text if background is set\n\t\t\tconst isBackgroundBright = shippedBackgroundList[this.background]?.theming === 'dark'\n\t\t\tif (isBackgroundBright) {\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'invert(100%)')\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--color-primary-text', '#000000')\n\t\t\t\t// document.body.removeAttribute('data-theme-dark')\n\t\t\t\t// document.body.setAttribute('data-theme-light', 'true')\n\t\t\t} else {\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'no')\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--color-primary-text', '#ffffff')\n\t\t\t\t// document.body.removeAttribute('data-theme-light')\n\t\t\t\t// document.body.setAttribute('data-theme-dark', 'true')\n\t\t\t}\n\t\t},\n\t\tchangeTheme({ enabled, id }) {\n\t\t\t// Reset selected and select new one\n\t\t\tthis.themes.forEach(theme => {\n\t\t\t\tif (theme.id === id && enabled) {\n\t\t\t\t\ttheme.enabled = true\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\ttheme.enabled = false\n\t\t\t})\n\n\t\t\tthis.updateBodyAttributes()\n\t\t\tthis.selectItem(enabled, id)\n\t\t},\n\t\tchangeFont({ enabled, id }) {\n\t\t\t// Reset selected and select new one\n\t\t\tthis.fonts.forEach(font => {\n\t\t\t\tif (font.id === id && enabled) {\n\t\t\t\t\tfont.enabled = true\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfont.enabled = false\n\t\t\t})\n\n\t\t\tthis.updateBodyAttributes()\n\t\t\tthis.selectItem(enabled, id)\n\t\t},\n\n\t\tasync changeShortcutsDisabled(newState) {\n\t\t\tif (newState) {\n\t\t\t\tawait axios({\n\t\t\t\t\turl: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {\n\t\t\t\t\t\tappId: 'theming',\n\t\t\t\t\t\tconfigKey: 'shortcuts_disabled',\n\t\t\t\t\t}),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tconfigValue: 'yes',\n\t\t\t\t\t},\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tawait axios({\n\t\t\t\t\turl: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {\n\t\t\t\t\t\tappId: 'theming',\n\t\t\t\t\t\tconfigKey: 'shortcuts_disabled',\n\t\t\t\t\t}),\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\n\t\tupdateBodyAttributes() {\n\t\t\tconst enabledThemesIDs = this.themes.filter(theme => theme.enabled === true).map(theme => theme.id)\n\t\t\tconst enabledFontsIDs = this.fonts.filter(font => font.enabled === true).map(font => font.id)\n\n\t\t\tthis.themes.forEach(theme => {\n\t\t\t\tdocument.body.toggleAttribute(`data-theme-${theme.id}`, theme.enabled)\n\t\t\t})\n\t\t\tthis.fonts.forEach(font => {\n\t\t\t\tdocument.body.toggleAttribute(`data-theme-${font.id}`, font.enabled)\n\t\t\t})\n\n\t\t\tdocument.body.setAttribute('data-themes', [...enabledThemesIDs, ...enabledFontsIDs].join(','))\n\t\t},\n\n\t\t/**\n\t\t * Commit a change and force reload css\n\t\t * Fetching the file again will trigger the server update\n\t\t *\n\t\t * @param {boolean} enabled the theme state\n\t\t * @param {string} themeId the theme ID to change\n\t\t */\n\t\tasync selectItem(enabled, themeId) {\n\t\t\ttry {\n\t\t\t\tif (enabled) {\n\t\t\t\t\tawait axios({\n\t\t\t\t\t\turl: generateOcsUrl('apps/theming/api/v1/theme/{themeId}/enable', { themeId }),\n\t\t\t\t\t\tmethod: 'PUT',\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tawait axios({\n\t\t\t\t\t\turl: generateOcsUrl('apps/theming/api/v1/theme/{themeId}', { themeId }),\n\t\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err, err.response)\n\t\t\t\tOC.Notification.showTemporary(t('theming', err.response.data.ocs.meta.message + '. Unable to apply the setting.'))\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.theming {\n\t// Limit width of settings sections for readability\n\tp {\n\t\tmax-width: 800px;\n\t}\n\n\t// Proper highlight for links and focus feedback\n\t&::v-deep a {\n\t\tfont-weight: bold;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t}\n\n\t&__preview-list {\n\t\t--gap: 30px;\n\n\t\tdisplay: grid;\n\t\tmargin-top: var(--gap);\n\t\tcolumn-gap: var(--gap);\n\t\trow-gap: var(--gap);\n\t\tgrid-template-columns: 1fr 1fr;\n\t}\n}\n\n.background {\n\t&__grid {\n\t\tmargin-top: 30px;\n\t}\n}\n\n@media (max-width: 1440px) {\n\t.theming__preview-list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\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!./UserThemes.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!./UserThemes.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserThemes.vue?vue&type=style&index=0&id=92936166&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserThemes.vue?vue&type=style&index=0&id=92936166&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserThemes.vue?vue&type=template&id=92936166&scoped=true&\"\nimport script from \"./UserThemes.vue?vue&type=script&lang=js&\"\nexport * from \"./UserThemes.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserThemes.vue?vue&type=style&index=0&id=92936166&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 \"92936166\",\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('section',[_c('NcSettingsSection',{staticClass:\"theming\",attrs:{\"title\":_vm.t('theming', 'Appearance and accessibility'),\"limit-width\":false}},[_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.description)}}),_vm._v(\" \"),_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.descriptionDetail)}}),_vm._v(\" \"),_c('div',{staticClass:\"theming__preview-list\"},_vm._l((_vm.themes),function(theme){return _c('ItemPreview',{key:theme.id,attrs:{\"enforced\":theme.id === _vm.enforceTheme,\"selected\":_vm.selectedTheme.id === theme.id,\"theme\":theme,\"unique\":_vm.themes.length === 1,\"type\":\"theme\"},on:{\"change\":_vm.changeTheme}})}),1),_vm._v(\" \"),_c('div',{staticClass:\"theming__preview-list\"},_vm._l((_vm.fonts),function(theme){return _c('ItemPreview',{key:theme.id,attrs:{\"selected\":theme.enabled,\"theme\":theme,\"unique\":_vm.fonts.length === 1,\"type\":\"font\"},on:{\"change\":_vm.changeFont}})}),1)]),_vm._v(\" \"),_c('NcSettingsSection',{attrs:{\"title\":_vm.t('theming', 'Keyboard shortcuts')}},[_c('p',[_vm._v(_vm._s(_vm.t('theming', 'In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.')))]),_vm._v(\" \"),_c('NcCheckboxRadioSwitch',{staticClass:\"theming__preview-toggle\",attrs:{\"checked\":_vm.shortcutsDisabled,\"name\":\"shortcuts_disabled\",\"type\":\"switch\"},on:{\"update:checked\":function($event){_vm.shortcutsDisabled=$event},\"change\":_vm.changeShortcutsDisabled}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('theming', 'Disable all keyboard shortcuts'))+\"\\n\\t\\t\")])],1),_vm._v(\" \"),_c('NcSettingsSection',{staticClass:\"background\",attrs:{\"title\":_vm.t('theming', 'Background')}},[_c('p',[_vm._v(_vm._s(_vm.t('theming', 'Set a custom background')))]),_vm._v(\" \"),_c('BackgroundSettings',{staticClass:\"background__grid\",attrs:{\"background\":_vm.background,\"theming-default-background\":_vm.themingDefaultBackground},on:{\"update:background\":_vm.updateBackground}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 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\nimport Vue from 'vue'\nimport App from './UserThemes.vue'\n\n// bind to window\nVue.prototype.OC = OC\nVue.prototype.t = t\n\nconst View = Vue.extend(App)\nconst theming = new View()\ntheming.$mount('#theming')\n\ntheming.$on('update:background', () => {\n\t// Refresh server-side generated theming CSS\n\t[...document.head.querySelectorAll('link.theme')].forEach(theme => {\n\t\tconst url = new URL(theme.href)\n\t\turl.searchParams.set('v', Date.now())\n\t\tconst newTheme = theme.cloneNode()\n\t\tnewTheme.href = url.toString()\n\t\tnewTheme.onload = () => theme.remove()\n\t\tdocument.head.append(newTheme)\n\t})\n})\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".theming p[data-v-92936166]{max-width:800px}.theming[data-v-92936166] a{font-weight:bold}.theming[data-v-92936166] a:hover,.theming[data-v-92936166] a:focus{text-decoration:underline}.theming__preview-list[data-v-92936166]{--gap: 30px;display:grid;margin-top:var(--gap);column-gap:var(--gap);row-gap:var(--gap);grid-template-columns:1fr 1fr}.background__grid[data-v-92936166]{margin-top:30px}@media(max-width: 1440px){.theming__preview-list[data-v-92936166]{display:flex;flex-direction:column}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/theming/src/UserThemes.vue\"],\"names\":[],\"mappings\":\"AA6RC,4BACC,eAAA,CAID,4BACC,gBAAA,CAEA,oEAEC,yBAAA,CAIF,wCACC,WAAA,CAEA,YAAA,CACA,qBAAA,CACA,qBAAA,CACA,kBAAA,CACA,6BAAA,CAKD,mCACC,eAAA,CAIF,0BACC,wCACC,YAAA,CACA,qBAAA,CAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.theming {\\n\\t// Limit width of settings sections for readability\\n\\tp {\\n\\t\\tmax-width: 800px;\\n\\t}\\n\\n\\t// Proper highlight for links and focus feedback\\n\\t&::v-deep a {\\n\\t\\tfont-weight: bold;\\n\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\ttext-decoration: underline;\\n\\t\\t}\\n\\t}\\n\\n\\t&__preview-list {\\n\\t\\t--gap: 30px;\\n\\n\\t\\tdisplay: grid;\\n\\t\\tmargin-top: var(--gap);\\n\\t\\tcolumn-gap: var(--gap);\\n\\t\\trow-gap: var(--gap);\\n\\t\\tgrid-template-columns: 1fr 1fr;\\n\\t}\\n}\\n\\n.background {\\n\\t&__grid {\\n\\t\\tmargin-top: 30px;\\n\\t}\\n}\\n\\n@media (max-width: 1440px) {\\n\\t.theming__preview-list {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".background-selector[data-v-57fc0570]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-57fc0570]{width:176px;height:96px;margin:8px;background-size:cover;background-position:center center;text-align:center;border-radius:var(--border-radius-large);border:2px solid var(--color-main-background);overflow:hidden}.background-selector .background.current[data-v-57fc0570]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-57fc0570],.background-selector .background.default[data-v-57fc0570],.background-selector .background.color[data-v-57fc0570]{border-color:var(--color-border)}.background-selector .background.color[data-v-57fc0570]{background-color:var(--color-primary-default);color:var(--color-primary-text)}.background-selector .background.active[data-v-57fc0570],.background-selector .background[data-v-57fc0570]:hover,.background-selector .background[data-v-57fc0570]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-57fc0570]:not(.icon-loading):after{background-image:var(--icon-checkmark-white);background-repeat:no-repeat;background-position:center;background-size:44px;content:\\\"\\\";display:block;height:100%}.background-selector .background.active:not(.icon-loading)[data-color-bright][data-v-57fc0570]:after{background-image:var(--icon-checkmark-dark)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/theming/src/components/BackgroundSettings.vue\"],\"names\":[],\"mappings\":\"AA6NA,sCACC,YAAA,CACA,cAAA,CACA,sBAAA,CAEA,kDACC,WAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,iCAAA,CACA,iBAAA,CACA,wCAAA,CACA,6CAAA,CACA,eAAA,CAEA,0DACC,6CAAA,CAGD,+KACC,gCAAA,CAGD,wDACC,6CAAA,CACA,+BAAA,CAGD,yKAGC,qCAAA,CAIA,kFACC,4CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CAGD,qGACC,2CAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.background-selector {\\n\\tdisplay: flex;\\n\\tflex-wrap: wrap;\\n\\tjustify-content: center;\\n\\n\\t.background {\\n\\t\\twidth: 176px;\\n\\t\\theight: 96px;\\n\\t\\tmargin: 8px;\\n\\t\\tbackground-size: cover;\\n\\t\\tbackground-position: center center;\\n\\t\\ttext-align: center;\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\t\\tborder: 2px solid var(--color-main-background);\\n\\t\\toverflow: hidden;\\n\\n\\t\\t&.current {\\n\\t\\t\\tbackground-image: var(--color-background-dark);\\n\\t\\t}\\n\\n\\t\\t&.filepicker, &.default, &.color {\\n\\t\\t\\tborder-color: var(--color-border);\\n\\t\\t}\\n\\n\\t\\t&.color {\\n\\t\\t\\tbackground-color: var(--color-primary-default);\\n\\t\\t\\tcolor: var(--color-primary-text);\\n\\t\\t}\\n\\n\\t\\t&.active,\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\tborder: 2px solid var(--color-primary);\\n\\t\\t}\\n\\n\\t\\t&.active:not(.icon-loading) {\\n\\t\\t\\t&:after {\\n\\t\\t\\t\\tbackground-image: var(--icon-checkmark-white);\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t\\tbackground-position: center;\\n\\t\\t\\t\\tbackground-size: 44px;\\n\\t\\t\\t\\tcontent: '';\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t\\theight: 100%;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&[data-color-bright]:after {\\n\\t\\t\\t\\tbackground-image: var(--icon-checkmark-dark);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".theming__preview[data-v-37ca8ab2]{--ratio: 16;position:relative;display:flex;justify-content:flex-start;max-width:800px}.theming__preview[data-v-37ca8ab2],.theming__preview *[data-v-37ca8ab2]{user-select:none}.theming__preview-image[data-v-37ca8ab2]{flex-basis:calc(16px*var(--ratio));flex-shrink:0;height:calc(10px*var(--ratio));margin-right:var(--gap);cursor:pointer;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:top left;background-size:cover}.theming__preview-description[data-v-37ca8ab2]{display:flex;flex-direction:column}.theming__preview-description label[data-v-37ca8ab2]{padding:12px 0}.theming__preview--default[data-v-37ca8ab2]{grid-column:span 2}.theming__preview-warning[data-v-37ca8ab2]{color:var(--color-warning)}@media(max-width: 682.6666666667px){.theming__preview[data-v-37ca8ab2]{flex-direction:column}.theming__preview-image[data-v-37ca8ab2]{margin:0}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/theming/src/components/ItemPreview.vue\"],\"names\":[],\"mappings\":\"AAiGA,mCAEC,WAAA,CAEA,iBAAA,CACA,YAAA,CACA,0BAAA,CACA,eAAA,CAEA,wEAEC,gBAAA,CAGD,yCACC,kCAAA,CACA,aAAA,CACA,8BAAA,CACA,uBAAA,CACA,cAAA,CACA,kCAAA,CACA,2BAAA,CACA,4BAAA,CACA,qBAAA,CAGD,+CACC,YAAA,CACA,qBAAA,CAEA,qDACC,cAAA,CAIF,4CACC,kBAAA,CAGD,2CACC,0BAAA,CAIF,oCACC,mCACC,qBAAA,CAEA,yCACC,QAAA,CAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.theming__preview {\\n\\t// We make previews on 16/10 screens\\n\\t--ratio: 16;\\n\\n\\tposition: relative;\\n\\tdisplay: flex;\\n\\tjustify-content: flex-start;\\n\\tmax-width: 800px;\\n\\n\\t&,\\n\\t* {\\n\\t\\tuser-select: none;\\n\\t}\\n\\n\\t&-image {\\n\\t\\tflex-basis: calc(16px * var(--ratio));\\n\\t\\tflex-shrink: 0;\\n\\t\\theight: calc(10px * var(--ratio));\\n\\t\\tmargin-right: var(--gap);\\n\\t\\tcursor: pointer;\\n\\t\\tborder-radius: var(--border-radius);\\n\\t\\tbackground-repeat: no-repeat;\\n\\t\\tbackground-position: top left;\\n\\t\\tbackground-size: cover;\\n\\t}\\n\\n\\t&-description {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\n\\t\\tlabel {\\n\\t\\t\\tpadding: 12px 0;\\n\\t\\t}\\n\\t}\\n\\n\\t&--default {\\n\\t\\tgrid-column: span 2;\\n\\t}\\n\\n\\t&-warning {\\n\\t\\tcolor: var(--color-warning);\\n\\t}\\n}\\n\\n@media (max-width: (1024px / 1.5)) {\\n\\t.theming__preview {\\n\\t\\tflex-direction: column;\\n\\n\\t\\t&-image {\\n\\t\\t\\tmargin: 0;\\n\\t\\t}\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 6755;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t6755: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(35400); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","prefixWithBaseUrl","url","generateFilePath","getBackgroundUrl","background","time","themingDefaultBackground","enabledThemes","window","OCA","Theming","isDarkTheme","length","matchMedia","matches","join","indexOf","generateUrl","cacheBuster","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_h","$createElement","_c","_self","staticClass","class","active","attrs","on","pickFile","_v","_s","t","loading","setDefault","debouncePickColor","model","value","callback","$$v","$set","expression","color","style","backgroundColor","invertTextColor","defaultColor","_l","shippedBackground","directives","name","rawName","details","key","preview","theming","$event","setShipped","theme","id","backgroundImage","img","onToggle","title","description","_e","checked","enforced","switchType","enableLabel","console","debug","availableThemes","domProps","descriptionDetail","enforceTheme","selectedTheme","themes","changeTheme","enabled","fonts","changeFont","shortcutsDisabled","changeShortcutsDisabled","updateBackground","Vue","OC","App","$mount","$on","document","head","querySelectorAll","forEach","URL","href","searchParams","set","Date","now","newTheme","cloneNode","toString","onload","remove","append","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","Object","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","baseURI","self","location","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file |