{"version":3,"file":"px2rem.cjs","sources":["../../../../../../packages/theme/cssinjs/transformers/px2rem.ts"],"sourcesContent":["import type { CSSObject } from '..';\nimport type { Transformer } from './interface';\n\n/**\n * respect https://github.com/cuth/postcss-pxtorem\n */\nimport unitless from '@emotion/unitless';\n\nexport interface Px2RemOptions {\n  /**\n   * The root font size.\n   * @default 16\n   */\n  rootValue?: number\n  /**\n   * The decimal numbers to allow the REM units to grow to.\n   * @default 5\n   */\n  precision?: number\n  /**\n   * Whether to allow px to be converted in media queries.\n   * @default false\n   */\n  mediaQuery?: boolean\n}\n\nconst pxRegex = /url\\([^)]+\\)|var\\([^)]+\\)|(\\d*\\.?\\d+)px/g;\n\nfunction toFixed(number: number, precision: number) {\n  const multiplier = 10 ** (precision + 1);\n  const wholeNumber = Math.floor(number * multiplier);\n  return (Math.round(wholeNumber / 10) * 10) / multiplier;\n}\n\nexport function px2remTransformer(options: Px2RemOptions = {}): Transformer {\n  const { rootValue = 16, precision = 5, mediaQuery = false } = options;\n\n  const pxReplace = (m: string, $1: any) => {\n    if (!$1) return m;\n    const pixels = Number.parseFloat($1);\n    // covenant: pixels <= 1, not transform to rem @zombieJ\n    if (pixels <= 1) return m;\n    const fixedVal = toFixed(pixels / rootValue, precision);\n    return `${fixedVal}rem`;\n  };\n\n  const visit = (cssObj: CSSObject): CSSObject => {\n    const clone: CSSObject = { ...cssObj };\n\n    Object.entries(cssObj).forEach(([key, value]) => {\n      if (typeof value === 'string' && value.includes('px')) {\n        const newValue = value.replace(pxRegex, pxReplace);\n        clone[key] = newValue;\n      }\n\n      // no unit\n      if (!unitless[key] && typeof value === 'number' && value !== 0)\n        clone[key] = `${value}px`.replace(pxRegex, pxReplace);\n\n      // Media queries\n      const mergedKey = key.trim();\n      if (mergedKey.startsWith('@') && mergedKey.includes('px') && mediaQuery) {\n        const newKey = key.replace(pxRegex, pxReplace);\n\n        clone[newKey] = clone[key];\n        delete clone[key];\n      }\n    });\n\n    return clone;\n  };\n\n  return { visit };\n}\n"],"names":[],"mappings":";;;;AA0BA,MAAM,OAAU,GAAA,0CAAA,CAAA;AAEhB,SAAS,OAAA,CAAQ,QAAgB,SAAmB,EAAA;AAClD,EAAM,MAAA,UAAA,GAAa,OAAO,SAAY,GAAA,CAAA,CAAA,CAAA;AACtC,EAAA,MAAM,WAAc,GAAA,IAAA,CAAK,KAAM,CAAA,MAAA,GAAS,UAAU,CAAA,CAAA;AAClD,EAAA,OAAQ,IAAK,CAAA,KAAA,CAAM,WAAc,GAAA,EAAE,IAAI,EAAM,GAAA,UAAA,CAAA;AAC/C,CAAA;AAEgB,SAAA,iBAAA,CAAkB,OAAyB,GAAA,EAAiB,EAAA;AAC1E,EAAA,MAAM,EAAE,SAAY,GAAA,EAAA,EAAI,YAAY,CAAG,EAAA,UAAA,GAAa,OAAU,GAAA,OAAA,CAAA;AAE9D,EAAM,MAAA,SAAA,GAAY,CAAC,CAAA,EAAW,EAAY,KAAA;AACxC,IAAA,IAAI,CAAC,EAAA;AAAI,MAAO,OAAA,CAAA,CAAA;AAChB,IAAM,MAAA,MAAA,GAAS,MAAO,CAAA,UAAA,CAAW,EAAE,CAAA,CAAA;AAEnC,IAAA,IAAI,MAAU,IAAA,CAAA;AAAG,MAAO,OAAA,CAAA,CAAA;AACxB,IAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,MAAS,GAAA,SAAA,EAAW,SAAS,CAAA,CAAA;AACtD,IAAA,OAAO,GAAG,QAAQ,CAAA,GAAA,CAAA,CAAA;AAAA,GACpB,CAAA;AAEA,EAAM,MAAA,KAAA,GAAQ,CAAC,MAAiC,KAAA;AAC9C,IAAM,MAAA,KAAA,GAAmB,EAAE,GAAG,MAAO,EAAA,CAAA;AAErC,IAAO,MAAA,CAAA,OAAA,CAAQ,MAAM,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AAC/C,MAAA,IAAI,OAAO,KAAU,KAAA,QAAA,IAAY,KAAM,CAAA,QAAA,CAAS,IAAI,CAAG,EAAA;AACrD,QAAA,MAAM,QAAW,GAAA,KAAA,CAAM,OAAQ,CAAA,OAAA,EAAS,SAAS,CAAA,CAAA;AACjD,QAAA,KAAA,CAAM,GAAG,CAAI,GAAA,QAAA,CAAA;AAAA,OACf;AAGA,MAAA,IAAI,CAAC,QAAS,CAAA,GAAG,KAAK,OAAO,KAAA,KAAU,YAAY,KAAU,KAAA,CAAA;AAC3D,QAAA,KAAA,CAAM,GAAG,CAAI,GAAA,CAAA,EAAG,KAAK,CAAK,EAAA,CAAA,CAAA,OAAA,CAAQ,SAAS,SAAS,CAAA,CAAA;AAGtD,MAAM,MAAA,SAAA,GAAY,IAAI,IAAK,EAAA,CAAA;AAC3B,MAAI,IAAA,SAAA,CAAU,WAAW,GAAG,CAAA,IAAK,UAAU,QAAS,CAAA,IAAI,KAAK,UAAY,EAAA;AACvE,QAAA,MAAM,MAAS,GAAA,GAAA,CAAI,OAAQ,CAAA,OAAA,EAAS,SAAS,CAAA,CAAA;AAE7C,QAAM,KAAA,CAAA,MAAM,CAAI,GAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AACzB,QAAA,OAAO,MAAM,GAAG,CAAA,CAAA;AAAA,OAClB;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,KAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,OAAO,EAAE,KAAM,EAAA,CAAA;AACjB;;;;"}