diff --git a/js/dist/admin.js b/js/dist/admin.js index 24dd75b..7474fc4 100755 --- a/js/dist/admin.js +++ b/js/dist/admin.js @@ -1,2 +1,2 @@ -(()=>{var e={116:function(e,t){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,o=1,n=arguments.length;o{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";o.r(n);const e=flarum.core.compat["admin/app"];var t=o.n(e);const r=flarum.core.compat["common/app"];var a=o.n(r);const i=flarum.core.compat["common/extend"],s=flarum.core.compat["common/components/Page"];var c=o.n(s);const l={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){return a().forum.attribute("fof-nightmode.default_theme")||0}};var d=o(116),f="flarum_nightmode",m=function(){var e=d.get(f);return e||"0"===e?Number(e):l.DEFAULT()};function u(){var e=Array.from(new Set(Object.values(l))),t=m();isNaN(t)?p("Theme is not a valid integer! Resetting..."):e.includes(t)||p("Theme is out of bounds! Resetting...")}function p(e){var t;console.warn(e),t=l.DEFAULT(),d.set(f,t,{sameSite:"lax",secure:"https:"===location.protocol})}function h(){var e,t=a().session.user,o=!t||!!t.preferences().fofNightMode_perDevice,n=t&&t.preferences().fofNightMode;return o?e=m():"number"==typeof n&&-1!==n&&(e=n),"number"==typeof e?e:l.DEFAULT()}function g(){var e,t,o=a().session.user,n=null==(e=a().session.user)?void 0:e.preferences().fofNightMode_perDevice;o&&!n||u(),n&&u(),y((t=h())===l.DARK?"night":t===l.LIGHT?"day":window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}function v(){return{day:a().data["fof-nightmode.assets.day"],night:a().data["fof-nightmode.assets.night"]}}function y(e){var t=document.querySelector("link.nightmode-light[rel=stylesheet]"),o=document.querySelector("link.nightmode-dark[rel=stylesheet]");if(t&&o){if(h()===l.AUTO)return;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=v()[e],document.head.append(n)}else{var r=t||o||document.querySelector("link.nightmode[rel=stylesheet]"),a=v()[e];a!==r.href&&(r.href=a,r.className="nightmode")}}t().initializers.add("fof-nightmode",(function(){var e;t().extensionData.for("fof-nightmode").registerSetting({label:t().translator.trans("fof-nightmode.admin.settings.modal.always_show_theme_toggle_on_header"),setting:"fofNightMode.show_theme_toggle_on_header_always",type:"switch"}).registerSetting({label:t().translator.trans("fof-nightmode.admin.settings.modal.default_theme"),setting:"fof-nightmode.default_theme",type:"select",options:(e={},Object.keys(l).forEach((function(o,n){"DEFAULT"!==o&&(e[n]=t().translator.trans("fof-nightmode.admin.settings.modal.theme_"+o.toLowerCase()))})),e)}).registerSetting({label:t().translator.trans("fof-nightmode.admin.settings.modal.default_theme_helper"),type:"hidden"}),(0,i.extend)(c().prototype,"oninit",g)}))})(),module.exports=n})(); +(()=>{var e={116:function(e,t){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,o=1,n=arguments.length;o{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";o.r(n),o.d(n,{Themes:()=>i,setSelectedTheme:()=>e});var e={};o.r(e),o.d(e,{default:()=>h,getUrls:()=>v,setStyle:()=>_,setTheme:()=>g,setThemeFromID:()=>y});const t=flarum.core.compat["common/app"];var r=o.n(t);const i={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){return r().forum.attribute("fof-nightmode.default_theme")||0}},a=flarum.core.compat["common/extend"],s=flarum.core.compat["common/components/Page"];var c=o.n(s),l=o(116),d="flarum_nightmode",m=function(){var e=l.get(d);return e||"0"===e?Number(e):i.DEFAULT()};function f(){var e=Array.from(new Set(Object.values(i))),t=m();isNaN(t)?u("Theme is not a valid integer! Resetting..."):e.includes(t)||u("Theme is out of bounds! Resetting...")}function u(e){var t;console.warn(e),t=i.DEFAULT(),l.set(d,t,{sameSite:"lax",secure:"https:"===location.protocol})}function p(){var e,t=r().session.user,o=!t||!!t.preferences().fofNightMode_perDevice,n=t&&t.preferences().fofNightMode;return o?e=m():"number"==typeof n&&-1!==n&&(e=n),"number"==typeof e?e:i.DEFAULT()}const h=function(){(0,a.extend)(c().prototype,"oninit",g)};function g(){var e,t=r().session.user,o=null==(e=r().session.user)?void 0:e.preferences().fofNightMode_perDevice;t&&!o||f(),o&&f(),y(p())}function v(){return{day:r().data["fof-nightmode.assets.day"],night:r().data["fof-nightmode.assets.night"]}}function y(e){e===i.DARK?_("night"):e===i.LIGHT?_("day"):_(window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}function _(e){var t=document.querySelector("link.nightmode-light[rel=stylesheet]"),o=document.querySelector("link.nightmode-dark[rel=stylesheet]");if(t&&o){if(p()===i.AUTO)return;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=v()[e],document.head.append(n)}else{var r=t||o||document.querySelector("link.nightmode[rel=stylesheet]"),a=v()[e];a!==r.href&&(r.href=a,r.className="nightmode")}}const b=flarum.core.compat["admin/app"];var S=o.n(b);S().initializers.add("fof-nightmode",(function(){var e;S().extensionData.for("fof-nightmode").registerSetting({label:S().translator.trans("fof-nightmode.admin.settings.modal.always_show_theme_toggle_on_header"),setting:"fofNightMode.show_theme_toggle_on_header_always",type:"switch"}).registerSetting({label:S().translator.trans("fof-nightmode.admin.settings.modal.default_theme"),setting:"fof-nightmode.default_theme",type:"select",options:(e={},Object.keys(i).forEach((function(t,o){"DEFAULT"!==t&&(e[o]=S().translator.trans("fof-nightmode.admin.settings.modal.theme_"+t.toLowerCase()))})),e)}).registerSetting({label:S().translator.trans("fof-nightmode.admin.settings.modal.default_theme_helper"),type:"hidden"}),h()}))})(),module.exports=n})(); //# 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 ca29dcd..9e8f4c4 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/./node_modules/es-cookie/src/es-cookie.js","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['admin/app']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/app']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./src/common/Themes.js","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.js","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.js","webpack://@fof/nightmode/./src/forum/getTheme.js","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/./src/admin/index.js"],"sourcesContent":["\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nexports.__esModule = true;\r\nfunction stringifyAttribute(name, value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var stringified = '; ' + name;\r\n if (value === true) {\r\n return stringified; // boolean attributes shouldn't have a value\r\n }\r\n return stringified + '=' + value;\r\n}\r\nfunction stringifyAttributes(attributes) {\r\n if (typeof attributes.expires === 'number') {\r\n var expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\r\n attributes.expires = expires;\r\n }\r\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\r\n + stringifyAttribute('Domain', attributes.domain)\r\n + stringifyAttribute('Path', attributes.path)\r\n + stringifyAttribute('Secure', attributes.secure)\r\n + stringifyAttribute('SameSite', attributes.sameSite);\r\n}\r\nfunction encode(name, value, attributes) {\r\n return encodeURIComponent(name)\r\n .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) // allowed special characters\r\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\r\n + '=' + encodeURIComponent(value)\r\n // allowed special characters\r\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)\r\n + stringifyAttributes(attributes);\r\n}\r\nexports.encode = encode;\r\nfunction parse(cookieString) {\r\n var result = {};\r\n var cookies = cookieString ? cookieString.split('; ') : [];\r\n var rdecode = /(%[\\dA-F]{2})+/gi;\r\n for (var i = 0; i < cookies.length; i++) {\r\n var parts = cookies[i].split('=');\r\n var cookie = parts.slice(1).join('=');\r\n if (cookie.charAt(0) === '\"') {\r\n cookie = cookie.slice(1, -1);\r\n }\r\n try {\r\n var name_1 = parts[0].replace(rdecode, decodeURIComponent);\r\n result[name_1] = cookie.replace(rdecode, decodeURIComponent);\r\n }\r\n catch (e) {\r\n // ignore cookies with invalid name/value encoding\r\n }\r\n }\r\n return result;\r\n}\r\nexports.parse = parse;\r\nfunction getAll() {\r\n return parse(document.cookie);\r\n}\r\nexports.getAll = getAll;\r\nfunction get(name) {\r\n return getAll()[name];\r\n}\r\nexports.get = get;\r\nfunction set(name, value, attributes) {\r\n document.cookie = encode(name, value, __assign({ path: '/' }, attributes));\r\n}\r\nexports.set = set;\r\nfunction remove(name, attributes) {\r\n set(name, '', __assign(__assign({}, attributes), { expires: -1 }));\r\n}\r\nexports.remove = remove;\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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['admin/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Page'];","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","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:',\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 () => {\n extend(Page.prototype, 'oninit', 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 if (light && dark) {\n if (getTheme() === Themes.AUTO) return;\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","import app from 'flarum/admin/app';\nimport setSelectedTheme from '../common/setSelectedTheme';\nimport Themes from '../common/Themes';\n\nfunction populateThemes() {\n let options = {};\n\n // add themes based on JS enum\n Object.keys(Themes).forEach((theme, i) => {\n if (theme === 'DEFAULT') return;\n\n options[i] = app.translator.trans(`fof-nightmode.admin.settings.modal.theme_${theme.toLowerCase()}`);\n });\n\n return options;\n}\n\napp.initializers.add('fof-nightmode', () => {\n app.extensionData\n .for('fof-nightmode')\n .registerSetting({\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 .registerSetting({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme'),\n setting: 'fof-nightmode.default_theme',\n type: 'select',\n options: populateThemes(),\n })\n .registerSetting({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme_helper'),\n type: 'hidden',\n });\n\n setSelectedTheme();\n});\n"],"names":["__assign","this","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","stringifyAttribute","name","value","stringified","encode","attributes","encodeURIComponent","replace","decodeURIComponent","expires","Date","setMilliseconds","getMilliseconds","toUTCString","domain","path","secure","sameSite","stringifyAttributes","parse","cookieString","result","cookies","split","rdecode","parts","cookie","slice","join","charAt","e","getAll","document","set","exports","__esModule","get","remove","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","module","__webpack_modules__","getter","d","a","definition","key","o","defineProperty","enumerable","obj","prop","r","Symbol","toStringTag","flarum","core","compat","AUTO","LIGHT","DARK","DEFAULT","app","KEY","Cookies","Number","Themes","fixInvalidThemeSetting","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","val","console","warn","location","protocol","getTheme","user","IsUsingPerDeviceSettings","preferences","fofNightMode_perDevice","SelectedTheme","fofNightMode","setTheme","theme","PerDevice","setStyle","window","matchMedia","matches","getUrls","day","night","type","light","querySelector","dark","newLink","createElement","onload","rel","className","href","head","append","el","url","options","registerSetting","label","setting","keys","forEach","toLowerCase","extend","Page"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"admin.js","mappings":"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","sources":["webpack://@fof/nightmode/./node_modules/es-cookie/src/es-cookie.js","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.js","webpack://@fof/nightmode/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.js","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.js","webpack://@fof/nightmode/./src/forum/getTheme.js","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/nightmode/./src/admin/index.js"],"sourcesContent":["\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nexports.__esModule = true;\r\nfunction stringifyAttribute(name, value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var stringified = '; ' + name;\r\n if (value === true) {\r\n return stringified; // boolean attributes shouldn't have a value\r\n }\r\n return stringified + '=' + value;\r\n}\r\nfunction stringifyAttributes(attributes) {\r\n if (typeof attributes.expires === 'number') {\r\n var expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\r\n attributes.expires = expires;\r\n }\r\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\r\n + stringifyAttribute('Domain', attributes.domain)\r\n + stringifyAttribute('Path', attributes.path)\r\n + stringifyAttribute('Secure', attributes.secure)\r\n + stringifyAttribute('SameSite', attributes.sameSite);\r\n}\r\nfunction encode(name, value, attributes) {\r\n return encodeURIComponent(name)\r\n .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) // allowed special characters\r\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\r\n + '=' + encodeURIComponent(value)\r\n // allowed special characters\r\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)\r\n + stringifyAttributes(attributes);\r\n}\r\nexports.encode = encode;\r\nfunction parse(cookieString) {\r\n var result = {};\r\n var cookies = cookieString ? cookieString.split('; ') : [];\r\n var rdecode = /(%[\\dA-F]{2})+/gi;\r\n for (var i = 0; i < cookies.length; i++) {\r\n var parts = cookies[i].split('=');\r\n var cookie = parts.slice(1).join('=');\r\n if (cookie.charAt(0) === '\"') {\r\n cookie = cookie.slice(1, -1);\r\n }\r\n try {\r\n var name_1 = parts[0].replace(rdecode, decodeURIComponent);\r\n result[name_1] = cookie.replace(rdecode, decodeURIComponent);\r\n }\r\n catch (e) {\r\n // ignore cookies with invalid name/value encoding\r\n }\r\n }\r\n return result;\r\n}\r\nexports.parse = parse;\r\nfunction getAll() {\r\n return parse(document.cookie);\r\n}\r\nexports.getAll = getAll;\r\nfunction get(name) {\r\n return getAll()[name];\r\n}\r\nexports.get = get;\r\nfunction set(name, value, attributes) {\r\n document.cookie = encode(name, value, __assign({ path: '/' }, attributes));\r\n}\r\nexports.set = set;\r\nfunction remove(name, attributes) {\r\n set(name, '', __assign(__assign({}, attributes), { expires: -1 }));\r\n}\r\nexports.remove = remove;\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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'];","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:',\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 () => {\n extend(Page.prototype, 'oninit', 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 if (light && dark) {\n if (getTheme() === Themes.AUTO) return;\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 __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","import app from 'flarum/admin/app';\nimport setSelectedTheme from '../common/setSelectedTheme';\nimport Themes from '../common/Themes';\n\nfunction populateThemes() {\n let options = {};\n\n // add themes based on JS enum\n Object.keys(Themes).forEach((theme, i) => {\n if (theme === 'DEFAULT') return;\n\n options[i] = app.translator.trans(`fof-nightmode.admin.settings.modal.theme_${theme.toLowerCase()}`);\n });\n\n return options;\n}\n\napp.initializers.add('fof-nightmode', () => {\n app.extensionData\n .for('fof-nightmode')\n .registerSetting({\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 .registerSetting({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme'),\n setting: 'fof-nightmode.default_theme',\n type: 'select',\n options: populateThemes(),\n })\n .registerSetting({\n label: app.translator.trans('fof-nightmode.admin.settings.modal.default_theme_helper'),\n type: 'hidden',\n });\n\n setSelectedTheme();\n});\n"],"names":["__assign","this","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","stringifyAttribute","name","value","stringified","encode","attributes","encodeURIComponent","replace","decodeURIComponent","expires","Date","setMilliseconds","getMilliseconds","toUTCString","domain","path","secure","sameSite","stringifyAttributes","parse","cookieString","result","cookies","split","rdecode","parts","cookie","slice","join","charAt","e","getAll","document","set","exports","__esModule","get","remove","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","module","__webpack_modules__","getter","d","a","definition","key","o","defineProperty","enumerable","obj","prop","r","Symbol","toStringTag","flarum","core","compat","AUTO","LIGHT","DARK","DEFAULT","app","KEY","Cookies","Number","Themes","fixInvalidThemeSetting","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","val","console","warn","location","protocol","getTheme","user","IsUsingPerDeviceSettings","preferences","fofNightMode_perDevice","SelectedTheme","fofNightMode","extend","Page","setTheme","PerDevice","setThemeFromID","getUrls","day","night","theme","setStyle","window","matchMedia","matches","type","light","querySelector","dark","newLink","createElement","onload","rel","className","href","head","append","el","url","options","registerSetting","label","setting","keys","forEach","toLowerCase","setSelectedTheme"],"sourceRoot":""} \ No newline at end of file diff --git a/js/dist/forum.js b/js/dist/forum.js index b6da50d..bf10353 100755 --- a/js/dist/forum.js +++ b/js/dist/forum.js @@ -1,2 +1,2 @@ -(()=>{var e={116:function(e,o){"use strict";var t=this&&this.__assign||function(){return t=Object.assign||function(e){for(var o,t=1,n=arguments.length;t{var o=e&&e.__esModule?()=>e.default:()=>e;return t.d(o,{a:o}),o},t.d=(e,o)=>{for(var n in o)t.o(o,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:o[n]})},t.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";t.r(n);const e=flarum.core.compat["forum/app"];var o=t.n(e);const r=flarum.core.compat["common/extend"],i=flarum.core.compat["forum/components/SettingsPage"];var c=t.n(i);const s=flarum.core.compat["forum/components/SessionDropdown"];var a=t.n(s);const u=flarum.core.compat["forum/components/HeaderSecondary"];var f=t.n(u);const d=flarum.core.compat["common/components/Button"];var p=t.n(d);const l=flarum.core.compat["common/components/LoadingIndicator"];var h=t.n(l);const g=flarum.core.compat["common/components/Select"];var v=t.n(g);const y=flarum.core.compat["common/components/FieldSet"];var _=t.n(y);const T=flarum.core.compat["common/components/Switch"];var S=t.n(T);const b=flarum.core.compat["common/app"];var A=t.n(b);const N=flarum.core.compat["common/components/Page"];var U=t.n(N);const x={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){return A().forum.attribute("fof-nightmode.default_theme")||0}};var D=t(116),M="flarum_nightmode",O=function(){var e=D.get(M);return e||"0"===e?Number(e):x.DEFAULT()},w=function(e){return D.set(M,e,{sameSite:"lax",secure:"https:"===location.protocol})};function I(){var e=Array.from(new Set(Object.values(x))),o=O();isNaN(o)?k("Theme is not a valid integer! Resetting..."):e.includes(o)||k("Theme is out of bounds! Resetting...")}function k(e){console.warn(e),w(x.DEFAULT())}function R(){var e,o=A().session.user,t=!o||!!o.preferences().fofNightMode_perDevice,n=o&&o.preferences().fofNightMode;return t?e=O():"number"==typeof n&&-1!==n&&(e=n),"number"==typeof e?e:x.DEFAULT()}function L(){var e,o,t=A().session.user,n=null==(e=A().session.user)?void 0:e.preferences().fofNightMode_perDevice;t&&!n||I(),n&&I(),C((o=R())===x.DARK?"night":o===x.LIGHT?"day":window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day")}function P(){return{day:A().data["fof-nightmode.assets.day"],night:A().data["fof-nightmode.assets.night"]}}function C(e){var o=document.querySelector("link.nightmode-light[rel=stylesheet]"),t=document.querySelector("link.nightmode-dark[rel=stylesheet]");if(o&&t){if(R()===x.AUTO)return;var n=document.createElement("link");"onload"in n?n.onload=function(){o.remove(),t.remove()}:(o.remove(),t.remove()),n.rel="stylesheet",n.className="nightmode",n.href=P()[e],document.head.append(n)}else{var r=o||t||document.querySelector("link.nightmode[rel=stylesheet]"),i=P()[e];i!==r.href&&(r.href=i,r.className="nightmode")}}function j(e){return e===x.LIGHT||e===x.AUTO&&!window.matchMedia("(prefers-color-scheme: dark)").matches}function E(){var e,t=R(),n=j(t),r=o().session.user;if(r){var i=n?x.DARK:x.LIGHT;if(r.preferences().fofNightMode_perDevice)return w(i),void L();r.savePreferences({fofNightMode:i}).then((function(){L()}))}else{var c=(e=t)===x.AUTO?x.LIGHT:e===x.LIGHT?x.DARK:x.AUTO;w(c),L()}}var F=function(e){return o().translator.trans("fof-nightmode.forum.user.settings."+e)};o().initializers.add("fof-nightmode",(function(){(0,r.extend)(c().prototype,"settingsItems",(function(e){var t=o().session.user,n=!!t.preferences().fofNightMode_perDevice;n&&I();var r=!window.matchMedia("not all and (prefers-color-scheme), (prefers-color-scheme)").matches,i=R(),c={0:F("options.auto"),1:F("options.day"),2:F("options.night")};r&&(delete c[0],i===x.AUTO&&(i=o().forum.attribute("fofNightMode_autoUnsupportedFallback"))),e.add("fof-nightmode",_().component({label:F("heading"),className:"Settings-theme"},[m("p",{className:"description"},F("description")),m("p",{className:"description"},F("description2")),r?m("p",{class:"description NightMode-autoUnsupported"},F("auto_unsupported")):null,S().component({className:"Settings-theme--per_device_cb",state:n,onchange:function(e){e?w(i):D.remove(M),t.savePreferences({fofNightMode_perDevice:e}).then((function(){L()}))}},F("device_specific_setting_checkbox")),v().component({value:i,className:"Settings-theme--input",onchange:function(e){if(n)return w(e),void L();t.savePreferences({fofNightMode:e}).then((function(){m.redraw(),L()}))},options:c}),m("p",{className:"Settings-theme--selection_description"},i===x.AUTO?F("option_descriptions.auto"):i===x.LIGHT?F("option_descriptions.day"):i===x.DARK?F("option_descriptions.night"):h().component())]))})),(0,r.extend)(f().prototype,"items",(function(e){if(!o().session.user||o().forum.attribute("fofNightMode.showThemeToggleOnHeaderAlways")){var t=R(),n=j(t);e.add("nightmode",m(p(),{className:"Button Button--flat",onclick:function(){E()},icon:t===x.AUTO?"fas fa-adjust":"far fa-"+(n?"sun":"moon")},o().translator.trans("fof-nightmode.forum.header.nightmode_button")),15)}})),(0,r.extend)(a().prototype,"items",(function(e){if(o().session.user){var t=j(R());e.add(t?"nightmode":"daymode",p().component({icon:"far fa-"+(t?"moon":"sun"),onclick:function(){E()}},o().translator.trans("fof-nightmode.forum."+(t?"night":"day"))),-1)}})),(0,r.extend)(U().prototype,"oninit",L)}))})(),module.exports=n})(); +(()=>{var e={116:function(e,t){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,o=1,n=arguments.length;o{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";o.r(n),o.d(n,{Themes:()=>c,getTheme:()=>T,perDeviceSetting:()=>e,setSelectedTheme:()=>t,switchTheme:()=>r});var e={};o.r(e),o.d(e,{KEY:()=>p,get:()=>l,remove:()=>g,set:()=>h});var t={};o.r(t),o.d(t,{default:()=>S,getUrls:()=>b,setStyle:()=>N,setTheme:()=>_,setThemeFromID:()=>A});var r={};o.r(r),o.d(r,{getIsLight:()=>K,switchTheme:()=>q});const i=flarum.core.compat["common/app"];var s=o.n(i);const c={AUTO:0,LIGHT:1,DARK:2,DEFAULT:function(){return s().forum.attribute("fof-nightmode.default_theme")||0}},a=flarum.core.compat["common/extend"],u=flarum.core.compat["common/components/Page"];var f=o.n(u),d=o(116),p="flarum_nightmode",l=function(){var e=d.get(p);return e||"0"===e?Number(e):c.DEFAULT()},h=function(e){return d.set(p,e,{sameSite:"lax",secure:"https:"===location.protocol})},g=function(){return d.remove(p)};function v(){var e=Array.from(new Set(Object.values(c))),t=l();isNaN(t)?y("Theme is not a valid integer! Resetting..."):e.includes(t)||y("Theme is out of bounds! Resetting...")}function y(e){console.warn(e),h(c.DEFAULT())}function T(){var e,t=s().session.user,o=!t||!!t.preferences().fofNightMode_perDevice,n=t&&t.preferences().fofNightMode;return o?e=l():"number"==typeof n&&-1!==n&&(e=n),"number"==typeof e?e:c.DEFAULT()}const S=function(){(0,a.extend)(f().prototype,"oninit",_)};function _(){var e,t=s().session.user,o=null==(e=s().session.user)?void 0:e.preferences().fofNightMode_perDevice;t&&!o||v(),o&&v(),A(T())}function b(){return{day:s().data["fof-nightmode.assets.day"],night:s().data["fof-nightmode.assets.night"]}}function A(e){e===c.DARK?N("night"):e===c.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]"),o=document.querySelector("link.nightmode-dark[rel=stylesheet]");if(t&&o){if(T()===c.AUTO)return;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=b()[e],document.head.append(n)}else{var r=t||o||document.querySelector("link.nightmode[rel=stylesheet]"),i=b()[e];i!==r.href&&(r.href=i,r.className="nightmode")}}const D=flarum.core.compat["forum/app"];var U=o.n(D);const x=flarum.core.compat["forum/components/SettingsPage"];var M=o.n(x);const w=flarum.core.compat["forum/components/SessionDropdown"];var O=o.n(w);const I=flarum.core.compat["forum/components/HeaderSecondary"];var k=o.n(I);const L=flarum.core.compat["common/components/Button"];var R=o.n(L);const P=flarum.core.compat["common/components/LoadingIndicator"];var C=o.n(P);const E=flarum.core.compat["common/components/Select"];var F=o.n(E);const j=flarum.core.compat["common/components/FieldSet"];var H=o.n(j);const B=flarum.core.compat["common/components/Switch"];var G=o.n(B);function K(e){return e===c.LIGHT||e===c.AUTO&&!window.matchMedia("(prefers-color-scheme: dark)").matches}function q(){var e,t=T(),o=K(t),n=U().session.user;if(n){var r=o?c.DARK:c.LIGHT;if(n.preferences().fofNightMode_perDevice)return h(r),void _();n.savePreferences({fofNightMode:r}).then((function(){_()}))}else{var i=(e=t)===c.AUTO?c.LIGHT:e===c.LIGHT?c.DARK:c.AUTO;h(i),_()}}var z=function(e){return U().translator.trans("fof-nightmode.forum.user.settings."+e)};U().initializers.add("fof-nightmode",(function(){(0,a.extend)(M().prototype,"settingsItems",(function(e){var t=U().session.user,o=!!t.preferences().fofNightMode_perDevice;o&&v();var n=!window.matchMedia("not all and (prefers-color-scheme), (prefers-color-scheme)").matches,r=T(),i={0:z("options.auto"),1:z("options.day"),2:z("options.night")};n&&(delete i[0],r===c.AUTO&&(r=U().forum.attribute("fofNightMode_autoUnsupportedFallback"))),e.add("fof-nightmode",H().component({label:z("heading"),className:"Settings-theme"},[m("p",{className:"description"},z("description")),m("p",{className:"description"},z("description2")),n?m("p",{class:"description NightMode-autoUnsupported"},z("auto_unsupported")):null,G().component({className:"Settings-theme--per_device_cb",state:o,onchange:function(e){e?h(r):g(),t.savePreferences({fofNightMode_perDevice:e}).then((function(){_()}))}},z("device_specific_setting_checkbox")),F().component({value:r,className:"Settings-theme--input",onchange:function(e){if(o)return h(e),void _();t.savePreferences({fofNightMode:e}).then((function(){m.redraw(),_()}))},options:i}),m("p",{className:"Settings-theme--selection_description"},r===c.AUTO?z("option_descriptions.auto"):r===c.LIGHT?z("option_descriptions.day"):r===c.DARK?z("option_descriptions.night"):C().component())]))})),(0,a.extend)(k().prototype,"items",(function(e){if(!U().session.user||U().forum.attribute("fofNightMode.showThemeToggleOnHeaderAlways")){var t=T(),o=K(t);e.add("nightmode",m(R(),{className:"Button Button--flat",onclick:function(){q()},icon:t===c.AUTO?"fas fa-adjust":"far fa-"+(o?"sun":"moon")},U().translator.trans("fof-nightmode.forum.header.nightmode_button")),15)}})),(0,a.extend)(O().prototype,"items",(function(e){if(U().session.user){var t=K(T());e.add(t?"nightmode":"daymode",R().component({icon:"far fa-"+(t?"moon":"sun"),onclick:function(){q()}},U().translator.trans("fof-nightmode.forum."+(t?"night":"day"))),-1)}})),S()}))})(),module.exports=n})(); //# 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 af8c9f7..085c4d9 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/./node_modules/es-cookie/src/es-cookie.js","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['forum/app']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/extend']\"","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/external root \"flarum.core.compat['common/app']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./src/common/Themes.js","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.js","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.js","webpack://@fof/nightmode/./src/forum/getTheme.js","webpack://@fof/nightmode/./src/common/setSelectedTheme.js","webpack://@fof/nightmode/./src/forum/helpers/switchTheme.js","webpack://@fof/nightmode/./src/forum/addSettingsItems.js","webpack://@fof/nightmode/./src/forum/index.ts"],"sourcesContent":["\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nexports.__esModule = true;\r\nfunction stringifyAttribute(name, value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var stringified = '; ' + name;\r\n if (value === true) {\r\n return stringified; // boolean attributes shouldn't have a value\r\n }\r\n return stringified + '=' + value;\r\n}\r\nfunction stringifyAttributes(attributes) {\r\n if (typeof attributes.expires === 'number') {\r\n var expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\r\n attributes.expires = expires;\r\n }\r\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\r\n + stringifyAttribute('Domain', attributes.domain)\r\n + stringifyAttribute('Path', attributes.path)\r\n + stringifyAttribute('Secure', attributes.secure)\r\n + stringifyAttribute('SameSite', attributes.sameSite);\r\n}\r\nfunction encode(name, value, attributes) {\r\n return encodeURIComponent(name)\r\n .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) // allowed special characters\r\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\r\n + '=' + encodeURIComponent(value)\r\n // allowed special characters\r\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)\r\n + stringifyAttributes(attributes);\r\n}\r\nexports.encode = encode;\r\nfunction parse(cookieString) {\r\n var result = {};\r\n var cookies = cookieString ? cookieString.split('; ') : [];\r\n var rdecode = /(%[\\dA-F]{2})+/gi;\r\n for (var i = 0; i < cookies.length; i++) {\r\n var parts = cookies[i].split('=');\r\n var cookie = parts.slice(1).join('=');\r\n if (cookie.charAt(0) === '\"') {\r\n cookie = cookie.slice(1, -1);\r\n }\r\n try {\r\n var name_1 = parts[0].replace(rdecode, decodeURIComponent);\r\n result[name_1] = cookie.replace(rdecode, decodeURIComponent);\r\n }\r\n catch (e) {\r\n // ignore cookies with invalid name/value encoding\r\n }\r\n }\r\n return result;\r\n}\r\nexports.parse = parse;\r\nfunction getAll() {\r\n return parse(document.cookie);\r\n}\r\nexports.getAll = getAll;\r\nfunction get(name) {\r\n return getAll()[name];\r\n}\r\nexports.get = get;\r\nfunction set(name, value, attributes) {\r\n document.cookie = encode(name, value, __assign({ path: '/' }, attributes));\r\n}\r\nexports.set = set;\r\nfunction remove(name, attributes) {\r\n set(name, '', __assign(__assign({}, attributes), { expires: -1 }));\r\n}\r\nexports.remove = remove;\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","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'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Page'];","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","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:',\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 () => {\n extend(Page.prototype, 'oninit', 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 if (light && dark) {\n if (getTheme() === Themes.AUTO) return;\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","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\napp.initializers.add('fof-nightmode', () => {\n addSettingsItems();\n setSelectedTheme();\n});\n"],"names":["__assign","this","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","stringifyAttribute","name","value","stringified","encode","attributes","encodeURIComponent","replace","decodeURIComponent","expires","Date","setMilliseconds","getMilliseconds","toUTCString","domain","path","secure","sameSite","stringifyAttributes","parse","cookieString","result","cookies","split","rdecode","parts","cookie","slice","join","charAt","e","getAll","document","set","exports","__esModule","get","remove","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","module","__webpack_modules__","getter","d","a","definition","key","o","defineProperty","enumerable","obj","prop","r","Symbol","toStringTag","flarum","core","compat","AUTO","LIGHT","DARK","DEFAULT","app","KEY","Cookies","Number","Themes","val","location","protocol","fixInvalidThemeSetting","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","console","warn","getTheme","user","IsUsingPerDeviceSettings","preferences","fofNightMode_perDevice","SelectedTheme","fofNightMode","setTheme","theme","PerDevice","setStyle","window","matchMedia","matches","getUrls","day","night","type","light","querySelector","dark","newLink","createElement","onload","rel","className","href","head","append","el","url","getIsLight","switchTheme","current","isLight","perDevice","savePreferences","then","newTheme","trans","extend","SettingsPage","items","doesNotSupportAuto","currentTheme","options","add","FieldSet","label","class","Switch","state","onchange","checked","Select","m","redraw","LoadingIndicator","HeaderSecondary","onclick","icon","SessionDropdown","Button","Page"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum.js","mappings":"4CACA,IAAIA,EAAYC,MAAQA,KAAKD,UAAa,WAStC,OARAA,EAAWE,OAAOC,QAAU,SAASC,GACjC,IAAK,IAAIC,EAAGC,EAAI,EAAGC,EAAIC,UAAUC,OAAQH,EAAIC,EAAGD,IAE5C,IAAK,IAAII,KADTL,EAAIG,UAAUF,GACOJ,OAAOS,UAAUC,eAAeC,KAAKR,EAAGK,KACzDN,EAAEM,GAAKL,EAAEK,IAEjB,OAAON,CACV,EACMJ,EAASc,MAAMb,KAAMO,UAC/B,EAED,SAASO,EAAmBC,EAAMC,GAC9B,IAAKA,EACD,MAAO,GAEX,IAAIC,EAAc,KAAOF,EACzB,OAAc,IAAVC,EACOC,EAEJA,EAAc,IAAMD,CAC9B,CAaD,SAASE,EAAOH,EAAMC,EAAOG,GACzB,OAAOC,mBAAmBL,GACrBM,QAAQ,2BAA4BC,oBACpCD,QAAQ,MAAO,OAAOA,QAAQ,MAAO,OACpC,IAAMD,mBAAmBJ,GAE1BK,QAAQ,4DAA6DC,oBAlB9E,SAA6BH,GACzB,GAAkC,iBAAvBA,EAAWI,QAAsB,CACxC,IAAIA,EAAU,IAAIC,KAClBD,EAAQE,gBAAgBF,EAAQG,kBAAyC,MAArBP,EAAWI,SAC/DJ,EAAWI,QAAUA,CACxB,CACD,OAAOT,EAAmB,UAAWK,EAAWI,QAAUJ,EAAWI,QAAQI,cAAgB,IACvFb,EAAmB,SAAUK,EAAWS,QACxCd,EAAmB,OAAQK,EAAWU,MACtCf,EAAmB,SAAUK,EAAWW,QACxChB,EAAmB,WAAYK,EAAWY,SACnD,CAQSC,CAAoBb,EAC7B,CAED,SAASc,EAAMC,GAIX,IAHA,IAAIC,EAAS,CAAC,EACVC,EAAUF,EAAeA,EAAaG,MAAM,MAAQ,GACpDC,EAAU,mBACLjC,EAAI,EAAGA,EAAI+B,EAAQ5B,OAAQH,IAAK,CACrC,IAAIkC,EAAQH,EAAQ/B,GAAGgC,MAAM,KACzBG,EAASD,EAAME,MAAM,GAAGC,KAAK,KACR,MAArBF,EAAOG,OAAO,KACdH,EAASA,EAAOC,MAAM,GAAI,IAE9B,IAEIN,EADaI,EAAM,GAAGlB,QAAQiB,EAAShB,qBACtBkB,EAAOnB,QAAQiB,EAAShB,mBAI5C,CAFD,MAAOsB,GAEN,CACJ,CACD,OAAOT,CACV,CAED,SAASU,IACL,OAAOZ,EAAMa,SAASN,OACzB,CAMD,SAASO,EAAIhC,EAAMC,EAAOG,GACtB2B,SAASN,OAAStB,EAAOH,EAAMC,EAAOjB,EAAS,CAAE8B,KAAM,KAAOV,GACjE,CAhED6B,EAAQC,YAAa,EAgCrBD,EAAQ9B,OAASA,EAqBjB8B,EAAQf,MAAQA,EAIhBe,EAAQH,OAASA,EAIjBG,EAAQE,IAHR,SAAanC,GACT,OAAO8B,IAAS9B,EACnB,EAKDiC,EAAQD,IAAMA,EAIdC,EAAQG,OAHR,SAAgBpC,EAAMI,GAClB4B,EAAIhC,EAAM,GAAIhB,EAASA,EAAS,CAAC,EAAGoB,GAAa,CAAEI,SAAU,IAChE,C,GC/EG6B,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaP,QAGrB,IAAIS,EAASL,EAAyBE,GAAY,CAGjDN,QAAS,CAAC,GAOX,OAHAU,EAAoBJ,GAAU1C,KAAK6C,EAAOT,QAASS,EAAQA,EAAOT,QAASK,GAGpEI,EAAOT,OACf,CCrBAK,EAAoB/C,EAAKmD,IACxB,IAAIE,EAASF,GAAUA,EAAOR,WAC7B,IAAOQ,EAAiB,QACxB,IAAM,EAEP,OADAJ,EAAoBO,EAAED,EAAQ,CAAEE,EAAGF,IAC5BA,CAAM,ECLdN,EAAoBO,EAAI,CAACZ,EAASc,KACjC,IAAI,IAAIC,KAAOD,EACXT,EAAoBW,EAAEF,EAAYC,KAASV,EAAoBW,EAAEhB,EAASe,IAC5E9D,OAAOgE,eAAejB,EAASe,EAAK,CAAEG,YAAY,EAAMhB,IAAKY,EAAWC,IAE1E,ECNDV,EAAoBW,EAAI,CAACG,EAAKC,IAAUnE,OAAOS,UAAUC,eAAeC,KAAKuD,EAAKC,GCClFf,EAAoBgB,EAAKrB,IACH,oBAAXsB,QAA0BA,OAAOC,aAC1CtE,OAAOgE,eAAejB,EAASsB,OAAOC,YAAa,CAAEvD,MAAO,WAE7Df,OAAOgE,eAAejB,EAAS,aAAc,CAAEhC,OAAO,GAAO,E,gXCL9D,MAAM,EAA+BwD,OAAOC,KAAKC,OAAO,c,aCmBxD,QATe,CACbC,KAAM,EACNC,MAAO,EACPC,KAAM,EAGNC,QAAS,kBAAMC,IAAAA,MAAAA,UAAoB,gCAAkC,CAA5D,GChBL,EAA+BP,OAAOC,KAAKC,OAAO,iBCAlD,EAA+BF,OAAOC,KAAKC,OAAO,0B,sBCG3CM,EAAM,mBAEN9B,EAAM,WACjB,IAAMlC,EAAQiE,EAAAA,IAAYD,GAE1B,OAAKhE,GAAmB,MAAVA,EAIPkE,OAAOlE,GAHLmE,EAAAA,SAIV,EAEYpC,EAAM,SAACqC,GAAD,OACjBH,EAAAA,IAAYD,EAAKI,EAAK,CACpBrD,SAAU,MACVD,OAA8B,WAAtBuD,SAASC,UAHF,EAMNnC,EAAS,kBAAM8B,EAAAA,OAAeD,EAArB,ECTP,SAASO,IAEtB,IAAIC,EAAcC,MAAMC,KAAK,IAAIC,IAAI1F,OAAO2F,OAAOT,KAE7CU,EAAQ3C,IAEV4C,MAAMD,GACRE,EAAW,8CACDP,EAAYQ,SAASH,IAE/BE,EAAW,uCAEd,CAED,SAASA,EAAWE,GAClBC,QAAQC,KAAKF,GAEblD,EAAIoC,EAAAA,UACL,CC1Bc,SAASiB,IACtB,IAKIpF,EALEqF,EAAOtB,IAAAA,QAAAA,KAEPuB,GAA4BD,KAAUA,EAAKE,cAAcC,uBACzDC,EAAgBJ,GAAQA,EAAKE,cAAcG,aAcjD,OAVIJ,EAEFtF,EAAQkC,IAEqB,iBAAlBuD,IAAiD,IAAnBA,IAEvCzF,EAAQyF,GAIY,iBAAVzF,EAAqBA,EAAQmE,EAAAA,SAC5C,CCdD,oBACEwB,EAAAA,EAAAA,QAAOC,IAAAA,UAAgB,SAAUC,EADnC,EAIO,SAASA,IAAW,MACjBR,EAAStB,IAAAA,QAAAA,KAEX+B,EAAS,SAAG/B,IAAAA,QAAAA,WAAH,EAAG,EAAkBwB,cAAcC,uBAE7CH,IAAQS,GACXvB,IAGEuB,GACFvB,IAKFwB,EAFqBX,IAGtB,CAEM,SAASY,IACd,MAAO,CACLC,IAAKlC,IAAAA,KAAAA,4BACLmC,MAAOnC,IAAAA,KAAAA,8BAEV,CAEM,SAASgC,EAAeI,GACzBA,IAAUhC,EAAAA,KACZiC,EAAS,SACAD,IAAUhC,EAAAA,MACnBiC,EAAS,OAITA,EAFmBC,OAAOC,WAAW,gCAAgCC,QAE/C,QAAU,MAEnC,CAEM,SAASH,EAASI,GACvB,IAAMC,EAAQ3E,SAAS4E,cAAc,wCAC/BC,EAAO7E,SAAS4E,cAAc,uCAEpC,GAAID,GAASE,EAAM,CACjB,GAAIvB,MAAejB,EAAAA,KAAa,OAEhC,IAAIyC,EAAU9E,SAAS+E,cAAc,QAKjC,WAAYD,EAIdA,EAAQE,OAAS,WACfL,EAAMtE,SACNwE,EAAKxE,QACN,GAGDsE,EAAMtE,SACNwE,EAAKxE,UAGPyE,EAAQG,IAAM,aACdH,EAAQI,UAAY,YACpBJ,EAAQK,KAAOjB,IAAUQ,GAEzB1E,SAASoF,KAAKC,OAAOP,EACtB,KAAM,CACL,IAAMQ,EAAKX,GAASE,GAAQ7E,SAAS4E,cAAc,kCAE7CW,EAAMrB,IAAUQ,GAElBa,IAAQD,EAAGH,OACbG,EAAGH,KAAOI,EACVD,EAAGJ,UAAY,YAElB,CACF,CC3FD,MAAM,EAA+BxD,OAAOC,KAAKC,OAAO,a,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,iC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,oC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,oC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,sC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,8B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCMjD,SAAS4D,EAAWnB,GACzB,OAAOA,IAAUhC,EAAAA,OAAiBgC,IAAUhC,EAAAA,OAAgBkC,OAAOC,WAAW,gCAAgCC,OAC/G,CAcM,SAASgB,IACd,IAbqBC,EAafrB,EAAQf,IACRqC,EAAUH,EAAWnB,GACrBd,EAAOtB,IAAAA,QAAAA,KAEb,GAAIsB,EAAM,CACR,IAAMjB,EAAMqD,EAAUtD,EAAAA,KAAcA,EAAAA,MAEpC,GAAMkB,EAAKE,cAAcC,uBAGvB,OAFAkC,EAActD,QACdyB,IAIFR,EACGsC,gBAAgB,CACfjC,aAActB,IAEfwD,MAAK,WAGJ/B,GACD,GACJ,KAAM,CACL,IAAMgC,GApCaL,EAoCYrB,KAnCjBhC,EAAAA,KACPA,EAAAA,MAGLqD,IAAYrD,EAAAA,MACPA,EAAAA,KAGFA,EAAAA,KA6BLuD,EAAcG,GACdhC,GACD,CACF,CC/BD,IAAMiC,EAAQ,SAAC/E,GAAD,OAASgB,IAAAA,WAAAA,MAAA,qCAA0DhB,EAAnE,ECZdgB,IAAAA,aAAAA,IAAqB,iBAAiB,YDepC4B,EAAAA,EAAAA,QAAOoC,IAAAA,UAAwB,iBAAiB,SAAUC,GACxD,IAAQ3C,EAAStB,IAAAA,QAAAA,KAEX+B,IAAcT,EAAKE,cAAcC,uBAEnCM,GACFvB,IAGF,IAAM0D,GAAsB5B,OAAOC,WAAW,8DAA8DC,QAExG2B,EAAe9C,IAEb+C,EAAU,CAAE,EAAGL,EAAM,gBAAiB,EAAGA,EAAM,eAAgB,EAAGA,EAAM,kBAE1EG,WACKE,EAAQ,GAEXD,IAAiB/D,EAAAA,OACnB+D,EAAenE,IAAAA,MAAAA,UAAoB,0CAIvCiE,EAAMI,IACJ,gBACAC,IAAAA,UACE,CACEC,MAAOR,EAAM,WACbd,UAAW,kBAEb,CACE,OAAGA,UAAU,eAAec,EAAM,gBAClC,OAAGd,UAAU,eAAec,EAAM,iBAClCG,EAAqB,OAAGM,MAAM,yCAAyCT,EAAM,qBAA2B,KACxGU,IAAAA,UACE,CACExB,UAAW,gCACXyB,MAAO3C,EACP4C,SAAU,SAACC,GACLA,EAEFjB,EAAcQ,GAEdR,IAGFrC,EACGsC,gBAAgB,CACfnC,uBAAwBmD,IAEzBf,MAAK,WAGJ/B,GACD,GACJ,GAEHiC,EAAM,qCAERc,IAAAA,UAAiB,CACf5I,MAAOkI,EACPlB,UAAW,wBACX0B,SAAU,SAAC9G,GACT,GAAIkE,EAIF,OAHA4B,EAAc9F,QAEdiE,IAIFR,EACGsC,gBAAgB,CACfjC,aAAc9D,IAEfgG,MAAK,WACJiB,EAAEC,SAIFjD,GACD,GACJ,EACDsC,QAAAA,IAEF,OAAGnB,UAAU,yCACVkB,IAAiB/D,EAAAA,KACd2D,EAAM,4BACNI,IAAiB/D,EAAAA,MACjB2D,EAAM,2BACNI,IAAiB/D,EAAAA,KACjB2D,EAAM,6BAENiB,IAAAA,eAKb,KAEDpD,EAAAA,EAAAA,QAAOqD,IAAAA,UAA2B,SAAS,SAAUhB,GACnD,IAAIjE,IAAAA,QAAAA,MAAqBA,IAAAA,MAAAA,UAAoB,8CAA7C,CAEA,IAAMoC,EAAQf,IACRqC,EAAUH,EAAWnB,GAE3B6B,EAAMI,IACJ,YACA,EAAC,IAAD,CACEpB,UAAU,sBACViC,QAAS,WAKP1B,GACD,EACD2B,KAAM/C,IAAUhC,EAAAA,KAAc,gBAAxB,WAAoDsD,EAAU,MAAQ,SAE3E1D,IAAAA,WAAAA,MAAqB,gDAExB,GApBgG,CAsBnG,KAED4B,EAAAA,EAAAA,QAAOwD,IAAAA,UAA2B,SAAS,SAAUnB,GACnD,GAAKjE,IAAAA,QAAAA,KAAL,CAEA,IAAM0D,EAAUH,EAAWlC,KAG3B4C,EAAMI,IACJX,EAAU,YAAc,UACxB2B,IAAAA,UACE,CACEF,KAAM,WAAUzB,EAAU,OAAS,OACnCwB,QAAS,WACP1B,GAkBD,GAEHxD,IAAAA,WAAAA,MAAA,wBAA4C0D,EAAU,QAAU,UAEjE,EAjC0B,CAmC9B,IC7KD4B,GACD,G","sources":["webpack://@fof/nightmode/./node_modules/es-cookie/src/es-cookie.js","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.js","webpack://@fof/nightmode/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/nightmode/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/nightmode/./src/forum/helpers/perDeviceSetting.js","webpack://@fof/nightmode/./src/forum/fixInvalidThemeSetting.js","webpack://@fof/nightmode/./src/forum/getTheme.js","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.js","webpack://@fof/nightmode/./src/forum/addSettingsItems.js","webpack://@fof/nightmode/./src/forum/index.ts"],"sourcesContent":["\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nexports.__esModule = true;\r\nfunction stringifyAttribute(name, value) {\r\n if (!value) {\r\n return '';\r\n }\r\n var stringified = '; ' + name;\r\n if (value === true) {\r\n return stringified; // boolean attributes shouldn't have a value\r\n }\r\n return stringified + '=' + value;\r\n}\r\nfunction stringifyAttributes(attributes) {\r\n if (typeof attributes.expires === 'number') {\r\n var expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\r\n attributes.expires = expires;\r\n }\r\n return stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')\r\n + stringifyAttribute('Domain', attributes.domain)\r\n + stringifyAttribute('Path', attributes.path)\r\n + stringifyAttribute('Secure', attributes.secure)\r\n + stringifyAttribute('SameSite', attributes.sameSite);\r\n}\r\nfunction encode(name, value, attributes) {\r\n return encodeURIComponent(name)\r\n .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) // allowed special characters\r\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29') // replace opening and closing parens\r\n + '=' + encodeURIComponent(value)\r\n // allowed special characters\r\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)\r\n + stringifyAttributes(attributes);\r\n}\r\nexports.encode = encode;\r\nfunction parse(cookieString) {\r\n var result = {};\r\n var cookies = cookieString ? cookieString.split('; ') : [];\r\n var rdecode = /(%[\\dA-F]{2})+/gi;\r\n for (var i = 0; i < cookies.length; i++) {\r\n var parts = cookies[i].split('=');\r\n var cookie = parts.slice(1).join('=');\r\n if (cookie.charAt(0) === '\"') {\r\n cookie = cookie.slice(1, -1);\r\n }\r\n try {\r\n var name_1 = parts[0].replace(rdecode, decodeURIComponent);\r\n result[name_1] = cookie.replace(rdecode, decodeURIComponent);\r\n }\r\n catch (e) {\r\n // ignore cookies with invalid name/value encoding\r\n }\r\n }\r\n return result;\r\n}\r\nexports.parse = parse;\r\nfunction getAll() {\r\n return parse(document.cookie);\r\n}\r\nexports.getAll = getAll;\r\nfunction get(name) {\r\n return getAll()[name];\r\n}\r\nexports.get = get;\r\nfunction set(name, value, attributes) {\r\n document.cookie = encode(name, value, __assign({ path: '/' }, attributes));\r\n}\r\nexports.set = set;\r\nfunction remove(name, attributes) {\r\n set(name, '', __assign(__assign({}, attributes), { expires: -1 }));\r\n}\r\nexports.remove = remove;\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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'];","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:',\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 () => {\n extend(Page.prototype, 'oninit', 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 if (light && dark) {\n if (getTheme() === Themes.AUTO) return;\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 __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":["__assign","this","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","stringifyAttribute","name","value","stringified","encode","attributes","encodeURIComponent","replace","decodeURIComponent","expires","Date","setMilliseconds","getMilliseconds","toUTCString","domain","path","secure","sameSite","stringifyAttributes","parse","cookieString","result","cookies","split","rdecode","parts","cookie","slice","join","charAt","e","getAll","document","set","exports","__esModule","get","remove","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","module","__webpack_modules__","getter","d","a","definition","key","o","defineProperty","enumerable","obj","prop","r","Symbol","toStringTag","flarum","core","compat","AUTO","LIGHT","DARK","DEFAULT","app","KEY","Cookies","Number","Themes","val","location","protocol","fixInvalidThemeSetting","validValues","Array","from","Set","values","Theme","isNaN","resetTheme","includes","reason","console","warn","getTheme","user","IsUsingPerDeviceSettings","preferences","fofNightMode_perDevice","SelectedTheme","fofNightMode","extend","Page","setTheme","PerDevice","setThemeFromID","getUrls","day","night","theme","setStyle","window","matchMedia","matches","type","light","querySelector","dark","newLink","createElement","onload","rel","className","href","head","append","el","url","getIsLight","switchTheme","current","isLight","perDevice","savePreferences","then","newTheme","trans","SettingsPage","items","doesNotSupportAuto","currentTheme","options","add","FieldSet","label","class","Switch","state","onchange","checked","Select","m","redraw","LoadingIndicator","HeaderSecondary","onclick","icon","SessionDropdown","Button","setSelectedTheme"],"sourceRoot":""} \ No newline at end of file