Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F102687871
cssVarsParser.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Feb 23, 05:56
Size
5 KB
Mime Type
text/x-java
Expires
Tue, Feb 25, 05:56 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
24377404
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
cssVarsParser.js
View Options
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _extends from "@babel/runtime/helpers/esm/extends";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _typeof from "@babel/runtime/helpers/esm/typeof";
/**
* This function create an object from keys, value and then assign to target
*
* @param {Object} obj : the target object to be assigned
* @param {string[]} keys
* @param {string | number} value
*
* @example
* const source = {}
* assignNestedKeys(source, ['palette', 'primary'], 'var(--palette-primary)')
* console.log(source) // { palette: { primary: 'var(--palette-primary)' } }
*
* @example
* const source = { palette: { primary: 'var(--palette-primary)' } }
* assignNestedKeys(source, ['palette', 'secondary'], 'var(--palette-secondary)')
* console.log(source) // { palette: { primary: 'var(--palette-primary)', secondary: 'var(--palette-secondary)' } }
*/
export var assignNestedKeys = function assignNestedKeys(obj, keys, value) {
var arrayKeys = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
var temp = obj;
keys.forEach(function (k, index) {
if (index === keys.length - 1) {
if (Array.isArray(temp)) {
temp[Number(k)] = value;
} else if (temp && _typeof(temp) === 'object') {
temp[k] = value;
}
} else if (temp && _typeof(temp) === 'object') {
if (!temp[k]) {
temp[k] = arrayKeys.includes(k) ? [] : {};
}
temp = temp[k];
}
});
};
/**
*
* @param {Object} obj : source object
* @param {Function} callback : a function that will be called when
* - the deepest key in source object is reached
* - the value of the deepest key is NOT `undefined` | `null`
*
* @example
* walkObjectDeep({ palette: { primary: { main: '#000000' } } }, console.log)
* // ['palette', 'primary', 'main'] '#000000'
*/
export var walkObjectDeep = function walkObjectDeep(obj, callback, shouldSkipPaths) {
function recurse(object) {
var parentKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var arrayKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
Object.entries(object).forEach(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
key = _ref2[0],
value = _ref2[1];
if (!shouldSkipPaths || shouldSkipPaths && !shouldSkipPaths([].concat(_toConsumableArray(parentKeys), [key]))) {
if (value !== undefined && value !== null) {
if (_typeof(value) === 'object' && Object.keys(value).length > 0) {
recurse(value, [].concat(_toConsumableArray(parentKeys), [key]), Array.isArray(value) ? [].concat(_toConsumableArray(arrayKeys), [key]) : arrayKeys);
} else {
callback([].concat(_toConsumableArray(parentKeys), [key]), value, arrayKeys);
}
}
}
});
}
recurse(obj);
};
var getCssValue = function getCssValue(keys, value) {
if (typeof value === 'number') {
if (['lineHeight', 'fontWeight', 'opacity', 'zIndex'].some(function (prop) {
return keys.includes(prop);
})) {
// CSS property that are unitless
return value;
}
var lastKey = keys[keys.length - 1];
if (lastKey.toLowerCase().indexOf('opacity') >= 0) {
// opacity values are unitless
return value;
}
return "".concat(value, "px");
}
return value;
};
/**
* a function that parse theme and return { css, vars }
*
* @param {Object} theme
* @param {{
* prefix?: string,
* shouldSkipGeneratingVar?: (objectPathKeys: Array<string>, value: string | number) => boolean
* }} options.
* `prefix`: The prefix of the generated CSS variables. This function does not change the value.
*
* @returns {{ css: Object, vars: Object }} `css` is the stylesheet, `vars` is an object to get css variable (same structure as theme).
*
* @example
* const { css, vars } = parser({
* fontSize: 12,
* lineHeight: 1.2,
* palette: { primary: { 500: 'var(--color)' } }
* }, { prefix: 'foo' })
*
* console.log(css) // { '--foo-fontSize': '12px', '--foo-lineHeight': 1.2, '--foo-palette-primary-500': 'var(--color)' }
* console.log(vars) // { fontSize: 'var(--foo-fontSize)', lineHeight: 'var(--foo-lineHeight)', palette: { primary: { 500: 'var(--foo-palette-primary-500)' } } }
*/
export default function cssVarsParser(theme, options) {
var _ref3 = options || {},
prefix = _ref3.prefix,
shouldSkipGeneratingVar = _ref3.shouldSkipGeneratingVar;
var css = {};
var vars = {};
walkObjectDeep(theme, function (keys, value, arrayKeys) {
if (typeof value === 'string' || typeof value === 'number') {
if (!shouldSkipGeneratingVar || !shouldSkipGeneratingVar(keys, value)) {
// only create css & var if `shouldSkipGeneratingVar` return false
var cssVar = "--".concat(prefix ? "".concat(prefix, "-") : '').concat(keys.join('-'));
_extends(css, _defineProperty({}, cssVar, getCssValue(keys, value)));
assignNestedKeys(vars, keys, "var(".concat(cssVar, ")"), arrayKeys);
}
}
}, function (keys) {
return keys[0] === 'vars';
} // skip 'vars/*' paths
);
return {
css: css,
vars: vars
};
}
Event Timeline
Log In to Comment