framework7
Version:
Full featured mobile HTML framework for building iOS & Android apps
75 lines (72 loc) • 3.18 kB
JavaScript
// eslint-disable-next-line
import { argbFromHex, hexFromArgb, themeFromSourceColor } from './material-color-utils.js';
/* eslint-disable */
// prettier-ignore
function toRGBA(d) {
const r = Math.round;
const l = d.length;
const rgba = {};
if (d.slice(0, 3).toLowerCase() === 'rgb') {
d = d.replace(' ', '').split(',');
rgba[0] = parseInt(d[0].slice(d[3].toLowerCase() === 'a' ? 5 : 4), 10);
rgba[1] = parseInt(d[1], 10);
rgba[2] = parseInt(d[2], 10);
rgba[3] = d[3] ? parseFloat(d[3]) : -1;
} else {
if (l < 6) d = parseInt(String(d[1]) + d[1] + d[2] + d[2] + d[3] + d[3] + (l > 4 ? String(d[4]) + d[4] : ''), 16);else d = parseInt(d.slice(1), 16);
rgba[0] = d >> 16 & 255;
rgba[1] = d >> 8 & 255;
rgba[2] = d & 255;
rgba[3] = l === 9 || l === 5 ? r((d >> 24 & 255) / 255 * 10000) / 10000 : -1;
}
return rgba;
}
// prettier-ignore
function blend(from, to, p) {
if (p === void 0) {
p = 0.5;
}
const r = Math.round;
from = from.trim();
to = to.trim();
const b = p < 0;
p = b ? p * -1 : p;
const f = toRGBA(from);
const t = toRGBA(to);
if (to[0] === 'r') {
return 'rgb' + (to[3] === 'a' ? 'a(' : '(') + r((t[0] - f[0]) * p + f[0]) + ',' + r((t[1] - f[1]) * p + f[1]) + ',' + r((t[2] - f[2]) * p + f[2]) + (f[3] < 0 && t[3] < 0 ? '' : ',' + (f[3] > -1 && t[3] > -1 ? r(((t[3] - f[3]) * p + f[3]) * 10000) / 10000 : t[3] < 0 ? f[3] : t[3])) + ')';
}
return '#' + (0x100000000 + (f[3] > -1 && t[3] > -1 ? r(((t[3] - f[3]) * p + f[3]) * 255) : t[3] > -1 ? r(t[3] * 255) : f[3] > -1 ? r(f[3] * 255) : 255) * 0x1000000 + r((t[0] - f[0]) * p + f[0]) * 0x10000 + r((t[1] - f[1]) * p + f[1]) * 0x100 + r((t[2] - f[2]) * p + f[2])).toString(16).slice(f[3] > -1 || t[3] > -1 ? 1 : 3);
}
/* eslint-enable */
export const materialColors = function (hexColor) {
if (hexColor === void 0) {
hexColor = '';
}
const theme = themeFromSourceColor(argbFromHex(`#${hexColor.replace('#', '')}`));
[0.05, 0.08, 0.11, 0.12, 0.14].forEach((amount, index) => {
theme.schemes.light.props[`surface${index + 1}`] = argbFromHex(blend(hexFromArgb(theme.schemes.light.props.surface), hexFromArgb(theme.schemes.light.props.primary), amount));
theme.schemes.dark.props[`surface${index + 1}`] = argbFromHex(blend(hexFromArgb(theme.schemes.dark.props.surface), hexFromArgb(theme.schemes.dark.props.primary), amount));
});
const name = n => {
return n.split('').map(char => char.toUpperCase() === char && char !== '-' && char !== '7' ? `-${char.toLowerCase()}` : char).join('');
};
const shouldSkip = prop => {
const skip = ['tertiary', 'shadow', 'scrim', 'error', 'background'];
return skip.filter(v => prop.toLowerCase().includes(v)).length > 0;
};
const light = {};
const dark = {};
Object.keys(theme.schemes.light.props).forEach(prop => {
if (shouldSkip(prop)) return;
light[name(`--f7-md-${prop}`)] = hexFromArgb(theme.schemes.light.props[prop]);
});
Object.keys(theme.schemes.dark.props).forEach(prop => {
if (shouldSkip(prop)) return;
dark[name(`--f7-md-${prop}`)] = hexFromArgb(theme.schemes.dark.props[prop]);
});
return {
light,
dark
};
};