1
This commit is contained in:
Generated
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
import type { Transformer } from './interface';
|
||||
export declare const AUTO_PREFIX: {};
|
||||
declare const transform: Transformer;
|
||||
export default transform;
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = exports.AUTO_PREFIX = void 0;
|
||||
const AUTO_PREFIX = exports.AUTO_PREFIX = {};
|
||||
const transform = AUTO_PREFIX;
|
||||
var _default = exports.default = transform;
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
import type { CSSObject } from '..';
|
||||
export interface Transformer {
|
||||
visit?: (cssObj: CSSObject) => CSSObject;
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
Generated
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
import type { Transformer } from './interface';
|
||||
/**
|
||||
* Convert css logical properties to legacy properties.
|
||||
* Such as: `margin-block-start` to `margin-top`.
|
||||
* Transform list:
|
||||
* - inset
|
||||
* - margin
|
||||
* - padding
|
||||
* - border
|
||||
*/
|
||||
declare const transform: Transformer;
|
||||
export default transform;
|
||||
Generated
Vendored
+149
@@ -0,0 +1,149 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = void 0;
|
||||
function splitValues(value) {
|
||||
if (typeof value === 'number') {
|
||||
return [[value], false];
|
||||
}
|
||||
const rawStyle = String(value).trim();
|
||||
const importantCells = rawStyle.match(/(.*)(!important)/);
|
||||
const splitStyle = (importantCells ? importantCells[1] : rawStyle).trim().split(/\s+/);
|
||||
|
||||
// Combine styles split in brackets, like `calc(1px + 2px)`
|
||||
let temp = [];
|
||||
let brackets = 0;
|
||||
return [splitStyle.reduce((list, item) => {
|
||||
if (item.includes('(') || item.includes(')')) {
|
||||
const left = item.split('(').length - 1;
|
||||
const right = item.split(')').length - 1;
|
||||
brackets += left - right;
|
||||
}
|
||||
if (brackets >= 0) temp.push(item);
|
||||
if (brackets === 0) {
|
||||
list.push(temp.join(' '));
|
||||
temp = [];
|
||||
}
|
||||
return list;
|
||||
}, []), !!importantCells];
|
||||
}
|
||||
function noSplit(list) {
|
||||
list.notSplit = true;
|
||||
return list;
|
||||
}
|
||||
const keyMap = {
|
||||
// Inset
|
||||
inset: ['top', 'right', 'bottom', 'left'],
|
||||
insetBlock: ['top', 'bottom'],
|
||||
insetBlockStart: ['top'],
|
||||
insetBlockEnd: ['bottom'],
|
||||
insetInline: ['left', 'right'],
|
||||
insetInlineStart: ['left'],
|
||||
insetInlineEnd: ['right'],
|
||||
// Margin
|
||||
marginBlock: ['marginTop', 'marginBottom'],
|
||||
marginBlockStart: ['marginTop'],
|
||||
marginBlockEnd: ['marginBottom'],
|
||||
marginInline: ['marginLeft', 'marginRight'],
|
||||
marginInlineStart: ['marginLeft'],
|
||||
marginInlineEnd: ['marginRight'],
|
||||
// Padding
|
||||
paddingBlock: ['paddingTop', 'paddingBottom'],
|
||||
paddingBlockStart: ['paddingTop'],
|
||||
paddingBlockEnd: ['paddingBottom'],
|
||||
paddingInline: ['paddingLeft', 'paddingRight'],
|
||||
paddingInlineStart: ['paddingLeft'],
|
||||
paddingInlineEnd: ['paddingRight'],
|
||||
// Border
|
||||
borderBlock: noSplit(['borderTop', 'borderBottom']),
|
||||
borderBlockStart: noSplit(['borderTop']),
|
||||
borderBlockEnd: noSplit(['borderBottom']),
|
||||
borderInline: noSplit(['borderLeft', 'borderRight']),
|
||||
borderInlineStart: noSplit(['borderLeft']),
|
||||
borderInlineEnd: noSplit(['borderRight']),
|
||||
// Border width
|
||||
borderBlockWidth: ['borderTopWidth', 'borderBottomWidth'],
|
||||
borderBlockStartWidth: ['borderTopWidth'],
|
||||
borderBlockEndWidth: ['borderBottomWidth'],
|
||||
borderInlineWidth: ['borderLeftWidth', 'borderRightWidth'],
|
||||
borderInlineStartWidth: ['borderLeftWidth'],
|
||||
borderInlineEndWidth: ['borderRightWidth'],
|
||||
// Border style
|
||||
borderBlockStyle: ['borderTopStyle', 'borderBottomStyle'],
|
||||
borderBlockStartStyle: ['borderTopStyle'],
|
||||
borderBlockEndStyle: ['borderBottomStyle'],
|
||||
borderInlineStyle: ['borderLeftStyle', 'borderRightStyle'],
|
||||
borderInlineStartStyle: ['borderLeftStyle'],
|
||||
borderInlineEndStyle: ['borderRightStyle'],
|
||||
// Border color
|
||||
borderBlockColor: ['borderTopColor', 'borderBottomColor'],
|
||||
borderBlockStartColor: ['borderTopColor'],
|
||||
borderBlockEndColor: ['borderBottomColor'],
|
||||
borderInlineColor: ['borderLeftColor', 'borderRightColor'],
|
||||
borderInlineStartColor: ['borderLeftColor'],
|
||||
borderInlineEndColor: ['borderRightColor'],
|
||||
// Border radius
|
||||
borderStartStartRadius: ['borderTopLeftRadius'],
|
||||
borderStartEndRadius: ['borderTopRightRadius'],
|
||||
borderEndStartRadius: ['borderBottomLeftRadius'],
|
||||
borderEndEndRadius: ['borderBottomRightRadius']
|
||||
};
|
||||
function wrapImportantAndSkipCheck(value, important) {
|
||||
let parsedValue = value;
|
||||
if (important) {
|
||||
parsedValue = `${parsedValue} !important`;
|
||||
}
|
||||
return {
|
||||
_skip_check_: true,
|
||||
value: parsedValue
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert css logical properties to legacy properties.
|
||||
* Such as: `margin-block-start` to `margin-top`.
|
||||
* Transform list:
|
||||
* - inset
|
||||
* - margin
|
||||
* - padding
|
||||
* - border
|
||||
*/
|
||||
const transform = {
|
||||
visit: cssObj => {
|
||||
const clone = {};
|
||||
Object.keys(cssObj).forEach(key => {
|
||||
const value = cssObj[key];
|
||||
const matchValue = keyMap[key];
|
||||
if (matchValue && (typeof value === 'number' || typeof value === 'string')) {
|
||||
const [values, important] = splitValues(value);
|
||||
if (matchValue.length && matchValue.notSplit) {
|
||||
// not split means always give same value like border
|
||||
matchValue.forEach(matchKey => {
|
||||
clone[matchKey] = wrapImportantAndSkipCheck(value, important);
|
||||
});
|
||||
} else if (matchValue.length === 1) {
|
||||
// Handle like `marginBlockStart` => `marginTop`
|
||||
clone[matchValue[0]] = wrapImportantAndSkipCheck(values[0], important);
|
||||
} else if (matchValue.length === 2) {
|
||||
// Handle like `marginBlock` => `marginTop` & `marginBottom`
|
||||
matchValue.forEach((matchKey, index) => {
|
||||
clone[matchKey] = wrapImportantAndSkipCheck(values[index] ?? values[0], important);
|
||||
});
|
||||
} else if (matchValue.length === 4) {
|
||||
// Handle like `inset` => `top` & `right` & `bottom` & `left`
|
||||
matchValue.forEach((matchKey, index) => {
|
||||
clone[matchKey] = wrapImportantAndSkipCheck(values[index] ?? values[index - 2] ?? values[0], important);
|
||||
});
|
||||
} else {
|
||||
clone[key] = value;
|
||||
}
|
||||
} else {
|
||||
clone[key] = value;
|
||||
}
|
||||
});
|
||||
return clone;
|
||||
}
|
||||
};
|
||||
var _default = exports.default = transform;
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
import type { Transformer } from './interface';
|
||||
interface Options {
|
||||
/**
|
||||
* The root font size.
|
||||
* @default 16
|
||||
*/
|
||||
rootValue?: number;
|
||||
/**
|
||||
* The decimal numbers to allow the REM units to grow to.
|
||||
* @default 5
|
||||
*/
|
||||
precision?: number;
|
||||
/**
|
||||
* Whether to allow px to be converted in media queries.
|
||||
* @default false
|
||||
*/
|
||||
mediaQuery?: boolean;
|
||||
}
|
||||
declare const transform: (options?: Options) => Transformer;
|
||||
export default transform;
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
"use strict";
|
||||
|
||||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = void 0;
|
||||
var _unitless = _interopRequireDefault(require("@emotion/unitless"));
|
||||
/**
|
||||
* respect https://github.com/cuth/postcss-pxtorem
|
||||
*/
|
||||
// @ts-ignore
|
||||
|
||||
const pxRegex = /url\([^)]+\)|var\([^)]+\)|(\d*\.?\d+)px/g;
|
||||
function toFixed(number, precision) {
|
||||
const multiplier = Math.pow(10, precision + 1),
|
||||
wholeNumber = Math.floor(number * multiplier);
|
||||
return Math.round(wholeNumber / 10) * 10 / multiplier;
|
||||
}
|
||||
const transform = (options = {}) => {
|
||||
const {
|
||||
rootValue = 16,
|
||||
precision = 5,
|
||||
mediaQuery = false
|
||||
} = options;
|
||||
const pxReplace = (m, $1) => {
|
||||
if (!$1) return m;
|
||||
const pixels = parseFloat($1);
|
||||
// covenant: pixels <= 1, not transform to rem @zombieJ
|
||||
if (pixels <= 1) return m;
|
||||
const fixedVal = toFixed(pixels / rootValue, precision);
|
||||
return `${fixedVal}rem`;
|
||||
};
|
||||
const visit = cssObj => {
|
||||
const clone = {
|
||||
...cssObj
|
||||
};
|
||||
Object.entries(cssObj).forEach(([key, value]) => {
|
||||
if (typeof value === 'string' && value.includes('px')) {
|
||||
const newValue = value.replace(pxRegex, pxReplace);
|
||||
clone[key] = newValue;
|
||||
}
|
||||
|
||||
// no unit
|
||||
if (!_unitless.default[key] && typeof value === 'number' && value !== 0) {
|
||||
clone[key] = `${value}px`.replace(pxRegex, pxReplace);
|
||||
}
|
||||
|
||||
// Media queries
|
||||
const mergedKey = key.trim();
|
||||
if (mergedKey.startsWith('@') && mergedKey.includes('px') && mediaQuery) {
|
||||
const newKey = key.replace(pxRegex, pxReplace);
|
||||
clone[newKey] = clone[key];
|
||||
delete clone[key];
|
||||
}
|
||||
});
|
||||
return clone;
|
||||
};
|
||||
return {
|
||||
visit
|
||||
};
|
||||
};
|
||||
var _default = exports.default = transform;
|
||||
Reference in New Issue
Block a user