{"version":3,"file":"unit-converter.cjs","sources":["../../../src/utils/unit-converter.js"],"sourcesContent":["/**\r\n * 单位转换工具\r\n * 支持: %, vw, vh, vm, vmin, vmax, px, rpx\r\n */\r\n\r\n/**\r\n * 解析带单位的数值\r\n * @param {string|number} value - 带单位的字符串或数值\r\n * @returns {Object} { value: number, unit: string }\r\n */\r\nexport function parseUnit(value) {\r\n  if (typeof value === 'number') {\r\n    return { value, unit: 'px' };\r\n  }\r\n  \r\n  if (typeof value !== 'string') {\r\n    return { value: 0, unit: 'px' };\r\n  }\r\n\r\n  const trimmed = value.trim();\r\n  \r\n  // 匹配数字和单位（按长度从长到短匹配，避免vmin被误识别为vm）\r\n  // 先尝试匹配长单位（vmin, vmax, rpx）\r\n  const longUnitMatch = trimmed.match(/^(-?\\d*\\.?\\d+)(vmin|vmax|rpx)$/);\r\n  if (longUnitMatch) {\r\n    return {\r\n      value: parseFloat(longUnitMatch[1]),\r\n      unit: longUnitMatch[2],\r\n    };\r\n  }\r\n  \r\n  // 再匹配其他单位\r\n  const match = trimmed.match(/^(-?\\d*\\.?\\d+)(%|vw|vh|vm|px)$/);\r\n  if (match) {\r\n    return {\r\n      value: parseFloat(match[1]),\r\n      unit: match[2],\r\n    };\r\n  }\r\n  \r\n  // 纯数字\r\n  const numMatch = trimmed.match(/^(-?\\d*\\.?\\d+)$/);\r\n  if (numMatch) {\r\n    return {\r\n      value: parseFloat(numMatch[1]),\r\n      unit: 'px',\r\n    };\r\n  }\r\n  \r\n  // 如果都不匹配，尝试解析为数字\r\n  return { value: parseFloat(trimmed) || 0, unit: 'px' };\r\n}\r\n\r\n/**\r\n * 将带单位的值转换为像素值\r\n * @param {string|number} value - 带单位的字符串或数值\r\n * @param {Object} context - 上下文对象 { width, height, dimension }\r\n * @param {string} dimension - 维度类型 'x'|'y'|'width'|'height'，用于确定百分比基准\r\n * @returns {number} 像素值\r\n */\r\nexport function toPixels(value, context = {}, dimension = 'width') {\r\n  const { value: numValue, unit } = parseUnit(value);\r\n  const { width = 1920, height = 1080 } = context;\r\n\r\n  switch (unit) {\r\n    case '%':\r\n      // 百分比：x和width基于宽度，y和height基于高度\r\n      if (dimension === 'y' || dimension === 'height') {\r\n        return (numValue / 100) * height;\r\n      } else {\r\n        return (numValue / 100) * width;\r\n      }\r\n    \r\n    case 'vw':\r\n      // 视口宽度单位 (1vw = 1% of viewport width)\r\n      return (numValue / 100) * width;\r\n    \r\n    case 'vh':\r\n      // 视口高度单位 (1vh = 1% of viewport height)\r\n      return (numValue / 100) * height;\r\n    \r\n    case 'vm':\r\n      // 视口较小尺寸单位 (1vm = 1% of smaller viewport dimension)\r\n      return (numValue / 100) * Math.min(width, height);\r\n    \r\n    case 'vmin':\r\n      // 视口最小尺寸单位 (1vmin = 1% of smaller viewport dimension)\r\n      return (numValue / 100) * Math.min(width, height);\r\n    \r\n    case 'vmax':\r\n      // 视口最大尺寸单位 (1vmax = 1% of larger viewport dimension)\r\n      return (numValue / 100) * Math.max(width, height);\r\n    \r\n    case 'rpx':\r\n      // 响应式像素单位 (类似小程序rpx，750rpx = 100% width)\r\n      return (numValue / 750) * width;\r\n    \r\n    case 'px':\r\n    default:\r\n      return numValue;\r\n  }\r\n}\r\n\r\n/**\r\n * 转换字体大小单位\r\n * @param {string|number} fontSize - 字体大小\r\n * @param {Object} context - 上下文对象 { width, height, baseFontSize }\r\n * @returns {number} 像素值\r\n */\r\nexport function toFontSizePixels(fontSize, context = {}) {\r\n  if (typeof fontSize === 'number') {\r\n    return fontSize;\r\n  }\r\n  \r\n  const { value: numValue, unit } = parseUnit(fontSize);\r\n  const { width = 1920, height = 1080, baseFontSize = 16 } = context;\r\n\r\n  switch (unit) {\r\n    case '%':\r\n      // 百分比相对于基准字体大小\r\n      return (numValue / 100) * baseFontSize;\r\n    \r\n    case 'rpx':\r\n      // 响应式像素单位 (750rpx = 100% width)\r\n      return (numValue / 750) * width;\r\n    \r\n    case 'vw':\r\n      // 视口宽度单位\r\n      return (numValue / 100) * width;\r\n    \r\n    case 'vh':\r\n      // 视口高度单位\r\n      return (numValue / 100) * height;\r\n    \r\n    case 'vmin':\r\n      // 视口最小尺寸单位\r\n      return (numValue / 100) * Math.min(width, height);\r\n    \r\n    case 'vmax':\r\n      // 视口最大尺寸单位\r\n      return (numValue / 100) * Math.max(width, height);\r\n    \r\n    case 'px':\r\n    default:\r\n      return numValue;\r\n  }\r\n}\r\n\r\n/**\r\n * 批量转换对象中的单位值\r\n * @param {Object} obj - 包含需要转换的值对象\r\n * @param {Array<string>} keys - 需要转换的键名数组\r\n * @param {Object} context - 上下文对象\r\n * @param {Function} converter - 转换函数 (默认为 toPixels)\r\n * @returns {Object} 转换后的对象\r\n */\r\nexport function convertUnits(obj, keys, context, converter = toPixels) {\r\n  const result = { ...obj };\r\n  \r\n  for (const key of keys) {\r\n    if (key in result && result[key] != null) {\r\n      result[key] = converter(result[key], context);\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\n"],"names":[],"mappings":"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"}