UNPKG

3.47 kBJavaScriptView Raw
1export const cssProperties = ['float'].concat(Object.keys(
2 findWidth(document.documentElement.style)
3).filter(p => p.indexOf('-') === -1 && p !== 'length'))
4
5function findWidth(obj) {
6 return obj.hasOwnProperty('width')
7 ? obj
8 : findWidth(Object.getPrototypeOf(obj))
9}
10
11export const memoize = (fn, cache = {}) => item =>
12 item in cache
13 ? cache[item]
14 : cache[item] = fn(item)
15
16export function add(style, prop, value) {
17 if (prop in style)
18 add(style, '!' + prop, value)
19 else
20 style[prop] = value
21}
22
23export const vendorMap = Object.create(null, {})
24export const vendorValuePrefix = Object.create(null, {})
25
26export const vendorRegex = /^(o|O|ms|MS|Ms|moz|Moz|webkit|Webkit|WebKit)([A-Z])/
27
28const appendPx = memoize(prop => {
29 const el = document.createElement('div')
30
31 try {
32 el.style[prop] = '1px'
33 el.style.setProperty(prop, '1px')
34 return el.style[prop].slice(-3) === '1px' ? 'px' : ''
35 } catch (err) {
36 return ''
37 }
38}, {
39 flex: '',
40 boxShadow: 'px',
41 border: 'px'
42})
43
44export function lowercaseFirst(string) {
45 return string.charAt(0).toLowerCase() + string.slice(1)
46}
47
48export function sanitize(styles) {
49 return Object.keys(styles).reduce((acc, key) => {
50 const value = styles[key]
51
52 if (!value && value !== 0 && value !== '')
53 return acc
54
55 if (key === 'content' && value.charAt(0) !== '"')
56 acc[key] = '"' + value + '"'
57 else
58 acc[key in vendorMap ? vendorMap[key] : key] = formatValue(key, value)
59
60 return acc
61 }, {})
62}
63
64export function assign(obj, obj2) {
65 for (const key in obj2) {
66 if (obj2.hasOwnProperty(key))
67 obj[key] = obj2[key]
68 }
69}
70
71export function hyphenToCamelCase(hyphen) {
72 return hyphen.slice(hyphen.charAt(0) === '-' ? 1 : 0).replace(/-([a-z])/g, function(match) {
73 return match[1].toUpperCase()
74 })
75}
76
77export function camelCaseToHyphen(camelCase) {
78 return camelCase.replace(/([A-Z])/g, '-$1').toLowerCase()
79}
80
81export function initials(camelCase) {
82 return camelCase.charAt(0) + (camelCase.match(/([A-Z])/g) || []).join('').toLowerCase()
83}
84
85export function objectToRules(style, selector, suffix = '', single) {
86 const base = {}
87
88 let rules = []
89
90 Object.keys(style).forEach(prop => {
91 if (prop.charAt(0) === '@')
92 rules.push(prop + '{' + objectToRules(style[prop], selector, suffix, single) + '}')
93 else if (typeof style[prop] === 'object')
94 rules = rules.concat(objectToRules(style[prop], selector, suffix + prop, single))
95 else
96 base[prop] = style[prop]
97 })
98
99 if (Object.keys(base).length) {
100 rules.unshift(
101 ((single || (suffix.charAt(0) === ' ') ? '' : '&') + '&' + suffix).replace(/&/g, selector) +
102 '{' + stylesToCss(base) + '}'
103 )
104 }
105
106 return rules
107}
108
109export const selectorSplit = /,(?=(?:(?:[^"]*"){2})*[^"]*$)/
110
111export function stylesToCss(style) {
112 return Object.keys(style).reduce((acc, prop) =>
113 acc + propToString(prop.replace(/!/g, ''), style[prop])
114 , '')
115}
116
117export function readClasses(sheet) {
118 throw new Error('not implemented')
119}
120
121function propToString(prop, value) {
122 return (vendorRegex.test(prop) ? '-' : '')
123 + (prop.charAt(0) === '-' && prop.charAt(1) === '-'
124 ? prop
125 : camelCaseToHyphen(prop)
126 )
127 + ':'
128 + value
129 + ';'
130}
131
132export function formatValue(key, value) {
133 return value in vendorValuePrefix
134 ? vendorValuePrefix[value]
135 : addPx(key, value)
136}
137
138export function addPx(key, value) {
139 return value + (isNaN(value) ? '' : appendPx(key))
140}