smbls 0.8.31 → 0.8.34

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.
Files changed (3) hide show
  1. package/package.json +1 -1
  2. package/src/Link.js +1 -1
  3. package/src/Media.js +103 -82
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "UI Library built on Scratch and DOMQL",
4
4
  "private": false,
5
5
  "author": "symbo.ls",
6
- "version": "0.8.31",
6
+ "version": "0.8.34",
7
7
  "repository": "https://github.com/symbo-ls/smbls",
8
8
  "main": "src/index.js",
9
9
  "files": [
package/src/Link.js CHANGED
@@ -7,7 +7,7 @@ export const Link = {
7
7
  proto: [Shape, Text],
8
8
  tag: 'a',
9
9
  props: {
10
- theme: 'link',
10
+ // theme: 'link',
11
11
  aria: {},
12
12
  fontWeight: 'bold',
13
13
  textDecoration: 'none'
package/src/Media.js CHANGED
@@ -3,61 +3,91 @@
3
3
  import { merge, isArray } from '@domql/utils'
4
4
  import { CASES as CONFIG_CASES, MEDIA as CONFIG_MEDIA, getTheme } from '@symbo.ls/scratch'
5
5
 
6
- const convertPropsToClass = (subProps, lib, element) => {
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
+ // }
26
+
27
+ const keySetters = {
28
+ '@': (key, props, result, element, isSubtree) => applyMediaProps(key, props, isSubtree ? result : result.media, element),
29
+ ':': (key, props, result, element, isSubtree) => applySelectorProps(key, props, isSubtree ? result : result.selector, element),
30
+ $: (key, props, result, element, isSubtree) => applyCaseProps(key, props, isSubtree ? result : result.case, element),
31
+ '.': (key, props, result, element, isSubtree) => applyConditionalCaseProps(key, props, isSubtree ? result : result.case, element)
32
+ }
33
+
34
+ const execClass = (key, props, result, element) => {
7
35
  const { class: className } = element
8
- const subPropsClassname = {}
9
- for (const prop in subProps) {
10
- // if (prop.slice(0, 1) === ':') {
11
- // applySelectorProps(prop, lib, element)
12
- // continue
13
- // }
14
-
15
- const classnameExec = className[prop]
16
- if (typeof classnameExec !== 'function') continue
17
-
18
- let classExec = classnameExec({ props: subProps })
19
- if (isArray(classExec)) {
20
- classExec = classExec.reduce((a, c) => merge(a, c), {})
21
- }
36
+ const classnameExec = className[key]
37
+
38
+ if (typeof classnameExec !== 'function') return
39
+
40
+ let classExec = classnameExec({ props })
41
+ if (isArray(classExec)) {
42
+ classExec = classExec.reduce((a, c) => merge(a, c), {})
43
+ }
44
+
45
+ for (const finalProp in classExec) {
46
+ result[finalProp] = classExec[finalProp]
47
+ }
48
+ }
49
+
50
+ const convertPropsToClass = (props, result, element) => {
51
+ const propsClassObj = {}
22
52
 
23
- for (const finalProp in classExec) {
24
- subPropsClassname[finalProp] = classExec[finalProp]
53
+ for (const key in props) {
54
+ const setter = keySetters[key.slice(0, 1)]
55
+ if (setter) {
56
+ setter(key, props[key], propsClassObj, element, true)
57
+ continue
58
+ } else {
59
+ execClass(key, props, propsClassObj, element)
25
60
  }
26
61
  }
27
- return subPropsClassname
62
+
63
+ return propsClassObj
28
64
  }
29
65
 
30
- const applyMediaProps = (key, lib, element) => {
31
- const { props } = element
66
+ const applyMediaProps = (key, props, result, element) => {
32
67
  const mediaName = CONFIG_MEDIA[key.slice(1)]
33
- const mediaKey = `@media key and ${mediaName}`
34
- const mediaProps = props[key]
35
- lib.media[mediaKey] = convertPropsToClass(mediaProps, lib, element)
68
+ const mediaKey = `@media screen and ${mediaName}`
69
+ result[mediaKey] = convertPropsToClass(props, result, element)
36
70
  }
37
71
 
38
- const applySelectorProps = (key, lib, element) => {
39
- const { props } = element
72
+ const applySelectorProps = (key, props, result, element) => {
40
73
  const selectorKey = `&${key}`
41
- const selectorProps = props[key]
42
- lib.selector[selectorKey] = convertPropsToClass(selectorProps, lib, element)
74
+ result[selectorKey] = convertPropsToClass(props, result, element)
43
75
  }
44
76
 
45
- const applyCaseProps = (key, lib, element) => {
46
- const { props } = element
77
+ const applyCaseProps = (key, props, result, element) => {
47
78
  const caseKey = key.slice(1)
48
79
  if (!CONFIG_CASES[caseKey]) return
49
- const caseProps = props[key]
50
- merge(lib.case, convertPropsToClass(caseProps, lib, element))
80
+ merge(result, convertPropsToClass(props, result, element))
51
81
  }
52
82
 
53
- const keySetters = {
54
- '@': applyMediaProps,
55
- ':': applySelectorProps,
56
- $: applyCaseProps
83
+ const applyConditionalCaseProps = (key, props, result, element) => {
84
+ const caseKey = key.slice(1)
85
+ if (!element.props[caseKey]) return
86
+ merge(result, convertPropsToClass(props, result, element))
57
87
  }
58
88
 
59
- const init = (el, s) => {
60
- const { props, class: className } = el
89
+ const init = (element, s) => {
90
+ const { props, class: className } = element
61
91
 
62
92
  const CLASS_NAMES = {
63
93
  media: {},
@@ -67,59 +97,50 @@ const init = (el, s) => {
67
97
 
68
98
  for (const key in props) {
69
99
  const setter = keySetters[key.slice(0, 1)]
70
- if (setter) setter(key, CLASS_NAMES, el)
71
- // if (key.slice(0, 1) === '@') {
72
- // applyMediaProps(key, CLASS_NAMES.media, el)
73
- // } else if (key.slice(0, 1) === ':') {
74
- // applySelectorProps(key, CLASS_NAMES.selector, el)
75
- // } else if (key.slice(0, 1) === '$') {
76
- // applyCaseProps(key, CLASS_NAMES.case, el)
77
- // }
100
+ if (setter) setter(key, props[key], CLASS_NAMES, element)
78
101
  }
79
102
 
80
103
  merge(className, CLASS_NAMES)
81
104
  }
82
105
 
83
106
  export const Responsive = {
84
- on: {
85
- init,
86
- initUpdate: el => {
87
- // FORCE STATE UPDATE:
88
- const { props, class: className } = el
89
- const rootState = el.__root ? el.__root.state : el.state
90
- // console.log(props)
91
- if (el.key !== 'app') return
92
-
93
- if (props.theme) {
94
- const { theme } = props
95
- // console.group(props.theme)
96
-
97
- const convertTheme = getTheme(theme)
98
-
99
- for (const key in convertTheme) {
100
- if (key.includes('dark') || key.includes('light')) {
101
- const parse = key.split(': ')[1].split(')')[0]
102
- if (rootState.globalTheme === parse) {
103
- props.theme = getTheme(theme[key])
104
- } else props.theme = theme
105
- className.MEDIA_FORCED_BY_STATE = props.theme
106
- }
107
- }
108
- // console.groupEnd(props.theme)
107
+ on: { init }
108
+ }
109
+
110
+ export const initUpdate = el => {
111
+ // FORCE STATE UPDATE:
112
+ const { props, class: className } = el
113
+ const rootState = el.__root ? el.__root.state : el.state
114
+ if (el.key !== 'app') return
115
+
116
+ if (props.theme) {
117
+ const { theme } = props
118
+ // console.group(props.theme)
119
+
120
+ const convertTheme = getTheme(theme)
121
+
122
+ for (const key in convertTheme) {
123
+ if (key.includes('dark') || key.includes('light')) {
124
+ const parse = key.split(': ')[1].split(')')[0]
125
+ if (rootState.globalTheme === parse) {
126
+ props.theme = getTheme(theme[key])
127
+ } else props.theme = theme
128
+ className.MEDIA_FORCED_BY_STATE = props.theme
109
129
  }
130
+ }
131
+ // console.groupEnd(props.theme)
132
+ }
110
133
 
111
- for (const screen in props) {
112
- if (screen.slice(0, 1) === '@') {
113
- const mediaName = screen.slice(1)
114
- const mediaKey = `@media screen and ${CONFIG_MEDIA[mediaName]}`
115
- if (mediaName === 'dark' || mediaName === 'light') {
116
- const { MEDIA_FORCE } = className
117
- if (!MEDIA_FORCE) className.media = {}
118
- if (rootState.globalTheme === mediaName) {
119
- className.MEDIA_FORCED = className.MEDIA[mediaKey]
120
- } else className.MEDIA_FORCED = {}
121
- }
122
- }
134
+ for (const screen in props) {
135
+ if (screen.slice(0, 1) === '@') {
136
+ const mediaName = screen.slice(1)
137
+ const mediaKey = `@media screen and ${CONFIG_MEDIA[mediaName]}`
138
+ if (mediaName === 'dark' || mediaName === 'light') {
139
+ const { MEDIA_FORCE } = className
140
+ if (!MEDIA_FORCE) className.media = {}
141
+ if (rootState.globalTheme === mediaName) {
142
+ className.MEDIA_FORCED = className.MEDIA[mediaKey]
143
+ } else className.MEDIA_FORCED = {}
123
144
  }
124
145
  }
125
146
  }