{"version":3,"file":"icon.cjs","sources":["../../../components/icon/icon.tsx"],"sourcesContent":["import { computed, defineComponent, h, renderSlot } from 'vue'\n\nimport { useNameHelper, useProps } from '@vexip-ui/config'\nimport { toNumber } from '@vexip-ui/utils'\nimport { iconProps } from './props'\n\nimport type { CSSProperties } from 'vue'\nimport type { IconPresetEffect } from './symbol'\n\nconst internalEffects = Object.freeze<IconPresetEffect[]>([\n  'spin-in',\n  'spin-out',\n  'pulse-in',\n  'pulse-out',\n])\n\nconst angleRE = /(^\\s*[+-]?\\d*\\.?\\d+\\s*)(deg|grad|turn|rad)?\\s*/i\n\nexport default defineComponent({\n  name: 'Icon',\n  props: iconProps,\n  setup(_props, { attrs, slots }) {\n    const props = useProps('icon', _props, {\n      icon: {\n        isFunc: true,\n        default: null,\n        static: true,\n      },\n      scale: 1,\n      title: null,\n      label: null,\n      flip: {\n        default: null,\n        validator: value => ['horizontal', 'vertical', 'both'].includes(value),\n      },\n      effect: null,\n      size: null,\n      color: null,\n      rotate: null,\n      renderer: {\n        default: null,\n        isFunc: true,\n      },\n    })\n\n    const nh = useNameHelper('icon')\n\n    const className = computed(() => {\n      let effectCls = ''\n\n      if (props.effect) {\n        effectCls = internalEffects.includes(props.effect as IconPresetEffect)\n          ? nh.bm(props.effect)\n          : props.effect\n      }\n\n      return {\n        [nh.b()]: true,\n        [nh.bm(`flip-${props.flip}`)]: props.flip,\n        [effectCls]: effectCls,\n      }\n    })\n    const computedScale = computed(() => toNumber(props.scale) || 1)\n    const rotate = computed(() => {\n      if (typeof props.rotate === 'number') {\n        return `${(props.rotate % 4) / 4}turn`\n      }\n\n      const matched = props.rotate?.match(angleRE)\n\n      if (!matched) return null\n\n      const number = toNumber(matched[1])\n\n      if (!matched[2]) {\n        return `${(number % 4) / 4}turn`\n      }\n\n      return number ? `${number}${matched[2]}` : null\n    })\n    const style = computed(() => {\n      const style: CSSProperties = {\n        color: props.color,\n      }\n\n      if (props.size) {\n        style.fontSize = props.size\n      } else if (computedScale.value !== 1) {\n        style.fontSize = `${computedScale.value}em`\n      }\n\n      if (rotate.value) {\n        style[nh.cv('rotate')] = rotate.value\n      }\n\n      return style\n    })\n\n    function renderDefault() {\n      const iAttrs = {\n        class: className.value,\n        style: style.value,\n        title: props.title,\n        role: (attrs.role as string) || (props.label || props.title ? 'img' : undefined),\n        'aria-label': props.label,\n        'aria-hidden': !(props.label || props.title),\n      }\n\n      if (slots.default) {\n        return (\n          <i {...iAttrs}>\n            <g>{renderSlot(slots, 'default')}</g>\n          </i>\n        )\n      }\n\n      if (props.icon) {\n        return (\n          <i {...iAttrs}>\n            <g>{h(props.icon)}</g>\n          </i>\n        )\n      }\n\n      return <i {...iAttrs}></i>\n    }\n\n    return () => {\n      if (typeof props.renderer === 'function') {\n        return props.renderer(props as any, attrs, renderDefault)\n      }\n\n      return renderDefault()\n    }\n  },\n})\n"],"names":["internalEffects","Object","freeze","angleRE","defineComponent","name","props","iconProps","setup","_props","attrs","slots","useProps","icon","isFunc","default","static","scale","title","label","flip","validator","value","includes","effect","size","color","rotate","renderer","nh","useNameHelper","className","computed","effectCls","bm","b","computedScale","toNumber","matched","match","number","style","fontSize","cv","renderDefault","iAttrs","class","role","undefined","_createVNode","renderSlot","h"],"mappings":"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"}