{"version":3,"sources":["ChangePalette.js"],"names":["initChangePalette","window","ChangePalette","init","now","Hex","replacements","styleEl","document","createElement","type","id","waitingStyleEl","innerHTML","head","appendChild","documentElement","classList","add","showPage","remove","newPalette","oldPalette","options","console","log","addListeners","callNow","Object","keys","forEach","hex","isValid","Error","longHex","getLong","push","RegExp","shortHex","getShort","toRGB","join","nowDeferred","setTimeout","addEventListener","addStyleSheet","replaceStyleAttributes","styleSheetList","styleSheets","replaceableCssTextList","isReplacementFoundInCssText","i","iMax","length","test","cssText","rules","cssRules","j","jMax","e","error","cssRuleSplitter","newCssTextList","newRules","split","rule","k","selector","ruleReplaced","m","mMax","replace","newCssText","indexOf","warn","stylesList","querySelectorAll","lastStyleEl","parentNode","insertBefore","nextSibling","textContent","elList","el","style","getAttribute","styleReplaced","setAttribute"],"mappings":"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","file":"../ChangePalette.0.6.0.min.js","sourcesContent":["/**\r\n * Replaces colors from the document's stylesheets with new colors from\r\n * a given palette.\r\n *\r\n * Requires two object parameters, with corresponding property keys in each object, whosevalues are strings of valid hex colors. Reads all rulesets in the document and replaces all old colors with new colors, and then appends a style tag to the DOM.\r\n *\r\n * Dependency: Hex.js.\r\n *\r\n * @param {Object.} newPalette - new colors to use\r\n * @param {Object.} oldPalette - old colors to be replaced\r\n */\r\n(function initChangePalette() {\r\n window.ChangePalette = { init, now };\r\n const { Hex } = window;\r\n\r\n // to be filled with length-3 arrays, each containing [0] non-global RegExp, [1] global RegExp, and [2] replacement\r\n const replacements = [];\r\n\r\n // the style tag that will get the styles\r\n const styleEl = document.createElement('style');\r\n styleEl.type = 'text/css';\r\n styleEl.id = 'change-palette-new-styles';\r\n\r\n // hide entire document while waiting for the palette\r\n const waitingStyleEl = document.createElement('style');\r\n waitingStyleEl.type = 'text/css';\r\n waitingStyleEl.id = 'waiting-for-palette-styles';\r\n waitingStyleEl.innerHTML = ` \r\n html.-waiting-for-palette {\r\n visibility: hidden;\r\n opacity: 0;\r\n }\r\n \r\n html {\r\n visibility: visible;\r\n opacity: 1;\r\n transition: opacity 0.5s linear, visibility 0.5s step-start;\r\n }\r\n `;\r\n document.head.appendChild(waitingStyleEl);\r\n document.documentElement.classList.add('-waiting-for-palette');\r\n\r\n function showPage() {\r\n document.documentElement.classList.remove('-waiting-for-palette');\r\n document.documentElement.classList.add('-changed-palette');\r\n }\r\n\r\n function init(newPalette, oldPalette, options = {}) {\r\n if (!newPalette) {\r\n console.log('No palettes provided, showing default palette.');\r\n showPage();\r\n\r\n return false;\r\n }\r\n\r\n // default options\r\n const addListeners =\r\n 'addListeners' in options ? options.addListeners : true;\r\n const callNow = 'callNow' in options ? options.callNow : true;\r\n\r\n Object.keys(oldPalette).forEach(hex => {\r\n if (!(hex in newPalette)) {\r\n console.log(\r\n `Replacement for ${\r\n oldPalette[hex]\r\n } not found in new palette.`\r\n );\r\n\r\n return false;\r\n }\r\n\r\n // throw on invalid hex colors\r\n if (!Hex.isValid(oldPalette[hex])) {\r\n throw new Error(\r\n 'oldPallete has a property that is not a valid hex color.'\r\n );\r\n }\r\n\r\n // throw on invalid hex colors\r\n if (!Hex.isValid(newPalette[hex])) {\r\n throw new Error(\r\n 'newPallete has a property that is not a valid hex color.'\r\n );\r\n }\r\n\r\n // add replacement for long hex colors\r\n const longHex = Hex.getLong(oldPalette[hex]);\r\n replacements.push([\r\n RegExp(longHex, 'i'),\r\n RegExp(longHex, 'gi'),\r\n newPalette[hex]\r\n ]);\r\n\r\n // add replacement for short hex colors\r\n const shortHex = Hex.getShort(oldPalette[hex]);\r\n if (shortHex) {\r\n replacements.push([\r\n RegExp(shortHex, 'i'),\r\n RegExp(shortHex, 'gi'),\r\n newPalette[hex]\r\n ]);\r\n }\r\n\r\n // add replacement for RGB and RGBA colors\r\n replacements.push([\r\n RegExp(`\\\\(${Hex.toRGB(oldPalette[hex]).join(', ')}`),\r\n RegExp(`\\\\(${Hex.toRGB(oldPalette[hex]).join(', ')}`, 'g'),\r\n `(${Hex.toRGB(newPalette[hex]).join(', ')}`\r\n ]);\r\n });\r\n\r\n if (callNow) {\r\n // change palettes now\r\n now();\r\n }\r\n\r\n if (addListeners) {\r\n // calls now(), but at the end of the call stack\r\n const nowDeferred = () => {\r\n setTimeout(now, 0);\r\n };\r\n\r\n // add listeners to DOM ready and window load\r\n document.addEventListener('DOMContentLoaded', nowDeferred);\r\n window.addEventListener('load', nowDeferred);\r\n\r\n // remove `.-waiting-for-palette` from document on load event, in case we have a problem at least they get the old palette\r\n window.addEventListener('load', () => {\r\n setTimeout(showPage, 0);\r\n });\r\n }\r\n }\r\n\r\n function now() {\r\n addStyleSheet();\r\n replaceStyleAttributes();\r\n showPage();\r\n }\r\n\r\n function addStyleSheet() {\r\n // get stylesheets as array\r\n const styleSheetList = document.styleSheets;\r\n\r\n // to be filled with all relevant CssText strings\r\n const replaceableCssTextList = [];\r\n\r\n // returns true if a CssText string contains a color to replace\r\n const isReplacementFoundInCssText = cssText => {\r\n for (let i = 0, iMax = replacements.length; i < iMax; i++) {\r\n // test against non-global RegExp to avoid incrementing lastIndex\r\n if (replacements[i][0].test(cssText)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // fill replaceableCssTextList with double loop\r\n // loop through styleSheets\r\n for (let i = 0, iMax = styleSheetList.length; i < iMax; i++) {\r\n try {\r\n const rules =\r\n styleSheetList[i].cssRules || styleSheetList[i].rules;\r\n\r\n // loop through cssTexts\r\n for (let j = 0, jMax = rules.length; j < jMax; j++) {\r\n try {\r\n const { cssText } = rules[j];\r\n\r\n if (isReplacementFoundInCssText(cssText)) {\r\n // fill replaceableCssTextList\r\n replaceableCssTextList.push(cssText);\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n // RegExp for splitting cssText into rules\r\n const cssRuleSplitter = /[;{}]/g;\r\n\r\n // to be filled with the text of new rulesets\r\n const newCssTextList = [];\r\n\r\n for (\r\n let j = 0, jMax = replaceableCssTextList.length;\r\n j < jMax;\r\n j++\r\n ) {\r\n const cssText = replaceableCssTextList[j];\r\n const newRules = [];\r\n\r\n // split into rules and replace each one\r\n cssText.split(cssRuleSplitter).forEach((rule, k) => {\r\n // the first item is the selector\r\n if (k === 0) {\r\n newRules.selector = rule;\r\n return;\r\n }\r\n\r\n // copy the string for comparison later\r\n let ruleReplaced = rule;\r\n\r\n for (let m = 0, mMax = replacements.length; m < mMax; m++) {\r\n // make replacements on the copy\r\n ruleReplaced = ruleReplaced.replace(\r\n replacements[m][1],\r\n replacements[m][2]\r\n );\r\n }\r\n\r\n // only push if the string has changed\r\n if (rule !== ruleReplaced) {\r\n newRules.push(ruleReplaced);\r\n }\r\n });\r\n\r\n const newCssText = `${newRules.selector} {\\n ${newRules.join(\r\n ';\\n '\r\n )};\\n}`;\r\n\r\n if (newCssText.indexOf('url(') !== -1) {\r\n console.warn(\r\n `ChangePalette has added a new CSS rule containing a URL: \\n\\n${newCssText}\\n\\nThis may cause a broken reference. Please avoid using the shorthand background property so that ChangePalette can ignore the URL.`\r\n );\r\n }\r\n\r\n newCssTextList.push(newCssText);\r\n }\r\n\r\n // get last