smbls 0.8.33 → 0.8.36
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/package.json +1 -1
- package/src/Box.js +2 -2
- package/src/Interaction.js +7 -0
- package/src/Media copy.js +122 -0
- package/src/Media.js +67 -63
- package/src/SVG.js +3 -0
- package/src/Theme.js +2 -2
- package/src/index.js +1 -0
package/package.json
CHANGED
package/src/Box.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
import { Shape, Position, Theme, Block, Text, Overflow, Transition, Transform, Responsive } from '.'
|
|
3
|
+
import { Shape, Position, Theme, Block, Text, Overflow, Transition, Transform, Responsive, Interaction } from '.'
|
|
4
4
|
|
|
5
5
|
const PropsCSS = {
|
|
6
6
|
class: {
|
|
@@ -9,5 +9,5 @@ const PropsCSS = {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export const Box = {
|
|
12
|
-
proto: [Shape, Position, Theme, Block, Text, Overflow, Transition, Transform, Responsive, PropsCSS]
|
|
12
|
+
proto: [Shape, Position, Theme, Block, Text, Overflow, Transition, Transform, Responsive, PropsCSS, Interaction]
|
|
13
13
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
import { merge, isArray } from '@domql/utils'
|
|
4
|
+
import { CASES as CONFIG_CASES, MEDIA as CONFIG_MEDIA, getTheme } from '@symbo.ls/scratch'
|
|
5
|
+
|
|
6
|
+
const keySetters = {
|
|
7
|
+
'@': (key, props, result, element, isSubtree) => applyMediaProps(key, props, isSubtree ? result : result.media, element),
|
|
8
|
+
':': (key, props, result, element, isSubtree) => applySelectorProps(key, props, isSubtree ? result : result.selector, element),
|
|
9
|
+
$: (key, props, result, element, isSubtree) => applyCaseProps(key, props, isSubtree ? result : result.case, element),
|
|
10
|
+
'.': (key, props, result, element, isSubtree) => applyConditionalCaseProps(key, props, isSubtree ? result : result.case, element)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const execClass = (key, props, result, element) => {
|
|
14
|
+
const { class: className } = element
|
|
15
|
+
const classnameExec = className[key]
|
|
16
|
+
|
|
17
|
+
if (typeof classnameExec !== 'function') return
|
|
18
|
+
|
|
19
|
+
let classExec = classnameExec({ props })
|
|
20
|
+
if (isArray(classExec)) {
|
|
21
|
+
classExec = classExec.reduce((a, c) => merge(a, c), {})
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
for (const finalProp in classExec) {
|
|
25
|
+
result[finalProp] = classExec[finalProp]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const convertPropsToClass = (props, result, element) => {
|
|
30
|
+
const propsClassObj = {}
|
|
31
|
+
|
|
32
|
+
for (const key in props) {
|
|
33
|
+
const setter = keySetters[key.slice(0, 1)]
|
|
34
|
+
if (setter) {
|
|
35
|
+
setter(key, props[key], propsClassObj, element, true)
|
|
36
|
+
continue
|
|
37
|
+
} else {
|
|
38
|
+
execClass(key, props, propsClassObj, element)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return propsClassObj
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const applyMediaProps = (key, props, result, element) => {
|
|
46
|
+
const mediaName = CONFIG_MEDIA[key.slice(1)]
|
|
47
|
+
const mediaKey = `@media screen and ${mediaName}`
|
|
48
|
+
result[mediaKey] = convertPropsToClass(props, result, element)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const applySelectorProps = (key, props, result, element) => {
|
|
52
|
+
const selectorKey = `&${key}`
|
|
53
|
+
result[selectorKey] = convertPropsToClass(props, result, element)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const applyCaseProps = (key, props, result, element) => {
|
|
57
|
+
const caseKey = key.slice(1)
|
|
58
|
+
if (!CONFIG_CASES[caseKey]) return
|
|
59
|
+
merge(result, convertPropsToClass(props, result, element))
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const applyConditionalCaseProps = (key, props, result, element) => {
|
|
63
|
+
const caseKey = key.slice(1)
|
|
64
|
+
if (!element.props[caseKey]) return // remove classname if not here
|
|
65
|
+
merge(result, convertPropsToClass(props, result, element))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const init = (element, s) => {
|
|
69
|
+
const { props, class: className } = element
|
|
70
|
+
|
|
71
|
+
const CLASS_NAMES = {
|
|
72
|
+
media: {},
|
|
73
|
+
selector: {},
|
|
74
|
+
case: {}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
for (const key in props) {
|
|
78
|
+
const setter = keySetters[key.slice(0, 1)]
|
|
79
|
+
if (setter) setter(key, props[key], CLASS_NAMES, element)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
merge(className, CLASS_NAMES)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export const initUpdate = el => {
|
|
86
|
+
// FORCE STATE UPDATE:
|
|
87
|
+
const { props, class: className } = el
|
|
88
|
+
const rootState = el.__root ? el.__root.state : el.state
|
|
89
|
+
// if (el.key !== 'app') return
|
|
90
|
+
const { props, class: className } = element
|
|
91
|
+
|
|
92
|
+
if (props.theme) {
|
|
93
|
+
for (const key in convertTheme) {
|
|
94
|
+
if (key.includes('dark') || key.includes('light')) {
|
|
95
|
+
const parse = key.split(': ')[1].split(')')[0]
|
|
96
|
+
if (rootState.globalTheme === parse) {
|
|
97
|
+
props.theme = getTheme(theme[key])
|
|
98
|
+
} else props.theme = theme
|
|
99
|
+
className.MEDIA_FORCED_BY_STATE = props.theme
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// console.groupEnd(props.theme)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
for (const screen in props) {
|
|
106
|
+
if (screen.slice(0, 1) === '@') {
|
|
107
|
+
const mediaName = screen.slice(1)
|
|
108
|
+
const mediaKey = `@media screen and ${CONFIG_MEDIA[mediaName]}`
|
|
109
|
+
if (mediaName === 'dark' || mediaName === 'light') {
|
|
110
|
+
const { MEDIA_FORCE } = className
|
|
111
|
+
if (!MEDIA_FORCE) className.media = {}
|
|
112
|
+
if (rootState.globalTheme === mediaName) {
|
|
113
|
+
className.MEDIA_FORCED = className.MEDIA[mediaKey]
|
|
114
|
+
} else className.MEDIA_FORCED = {}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export const Responsive = {
|
|
121
|
+
on: { init, initUpdate }
|
|
122
|
+
}
|
package/src/Media.js
CHANGED
|
@@ -1,34 +1,13 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
import { merge, isArray } from '@domql/utils'
|
|
4
|
-
import { CASES as CONFIG_CASES, MEDIA as CONFIG_MEDIA
|
|
5
|
-
|
|
6
|
-
// const keySetters = {
|
|
7
|
-
// '@': (props, result, element, isSubtree) => {
|
|
8
|
-
// if (isSubtree) result.media = {}
|
|
9
|
-
// return applyMediaProps(props, result.media, element)
|
|
10
|
-
// },
|
|
11
|
-
// ':': (props, result, element, isSubtree) => {
|
|
12
|
-
// if (isSubtree) result.selector = {}
|
|
13
|
-
// return applySelectorProps(props, result.selector, element)
|
|
14
|
-
// },
|
|
15
|
-
// $: (props, result, element, isSubtree) => {
|
|
16
|
-
// if (isSubtree) result.case = {}
|
|
17
|
-
// return applyCaseProps(props, result.case, element)
|
|
18
|
-
// }
|
|
19
|
-
// }
|
|
20
|
-
|
|
21
|
-
// const keySetters = {
|
|
22
|
-
// '@': (props, result, element) => applyMediaProps(props, result.media, element),
|
|
23
|
-
// ':': (props, result, element) => applySelectorProps(props, result.selector, element),
|
|
24
|
-
// $: (props, result, element) => applyCaseProps(props, result.case, element)
|
|
25
|
-
// }
|
|
4
|
+
import { CASES as CONFIG_CASES, MEDIA as CONFIG_MEDIA } from '@symbo.ls/scratch'
|
|
26
5
|
|
|
27
6
|
const keySetters = {
|
|
28
7
|
'@': (key, props, result, element, isSubtree) => applyMediaProps(key, props, isSubtree ? result : result.media, element),
|
|
29
8
|
':': (key, props, result, element, isSubtree) => applySelectorProps(key, props, isSubtree ? result : result.selector, element),
|
|
30
9
|
$: (key, props, result, element, isSubtree) => applyCaseProps(key, props, isSubtree ? result : result.case, element),
|
|
31
|
-
'.': (key, props, result, element, isSubtree) =>
|
|
10
|
+
'.': (key, props, result, element, isSubtree) => applyConditionalCaseProps(key, props, isSubtree ? result : result.case, element)
|
|
32
11
|
}
|
|
33
12
|
|
|
34
13
|
const execClass = (key, props, result, element) => {
|
|
@@ -45,6 +24,8 @@ const execClass = (key, props, result, element) => {
|
|
|
45
24
|
for (const finalProp in classExec) {
|
|
46
25
|
result[finalProp] = classExec[finalProp]
|
|
47
26
|
}
|
|
27
|
+
|
|
28
|
+
return classExec
|
|
48
29
|
}
|
|
49
30
|
|
|
50
31
|
const convertPropsToClass = (props, result, element) => {
|
|
@@ -65,22 +46,44 @@ const convertPropsToClass = (props, result, element) => {
|
|
|
65
46
|
|
|
66
47
|
const applyMediaProps = (key, props, result, element) => {
|
|
67
48
|
const mediaName = CONFIG_MEDIA[key.slice(1)]
|
|
49
|
+
const generatedClass = convertPropsToClass(props, result, element)
|
|
50
|
+
const rootState = element.__root ? element.__root.state : element.state
|
|
51
|
+
const { globalTheme } = rootState
|
|
52
|
+
const name = key.slice(1)
|
|
53
|
+
const matchesGlobal = name === globalTheme
|
|
54
|
+
|
|
55
|
+
if (globalTheme) {
|
|
56
|
+
if (matchesGlobal) merge(result, generatedClass)
|
|
57
|
+
return
|
|
58
|
+
}
|
|
59
|
+
|
|
68
60
|
const mediaKey = `@media screen and ${mediaName}`
|
|
69
|
-
result[mediaKey] =
|
|
61
|
+
result[mediaKey] = generatedClass
|
|
62
|
+
return result[mediaKey]
|
|
70
63
|
}
|
|
71
64
|
|
|
72
65
|
const applySelectorProps = (key, props, result, element) => {
|
|
73
66
|
const selectorKey = `&${key}`
|
|
74
67
|
result[selectorKey] = convertPropsToClass(props, result, element)
|
|
68
|
+
return result[selectorKey]
|
|
75
69
|
}
|
|
76
70
|
|
|
77
71
|
const applyCaseProps = (key, props, result, element) => {
|
|
78
72
|
const caseKey = key.slice(1)
|
|
79
|
-
if (!
|
|
80
|
-
merge(result, convertPropsToClass(props, result, element))
|
|
73
|
+
if (!CONFIG_CASES[caseKey]) return
|
|
74
|
+
return merge(result, convertPropsToClass(props, result, element))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const applyConditionalCaseProps = (key, props, result, element) => {
|
|
78
|
+
const caseKey = key.slice(1)
|
|
79
|
+
const isPropTrue = element.props[caseKey]
|
|
80
|
+
console.log(isPropTrue)
|
|
81
|
+
console.log(result)
|
|
82
|
+
if (!isPropTrue) return // remove classname if not here
|
|
83
|
+
return merge(result, convertPropsToClass(props, result, element))
|
|
81
84
|
}
|
|
82
85
|
|
|
83
|
-
const
|
|
86
|
+
const beforeClassAssign = (element, s) => {
|
|
84
87
|
const { props, class: className } = element
|
|
85
88
|
|
|
86
89
|
const CLASS_NAMES = {
|
|
@@ -97,45 +100,46 @@ const init = (element, s) => {
|
|
|
97
100
|
merge(className, CLASS_NAMES)
|
|
98
101
|
}
|
|
99
102
|
|
|
100
|
-
export const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
export const initUpdate = element => {
|
|
104
|
+
const { props, class: className } = element
|
|
105
|
+
const rootState = element.__root ? element.__root.state : element.state
|
|
106
|
+
const { globalTheme } = rootState
|
|
103
107
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (props.theme) {
|
|
111
|
-
const { theme } = props
|
|
112
|
-
// console.group(props.theme)
|
|
113
|
-
|
|
114
|
-
const convertTheme = getTheme(theme)
|
|
115
|
-
|
|
116
|
-
for (const key in convertTheme) {
|
|
117
|
-
if (key.includes('dark') || key.includes('light')) {
|
|
118
|
-
const parse = key.split(': ')[1].split(')')[0]
|
|
119
|
-
if (rootState.globalTheme === parse) {
|
|
120
|
-
props.theme = getTheme(theme[key])
|
|
121
|
-
} else props.theme = theme
|
|
122
|
-
className.MEDIA_FORCED_BY_STATE = props.theme
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
// console.groupEnd(props.theme)
|
|
108
|
+
if (!globalTheme) return
|
|
109
|
+
|
|
110
|
+
const CLASS_NAMES = {
|
|
111
|
+
media: {},
|
|
112
|
+
selector: {},
|
|
113
|
+
case: {}
|
|
126
114
|
}
|
|
127
115
|
|
|
128
|
-
for (const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (mediaName === 'dark' || mediaName === 'light') {
|
|
133
|
-
const { MEDIA_FORCE } = className
|
|
134
|
-
if (!MEDIA_FORCE) className.media = {}
|
|
135
|
-
if (rootState.globalTheme === mediaName) {
|
|
136
|
-
className.MEDIA_FORCED = className.MEDIA[mediaKey]
|
|
137
|
-
} else className.MEDIA_FORCED = {}
|
|
138
|
-
}
|
|
116
|
+
for (const key in props) {
|
|
117
|
+
const setter = keySetters[key.slice(0, 1)]
|
|
118
|
+
if (key === 'theme') {
|
|
119
|
+
props.update({ themeModifier: globalTheme }, { preventRecursive: true, ignoreInitUpdate: true })
|
|
139
120
|
}
|
|
121
|
+
if (setter) setter(key, props[key], CLASS_NAMES, element)
|
|
140
122
|
}
|
|
123
|
+
|
|
124
|
+
if (Object.keys(CLASS_NAMES.media).length) className.media = CLASS_NAMES.media
|
|
125
|
+
className.selector = CLASS_NAMES.selector
|
|
126
|
+
className.case = CLASS_NAMES.case
|
|
127
|
+
|
|
128
|
+
// for (const screen in props) {
|
|
129
|
+
// if (screen.slice(0, 1) === '@') {
|
|
130
|
+
// const mediaName = screen.slice(1)
|
|
131
|
+
// const mediaKey = `@media screen and ${CONFIG_MEDIA[mediaName]}`
|
|
132
|
+
// if (mediaName === 'dark' || mediaName === 'light') {
|
|
133
|
+
// const { MEDIA_FORCE } = className
|
|
134
|
+
// if (!MEDIA_FORCE) className.media = {}
|
|
135
|
+
// if (globalTheme === mediaName) {
|
|
136
|
+
// className.MEDIA_FORCED = className.MEDIA[mediaKey]
|
|
137
|
+
// } else className.MEDIA_FORCED = {}
|
|
138
|
+
// }
|
|
139
|
+
// }
|
|
140
|
+
// }
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export const Responsive = {
|
|
144
|
+
on: { beforeClassAssign, initUpdate }
|
|
141
145
|
}
|
package/src/SVG.js
CHANGED
|
@@ -5,6 +5,9 @@ const useSVGSymbol = file => `<use xlink:href="${file}" />`
|
|
|
5
5
|
// create SVG symbol
|
|
6
6
|
export const SVG = {
|
|
7
7
|
tag: 'svg',
|
|
8
|
+
props: {
|
|
9
|
+
css: { '*': { fill: 'currentColor' } }
|
|
10
|
+
},
|
|
8
11
|
attr: {
|
|
9
12
|
xmlns: 'http://www.w3.org/2000/svg',
|
|
10
13
|
'xmlns:xlink': 'http://www.w3.org/1999/xlink'
|
package/src/Theme.js
CHANGED
|
@@ -33,9 +33,9 @@ export const Theme = {
|
|
|
33
33
|
round: ({ props, key, ...el }) => props.round ? (mapSpacing(props.round, 'borderRadius') || ({ borderRadius: props.round })) : null,
|
|
34
34
|
borderRadius: ({ props, key, ...el }) => props.borderRadius ? (mapSpacing(props.borderRadius, 'borderRadius') || ({ borderRadius: props.borderRadius })) : null,
|
|
35
35
|
|
|
36
|
-
theme: ({ props }) => {
|
|
36
|
+
theme: ({ props, key }) => {
|
|
37
37
|
if (!props.theme) return
|
|
38
|
-
return getTheme(props.theme)
|
|
38
|
+
return getTheme(props.theme, props.themeModifier)
|
|
39
39
|
},
|
|
40
40
|
|
|
41
41
|
color: ({ props }) => props.color ? ({ color: getColor(props.color) }) : null,
|