px2rem.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _unitless = _interopRequireDefault(require("@emotion/unitless"));
  10. /**
  11. * respect https://github.com/cuth/postcss-pxtorem
  12. */
  13. // @ts-ignore
  14. var pxRegex = /url\([^)]+\)|var\([^)]+\)|(\d*\.?\d+)px/g;
  15. function toFixed(number, precision) {
  16. var multiplier = Math.pow(10, precision + 1),
  17. wholeNumber = Math.floor(number * multiplier);
  18. return Math.round(wholeNumber / 10) * 10 / multiplier;
  19. }
  20. var transform = function transform() {
  21. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  22. var _options$rootValue = options.rootValue,
  23. rootValue = _options$rootValue === void 0 ? 16 : _options$rootValue,
  24. _options$precision = options.precision,
  25. precision = _options$precision === void 0 ? 5 : _options$precision,
  26. _options$mediaQuery = options.mediaQuery,
  27. mediaQuery = _options$mediaQuery === void 0 ? false : _options$mediaQuery;
  28. var pxReplace = function pxReplace(m, $1) {
  29. if (!$1) return m;
  30. var pixels = parseFloat($1);
  31. // covenant: pixels <= 1, not transform to rem @zombieJ
  32. if (pixels <= 1) return m;
  33. var fixedVal = toFixed(pixels / rootValue, precision);
  34. return "".concat(fixedVal, "rem");
  35. };
  36. var visit = function visit(cssObj) {
  37. var clone = (0, _objectSpread2.default)({}, cssObj);
  38. Object.entries(cssObj).forEach(function (_ref) {
  39. var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
  40. key = _ref2[0],
  41. value = _ref2[1];
  42. if (typeof value === 'string' && value.includes('px')) {
  43. var newValue = value.replace(pxRegex, pxReplace);
  44. clone[key] = newValue;
  45. }
  46. // no unit
  47. if (!_unitless.default[key] && typeof value === 'number' && value !== 0) {
  48. clone[key] = "".concat(value, "px").replace(pxRegex, pxReplace);
  49. }
  50. // Media queries
  51. var mergedKey = key.trim();
  52. if (mergedKey.startsWith('@') && mergedKey.includes('px') && mediaQuery) {
  53. var newKey = key.replace(pxRegex, pxReplace);
  54. clone[newKey] = clone[key];
  55. delete clone[key];
  56. }
  57. });
  58. return clone;
  59. };
  60. return {
  61. visit: visit
  62. };
  63. };
  64. var _default = exports.default = transform;