packages/postcss-svg-mixer/lib/transform-declaration.js (30 lines of code) (raw):
const postcss = require('postcss');
const { Sprite, StackSprite } = require('svg-mixer');
const { transformSelector, objectToDeclProps } = require('svg-mixer-utils/lib/postcss');
function generateProps(position, spriteUrl, spriteType) {
const { bgSize, bgPosition } = position;
const props = {
[Sprite.TYPE]: {
background: `url('${spriteUrl}') no-repeat ${bgPosition.left} ${bgPosition.top}`,
'background-size': `${bgSize.width} ${bgSize.height}`
},
[StackSprite.TYPE]: {
background: `url('${spriteUrl}') no-repeat`
}
};
return objectToDeclProps(props[spriteType]);
}
/**
* @param {Object} opts
* @param {postcss.Declaration} opts.decl
* @param {string} opts.spriteUrl
* @param {string} opts.spriteType
* @param {string} opts.selector
* @param {SpriteSymbolPosition} opts.position
*/
module.exports = opts => {
const { decl, spriteUrl, spriteType, selector, position } = opts;
const rule = decl.parent;
if (typeof selector === 'string' && selector !== '') {
const newSelector = transformSelector(rule.selector, s => `${s}${selector}`);
const newRule = postcss
.rule({ selector: newSelector })
.append(...generateProps(position, spriteUrl, spriteType));
rule.after(newRule);
} else {
rule.append(...generateProps(position, spriteUrl, spriteType));
}
decl.remove();
};