UNPKG

silk-gui

Version:

GUI for developers and Node OS

100 lines (91 loc) 2.31 kB
var _ = require('../util') var prefixes = ['-webkit-', '-moz-', '-ms-'] var camelPrefixes = ['Webkit', 'Moz', 'ms'] var importantRE = /!important;?$/ var camelRE = /([a-z])([A-Z])/g var testEl = null var propCache = {} module.exports = { deep: true, update: function (value) { if (this.arg) { this.setProp(this.arg, value) } else { if (typeof value === 'object') { // cache object styles so that only changed props // are actually updated. if (!this.cache) this.cache = {} for (var prop in value) { this.setProp(prop, value[prop]) /* jshint eqeqeq: false */ if (value[prop] != this.cache[prop]) { this.cache[prop] = value[prop] this.setProp(prop, value[prop]) } } } else { this.el.style.cssText = value } } }, setProp: function (prop, value) { prop = normalize(prop) if (!prop) return // unsupported prop // cast possible numbers/booleans into strings if (value != null) value += '' if (value) { var isImportant = importantRE.test(value) ? 'important' : '' if (isImportant) { value = value.replace(importantRE, '').trim() } this.el.style.setProperty(prop, value, isImportant) } else { this.el.style.removeProperty(prop) } } } /** * Normalize a CSS property name. * - cache result * - auto prefix * - camelCase -> dash-case * * @param {String} prop * @return {String} */ function normalize (prop) { if (propCache[prop]) { return propCache[prop] } var res = prefix(prop) propCache[prop] = propCache[res] = res return res } /** * Auto detect the appropriate prefix for a CSS property. * https://gist.github.com/paulirish/523692 * * @param {String} prop * @return {String} */ function prefix (prop) { prop = prop.replace(camelRE, '$1-$2').toLowerCase() var camel = _.camelize(prop) var upper = camel.charAt(0).toUpperCase() + camel.slice(1) if (!testEl) { testEl = document.createElement('div') } if (camel in testEl.style) { return prop } var i = prefixes.length var prefixed while (i--) { prefixed = camelPrefixes[i] + upper if (prefixed in testEl.style) { return prefixes[i] + prop } } }