()
| 108 | // |
| 109 | |
| 110 | function scheduleWriteRules() { |
| 111 | if (rules.length === 0 || writeRulesTOHandle !== -1) { |
| 112 | return; |
| 113 | } |
| 114 | writeRulesTOHandle = _BaseUtils._setImmediate(() => { |
| 115 | writeRulesTOHandle = -1; |
| 116 | cleanup(); |
| 117 | |
| 118 | var inverseThemeSelector = isDarkTheme ? Constants.lightThemeSelector : Constants.darkThemeSelector; |
| 119 | var inverseThemeHoverSelector = Constants.hoverSelector + " " + inverseThemeSelector; |
| 120 | |
| 121 | var style = _Global.document.createElement("style"); |
| 122 | style.id = Constants.accentStyleId; |
| 123 | style.textContent = rules.map(rule => { |
| 124 | // example rule: { selector: " .foo, html.win-hoverable .bar:hover , div:hover ", props: [{ name: "color", value: 0 }, { name: "background-color", value: 1 } } |
| 125 | |
| 126 | var body = " " + rule.props.map(prop => prop.name + ": " + colors[prop.value] + ";").join("\n "); |
| 127 | // body = color: *accent*; background-color: *listSelectHover* |
| 128 | |
| 129 | var selectorSplit = rule.selector.split(",").map(str => sanitizeSpaces(str)); // [".foo", ".bar:hover", "div"] |
| 130 | var selector = selectorSplit.join(",\n"); // ".foo, html.win-hoverable .bar:hover, div:hover" |
| 131 | var css = selector + " {\n" + body + "\n}"; |
| 132 | // css = .foo, html.win-hoverable .bar:hover, div:hover { *body* } |
| 133 | |
| 134 | // Inverse Theme Selectors |
| 135 | var isThemedColor = rule.props.some(prop => prop.value !== ColorTypes.accent) |
| 136 | if (isThemedColor) { |
| 137 | var inverseBody = " " + rule.props.map(prop => prop.name + ": " + colors[(prop.value ? (prop.value + 3) : prop.value)] + ";").join("\n "); |
| 138 | // inverseBody = "color: *accent*; background-color: *listSelectHoverInverse" |
| 139 | |
| 140 | var themedSelectors: string[] = []; |
| 141 | selectorSplit.forEach(sel => { |
| 142 | if (sel.indexOf(Constants.hoverSelector) !== -1 && sel.indexOf(inverseThemeHoverSelector) === -1) { |
| 143 | themedSelectors.push(sel.replace(Constants.hoverSelector, inverseThemeHoverSelector)); |
| 144 | var selWithoutHover = sel.replace(Constants.hoverSelector, "").trim(); |
| 145 | if (CSSSelectorTokens.indexOf(selWithoutHover[0]) !== -1) { |
| 146 | themedSelectors.push(sel.replace(Constants.hoverSelector + " ", inverseThemeHoverSelector)); |
| 147 | } |
| 148 | } else { |
| 149 | themedSelectors.push(inverseThemeSelector + " " + sel); |
| 150 | if (CSSSelectorTokens.indexOf(sel[0]) !== -1) { |
| 151 | themedSelectors.push(inverseThemeSelector + sel); |
| 152 | } |
| 153 | } |
| 154 | css += "\n" + themedSelectors.join(",\n") + " {\n" + inverseBody + "\n}"; |
| 155 | }); |
| 156 | // css |
| 157 | //.foo, html.win-hoverable .bar:hover, div:hover, { *body* } |
| 158 | //.win-ui-light .foo, |
| 159 | //.win-ui-light.foo, |
| 160 | //html.win-hoverable .win-ui-light .bar:hover, |
| 161 | //html.win-hoverable .win-ui-light.bar:hover, |
| 162 | //.win-ui-light div:hover { *inverseBody* } |
| 163 | } |
| 164 | return css; |
| 165 | }).join("\n"); |
| 166 | _Global.document.head.appendChild(style); |
| 167 | }); |
no test coverage detected