From b65b1b4d092502a9e3801eb8d717ddd1f0f39d7a Mon Sep 17 00:00:00 2001 From: flarum-bot Date: Sat, 19 Oct 2024 10:06:15 +0000 Subject: [PATCH] Bundled output for commit 01faed5fadef684685f9ee30210060001ad1d5ae Includes transpiled JS/TS, and Typescript declaration files (typings). [skip ci] --- js/dist/admin.js | 2 +- js/dist/admin.js.map | 2 +- js/dist/forum.js | 2 +- js/dist/forum.js.map | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/dist/admin.js b/js/dist/admin.js index f9af654..8382bd4 100755 --- a/js/dist/admin.js +++ b/js/dist/admin.js @@ -1,2 +1,2 @@ -(()=>{var e={n:t=>{var n=t&&t.__esModule?()=>t.default:()=>t;return e.d(n,{a:n}),n},d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};(()=>{"use strict";e.r(t),e.d(t,{Themes:()=>a,components:()=>F,setSelectedTheme:()=>n});var n={};e.r(n),e.d(n,{default:()=>_,getUrls:()=>w,setStyle:()=>N,setTheme:()=>T,setThemeFromID:()=>A});const o=flarum.core.compat["common/app"];var r=e.n(o);const a={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){return r().forum.attribute("fof-nightmode.default_theme")||0}},i=flarum.core.compat["common/extend"],s=flarum.core.compat["common/components/Page"];var c=e.n(s);function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,o=Array(t);n=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e?e.split("; "):[]);!(t=o()).done;){var r=t.value.split("="),a=r.slice(1).join("=");'"'===a[0]&&(a=a.slice(1,-1));try{n[decodeURIComponent(r[0])]=a.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)}catch(e){}}return n}(document.cookie)}function h(e,t,n){document.cookie=function(e,t,n){return encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/\(/g,"%28").replace(/\)/g,"%29")+"="+encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)+function(e){if("number"==typeof e.expires){var t=Math.min(Date.now()+864e5*e.expires,864e13);e.expires=new Date(t)}return u("Expires",e.expires?e.expires.toUTCString():"")+u("Domain",e.domain)+u("Path",e.path)+u("Secure",e.secure)+u("Partitioned",e.partitioned)+u("SameSite",e.sameSite)}(n)}(e,t,l({path:"/"},n))}var g="flarum_nightmode",p=function(){var e,t=(e=g,f()[e]);return t||"0"===t?Number(t):a.DEFAULT()},v=function(e){return h(g,e,{sameSite:"lax",secure:"https:"===location.protocol||void 0})};function y(){var e=Array.from(new Set(Object.values(a))),t=p();isNaN(t)?b("Theme is not a valid integer! Resetting..."):e.includes(t)||b("Theme is out of bounds! Resetting...")}function b(e){console.warn(e),v(a.DEFAULT())}function S(){var e,t=r().session.user,n=!t||!!t.preferences().fofNightMode_perDevice,o=t&&t.preferences().fofNightMode;return n?e=p():"number"==typeof o&&-1!==o&&(e=o),"number"==typeof e?e:a.DEFAULT()}function _(){(0,i.extend)(c().prototype,"oninit",T),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",T)}function T(){var e,t=r().session.user,n=null==(e=r().session.user)?void 0:e.preferences().fofNightMode_perDevice;t&&!n||y(),n&&y(),A(S())}function w(){return{day:r().data["fof-nightmode.assets.day"],night:r().data["fof-nightmode.assets.night"]}}function A(e){e===a.DARK?N("night"):e===a.LIGHT?N("day"):N(window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}function N(e){var t=document.querySelector("link.nightmode-light[rel=stylesheet]"),n=document.querySelector("link.nightmode-dark[rel=stylesheet]");e:if(t&&n){if(S()===a.AUTO)break e;var o=document.createElement("link");"onload"in o?o.onload=function(){t.remove(),n.remove()}:(t.remove(),n.remove()),o.rel="stylesheet",o.className="nightmode",o.href=w()[e],document.head.append(o)}else{var r=t||n||document.querySelector("link.nightmode[rel=stylesheet]"),i=w()[e];i!==r.href&&(r.href=i,r.className="nightmode")}var s=document.querySelector('meta[name="color-scheme"]');s&&(s.content="night"===e?"dark":"light");var m=new CustomEvent("fofnightmodechange",{detail:e});document.dispatchEvent(m)}const O=flarum.core.compat["admin/app"];var I=e.n(O);function x(e,t){return x=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},x(e,t)}const D=flarum.core.compat["admin/components/ExtensionPage"];var P=e.n(D);const U=flarum.core.compat["common/utils/ItemList"];var C=e.n(U);const E=flarum.core.compat["common/utils/extractText"];var j=e.n(E),k=function(e){function t(){return e.apply(this,arguments)||this}var n,o;o=e,(n=t).prototype=Object.create(o.prototype),n.prototype.constructor=n,x(n,o);var r=t.prototype;return r.content=function(){return m("div",{className:"NightmodeSettingsPage"},m("div",{className:"container"},m("div",{className:"NightmodeSettingsTabPage NightmodeSettingsPage--settings"},m("div",{className:"Form"},this.settingsItems().toArray(),m("div",{className:"Form-group"},this.submitButton())))))},r.settingsItems=function(){var e=new(C());return e.add("general",m("div",{className:"Section"},m("h3",null,I().translator.trans("fof-nightmode.admin.settings.general.heading")),m("p",{className:"helpText"},I().translator.trans("fof-nightmode.admin.settings.general.help")),this.generalItems().toArray())),e},r.generalItems=function(){var e=new(C());return e.add("header-toggle",this.buildSettingComponent({label:I().translator.trans("fof-nightmode.admin.settings.modal.always_show_theme_toggle_on_header"),setting:"fofNightMode.show_theme_toggle_on_header_always",type:"switch"})),e.add("default-theme",this.buildSettingComponent({label:I().translator.trans("fof-nightmode.admin.settings.modal.default_theme"),help:I().translator.trans("fof-nightmode.admin.settings.modal.default_theme_helper"),setting:"fof-nightmode.default_theme",type:"select",options:this.populateThemes()})),e},r.populateThemes=function(){var e={};return Object.keys(a).forEach((function(t,n){"DEFAULT"!==t&&(e[n]=j()(I().translator.trans("fof-nightmode.admin.settings.modal.theme_"+t.toLowerCase())))})),e},t}(P()),F={NightmodeSettingsPage:k};I().initializers.add("fof-nightmode",(function(){I().extensionData.for("fof-nightmode").registerPage(k),_()}))})(),module.exports=t})(); +(()=>{var e={n:t=>{var n=t&&t.__esModule?()=>t.default:()=>t;return e.d(n,{a:n}),n},d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};(()=>{"use strict";e.r(t),e.d(t,{Themes:()=>a,components:()=>M,setSelectedTheme:()=>n});var n={};e.r(n),e.d(n,{default:()=>S,getUrls:()=>T,setStyle:()=>A,setTheme:()=>w,setThemeFromID:()=>N});const o=flarum.core.compat["common/app"];var r=e.n(o);const a={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){return r().forum.attribute("fof-nightmode.default_theme")||0}},i=flarum.core.compat["common/extend"],s=flarum.core.compat["common/components/Page"];var c=e.n(s);function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,o=Array(t);n=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e?e.split("; "):[]);!(t=o()).done;){var r=t.value.split("="),a=r.slice(1).join("=");'"'===a[0]&&(a=a.slice(1,-1));try{n[decodeURIComponent(r[0])]=a.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)}catch(e){}}return n}(document.cookie)}function h(e,t,n){document.cookie=function(e,t,n){return encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/\(/g,"%28").replace(/\)/g,"%29")+"="+encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)+function(e){if("number"==typeof e.expires){var t=Math.min(Date.now()+864e5*e.expires,864e13);e.expires=new Date(t)}return u("Expires",e.expires?e.expires.toUTCString():"")+u("Domain",e.domain)+u("Path",e.path)+u("Secure",e.secure)+u("Partitioned",e.partitioned)+u("SameSite",e.sameSite)}(n)}(e,t,l({path:"/"},n))}var g="flarum_nightmode",p=function(){var e,t=(e=g,f()[e]);return t||"0"===t?Number(t):a.DEFAULT()},v=function(e){return h(g,e,{sameSite:"lax",secure:"https:"===location.protocol||void 0})};function y(){var e=Array.from(new Set(Object.values(a))),t=p();isNaN(t)?b("Theme is not a valid integer! Resetting..."):e.includes(t)||b("Theme is out of bounds! Resetting...")}function b(e){console.warn(e),v(a.DEFAULT())}function _(){var e,t=r().session.user,n=!t||!!t.preferences().fofNightMode_perDevice,o=t&&t.preferences().fofNightMode;return n?e=p():"number"==typeof o&&-1!==o&&(e=o),"number"==typeof e?e:a.DEFAULT()}function S(){(0,i.extend)(c().prototype,"oninit",w),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",w)}function w(){var e,t=r().session.user,n=null==(e=r().session.user)?void 0:e.preferences().fofNightMode_perDevice;t&&!n||y(),n&&y(),N(_())}function T(){return{day:r().data["fof-nightmode.assets.day"],night:r().data["fof-nightmode.assets.night"]}}function N(e){e===a.DARK?A("night"):e===a.LIGHT?A("day"):A(window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}function A(e){var t=document.querySelector("link.nightmode-light[rel=stylesheet]"),n=document.querySelector("link.nightmode-dark[rel=stylesheet]");e:if(t&&n){if(_()===a.AUTO)break e;var o=document.createElement("link");"onload"in o?o.onload=function(){t.remove(),n.remove()}:(t.remove(),n.remove()),o.rel="stylesheet",o.className="nightmode",o.href=T()[e],document.head.append(o)}else{var r=t||n||document.querySelector("link.nightmode[rel=stylesheet]"),i=T()[e];i!==r.href&&(r.href=i,r.className="nightmode")}var s=document.querySelector('meta[name="color-scheme"]');s&&(s.content="night"===e?"dark":"light");var m=new CustomEvent("fofnightmodechange",{detail:e});document.dispatchEvent(m)}const O=flarum.core.compat["admin/app"];var I=e.n(O);function x(e,t){return x=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},x(e,t)}const C=flarum.core.compat["admin/components/ExtensionPage"];var D=e.n(C);const P=flarum.core.compat["common/utils/ItemList"];var U=e.n(P);const E=flarum.core.compat["common/utils/extractText"];var j=e.n(E),k=function(e){function t(){return e.apply(this,arguments)||this}var n,o;o=e,(n=t).prototype=Object.create(o.prototype),n.prototype.constructor=n,x(n,o);var r=t.prototype;return r.content=function(){return m("div",{className:"NightmodeSettingsPage"},m("div",{className:"container"},m("div",{className:"NightmodeSettingsTabPage NightmodeSettingsPage--settings"},m("div",{className:"Form"},this.settingsItems().toArray(),m("div",{className:"Form-group"},this.submitButton())))))},r.settingsItems=function(){var e=new(U());return e.add("general",m("div",{className:"Section"},m("h3",null,I().translator.trans("fof-nightmode.admin.settings.general.heading")),m("p",{className:"helpText"},I().translator.trans("fof-nightmode.admin.settings.general.help")),this.generalItems().toArray())),e},r.generalItems=function(){var e=new(U());return e.add("header-toggle",this.buildSettingComponent({label:I().translator.trans("fof-nightmode.admin.settings.modal.always_show_theme_toggle_on_header"),setting:"fofNightMode.show_theme_toggle_on_header_always",type:"switch"})),e.add("icon-style",this.buildSettingComponent({label:I().translator.trans("fof-nightmode.admin.settings.modal.show_theme_toggle_in_solid"),setting:"fofNightMode.show_theme_toggle_in_solid",type:"switch"})),e.add("default-theme",this.buildSettingComponent({label:I().translator.trans("fof-nightmode.admin.settings.modal.default_theme"),help:I().translator.trans("fof-nightmode.admin.settings.modal.default_theme_helper"),setting:"fof-nightmode.default_theme",type:"select",options:this.populateThemes()})),e},r.populateThemes=function(){var e={};return Object.keys(a).forEach((function(t,n){"DEFAULT"!==t&&(e[n]=j()(I().translator.trans("fof-nightmode.admin.settings.modal.theme_"+t.toLowerCase())))})),e},t}(D()),M={NightmodeSettingsPage:k};I().initializers.add("fof-nightmode",(function(){I().extensionData.for("fof-nightmode").registerPage(k),S()}))})(),module.exports=t})(); //# sourceMappingURL=admin.js.map \ No newline at end of file diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map index 87300a6..9d70e20 100755 --- a/js/dist/admin.js.map +++ b/js/dist/admin.js.map @@ -1 +1 @@ -{"version":3,"file":"admin.js","mappings":"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","sources":["webpack://@fof/nightmode/webpack/bootstrap","webpack://@fof/nightmode/webpack/runtime/compat get default export","webpack://@fof/nightmode/webpack/runtime/define property getters","webpack://@fof/nightmode/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/nightmode/webpack/runtime/make namespace object","webpack://@fof/nightmode/external root \"flarum.core.compat['common/app']\"","webpack://@fof/nightmode/./src/common/Themes.ts","webpack://@fof/nightmode/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@fof/nightmode/./node_modules/es-cookie/src/es-cookie.js","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.ts","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.ts","webpack://@fof/nightmode/./src/forum/getTheme.ts","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/nightmode/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/nightmode/external root \"flarum.core.compat['admin/components/ExtensionPage']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/utils/ItemList']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@fof/nightmode/./src/admin/components/NightmodeSettingsPage.tsx","webpack://@fof/nightmode/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/nightmode/./src/admin/components/index.ts","webpack://@fof/nightmode/./src/admin/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (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};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","import app from 'flarum/common/app';\n\n/*\n\n JS enum equivalent. Makes sure no value mix-ups are made!\n\n DEFAULT is used when an invalid value has been set, as well as for guest and new users.\n\n*/\n\nconst Themes = {\n AUTO: 0,\n LIGHT: 1,\n DARK: 2,\n\n // adds an \"ultra default\" of 0 if the admins don't set a default tsk tsk tsk\n DEFAULT: () => app.forum.attribute('fof-nightmode.default_theme') || 0,\n};\n\nexport default Themes;\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Page'];","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function stringifyAttribute(name, value) {\n if (!value) {\n return '';\n }\n let stringified = '; ' + name;\n if (value === true) {\n return stringified; // boolean attributes shouldn't have a value\n }\n return stringified + '=' + value;\n}\nfunction stringifyAttributes(attributes) {\n if (typeof attributes.expires === 'number') {\n const milliseconds = Math.min(Date.now() + attributes.expires * 864e+5, 864e+13);\n attributes.expires = new Date(milliseconds);\n }\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\n + stringifyAttribute('Domain', attributes.domain)\n + stringifyAttribute('Path', attributes.path)\n + stringifyAttribute('Secure', attributes.secure)\n + stringifyAttribute('Partitioned', attributes.partitioned)\n + stringifyAttribute('SameSite', attributes.sameSite);\n}\nexport function encode(name, value, attributes) {\n return encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) // allowed special characters\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\n + '=' + encodeURIComponent(value)\n // allowed special characters\n .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent)\n + stringifyAttributes(attributes);\n}\nexport function parse(cookieString) {\n let result = {};\n const cookies = cookieString ? cookieString.split('; ') : [];\n for (let cookie of cookies) {\n const parts = cookie.split('=');\n let value = parts.slice(1).join('=');\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n try {\n const name = decodeURIComponent(parts[0]);\n result[name] = value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent);\n }\n catch (e) {\n // ignore cookies with invalid name/value encoding\n }\n }\n return result;\n}\nexport function getAll() {\n return parse(document.cookie);\n}\nexport function get(name) {\n return getAll()[name];\n}\nexport function set(name, value, attributes) {\n document.cookie = encode(name, value, { path: '/', ...attributes });\n}\nexport function remove(name, attributes) {\n set(name, '', { ...attributes, expires: -1 });\n}\n","import * as Cookies from 'es-cookie';\nimport Themes from '../../common/Themes';\n\nexport const KEY = 'flarum_nightmode';\n\nexport const get = () => {\n const value = Cookies.get(KEY);\n\n if (!value && value !== '0') {\n return Themes.DEFAULT();\n }\n\n return Number(value);\n};\n\nexport const set = (val) =>\n Cookies.set(KEY, val, {\n sameSite: 'lax',\n secure: location.protocol === 'https:' ? true : undefined,\n });\n\nexport const remove = () => Cookies.remove(KEY);\n","/*\n This function is designed to catch invalid theme values\n and handle them before they can break Flarum for users.\n\n E.g. if a user manually edited their cookies to\n set their theme to an invalid value, this theme would\n detect that, and reset it to 0 (auto).\n*/\n\nimport Themes from '../common/Themes';\nimport { get, set } from './helpers/perDeviceSetting';\n\nexport default function fixInvalidThemeSetting() {\n // get array of valid values without duplicate entries\n let validValues = Array.from(new Set(Object.values(Themes)));\n\n const Theme = get();\n\n if (isNaN(Theme)) {\n resetTheme('Theme is not a valid integer! Resetting...');\n } else if (!validValues.includes(Theme)) {\n // theme out of bounds\n resetTheme(`Theme is out of bounds! Resetting...`);\n }\n}\n\nfunction resetTheme(reason) {\n console.warn(reason);\n\n set(Themes.DEFAULT());\n}\n","import app from 'flarum/common/app';\nimport Themes from '../common/Themes';\nimport { get } from './helpers/perDeviceSetting';\n\nexport default function getTheme() {\n const user = app.session.user;\n\n const IsUsingPerDeviceSettings = !user || !!user.preferences().fofNightMode_perDevice;\n const SelectedTheme = user && user.preferences().fofNightMode;\n\n let value;\n\n if (IsUsingPerDeviceSettings) {\n // fetch through LS is per device enabled\n value = get();\n } else {\n if (typeof SelectedTheme === 'number' && SelectedTheme !== -1) {\n // use user prefs\n value = SelectedTheme;\n }\n }\n\n return typeof value === 'number' ? value : Themes.DEFAULT();\n}\n","import app from 'flarum/common/app';\n\nimport { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\n\nimport Themes from './Themes';\nimport fixInvalidThemeSetting from '../forum/fixInvalidThemeSetting';\nimport getTheme from '../forum/getTheme';\n\nexport default function setSelectedTheme() {\n extend(Page.prototype, 'oninit', setTheme);\n\n // Register setTheme() as the handler for 'prefers-color-scheme' media property\n // change. This allows to make sure the 'fofnightmodechange' event is dispatched\n // when this property changes, and that the correct stylesheets are loaded.\n const prefersColorSchemeDark = window.matchMedia('(prefers-color-scheme: dark)');\n prefersColorSchemeDark.addEventListener('change', setTheme);\n}\n\nexport function setTheme() {\n const { user } = app.session;\n\n const PerDevice = app.session.user?.preferences().fofNightMode_perDevice;\n\n if (!user || PerDevice) {\n fixInvalidThemeSetting();\n }\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const CurrentTheme = getTheme();\n\n setThemeFromID(CurrentTheme);\n}\n\nexport function getUrls() {\n return {\n day: app.data['fof-nightmode.assets.day'],\n night: app.data['fof-nightmode.assets.night'],\n };\n}\n\nexport function setThemeFromID(theme) {\n if (theme === Themes.DARK) {\n setStyle('night');\n } else if (theme === Themes.LIGHT) {\n setStyle('day');\n } else {\n const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n setStyle(preferDark ? 'night' : 'day');\n }\n}\n\nexport function setStyle(type) {\n const light = document.querySelector('link.nightmode-light[rel=stylesheet]');\n const dark = document.querySelector('link.nightmode-dark[rel=stylesheet]');\n\n bothStyleSheets: if (light && dark) {\n if (getTheme() === Themes.AUTO) break bothStyleSheets;\n\n let newLink = document.createElement('link');\n\n // onload on link tags not supported in all browsers\n // so we should check it is present in the user's\n // current browser\n if ('onload' in newLink) {\n // if it is, only remove the old link tags after the new\n // one has finished loading (prevents flash of unstyled\n // content)\n newLink.onload = function () {\n light.remove();\n dark.remove();\n };\n } else {\n // if it isn't, just remove the old link tags immediately\n light.remove();\n dark.remove();\n }\n\n newLink.rel = 'stylesheet';\n newLink.className = 'nightmode';\n newLink.href = getUrls()[type];\n\n document.head.append(newLink);\n } else {\n const el = light || dark || document.querySelector('link.nightmode[rel=stylesheet]');\n\n const url = getUrls()[type];\n\n if (url !== el.href) {\n el.href = url;\n el.className = 'nightmode';\n }\n }\n\n const colorScheme = document.querySelector('meta[name=\"color-scheme\"]');\n\n if (colorScheme) {\n colorScheme.content = type === 'night' ? 'dark' : 'light';\n }\n\n // Dispatch a 'fofnightmodechange' event with 'day' or 'night' as detail.\n // This allows other extensions to integrate with this one.\n const event = new CustomEvent('fofnightmodechange', { detail: type });\n document.dispatchEvent(event);\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/ExtensionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","import app from 'flarum/admin/app';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Themes from '../../common/Themes';\nimport extractText from 'flarum/common/utils/extractText';\nimport type Mithril from 'mithril';\n\nexport default class NightmodeSettingsPage extends ExtensionPage {\n content() {\n return (\n
\n
\n
\n
\n {this.settingsItems().toArray()}\n
{this.submitButton()}
\n
\n
\n
\n
\n );\n }\n\n settingsItems(): ItemList {\n const items = new ItemList();\n\n items.add(\n 'general',\n
\n

{app.translator.trans('fof-nightmode.admin.settings.general.heading')}

\n

{app.translator.trans('fof-nightmode.admin.settings.general.help')}

\n {this.generalItems().toArray()}\n
\n );\n\n return items;\n }\n\n generalItems(): ItemList {\n const items = new ItemList();\n\n items.add(\n 'header-toggle',\n this.buildSettingComponent({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.always_show_theme_toggle_on_header'),\n setting: 'fofNightMode.show_theme_toggle_on_header_always',\n type: 'switch',\n })\n );\n\n items.add(\n 'default-theme',\n this.buildSettingComponent({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme'),\n help: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme_helper'),\n setting: 'fof-nightmode.default_theme',\n type: 'select',\n options: this.populateThemes(),\n })\n );\n\n return items;\n }\n\n populateThemes(): Record {\n let options: Record = {};\n\n // add themes based on JS enum\n Object.keys(Themes).forEach((theme, i) => {\n if (theme === 'DEFAULT') return;\n\n options[i] = extractText(app.translator.trans(`fof-nightmode.admin.settings.modal.theme_${theme.toLowerCase()}`));\n });\n\n return options;\n }\n}\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };","import NightmodeSettingsPage from './NightmodeSettingsPage';\n\nexport const components = {\n NightmodeSettingsPage,\n};\n","import app from 'flarum/admin/app';\nimport setSelectedTheme from '../common/setSelectedTheme';\nimport NightmodeSettingsPage from './components/NightmodeSettingsPage';\n\nexport * from './components';\n\napp.initializers.add('fof-nightmode', () => {\n app.extensionData.for('fof-nightmode').registerPage(NightmodeSettingsPage);\n\n setSelectedTheme();\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","AUTO","LIGHT","DARK","DEFAULT","app","attribute","_extends","assign","bind","n","e","arguments","length","t","r","apply","stringifyAttribute","name","stringified","getAll","cookieString","_step","result","_iterator","_createForOfIteratorHelperLoose","split","done","parts","slice","join","decodeURIComponent","replace","parse","document","cookie","set","attributes","encodeURIComponent","expires","milliseconds","Math","min","Date","now","toUTCString","domain","path","secure","partitioned","sameSite","stringifyAttributes","encode","KEY","Number","Themes","val","Cookies","location","protocol","undefined","fixInvalidThemeSetting","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","console","warn","getTheme","user","IsUsingPerDeviceSettings","preferences","fofNightMode_perDevice","SelectedTheme","fofNightMode","setSelectedTheme","extend","Page","setTheme","window","matchMedia","addEventListener","_app$session$user","PerDevice","setThemeFromID","getUrls","day","night","theme","setStyle","matches","type","light","querySelector","dark","bothStyleSheets","newLink","createElement","onload","remove","rel","className","href","head","append","el","url","colorScheme","content","event","CustomEvent","detail","dispatchEvent","_setPrototypeOf","setPrototypeOf","__proto__","NightmodeSettingsPage","_ExtensionPage","create","constructor","_proto","m","this","settingsItems","toArray","submitButton","items","ItemList","add","trans","generalItems","buildSettingComponent","label","setting","help","options","populateThemes","keys","forEach","i","extractText","toLowerCase","ExtensionPage","components","registerPage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"admin.js","mappings":"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","sources":["webpack://@fof/nightmode/webpack/bootstrap","webpack://@fof/nightmode/webpack/runtime/compat get default export","webpack://@fof/nightmode/webpack/runtime/define property getters","webpack://@fof/nightmode/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/nightmode/webpack/runtime/make namespace object","webpack://@fof/nightmode/external root \"flarum.core.compat['common/app']\"","webpack://@fof/nightmode/./src/common/Themes.ts","webpack://@fof/nightmode/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@fof/nightmode/./node_modules/es-cookie/src/es-cookie.js","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.ts","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.ts","webpack://@fof/nightmode/./src/forum/getTheme.ts","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/nightmode/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/nightmode/external root \"flarum.core.compat['admin/components/ExtensionPage']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/utils/ItemList']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@fof/nightmode/./src/admin/components/NightmodeSettingsPage.tsx","webpack://@fof/nightmode/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/nightmode/./src/admin/components/index.ts","webpack://@fof/nightmode/./src/admin/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (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};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","import app from 'flarum/common/app';\n\n/*\n\n JS enum equivalent. Makes sure no value mix-ups are made!\n\n DEFAULT is used when an invalid value has been set, as well as for guest and new users.\n\n*/\n\nconst Themes = {\n AUTO: 0,\n LIGHT: 1,\n DARK: 2,\n\n // adds an \"ultra default\" of 0 if the admins don't set a default tsk tsk tsk\n DEFAULT: () => app.forum.attribute('fof-nightmode.default_theme') || 0,\n};\n\nexport default Themes;\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Page'];","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function stringifyAttribute(name, value) {\n if (!value) {\n return '';\n }\n let stringified = '; ' + name;\n if (value === true) {\n return stringified; // boolean attributes shouldn't have a value\n }\n return stringified + '=' + value;\n}\nfunction stringifyAttributes(attributes) {\n if (typeof attributes.expires === 'number') {\n const milliseconds = Math.min(Date.now() + attributes.expires * 864e+5, 864e+13);\n attributes.expires = new Date(milliseconds);\n }\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\n + stringifyAttribute('Domain', attributes.domain)\n + stringifyAttribute('Path', attributes.path)\n + stringifyAttribute('Secure', attributes.secure)\n + stringifyAttribute('Partitioned', attributes.partitioned)\n + stringifyAttribute('SameSite', attributes.sameSite);\n}\nexport function encode(name, value, attributes) {\n return encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) // allowed special characters\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\n + '=' + encodeURIComponent(value)\n // allowed special characters\n .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent)\n + stringifyAttributes(attributes);\n}\nexport function parse(cookieString) {\n let result = {};\n const cookies = cookieString ? cookieString.split('; ') : [];\n for (let cookie of cookies) {\n const parts = cookie.split('=');\n let value = parts.slice(1).join('=');\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n try {\n const name = decodeURIComponent(parts[0]);\n result[name] = value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent);\n }\n catch (e) {\n // ignore cookies with invalid name/value encoding\n }\n }\n return result;\n}\nexport function getAll() {\n return parse(document.cookie);\n}\nexport function get(name) {\n return getAll()[name];\n}\nexport function set(name, value, attributes) {\n document.cookie = encode(name, value, { path: '/', ...attributes });\n}\nexport function remove(name, attributes) {\n set(name, '', { ...attributes, expires: -1 });\n}\n","import * as Cookies from 'es-cookie';\nimport Themes from '../../common/Themes';\n\nexport const KEY = 'flarum_nightmode';\n\nexport const get = () => {\n const value = Cookies.get(KEY);\n\n if (!value && value !== '0') {\n return Themes.DEFAULT();\n }\n\n return Number(value);\n};\n\nexport const set = (val) =>\n Cookies.set(KEY, val, {\n sameSite: 'lax',\n secure: location.protocol === 'https:' ? true : undefined,\n });\n\nexport const remove = () => Cookies.remove(KEY);\n","/*\n This function is designed to catch invalid theme values\n and handle them before they can break Flarum for users.\n\n E.g. if a user manually edited their cookies to\n set their theme to an invalid value, this theme would\n detect that, and reset it to 0 (auto).\n*/\n\nimport Themes from '../common/Themes';\nimport { get, set } from './helpers/perDeviceSetting';\n\nexport default function fixInvalidThemeSetting() {\n // get array of valid values without duplicate entries\n let validValues = Array.from(new Set(Object.values(Themes)));\n\n const Theme = get();\n\n if (isNaN(Theme)) {\n resetTheme('Theme is not a valid integer! Resetting...');\n } else if (!validValues.includes(Theme)) {\n // theme out of bounds\n resetTheme(`Theme is out of bounds! Resetting...`);\n }\n}\n\nfunction resetTheme(reason) {\n console.warn(reason);\n\n set(Themes.DEFAULT());\n}\n","import app from 'flarum/common/app';\nimport Themes from '../common/Themes';\nimport { get } from './helpers/perDeviceSetting';\n\nexport default function getTheme() {\n const user = app.session.user;\n\n const IsUsingPerDeviceSettings = !user || !!user.preferences().fofNightMode_perDevice;\n const SelectedTheme = user && user.preferences().fofNightMode;\n\n let value;\n\n if (IsUsingPerDeviceSettings) {\n // fetch through LS is per device enabled\n value = get();\n } else {\n if (typeof SelectedTheme === 'number' && SelectedTheme !== -1) {\n // use user prefs\n value = SelectedTheme;\n }\n }\n\n return typeof value === 'number' ? value : Themes.DEFAULT();\n}\n","import app from 'flarum/common/app';\n\nimport { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\n\nimport Themes from './Themes';\nimport fixInvalidThemeSetting from '../forum/fixInvalidThemeSetting';\nimport getTheme from '../forum/getTheme';\n\nexport default function setSelectedTheme() {\n extend(Page.prototype, 'oninit', setTheme);\n\n // Register setTheme() as the handler for 'prefers-color-scheme' media property\n // change. This allows to make sure the 'fofnightmodechange' event is dispatched\n // when this property changes, and that the correct stylesheets are loaded.\n const prefersColorSchemeDark = window.matchMedia('(prefers-color-scheme: dark)');\n prefersColorSchemeDark.addEventListener('change', setTheme);\n}\n\nexport function setTheme() {\n const { user } = app.session;\n\n const PerDevice = app.session.user?.preferences().fofNightMode_perDevice;\n\n if (!user || PerDevice) {\n fixInvalidThemeSetting();\n }\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const CurrentTheme = getTheme();\n\n setThemeFromID(CurrentTheme);\n}\n\nexport function getUrls() {\n return {\n day: app.data['fof-nightmode.assets.day'],\n night: app.data['fof-nightmode.assets.night'],\n };\n}\n\nexport function setThemeFromID(theme) {\n if (theme === Themes.DARK) {\n setStyle('night');\n } else if (theme === Themes.LIGHT) {\n setStyle('day');\n } else {\n const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n setStyle(preferDark ? 'night' : 'day');\n }\n}\n\nexport function setStyle(type) {\n const light = document.querySelector('link.nightmode-light[rel=stylesheet]');\n const dark = document.querySelector('link.nightmode-dark[rel=stylesheet]');\n\n bothStyleSheets: if (light && dark) {\n if (getTheme() === Themes.AUTO) break bothStyleSheets;\n\n let newLink = document.createElement('link');\n\n // onload on link tags not supported in all browsers\n // so we should check it is present in the user's\n // current browser\n if ('onload' in newLink) {\n // if it is, only remove the old link tags after the new\n // one has finished loading (prevents flash of unstyled\n // content)\n newLink.onload = function () {\n light.remove();\n dark.remove();\n };\n } else {\n // if it isn't, just remove the old link tags immediately\n light.remove();\n dark.remove();\n }\n\n newLink.rel = 'stylesheet';\n newLink.className = 'nightmode';\n newLink.href = getUrls()[type];\n\n document.head.append(newLink);\n } else {\n const el = light || dark || document.querySelector('link.nightmode[rel=stylesheet]');\n\n const url = getUrls()[type];\n\n if (url !== el.href) {\n el.href = url;\n el.className = 'nightmode';\n }\n }\n\n const colorScheme = document.querySelector('meta[name=\"color-scheme\"]');\n\n if (colorScheme) {\n colorScheme.content = type === 'night' ? 'dark' : 'light';\n }\n\n // Dispatch a 'fofnightmodechange' event with 'day' or 'night' as detail.\n // This allows other extensions to integrate with this one.\n const event = new CustomEvent('fofnightmodechange', { detail: type });\n document.dispatchEvent(event);\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/ExtensionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","import app from 'flarum/admin/app';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Themes from '../../common/Themes';\nimport extractText from 'flarum/common/utils/extractText';\nimport type Mithril from 'mithril';\n\nexport default class NightmodeSettingsPage extends ExtensionPage {\n content() {\n return (\n
\n
\n
\n
\n {this.settingsItems().toArray()}\n
{this.submitButton()}
\n
\n
\n
\n
\n );\n }\n\n settingsItems(): ItemList {\n const items = new ItemList();\n\n items.add(\n 'general',\n
\n

{app.translator.trans('fof-nightmode.admin.settings.general.heading')}

\n

{app.translator.trans('fof-nightmode.admin.settings.general.help')}

\n {this.generalItems().toArray()}\n
\n );\n\n return items;\n }\n\n generalItems(): ItemList {\n const items = new ItemList();\n\n items.add(\n 'header-toggle',\n this.buildSettingComponent({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.always_show_theme_toggle_on_header'),\n setting: 'fofNightMode.show_theme_toggle_on_header_always',\n type: 'switch',\n })\n );\n\n items.add(\n 'icon-style',\n this.buildSettingComponent({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.show_theme_toggle_in_solid'),\n setting: 'fofNightMode.show_theme_toggle_in_solid',\n type: 'switch',\n })\n );\n\n items.add(\n 'default-theme',\n this.buildSettingComponent({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme'),\n help: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme_helper'),\n setting: 'fof-nightmode.default_theme',\n type: 'select',\n options: this.populateThemes(),\n })\n );\n\n return items;\n }\n\n populateThemes(): Record {\n let options: Record = {};\n\n // add themes based on JS enum\n Object.keys(Themes).forEach((theme, i) => {\n if (theme === 'DEFAULT') return;\n\n options[i] = extractText(app.translator.trans(`fof-nightmode.admin.settings.modal.theme_${theme.toLowerCase()}`));\n });\n\n return options;\n }\n}\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };","import NightmodeSettingsPage from './NightmodeSettingsPage';\n\nexport const components = {\n NightmodeSettingsPage,\n};\n","import app from 'flarum/admin/app';\nimport setSelectedTheme from '../common/setSelectedTheme';\nimport NightmodeSettingsPage from './components/NightmodeSettingsPage';\n\nexport * from './components';\n\napp.initializers.add('fof-nightmode', () => {\n app.extensionData.for('fof-nightmode').registerPage(NightmodeSettingsPage);\n\n setSelectedTheme();\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","AUTO","LIGHT","DARK","DEFAULT","app","attribute","_extends","assign","bind","n","e","arguments","length","t","r","apply","stringifyAttribute","name","stringified","getAll","cookieString","_step","result","_iterator","_createForOfIteratorHelperLoose","split","done","parts","slice","join","decodeURIComponent","replace","parse","document","cookie","set","attributes","encodeURIComponent","expires","milliseconds","Math","min","Date","now","toUTCString","domain","path","secure","partitioned","sameSite","stringifyAttributes","encode","KEY","Number","Themes","val","Cookies","location","protocol","undefined","fixInvalidThemeSetting","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","console","warn","getTheme","user","IsUsingPerDeviceSettings","preferences","fofNightMode_perDevice","SelectedTheme","fofNightMode","setSelectedTheme","extend","Page","setTheme","window","matchMedia","addEventListener","_app$session$user","PerDevice","setThemeFromID","getUrls","day","night","theme","setStyle","matches","type","light","querySelector","dark","bothStyleSheets","newLink","createElement","onload","remove","rel","className","href","head","append","el","url","colorScheme","content","event","CustomEvent","detail","dispatchEvent","_setPrototypeOf","setPrototypeOf","__proto__","NightmodeSettingsPage","_ExtensionPage","create","constructor","_proto","m","this","settingsItems","toArray","submitButton","items","ItemList","add","trans","generalItems","buildSettingComponent","label","setting","help","options","populateThemes","keys","forEach","i","extractText","toLowerCase","ExtensionPage","components","registerPage"],"sourceRoot":""} \ No newline at end of file diff --git a/js/dist/forum.js b/js/dist/forum.js index 11ed9a5..f833b35 100755 --- a/js/dist/forum.js +++ b/js/dist/forum.js @@ -1,2 +1,2 @@ -(()=>{var e={n:t=>{var o=t&&t.__esModule?()=>t.default:()=>t;return e.d(o,{a:o}),o},d:(t,o)=>{for(var n in o)e.o(o,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:o[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};(()=>{"use strict";e.r(t),e.d(t,{Themes:()=>c,getTheme:()=>w,perDeviceSetting:()=>o,setSelectedTheme:()=>n,switchTheme:()=>r});var o={};e.r(o),e.d(o,{KEY:()=>v,get:()=>y,remove:()=>S,set:()=>b});var n={};e.r(n),e.d(n,{default:()=>N,getUrls:()=>_,setStyle:()=>I,setTheme:()=>U,setThemeFromID:()=>D});var r={};e.r(r),e.d(r,{getIsLight:()=>$,switchTheme:()=>J});const a=flarum.core.compat["common/app"];var i=e.n(a);const c={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){return i().forum.attribute("fof-nightmode.default_theme")||0}},s=flarum.core.compat["common/extend"],u=flarum.core.compat["common/components/Page"];var d=e.n(u);function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var o=0,n=Array(t);o=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e?e.split("; "):[]);!(t=n()).done;){var r=t.value.split("="),a=r.slice(1).join("=");'"'===a[0]&&(a=a.slice(1,-1));try{o[decodeURIComponent(r[0])]=a.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)}catch(e){}}return o}(document.cookie)}function g(e,t,o){document.cookie=function(e,t,o){return encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/\(/g,"%28").replace(/\)/g,"%29")+"="+encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)+function(e){if("number"==typeof e.expires){var t=Math.min(Date.now()+864e5*e.expires,864e13);e.expires=new Date(t)}return p("Expires",e.expires?e.expires.toUTCString():"")+p("Domain",e.domain)+p("Path",e.path)+p("Secure",e.secure)+p("Partitioned",e.partitioned)+p("SameSite",e.sameSite)}(o)}(e,t,f({path:"/"},o))}var v="flarum_nightmode",y=function(){var e,t=(e=v,h()[e]);return t||"0"===t?Number(t):c.DEFAULT()},b=function(e){return g(v,e,{sameSite:"lax",secure:"https:"===location.protocol||void 0})},S=function(){g(v,"",f({},undefined,{expires:-1}))};function T(){var e=Array.from(new Set(Object.values(c))),t=y();isNaN(t)?A("Theme is not a valid integer! Resetting..."):e.includes(t)||A("Theme is out of bounds! Resetting...")}function A(e){console.warn(e),b(c.DEFAULT())}function w(){var e,t=i().session.user,o=!t||!!t.preferences().fofNightMode_perDevice,n=t&&t.preferences().fofNightMode;return o?e=y():"number"==typeof n&&-1!==n&&(e=n),"number"==typeof e?e:c.DEFAULT()}function N(){(0,s.extend)(d().prototype,"oninit",U),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",U)}function U(){var e,t=i().session.user,o=null==(e=i().session.user)?void 0:e.preferences().fofNightMode_perDevice;t&&!o||T(),o&&T(),D(w())}function _(){return{day:i().data["fof-nightmode.assets.day"],night:i().data["fof-nightmode.assets.night"]}}function D(e){e===c.DARK?I("night"):e===c.LIGHT?I("day"):I(window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}function I(e){var t=document.querySelector("link.nightmode-light[rel=stylesheet]"),o=document.querySelector("link.nightmode-dark[rel=stylesheet]");e:if(t&&o){if(w()===c.AUTO)break e;var n=document.createElement("link");"onload"in n?n.onload=function(){t.remove(),o.remove()}:(t.remove(),o.remove()),n.rel="stylesheet",n.className="nightmode",n.href=_()[e],document.head.append(n)}else{var r=t||o||document.querySelector("link.nightmode[rel=stylesheet]"),a=_()[e];a!==r.href&&(r.href=a,r.className="nightmode")}var i=document.querySelector('meta[name="color-scheme"]');i&&(i.content="night"===e?"dark":"light");var s=new CustomEvent("fofnightmodechange",{detail:e});document.dispatchEvent(s)}const M=flarum.core.compat["forum/app"];var O=e.n(M);const k=flarum.core.compat["forum/components/SettingsPage"];var x=e.n(k);const L=flarum.core.compat["forum/components/SessionDropdown"];var E=e.n(L);const R=flarum.core.compat["forum/components/HeaderSecondary"];var C=e.n(R);const P=flarum.core.compat["common/components/Button"];var j=e.n(P);const F=flarum.core.compat["common/components/LoadingIndicator"];var H=e.n(F);const B=flarum.core.compat["common/components/Select"];var G=e.n(B);const K=flarum.core.compat["common/components/FieldSet"];var q=e.n(K);const z=flarum.core.compat["common/components/Switch"];var Y=e.n(z);function $(e){return e===c.LIGHT||e===c.AUTO&&!window.matchMedia("(prefers-color-scheme: dark)").matches}function J(){var e,t=w(),o=$(t),n=O().session.user;if(n){var r=o?c.DARK:c.LIGHT;if(n.preferences().fofNightMode_perDevice)return b(r),void U();n.savePreferences({fofNightMode:r}).then((function(){U()}))}else{var a=(e=t)===c.AUTO?c.LIGHT:e===c.LIGHT?c.DARK:c.AUTO;b(a),U()}}var Q=function(e){return O().translator.trans("fof-nightmode.forum.user.settings."+e)};O().initializers.add("fof-nightmode",(function(){(0,s.extend)(x().prototype,"settingsItems",(function(e){var t=O().session.user,o=!!t.preferences().fofNightMode_perDevice;o&&T();var n=!window.matchMedia("not all and (prefers-color-scheme), (prefers-color-scheme)").matches,r=w(),a={0:Q("options.auto"),1:Q("options.day"),2:Q("options.night")};n&&(delete a[0],r===c.AUTO&&(r=O().forum.attribute("fofNightMode_autoUnsupportedFallback"))),e.add("fof-nightmode",q().component({label:Q("heading"),className:"Settings-theme"},[m("p",{className:"description"},Q("description")),m("p",{className:"description"},Q("description2")),n?m("p",{class:"description NightMode-autoUnsupported"},Q("auto_unsupported")):null,Y().component({className:"Settings-theme--per_device_cb",state:o,onchange:function(e){e?b(r):S(),t.savePreferences({fofNightMode_perDevice:e}).then((function(){U()}))}},Q("device_specific_setting_checkbox")),G().component({value:r,className:"Settings-theme--input",onchange:function(e){if(o)return b(e),void U();t.savePreferences({fofNightMode:e}).then((function(){m.redraw(),U()}))},options:a}),m("p",{className:"Settings-theme--selection_description"},r===c.AUTO?Q("option_descriptions.auto"):r===c.LIGHT?Q("option_descriptions.day"):r===c.DARK?Q("option_descriptions.night"):H().component())]))})),(0,s.extend)(C().prototype,"items",(function(e){if(!O().session.user||O().forum.attribute("fofNightMode.showThemeToggleOnHeaderAlways")){var t=w(),o=$(t);e.add("nightmode",m(j(),{className:"Button Button--flat",onclick:function(){J()},icon:t===c.AUTO?"fas fa-adjust":"far fa-"+(o?"sun":"moon")},O().translator.trans("fof-nightmode.forum.header.nightmode_button")),15)}})),(0,s.extend)(E().prototype,"items",(function(e){if(O().session.user){var t=$(w());e.add(t?"nightmode":"daymode",j().component({icon:"far fa-"+(t?"moon":"sun"),onclick:function(){J()}},O().translator.trans("fof-nightmode.forum."+(t?"night":"day"))),-1)}})),N()}))})(),module.exports=t})(); +(()=>{var e={n:t=>{var o=t&&t.__esModule?()=>t.default:()=>t;return e.d(o,{a:o}),o},d:(t,o)=>{for(var n in o)e.o(o,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:o[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};(()=>{"use strict";e.r(t),e.d(t,{Themes:()=>c,getTheme:()=>w,perDeviceSetting:()=>o,setSelectedTheme:()=>n,switchTheme:()=>r});var o={};e.r(o),e.d(o,{KEY:()=>v,get:()=>y,remove:()=>T,set:()=>b});var n={};e.r(n),e.d(n,{default:()=>N,getUrls:()=>_,setStyle:()=>I,setTheme:()=>U,setThemeFromID:()=>D});var r={};e.r(r),e.d(r,{getIsLight:()=>$,switchTheme:()=>J});const a=flarum.core.compat["common/app"];var i=e.n(a);const c={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){return i().forum.attribute("fof-nightmode.default_theme")||0}},s=flarum.core.compat["common/extend"],f=flarum.core.compat["common/components/Page"];var u=e.n(f);function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var o=0,n=Array(t);o=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e?e.split("; "):[]);!(t=n()).done;){var r=t.value.split("="),a=r.slice(1).join("=");'"'===a[0]&&(a=a.slice(1,-1));try{o[decodeURIComponent(r[0])]=a.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)}catch(e){}}return o}(document.cookie)}function g(e,t,o){document.cookie=function(e,t,o){return encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/\(/g,"%28").replace(/\)/g,"%29")+"="+encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)+function(e){if("number"==typeof e.expires){var t=Math.min(Date.now()+864e5*e.expires,864e13);e.expires=new Date(t)}return p("Expires",e.expires?e.expires.toUTCString():"")+p("Domain",e.domain)+p("Path",e.path)+p("Secure",e.secure)+p("Partitioned",e.partitioned)+p("SameSite",e.sameSite)}(o)}(e,t,d({path:"/"},o))}var v="flarum_nightmode",y=function(){var e,t=(e=v,h()[e]);return t||"0"===t?Number(t):c.DEFAULT()},b=function(e){return g(v,e,{sameSite:"lax",secure:"https:"===location.protocol||void 0})},T=function(){g(v,"",d({},undefined,{expires:-1}))};function S(){var e=Array.from(new Set(Object.values(c))),t=y();isNaN(t)?A("Theme is not a valid integer! Resetting..."):e.includes(t)||A("Theme is out of bounds! Resetting...")}function A(e){console.warn(e),b(c.DEFAULT())}function w(){var e,t=i().session.user,o=!t||!!t.preferences().fofNightMode_perDevice,n=t&&t.preferences().fofNightMode;return o?e=y():"number"==typeof n&&-1!==n&&(e=n),"number"==typeof e?e:c.DEFAULT()}function N(){(0,s.extend)(u().prototype,"oninit",U),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",U)}function U(){var e,t=i().session.user,o=null==(e=i().session.user)?void 0:e.preferences().fofNightMode_perDevice;t&&!o||S(),o&&S(),D(w())}function _(){return{day:i().data["fof-nightmode.assets.day"],night:i().data["fof-nightmode.assets.night"]}}function D(e){e===c.DARK?I("night"):e===c.LIGHT?I("day"):I(window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}function I(e){var t=document.querySelector("link.nightmode-light[rel=stylesheet]"),o=document.querySelector("link.nightmode-dark[rel=stylesheet]");e:if(t&&o){if(w()===c.AUTO)break e;var n=document.createElement("link");"onload"in n?n.onload=function(){t.remove(),o.remove()}:(t.remove(),o.remove()),n.rel="stylesheet",n.className="nightmode",n.href=_()[e],document.head.append(n)}else{var r=t||o||document.querySelector("link.nightmode[rel=stylesheet]"),a=_()[e];a!==r.href&&(r.href=a,r.className="nightmode")}var i=document.querySelector('meta[name="color-scheme"]');i&&(i.content="night"===e?"dark":"light");var s=new CustomEvent("fofnightmodechange",{detail:e});document.dispatchEvent(s)}const M=flarum.core.compat["forum/app"];var O=e.n(M);const k=flarum.core.compat["forum/components/SettingsPage"];var x=e.n(k);const L=flarum.core.compat["forum/components/SessionDropdown"];var E=e.n(L);const R=flarum.core.compat["forum/components/HeaderSecondary"];var C=e.n(R);const P=flarum.core.compat["common/components/Button"];var j=e.n(P);const F=flarum.core.compat["common/components/LoadingIndicator"];var H=e.n(F);const B=flarum.core.compat["common/components/Select"];var G=e.n(B);const K=flarum.core.compat["common/components/FieldSet"];var q=e.n(K);const z=flarum.core.compat["common/components/Switch"];var Y=e.n(z);function $(e){return e===c.LIGHT||e===c.AUTO&&!window.matchMedia("(prefers-color-scheme: dark)").matches}function J(){var e,t=w(),o=$(t),n=O().session.user;if(n){var r=o?c.DARK:c.LIGHT;if(n.preferences().fofNightMode_perDevice)return b(r),void U();n.savePreferences({fofNightMode:r}).then((function(){U()}))}else{var a=(e=t)===c.AUTO?c.LIGHT:e===c.LIGHT?c.DARK:c.AUTO;b(a),U()}}var Q=function(e){return O().translator.trans("fof-nightmode.forum.user.settings."+e)};O().initializers.add("fof-nightmode",(function(){(0,s.extend)(x().prototype,"settingsItems",(function(e){var t=O().session.user,o=!!t.preferences().fofNightMode_perDevice;o&&S();var n=!window.matchMedia("not all and (prefers-color-scheme), (prefers-color-scheme)").matches,r=w(),a={0:Q("options.auto"),1:Q("options.day"),2:Q("options.night")};n&&(delete a[0],r===c.AUTO&&(r=O().forum.attribute("fofNightMode_autoUnsupportedFallback"))),e.add("fof-nightmode",q().component({label:Q("heading"),className:"Settings-theme"},[m("p",{className:"description"},Q("description")),m("p",{className:"description"},Q("description2")),n?m("p",{class:"description NightMode-autoUnsupported"},Q("auto_unsupported")):null,Y().component({className:"Settings-theme--per_device_cb",state:o,onchange:function(e){e?b(r):T(),t.savePreferences({fofNightMode_perDevice:e}).then((function(){U()}))}},Q("device_specific_setting_checkbox")),G().component({value:r,className:"Settings-theme--input",onchange:function(e){if(o)return b(e),void U();t.savePreferences({fofNightMode:e}).then((function(){m.redraw(),U()}))},options:a}),m("p",{className:"Settings-theme--selection_description"},r===c.AUTO?Q("option_descriptions.auto"):r===c.LIGHT?Q("option_descriptions.day"):r===c.DARK?Q("option_descriptions.night"):H().component())]))})),(0,s.extend)(C().prototype,"items",(function(e){if(!O().session.user||O().forum.attribute("fofNightMode.showThemeToggleOnHeaderAlways")){var t=w(),o=$(t),n=O().forum.attribute("fofNightMode.showThemeToggleInSolid")?"fas fa-":"far fa-";e.add("nightmode",m(j(),{className:"Button Button--flat",onclick:function(){J()},icon:t===c.AUTO?"fas fa-adjust":o?n+"sun":n+"moon"},O().translator.trans("fof-nightmode.forum.header.nightmode_button")),15)}})),(0,s.extend)(E().prototype,"items",(function(e){if(O().session.user){var t=$(w()),o=O().forum.attribute("fofNightMode.showThemeToggleInSolid")?"fas fa-":"far fa-";e.add(t?"nightmode":"daymode",j().component({icon:t?o+"moon":o+"sun",onclick:function(){J()}},O().translator.trans("fof-nightmode.forum."+(t?"night":"day"))),-1)}})),N()}))})(),module.exports=t})(); //# sourceMappingURL=forum.js.map \ No newline at end of file diff --git a/js/dist/forum.js.map b/js/dist/forum.js.map index 704eb9c..4da7370 100755 --- a/js/dist/forum.js.map +++ b/js/dist/forum.js.map @@ -1 +1 @@ -{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@fof/nightmode/webpack/bootstrap","webpack://@fof/nightmode/webpack/runtime/compat get default export","webpack://@fof/nightmode/webpack/runtime/define property getters","webpack://@fof/nightmode/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/nightmode/webpack/runtime/make namespace object","webpack://@fof/nightmode/external root \"flarum.core.compat['common/app']\"","webpack://@fof/nightmode/./src/common/Themes.ts","webpack://@fof/nightmode/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@fof/nightmode/./node_modules/es-cookie/src/es-cookie.js","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.ts","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.ts","webpack://@fof/nightmode/./src/forum/getTheme.ts","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/external root \"flarum.core.compat['forum/app']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['forum/components/SettingsPage']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['forum/components/SessionDropdown']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['forum/components/HeaderSecondary']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Select']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/FieldSet']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Switch']\"","webpack://@fof/nightmode/./src/forum/helpers/switchTheme.ts","webpack://@fof/nightmode/./src/forum/addSettingsItems.js","webpack://@fof/nightmode/./src/forum/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (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};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","import app from 'flarum/common/app';\n\n/*\n\n JS enum equivalent. Makes sure no value mix-ups are made!\n\n DEFAULT is used when an invalid value has been set, as well as for guest and new users.\n\n*/\n\nconst Themes = {\n AUTO: 0,\n LIGHT: 1,\n DARK: 2,\n\n // adds an \"ultra default\" of 0 if the admins don't set a default tsk tsk tsk\n DEFAULT: () => app.forum.attribute('fof-nightmode.default_theme') || 0,\n};\n\nexport default Themes;\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Page'];","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function stringifyAttribute(name, value) {\n if (!value) {\n return '';\n }\n let stringified = '; ' + name;\n if (value === true) {\n return stringified; // boolean attributes shouldn't have a value\n }\n return stringified + '=' + value;\n}\nfunction stringifyAttributes(attributes) {\n if (typeof attributes.expires === 'number') {\n const milliseconds = Math.min(Date.now() + attributes.expires * 864e+5, 864e+13);\n attributes.expires = new Date(milliseconds);\n }\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\n + stringifyAttribute('Domain', attributes.domain)\n + stringifyAttribute('Path', attributes.path)\n + stringifyAttribute('Secure', attributes.secure)\n + stringifyAttribute('Partitioned', attributes.partitioned)\n + stringifyAttribute('SameSite', attributes.sameSite);\n}\nexport function encode(name, value, attributes) {\n return encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) // allowed special characters\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\n + '=' + encodeURIComponent(value)\n // allowed special characters\n .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent)\n + stringifyAttributes(attributes);\n}\nexport function parse(cookieString) {\n let result = {};\n const cookies = cookieString ? cookieString.split('; ') : [];\n for (let cookie of cookies) {\n const parts = cookie.split('=');\n let value = parts.slice(1).join('=');\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n try {\n const name = decodeURIComponent(parts[0]);\n result[name] = value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent);\n }\n catch (e) {\n // ignore cookies with invalid name/value encoding\n }\n }\n return result;\n}\nexport function getAll() {\n return parse(document.cookie);\n}\nexport function get(name) {\n return getAll()[name];\n}\nexport function set(name, value, attributes) {\n document.cookie = encode(name, value, { path: '/', ...attributes });\n}\nexport function remove(name, attributes) {\n set(name, '', { ...attributes, expires: -1 });\n}\n","import * as Cookies from 'es-cookie';\nimport Themes from '../../common/Themes';\n\nexport const KEY = 'flarum_nightmode';\n\nexport const get = () => {\n const value = Cookies.get(KEY);\n\n if (!value && value !== '0') {\n return Themes.DEFAULT();\n }\n\n return Number(value);\n};\n\nexport const set = (val) =>\n Cookies.set(KEY, val, {\n sameSite: 'lax',\n secure: location.protocol === 'https:' ? true : undefined,\n });\n\nexport const remove = () => Cookies.remove(KEY);\n","/*\n This function is designed to catch invalid theme values\n and handle them before they can break Flarum for users.\n\n E.g. if a user manually edited their cookies to\n set their theme to an invalid value, this theme would\n detect that, and reset it to 0 (auto).\n*/\n\nimport Themes from '../common/Themes';\nimport { get, set } from './helpers/perDeviceSetting';\n\nexport default function fixInvalidThemeSetting() {\n // get array of valid values without duplicate entries\n let validValues = Array.from(new Set(Object.values(Themes)));\n\n const Theme = get();\n\n if (isNaN(Theme)) {\n resetTheme('Theme is not a valid integer! Resetting...');\n } else if (!validValues.includes(Theme)) {\n // theme out of bounds\n resetTheme(`Theme is out of bounds! Resetting...`);\n }\n}\n\nfunction resetTheme(reason) {\n console.warn(reason);\n\n set(Themes.DEFAULT());\n}\n","import app from 'flarum/common/app';\nimport Themes from '../common/Themes';\nimport { get } from './helpers/perDeviceSetting';\n\nexport default function getTheme() {\n const user = app.session.user;\n\n const IsUsingPerDeviceSettings = !user || !!user.preferences().fofNightMode_perDevice;\n const SelectedTheme = user && user.preferences().fofNightMode;\n\n let value;\n\n if (IsUsingPerDeviceSettings) {\n // fetch through LS is per device enabled\n value = get();\n } else {\n if (typeof SelectedTheme === 'number' && SelectedTheme !== -1) {\n // use user prefs\n value = SelectedTheme;\n }\n }\n\n return typeof value === 'number' ? value : Themes.DEFAULT();\n}\n","import app from 'flarum/common/app';\n\nimport { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\n\nimport Themes from './Themes';\nimport fixInvalidThemeSetting from '../forum/fixInvalidThemeSetting';\nimport getTheme from '../forum/getTheme';\n\nexport default function setSelectedTheme() {\n extend(Page.prototype, 'oninit', setTheme);\n\n // Register setTheme() as the handler for 'prefers-color-scheme' media property\n // change. This allows to make sure the 'fofnightmodechange' event is dispatched\n // when this property changes, and that the correct stylesheets are loaded.\n const prefersColorSchemeDark = window.matchMedia('(prefers-color-scheme: dark)');\n prefersColorSchemeDark.addEventListener('change', setTheme);\n}\n\nexport function setTheme() {\n const { user } = app.session;\n\n const PerDevice = app.session.user?.preferences().fofNightMode_perDevice;\n\n if (!user || PerDevice) {\n fixInvalidThemeSetting();\n }\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const CurrentTheme = getTheme();\n\n setThemeFromID(CurrentTheme);\n}\n\nexport function getUrls() {\n return {\n day: app.data['fof-nightmode.assets.day'],\n night: app.data['fof-nightmode.assets.night'],\n };\n}\n\nexport function setThemeFromID(theme) {\n if (theme === Themes.DARK) {\n setStyle('night');\n } else if (theme === Themes.LIGHT) {\n setStyle('day');\n } else {\n const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n setStyle(preferDark ? 'night' : 'day');\n }\n}\n\nexport function setStyle(type) {\n const light = document.querySelector('link.nightmode-light[rel=stylesheet]');\n const dark = document.querySelector('link.nightmode-dark[rel=stylesheet]');\n\n bothStyleSheets: if (light && dark) {\n if (getTheme() === Themes.AUTO) break bothStyleSheets;\n\n let newLink = document.createElement('link');\n\n // onload on link tags not supported in all browsers\n // so we should check it is present in the user's\n // current browser\n if ('onload' in newLink) {\n // if it is, only remove the old link tags after the new\n // one has finished loading (prevents flash of unstyled\n // content)\n newLink.onload = function () {\n light.remove();\n dark.remove();\n };\n } else {\n // if it isn't, just remove the old link tags immediately\n light.remove();\n dark.remove();\n }\n\n newLink.rel = 'stylesheet';\n newLink.className = 'nightmode';\n newLink.href = getUrls()[type];\n\n document.head.append(newLink);\n } else {\n const el = light || dark || document.querySelector('link.nightmode[rel=stylesheet]');\n\n const url = getUrls()[type];\n\n if (url !== el.href) {\n el.href = url;\n el.className = 'nightmode';\n }\n }\n\n const colorScheme = document.querySelector('meta[name=\"color-scheme\"]');\n\n if (colorScheme) {\n colorScheme.content = type === 'night' ? 'dark' : 'light';\n }\n\n // Dispatch a 'fofnightmodechange' event with 'day' or 'night' as detail.\n // This allows other extensions to integrate with this one.\n const event = new CustomEvent('fofnightmodechange', { detail: type });\n document.dispatchEvent(event);\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/SettingsPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/SessionDropdown'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/HeaderSecondary'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Select'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/FieldSet'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","import app from 'flarum/forum/app';\nimport Themes from '../../common/Themes';\nimport { setTheme } from '../../common/setSelectedTheme';\nimport getTheme from '../getTheme';\nimport * as perDevice from '../helpers/perDeviceSetting';\n\nexport function getIsLight(theme) {\n return theme === Themes.LIGHT || (theme === Themes.AUTO && !window.matchMedia('(prefers-color-scheme: dark)').matches);\n}\n\nfunction toggleThrough(current) {\n if (current === Themes.AUTO) {\n return Themes.LIGHT;\n }\n\n if (current === Themes.LIGHT) {\n return Themes.DARK;\n }\n\n return Themes.AUTO;\n}\n\nexport function switchTheme() {\n const theme = getTheme();\n const isLight = getIsLight(theme);\n const user = app.session.user;\n\n if (user) {\n const val = isLight ? Themes.DARK : Themes.LIGHT;\n\n if (!!user.preferences().fofNightMode_perDevice) {\n perDevice.set(val);\n setTheme();\n return;\n }\n\n user\n .savePreferences({\n fofNightMode: val,\n })\n .then(() => {\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a page load)\n setTheme();\n });\n } else {\n const newTheme = toggleThrough(theme);\n\n perDevice.set(newTheme);\n setTheme();\n }\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\n\nimport SettingsPage from 'flarum/forum/components/SettingsPage';\nimport SessionDropdown from 'flarum/forum/components/SessionDropdown';\nimport HeaderSecondary from 'flarum/forum/components/HeaderSecondary';\nimport Button from 'flarum/common/components/Button';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Select from 'flarum/common/components/Select';\nimport FieldSet from 'flarum/common/components/FieldSet';\nimport Switch from 'flarum/common/components/Switch';\n\nimport { setTheme } from '../common/setSelectedTheme';\nimport fixInvalidThemeSetting from './fixInvalidThemeSetting';\nimport * as perDevice from './helpers/perDeviceSetting';\nimport getTheme from './getTheme';\nimport Themes from '../common/Themes';\nimport { switchTheme, getIsLight } from './helpers/switchTheme';\n\n// custom function for translations makes it a lot cleaner\nconst trans = (key) => app.translator.trans(`fof-nightmode.forum.user.settings.${key}`);\n\nexport default function () {\n extend(SettingsPage.prototype, 'settingsItems', function (items) {\n const { user } = app.session;\n\n const PerDevice = !!user.preferences().fofNightMode_perDevice;\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const doesNotSupportAuto = !window.matchMedia('not all and (prefers-color-scheme), (prefers-color-scheme)').matches;\n\n let currentTheme = getTheme();\n\n const options = { 0: trans('options.auto'), 1: trans('options.day'), 2: trans('options.night') };\n\n if (doesNotSupportAuto) {\n delete options['0'];\n\n if (currentTheme === Themes.AUTO) {\n currentTheme = app.forum.attribute('fofNightMode_autoUnsupportedFallback');\n }\n }\n\n items.add(\n 'fof-nightmode',\n FieldSet.component(\n {\n label: trans('heading'),\n className: 'Settings-theme',\n },\n [\n

{trans('description')}

,\n

{trans('description2')}

,\n doesNotSupportAuto ?

{trans('auto_unsupported')}

: null,\n Switch.component(\n {\n className: 'Settings-theme--per_device_cb',\n state: PerDevice,\n onchange: (checked) => {\n if (checked) {\n // save current theme as this device's default\n perDevice.set(currentTheme);\n } else {\n perDevice.remove();\n }\n\n user\n .savePreferences({\n fofNightMode_perDevice: checked,\n })\n .then(() => {\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a page load)\n setTheme();\n });\n },\n },\n trans('device_specific_setting_checkbox')\n ),\n Select.component({\n value: currentTheme,\n className: 'Settings-theme--input',\n onchange: (e) => {\n if (PerDevice) {\n perDevice.set(e);\n\n setTheme();\n return;\n }\n\n user\n .savePreferences({\n fofNightMode: e,\n })\n .then(() => {\n m.redraw();\n\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a apge load)\n setTheme();\n });\n },\n options,\n }),\n

\n {currentTheme === Themes.AUTO\n ? trans('option_descriptions.auto')\n : currentTheme === Themes.LIGHT\n ? trans('option_descriptions.day')\n : currentTheme === Themes.DARK\n ? trans('option_descriptions.night')\n : // prevents nasty paragraph switching\n LoadingIndicator.component()}\n

,\n ]\n )\n );\n });\n\n extend(HeaderSecondary.prototype, 'items', function (items) {\n if (app.session.user && !app.forum.attribute('fofNightMode.showThemeToggleOnHeaderAlways')) return;\n\n const theme = getTheme();\n const isLight = getIsLight(theme);\n\n items.add(\n 'nightmode',\n {\n // const newTheme = toggleThrough(theme);\n\n // perDevice.set(newTheme);\n // setTheme();\n switchTheme();\n }}\n icon={theme === Themes.AUTO ? 'fas fa-adjust' : `far fa-${isLight ? 'sun' : 'moon'}`}\n >\n {app.translator.trans('fof-nightmode.forum.header.nightmode_button')}\n ,\n 15\n );\n });\n\n extend(SessionDropdown.prototype, 'items', function (items) {\n if (!app.session.user) return;\n\n const isLight = getIsLight(getTheme());\n\n // Add night mode link to session dropdown\n items.add(\n isLight ? 'nightmode' : 'daymode',\n Button.component(\n {\n icon: `far fa-${isLight ? 'moon' : 'sun'}`,\n onclick: () => {\n switchTheme();\n // const val = isLight ? Themes.DARK : Themes.LIGHT;\n\n // if (!!user.preferences().fofNightMode_perDevice) {\n // perDevice.set(val);\n // setTheme();\n // return;\n // }\n\n // user\n // .savePreferences({\n // fofNightMode: val,\n // })\n // .then(() => {\n // // need to force-update selected theme (as it's only set\n // // on a page load and redraw doesn't count as a apge load)\n // setTheme();\n // });\n },\n },\n app.translator.trans(`fof-nightmode.forum.${isLight ? 'night' : 'day'}`)\n ),\n -1\n );\n });\n}\n","import app from 'flarum/forum/app';\nimport addSettingsItems from './addSettingsItems';\nimport setSelectedTheme from '../common/setSelectedTheme';\n\nexport * as perDeviceSetting from './helpers/perDeviceSetting';\nexport * as switchTheme from './helpers/switchTheme';\nexport { default as getTheme } from './getTheme';\n\napp.initializers.add('fof-nightmode', () => {\n addSettingsItems();\n setSelectedTheme();\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","AUTO","LIGHT","DARK","DEFAULT","app","attribute","_extends","assign","bind","n","e","arguments","length","t","r","apply","stringifyAttribute","name","stringified","getAll","cookieString","_step","result","_iterator","_createForOfIteratorHelperLoose","split","done","parts","slice","join","decodeURIComponent","replace","parse","document","cookie","set","attributes","encodeURIComponent","expires","milliseconds","Math","min","Date","now","toUTCString","domain","path","secure","partitioned","sameSite","stringifyAttributes","encode","KEY","Number","Themes","val","Cookies","location","protocol","undefined","remove","fixInvalidThemeSetting","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","console","warn","getTheme","user","IsUsingPerDeviceSettings","preferences","fofNightMode_perDevice","SelectedTheme","fofNightMode","setSelectedTheme","extend","Page","setTheme","window","matchMedia","addEventListener","_app$session$user","PerDevice","setThemeFromID","getUrls","day","night","theme","setStyle","matches","type","light","querySelector","dark","bothStyleSheets","newLink","createElement","onload","rel","className","href","head","append","el","url","colorScheme","content","event","CustomEvent","detail","dispatchEvent","getIsLight","switchTheme","current","isLight","perDevice","savePreferences","then","newTheme","trans","add","SettingsPage","items","doesNotSupportAuto","currentTheme","options","FieldSet","label","m","class","Switch","state","onchange","checked","Select","redraw","LoadingIndicator","HeaderSecondary","Button","onclick","icon","SessionDropdown"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@fof/nightmode/webpack/bootstrap","webpack://@fof/nightmode/webpack/runtime/compat get default export","webpack://@fof/nightmode/webpack/runtime/define property getters","webpack://@fof/nightmode/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/nightmode/webpack/runtime/make namespace object","webpack://@fof/nightmode/external root \"flarum.core.compat['common/app']\"","webpack://@fof/nightmode/./src/common/Themes.ts","webpack://@fof/nightmode/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@fof/nightmode/./node_modules/es-cookie/src/es-cookie.js","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.ts","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.ts","webpack://@fof/nightmode/./src/forum/getTheme.ts","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/external root \"flarum.core.compat['forum/app']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['forum/components/SettingsPage']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['forum/components/SessionDropdown']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['forum/components/HeaderSecondary']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Select']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/FieldSet']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Switch']\"","webpack://@fof/nightmode/./src/forum/helpers/switchTheme.ts","webpack://@fof/nightmode/./src/forum/addSettingsItems.js","webpack://@fof/nightmode/./src/forum/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (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};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","import app from 'flarum/common/app';\n\n/*\n\n JS enum equivalent. Makes sure no value mix-ups are made!\n\n DEFAULT is used when an invalid value has been set, as well as for guest and new users.\n\n*/\n\nconst Themes = {\n AUTO: 0,\n LIGHT: 1,\n DARK: 2,\n\n // adds an \"ultra default\" of 0 if the admins don't set a default tsk tsk tsk\n DEFAULT: () => app.forum.attribute('fof-nightmode.default_theme') || 0,\n};\n\nexport default Themes;\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Page'];","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function stringifyAttribute(name, value) {\n if (!value) {\n return '';\n }\n let stringified = '; ' + name;\n if (value === true) {\n return stringified; // boolean attributes shouldn't have a value\n }\n return stringified + '=' + value;\n}\nfunction stringifyAttributes(attributes) {\n if (typeof attributes.expires === 'number') {\n const milliseconds = Math.min(Date.now() + attributes.expires * 864e+5, 864e+13);\n attributes.expires = new Date(milliseconds);\n }\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\n + stringifyAttribute('Domain', attributes.domain)\n + stringifyAttribute('Path', attributes.path)\n + stringifyAttribute('Secure', attributes.secure)\n + stringifyAttribute('Partitioned', attributes.partitioned)\n + stringifyAttribute('SameSite', attributes.sameSite);\n}\nexport function encode(name, value, attributes) {\n return encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) // allowed special characters\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\n + '=' + encodeURIComponent(value)\n // allowed special characters\n .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent)\n + stringifyAttributes(attributes);\n}\nexport function parse(cookieString) {\n let result = {};\n const cookies = cookieString ? cookieString.split('; ') : [];\n for (let cookie of cookies) {\n const parts = cookie.split('=');\n let value = parts.slice(1).join('=');\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n try {\n const name = decodeURIComponent(parts[0]);\n result[name] = value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent);\n }\n catch (e) {\n // ignore cookies with invalid name/value encoding\n }\n }\n return result;\n}\nexport function getAll() {\n return parse(document.cookie);\n}\nexport function get(name) {\n return getAll()[name];\n}\nexport function set(name, value, attributes) {\n document.cookie = encode(name, value, { path: '/', ...attributes });\n}\nexport function remove(name, attributes) {\n set(name, '', { ...attributes, expires: -1 });\n}\n","import * as Cookies from 'es-cookie';\nimport Themes from '../../common/Themes';\n\nexport const KEY = 'flarum_nightmode';\n\nexport const get = () => {\n const value = Cookies.get(KEY);\n\n if (!value && value !== '0') {\n return Themes.DEFAULT();\n }\n\n return Number(value);\n};\n\nexport const set = (val) =>\n Cookies.set(KEY, val, {\n sameSite: 'lax',\n secure: location.protocol === 'https:' ? true : undefined,\n });\n\nexport const remove = () => Cookies.remove(KEY);\n","/*\n This function is designed to catch invalid theme values\n and handle them before they can break Flarum for users.\n\n E.g. if a user manually edited their cookies to\n set their theme to an invalid value, this theme would\n detect that, and reset it to 0 (auto).\n*/\n\nimport Themes from '../common/Themes';\nimport { get, set } from './helpers/perDeviceSetting';\n\nexport default function fixInvalidThemeSetting() {\n // get array of valid values without duplicate entries\n let validValues = Array.from(new Set(Object.values(Themes)));\n\n const Theme = get();\n\n if (isNaN(Theme)) {\n resetTheme('Theme is not a valid integer! Resetting...');\n } else if (!validValues.includes(Theme)) {\n // theme out of bounds\n resetTheme(`Theme is out of bounds! Resetting...`);\n }\n}\n\nfunction resetTheme(reason) {\n console.warn(reason);\n\n set(Themes.DEFAULT());\n}\n","import app from 'flarum/common/app';\nimport Themes from '../common/Themes';\nimport { get } from './helpers/perDeviceSetting';\n\nexport default function getTheme() {\n const user = app.session.user;\n\n const IsUsingPerDeviceSettings = !user || !!user.preferences().fofNightMode_perDevice;\n const SelectedTheme = user && user.preferences().fofNightMode;\n\n let value;\n\n if (IsUsingPerDeviceSettings) {\n // fetch through LS is per device enabled\n value = get();\n } else {\n if (typeof SelectedTheme === 'number' && SelectedTheme !== -1) {\n // use user prefs\n value = SelectedTheme;\n }\n }\n\n return typeof value === 'number' ? value : Themes.DEFAULT();\n}\n","import app from 'flarum/common/app';\n\nimport { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\n\nimport Themes from './Themes';\nimport fixInvalidThemeSetting from '../forum/fixInvalidThemeSetting';\nimport getTheme from '../forum/getTheme';\n\nexport default function setSelectedTheme() {\n extend(Page.prototype, 'oninit', setTheme);\n\n // Register setTheme() as the handler for 'prefers-color-scheme' media property\n // change. This allows to make sure the 'fofnightmodechange' event is dispatched\n // when this property changes, and that the correct stylesheets are loaded.\n const prefersColorSchemeDark = window.matchMedia('(prefers-color-scheme: dark)');\n prefersColorSchemeDark.addEventListener('change', setTheme);\n}\n\nexport function setTheme() {\n const { user } = app.session;\n\n const PerDevice = app.session.user?.preferences().fofNightMode_perDevice;\n\n if (!user || PerDevice) {\n fixInvalidThemeSetting();\n }\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const CurrentTheme = getTheme();\n\n setThemeFromID(CurrentTheme);\n}\n\nexport function getUrls() {\n return {\n day: app.data['fof-nightmode.assets.day'],\n night: app.data['fof-nightmode.assets.night'],\n };\n}\n\nexport function setThemeFromID(theme) {\n if (theme === Themes.DARK) {\n setStyle('night');\n } else if (theme === Themes.LIGHT) {\n setStyle('day');\n } else {\n const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n setStyle(preferDark ? 'night' : 'day');\n }\n}\n\nexport function setStyle(type) {\n const light = document.querySelector('link.nightmode-light[rel=stylesheet]');\n const dark = document.querySelector('link.nightmode-dark[rel=stylesheet]');\n\n bothStyleSheets: if (light && dark) {\n if (getTheme() === Themes.AUTO) break bothStyleSheets;\n\n let newLink = document.createElement('link');\n\n // onload on link tags not supported in all browsers\n // so we should check it is present in the user's\n // current browser\n if ('onload' in newLink) {\n // if it is, only remove the old link tags after the new\n // one has finished loading (prevents flash of unstyled\n // content)\n newLink.onload = function () {\n light.remove();\n dark.remove();\n };\n } else {\n // if it isn't, just remove the old link tags immediately\n light.remove();\n dark.remove();\n }\n\n newLink.rel = 'stylesheet';\n newLink.className = 'nightmode';\n newLink.href = getUrls()[type];\n\n document.head.append(newLink);\n } else {\n const el = light || dark || document.querySelector('link.nightmode[rel=stylesheet]');\n\n const url = getUrls()[type];\n\n if (url !== el.href) {\n el.href = url;\n el.className = 'nightmode';\n }\n }\n\n const colorScheme = document.querySelector('meta[name=\"color-scheme\"]');\n\n if (colorScheme) {\n colorScheme.content = type === 'night' ? 'dark' : 'light';\n }\n\n // Dispatch a 'fofnightmodechange' event with 'day' or 'night' as detail.\n // This allows other extensions to integrate with this one.\n const event = new CustomEvent('fofnightmodechange', { detail: type });\n document.dispatchEvent(event);\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/SettingsPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/SessionDropdown'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/HeaderSecondary'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Select'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/FieldSet'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","import app from 'flarum/forum/app';\nimport Themes from '../../common/Themes';\nimport { setTheme } from '../../common/setSelectedTheme';\nimport getTheme from '../getTheme';\nimport * as perDevice from '../helpers/perDeviceSetting';\n\nexport function getIsLight(theme) {\n return theme === Themes.LIGHT || (theme === Themes.AUTO && !window.matchMedia('(prefers-color-scheme: dark)').matches);\n}\n\nfunction toggleThrough(current) {\n if (current === Themes.AUTO) {\n return Themes.LIGHT;\n }\n\n if (current === Themes.LIGHT) {\n return Themes.DARK;\n }\n\n return Themes.AUTO;\n}\n\nexport function switchTheme() {\n const theme = getTheme();\n const isLight = getIsLight(theme);\n const user = app.session.user;\n\n if (user) {\n const val = isLight ? Themes.DARK : Themes.LIGHT;\n\n if (!!user.preferences().fofNightMode_perDevice) {\n perDevice.set(val);\n setTheme();\n return;\n }\n\n user\n .savePreferences({\n fofNightMode: val,\n })\n .then(() => {\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a page load)\n setTheme();\n });\n } else {\n const newTheme = toggleThrough(theme);\n\n perDevice.set(newTheme);\n setTheme();\n }\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\n\nimport SettingsPage from 'flarum/forum/components/SettingsPage';\nimport SessionDropdown from 'flarum/forum/components/SessionDropdown';\nimport HeaderSecondary from 'flarum/forum/components/HeaderSecondary';\nimport Button from 'flarum/common/components/Button';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Select from 'flarum/common/components/Select';\nimport FieldSet from 'flarum/common/components/FieldSet';\nimport Switch from 'flarum/common/components/Switch';\n\nimport { setTheme } from '../common/setSelectedTheme';\nimport fixInvalidThemeSetting from './fixInvalidThemeSetting';\nimport * as perDevice from './helpers/perDeviceSetting';\nimport getTheme from './getTheme';\nimport Themes from '../common/Themes';\nimport { switchTheme, getIsLight } from './helpers/switchTheme';\n\n// custom function for translations makes it a lot cleaner\nconst trans = (key) => app.translator.trans(`fof-nightmode.forum.user.settings.${key}`);\n\nexport default function () {\n extend(SettingsPage.prototype, 'settingsItems', function (items) {\n const { user } = app.session;\n\n const PerDevice = !!user.preferences().fofNightMode_perDevice;\n\n if (PerDevice) {\n fixInvalidThemeSetting();\n }\n\n const doesNotSupportAuto = !window.matchMedia('not all and (prefers-color-scheme), (prefers-color-scheme)').matches;\n\n let currentTheme = getTheme();\n\n const options = { 0: trans('options.auto'), 1: trans('options.day'), 2: trans('options.night') };\n\n if (doesNotSupportAuto) {\n delete options['0'];\n\n if (currentTheme === Themes.AUTO) {\n currentTheme = app.forum.attribute('fofNightMode_autoUnsupportedFallback');\n }\n }\n\n items.add(\n 'fof-nightmode',\n FieldSet.component(\n {\n label: trans('heading'),\n className: 'Settings-theme',\n },\n [\n

{trans('description')}

,\n

{trans('description2')}

,\n doesNotSupportAuto ?

{trans('auto_unsupported')}

: null,\n Switch.component(\n {\n className: 'Settings-theme--per_device_cb',\n state: PerDevice,\n onchange: (checked) => {\n if (checked) {\n // save current theme as this device's default\n perDevice.set(currentTheme);\n } else {\n perDevice.remove();\n }\n\n user\n .savePreferences({\n fofNightMode_perDevice: checked,\n })\n .then(() => {\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a page load)\n setTheme();\n });\n },\n },\n trans('device_specific_setting_checkbox')\n ),\n Select.component({\n value: currentTheme,\n className: 'Settings-theme--input',\n onchange: (e) => {\n if (PerDevice) {\n perDevice.set(e);\n\n setTheme();\n return;\n }\n\n user\n .savePreferences({\n fofNightMode: e,\n })\n .then(() => {\n m.redraw();\n\n // need to force-update selected theme (as it's only set\n // on a page load and redraw doesn't count as a apge load)\n setTheme();\n });\n },\n options,\n }),\n

\n {currentTheme === Themes.AUTO\n ? trans('option_descriptions.auto')\n : currentTheme === Themes.LIGHT\n ? trans('option_descriptions.day')\n : currentTheme === Themes.DARK\n ? trans('option_descriptions.night')\n : // prevents nasty paragraph switching\n LoadingIndicator.component()}\n

,\n ]\n )\n );\n });\n\n extend(HeaderSecondary.prototype, 'items', function (items) {\n if (app.session.user && !app.forum.attribute('fofNightMode.showThemeToggleOnHeaderAlways')) return;\n\n const theme = getTheme();\n const isLight = getIsLight(theme);\n\n const iconPrefix = app.forum.attribute('fofNightMode.showThemeToggleInSolid') ? 'fas fa-' : 'far fa-';\n\n items.add(\n 'nightmode',\n {\n switchTheme();\n }}\n icon={theme === Themes.AUTO ? 'fas fa-adjust' : `${isLight ? iconPrefix + 'sun' : iconPrefix + 'moon'}`}\n >\n {app.translator.trans('fof-nightmode.forum.header.nightmode_button')}\n ,\n 15\n );\n });\n\n extend(SessionDropdown.prototype, 'items', function (items) {\n if (!app.session.user) return;\n\n const isLight = getIsLight(getTheme());\n\n const iconPrefix = app.forum.attribute('fofNightMode.showThemeToggleInSolid') ? 'fas fa-' : 'far fa-';\n\n // Add night mode link to session dropdown\n items.add(\n isLight ? 'nightmode' : 'daymode',\n Button.component(\n {\n icon: `${isLight ? iconPrefix + 'moon' : iconPrefix + 'sun'}`,\n onclick: () => {\n switchTheme();\n },\n },\n app.translator.trans(`fof-nightmode.forum.${isLight ? 'night' : 'day'}`)\n ),\n -1\n );\n });\n}\n","import app from 'flarum/forum/app';\nimport addSettingsItems from './addSettingsItems';\nimport setSelectedTheme from '../common/setSelectedTheme';\n\nexport * as perDeviceSetting from './helpers/perDeviceSetting';\nexport * as switchTheme from './helpers/switchTheme';\nexport { default as getTheme } from './getTheme';\n\napp.initializers.add('fof-nightmode', () => {\n addSettingsItems();\n setSelectedTheme();\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","AUTO","LIGHT","DARK","DEFAULT","app","attribute","_extends","assign","bind","n","e","arguments","length","t","r","apply","stringifyAttribute","name","stringified","getAll","cookieString","_step","result","_iterator","_createForOfIteratorHelperLoose","split","done","parts","slice","join","decodeURIComponent","replace","parse","document","cookie","set","attributes","encodeURIComponent","expires","milliseconds","Math","min","Date","now","toUTCString","domain","path","secure","partitioned","sameSite","stringifyAttributes","encode","KEY","Number","Themes","val","Cookies","location","protocol","undefined","remove","fixInvalidThemeSetting","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","console","warn","getTheme","user","IsUsingPerDeviceSettings","preferences","fofNightMode_perDevice","SelectedTheme","fofNightMode","setSelectedTheme","extend","Page","setTheme","window","matchMedia","addEventListener","_app$session$user","PerDevice","setThemeFromID","getUrls","day","night","theme","setStyle","matches","type","light","querySelector","dark","bothStyleSheets","newLink","createElement","onload","rel","className","href","head","append","el","url","colorScheme","content","event","CustomEvent","detail","dispatchEvent","getIsLight","switchTheme","current","isLight","perDevice","savePreferences","then","newTheme","trans","add","SettingsPage","items","doesNotSupportAuto","currentTheme","options","FieldSet","label","m","class","Switch","state","onchange","checked","Select","redraw","LoadingIndicator","HeaderSecondary","iconPrefix","Button","onclick","icon","SessionDropdown"],"sourceRoot":""} \ No newline at end of file