Skip to content

Commit 80a5b53

Browse files
authored
feat: add px2rem in cssinjs (#6817)
* fix: fix table column data is passed into chlidren is undefined or null errorr * feat: add px2rem in cssinjs
1 parent cacbde3 commit 80a5b53

File tree

4 files changed

+98
-2
lines changed

4 files changed

+98
-2
lines changed

components/_util/cssinjs/index.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import type { CSSInterpolation, CSSObject } from './hooks/useStyleRegister';
33
import useStyleRegister, { extractStyle } from './hooks/useStyleRegister';
44
import Keyframes from './Keyframes';
55
import type { Linter } from './linters';
6-
import { legacyNotSelectorLinter, logicalPropertiesLinter } from './linters';
6+
import { legacyNotSelectorLinter, logicalPropertiesLinter, parentSelectorLinter } from './linters';
77
import type { StyleContextProps, StyleProviderProps } from './StyleContext';
88
import { createCache, useStyleInject, useStyleProvider, StyleProvider } from './StyleContext';
99
import type { DerivativeFunc, TokenType } from './theme';
1010
import { createTheme, Theme } from './theme';
1111
import type { Transformer } from './transformers/interface';
1212
import legacyLogicalPropertiesTransformer from './transformers/legacyLogicalProperties';
13-
13+
import px2remTransformer from './transformers/px2rem';
1414
const cssinjs = {
1515
Theme,
1616
createTheme,
@@ -24,10 +24,12 @@ const cssinjs = {
2424

2525
// Transformer
2626
legacyLogicalPropertiesTransformer,
27+
px2remTransformer,
2728

2829
// Linters
2930
logicalPropertiesLinter,
3031
legacyNotSelectorLinter,
32+
parentSelectorLinter,
3133

3234
// cssinjs
3335
StyleProvider,
@@ -45,10 +47,12 @@ export {
4547

4648
// Transformer
4749
legacyLogicalPropertiesTransformer,
50+
px2remTransformer,
4851

4952
// Linters
5053
logicalPropertiesLinter,
5154
legacyNotSelectorLinter,
55+
parentSelectorLinter,
5256

5357
// cssinjs
5458
StyleProvider,

components/_util/cssinjs/linters/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export { default as hashedAnimationLinter } from './hashedAnimationLinter';
33
export type { Linter } from './interface';
44
export { default as legacyNotSelectorLinter } from './legacyNotSelectorLinter';
55
export { default as logicalPropertiesLinter } from './logicalPropertiesLinter';
6+
export { default as parentSelectorLinter } from './parentSelectorLinter';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import type { Linter } from '..';
2+
import { lintWarning } from './utils';
3+
4+
const linter: Linter = (_key, _value, info) => {
5+
if (
6+
info.parentSelectors.some(selector => {
7+
const selectors = selector.split(',');
8+
return selectors.some(item => item.split('&').length > 2);
9+
})
10+
) {
11+
lintWarning('Should not use more than one `&` in a selector.', info);
12+
}
13+
};
14+
15+
export default linter;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* respect https://github.com/cuth/postcss-pxtorem
3+
*/
4+
import unitless from '@emotion/unitless';
5+
import type { CSSObject } from '..';
6+
import type { Transformer } from './interface';
7+
8+
interface Options {
9+
/**
10+
* The root font size.
11+
* @default 16
12+
*/
13+
rootValue?: number;
14+
/**
15+
* The decimal numbers to allow the REM units to grow to.
16+
* @default 5
17+
*/
18+
precision?: number;
19+
/**
20+
* Whether to allow px to be converted in media queries.
21+
* @default false
22+
*/
23+
mediaQuery?: boolean;
24+
}
25+
26+
const pxRegex = /url\([^)]+\)|var\([^)]+\)|(\d*\.?\d+)px/g;
27+
28+
function toFixed(number: number, precision: number) {
29+
const multiplier = Math.pow(10, precision + 1),
30+
wholeNumber = Math.floor(number * multiplier);
31+
return (Math.round(wholeNumber / 10) * 10) / multiplier;
32+
}
33+
34+
const transform = (options: Options = {}): Transformer => {
35+
const { rootValue = 16, precision = 5, mediaQuery = false } = options;
36+
37+
const pxReplace = (m: string, $1: any) => {
38+
if (!$1) return m;
39+
const pixels = parseFloat($1);
40+
// covenant: pixels <= 1, not transform to rem @zombieJ
41+
if (pixels <= 1) return m;
42+
const fixedVal = toFixed(pixels / rootValue, precision);
43+
return `${fixedVal}rem`;
44+
};
45+
46+
const visit = (cssObj: CSSObject): CSSObject => {
47+
const clone: CSSObject = { ...cssObj };
48+
49+
Object.entries(cssObj).forEach(([key, value]) => {
50+
if (typeof value === 'string' && value.includes('px')) {
51+
const newValue = value.replace(pxRegex, pxReplace);
52+
clone[key] = newValue;
53+
}
54+
55+
// no unit
56+
if (!unitless[key] && typeof value === 'number' && value !== 0) {
57+
clone[key] = `${value}px`.replace(pxRegex, pxReplace);
58+
}
59+
60+
// Media queries
61+
const mergedKey = key.trim();
62+
if (mergedKey.startsWith('@') && mergedKey.includes('px') && mediaQuery) {
63+
const newKey = key.replace(pxRegex, pxReplace);
64+
65+
clone[newKey] = clone[key];
66+
delete clone[key];
67+
}
68+
});
69+
70+
return clone;
71+
};
72+
73+
return { visit };
74+
};
75+
76+
export default transform;

0 commit comments

Comments
 (0)