react-native-unistyles 1.0.0-beta.1
Sign up to get free protection for your applications and to get access to all the features.
- package/LICENSE +20 -0
- package/README.md +243 -0
- package/lib/commonjs/UnistylesTheme.js +21 -0
- package/lib/commonjs/UnistylesTheme.js.map +1 -0
- package/lib/commonjs/createUnistyles.js +52 -0
- package/lib/commonjs/createUnistyles.js.map +1 -0
- package/lib/commonjs/index.js +20 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/breakpoints.js +139 -0
- package/lib/commonjs/utils/breakpoints.js.map +1 -0
- package/lib/commonjs/utils/breakpoints.spec.js +149 -0
- package/lib/commonjs/utils/breakpoints.spec.js.map +1 -0
- package/lib/commonjs/utils/common.js +11 -0
- package/lib/commonjs/utils/common.js.map +1 -0
- package/lib/commonjs/utils/index.js +32 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/commonjs/utils/mediaQueries.js +189 -0
- package/lib/commonjs/utils/mediaQueries.js.map +1 -0
- package/lib/commonjs/utils/mediaQueries.spec.js +220 -0
- package/lib/commonjs/utils/mediaQueries.spec.js.map +1 -0
- package/lib/commonjs/utils/styles.js +82 -0
- package/lib/commonjs/utils/styles.js.map +1 -0
- package/lib/commonjs/utils/styles.spec.js +98 -0
- package/lib/commonjs/utils/styles.spec.js.map +1 -0
- package/lib/module/UnistylesTheme.js +12 -0
- package/lib/module/UnistylesTheme.js.map +1 -0
- package/lib/module/createUnistyles.js +45 -0
- package/lib/module/createUnistyles.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/breakpoints.js +131 -0
- package/lib/module/utils/breakpoints.js.map +1 -0
- package/lib/module/utils/breakpoints.spec.js +147 -0
- package/lib/module/utils/breakpoints.spec.js.map +1 -0
- package/lib/module/utils/common.js +4 -0
- package/lib/module/utils/common.js.map +1 -0
- package/lib/module/utils/index.js +3 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/mediaQueries.js +176 -0
- package/lib/module/utils/mediaQueries.js.map +1 -0
- package/lib/module/utils/mediaQueries.spec.js +218 -0
- package/lib/module/utils/mediaQueries.spec.js.map +1 -0
- package/lib/module/utils/styles.js +75 -0
- package/lib/module/utils/styles.js.map +1 -0
- package/lib/module/utils/styles.spec.js +96 -0
- package/lib/module/utils/styles.spec.js.map +1 -0
- package/lib/typescript/src/UnistylesTheme.d.ts +9 -0
- package/lib/typescript/src/UnistylesTheme.d.ts.map +1 -0
- package/lib/typescript/src/createUnistyles.d.ts +9 -0
- package/lib/typescript/src/createUnistyles.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +27 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/breakpoints.d.ts +63 -0
- package/lib/typescript/src/utils/breakpoints.d.ts.map +1 -0
- package/lib/typescript/src/utils/breakpoints.spec.d.ts +2 -0
- package/lib/typescript/src/utils/breakpoints.spec.d.ts.map +1 -0
- package/lib/typescript/src/utils/common.d.ts +2 -0
- package/lib/typescript/src/utils/common.d.ts.map +1 -0
- package/lib/typescript/src/utils/index.d.ts +3 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/mediaQueries.d.ts +130 -0
- package/lib/typescript/src/utils/mediaQueries.d.ts.map +1 -0
- package/lib/typescript/src/utils/mediaQueries.spec.d.ts +2 -0
- package/lib/typescript/src/utils/mediaQueries.spec.d.ts.map +1 -0
- package/lib/typescript/src/utils/styles.d.ts +56 -0
- package/lib/typescript/src/utils/styles.d.ts.map +1 -0
- package/lib/typescript/src/utils/styles.spec.d.ts +2 -0
- package/lib/typescript/src/utils/styles.spec.d.ts.map +1 -0
- package/package.json +132 -0
- package/src/UnistylesTheme.tsx +17 -0
- package/src/createUnistyles.ts +56 -0
- package/src/index.ts +2 -0
- package/src/types.ts +52 -0
- package/src/utils/breakpoints.ts +140 -0
- package/src/utils/common.ts +3 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/mediaQueries.ts +201 -0
- package/src/utils/styles.ts +95 -0
package/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2023 Jacek Pudysz
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
6
|
+
in the Software without restriction, including without limitation the rights
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
9
|
+
furnished to do so, subject to the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be included in all
|
12
|
+
copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20
|
+
SOFTWARE.
|
package/README.md
ADDED
@@ -0,0 +1,243 @@
|
|
1
|
+
[<img alt="react-native-unistyles" src="assets/banner.png">](https://codemask.com)
|
2
|
+
|
3
|
+
|
4
|
+
<picture>
|
5
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/uni-dark.svg">
|
6
|
+
<img alt="react-native-unistyles" src="assets/uni-light.svg">
|
7
|
+
</picture>
|
8
|
+
|
9
|
+
## Features
|
10
|
+
- ⚡ Blazing fast, adds around ~5ms on top of StyleSheet*
|
11
|
+
- 🎳 Share up to 100% of your styles across platforms in monorepo
|
12
|
+
- 🎯 Doesn't introduce new components
|
13
|
+
- 🖥️ Supports custom breakpoints and css-like media queries
|
14
|
+
- 🎨 Access theme in your StyleSheets and components
|
15
|
+
- 🪄 Supports dynamic functions to access values from JSX
|
16
|
+
- 🥳 Compatible with Expo, Expo Go, Bare React Native and React Native Web
|
17
|
+
- ⚔️ No 3rd party dependencies
|
18
|
+
|
19
|
+
*-based on this [benchmark](https://github.com/efstathiosntonas/react-native-style-libraries-benchmark)
|
20
|
+
|
21
|
+
## Beta
|
22
|
+
|
23
|
+
This project is currently in its beta phase. While it hasn't reached version 1.0.0 yet, it's been tested and proven in a large-scale application, performing flawlessly across hundreds screens and components.
|
24
|
+
|
25
|
+
I'm looking for testers to check the typings, scalability and overall usability for your monorepo projects.
|
26
|
+
|
27
|
+
Suggestions, ideas, and potential improvements are always welcome!
|
28
|
+
|
29
|
+
## Setup
|
30
|
+
|
31
|
+
|
32
|
+
**1. Install library**
|
33
|
+
|
34
|
+
```cmd
|
35
|
+
yarn add react-native-unistyles
|
36
|
+
```
|
37
|
+
|
38
|
+
**2. Define your theme**
|
39
|
+
|
40
|
+
You don't have to follow a specific format. Just make an object and add any keys/values you like.
|
41
|
+
|
42
|
+
```ts
|
43
|
+
// theme.ts
|
44
|
+
export const theme = {
|
45
|
+
colors: {
|
46
|
+
blood: '#eb4d4b',
|
47
|
+
barbie: '#e056fd',
|
48
|
+
pumpkin: '#f0932b',
|
49
|
+
background: '#ffffff'
|
50
|
+
},
|
51
|
+
components: {
|
52
|
+
typography: {
|
53
|
+
bold: {
|
54
|
+
fontWeight: 'bold'
|
55
|
+
},
|
56
|
+
thin: {
|
57
|
+
fontWeight: '300'
|
58
|
+
}
|
59
|
+
}
|
60
|
+
},
|
61
|
+
margins: {
|
62
|
+
sm: 2,
|
63
|
+
md: 4,
|
64
|
+
lg: 8,
|
65
|
+
xl: 12
|
66
|
+
},
|
67
|
+
utils: {
|
68
|
+
hexToRGBA: (hex: string, opacity: number) => {
|
69
|
+
const rgb = hex
|
70
|
+
.replace('#', '')
|
71
|
+
.split(/(?=(?:..)*$)/)
|
72
|
+
.map(x => parseInt(x, 16))
|
73
|
+
return `rgba(${rgb.at(0)}, ${rgb.at(1)}, ${rgb.at(2)}, ${opacity})`
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
```
|
78
|
+
**3. Create breakpoints**
|
79
|
+
|
80
|
+
There are no predefined breakpoints. You can name them anything. Just make an object with string keys and number values.
|
81
|
+
|
82
|
+
```ts
|
83
|
+
// breakpoints.ts
|
84
|
+
export const breakpoints = {
|
85
|
+
xs: 0,
|
86
|
+
sm: 576,
|
87
|
+
md: 768,
|
88
|
+
lg: 992,
|
89
|
+
xl: 1200,
|
90
|
+
superLarge: 2000,
|
91
|
+
tvLike: 4000
|
92
|
+
}
|
93
|
+
```
|
94
|
+
|
95
|
+
**4. Wrap your app with UnistylesTheme to inject theme**
|
96
|
+
|
97
|
+
```tsx
|
98
|
+
import React from 'react'
|
99
|
+
import { UnistylesTheme } from 'react-native-unistyles'
|
100
|
+
import { theme } from './theme'
|
101
|
+
|
102
|
+
export const App: React.FunctionComponent = () => (
|
103
|
+
<UnistylesTheme theme={theme}>
|
104
|
+
// Your App
|
105
|
+
</UnistylesTheme>
|
106
|
+
)
|
107
|
+
```
|
108
|
+
|
109
|
+
**5. Access createStyles and useStyles with a factory**
|
110
|
+
|
111
|
+
```ts
|
112
|
+
// styles.ts
|
113
|
+
|
114
|
+
// import library factory
|
115
|
+
import { createUnistyles } from 'react-native-unistyles'
|
116
|
+
// import your breakpoints, add whatever keys and numeric values you want
|
117
|
+
import { breakpoints } from './breakpoints'
|
118
|
+
// import your app's theme TypeScript type, or simply use 'typeof theme'
|
119
|
+
import { theme } from './theme'
|
120
|
+
|
121
|
+
export const {
|
122
|
+
createStyles,
|
123
|
+
useStyles,
|
124
|
+
} = createUnistyles<typeof breakpoints, typeof theme>(breakpoints)
|
125
|
+
```
|
126
|
+
|
127
|
+
## Basic Usage
|
128
|
+
|
129
|
+
Library gives you two functions from the factory:
|
130
|
+
- `createStyles` which replaces `StyleSheet.create`
|
131
|
+
- `useStyles` which parses your styles based on screen height, width and theme
|
132
|
+
|
133
|
+
```tsx
|
134
|
+
import React from 'react'
|
135
|
+
import { View, Text } from 'react-native'
|
136
|
+
// access createStyles and useStyles exported from factory
|
137
|
+
import { createStyles, useStyles } from 'lib/styles'
|
138
|
+
|
139
|
+
export const ExampleUnistyles = () => {
|
140
|
+
const { styles } = useStyles(stylesheet)
|
141
|
+
|
142
|
+
return (
|
143
|
+
<View style={styles.container}>
|
144
|
+
<Text style={styles.text}>
|
145
|
+
Unistyles example
|
146
|
+
</Text>
|
147
|
+
</View>
|
148
|
+
)
|
149
|
+
}
|
150
|
+
|
151
|
+
const stylesheet = createStyles(theme => ({
|
152
|
+
container: {
|
153
|
+
flex: 1,
|
154
|
+
justifyContent: 'center',
|
155
|
+
alignItems: 'center',
|
156
|
+
backgroundColor: theme.colors.background
|
157
|
+
},
|
158
|
+
text: {
|
159
|
+
color: theme.colors.typography
|
160
|
+
}
|
161
|
+
}))
|
162
|
+
```
|
163
|
+
|
164
|
+
`createStyles` takes an object like `StyleSheet.create` or function that injects your theme
|
165
|
+
|
166
|
+
`useStyles` hook takes a `stylesheet` and returns an object with two keys:
|
167
|
+
- `styles` - parsed styles that can be used directly in React Native components
|
168
|
+
- `theme` - your app's theme that can be used in JSX
|
169
|
+
|
170
|
+
You can also skip `stylesheet` if you just want to access `theme`:
|
171
|
+
|
172
|
+
```tsx
|
173
|
+
const { theme } = useStyles()
|
174
|
+
```
|
175
|
+
|
176
|
+
## Breakpoints
|
177
|
+
|
178
|
+
Any style can change based on breakpoints. To do this, change a value to an object:
|
179
|
+
|
180
|
+
```ts
|
181
|
+
const stylesheet = createStyles(theme => ({
|
182
|
+
container: {
|
183
|
+
flex: 1,
|
184
|
+
justifyContent: 'center',
|
185
|
+
alignItems: 'center',
|
186
|
+
backgroundColor: {
|
187
|
+
// your breakpoints
|
188
|
+
xs: theme.colors.background,
|
189
|
+
sm: theme.colors.barbie
|
190
|
+
}
|
191
|
+
},
|
192
|
+
text: {
|
193
|
+
color: theme.colors.typography
|
194
|
+
}
|
195
|
+
}))
|
196
|
+
```
|
197
|
+
|
198
|
+
Library will choose the correct value (based on screen width) in the runtime.
|
199
|
+
|
200
|
+
## Media queries
|
201
|
+
|
202
|
+
For more advanced usage and pixel perfect designs you can also use a custom media queries. Library supports 4 types of media queries (w-width, h-height):
|
203
|
+
|
204
|
+
```ts
|
205
|
+
:w[200, 500] - with upper and lower bounds, it translates to width from 200-500px
|
206
|
+
:w[, 800] - with upper bound only, it's equal to width from 0-800px
|
207
|
+
:h[400] - lower bound only, it means height from 400px
|
208
|
+
:h[200, 300]:w[500] - combined queries for both width and height
|
209
|
+
```
|
210
|
+
|
211
|
+
Media queries can be mixed with breakpoints, but have a bigger priority:
|
212
|
+
|
213
|
+
```tsx
|
214
|
+
const stylesheet = createStyles(theme => ({
|
215
|
+
container: {
|
216
|
+
justifyContent: 'center',
|
217
|
+
alignItems: 'center',
|
218
|
+
flexDirection: {
|
219
|
+
xs: 'column',
|
220
|
+
sm: 'row',
|
221
|
+
},
|
222
|
+
backgroundColor: {
|
223
|
+
xs: theme.colors.background,
|
224
|
+
':w[600]': theme.colors.barbie
|
225
|
+
}
|
226
|
+
},
|
227
|
+
text: {
|
228
|
+
color: theme.colors.typography
|
229
|
+
}
|
230
|
+
}))
|
231
|
+
```
|
232
|
+
|
233
|
+
## Example
|
234
|
+
|
235
|
+
In order to check out working example go to [example/](./example).
|
236
|
+
|
237
|
+
## Blog post
|
238
|
+
|
239
|
+
For more detailed explanation please refer to my blog post [here](https://www.reactnativecrossroads.com/posts/level-up-react-native-styles).
|
240
|
+
|
241
|
+
## License
|
242
|
+
|
243
|
+
MIT
|
@@ -0,0 +1,21 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.UnistylesTheme = exports.UnistylesContext = void 0;
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
8
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
9
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
10
|
+
const UnistylesContext = exports.UnistylesContext = /*#__PURE__*/(0, _react.createContext)({});
|
11
|
+
const UnistylesTheme = _ref => {
|
12
|
+
let {
|
13
|
+
theme,
|
14
|
+
children
|
15
|
+
} = _ref;
|
16
|
+
return /*#__PURE__*/_react.default.createElement(UnistylesContext.Provider, {
|
17
|
+
value: theme
|
18
|
+
}, children);
|
19
|
+
};
|
20
|
+
exports.UnistylesTheme = UnistylesTheme;
|
21
|
+
//# sourceMappingURL=UnistylesTheme.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","UnistylesContext","exports","createContext","UnistylesTheme","_ref","theme","children","createElement","Provider","value"],"sourceRoot":"../../src","sources":["UnistylesTheme.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA4C,SAAAC,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAH,wBAAAO,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAOrC,MAAMW,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,gBAAG,IAAAE,oBAAa,EAAC,CAAC,CAAC,CAAC;AAE1C,MAAMC,cAA4D,GAAGC,IAAA;EAAA,IAAC;IACzEC,KAAK;IACLC;EACJ,CAAC,GAAAF,IAAA;EAAA,oBACG7B,MAAA,CAAAU,OAAA,CAAAsB,aAAA,CAACP,gBAAgB,CAACQ,QAAQ;IAACC,KAAK,EAAEJ;EAAM,GACnCC,QACsB,CAAC;AAAA,CAC/B;AAAAL,OAAA,CAAAE,cAAA,GAAAA,cAAA"}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.createUnistyles = void 0;
|
7
|
+
var _react = require("react");
|
8
|
+
var _reactNative = require("react-native");
|
9
|
+
var _UnistylesTheme = require("./UnistylesTheme");
|
10
|
+
var _utils = require("./utils");
|
11
|
+
const createUnistyles = breakpoints => {
|
12
|
+
const sortedBreakpoints = (0, _utils.sortAndValidateBreakpoints)(breakpoints);
|
13
|
+
return {
|
14
|
+
createStyles: styles => styles,
|
15
|
+
useStyles: stylesheet => {
|
16
|
+
const theme = (0, _react.useContext)(_UnistylesTheme.UnistylesContext);
|
17
|
+
const dimensions = (0, _reactNative.useWindowDimensions)();
|
18
|
+
const breakpoint = (0, _utils.getBreakpointFromScreenWidth)(dimensions.width, sortedBreakpoints);
|
19
|
+
const screenSize = {
|
20
|
+
width: dimensions.width,
|
21
|
+
height: dimensions.height
|
22
|
+
};
|
23
|
+
if (!stylesheet) {
|
24
|
+
return {
|
25
|
+
theme,
|
26
|
+
styles: {}
|
27
|
+
};
|
28
|
+
}
|
29
|
+
const parsedStyles = typeof stylesheet === 'function' ? stylesheet(theme) : stylesheet;
|
30
|
+
const dynamicStyleSheet = Object.entries(parsedStyles).reduce((acc, _ref) => {
|
31
|
+
let [key, value] = _ref;
|
32
|
+
const x = value;
|
33
|
+
if (typeof value === 'function') {
|
34
|
+
return {
|
35
|
+
...acc,
|
36
|
+
[key]: (0, _utils.proxifyFunction)(value, breakpoint, screenSize, sortedBreakpoints)
|
37
|
+
};
|
38
|
+
}
|
39
|
+
return {
|
40
|
+
...acc,
|
41
|
+
[key]: (0, _utils.parseStyle)(x, breakpoint, screenSize, sortedBreakpoints)
|
42
|
+
};
|
43
|
+
}, {});
|
44
|
+
return {
|
45
|
+
theme,
|
46
|
+
styles: dynamicStyleSheet
|
47
|
+
};
|
48
|
+
}
|
49
|
+
};
|
50
|
+
};
|
51
|
+
exports.createUnistyles = createUnistyles;
|
52
|
+
//# sourceMappingURL=createUnistyles.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_UnistylesTheme","_utils","createUnistyles","breakpoints","sortedBreakpoints","sortAndValidateBreakpoints","createStyles","styles","useStyles","stylesheet","theme","useContext","UnistylesContext","dimensions","useWindowDimensions","breakpoint","getBreakpointFromScreenWidth","width","screenSize","height","parsedStyles","dynamicStyleSheet","Object","entries","reduce","acc","_ref","key","value","x","proxifyFunction","parseStyle","exports"],"sourceRoot":"../../src","sources":["createUnistyles.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAEO,MAAMI,eAAe,GAA8CC,WAAc,IAAK;EACzF,MAAMC,iBAAiB,GAAG,IAAAC,iCAA0B,EAACF,WAAW,CAAM;EAEtE,OAAO;IACHG,YAAY,EAAsCC,MAAqC,IAAKA,MAAW;IACvGC,SAAS,EAAwCC,UAA4C,IAAK;MAC9F,MAAMC,KAAK,GAAG,IAAAC,iBAAU,EAACC,gCAAgB,CAAM;MAC/C,MAAMC,UAAU,GAAG,IAAAC,gCAAmB,EAAC,CAAC;MACxC,MAAMC,UAAU,GAAG,IAAAC,mCAA4B,EAAIH,UAAU,CAACI,KAAK,EAAEb,iBAAiB,CAAC;MACvF,MAAMc,UAAsB,GAAG;QAC3BD,KAAK,EAAEJ,UAAU,CAACI,KAAK;QACvBE,MAAM,EAAEN,UAAU,CAACM;MACvB,CAAC;MAED,IAAI,CAACV,UAAU,EAAE;QACb,OAAO;UACHC,KAAK;UACLH,MAAM,EAAE,CAAC;QACb,CAAC;MACL;MAEA,MAAMa,YAAY,GAAG,OAAOX,UAAU,KAAK,UAAU,GAC/CA,UAAU,CAACC,KAAK,CAAC,GACjBD,UAAU;MAEhB,MAAMY,iBAAiB,GAAGC,MAAM,CAC3BC,OAAO,CAACH,YAAY,CAAC,CACrBI,MAAM,CAAC,CAACC,GAAG,EAAAC,IAAA,KAAmB;QAAA,IAAjB,CAACC,GAAG,EAAEC,KAAK,CAAC,GAAAF,IAAA;QACtB,MAAMG,CAAC,GAAGD,KAAiC;QAE3C,IAAI,OAAOA,KAAK,KAAK,UAAU,EAAE;UAC7B,OAAO;YACH,GAAGH,GAAG;YACN,CAACE,GAAG,GAAG,IAAAG,sBAAe,EAAIF,KAAK,EAAEb,UAAU,EAAEG,UAAU,EAAEd,iBAAiB;UAC9E,CAAC;QACL;QAEA,OAAO;UACH,GAAGqB,GAAG;UACN,CAACE,GAAG,GAAG,IAAAI,iBAAU,EAAQF,CAAC,EAAEd,UAAU,EAAEG,UAAU,EAAEd,iBAAiB;QACzE,CAAC;MACL,CAAC,EAAE,CAAC,CAAO,CAAC;MAEhB,OAAO;QACHM,KAAK;QACLH,MAAM,EAAEc;MACZ,CAAC;IACL;EACJ,CAAC;AACL,CAAC;AAAAW,OAAA,CAAA9B,eAAA,GAAAA,eAAA"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
Object.defineProperty(exports, "UnistylesTheme", {
|
7
|
+
enumerable: true,
|
8
|
+
get: function () {
|
9
|
+
return _UnistylesTheme.UnistylesTheme;
|
10
|
+
}
|
11
|
+
});
|
12
|
+
Object.defineProperty(exports, "createUnistyles", {
|
13
|
+
enumerable: true,
|
14
|
+
get: function () {
|
15
|
+
return _createUnistyles.createUnistyles;
|
16
|
+
}
|
17
|
+
});
|
18
|
+
var _UnistylesTheme = require("./UnistylesTheme");
|
19
|
+
var _createUnistyles = require("./createUnistyles");
|
20
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_UnistylesTheme","require","_createUnistyles"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":""}
|
@@ -0,0 +1,139 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.sortAndValidateBreakpoints = exports.getValueForBreakpoint = exports.getBreakpointFromScreenWidth = void 0;
|
7
|
+
var _common = require("./common");
|
8
|
+
var _mediaQueries = require("./mediaQueries");
|
9
|
+
/**
|
10
|
+
* Sorts the breakpoints object based on its numeric values in ascending order and validates them.
|
11
|
+
*
|
12
|
+
* This function takes an object where keys represent breakpoint names and values are numeric.
|
13
|
+
* It returns a new object with the same keys but sorted based on their corresponding numeric values.
|
14
|
+
* Additionally, it validates that:
|
15
|
+
* 1. The first breakpoint starts with a value of 0.
|
16
|
+
* 2. No duplicate breakpoint values exist.
|
17
|
+
*
|
18
|
+
* If the validation fails, appropriate error messages are logged to the console.
|
19
|
+
*
|
20
|
+
* @template B - An object type where keys are strings and values are numbers.
|
21
|
+
* @param {B} breakpoints - The breakpoints object to be sorted and validated.
|
22
|
+
* @returns {B} A new object with sorted and validated breakpoints.
|
23
|
+
*
|
24
|
+
* @example
|
25
|
+
* const input = { md: 768, lg: 1024, sm: 0 }
|
26
|
+
* sortAndValidateBreakpoints(input) // returns { sm: 0, md: 768, lg: 1024 }
|
27
|
+
*/
|
28
|
+
const sortAndValidateBreakpoints = breakpoints => {
|
29
|
+
const sortedPairs = Object.entries(breakpoints).sort((breakpoint1, breakpoint2) => {
|
30
|
+
const [, value1] = breakpoint1;
|
31
|
+
const [, value2] = breakpoint2;
|
32
|
+
return value1 - value2;
|
33
|
+
});
|
34
|
+
const sortedBreakpoints = Object.freeze(Object.fromEntries(sortedPairs));
|
35
|
+
const breakpointValues = Object.values(sortedBreakpoints);
|
36
|
+
const [firstBreakpoint] = breakpointValues;
|
37
|
+
if (firstBreakpoint !== 0) {
|
38
|
+
(0, _common.throwError)('first breakpoint must start with 0');
|
39
|
+
}
|
40
|
+
if (breakpointValues.length !== new Set(breakpointValues).size) {
|
41
|
+
(0, _common.throwError)('breakpoint values are duplicated');
|
42
|
+
}
|
43
|
+
return sortedBreakpoints;
|
44
|
+
};
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Determines the appropriate breakpoint key for a given screen width based on provided breakpoints.
|
48
|
+
*
|
49
|
+
* This function takes a screen width and an object of breakpoints. It returns the key of the breakpoint
|
50
|
+
* that the screen width falls into. The breakpoints are assumed to be sorted in ascending order.
|
51
|
+
*
|
52
|
+
* @template B - An object type where keys are strings and values are numbers representing screen widths.
|
53
|
+
* @param {number} width - The screen width to determine the breakpoint for.
|
54
|
+
* @param {B} breakpoints - The breakpoints object to use for determination.
|
55
|
+
* @returns {keyof B & string} The key of the breakpoint that the screen width falls into.
|
56
|
+
*
|
57
|
+
* @example
|
58
|
+
* const breakpoints = { sm: 0, md: 768, lg: 1024 }
|
59
|
+
* getBreakpointFromScreenWidth(800, breakpoints) // returns 'md'
|
60
|
+
*/
|
61
|
+
exports.sortAndValidateBreakpoints = sortAndValidateBreakpoints;
|
62
|
+
const getBreakpointFromScreenWidth = (width, breakpoints) => {
|
63
|
+
const [key] = Object.entries(breakpoints).find((_ref, index, otherBreakpoints) => {
|
64
|
+
let [, value] = _ref;
|
65
|
+
const minVal = value;
|
66
|
+
const maxVal = otherBreakpoints[index + 1]?.[1];
|
67
|
+
if (!maxVal) {
|
68
|
+
return true;
|
69
|
+
}
|
70
|
+
return width >= minVal && width < maxVal;
|
71
|
+
});
|
72
|
+
return key;
|
73
|
+
};
|
74
|
+
|
75
|
+
/**
|
76
|
+
* Retrieves the value associated with a given breakpoint or custom media query based on the provided screen size.
|
77
|
+
*
|
78
|
+
* The function first checks for custom media queries. If a matching custom media query is found, its associated value is returned.
|
79
|
+
* If no custom media query matches, the function then checks for a direct breakpoint match.
|
80
|
+
* If there's no direct breakpoint match, the function simulates CSS cascading to find the closest matching breakpoint.
|
81
|
+
*
|
82
|
+
* @template B - An object type where keys represent breakpoint names and values represent breakpoint values.
|
83
|
+
*
|
84
|
+
* @param {Record<keyof B & string, string | number>} value - An object containing values associated with breakpoints or custom media queries.
|
85
|
+
* @param {keyof B & string} breakpoint - The breakpoint name to check against.
|
86
|
+
* @param {ScreenSize} screenSize - An object representing the screen size to be checked against the media queries.
|
87
|
+
* @param {B} breakpoints - An object representing the defined breakpoints.
|
88
|
+
*
|
89
|
+
* @returns {string | number | undefined} Returns the value associated with the matching breakpoint or custom media query, or `undefined` if no match is found.
|
90
|
+
*
|
91
|
+
* @example
|
92
|
+
*
|
93
|
+
* const values = { ':w[200]': 'value1', sm: 'value2', md: 'value3' }
|
94
|
+
* const screenSize = { width: 250, height: 400 }
|
95
|
+
* const breakpoints = { sm: 300, md: 600, lg: 900 }
|
96
|
+
*
|
97
|
+
* getValueForBreakpoint(values, 'sm', screenSize, breakpoints); // 'value1'
|
98
|
+
*/
|
99
|
+
exports.getBreakpointFromScreenWidth = getBreakpointFromScreenWidth;
|
100
|
+
const getValueForBreakpoint = (value, breakpoint, screenSize, breakpoints) => {
|
101
|
+
// the highest priority is for custom media queries
|
102
|
+
const customMediaQueries = Object.entries(value).filter(_ref2 => {
|
103
|
+
let [key] = _ref2;
|
104
|
+
return (0, _mediaQueries.isMediaQuery)(key);
|
105
|
+
});
|
106
|
+
const customMediaQueryKey = (0, _mediaQueries.getKeyForCustomMediaQuery)(customMediaQueries, screenSize);
|
107
|
+
if (customMediaQueryKey && customMediaQueryKey in value) {
|
108
|
+
return value[customMediaQueryKey];
|
109
|
+
}
|
110
|
+
|
111
|
+
// if no custom media query, or didn't match, proceed with defined breakpoints
|
112
|
+
const unifiedKey = breakpoint.toLowerCase();
|
113
|
+
const directBreakpoint = value[unifiedKey];
|
114
|
+
|
115
|
+
// if there is a direct key like 'sm' or 'md', or value for this key exists but its undefined
|
116
|
+
if (directBreakpoint || unifiedKey in value) {
|
117
|
+
return directBreakpoint;
|
118
|
+
}
|
119
|
+
|
120
|
+
// there is no direct hit for breakpoint nor media-query, so let's simulate CSS cascading
|
121
|
+
const allBreakpoints = Object.entries(breakpoints).map(_ref3 => {
|
122
|
+
let [key, bpValue] = _ref3;
|
123
|
+
return [key.toLowerCase(), bpValue];
|
124
|
+
});
|
125
|
+
const currentBreakpoint = allBreakpoints.findIndex(_ref4 => {
|
126
|
+
let [key] = _ref4;
|
127
|
+
return key === unifiedKey;
|
128
|
+
});
|
129
|
+
const availableBreakpoints = allBreakpoints.filter((_ref5, index) => {
|
130
|
+
let [key] = _ref5;
|
131
|
+
return index < currentBreakpoint && key && key in value;
|
132
|
+
}).map(_ref6 => {
|
133
|
+
let [key] = _ref6;
|
134
|
+
return key;
|
135
|
+
});
|
136
|
+
return allBreakpoints.length > 0 ? value[availableBreakpoints[availableBreakpoints.length - 1]] : undefined;
|
137
|
+
};
|
138
|
+
exports.getValueForBreakpoint = getValueForBreakpoint;
|
139
|
+
//# sourceMappingURL=breakpoints.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_common","require","_mediaQueries","sortAndValidateBreakpoints","breakpoints","sortedPairs","Object","entries","sort","breakpoint1","breakpoint2","value1","value2","sortedBreakpoints","freeze","fromEntries","breakpointValues","values","firstBreakpoint","throwError","length","Set","size","exports","getBreakpointFromScreenWidth","width","key","find","_ref","index","otherBreakpoints","value","minVal","maxVal","getValueForBreakpoint","breakpoint","screenSize","customMediaQueries","filter","_ref2","isMediaQuery","customMediaQueryKey","getKeyForCustomMediaQuery","unifiedKey","toLowerCase","directBreakpoint","allBreakpoints","map","_ref3","bpValue","currentBreakpoint","findIndex","_ref4","availableBreakpoints","_ref5","_ref6","undefined"],"sourceRoot":"../../../src","sources":["utils/breakpoints.ts"],"mappings":"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"}
|