consonance
Version:
Fix your typographic scale
46 lines (31 loc) • 960 B
JavaScript
const R = require('ramda');
const ms = require('simple-modular-scale');
const consonance = (() => {
"use strict";
const mapIndexed = R.addIndex(R.map);
const comparator = R.curry((a, b) => a - b);
const toScale = R.curry((scale, input, i) => {
const difference = R.pipe(comparator(input), Math.abs);
let reducer = (memo, val) => {
var d0 = difference(memo);
var d1 = difference(val);
return d1 < d0 ? val : memo;
};
let output = R.reduce(reducer, Infinity, scale);
return { input, output, i };
});
const consonance = (sizes, options = {}) => {
var scale;
if (R.isArrayLike(options)) {
scale = options;
} else {
scale = ms(options);
}
const sortedScale = R.sort(comparator, scale)
let fn = toScale(sortedScale);
return mapIndexed(fn, sizes);
};
return consonance;
})();
if (typeof module != "undefined" && module.exports)
module.exports = consonance;