css-in-props 3.14.0 → 3.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +1 -1
- package/dist/cjs/index.js +1 -21
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/index.js +1 -0
- package/dist/cjs/src/props/animation.js +1 -0
- package/dist/cjs/src/props/block.js +1 -0
- package/dist/cjs/src/props/defaults.js +1 -0
- package/dist/cjs/src/props/flex.js +1 -0
- package/dist/cjs/src/props/font.js +1 -0
- package/dist/cjs/src/props/grid.js +1 -0
- package/dist/cjs/src/props/index.js +1 -0
- package/dist/cjs/src/props/misc.js +1 -0
- package/dist/cjs/src/props/position.js +1 -0
- package/dist/cjs/src/props/theme.js +1 -0
- package/dist/cjs/src/props/timing.js +1 -0
- package/dist/cjs/src/set.js +1 -0
- package/dist/cjs/src/transform/executors.js +1 -0
- package/dist/cjs/src/transform/index.js +1 -0
- package/dist/cjs/src/transform/transformers.js +1 -0
- package/dist/esm/index.js +1 -4
- package/dist/esm/src/index.js +1 -0
- package/dist/esm/src/props/animation.js +1 -0
- package/dist/esm/src/props/block.js +1 -0
- package/dist/esm/src/props/defaults.js +1 -0
- package/dist/esm/src/props/flex.js +1 -0
- package/dist/esm/src/props/font.js +1 -0
- package/dist/esm/src/props/grid.js +1 -0
- package/dist/esm/src/props/index.js +1 -0
- package/dist/esm/src/props/misc.js +1 -0
- package/dist/esm/src/props/position.js +1 -0
- package/dist/esm/src/props/theme.js +1 -0
- package/dist/esm/src/props/timing.js +1 -0
- package/dist/esm/src/set.js +1 -0
- package/dist/esm/src/transform/executors.js +1 -0
- package/dist/esm/src/transform/index.js +1 -0
- package/dist/esm/src/transform/transformers.js +1 -0
- package/package.json +19 -20
- package/dist/cjs/props/animation.js +0 -126
- package/dist/cjs/props/block.js +0 -173
- package/dist/cjs/props/defaults.js +0 -340
- package/dist/cjs/props/flex.js +0 -44
- package/dist/cjs/props/font.js +0 -36
- package/dist/cjs/props/grid.js +0 -39
- package/dist/cjs/props/index.js +0 -55
- package/dist/cjs/props/misc.js +0 -42
- package/dist/cjs/props/position.js +0 -51
- package/dist/cjs/props/theme.js +0 -147
- package/dist/cjs/props/timing.js +0 -42
- package/dist/cjs/set.js +0 -36
- package/dist/cjs/transform/executors.js +0 -131
- package/dist/cjs/transform/index.js +0 -19
- package/dist/cjs/transform/transformers.js +0 -156
- package/dist/esm/props/animation.js +0 -106
- package/dist/esm/props/block.js +0 -159
- package/dist/esm/props/defaults.js +0 -321
- package/dist/esm/props/flex.js +0 -24
- package/dist/esm/props/font.js +0 -16
- package/dist/esm/props/grid.js +0 -19
- package/dist/esm/props/index.js +0 -34
- package/dist/esm/props/misc.js +0 -22
- package/dist/esm/props/position.js +0 -31
- package/dist/esm/props/theme.js +0 -137
- package/dist/esm/props/timing.js +0 -26
- package/dist/esm/set.js +0 -16
- package/dist/esm/transform/executors.js +0 -111
- package/dist/esm/transform/index.js +0 -2
- package/dist/esm/transform/transformers.js +0 -136
- package/dist/iife/index.js +0 -1147
- package/index.js +0 -1
- package/src/index.js +0 -6
- package/src/props/animation.js +0 -119
- package/src/props/block.js +0 -183
- package/src/props/defaults.js +0 -318
- package/src/props/flex.js +0 -30
- package/src/props/font.js +0 -16
- package/src/props/grid.js +0 -21
- package/src/props/index.js +0 -35
- package/src/props/misc.js +0 -23
- package/src/props/position.js +0 -34
- package/src/props/theme.js +0 -155
- package/src/props/timing.js +0 -26
- package/src/set.js +0 -16
- package/src/transform/executors.js +0 -123
- package/src/transform/index.js +0 -4
- package/src/transform/transformers.js +0 -178
package/src/props/index.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { ANIMATION_PROPS } from './animation.js'
|
|
4
|
-
import { BLOCK_PROPS } from './block.js'
|
|
5
|
-
import { FONT_PROPS } from './font.js'
|
|
6
|
-
import { MISC_PROPS } from './misc.js'
|
|
7
|
-
import { POSITION_PROPS } from './position.js'
|
|
8
|
-
import { THEME_PROPS } from './theme.js'
|
|
9
|
-
import { TIMING_PROPS } from './timing.js'
|
|
10
|
-
import { FLEX_PROPS } from './flex.js'
|
|
11
|
-
import { GRID_PROPS } from './grid.js'
|
|
12
|
-
|
|
13
|
-
export * from './animation.js'
|
|
14
|
-
export * from './block.js'
|
|
15
|
-
export * from './font.js'
|
|
16
|
-
export * from './misc.js'
|
|
17
|
-
export * from './position.js'
|
|
18
|
-
export * from './theme.js'
|
|
19
|
-
export * from './timing.js'
|
|
20
|
-
export * from './flex.js'
|
|
21
|
-
export * from './grid.js'
|
|
22
|
-
|
|
23
|
-
export const CSS_PROPS_REGISTRY = {
|
|
24
|
-
...ANIMATION_PROPS,
|
|
25
|
-
...BLOCK_PROPS,
|
|
26
|
-
...FONT_PROPS,
|
|
27
|
-
...MISC_PROPS,
|
|
28
|
-
...POSITION_PROPS,
|
|
29
|
-
...THEME_PROPS,
|
|
30
|
-
...TIMING_PROPS,
|
|
31
|
-
...FLEX_PROPS,
|
|
32
|
-
...GRID_PROPS
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export default CSS_PROPS_REGISTRY
|
package/src/props/misc.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
export const MISC_PROPS = {
|
|
4
|
-
overflow: (value) => ({
|
|
5
|
-
overflow: value,
|
|
6
|
-
scrollBehavior: 'smooth'
|
|
7
|
-
}),
|
|
8
|
-
cursor: (value, el, s, ctx) => {
|
|
9
|
-
if (!value) return
|
|
10
|
-
|
|
11
|
-
const asset = ctx.assets && ctx.assets[value]
|
|
12
|
-
if (asset && asset.content) value = `url(${asset.content.src})`
|
|
13
|
-
else {
|
|
14
|
-
const file = ctx.files && ctx.files[value]
|
|
15
|
-
if (file && file.content) value = `url(${file.content.src})`
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return ({ cursor: value })
|
|
19
|
-
},
|
|
20
|
-
opacity: (value) => value != null ? ({ opacity: String(value) }) : undefined,
|
|
21
|
-
visibility: (value) => value != null ? ({ visibility: value }) : undefined,
|
|
22
|
-
pointerEvents: (value) => value != null ? ({ pointerEvents: value }) : undefined
|
|
23
|
-
}
|
package/src/props/position.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { getSpacingByKey } from '@symbo.ls/scratch'
|
|
4
|
-
|
|
5
|
-
export const POSITION_PROPS = {
|
|
6
|
-
inset: (val, el) => {
|
|
7
|
-
if (el.call('isNumber', val)) return ({ inset: val })
|
|
8
|
-
if (!el.call('isString', val)) return
|
|
9
|
-
return { inset: val.split(' ').map(v => getSpacingByKey(v, 'k').k).join(' ') }
|
|
10
|
-
},
|
|
11
|
-
|
|
12
|
-
left: (val) => getSpacingByKey(val, 'left'),
|
|
13
|
-
top: (val) => getSpacingByKey(val, 'top'),
|
|
14
|
-
right: (val) => getSpacingByKey(val, 'right'),
|
|
15
|
-
bottom: (val) => getSpacingByKey(val, 'bottom'),
|
|
16
|
-
|
|
17
|
-
verticalInset: (val) => {
|
|
18
|
-
if (typeof val !== 'string') return
|
|
19
|
-
const vi = val.split(' ').map(v => getSpacingByKey(v, 'k').k)
|
|
20
|
-
return {
|
|
21
|
-
top: vi[0],
|
|
22
|
-
bottom: vi[1] || vi[0]
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
horizontalInset: (val) => {
|
|
27
|
-
if (typeof val !== 'string') return
|
|
28
|
-
const vi = val.split(' ').map(v => getSpacingByKey(v, 'k').k)
|
|
29
|
-
return {
|
|
30
|
-
left: vi[0],
|
|
31
|
-
right: vi[1] || vi[0]
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
package/src/props/theme.js
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
getMediaTheme,
|
|
5
|
-
getMediaColor,
|
|
6
|
-
transformTextStroke,
|
|
7
|
-
transformShadow,
|
|
8
|
-
transformBoxShadow,
|
|
9
|
-
transformBorder,
|
|
10
|
-
transformBackgroundImage,
|
|
11
|
-
resolveColorsInGradient,
|
|
12
|
-
transformSizeRatio
|
|
13
|
-
} from '@symbo.ls/scratch'
|
|
14
|
-
|
|
15
|
-
import { isDefined, isString } from '@symbo.ls/utils'
|
|
16
|
-
|
|
17
|
-
export const getSystemGlobalTheme = ({ context, state }) => {
|
|
18
|
-
const theme = state?.root?.globalTheme || context.designSystem?.globalTheme
|
|
19
|
-
return theme === 'auto' ? null : theme
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export const THEME_PROPS = {
|
|
23
|
-
theme: (val, element) => {
|
|
24
|
-
if (!val) return
|
|
25
|
-
|
|
26
|
-
// themeModifier explicitly forces a scheme on this component
|
|
27
|
-
if (element.themeModifier) {
|
|
28
|
-
return getMediaTheme(val, `@${element.themeModifier}`)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// CSS vars handle dark/light switching — no modifier needed, no DOMQL re-render
|
|
32
|
-
return getMediaTheme(val)
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
color: (val, element) => {
|
|
36
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
37
|
-
if (!val) return
|
|
38
|
-
return {
|
|
39
|
-
color: getMediaColor(val, globalTheme)
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
background: (val, element) => {
|
|
44
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
45
|
-
if (!val) return
|
|
46
|
-
if (isString(val) && val.includes('gradient')) {
|
|
47
|
-
return { background: resolveColorsInGradient(val, globalTheme) }
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
background: getMediaColor(val, globalTheme)
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
backgroundColor: (val, element) => {
|
|
55
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
56
|
-
if (!val) return
|
|
57
|
-
return {
|
|
58
|
-
backgroundColor: getMediaColor(val, globalTheme)
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
backgroundImage: (val, element, s, ctx) => {
|
|
63
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
64
|
-
if (!val) return
|
|
65
|
-
const asset = ctx.assets && ctx.assets[val]
|
|
66
|
-
if (asset && asset.content) val = asset.content.src
|
|
67
|
-
else {
|
|
68
|
-
const file = ctx.files && ctx.files[val]
|
|
69
|
-
if (file && file.content) val = file.content.src
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
backgroundImage: transformBackgroundImage(val, globalTheme)
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
|
|
76
|
-
textStroke: (val) => ({
|
|
77
|
-
WebkitTextStroke: transformTextStroke(val)
|
|
78
|
-
}),
|
|
79
|
-
|
|
80
|
-
outline: (val) => ({
|
|
81
|
-
outline: transformBorder(val)
|
|
82
|
-
}),
|
|
83
|
-
|
|
84
|
-
outlineOffset: (val, el) => transformSizeRatio('outlineOffset', val, el),
|
|
85
|
-
|
|
86
|
-
border: (val) => ({
|
|
87
|
-
border: transformBorder(val)
|
|
88
|
-
}),
|
|
89
|
-
|
|
90
|
-
borderColor: (val, element) => {
|
|
91
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
92
|
-
if (!val) return
|
|
93
|
-
return {
|
|
94
|
-
borderColor: getMediaColor(val, globalTheme)
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
borderTopColor: (val, element) => {
|
|
98
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
99
|
-
if (!val) return
|
|
100
|
-
return { borderTopColor: getMediaColor(val, globalTheme) }
|
|
101
|
-
},
|
|
102
|
-
borderBottomColor: (val, element) => {
|
|
103
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
104
|
-
if (!val) return
|
|
105
|
-
return { borderBottomColor: getMediaColor(val, globalTheme) }
|
|
106
|
-
},
|
|
107
|
-
borderLeftColor: (val, element) => {
|
|
108
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
109
|
-
if (!val) return
|
|
110
|
-
return { borderLeftColor: getMediaColor(val, globalTheme) }
|
|
111
|
-
},
|
|
112
|
-
borderRightColor: (val, element) => {
|
|
113
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
114
|
-
if (!val) return
|
|
115
|
-
return { borderRightColor: getMediaColor(val, globalTheme) }
|
|
116
|
-
},
|
|
117
|
-
borderLeft: (val) => ({
|
|
118
|
-
borderLeft: transformBorder(val)
|
|
119
|
-
}),
|
|
120
|
-
borderTop: (val) => ({
|
|
121
|
-
borderTop: transformBorder(val)
|
|
122
|
-
}),
|
|
123
|
-
borderRight: (val) => ({
|
|
124
|
-
borderRight: transformBorder(val)
|
|
125
|
-
}),
|
|
126
|
-
borderBottom: (val) => ({
|
|
127
|
-
borderBottom: transformBorder(val)
|
|
128
|
-
}),
|
|
129
|
-
|
|
130
|
-
shadow: (val, element) => {
|
|
131
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
132
|
-
if (!val) return
|
|
133
|
-
return ({
|
|
134
|
-
boxShadow: transformShadow(val, globalTheme)
|
|
135
|
-
})
|
|
136
|
-
},
|
|
137
|
-
|
|
138
|
-
boxShadow: (val, element) => {
|
|
139
|
-
if (!isString(val)) return
|
|
140
|
-
const [value, hasImportant] = val.split('!importan')
|
|
141
|
-
const globalTheme = getSystemGlobalTheme(element)
|
|
142
|
-
const important = hasImportant ? ' !important' : ''
|
|
143
|
-
return {
|
|
144
|
-
boxShadow: transformBoxShadow(value.trim(), globalTheme) + important
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
|
|
148
|
-
textShadow: (val, { context }) => ({
|
|
149
|
-
textShadow: transformBoxShadow(val, context.designSystem.globalTheme)
|
|
150
|
-
}),
|
|
151
|
-
|
|
152
|
-
columnRule: (val) => ({
|
|
153
|
-
columnRule: transformBorder(val)
|
|
154
|
-
})
|
|
155
|
-
}
|
package/src/props/timing.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
getTimingFunction,
|
|
5
|
-
splitTransition,
|
|
6
|
-
transformDuration
|
|
7
|
-
} from '@symbo.ls/scratch'
|
|
8
|
-
|
|
9
|
-
export const TIMING_PROPS = {
|
|
10
|
-
transition: val => ({
|
|
11
|
-
transition: splitTransition(val)
|
|
12
|
-
}),
|
|
13
|
-
transitionDuration: val => ({
|
|
14
|
-
transitionDuration: transformDuration(val)
|
|
15
|
-
}),
|
|
16
|
-
transitionDelay: val => ({
|
|
17
|
-
transitionDelay: transformDuration(val)
|
|
18
|
-
}),
|
|
19
|
-
transitionTimingFunction: val => ({
|
|
20
|
-
transitionTimingFunction: getTimingFunction(val)
|
|
21
|
-
}),
|
|
22
|
-
transitionProperty: val => ({
|
|
23
|
-
transitionProperty: val,
|
|
24
|
-
willChange: val
|
|
25
|
-
})
|
|
26
|
-
}
|
package/src/set.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { isObject } from '@symbo.ls/utils'
|
|
4
|
-
import { useCssInProps } from './transform/index.js'
|
|
5
|
-
import { css } from '@symbo.ls/css'
|
|
6
|
-
|
|
7
|
-
export const transformClassname = (element) => {
|
|
8
|
-
if (!isObject(element)) return
|
|
9
|
-
return useCssInProps(element, element)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const setClassname = (props, cssEngine) => {
|
|
13
|
-
const transform = transformClassname(props)
|
|
14
|
-
if (typeof cssEngine === 'function') return cssEngine(transform)
|
|
15
|
-
return css(transform)
|
|
16
|
-
}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { exec, isArray, isFunction, isObject, isProduction, merge, overwrite, overwriteDeep } from '@symbo.ls/utils'
|
|
4
|
-
import { pushConfig, popConfig } from '@symbo.ls/scratch'
|
|
5
|
-
import { CSS_PROPS_REGISTRY } from '../props/index.js'
|
|
6
|
-
import { DEFAULT_CSS_PROPERTIES_LIST } from '../props/defaults.js'
|
|
7
|
-
import { applyTrueProps, transformersByPrefix } from './transformers.js'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* CLASS ASSIGNMENT
|
|
11
|
-
* Main handlers for processing and assigning classes
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
const isProd = isProduction()
|
|
15
|
-
|
|
16
|
-
// Process non-setter properties and return remaining props
|
|
17
|
-
export const usePropsAsCSS = (sourceObj, element, opts) => {
|
|
18
|
-
const ds = element?.context?.designSystem
|
|
19
|
-
if (ds) pushConfig(ds)
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
let obj = {}
|
|
23
|
-
const rest = {}
|
|
24
|
-
|
|
25
|
-
const setToObj = (key, val) => {
|
|
26
|
-
if (opts.unpack) {
|
|
27
|
-
obj = { ...obj, ...val }
|
|
28
|
-
return
|
|
29
|
-
}
|
|
30
|
-
obj[key] = val
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
for (const key in sourceObj) {
|
|
34
|
-
const value = sourceObj[key]
|
|
35
|
-
if (key === 'class' && element.call('isString', sourceObj.class)) {
|
|
36
|
-
const val = value.split(' ')
|
|
37
|
-
if (val.length) {
|
|
38
|
-
const CLASS = element.context.designSystem.class
|
|
39
|
-
const result = val
|
|
40
|
-
.reduce((acc, curr) => merge(acc, CLASS[curr]), {})
|
|
41
|
-
obj.designSystemClass = result
|
|
42
|
-
}
|
|
43
|
-
} else if (key === 'true') {
|
|
44
|
-
const val = exec(value, element)
|
|
45
|
-
merge(obj, applyTrueProps(val, element))
|
|
46
|
-
} else if (element.classlist[key]) {
|
|
47
|
-
const originalFromClass = element.classlist[key]
|
|
48
|
-
const result = isFunction(originalFromClass)
|
|
49
|
-
? originalFromClass(element, element.state, element.context)
|
|
50
|
-
: originalFromClass
|
|
51
|
-
if (result) setToObj(key, result)
|
|
52
|
-
if (!isProd && isObject(obj[key])) obj[key].label = key
|
|
53
|
-
} else if (CSS_PROPS_REGISTRY[key]) {
|
|
54
|
-
let val = exec(value, element)
|
|
55
|
-
if (isArray(val)) {
|
|
56
|
-
val = val.reduce((a, c) => merge(a, c), {})
|
|
57
|
-
}
|
|
58
|
-
let result = CSS_PROPS_REGISTRY[key](val, element, element.state, element.context)
|
|
59
|
-
if (isArray(result)) result = result.reduce((a, c) => merge(a, c), {})
|
|
60
|
-
if (result) setToObj(key, result)
|
|
61
|
-
if (!isProd && isObject(obj[key])) obj[key].label = key
|
|
62
|
-
} else if (DEFAULT_CSS_PROPERTIES_LIST.has(key)) {
|
|
63
|
-
// they can be grouped
|
|
64
|
-
let result = exec(value, element)
|
|
65
|
-
if (typeof result === 'string' && result.charCodeAt(0) === 45 && result.charCodeAt(1) === 45) {
|
|
66
|
-
result = `var(${result})`
|
|
67
|
-
}
|
|
68
|
-
setToObj(key, { [key]: result })
|
|
69
|
-
if (!isProd && isObject(obj[key])) obj[key].label = key
|
|
70
|
-
} else {
|
|
71
|
-
rest[key] = value
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return [obj, rest]
|
|
76
|
-
} finally {
|
|
77
|
-
if (ds) popConfig()
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export const useSelectorsAsCSS = (sourceObj, element) => {
|
|
82
|
-
const obj = {}
|
|
83
|
-
for (const key in sourceObj) {
|
|
84
|
-
const selectroSetter = transformersByPrefix[key.slice(0, 1)]
|
|
85
|
-
if (selectroSetter) {
|
|
86
|
-
const result = selectroSetter(key, sourceObj[key], element)
|
|
87
|
-
if (result) {
|
|
88
|
-
for (const k in result) {
|
|
89
|
-
if (Object.prototype.hasOwnProperty.call(result, k)) {
|
|
90
|
-
if (obj[k] && typeof obj[k] === 'object' && typeof result[k] === 'object') {
|
|
91
|
-
overwriteDeep(obj[k], result[k])
|
|
92
|
-
} else {
|
|
93
|
-
obj[k] = result[k]
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return obj
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export const useCssInProps = (selectorProps, element, opts = { unpack: true }) => {
|
|
104
|
-
const [cssObj, restProps] = usePropsAsCSS(selectorProps, element, opts)
|
|
105
|
-
const selectorsObj = useSelectorsAsCSS(restProps, element)
|
|
106
|
-
let hasSelectors = false
|
|
107
|
-
for (const _k in selectorsObj) { hasSelectors = true; break } // eslint-disable-line
|
|
108
|
-
if (hasSelectors) {
|
|
109
|
-
if (opts.unpack) return overwrite(cssObj, selectorsObj)
|
|
110
|
-
cssObj._selectors = selectorsObj
|
|
111
|
-
}
|
|
112
|
-
return cssObj
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export const exetuteClassPerComponent = (component, element) => {
|
|
116
|
-
const classObj = {}
|
|
117
|
-
if (component.class) {
|
|
118
|
-
for (const classProp in component.class) {
|
|
119
|
-
classObj[classProp] = component.class[classProp](element)
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return classObj
|
|
123
|
-
}
|
package/src/transform/index.js
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { isFunction } from '@symbo.ls/utils'
|
|
4
|
-
import { useCssInProps } from './executors.js'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* PROP APPLICATORS
|
|
8
|
-
* Functions that handle different types of property applications
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
// Match `[data-theme="dark"]` / `[data-theme='light']` with either quote
|
|
12
|
-
// style, grabbing the scheme name (`dark` / `light` / custom) for pairing
|
|
13
|
-
// with `prefers-color-scheme`.
|
|
14
|
-
const DATA_THEME_RE = /^\[data-theme=(?:"([^"]+)"|'([^']+)')\]$/
|
|
15
|
-
|
|
16
|
-
// Media query handler
|
|
17
|
-
const applyMediaProps = (key, selectorProps, element) => {
|
|
18
|
-
const { context } = element
|
|
19
|
-
if (!context.designSystem?.media) return
|
|
20
|
-
|
|
21
|
-
const schemeKey = key.slice(1)
|
|
22
|
-
const mediaValue = context.designSystem.media[schemeKey]
|
|
23
|
-
const generatedClass = useCssInProps(selectorProps, element)
|
|
24
|
-
|
|
25
|
-
if (!mediaValue) {
|
|
26
|
-
return { [key]: generatedClass }
|
|
27
|
-
}
|
|
28
|
-
if (mediaValue === 'print') {
|
|
29
|
-
return { '@media print': generatedClass }
|
|
30
|
-
}
|
|
31
|
-
if (mediaValue[0] === '(') {
|
|
32
|
-
return { [`@media screen and ${mediaValue}`]: generatedClass }
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// CSS selector (e.g. `[data-theme="dark"]`). Always emit the selector
|
|
36
|
-
// rule so explicit `data-theme="dark"` wins. For the standard `dark` /
|
|
37
|
-
// `light` schemes, ALSO emit a `@media (prefers-color-scheme: X)`
|
|
38
|
-
// fallback so the component adopts the OS scheme when `data-theme` is
|
|
39
|
-
// absent (i.e. `globalTheme: 'auto'`). Guard the fallback with
|
|
40
|
-
// `:not([data-theme])` on the app scope root so an explicit
|
|
41
|
-
// `data-theme="light"` (stamped on the app root) forces light even when
|
|
42
|
-
// the OS prefers dark. Other schemes (`sepia`, custom) are opt-in only.
|
|
43
|
-
const match = mediaValue.match(DATA_THEME_RE)
|
|
44
|
-
const scheme = match ? (match[1] || match[2]) : schemeKey
|
|
45
|
-
const result = { [`${mediaValue} &`]: generatedClass }
|
|
46
|
-
if (scheme === 'dark' || scheme === 'light') {
|
|
47
|
-
const scopeSelector = context.designSystem?.scopeSelector || ':root'
|
|
48
|
-
const guard = scopeSelector === ':root'
|
|
49
|
-
? ':root:not([data-theme])'
|
|
50
|
-
: `${scopeSelector}:not([data-theme])`
|
|
51
|
-
result[`@media (prefers-color-scheme: ${scheme})`] = {
|
|
52
|
-
[`${guard} &`]: generatedClass
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return result
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Simple applicators
|
|
59
|
-
const applyAndProps = (key, selectorProps, element) => {
|
|
60
|
-
return { [key]: useCssInProps(selectorProps, element) }
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const applySelectorProps = (key, selectorProps, element) => {
|
|
64
|
-
const selectorKey = `&${key}`
|
|
65
|
-
const resolved = useCssInProps(selectorProps, element)
|
|
66
|
-
|
|
67
|
-
// When the selector has commas and the resolved value contains nested selectors
|
|
68
|
-
// (e.g. '> h1'), distribute each nested selector across all comma parts
|
|
69
|
-
if (key.includes(',') && resolved) {
|
|
70
|
-
const flat = {}
|
|
71
|
-
const nested = {}
|
|
72
|
-
for (const k in resolved) {
|
|
73
|
-
if (typeof resolved[k] === 'object' && resolved[k] !== null) {
|
|
74
|
-
nested[k] = resolved[k]
|
|
75
|
-
} else {
|
|
76
|
-
flat[k] = resolved[k]
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (Object.keys(nested).length) {
|
|
80
|
-
const parts = selectorKey.split(',').map(p => p.trim())
|
|
81
|
-
const result = {}
|
|
82
|
-
// Flat styles apply to the combined selector
|
|
83
|
-
if (Object.keys(flat).length) {
|
|
84
|
-
result[selectorKey] = flat
|
|
85
|
-
}
|
|
86
|
-
// Each nested selector is distributed across all comma parts
|
|
87
|
-
for (const nestedKey in nested) {
|
|
88
|
-
const distributed = parts.map(p => `${p} ${nestedKey}`).join(', ')
|
|
89
|
-
result[distributed] = nested[nestedKey]
|
|
90
|
-
}
|
|
91
|
-
return result
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return { [selectorKey]: resolved }
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Resolve a case value from context.cases
|
|
99
|
-
const resolveCase = (caseKey, element) => {
|
|
100
|
-
const caseFn = element.context?.cases?.[caseKey]
|
|
101
|
-
if (caseFn === undefined) return undefined
|
|
102
|
-
if (isFunction(caseFn)) return caseFn.call(element, element)
|
|
103
|
-
return !!caseFn
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// $ prefix: Global cases from context.cases
|
|
107
|
-
const applyCaseProps = (key, selectorProps, element) => {
|
|
108
|
-
const caseKey = key.slice(1)
|
|
109
|
-
let isCaseTrue = resolveCase(caseKey, element)
|
|
110
|
-
if (isCaseTrue === undefined) {
|
|
111
|
-
isCaseTrue = !!element[caseKey]
|
|
112
|
-
}
|
|
113
|
-
if (!isCaseTrue) return
|
|
114
|
-
return useCssInProps(selectorProps, element)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const applyVariableProps = (key, selectorVal, element) => {
|
|
118
|
-
return { [key]: selectorVal }
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// . prefix: Truthy conditional (element/state first, then context.cases)
|
|
122
|
-
const applyConditionalCaseProps = (key, selectorProps, element) => {
|
|
123
|
-
const caseKey = key.slice(1)
|
|
124
|
-
let isCaseTrue = element[caseKey] === true || element.state?.[caseKey]
|
|
125
|
-
if (!isCaseTrue) {
|
|
126
|
-
if (typeof element[caseKey] === 'function') {
|
|
127
|
-
try { isCaseTrue = element[caseKey](element, element.state, element.context) } catch (e) {}
|
|
128
|
-
} else {
|
|
129
|
-
const caseResult = resolveCase(caseKey, element)
|
|
130
|
-
if (caseResult !== undefined) isCaseTrue = caseResult
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
if (!isCaseTrue) return
|
|
134
|
-
return useCssInProps(selectorProps, element)
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// ! prefix: Falsy conditional (element/state first, then context.cases)
|
|
138
|
-
const applyConditionalFalsyProps = (key, selectorProps, element) => {
|
|
139
|
-
const caseKey = key.slice(1)
|
|
140
|
-
let isCaseTrue = element[caseKey] === true || element.state?.[caseKey]
|
|
141
|
-
if (!isCaseTrue) {
|
|
142
|
-
if (typeof element[caseKey] === 'function') {
|
|
143
|
-
try { isCaseTrue = element[caseKey](element, element.state, element.context) } catch (e) {}
|
|
144
|
-
} else {
|
|
145
|
-
const caseResult = resolveCase(caseKey, element)
|
|
146
|
-
if (caseResult !== undefined) isCaseTrue = caseResult
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
if (isCaseTrue) return
|
|
150
|
-
return useCssInProps(selectorProps, element)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export const applyTrueProps = (selectorProps, element) => {
|
|
154
|
-
return useCssInProps(selectorProps, element)
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* REGISTRY
|
|
159
|
-
* Mapping of key prefixes to their handler functions
|
|
160
|
-
*/
|
|
161
|
-
export const transformersByPrefix = {
|
|
162
|
-
'@': applyMediaProps,
|
|
163
|
-
|
|
164
|
-
// Selector handlers
|
|
165
|
-
':': applySelectorProps,
|
|
166
|
-
'[': applySelectorProps,
|
|
167
|
-
'*': applySelectorProps,
|
|
168
|
-
'+': applySelectorProps,
|
|
169
|
-
'~': applySelectorProps,
|
|
170
|
-
'&': applyAndProps,
|
|
171
|
-
'>': applyAndProps,
|
|
172
|
-
|
|
173
|
-
// Conditional and variable handlers
|
|
174
|
-
$: applyCaseProps,
|
|
175
|
-
'-': applyVariableProps,
|
|
176
|
-
'.': applyConditionalCaseProps,
|
|
177
|
-
'!': applyConditionalFalsyProps
|
|
178
|
-
}
|