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.
Files changed (86) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +1 -1
  3. package/dist/cjs/index.js +1 -21
  4. package/dist/cjs/package.json +1 -0
  5. package/dist/cjs/src/index.js +1 -0
  6. package/dist/cjs/src/props/animation.js +1 -0
  7. package/dist/cjs/src/props/block.js +1 -0
  8. package/dist/cjs/src/props/defaults.js +1 -0
  9. package/dist/cjs/src/props/flex.js +1 -0
  10. package/dist/cjs/src/props/font.js +1 -0
  11. package/dist/cjs/src/props/grid.js +1 -0
  12. package/dist/cjs/src/props/index.js +1 -0
  13. package/dist/cjs/src/props/misc.js +1 -0
  14. package/dist/cjs/src/props/position.js +1 -0
  15. package/dist/cjs/src/props/theme.js +1 -0
  16. package/dist/cjs/src/props/timing.js +1 -0
  17. package/dist/cjs/src/set.js +1 -0
  18. package/dist/cjs/src/transform/executors.js +1 -0
  19. package/dist/cjs/src/transform/index.js +1 -0
  20. package/dist/cjs/src/transform/transformers.js +1 -0
  21. package/dist/esm/index.js +1 -4
  22. package/dist/esm/src/index.js +1 -0
  23. package/dist/esm/src/props/animation.js +1 -0
  24. package/dist/esm/src/props/block.js +1 -0
  25. package/dist/esm/src/props/defaults.js +1 -0
  26. package/dist/esm/src/props/flex.js +1 -0
  27. package/dist/esm/src/props/font.js +1 -0
  28. package/dist/esm/src/props/grid.js +1 -0
  29. package/dist/esm/src/props/index.js +1 -0
  30. package/dist/esm/src/props/misc.js +1 -0
  31. package/dist/esm/src/props/position.js +1 -0
  32. package/dist/esm/src/props/theme.js +1 -0
  33. package/dist/esm/src/props/timing.js +1 -0
  34. package/dist/esm/src/set.js +1 -0
  35. package/dist/esm/src/transform/executors.js +1 -0
  36. package/dist/esm/src/transform/index.js +1 -0
  37. package/dist/esm/src/transform/transformers.js +1 -0
  38. package/package.json +19 -20
  39. package/dist/cjs/props/animation.js +0 -126
  40. package/dist/cjs/props/block.js +0 -173
  41. package/dist/cjs/props/defaults.js +0 -340
  42. package/dist/cjs/props/flex.js +0 -44
  43. package/dist/cjs/props/font.js +0 -36
  44. package/dist/cjs/props/grid.js +0 -39
  45. package/dist/cjs/props/index.js +0 -55
  46. package/dist/cjs/props/misc.js +0 -42
  47. package/dist/cjs/props/position.js +0 -51
  48. package/dist/cjs/props/theme.js +0 -147
  49. package/dist/cjs/props/timing.js +0 -42
  50. package/dist/cjs/set.js +0 -36
  51. package/dist/cjs/transform/executors.js +0 -131
  52. package/dist/cjs/transform/index.js +0 -19
  53. package/dist/cjs/transform/transformers.js +0 -156
  54. package/dist/esm/props/animation.js +0 -106
  55. package/dist/esm/props/block.js +0 -159
  56. package/dist/esm/props/defaults.js +0 -321
  57. package/dist/esm/props/flex.js +0 -24
  58. package/dist/esm/props/font.js +0 -16
  59. package/dist/esm/props/grid.js +0 -19
  60. package/dist/esm/props/index.js +0 -34
  61. package/dist/esm/props/misc.js +0 -22
  62. package/dist/esm/props/position.js +0 -31
  63. package/dist/esm/props/theme.js +0 -137
  64. package/dist/esm/props/timing.js +0 -26
  65. package/dist/esm/set.js +0 -16
  66. package/dist/esm/transform/executors.js +0 -111
  67. package/dist/esm/transform/index.js +0 -2
  68. package/dist/esm/transform/transformers.js +0 -136
  69. package/dist/iife/index.js +0 -1147
  70. package/index.js +0 -1
  71. package/src/index.js +0 -6
  72. package/src/props/animation.js +0 -119
  73. package/src/props/block.js +0 -183
  74. package/src/props/defaults.js +0 -318
  75. package/src/props/flex.js +0 -30
  76. package/src/props/font.js +0 -16
  77. package/src/props/grid.js +0 -21
  78. package/src/props/index.js +0 -35
  79. package/src/props/misc.js +0 -23
  80. package/src/props/position.js +0 -34
  81. package/src/props/theme.js +0 -155
  82. package/src/props/timing.js +0 -26
  83. package/src/set.js +0 -16
  84. package/src/transform/executors.js +0 -123
  85. package/src/transform/index.js +0 -4
  86. package/src/transform/transformers.js +0 -178
@@ -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
- }
@@ -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
- }
@@ -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
- }
@@ -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
- }
@@ -1,4 +0,0 @@
1
- 'use strict'
2
-
3
- export * from './executors.js'
4
- export * from './transformers.js'
@@ -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
- }