Skip to content

Commit 256dd31

Browse files
committed
Fixed line height and letter spacing values calculation for different font sizes (#2, #3)
1 parent ea0f8a4 commit 256dd31

File tree

2 files changed

+70
-25
lines changed

2 files changed

+70
-25
lines changed

demo/scripts.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ function printFontSizes(sizes = {}) {
3838
<p class="text-xs text-gray-500 py-2">
3939
.text-inter-${name}
4040
</p>
41-
<div class="border-t border-b border-solid border-blue-200 mb-10 text-inter-${name}">
41+
<div class="mb-10 text-inter-${name}">
4242
${shortText}
4343
</div>
4444
</div>`

src/index.js

Lines changed: 69 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
const _ = require('lodash');
21
const inter = require('../inter.json');
32

43
/**
@@ -13,6 +12,54 @@ const filterObject = (obj, cb) => Object.fromEntries(Object.entries(obj).filter(
1312
const round = (num, prec = 3) => parseFloat(num.toFixed(prec));
1413
const unquote = str => str.replace(/^['"]|['"]$/g, '').trim();
1514

15+
const unitsDefaults = (baseFontSize = 16) => ({
16+
'ch': 8,
17+
'ex': 7.15625,
18+
'em': baseFontSize,
19+
'rem': baseFontSize,
20+
'%': baseFontSize / 100,
21+
'in': 96,
22+
'cm': 96 / 2.54,
23+
'mm': 96 / 25.4,
24+
'pt': 96 / 72,
25+
'pc': 96 / 6,
26+
'px': 1
27+
});
28+
29+
/**
30+
* Parses CSS size/length value
31+
*
32+
* @param {any} value Any CSS size value with units
33+
* @param {Number} lineHeight Relative line height
34+
*
35+
* @return {Array}
36+
*/
37+
function parseUnit(value) {
38+
let str = String(value);
39+
return [
40+
parseFloat(str, 10),
41+
str.match(/[\d.\-\+]*\s*(.*)/)[1] || ''
42+
]
43+
}
44+
45+
function getUnitConverter (baseFontSize = 16) {
46+
const defaults = unitsDefaults(baseFontSize);
47+
48+
return function toPX(str) {
49+
if (isEmpty(str)) return 0;
50+
if (defaults[str]) return defaults[str];
51+
52+
let [value, unit] = parseUnit(str);
53+
54+
if (!isNaN(value) && unit) {
55+
let px = toPX(unit);
56+
return typeof px === 'number' ? value * px : 0;
57+
}
58+
59+
return 0;
60+
}
61+
}
62+
1663
/**
1764
* Calculates line height
1865
*
@@ -116,9 +163,8 @@ function generateFeatures(features, availableFeatures, { disableUnusedFeatures =
116163
features = Object.assign({}, available, features);
117164
}
118165

119-
settings = Object.entries(features).map(([key, value]) => `"${key}" ${value}`);
120-
121-
return settings
166+
return Object.entries(features)
167+
.map(([key, value]) => `"${key}" ${value}`)
122168
.filter(val => !!val)
123169
.sort()
124170
.join(', ')
@@ -178,27 +224,26 @@ module.exports = (opts = {}) => {
178224

179225
// Add .text-inter-{size} utility classes
180226
// Modifiers are inherited from fontSize config
181-
const textSizeUtilities = Object.fromEntries(
182-
Object.entries(theme('fontSize', {})).flatMap(([modifier, fontSize]) => {
183-
if (fontSize.slice(-3) === 'rem') {
184-
fontSize = parseFloat(fontSize.slice(0, -3)) * options.baseFontSize;
185-
} else if (fontSize.slice(-2) === 'em') {
186-
fontSize = parseFloat(fontSize.slice(0, -2)) * options.baseFontSize;
187-
}
227+
const px = getUnitConverter(options.baseFontSize);
188228

189-
let selector = fontInterSelector(`.${e(`text-inter-${modifier}`)}`);
190-
let baseRule = fontSizeRule(selector, fontSize, options.baseLineHeight, options);
191-
192-
let leadingRules = Object.entries(theme('lineHeight', {})).map(([modifier, lineHeight]) => {
193-
let inheritSelector = fontInterSelector(selector, `.${e(`leading-${modifier}`)}`);
194-
return fontSizeRule(inheritSelector, fontSize, lineHeight, options);
195-
});
196-
197-
// TODO: Add modifiers for tailwind's tracking
198-
let trackingRules = [];
199-
200-
return [baseRule, ...leadingRules, ...trackingRules];
201-
})
229+
const textSizeUtilities = Object.fromEntries(
230+
Object.entries(theme('fontSize', {}))
231+
.flatMap(([modifier, fontSize]) => {
232+
let size = px(fontSize);
233+
let selector = fontInterSelector(`.${e(`text-inter-${modifier}`)}`);
234+
let baseRule = fontSizeRule(selector, size, options.baseLineHeight, options);
235+
236+
let leadingRules = Object.entries(theme('lineHeight', {}))
237+
.map(([modifier, lineHeight]) => {
238+
let inheritSelector = fontInterSelector(selector, `.${e(`leading-${modifier}`)}`);
239+
return fontSizeRule(inheritSelector, size, lineHeight, options);
240+
});
241+
242+
// TODO: Add modifiers for tailwind's tracking
243+
let trackingRules = [];
244+
245+
return [baseRule, ...leadingRules, ...trackingRules];
246+
})
202247
);
203248

204249
addUtilities(textSizeUtilities, variants('fontSize'));

0 commit comments

Comments
 (0)