Skip to content

Commit bbfc75c

Browse files
authored
Version 0.3 features and improvements (#34)
1 parent f35f127 commit bbfc75c

9 files changed

+88
-26
lines changed

Diff for: README.md

+9
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ If normal scale will increase your size by +2X, moderateScale will only increase
4949
➡️ moderateScale(10) = 15
5050
➡️ moderateScale(10, 0.1) = 11
5151

52+
All scale functions can be imported using their shorthand alias as well:
53+
```js
54+
import { s, vs, ms } from 'react-native-size-matters';
55+
```
56+
57+
5258
### ScaledSheet
5359
```js
5460
import { ScaledSheet } from 'react-native-size-matters';
@@ -62,6 +68,8 @@ ScaleSheet will take the same stylesObject a regular StyleSheet will take, plus
6268
* `<size>@ms` - will apply `moderateScale` function with resize factor of 0.5 on `size`.
6369
* `<size>@ms<factor>` - will apply `moderateScale` function with resize factor of `factor` on size.
6470

71+
ScaledSheet also supports rounding the result, simply add `r` at the end on of the annotation.
72+
6573
Example:
6674
```js
6775
import { ScaledSheet } from 'react-native-size-matters';
@@ -70,6 +78,7 @@ const styles = ScaledSheet.create({
7078
container: {
7179
width: '100@s', // = scale(100)
7280
height: '200@vs', // = verticalScale(200)
81+
padding: '2@msr', // = Math.round(moderateScale(2))
7382
margin: 5
7483
},
7584
row: {

Diff for: __tests__/ScaledSheet.spec.js

+14
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,14 @@ describe('ScaledSheet', () => {
6868
height: '34@ms',
6969
marginRight: '0.5@ms0.9',
7070
marginLeft: '-0.5@ms0.9',
71+
marginBottom: '0.532@ms0.9',
7172
marginTop: '-10@s',
73+
},
74+
round: {
75+
top: '11.3@sr',
76+
bottom: '22.75@vsr',
77+
left: '35.1@msr',
78+
right: '-20.19@ms0.3r'
7279
}
7380
};
7481

@@ -87,7 +94,14 @@ describe('ScaledSheet', () => {
8794
height: moderateScale(34),
8895
marginRight: moderateScale(0.5, 0.9),
8996
marginLeft: moderateScale(-0.5, 0.9),
97+
marginBottom: moderateScale(0.532, 0.9),
9098
marginTop: scale(-10),
99+
},
100+
round: {
101+
top: Math.round(scale(11.3)),
102+
bottom: Math.round(verticalScale(22.75)),
103+
left: Math.round(moderateScale(35.1)),
104+
right: Math.round(moderateScale(-20.19, 0.3))
91105
}
92106
};
93107

Diff for: __tests__/scaling-utils-alias.spec.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
jest.mock('react-native');
2+
import { s, vs, ms } from '..';
3+
4+
describe('scaling-utils', () => {
5+
test('scale returns the expected result based on mocked Dimensions', () => {
6+
expect(s(2.5)).toBe(5);
7+
expect(s(100)).toBe(200);
8+
expect(s(200)).toBe(400);
9+
});
10+
11+
test('verticalScale returns the expected result based on mocked Dimensions', () => {
12+
expect(vs(5)).toBe(7.5);
13+
expect(vs(100)).toBe(150);
14+
expect(vs(200)).toBe(300);
15+
});
16+
17+
test('moderateScale returns the expected result based on mocked Dimensions', () => {
18+
expect(ms(100)).toBe(150);
19+
expect(ms(100, 0.1)).toBe(110);
20+
expect(ms(100, 0.3)).toBe(130);
21+
expect(ms(100, 0.6)).toBe(160);
22+
expect(ms(100, 0.9)).toBe(190);
23+
expect(ms(100, 2)).toBe(300);
24+
});
25+
})

Diff for: extend.d.ts

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ declare module "react-native-size-matters/extend" {
55
export function scale(size: number): number;
66
export function verticalScale(size: number): number;
77
export function moderateScale(size: number, factor?: number): number;
8+
export function s(size: number): number;
9+
export function vs(size: number): number;
10+
export function ms(size: number, factor?: number): number;
811

912
export namespace ScaledSheet {
1013
export function create<T extends NamedStyles<T> | NamedStyles<any>>(stylesObject: T): {

Diff for: index.d.ts

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ declare module "react-native-size-matters" {
2929
export function scale(size: number): number;
3030
export function verticalScale(size: number): number;
3131
export function moderateScale(size: number, factor?: number): number;
32+
export function s(size: number): number;
33+
export function vs(size: number): number;
34+
export function ms(size: number, factor?: number): number;
3235

3336
type NamedStyles<T> = { [P in keyof T]: RN.ViewStyle | RN.TextStyle | RN.ImageStyle | StringifiedStyles };
3437

Diff for: lib/ScaledSheet.js

+21-17
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,36 @@
11
import { StyleSheet } from 'react-native';
22
import deepMap from './deep-map';
33

4-
const validScaleSheetRegex = /^(\-?\d+(\.\d{1,2})?)@(ms(\d+(\.\d{1,2})?)?|s|vs)$/;
5-
const scaleRegex = /^(\-?\d+(\.\d{1,2})?)@s$/;
6-
const verticalScaleRegex = /^(\-?\d+(\.\d{1,2})?)@vs$/;
7-
const moderateScaleRegex = /^(\-?\d+(\.\d{1,2})?)@ms(\d+(\.\d{1,2})?)?$/;
4+
const validScaleSheetRegex = /^(\-?\d+(\.\d{1,3})?)@(ms(\d+(\.\d{1,2})?)?|s|vs)(r?)$/;
85

96
const scaleByAnnotation = (scale, verticalScale, moderateScale) => (value) => {
107
if (!validScaleSheetRegex.test(value)) {
118
return value;
129
}
13-
const size = parseFloat(value.split('@')[0]);
1410

15-
if (scaleRegex.test(value)) {
16-
return scale(size);
17-
}
11+
const regexExecResult = validScaleSheetRegex.exec(value);
12+
const size = parseFloat(regexExecResult[1]);
13+
const scaleFunc = regexExecResult[3];
14+
const shouldRound = value.endsWith('r');
1815

19-
if (verticalScaleRegex.test(value)) {
20-
return verticalScale(size);
21-
}
16+
let result;
2217

23-
if (moderateScaleRegex.test(value)) {
24-
const scaleFactor = value.split('ms')[1];
25-
if (scaleFactor) {
26-
return moderateScale(size, parseFloat(scaleFactor));
27-
}
28-
return moderateScale(size);
18+
switch (scaleFunc) {
19+
case 's':
20+
result = scale(size);
21+
break;
22+
case 'vs':
23+
result = verticalScale(size);
24+
break;
25+
case 'ms':
26+
result = moderateScale(size);
27+
break;
28+
default:
29+
const scaleFactor = value.split('ms')[1].replace('r', '');
30+
result = moderateScale(size, parseFloat(scaleFactor));
2931
}
32+
33+
return shouldRound ? Math.round(result) : result;
3034
};
3135

3236
const scaledSheetCreator = (scale, verticalScale, moderateScale) => {

Diff for: lib/extend/scaling-utils.extend.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ const [shortDimension, longDimension] = width < height ? [width, height] : [heig
88
const guidelineBaseWidth = SIZE_MATTERS_BASE_WIDTH || 350;
99
const guidelineBaseHeight = SIZE_MATTERS_BASE_HEIGHT || 680;
1010

11-
const scale = size => shortDimension / guidelineBaseWidth * size;
12-
const verticalScale = size => longDimension / guidelineBaseHeight * size;
13-
const moderateScale = (size, factor = 0.5) => size + ( scale(size) - size ) * factor;
11+
export const scale = size => shortDimension / guidelineBaseWidth * size;
12+
export const verticalScale = size => longDimension / guidelineBaseHeight * size;
13+
export const moderateScale = (size, factor = 0.5) => size + ( scale(size) - size ) * factor;
1414

15-
export {scale, verticalScale, moderateScale};
15+
export const s = scale;
16+
export const vs = verticalScale;
17+
export const ms = moderateScale;

Diff for: lib/scaling-utils.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ const [shortDimension, longDimension] = width < height ? [width, height] : [heig
77
const guidelineBaseWidth = 350;
88
const guidelineBaseHeight = 680;
99

10-
const scale = size => shortDimension / guidelineBaseWidth * size;
11-
const verticalScale = size => longDimension / guidelineBaseHeight * size;
12-
const moderateScale = (size, factor = 0.5) => size + ( scale(size) - size ) * factor;
10+
export const scale = size => shortDimension / guidelineBaseWidth * size;
11+
export const verticalScale = size => longDimension / guidelineBaseHeight * size;
12+
export const moderateScale = (size, factor = 0.5) => size + ( scale(size) - size ) * factor;
1313

14-
export {scale, verticalScale, moderateScale};
14+
export const s = scale;
15+
export const vs = verticalScale;
16+
export const ms = moderateScale;

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-size-matters",
3-
"version": "0.2.1",
3+
"version": "0.3.0",
44
"description": "A React-Native utility belt for scaling the size your apps UI across different sized devices",
55
"main": "index.js",
66
"scripts": {

0 commit comments

Comments
 (0)