silk-gui
Version:
GUI for developers and Node OS
100 lines (91 loc) • 2.31 kB
JavaScript
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
}
}
}