react-native-unistyles 3.0.0-alpha.26 → 3.0.0-alpha.28

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 (196) hide show
  1. package/cxx/core/UnistylesRegistry.cpp +4 -8
  2. package/cxx/core/UnistylesRegistry.h +1 -1
  3. package/cxx/core/UnistylesState.cpp +6 -10
  4. package/cxx/core/UnistylesState.h +2 -1
  5. package/cxx/hybridObjects/HybridStyleSheet.cpp +5 -2
  6. package/cxx/parser/Parser.cpp +73 -4
  7. package/cxx/parser/Parser.h +2 -0
  8. package/lib/commonjs/core/index.js.map +1 -1
  9. package/lib/commonjs/core/useTheme.js.map +1 -1
  10. package/lib/commonjs/core/useTheme.native.js.map +1 -1
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/commonjs/mq.js +1 -4
  13. package/lib/commonjs/mq.js.map +2 -1
  14. package/lib/commonjs/specs/NativePlatform/NativePlatform.nitro.js.map +1 -0
  15. package/lib/commonjs/specs/NavigtionBar/UnistylesNavigationBar.nitro.js.map +1 -1
  16. package/lib/commonjs/specs/NavigtionBar/index.js.map +2 -1
  17. package/lib/commonjs/specs/ShadowRegistry/ShadowRegistry.nitro.js.map +1 -1
  18. package/lib/commonjs/specs/ShadowRegistry/types.js +3 -0
  19. package/lib/commonjs/specs/ShadowRegistry/types.js.map +1 -1
  20. package/lib/commonjs/specs/StatusBar/UnistylesStatusBar.nitro.js.map +1 -1
  21. package/lib/commonjs/specs/StatusBar/index.js.map +2 -1
  22. package/lib/commonjs/specs/StyleSheet/UnistylesStyleSheet.nitro.js +2 -4
  23. package/lib/commonjs/specs/StyleSheet/UnistylesStyleSheet.nitro.js.map +1 -1
  24. package/lib/commonjs/specs/index.js.map +1 -1
  25. package/lib/commonjs/specs/types.js +10 -10
  26. package/lib/commonjs/specs/types.js.map +1 -1
  27. package/lib/commonjs/types/stylesheet.js.map +1 -1
  28. package/lib/commonjs/web/convert/index.js +1 -7
  29. package/lib/commonjs/web/convert/shadow.js +1 -5
  30. package/lib/commonjs/web/convert/shadow.js.map +2 -1
  31. package/lib/commonjs/web/convert/textShadow.js +1 -4
  32. package/lib/commonjs/web/convert/textShadow.js.map +2 -1
  33. package/lib/commonjs/web/convert/transform.js.map +2 -1
  34. package/lib/commonjs/web/create.js +1 -5
  35. package/lib/commonjs/web/create.js.map +2 -1
  36. package/lib/commonjs/web/mock.js.map +2 -1
  37. package/lib/commonjs/web/runtime.js.map +2 -1
  38. package/lib/commonjs/web/state.js.map +1 -1
  39. package/lib/commonjs/web/utils/common.js +1 -3
  40. package/lib/commonjs/web/utils/common.js.map +2 -1
  41. package/lib/commonjs/web/utils/unistyle.js.map +1 -1
  42. package/lib/commonjs/web/variants/index.js.map +1 -1
  43. package/lib/module/common.js.map +1 -1
  44. package/lib/module/core/useBreakpoint.js.map +1 -1
  45. package/lib/module/core/useBreakpoint.native.js.map +2 -1
  46. package/lib/module/core/useTheme.js.map +2 -1
  47. package/lib/module/core/useTheme.native.js.map +2 -1
  48. package/lib/module/index.js.map +1 -1
  49. package/lib/module/mq.js +1 -4
  50. package/lib/module/mq.js.map +2 -1
  51. package/lib/module/specs/NativePlatform/NativePlatform.nitro.js +5 -6
  52. package/lib/module/specs/NativePlatform/NativePlatform.nitro.js.map +1 -1
  53. package/lib/module/specs/NavigtionBar/UnistylesNavigationBar.nitro.js.map +1 -1
  54. package/lib/module/specs/NavigtionBar/index.js.map +2 -1
  55. package/lib/module/specs/ShadowRegistry/ShadowRegistry.nitro.js.map +1 -0
  56. package/lib/module/specs/ShadowRegistry/index.js.map +2 -1
  57. package/lib/module/specs/ShadowRegistry/types.js +2 -0
  58. package/lib/module/specs/ShadowRegistry/types.js.map +1 -1
  59. package/lib/module/specs/StatusBar/UnistylesStatusBar.nitro.js.map +1 -1
  60. package/lib/module/specs/StyleSheet/UnistylesStyleSheet.nitro.js +1 -1
  61. package/lib/module/specs/StyleSheet/UnistylesStyleSheet.nitro.js.map +1 -0
  62. package/lib/module/specs/TurboUnistyles/NativeTurboUnistyles.js +2 -3
  63. package/lib/module/specs/TurboUnistyles/NativeTurboUnistyles.js.map +2 -1
  64. package/lib/module/specs/UnistylesRuntime/UnistylesRuntime.nitro.js.map +1 -1
  65. package/lib/module/specs/index.web.js.map +2 -1
  66. package/lib/module/specs/types.js.map +1 -1
  67. package/lib/module/types/stylesheet.js.map +1 -1
  68. package/lib/module/web/convert/boxShadow.js +1 -4
  69. package/lib/module/web/convert/boxShadow.js.map +2 -1
  70. package/lib/module/web/convert/pseudo.js.map +2 -1
  71. package/lib/module/web/convert/shadow.js +1 -5
  72. package/lib/module/web/convert/shadow.js.map +2 -1
  73. package/lib/module/web/convert/style.js.map +2 -1
  74. package/lib/module/web/convert/textShadow.js +1 -4
  75. package/lib/module/web/convert/textShadow.js.map +2 -1
  76. package/lib/module/web/convert/transform.js.map +2 -1
  77. package/lib/module/web/convert/utils.js.map +2 -1
  78. package/lib/module/web/index.js +1 -2
  79. package/lib/module/web/index.js.map +2 -1
  80. package/lib/module/web/listener.js.map +2 -1
  81. package/lib/module/web/mock.js.map +2 -1
  82. package/lib/module/web/registry.js +1 -3
  83. package/lib/module/web/registry.js.map +2 -1
  84. package/lib/module/web/runtime.js.map +2 -1
  85. package/lib/module/web/shadowRegistry.js +1 -9
  86. package/lib/module/web/shadowRegistry.js.map +2 -1
  87. package/lib/module/web/state.js.map +1 -1
  88. package/lib/module/web/utils/index.js.map +1 -1
  89. package/lib/module/web/utils/unistyle.js.map +2 -1
  90. package/lib/module/web/variants/index.js.map +1 -1
  91. package/lib/module/web/variants/useVariants.js +1 -2
  92. package/lib/module/web/variants/useVariants.js.map +2 -1
  93. package/lib/typescript/src/core/useBreakpoint.d.ts +1 -1
  94. package/lib/typescript/src/core/useBreakpoint.d.ts.map +1 -1
  95. package/lib/typescript/src/core/useBreakpoint.native.d.ts +1 -1
  96. package/lib/typescript/src/core/useBreakpoint.native.d.ts.map +1 -1
  97. package/lib/typescript/src/core/useTheme.d.ts +2 -40
  98. package/lib/typescript/src/core/useTheme.d.ts.map +1 -1
  99. package/lib/typescript/src/core/useTheme.native.d.ts +2 -40
  100. package/lib/typescript/src/core/useTheme.native.d.ts.map +1 -1
  101. package/lib/typescript/src/types/stylesheet.d.ts +4 -2
  102. package/lib/typescript/src/types/stylesheet.d.ts.map +1 -1
  103. package/lib/typescript/src/types/variants.d.ts +1 -1
  104. package/lib/typescript/src/types/variants.d.ts.map +1 -1
  105. package/lib/typescript/src/web/create.d.ts +214 -1220
  106. package/lib/typescript/src/web/create.d.ts.map +1 -1
  107. package/lib/typescript/src/web/index.d.ts +214 -1220
  108. package/lib/typescript/src/web/index.d.ts.map +1 -1
  109. package/lib/typescript/src/web/runtime.d.ts +4 -4
  110. package/lib/typescript/src/web/runtime.d.ts.map +1 -1
  111. package/lib/typescript/src/web/state.d.ts +1 -2
  112. package/lib/typescript/src/web/state.d.ts.map +1 -1
  113. package/lib/typescript/src/web/utils/unistyle.d.ts +2 -2
  114. package/lib/typescript/src/web/utils/unistyle.d.ts.map +1 -1
  115. package/package.json +15 -16
  116. package/src/common.js +4 -0
  117. package/src/core/index.js +2 -0
  118. package/src/core/useBreakpoint.js +14 -0
  119. package/src/core/useBreakpoint.native.js +16 -0
  120. package/src/core/useTheme.js +14 -0
  121. package/src/core/useTheme.native.js +16 -0
  122. package/src/core/useTheme.native.ts +2 -1
  123. package/src/core/useTheme.ts +2 -1
  124. package/src/index.js +3 -0
  125. package/src/mq.js +38 -0
  126. package/src/specs/NativePlatform/NativePlatform.nitro.js +18 -0
  127. package/src/specs/NativePlatform/index.js +1 -0
  128. package/src/specs/NavigtionBar/UnistylesNavigationBar.nitro.js +1 -0
  129. package/src/specs/NavigtionBar/index.js +9 -0
  130. package/src/specs/ShadowRegistry/ShadowRegistry.nitro.js +1 -0
  131. package/src/specs/ShadowRegistry/index.js +26 -0
  132. package/src/specs/ShadowRegistry/types.js +1 -0
  133. package/src/specs/StatusBar/UnistylesStatusBar.nitro.js +1 -0
  134. package/src/specs/StatusBar/index.js +25 -0
  135. package/src/specs/StyleSheet/UnistylesStyleSheet.nitro.js +1 -0
  136. package/src/specs/StyleSheet/index.js +13 -0
  137. package/src/specs/TurboUnistyles/NativeTurboUnistyles.js +2 -0
  138. package/src/specs/TurboUnistyles/index.js +1 -0
  139. package/src/specs/UnistylesRuntime/UnistylesRuntime.nitro.js +1 -0
  140. package/src/specs/UnistylesRuntime/index.js +20 -0
  141. package/src/specs/index.js +8 -0
  142. package/src/specs/index.web.js +2 -0
  143. package/src/specs/types.js +17 -0
  144. package/src/types/stylesheet.ts +5 -3
  145. package/src/types/variants.ts +1 -1
  146. package/src/web/convert/boxShadow.js +59 -0
  147. package/src/web/convert/index.js +56 -0
  148. package/src/web/convert/pseudo.js +131 -0
  149. package/src/web/convert/shadow.js +50 -0
  150. package/src/web/convert/style.js +137 -0
  151. package/src/web/convert/textShadow.js +56 -0
  152. package/src/web/convert/transform.js +65 -0
  153. package/src/web/convert/types.js +2 -0
  154. package/src/web/convert/utils.js +39 -0
  155. package/src/web/create.js +39 -0
  156. package/src/web/index.js +22 -0
  157. package/src/web/listener.js +26 -0
  158. package/src/web/mock.js +21 -0
  159. package/src/web/mq.js +14 -0
  160. package/src/web/registry.js +168 -0
  161. package/src/web/runtime.js +160 -0
  162. package/src/web/runtime.ts +1 -1
  163. package/src/web/shadowRegistry.js +99 -0
  164. package/src/web/state.ts +3 -3
  165. package/src/web/utils/common.js +79 -0
  166. package/src/web/utils/index.js +2 -0
  167. package/src/web/utils/unistyle.js +72 -0
  168. package/src/web/utils/unistyle.ts +2 -2
  169. package/src/web/variants/getVariants.js +26 -0
  170. package/src/web/variants/index.js +2 -0
  171. package/src/web/variants/useVariants.js +50 -0
  172. package/lib/typescript/example/App.d.ts +0 -4
  173. package/lib/typescript/example/App.d.ts.map +0 -1
  174. package/lib/typescript/example/Typography.d.ts +0 -35
  175. package/lib/typescript/example/Typography.d.ts.map +0 -1
  176. package/lib/typescript/example/unistyles.d.ts +0 -63
  177. package/lib/typescript/example/unistyles.d.ts.map +0 -1
  178. package/lib/typescript/expo-example/App.d.ts +0 -4
  179. package/lib/typescript/expo-example/App.d.ts.map +0 -1
  180. package/lib/typescript/expo-example/app/(tabs)/_layout.d.ts +0 -3
  181. package/lib/typescript/expo-example/app/(tabs)/_layout.d.ts.map +0 -1
  182. package/lib/typescript/expo-example/app/(tabs)/explore.d.ts +0 -3
  183. package/lib/typescript/expo-example/app/(tabs)/explore.d.ts.map +0 -1
  184. package/lib/typescript/expo-example/app/(tabs)/index.d.ts +0 -3
  185. package/lib/typescript/expo-example/app/(tabs)/index.d.ts.map +0 -1
  186. package/lib/typescript/expo-example/app/+html.d.ts +0 -4
  187. package/lib/typescript/expo-example/app/+html.d.ts.map +0 -1
  188. package/lib/typescript/expo-example/app/+not-found.d.ts +0 -3
  189. package/lib/typescript/expo-example/app/+not-found.d.ts.map +0 -1
  190. package/lib/typescript/expo-example/app/_layout.d.ts +0 -3
  191. package/lib/typescript/expo-example/app/_layout.d.ts.map +0 -1
  192. package/lib/typescript/expo-example/unistyles.d.ts +0 -63
  193. package/lib/typescript/expo-example/unistyles.d.ts.map +0 -1
  194. package/plugin/__tests__/dependencies.spec.js +0 -448
  195. package/plugin/__tests__/ref.spec.js +0 -1427
  196. package/plugin/__tests__/stylesheet.spec.js +0 -507
