diff options
Diffstat (limited to 'postcss.js')
-rw-r--r-- | postcss.js | 123 |
1 files changed, 65 insertions, 58 deletions
@@ -25,7 +25,7 @@ module.exports = postcss.plugin('postcss-rfs', opts => { css.walkRules(rule => { const mediaQueryRules = []; const extraBlocks = []; - const {parent} = rule; + const { parent } = rule; let removeRule = false; let dcRule; let ecRule; @@ -54,7 +54,7 @@ module.exports = postcss.plugin('postcss-rfs', opts => { let ruleSelector = ''; for (const selector of selectors) { - ruleSelector += (opts.mode === 'max-media-query') ? `${selector},\n` : ''; + ruleSelector += opts.mode === 'max-media-query' ? `${selector},\n` : ''; ruleSelector += `${DISABLE_RFS_SELECTOR} ${selector},\n`; ruleSelector += `${selector + DISABLE_RFS_SELECTOR},\n`; } @@ -69,76 +69,83 @@ module.exports = postcss.plugin('postcss-rfs', opts => { rule.walkDecls(decl => { // Check if the selector doesn't contain the disabled selector - // Check if value contains rfs() function - if (!rule.selector.includes(DISABLE_RFS_SELECTOR) && new RegExp(opts.functionName + '(.*)', 'g').test(decl.value)) { - const value = rfs.value(decl.value); - const fluidValue = rfs.fluidValue(decl.value); - decl.value = value; - - if (value !== fluidValue) { - const defaultValue = (opts.mode === 'min-media-query') ? ((opts.class === 'enable') ? value : fluidValue) : value; - const mediaQueryValue = (opts.mode === 'min-media-query') ? value : fluidValue; - decl.value = defaultValue; - - fluidRule.append(decl.clone({value: mediaQueryValue})); - mediaQueryRules.push(fluidRule); - - // Disable classes - if (opts.class === 'disable') { - const declOpts = (opts.mode === 'max-media-query') ? {} : {value}; - dcRule.append(decl.clone(declOpts)); - extraBlocks.push(dcRule); - } else if (opts.class === 'enable' && opts.mode === 'min-media-query') { - if (ecRule === undefined) { - ecRule = postcss.rule({ - selector: ruleSelector, - source: parent.source - }); - } - - ecRule.append(decl.clone({value: fluidValue})); - extraBlocks.push(ecRule); + // and if the value contains the rfs() function + const check = !rule.selector.includes(DISABLE_RFS_SELECTOR) && + new RegExp(`${opts.functionName}(.*)`, 'g').test(decl.value); + + if (!check) { + return; + } + + const value = rfs.value(decl.value); + const fluidValue = rfs.fluidValue(decl.value); + decl.value = value; + + if (value !== fluidValue) { + const defaultValue = opts.mode === 'min-media-query' ? ((opts.class === 'enable') ? value : fluidValue) : value; + const mediaQueryValue = opts.mode === 'min-media-query' ? value : fluidValue; + decl.value = defaultValue; + + fluidRule.append(decl.clone({ value: mediaQueryValue })); + mediaQueryRules.push(fluidRule); + + // Disable classes + if (opts.class === 'disable') { + const declOpts = opts.mode === 'max-media-query' ? {} : { value }; + dcRule.append(decl.clone(declOpts)); + extraBlocks.push(dcRule); + } else if (opts.class === 'enable' && opts.mode === 'min-media-query') { + if (ecRule === undefined) { + ecRule = postcss.rule({ + selector: ruleSelector, + source: parent.source + }); } - // Remove declaration if needed - if (opts.class === 'disable' && opts.mode === 'max-media-query') { - if (decl.prev() || decl.next()) { - decl.remove(); - } else { - removeRule = true; - } + ecRule.append(decl.clone({ value: fluidValue })); + extraBlocks.push(ecRule); + } + + // Remove declaration if needed + if (opts.class === 'disable' && opts.mode === 'max-media-query') { + if (decl.prev() || decl.next()) { + decl.remove(); + } else { + removeRule = true; } } } }); - if (mediaQueryRules.length > 0) { - // Safari iframe resize bug: https://github.com/twbs/rfs/issues/14 - if (opts.safariIframeResizeBugFix) { - rule.append({ - prop: 'min-width', - value: '0vw' - }); - } + if (mediaQueryRules.length === 0) { + return; + } - const fluidMediaQuery = mediaQuery.clone(); + // Safari iframe resize bug: https://github.com/twbs/rfs/issues/14 + if (opts.safariIframeResizeBugFix) { + rule.append({ + prop: 'min-width', + value: '0vw' + }); + } - for (const mediaQueryRule of mediaQueryRules) { - fluidMediaQuery.append(mediaQueryRule); - } + const fluidMediaQuery = mediaQuery.clone(); - parent.insertAfter(rule, fluidMediaQuery); + for (const mediaQueryRule of mediaQueryRules) { + fluidMediaQuery.append(mediaQueryRule); + } - if (extraBlocks.length > 0) { - for (const disableBlock of extraBlocks) { - parent.insertAfter(rule, disableBlock); - } - } + parent.insertAfter(rule, fluidMediaQuery); - if (removeRule) { - rule.remove(); + if (extraBlocks.length > 0) { + for (const disableBlock of extraBlocks) { + parent.insertAfter(rule, disableBlock); } } + + if (removeRule) { + rule.remove(); + } }); }; }); |