1 line
No EOL
13 KiB
JavaScript
1 line
No EOL
13 KiB
JavaScript
import connectionManager from"./emby-apiclient/connectionmanager.js";import{appHost}from"./common/servicelocator.js";import userSettings from"./common/usersettings/usersettings.js";import browser from"./browser.js";import events from"./emby-apiclient/events.js";import appSettings from"./common/appsettings.js";let SupportsCSSAccentColor=!1,SupportsNativeAccentColor=SupportsCSSAccentColor||appHost.supports("systemaccentcolor"),themeStyleElement,currentThemeId,currentThemeInfo,currentThemeController;function tryRemove(elem){try{elem.remove()}catch(err){console.log("Error removing child node: "+err)}}let supportsCssVariables=CSS.supports("color","var(--fake-var)");function unloadTheme(){var nextSibling,elem=themeStyleElement;elem&&(supportsCssVariables||(nextSibling=elem.nextSibling)&&nextSibling.getAttribute("data-cssvars-job")&&tryRemove(nextSibling),tryRemove(elem),themeStyleElement=null,currentThemeId=null,currentThemeInfo=null,currentThemeController?.destroy(),currentThemeController=null)}supportsCssVariables||document.documentElement.classList.add("nocssvars");let defaultSettingsThemeIsMainTheme=!supportsCssVariables||appHost.supports("multiserver");function getThemes(){let defaultTheme="dark";supportsCssVariables&&browser.electron?defaultTheme="blueradiance":appHost.getPreferredTheme&&"windows"===appHost.getPreferredTheme()&&(defaultTheme="windows");var themes=[],defaultController="./modules/themes/themecontroller.js";return supportsCssVariables&&themes.push({name:"Apple TV",id:"appletv",controller:defaultController}),themes.push({name:"Black",id:"black",isDefault:"black"===defaultTheme,controller:defaultController}),themes.push({name:"Blue Radiance",id:"blueradiance",isDefault:"blueradiance"===defaultTheme,baseThemeId:"darkgradient",controller:defaultController}),supportsCssVariables,themes.push({name:"Dark",id:"dark",isDefault:"dark"===defaultTheme,controller:defaultController}),supportsCssVariables&&(themes.push({name:"Light",id:"light",isSettingsDefault:!defaultSettingsThemeIsMainTheme,controller:defaultController}),appHost.supports("windowstheme")&&themes.push({name:"Windows",id:"windows",isDefault:"windows"===defaultTheme,skipForSettingsthemes:!0,controller:Emby.Page.baseUrl()+"/modules/themes/windows/windowsthemecontroller.js"}),themes.push({name:"Superman",id:"superman",baseThemeId:"darkgradient",controller:defaultController})),supportsCssVariables&&themes.push({name:"Windows Media Center",id:"wmc",baseThemeId:"darkgradient",controller:defaultController}),themes}let skinManager={loadSkin:loadSkin,getThemes:getThemes,getCurrentThemeId:function(){return currentThemeId},getCurrentThemeInfo:function(){return currentThemeInfo},getCurrentThemeController:function(){return currentThemeController}};function loadSkin(){return skinManager.setTheme(userSettings.theme())}function onRegistrationSuccess(){appSettings.set("appthemesregistered","true")}function onRegistrationFailure(){appSettings.set("appthemesregistered","false")}function isRegistered(){return Emby.importModule("./modules/registrationservices/registrationservices.js").then(function(registrationServices){registrationServices.validateFeature("themes",{showDialog:!1}).then(onRegistrationSuccess,onRegistrationFailure)}),"false"!==appSettings.get("appthemesregistered")}function getThemeStylesheetInfo(id,isSettings,requiresRegistration){id||isSettings||(apiClient=connectionManager.currentApiClient())&&apiClient.getCurrentUserId()||(id=appSettings.get("lastTheme"));var themes=skinManager.getThemes();let defaultMainTheme,defaultSettingsTheme,selectedTheme;for(let i=0,length=themes.length;i<length;i++){var theme=themes[i];theme.isDefault?defaultMainTheme=theme:theme.isSettingsDefault&&(defaultSettingsTheme=theme),id===theme.id&&(selectedTheme=theme)}defaultSettingsThemeIsMainTheme&&(defaultSettingsTheme=defaultMainTheme);var apiClient=isSettings&&"maintheme"!==id?defaultSettingsTheme:defaultMainTheme;return(selectedTheme=selectedTheme||apiClient).id!==apiClient.id&&requiresRegistration&&!isRegistered()&&(selectedTheme=apiClient),{themeInfoPath:"text!"+Emby.Page.baseUrl()+"/modules/themes/"+(selectedTheme.baseThemeId||selectedTheme.id)+"/theme.json",stylesheetPath:Emby.Page.baseUrl()+"/modules/themes/"+(selectedTheme.baseThemeId||selectedTheme.id)+"/theme.css",themeId:selectedTheme.id,controller:selectedTheme.controller}}function getAllAccentColors(){var accent,list=[];return list.push({dark:{primaryColorHue:"209",primaryColorSaturation:"100%",primaryColorLightness:"50.2%",text:"hsl(var(--theme-primary-color-hue), var(--theme-primary-color-saturation), var(--theme-primary-color-lightness))"},light:{primaryColorHue:"211",primaryColorSaturation:"100%",primaryColorLightness:"50%",text:"hsl(var(--theme-primary-color-hue), var(--theme-primary-color-saturation), var(--theme-primary-color-lightness))"},name:"blue"}),list.push({dark:{primaryColorHue:"320",primaryColorSaturation:"100%",primaryColorLightness:"47.45%",text:"hotpink"},light:{primaryColorHue:"320",primaryColorSaturation:"100%",primaryColorLightness:"47.45%",text:"hsl(var(--theme-primary-color-hue), var(--theme-primary-color-saturation), var(--theme-primary-color-lightness))"},name:"pink"}),list.push({dark:{primaryColorHue:"262",primaryColorSaturation:"51.87%",primaryColorLightness:"47.25%",text:"mediumpurple"},light:{primaryColorHue:"262",primaryColorSaturation:"51.87%",primaryColorLightness:"47.25%",text:"hsl(var(--theme-primary-color-hue), var(--theme-primary-color-saturation), var(--theme-primary-color-lightness))"},name:"purple"}),list.push({dark:{primaryColorHue:"0",primaryColorSaturation:"60%",primaryColorLightness:"50%",text:"red"},light:{primaryColorHue:"0",primaryColorSaturation:"60%",primaryColorLightness:"50%",text:"hsl(var(--theme-primary-color-hue), var(--theme-primary-color-saturation), var(--theme-primary-color-lightness))"},name:"red"}),list.push({dark:{primaryColorHue:"16",primaryColorSaturation:"100%",primaryColorLightness:"50%",text:"orangered"},light:{primaryColorHue:"16",primaryColorSaturation:"100%",primaryColorLightness:"50%",text:"orangered"},name:"orangered"}),list.push({dark:{primaryColorHue:"116",primaryColorSaturation:"41.7%",primaryColorLightness:"50.2%",text:"#6CCF65",textAlt:"hsl(209, 100%, 50.2%)"},light:{primaryColorHue:"116",primaryColorSaturation:"41.7%",primaryColorLightness:"50.2%",text:"green",textAlt:"hsl(211, 100%, 50%)"},name:"emby"}),list.push({dark:{primaryColorHue:"116",primaryColorSaturation:"41.7%",primaryColorLightness:"50.2%",text:"#6CCF65"},light:{primaryColorHue:"116",primaryColorSaturation:"41.7%",primaryColorLightness:"50.2%",text:"green"},name:"green"}),SupportsNativeAccentColor&&(accent=getSystemAccent()?.accentColor)&&list.push({dark:{primaryColorHue:accent.hue,primaryColorSaturation:accent.saturation+"%",primaryColorLightness:accent.lightness+"%",text:"hsl("+accent.hue+", "+accent.saturation+"%, "+accent.lightness+"%)"},light:{primaryColorHue:accent.hue,primaryColorSaturation:accent.saturation+"%",primaryColorLightness:accent.lightness+"%",text:"hsl("+accent.hue+", "+accent.saturation+"%, "+accent.lightness+"%)"},name:"system"}),list}let RGBToHSL=(r,g,b)=>{r/=255,g/=255,b/=255;var l=Math.max(r,g,b),s=l-Math.min(r,g,b),b=s?l===r?(g-b)/s:l===g?2+(b-r)/s:4+(r-g)/s:0;return[60*b<0?60*b+360:60*b,100*(s?l<=.5?s/(2*l-s):s/(2-(2*l-s)):0),100*(2*l-s)/2]};function getHslFromCSSProp(prop){var div=document.createElement("div");div.style.color=prop,document.body.appendChild(div);let color=getComputedStyle(div).getPropertyValue("color");div.remove();let hue,saturation,lightness;return color.startsWith("rgb(")&&(prop=(color=color.replace("rgb(","").replace(")")).split(","),div=RGBToHSL(parseInt(prop[0]),parseInt(prop[1]),parseInt(prop[2])),hue=div[0],saturation=div[1],lightness=div[2]),{hue:hue,saturation:saturation,lightness:lightness}}function getSystemAccentFromCSS(){var accentColor=getHslFromCSSProp("AccentColor");return{accentColor:accentColor,accentColorText:accentColor}}function getSystemAccent(){return SupportsCSSAccentColor?getSystemAccentFromCSS():appHost.supports("systemaccentcolor")?appHost.getSystemAccentColor():null}function createAccentNode(){var link=document.createElement("style"),list=(link.type="text/css",getAllAccentColors());let html="";for(let i=0,length=list.length;i<length;i++){var accent=list[i];html=(html=(html=(html=(html=(html=(html=(html+=" .accent-"+accent.name+":root {")+("--theme-primary-color-hue: "+accent.light.primaryColorHue+";"))+("--theme-primary-color-saturation: "+accent.light.primaryColorSaturation+";"))+("--theme-primary-color-lightness: "+accent.light.primaryColorLightness+";"))+("--theme-accent-text-color-darkbg: "+accent.dark.text+";"))+("--theme-accent-text-color-lightbg: "+accent.light.text+";"))+("--theme-accent-text-color-darkbg-alt: "+(accent.dark.textAlt||accent.dark.text)+";"))+("--theme-accent-text-color-lightbg-alt: "+(accent.light.textAlt||accent.light.text)+";")+"}"}return link.innerHTML=html,link}function setThemeOptionClassname(value,prefix){var elem=document.documentElement,classesToRemove=[];for(let i=0,length=elem.classList.length;i<length;i++){var className=elem.classList[i];className.startsWith(prefix)&&classesToRemove.push(className)}for(let i=0,length=classesToRemove.length;i<length;i++)elem.classList.remove(classesToRemove[i]);elem.classList.add(prefix+value)}let accentNode;function loadAccentColor(){accentNode||(accentNode=createAccentNode(),(document.head||document.querySelector("head")).appendChild(accentNode));let accent=userSettings.accentColor()||"emby";if("emby"===(accent=userSettings.useSystemAccentColor()&&SupportsNativeAccentColor?"system":accent)||isRegistered()){var elem=document.documentElement,classesToRemove=[];for(let i=0,length=elem.classList.length;i<length;i++){var className=elem.classList[i];className.startsWith("accent-")&&classesToRemove.push(className)}for(let i=0,length=classesToRemove.length;i<length;i++)elem.classList.remove(classesToRemove[i]);setThemeOptionClassname(accent,"accent-")}}function onThemeLoaded(themeLoadInfo,updateLastTheme){return updateLastTheme&&appSettings.set("lastTheme",themeLoadInfo.themeId),Emby.importModule(themeLoadInfo.controller).then(function(ThemeController){return currentThemeController=new ThemeController,require([themeLoadInfo.themeInfoPath]).then(function(responses){(currentThemeInfo=JSON.parse(responses[0])).id=themeLoadInfo.themeId;try{appHost.setTheme(currentThemeInfo)}catch(err){console.log("Error setting theme color: "+err)}return loadAccentColor(),currentThemeController.load(currentThemeInfo).then(function(){events.trigger(skinManager,"themeloaded",[{themeInfo:currentThemeInfo}])})})})}function polyfillCssVars(link,themeLoadInfo,updateLastTheme){return Emby.importModule("./modules/css-vars-ponyfill/css-vars-ponyfill.js").then(function(cssVars){return cssVars({watch:!1,include:[link],onlyLegacy:!1,preserveVars:!1,shadowDOM:!1}),onThemeLoaded(themeLoadInfo,updateLastTheme)})}skinManager.setTheme=function(id,context){let requiresRegistration=!0;context="settings"===context;let updateLastTheme=!context;if("auto"===id&&appHost.getPreferredTheme&&(id=appHost.getPreferredTheme()||"dark",requiresRegistration=!1),currentThemeId&¤tThemeId===id)return Promise.resolve();let themeLoadInfo=getThemeStylesheetInfo(id,context,requiresRegistration);return currentThemeId&¤tThemeId===themeLoadInfo.themeId?(loadAccentColor(),Promise.resolve()):new Promise(function(resolve,reject){let linkUrl=themeLoadInfo.stylesheetPath,link=(globalThis.urlCacheParam&&(linkUrl+="?"+globalThis.urlCacheParam),unloadTheme(),document.createElement("link"));link.setAttribute("rel","stylesheet"),link.setAttribute("type","text/css"),link.onload=function(){(supportsCssVariables?onThemeLoaded(themeLoadInfo,updateLastTheme):polyfillCssVars(link,themeLoadInfo,updateLastTheme)).then(resolve)},link.setAttribute("href",linkUrl),document.head.appendChild(link),themeStyleElement=link,setThemeOptionClassname(currentThemeId=themeLoadInfo.themeId,"theme-")})};let defaultLogoImageTypes=["Logo"];function changeTheme(viewType){let context;var mainTheme=userSettings.theme();if(1===viewType){context="settings";let settingsTheme=userSettings.settingsTheme();"maintheme"===(settingsTheme=!settingsTheme&&defaultSettingsThemeIsMainTheme?"maintheme":settingsTheme)&&mainTheme&&(settingsTheme=mainTheme),void skinManager.setTheme(settingsTheme,context)}else skinManager.setTheme(mainTheme,context)}skinManager.getPreferredLogoImageTypes=function(){var info=currentThemeInfo;return info&&info.preferredLogoImageTypes||defaultLogoImageTypes};let currentThemeType;function onThemeSettingChange(e,name){"appTheme"===name||"settingsTheme"===name?changeTheme(currentThemeType):"accentColor"===name&&loadAccentColor()}document.addEventListener("viewbeforeshow",function(e){"true"!==e.detail.params?.asDialog&&(e=e.detail.settingsTheme?1:0)!==currentThemeType&&changeTheme(currentThemeType=e)}),events.on(userSettings,"change",onThemeSettingChange),events.on(connectionManager,"localusersignedin",function(e){currentThemeType=null});export default skinManager; |