@@ -0,0 +1,131 @@
1
+ export const pseudos = [
2
+ '_-moz-broken',
3
+ '_-moz-drag-over',
4
+ '_-moz-first-node',
5
+ '_-moz-handler-blocked',
6
+ '_-moz-handler-crashed',
7
+ '_-moz-handler-disabled',
8
+ '_-moz-last-node',
9
+ '_-moz-loading',
10
+ '_-moz-locale-dir(ltr)',
11
+ '_-moz-locale-dir(rtl)',
12
+ '_-moz-only-whitespace',
13
+ '_-moz-submit-invalid',
14
+ '_-moz-suppressed',
15
+ '_-moz-user-disabled',
16
+ '_-moz-window-inactive',
17
+ '_active',
18
+ '_any-link',
19
+ '_autofill',
20
+ '_blank',
21
+ '_buffering',
22
+ '_checked',
23
+ '_current',
24
+ '_default',
25
+ '_defined',
26
+ '_dir(',
27
+ '_disabled',
28
+ '_empty',
29
+ '_enabled',
30
+ '_first',
31
+ '_first-child',
32
+ '_first-of-type',
33
+ '_focus',
34
+ '_focus-visible',
35
+ '_focus-within',
36
+ '_fullscreen',
37
+ '_future',
38
+ '_has(',
39
+ '_host',
40
+ '_host-context(',
41
+ '_host(',
42
+ '_hover',
43
+ '_in-range',
44
+ '_indeterminate',
45
+ '_invalid',
46
+ '_is(',
47
+ '_lang(',
48
+ '_last-child',
49
+ '_last-of-type',
50
+ '_left',
51
+ '_link',
52
+ '_local-link',
53
+ '_modal',
54
+ '_muted',
55
+ '_not(',
56
+ '_nth-child(',
57
+ '_nth-last-child(',
58
+ '_nth-last-of-type(',
59
+ '_nth-of-type(',
60
+ '_only-child',
61
+ '_only-of-type',
62
+ '_optional',
63
+ '_out-of-range',
64
+ '_past',
65
+ '_paused',
66
+ '_picture-in-picture',
67
+ '_placeholder-shown',
68
+ '_playing',
69
+ '_popover-open',
70
+ '_read-only',
71
+ '_read-write',
72
+ '_required',
73
+ '_right',
74
+ '_scope',
75
+ '_seeking',
76
+ '_stalled',
77
+ '_state(',
78
+ '_target',
79
+ '_target-within',
80
+ '_user-invalid',
81
+ '_user-valid',
82
+ '_valid',
83
+ '_visited',
84
+ '_volume-locked',
85
+ '_where(',
86
+ '_-moz-color-swatch',
87
+ '_-moz-focus-inner',
88
+ '_-moz-list-bullet',
89
+ '_-moz-list-number',
90
+ '_-moz-meter-bar',
91
+ '_-moz-progress-bar',
92
+ '_-moz-range-progress',
93
+ '_-moz-range-thumb',
94
+ '_-moz-range-track',
95
+ '_-webkit-inner-spin-button',
96
+ '_-webkit-meter-barDeprecated',
97
+ '_-webkit-meter-even-less-good-value',
98
+ '_-webkit-meter-inner-element',
99
+ '_-webkit-meter-optimum-value',
100
+ '_-webkit-meter-suboptimum-value',
101
+ '_-webkit-progress-bar',
102
+ '_-webkit-progress-inner-element',
103
+ '_-webkit-progress-value',
104
+ '_-webkit-scrollbar',
105
+ '_-webkit-search-cancel-button',
106
+ '_-webkit-search-results-button',
107
+ '_-webkit-slider-runnable-track',
108
+ '_-webkit-slider-thumb',
109
+ '_after',
110
+ '_backdrop',
111
+ '_before',
112
+ '_cue',
113
+ '_file-selector-button',
114
+ '_first-letter',
115
+ '_first-line',
116
+ '_grammar-error',
117
+ '_highlight(',
118
+ '_marker',
119
+ '_part(',
120
+ '_placeholder',
121
+ '_selection',
122
+ '_slotted(',
123
+ '_spelling-error',
124
+ '_target-text',
125
+ '_view-transition',
126
+ '_view-transition-group',
127
+ '_view-transition-image-pair',
128
+ '_view-transition-new',
129
+ '_view-transition-old',
130
+ ];
131
+ export const isPseudo = (selector) => pseudos.some(pseudo => selector.startsWith(pseudo));
@@ -0,0 +1,50 @@
1
+ export const validateShadow = (shadowProperties, styles, breakpoints) => {
2
+ // Collect breakpoints
3
+ shadowProperties.forEach(key => {
4
+ const value = styles[key];
5
+ if (typeof value !== 'object') {
6
+ return;
7
+ }
8
+ if (key === 'shadowOffset' || key === 'textShadowOffset') {
9
+ const { width, height } = value;
10
+ // If shadowOffset.width has breakpoints
11
+ if (typeof width === 'object') {
12
+ Object.keys(width).forEach(breakpoint => breakpoints.add(breakpoint));
13
+ }
14
+ // If shadowOffset.height has breakpoints
15
+ if (typeof height === 'object') {
16
+ Object.keys(height).forEach(breakpoint => breakpoints.add(breakpoint));
17
+ }
18
+ return;
19
+ }
20
+ // Collect regular breakpoints
21
+ Object.keys(value).forEach(breakpoint => breakpoints.add(breakpoint));
22
+ });
23
+ // Validate if all breakpoints are present
24
+ shadowProperties.forEach(key => {
25
+ const value = styles[key];
26
+ if (typeof value !== 'object') {
27
+ return;
28
+ }
29
+ if (key === 'shadowOffset' || key === 'textShadowOffset') {
30
+ const { width, height } = value;
31
+ if (typeof width === 'object') {
32
+ const missingBreakpoints = Array.from(breakpoints).filter(breakpoint => !(breakpoint in width));
33
+ if (missingBreakpoints.length) {
34
+ throw `missing breakpoints in ${key}.width: ${missingBreakpoints.join(', ')}`;
35
+ }
36
+ }
37
+ if (typeof height === 'object') {
38
+ const missingBreakpoints = Array.from(breakpoints).filter(breakpoint => !(breakpoint in height));
39
+ if (missingBreakpoints.length) {
40
+ throw `missing breakpoints in ${key}.height: ${missingBreakpoints.join(', ')}`;
41
+ }
42
+ }
43
+ return;
44
+ }
45
+ const missingBreakpoints = Array.from(breakpoints).filter(breakpoint => !(breakpoint in value));
46
+ if (missingBreakpoints.length) {
47
+ throw `missing breakpoints in ${key}: ${missingBreakpoints.join(', ')}`;
48
+ }
49
+ });
50
+ };
@@ -0,0 +1,137 @@
1
+ import { keyInObject } from '../utils';
2
+ const SKIP_STYLES = [
3
+ 'borderCurve',
4
+ 'elevation',
5
+ 'textAlignVertical',
6
+ 'includeFontPadding',
7
+ 'overlayColor',
8
+ 'tintColor'
9
+ ];
10
+ const CSS_NUMBER_KEYS = [
11
+ 'animationIterationCount',
12
+ 'borderImageOutset',
13
+ 'borderImageSlice',
14
+ 'borderImageWidth',
15
+ 'boxFlex',
16
+ 'boxFlexGroup',
17
+ 'boxOrdinalGroup',
18
+ 'columnCount',
19
+ 'columns',
20
+ 'counterIncrement',
21
+ 'counterReset',
22
+ 'flex',
23
+ 'flexGrow',
24
+ 'flexPositive',
25
+ 'flexShrink',
26
+ 'flexNegative',
27
+ 'flexOrder',
28
+ 'fontWeight',
29
+ 'gridArea',
30
+ 'gridColumn',
31
+ 'gridColumnEnd',
32
+ 'gridColumnSpan',
33
+ 'gridColumnStart',
34
+ 'gridRow',
35
+ 'gridRowEnd',
36
+ 'gridRowSpan',
37
+ 'gridRowStart',
38
+ 'line-clamp',
39
+ 'line-height',
40
+ 'opacity',
41
+ 'order',
42
+ 'orphans',
43
+ 'tabSize',
44
+ 'widows',
45
+ 'zIndex',
46
+ 'zoom',
47
+ 'fillOpacity',
48
+ 'floodOpacity',
49
+ 'stopOpacity',
50
+ 'strokeDasharray',
51
+ 'strokeDashoffset',
52
+ 'strokeMiterlimit',
53
+ 'strokeOpacity',
54
+ 'strokeWidth'
55
+ ];
56
+ const convertMap = {
57
+ marginHorizontal: (value) => ({
58
+ marginInline: value
59
+ }),
60
+ marginVertical: (value) => ({
61
+ marginBlock: value
62
+ }),
63
+ paddingHorizontal: (value) => ({
64
+ paddingInline: value
65
+ }),
66
+ paddingVertical: (value) => ({
67
+ paddingBlock: value
68
+ }),
69
+ writingDirection: (value) => ({
70
+ direction: value
71
+ }),
72
+ borderBottomEndRadius: (value) => ({
73
+ borderBottomRightRadius: value
74
+ }),
75
+ borderBottomStartRadius: (value) => ({
76
+ borderBottomLeftRadius: value
77
+ }),
78
+ borderEndColor: (value) => ({
79
+ borderInlineEndColor: value
80
+ }),
81
+ borderStartColor: (value) => ({
82
+ borderInlineStartColor: value
83
+ }),
84
+ borderTopEndRadius: (value) => ({
85
+ borderTopRightRadius: value
86
+ }),
87
+ borderTopStartRadius: (value) => ({
88
+ borderTopLeftRadius: value
89
+ }),
90
+ borderEndWidth: (value) => ({
91
+ borderInlineEndWidth: value
92
+ }),
93
+ borderStartWidth: (value) => ({
94
+ borderInlineStartWidth: value
95
+ }),
96
+ end: (value) => ({
97
+ right: value
98
+ }),
99
+ start: (value) => ({
100
+ left: value
101
+ }),
102
+ marginEnd: (value) => ({
103
+ marginRight: value
104
+ }),
105
+ marginStart: (value) => ({
106
+ marginLeft: value
107
+ }),
108
+ paddingEnd: (value) => ({
109
+ paddingRight: value
110
+ }),
111
+ paddingStart: (value) => ({
112
+ paddingLeft: value
113
+ }),
114
+ transformMatrix: (value) => ({
115
+ transform: `matrix(${value.join(', ')})`
116
+ }),
117
+ resizeMode: (value) => ({
118
+ backgroundSize: value
119
+ })
120
+ };
121
+ const convertNumber = (key, value) => {
122
+ if (typeof value === 'number') {
123
+ return CSS_NUMBER_KEYS.includes(key, value) ? value : `${value}px`;
124
+ }
125
+ return value;
126
+ };
127
+ export const getStyle = (key, value) => {
128
+ if (SKIP_STYLES.includes(key)) {
129
+ return {};
130
+ }
131
+ if (keyInObject(convertMap, key)) {
132
+ return convertMap[key]?.(convertNumber(key, value)) ?? {};
133
+ }
134
+ return {
135
+ [key]: convertNumber(key, value)
136
+ };
137
+ };
@@ -0,0 +1,56 @@
1
+ import { deepMergeObjects, warn } from '../utils';
2
+ import { validateShadow } from './shadow';
3
+ import { TEXT_SHADOW_STYLES } from './types';
4
+ import { extractShadowValue, normalizeColor, normalizeNumericValue } from './utils';
5
+ const createTextShadowValue = (style) => {
6
+ const { textShadowColor, textShadowOffset, textShadowRadius } = style;
7
+ const offsetX = normalizeNumericValue(textShadowOffset.width);
8
+ const offsetY = normalizeNumericValue(textShadowOffset.height);
9
+ const radius = normalizeNumericValue(textShadowRadius);
10
+ const color = normalizeColor(textShadowColor);
11
+ return `${offsetX} ${offsetY} ${radius} ${color}`;
12
+ };
13
+ export const getTextShadowStyle = (styles) => {
14
+ const missingStyles = TEXT_SHADOW_STYLES.filter(key => !(key in styles));
15
+ if (missingStyles.length) {
16
+ warn(`can't apply text shadow as you miss these properties: ${missingStyles.join(', ')}`);
17
+ return {};
18
+ }
19
+ const breakpointsSet = new Set();
20
+ try {
21
+ validateShadow(TEXT_SHADOW_STYLES, styles, breakpointsSet);
22
+ }
23
+ catch (error) {
24
+ if (typeof error === 'string') {
25
+ warn(error);
26
+ }
27
+ return {};
28
+ }
29
+ const breakpoints = Array.from(breakpointsSet);
30
+ // If no breakpoints were used return styles without media queries
31
+ if (breakpoints.length === 0) {
32
+ return {
33
+ textShadow: createTextShadowValue(styles)
34
+ };
35
+ }
36
+ // Create textShadow for each breakpoint
37
+ const breakpointStyles = breakpoints.map(breakpoint => {
38
+ const color = extractShadowValue('textShadowColor', breakpoint, styles);
39
+ const { width, height } = extractShadowValue('textShadowOffset', breakpoint, styles);
40
+ const radius = extractShadowValue('textShadowRadius', breakpoint, styles);
41
+ return {
42
+ [breakpoint]: {
43
+ textShadow: createTextShadowValue({
44
+ textShadowColor: color,
45
+ textShadowOffset: {
46
+ width,
47
+ height
48
+ },
49
+ textShadowRadius: radius
50
+ })
51
+ }
52
+ };
53
+ });
54
+ // Merge all breakpoints styles into one
55
+ return deepMergeObjects(...breakpointStyles);
56
+ };
@@ -0,0 +1,65 @@
1
+ import { deepMergeObjects, keyInObject } from '../utils';
2
+ import { normalizeNumericValue } from './utils';
3
+ const normalizeTransform = (key, value) => {
4
+ if (key.includes('scale')) {
5
+ return value;
6
+ }
7
+ if (typeof value === 'number') {
8
+ return normalizeNumericValue(value);
9
+ }
10
+ return value;
11
+ };
12
+ const createTransformValue = (transforms) => transforms
13
+ .map(transform => {
14
+ const [key] = Object.keys(transform);
15
+ if (!key) {
16
+ return undefined;
17
+ }
18
+ const value = transform[key];
19
+ switch (key) {
20
+ case 'matrix':
21
+ case 'matrix3d':
22
+ return `${key}(${value.join(',')})`;
23
+ default:
24
+ return `${key}(${normalizeTransform(key, value)})`;
25
+ }
26
+ })
27
+ .filter(Boolean)
28
+ .join(' ');
29
+ export const getTransformStyle = (transforms) => {
30
+ const breakpoints = new Set();
31
+ const normalTransforms = [];
32
+ transforms.forEach(transform => {
33
+ const [property] = Object.keys(transform);
34
+ if (!property) {
35
+ return;
36
+ }
37
+ const value = transform[property];
38
+ if (typeof value === 'object' && !Array.isArray(value)) {
39
+ Object.keys(value).forEach(breakpoint => breakpoints.add(breakpoint));
40
+ return;
41
+ }
42
+ normalTransforms.push(transform);
43
+ });
44
+ const breakpointTransforms = Array.from(breakpoints).flatMap(breakpoint => {
45
+ const transformsPerBreakpoint = transforms.flatMap(transform => {
46
+ const [property] = Object.keys(transform);
47
+ if (!property) {
48
+ return [];
49
+ }
50
+ const value = transform[property];
51
+ if (typeof value === 'object' && !Array.isArray(value)) {
52
+ return keyInObject(value, breakpoint) ? [{ [property]: value[breakpoint] }] : [];
53
+ }
54
+ return [];
55
+ });
56
+ return [{
57
+ [breakpoint]: {
58
+ transform: createTransformValue(transformsPerBreakpoint)
59
+ }
60
+ }];
61
+ });
62
+ return deepMergeObjects({
63
+ transform: createTransformValue(normalTransforms)
64
+ }, ...breakpointTransforms);
65
+ };
@@ -0,0 +1,2 @@
1
+ export const TEXT_SHADOW_STYLES = ['textShadowColor', 'textShadowOffset', 'textShadowRadius'];
2
+ export const BOX_SHADOW_STYLES = ['shadowColor', 'shadowRadius', 'shadowOpacity', 'shadowOffset'];
@@ -0,0 +1,39 @@
1
+ // based on react-native-web normalizer
2
+ // https://github.com/necolas/react-native-web
3
+ import normalizeColors from '@react-native/normalize-colors';
4
+ import { BOX_SHADOW_STYLES, TEXT_SHADOW_STYLES } from './types';
5
+ export const isTransform = (key, value) => key === 'transform' && Array.isArray(value);
6
+ export const isTextShadow = (key) => TEXT_SHADOW_STYLES.includes(key);
7
+ export const isBoxShadow = (key) => BOX_SHADOW_STYLES.includes(key);
8
+ export const normalizeNumericValue = (value) => value ? `${value}px` : value;
9
+ export const normalizeColor = (color, opacity = 1) => {
10
+ // If the opacity is 1 there's no need to normalize the color
11
+ if (opacity === 1) {
12
+ return color;
13
+ }
14
+ const integer = normalizeColors(color);
15
+ // If the color is an unknown format, the return value is null
16
+ if (integer === null) {
17
+ return color;
18
+ }
19
+ const hex = integer.toString(16).padStart(8, '0');
20
+ if (hex.length === 8) {
21
+ const [r = 0, g = 0, b = 0, a = 1] = hex
22
+ .split(/(?=(?:..)*$)/)
23
+ .map(x => parseInt(x, 16))
24
+ .filter(num => !isNaN(num));
25
+ return `rgba(${r},${g},${b},${(a / 255) * opacity})`;
26
+ }
27
+ return color;
28
+ };
29
+ export const extractShadowValue = (key, breakpoint, styles) => {
30
+ const value = styles[key];
31
+ if (key === 'textShadowOffset' || key === 'shadowOffset') {
32
+ const { width, height } = value;
33
+ return {
34
+ width: typeof width === 'object' ? width[breakpoint] : width,
35
+ height: typeof height === 'object' ? height[breakpoint] : height
36
+ };
37
+ }
38
+ return typeof value === 'object' ? value[breakpoint] : value;
39
+ };
@@ -0,0 +1,39 @@
1
+ import { assignSecrets, reduceObject, getStyles } from './utils';
2
+ import { UnistylesRuntime } from './runtime';
3
+ import { createUseVariants, getVariants } from './variants';
4
+ export const create = (stylesheet) => {
5
+ const computedStylesheet = typeof stylesheet === 'function'
6
+ ? stylesheet(UnistylesRuntime.theme, UnistylesRuntime.miniRuntime)
7
+ : stylesheet;
8
+ const selectedVariants = new Map();
9
+ const copyVariants = () => Object.fromEntries(selectedVariants.entries());
10
+ const addSecrets = (value, key, args) => assignSecrets(value, {
11
+ __uni__key: key,
12
+ __uni__refs: new Set(),
13
+ __uni__stylesheet: stylesheet,
14
+ __uni__args: args,
15
+ __uni__variants: copyVariants()
16
+ });
17
+ const styles = reduceObject(computedStylesheet, (value, _key) => {
18
+ const key = String(_key);
19
+ if (typeof value === 'function') {
20
+ const dynamicStyle = (...args) => {
21
+ const result = value(...args);
22
+ const variants = Object.fromEntries(getVariants({ [key]: result }, copyVariants()));
23
+ const resultWithVariants = {
24
+ ...result,
25
+ ...variants[key]
26
+ };
27
+ // Add secrets to result of dynamic styles function
28
+ return addSecrets(getStyles(resultWithVariants), key, args);
29
+ };
30
+ // Add secrets to dynamic styles function
31
+ return addSecrets(dynamicStyle, key);
32
+ }
33
+ // Add secrets to static styles
34
+ return addSecrets(getStyles(value), key);
35
+ });
36
+ // Inject useVariants hook to styles
37
+ createUseVariants(styles, newVariants => Object.entries(newVariants).forEach(([key, value]) => selectedVariants.set(key, value)));
38
+ return styles;
39
+ };
@@ -0,0 +1,22 @@
1
+ import { create } from './create';
2
+ import { UnistylesState } from './state';
3
+ import { deepMergeObjects } from './utils';
4
+ export const StyleSheet = {
5
+ configure: UnistylesState.init,
6
+ create,
7
+ absoluteFill: {
8
+ position: 'absolute',
9
+ left: 0,
10
+ top: 0,
11
+ right: 0,
12
+ bottom: 0,
13
+ },
14
+ compose: (a, b) => deepMergeObjects(a, b),
15
+ flatten: (...styles) => deepMergeObjects(...styles),
16
+ hairlineWidth: 1
17
+ };
18
+ export { UnistylesRuntime } from './runtime';
19
+ export { UnistylesShadowRegistry } from './shadowRegistry';
20
+ export * from './mock';
21
+ // TODO: Work on SSR
22
+ export const getSSRUnistyles = () => [];
@@ -0,0 +1,26 @@
1
+ import { UnistyleDependency } from '../specs/NativePlatform';
2
+ import { UnistylesRuntime } from './runtime';
3
+ class UnistylesListenerBuilder {
4
+ isInitialized = false;
5
+ listeners = Array.from({ length: Object.keys(UnistyleDependency).length / 2 }, () => new Set());
6
+ emitChange = (dependency) => {
7
+ this.listeners[dependency]?.forEach(listener => listener());
8
+ };
9
+ initListeners = () => {
10
+ if (this.isInitialized) {
11
+ return;
12
+ }
13
+ this.isInitialized = true;
14
+ UnistylesRuntime.darkMedia?.addEventListener('change', () => this.emitChange(UnistyleDependency.ColorScheme));
15
+ UnistylesRuntime.lightMedia?.addEventListener('change', () => this.emitChange(UnistyleDependency.ColorScheme));
16
+ window.addEventListener('orientationchange', () => this.emitChange(UnistyleDependency.Orientation));
17
+ window.addEventListener('resize', () => this.emitChange(UnistyleDependency.Dimensions));
18
+ };
19
+ addListeners = (dependencies, listener) => {
20
+ dependencies.forEach(dependency => this.listeners[dependency]?.add(listener));
21
+ return () => {
22
+ dependencies.forEach(dependency => this.listeners[dependency]?.delete(listener));
23
+ };
24
+ };
25
+ }
26
+ export const UnistylesListener = new UnistylesListenerBuilder();
@@ -0,0 +1,21 @@
1
+ export const StatusBar = {
2
+ width: 0,
3
+ height: 0,
4
+ setStyle: () => { },
5
+ setHidden: () => { },
6
+ setBackgroundColor: () => { },
7
+ equals: () => true,
8
+ toString: () => 'StatusBar',
9
+ __type: 'web',
10
+ name: 'StatusBar'
11
+ };
12
+ export const NavigationBar = {
13
+ width: 0,
14
+ height: 0,
15
+ setHidden: () => { },
16
+ setBackgroundColor: () => { },
17
+ equals: () => true,
18
+ toString: () => 'NavigationBar',
19
+ __type: 'web',
20
+ name: 'NavigationBar'
21
+ };
package/src/web/mq.js ADDED
@@ -0,0 +1,14 @@
1
+ const IS_UNISTYLES_REGEX = /:([hw])\[(\d+)(?:,\s*(\d+|Infinity))?]/;
2
+ const UNISTYLES_WIDTH_REGEX = /:(w)\[(\d+)(?:,\s*(\d+|Infinity))?]/;
3
+ const UNISTYLES_HEIGHT_REGEX = /:(h)\[(\d+)(?:,\s*(\d+|Infinity))?]/;
4
+ export const parseMq = (mq) => {
5
+ const [, width, fromW, toW] = UNISTYLES_WIDTH_REGEX.exec(mq) || [];
6
+ const [, height, fromH, toH] = UNISTYLES_HEIGHT_REGEX.exec(mq) || [];
7
+ return {
8
+ minWidth: !width || fromW === 'Infinity' ? undefined : Number(fromW),
9
+ maxWidth: !width || toW === 'Infinity' ? undefined : Number(toW),
10
+ minHeight: !height || fromH === 'Infinity' ? undefined : Number(fromH),
11
+ maxHeight: !height || toH === 'Infinity' ? undefined : Number(toH),
12
+ };
13
+ };
14
+ export const isUnistylesMq = (mq) => IS_UNISTYLES_REGEX.test(mq);