Skip to content

Commit ee524cc

Browse files
committed
feat(postcss-plugin): Add font-size shorthand
1 parent 25e9264 commit ee524cc

File tree

5 files changed

+64
-14
lines changed

5 files changed

+64
-14
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,16 @@ a:hover:before {
6767
}
6868
```
6969

70+
## Icon sizes
71+
72+
Shorthand for setting the icon size and the icon:
73+
74+
```css
75+
a:before {
76+
font-icon: 80% url('./account.svg');
77+
}
78+
```
79+
7080
## Should you use icon fonts for everything?
7181

7282
No.

example/default/dist/styles.css

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
@font-face {
22
font-family: M6002e;
3-
src: url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAQwAAsAAAAABkwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIwleU9TLzIAAAFEAAAAPwAAAFYvsjszY21hcAAAAYQAAABKAAABcOEoo6pnbHlmAAAB0AAAAJgAAACkgs5VC2hlYWQAAAJoAAAALgAAADYJHf2zaGhlYQAAApgAAAAeAAAAJAPxAe9obXR4AAACuAAAAAgAAAAIAe7//2xvY2EAAALAAAAABgAAAAYAUgAAbWF4cAAAAsgAAAAeAAAAIAENAEBuYW1lAAAC6AAAASkAAAIWm5e+CnBvc3QAAAQUAAAAGwAAACxqPAEEeJxjYGRgYOBiMGCwY2DKSSzJY+BzcfMJYZBiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCAClZBUgAeJxjYGT4zjiBgZWBgdGSMY2BgcEdSn9lkGRoYWBgYmBlZsAKAtJcUxgcHjA8AKoBAj0mZgZGIA3CDACcLwhKAHic7ZCxDYAwEAPPykOBGIEqNbNQsb/YJPkY2CKWzpJPXz2wACU5kwDdiJErrewLm31QfRPDP7T2d+5wo5WZ3X18y796QR0aJglRAAB4nA2IQQ6CMBAAu9vSLVBaqVJMDxKNgWiMhpDQhAPc/IH//4I/0M4kcxgGvwR8kbOJsXGOyQ1W2HCKL4hTnPu0Vmh9BxZakhZkCu/Qt54yobWr902zxM6KijghAuXGPa7hdMxyiSC4kCqvrV4yVQgSrr6fn94YjjCstnchKOsqR6Uy+hNQFVRqVcK4u7xvhbYHz9gfcc4RpXicY2BkYGAA4pPl/9bG89t8ZeBmYgCBK+z3omD0fyBg/MDEDORyMIClAXmrDbwAAHicY2BkYGBiAAHGd//////H+IGBkQEVMAEAg2cF4gAAAAAAAAHu//8AAAAAAFIAAHicY2BkYGBgYjBhANEgFgMDFxAyMPwH8xkADasBTgAAeJxlkD1uwkAUhMdgSAJSghQpKbNVCiKZn5IDQE9Bl8KYtTGyvdZ6QaLLCXKEHCGniHKCHChj82hgLT9/M2/e7soABviFh3p5uG1qvVq4oTpxm/Qg7JOfhTvo40W4S38o3MMbpsJ9POKdO3j+HZ0BSuEW7vEh3Kb/KeyTv4Q7eMK3cJf+j3APK/wJ9/HqDdPIFLEp3FIn+yy0Z3n+rrStUlOoSTA+WwtdaBs6vVHro6oOydS5WMXW5GrOrs4yo0prdjpywda5cjYaxeIHkcmRIoJBgbipDktoJNgjQwh71b3UK6YtKvq1VpggwPgqtWCqaJIhlcaGyTWOrBUOPG1K1zGt+FrO5KS5zGreJCMr/u+6t6MT0Q+wbaZKzDDiE1/kg+YO+T89EV6oAAAAeJxjYGKAAFYG7ICJkYmRmYEp04CBAQADvgCsAA==") format('woff');
3+
src: url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAQwAAsAAAAABkwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIwleU9TLzIAAAFEAAAAPwAAAFYvsjszY21hcAAAAYQAAABKAAABcOEoo6pnbHlmAAAB0AAAAJgAAACkgs5VC2hlYWQAAAJoAAAALgAAADYJHildaGhlYQAAApgAAAAeAAAAJAPxAe9obXR4AAACuAAAAAgAAAAIAe7//2xvY2EAAALAAAAABgAAAAYAUgAAbWF4cAAAAsgAAAAeAAAAIAENAEBuYW1lAAAC6AAAASkAAAIWm5e+CnBvc3QAAAQUAAAAGwAAACxqPAEEeJxjYGRgYOBiMGCwY2DKSSzJY+BzcfMJYZBiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCAClZBUgAeJxjYGT4zjiBgZWBgdGSMY2BgcEdSn9lkGRoYWBgYmBlZsAKAtJcUxgcHjA8AKoBAj0mZgZGIA3CDACcLwhKAHic7ZCxDYAwEAPPykOBGIEqNbNQsb/YJPkY2CKWzpJPXz2wACU5kwDdiJErrewLm31QfRPDP7T2d+5wo5WZ3X18y796QR0aJglRAAB4nA2IQQ6CMBAAu9vSLVBaqVJMDxKNgWiMhpDQhAPc/IH//4I/0M4kcxgGvwR8kbOJsXGOyQ1W2HCKL4hTnPu0Vmh9BxZakhZkCu/Qt54yobWr902zxM6KijghAuXGPa7hdMxyiSC4kCqvrV4yVQgSrr6fn94YjjCstnchKOsqR6Uy+hNQFVRqVcK4u7xvhbYHz9gfcc4RpXicY2BkYGAA4pPlyyPj+W2+MnAzMYDAFfYv+jD6PxAwfmBiBnI5GMDSAFkBDOcAAHicY2BkYGBiAAHGd//////H+IGBkQEVMAEAg2cF4gAAAAAAAAHu//8AAAAAAFIAAHicY2BkYGBgYjBhANEgFgMDFxAyMPwH8xkADasBTgAAeJxlkD1uwkAUhMdgSAJSghQpKbNVCiKZn5IDQE9Bl8KYtTGyvdZ6QaLLCXKEHCGniHKCHChj82hgLT9/M2/e7soABviFh3p5uG1qvVq4oTpxm/Qg7JOfhTvo40W4S38o3MMbpsJ9POKdO3j+HZ0BSuEW7vEh3Kb/KeyTv4Q7eMK3cJf+j3APK/wJ9/HqDdPIFLEp3FIn+yy0Z3n+rrStUlOoSTA+WwtdaBs6vVHro6oOydS5WMXW5GrOrs4yo0prdjpywda5cjYaxeIHkcmRIoJBgbipDktoJNgjQwh71b3UK6YtKvq1VpggwPgqtWCqaJIhlcaGyTWOrBUOPG1K1zGt+FrO5KS5zGreJCMr/u+6t6MT0Q+wbaZKzDDiE1/kg+YO+T89EV6oAAAAeJxjYGKAAFYG7ICJkYmRmYEp04CBAQADvgCsAA==") format('woff');
44
font-weight: normal;
55
font-style: normal;
66
}
77

88
a:before {
9-
font-family: M6002e;
109
text-rendering: auto;
1110
-webkit-font-smoothing: auto;
1211
-moz-osx-font-smoothing: auto;
12+
font-family: M6002e;
1313
font-weight: normal;
1414
content: '\E000';
1515
transition: 0.5s color;
1616
}
1717

1818
a:hover:before {
1919
color: red;
20+
}
21+
22+
a:after {
23+
text-rendering: auto;
24+
-webkit-font-smoothing: auto;
25+
-moz-osx-font-smoothing: auto;
26+
font: normal normal normal 50%/1 M6002e;
27+
content: '\E000';
2028
}

example/default/main.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ a:before {
55

66
a:hover:before {
77
color: red;
8+
}
9+
10+
a:after {
11+
font-icon: 50% url('./account.svg');
812
}

lib/postcss-plugin.js

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,23 @@ function getRelativeIconPath (value) {
1313
return relativePathResult ? (relativePathResult[2] || relativePathResult[3] || relativePathResult[4]) : undefined;
1414
}
1515

16+
function parseFontIconValue (value) {
17+
var valueParts = value.trim().split(' ');
18+
var result = {};
19+
// Just a url
20+
// font-icon: url('./demo.svg');
21+
if (valueParts.length === 1) {
22+
result.url = getRelativeIconPath(valueParts[0]);
23+
}
24+
// Font size and url
25+
// font-icon: 20px url('./demo.svg');
26+
if (valueParts.length === 2) {
27+
result.size = valueParts[0];
28+
result.url = getRelativeIconPath(valueParts[1]);
29+
}
30+
return result;
31+
}
32+
1633
/**
1734
* Returns a promise with the result of all resolved svg paths of the given file
1835
*
@@ -24,9 +41,9 @@ function getSvgPaths (postCssRoot, compiler, context) {
2441
var relativePaths = [];
2542
postCssRoot.walkDecls((decl) => {
2643
if (decl.prop === 'font-icon') {
27-
var relativePath = getRelativeIconPath(decl.value);
28-
if (relativePath) {
29-
relativePaths.push(relativePath);
44+
var fontIcon = parseFontIconValue(decl.value);
45+
if (fontIcon.url) {
46+
relativePaths.push(fontIcon.url);
3047
}
3148
}
3249
});
@@ -44,11 +61,8 @@ function getSvgPaths (postCssRoot, compiler, context) {
4461
function replaceIconFontDeclarations (fontName, postCssRoot, unresolvedSvgPaths) {
4562
postCssRoot.walkDecls((decl) => {
4663
if (decl.prop === 'font-icon') {
64+
var fontIcon = parseFontIconValue(decl.value);
4765
// Add the font name
48-
decl.cloneBefore({
49-
prop: 'font-family',
50-
value: fontName
51-
});
5266
decl.cloneBefore({
5367
prop: 'text-rendering',
5468
value: 'auto'
@@ -61,10 +75,24 @@ function replaceIconFontDeclarations (fontName, postCssRoot, unresolvedSvgPaths)
6175
prop: '-moz-osx-font-smoothing',
6276
value: 'auto'
6377
});
64-
decl.cloneBefore({
65-
prop: 'font-weight',
66-
value: 'normal'
67-
});
78+
// If a font size is set we can use the font shorthand
79+
if (fontIcon.size) {
80+
decl.cloneBefore({
81+
prop: 'font',
82+
value: `normal normal normal ${fontIcon.size}/1 ${fontName}`
83+
});
84+
}
85+
// If no font size is set we use the font attributes
86+
if (!fontIcon.size) {
87+
decl.cloneBefore({
88+
prop: 'font-family',
89+
value: fontName
90+
});
91+
decl.cloneBefore({
92+
prop: 'font-weight',
93+
value: 'normal'
94+
});
95+
}
6896
// Look up the index of the svg in the array to generate the unicode char position
6997
var iconCharCode = unresolvedSvgPaths.indexOf(getRelativeIconPath(decl.value));
7098
decl.value = '\'\\e' + _.padStart(iconCharCode.toString(16), 3, '0') + '\'';

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "iconfont-webpack-plugin",
3-
"version": "0.0.5",
3+
"version": "0.0.6",
44
"description": "Simple icon font handling for webpack",
55
"main": "index.js",
66
"files": [

0 commit comments

Comments
 (0)