UNPKG

1.85 kBJavaScriptView Raw
1import { splitAtTopLevelOnly } from './splitAtTopLevelOnly'
2
3let KEYWORDS = new Set(['inset', 'inherit', 'initial', 'revert', 'unset'])
4let SPACE = /\ +(?![^(]*\))/g // Similar to the one above, but with spaces instead.
5let LENGTH = /^-?(\d+|\.\d+)(.*?)$/g
6
7export function parseBoxShadowValue(input) {
8 let shadows = splitAtTopLevelOnly(input, ',')
9 return shadows.map((shadow) => {
10 let value = shadow.trim()
11 let result = { raw: value }
12 let parts = value.split(SPACE)
13 let seen = new Set()
14
15 for (let part of parts) {
16 // Reset index, since the regex is stateful.
17 LENGTH.lastIndex = 0
18
19 // Keyword
20 if (!seen.has('KEYWORD') && KEYWORDS.has(part)) {
21 result.keyword = part
22 seen.add('KEYWORD')
23 }
24
25 // Length value
26 else if (LENGTH.test(part)) {
27 if (!seen.has('X')) {
28 result.x = part
29 seen.add('X')
30 } else if (!seen.has('Y')) {
31 result.y = part
32 seen.add('Y')
33 } else if (!seen.has('BLUR')) {
34 result.blur = part
35 seen.add('BLUR')
36 } else if (!seen.has('SPREAD')) {
37 result.spread = part
38 seen.add('SPREAD')
39 }
40 }
41
42 // Color or unknown
43 else {
44 if (!result.color) {
45 result.color = part
46 } else {
47 if (!result.unknown) result.unknown = []
48 result.unknown.push(part)
49 }
50 }
51 }
52
53 // Check if valid
54 result.valid = result.x !== undefined && result.y !== undefined
55
56 return result
57 })
58}
59
60export function formatBoxShadowValue(shadows) {
61 return shadows
62 .map((shadow) => {
63 if (!shadow.valid) {
64 return shadow.raw
65 }
66
67 return [shadow.keyword, shadow.x, shadow.y, shadow.blur, shadow.spread, shadow.color]
68 .filter(Boolean)
69 .join(' ')
70 })
71 .join(', ')
72}