react-native-unistyles 2.0.0-rc.1 → 2.0.0-rc.2

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 (75) hide show
  1. package/lib/commonjs/core/UnistyleRegistry.js +15 -25
  2. package/lib/commonjs/core/UnistyleRegistry.js.map +1 -1
  3. package/lib/commonjs/core/UnistylesModule.js +187 -2
  4. package/lib/commonjs/core/UnistylesModule.js.map +1 -1
  5. package/lib/commonjs/core/UnistylesModule.native.js +9 -0
  6. package/lib/commonjs/core/UnistylesModule.native.js.map +1 -0
  7. package/lib/commonjs/hooks/useCSS.js +36 -1
  8. package/lib/commonjs/hooks/useCSS.js.map +1 -1
  9. package/lib/commonjs/hooks/useCSS.native.js +9 -0
  10. package/lib/commonjs/hooks/useCSS.native.js.map +1 -0
  11. package/lib/commonjs/normalizer/normalizer.js +1 -2
  12. package/lib/commonjs/normalizer/normalizer.js.map +1 -1
  13. package/lib/commonjs/useStyles.js +1 -2
  14. package/lib/commonjs/useStyles.js.map +1 -1
  15. package/lib/commonjs/utils/breakpoints.js +2 -11
  16. package/lib/commonjs/utils/breakpoints.js.map +1 -1
  17. package/lib/commonjs/utils/cssMediaQuery.js +3 -9
  18. package/lib/commonjs/utils/cssMediaQuery.js.map +1 -1
  19. package/lib/commonjs/utils/mq.js +12 -36
  20. package/lib/commonjs/utils/mq.js.map +1 -1
  21. package/lib/commonjs/utils/mqParser.js +1 -2
  22. package/lib/commonjs/utils/mqParser.js.map +1 -1
  23. package/lib/commonjs/utils/styles.js +34 -39
  24. package/lib/commonjs/utils/styles.js.map +1 -1
  25. package/lib/module/core/UnistyleRegistry.js +15 -25
  26. package/lib/module/core/UnistyleRegistry.js.map +1 -1
  27. package/lib/module/core/UnistylesModule.js +186 -2
  28. package/lib/module/core/UnistylesModule.js.map +1 -1
  29. package/lib/module/core/UnistylesModule.native.js +3 -0
  30. package/lib/module/core/UnistylesModule.native.js.map +1 -0
  31. package/lib/module/hooks/useCSS.js +36 -1
  32. package/lib/module/hooks/useCSS.js.map +1 -1
  33. package/lib/module/hooks/useCSS.native.js +2 -0
  34. package/lib/module/hooks/useCSS.native.js.map +1 -0
  35. package/lib/module/normalizer/normalizer.js +1 -2
  36. package/lib/module/normalizer/normalizer.js.map +1 -1
  37. package/lib/module/useStyles.js +1 -2
  38. package/lib/module/useStyles.js.map +1 -1
  39. package/lib/module/utils/breakpoints.js +2 -11
  40. package/lib/module/utils/breakpoints.js.map +1 -1
  41. package/lib/module/utils/cssMediaQuery.js +3 -9
  42. package/lib/module/utils/cssMediaQuery.js.map +1 -1
  43. package/lib/module/utils/mq.js +12 -36
  44. package/lib/module/utils/mq.js.map +1 -1
  45. package/lib/module/utils/mqParser.js +1 -2
  46. package/lib/module/utils/mqParser.js.map +1 -1
  47. package/lib/module/utils/styles.js +34 -39
  48. package/lib/module/utils/styles.js.map +1 -1
  49. package/lib/typescript/src/core/UnistylesModule.d.ts +17 -4
  50. package/lib/typescript/src/core/UnistylesModule.d.ts.map +1 -1
  51. package/lib/typescript/src/core/UnistylesModule.native.d.ts +6 -0
  52. package/lib/typescript/src/core/UnistylesModule.native.d.ts.map +1 -0
  53. package/lib/typescript/src/hooks/useCSS.d.ts +1 -1
  54. package/lib/typescript/src/hooks/useCSS.d.ts.map +1 -1
  55. package/lib/typescript/src/hooks/useCSS.native.d.ts +3 -0
  56. package/lib/typescript/src/hooks/useCSS.native.d.ts.map +1 -0
  57. package/package.json +6 -8
  58. package/src/core/UnistylesModule.native.ts +7 -0
  59. package/src/core/UnistylesModule.ts +224 -4
  60. package/src/hooks/useCSS.native.ts +3 -0
  61. package/src/hooks/useCSS.ts +49 -1
  62. package/lib/commonjs/core/UnistylesModule.web.js +0 -199
  63. package/lib/commonjs/core/UnistylesModule.web.js.map +0 -1
  64. package/lib/commonjs/hooks/useCSS.web.js +0 -46
  65. package/lib/commonjs/hooks/useCSS.web.js.map +0 -1
  66. package/lib/module/core/UnistylesModule.web.js +0 -192
  67. package/lib/module/core/UnistylesModule.web.js.map +0 -1
  68. package/lib/module/hooks/useCSS.web.js +0 -39
  69. package/lib/module/hooks/useCSS.web.js.map +0 -1
  70. package/lib/typescript/src/core/UnistylesModule.web.d.ts +0 -19
  71. package/lib/typescript/src/core/UnistylesModule.web.d.ts.map +0 -1
  72. package/lib/typescript/src/hooks/useCSS.web.d.ts +0 -3
  73. package/lib/typescript/src/hooks/useCSS.web.d.ts.map +0 -1
  74. package/src/core/UnistylesModule.web.ts +0 -227
  75. package/src/hooks/useCSS.web.ts +0 -51
