vcc-ui
Version:
VCC UI is a collection of React UI Components that can be used for developing front-end applications at Volvo Car Corporation.
85 lines (71 loc) • 2.29 kB
JavaScript
import { createRenderer } from "fela";
import webPreset from "fela-preset-web";
import rtl from "fela-plugin-rtl";
import hexToRgba from "hex-to-rgba";
import sortClassnames from "fela-sort-classnames";
import { deprecate } from "./deprecate";
export function styleRenderer({ isRtl, ...rest } = {}) {
deprecate(
'Using the "isRtl" prop is deprecated and will cause no effect in the next major update. Use the "theme.direction" key instead. See https://github.com/rofrischmann/fela/tree/master/packages/fela-plugin-rtl#theme-based-mode',
isRtl !== undefined
);
const options = rest || {};
return createRenderer({
...options,
enhancers: [sortClassnames()],
plugins: [
...webPreset,
themeFontsPlugin,
hexToRgbaPlugin,
rtl(isRtl ? "rtl" : "ltr"),
...(options.plugins || [])
].filter(Boolean)
});
}
function themeFontsPlugin(style, type, renderer, props) {
const fonts = (props.theme && props.theme.fonts) || [];
const fontsPath = (props.theme && props.theme.fontsPath) || "";
for (const property in style) {
const value = style[property];
// TODO: maybe we wanna cache already rendered fonts
// but no high prio as Fela does that as well
if (typeof value === "string" && property === "fontFamily") {
// check each alternative font value
const fontValues = value.split(",");
const usedFonts = fonts.filter(
font => fontValues.indexOf(font.fontFamily) !== -1
);
if (usedFonts.length > 0) {
usedFonts.forEach(({ fontFamily, src, ...fontProps }) =>
renderer.renderFont(
fontFamily,
src.map(
// allow absolute files with http prefix
file => (file.indexOf("http") === -1 ? fontsPath : "") + file
),
fontProps
)
);
}
} else if (typeof value === "object" && !Array.isArray(value)) {
themeFontsPlugin(value, type, renderer, props);
}
}
return style;
}
// TODO: move to fela repo as an official plugin
function hexToRgbaPlugin(style) {
for (const property in style) {
const value = style[property];
if (
typeof value === "string" &&
value.indexOf("#") === 0 &&
value.length === 9
) {
style[property] = hexToRgba(value);
} else if (typeof value === "object" && !Array.isArray(value)) {
hexToRgbaPlugin(value);
}
}
return style;
}