@@ -1,227 +0,0 @@
1
- import { NativeEventEmitter, NativeModules } from 'react-native'
2
- import type { UnistylesThemes, UnistylesBreakpoints } from 'react-native-unistyles'
3
- import type { ColorSchemeName } from '../types'
4
- import { normalizeWebStylesPlugin } from '../plugins'
5
- import { isServer } from '../common'
6
-
7
- export class UnistylesBridgeWeb {
8
- #timerRef?: ReturnType<typeof setTimeout> = undefined
9
- #hasAdaptiveThemes: boolean = false
10
- #supportsAutomaticColorScheme = false
11
- #screenWidth = isServer ? undefined : window.innerWidth
12
- #screenHeight = isServer ? undefined : window.innerHeight
13
- #themes: Array<keyof UnistylesThemes> = []
14
- #breakpoints: UnistylesBreakpoints = {} as UnistylesBreakpoints
15
- #colorScheme: ColorSchemeName = this.getPreferredColorScheme()
16
- #themeName: keyof UnistylesThemes = '' as keyof UnistylesThemes
17
- #enabledPlugins: Array<string> = [normalizeWebStylesPlugin.name]
18
- #unistylesEvents = new NativeEventEmitter(NativeModules.Unistyles)
19
- #sortedBreakpointPairs: Array<[keyof UnistylesBreakpoints, number]> = []
20
- #breakpoint: keyof UnistylesBreakpoints = '' as keyof UnistylesBreakpoints
21
-
22
- constructor() {
23
- if (!isServer) {
24
- this.setupListeners()
25
- this.#screenWidth = window.innerWidth
26
- this.#screenHeight = window.innerHeight
27
- }
28
- }
29
-
30
- public install() {
31
- // @ts-ignore
32
- // eslint-disable-next-line no-undef
33
- globalThis.__UNISTYLES__ = new Proxy({}, {
34
- get: (_target, prop) => {
35
- switch (prop) {
36
- case 'themeName':
37
- return this.getTheme()
38
- case 'screenWidth':
39
- return this.#screenWidth
40
- case 'screenHeight':
41
- return this.#screenHeight
42
- case 'breakpoint':
43
- return this.#breakpoint || undefined
44
- case 'breakpoints':
45
- return this.#breakpoints
46
- case 'hasAdaptiveThemes':
47
- return this.#hasAdaptiveThemes
48
- case 'sortedBreakpointPairs':
49
- return this.#sortedBreakpointPairs
50
- case 'enabledPlugins':
51
- return this.#enabledPlugins
52
- case 'colorScheme':
53
- return this.#colorScheme
54
- case 'useTheme':
55
- return (themeName: keyof UnistylesThemes) => this.useTheme(themeName)
56
- case 'useBreakpoints':
57
- return (breakpoints: UnistylesBreakpoints) => this.useBreakpoints(breakpoints)
58
- case 'useAdaptiveThemes':
59
- return (enable: boolean) => this.useAdaptiveThemes(enable)
60
- case 'addPlugin':
61
- return (pluginName: string, notify: boolean) => this.addPlugin(pluginName, notify)
62
- case 'removePlugin':
63
- return (pluginName: string) => this.removePlugin(pluginName)
64
- default:
65
- return Reflect.get(this, prop)
66
- }
67
- },
68
- set: (target, prop, newValue, receiver) => {
69
- switch (prop) {
70
- case 'themes': {
71
- this.#themes = newValue
72
- this.#supportsAutomaticColorScheme = newValue.includes('light') && newValue.includes('dark')
73
-
74
- return true
75
- }
76
- case 'themeName': {
77
- this.#themeName = newValue as keyof UnistylesThemes
78
- this.emitThemeChange()
79
-
80
- return true
81
- }
82
- default:
83
- return Reflect.set(target, prop, newValue, receiver)
84
- }
85
- }
86
- })
87
-
88
- return true
89
- }
90
-
91
- private useTheme(themeName: keyof UnistylesThemes) {
92
- this.#themeName = themeName
93
- this.emitThemeChange()
94
- }
95
-
96
- private useBreakpoints(breakpoints: UnistylesBreakpoints) {
97
- this.#breakpoints = breakpoints
98
- this.#sortedBreakpointPairs = Object
99
- .entries(breakpoints)
100
- .sort(([, a], [, b]) => (a ?? 0) - (b ?? 0)) as Array<[keyof UnistylesBreakpoints, number]>
101
-
102
- if (!isServer) {
103
- this.#breakpoint = this.getBreakpointFromScreenWidth(this.#screenWidth as number)
104
- }
105
- }
106
-
107
- private useAdaptiveThemes(enable: boolean) {
108
- this.#hasAdaptiveThemes = enable
109
-
110
- if (!this.#hasAdaptiveThemes || !this.#supportsAutomaticColorScheme) {
111
- return
112
- }
113
-
114
- if (this.#themeName !== this.#colorScheme) {
115
- this.#themeName = this.#colorScheme as keyof UnistylesThemes
116
- this.emitThemeChange()
117
- }
118
- }
119
-
120
- private addPlugin(pluginName: string, notify: boolean) {
121
- this.#enabledPlugins = [pluginName].concat(this.#enabledPlugins)
122
-
123
- if (notify) {
124
- this.emitPluginChange()
125
- }
126
- }
127
-
128
- private removePlugin(pluginName: string) {
129
- this.#enabledPlugins = this.#enabledPlugins.filter(name => name !== pluginName)
130
- this.emitPluginChange()
131
- }
132
-
133
- private getTheme(): keyof UnistylesThemes {
134
-
135
- if (this.#themes.length === 1) {
136
- return this.#themes.at(0) as keyof UnistylesThemes
137
- }
138
-
139
- return this.#themeName
140
- }
141
-
142
- private setupListeners() {
143
- window.addEventListener('resize', () => {
144
- clearTimeout(this.#timerRef)
145
-
146
- this.#timerRef = setTimeout(() => {
147
- this.#screenWidth = window.innerWidth
148
- this.#screenHeight = window.innerHeight
149
- this.#breakpoint = this.getBreakpointFromScreenWidth(this.#screenWidth)
150
-
151
- this.emitLayoutChange()
152
- }, 100)
153
- })
154
-
155
- window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
156
- this.#colorScheme = event.matches
157
- ? 'dark'
158
- : 'light'
159
-
160
- if (!this.#supportsAutomaticColorScheme || !this.#hasAdaptiveThemes) {
161
- return
162
- }
163
-
164
- if (this.#colorScheme !== this.#themeName) {
165
- this.#themeName = this.#colorScheme as keyof UnistylesThemes
166
- this.emitThemeChange()
167
- }
168
- })
169
- }
170
-
171
- private getBreakpointFromScreenWidth(width: number): keyof UnistylesBreakpoints {
172
- const breakpoint = this.#sortedBreakpointPairs
173
- .find(([, value], index, otherBreakpoints) => {
174
- const minVal = value
175
- const maxVal = otherBreakpoints[index + 1]?.[1]
176
-
177
- if (!maxVal) {
178
- return true
179
- }
180
-
181
- return width >= minVal && width < maxVal
182
- })
183
-
184
- return breakpoint?.at(0) as keyof UnistylesBreakpoints
185
- }
186
-
187
- private getPreferredColorScheme() {
188
- if (!isServer && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
189
- return 'dark'
190
- }
191
-
192
- return 'light'
193
- }
194
-
195
- private emitPluginChange() {
196
- this.#unistylesEvents.emit('__unistylesOnChange', {
197
- type: 'plugin'
198
- })
199
- }
200
-
201
- private emitThemeChange() {
202
- this.#unistylesEvents.emit('__unistylesOnChange', {
203
- type: 'theme',
204
- payload: {
205
- themeName: this.#themeName
206
- }
207
- })
208
- }
209
-
210
- private emitLayoutChange() {
211
- this.#unistylesEvents.emit('__unistylesOnChange', {
212
- type: 'layout',
213
- payload: {
214
- breakpoint: this.#breakpoint,
215
- orientation: (this.#screenWidth as number) > (this.#screenHeight as number)
216
- ? 'landscape'
217
- : 'portrait',
218
- screen: {
219
- width: this.#screenWidth,
220
- height: this.#screenHeight
221
- }
222
- }
223
- })
224
- }
225
- }
226
-
227
- export const UnistylesModule = new UnistylesBridgeWeb()
@@ -1,51 +0,0 @@
1
- import { useInsertionEffect, useRef } from 'react'
2
- import { unistyles } from '../core'
3
- import type { ReactNativeStyleSheet } from '../types'
4
- import { generateReactNativeWebId } from '../utils'
5
-
6
- export const useCSS = <T>(stylesheet: ReactNativeStyleSheet<T>) => {
7
- const insertedIds = useRef<Array<string>>([])
8
-
9
- useInsertionEffect(() => {
10
- if (!unistyles.registry.config.experimentalCSSMediaQueries) {
11
- return
12
- }
13
-
14
- Object
15
- .entries(stylesheet)
16
- .forEach(([_key, value]) => {
17
- Object.entries(value!)
18
- .forEach(([prop, val]) => {
19
- if (!val.toString().includes('@media')) {
20
- return
21
- }
22
-
23
- const id = generateReactNativeWebId(prop, '""')
24
-
25
- if (insertedIds.current.includes(id)) {
26
- return
27
- }
28
-
29
- const style = document.createElement('style')
30
-
31
- style.id = id
32
- style.innerHTML = val
33
-
34
- document.head.appendChild(style)
35
- insertedIds.current = [...insertedIds.current, id]
36
- })
37
- })
38
-
39
- return () => {
40
- insertedIds.current.forEach(id => {
41
- const style = document.getElementById(id)
42
-
43
- if (style) {
44
- style.remove()
45
- }
46
- })
47
-
48
- insertedIds.current = []
49
- }
50
- }, [stylesheet])
51
- }