// Utils import { createNamespace, addUnit, isDef } from '../utils'; import { inherit } from '../utils/functional'; // Components import Info from '../info'; // Types import { CreateElement, RenderContext } from 'vue/types'; import { DefaultSlots } from '../utils/types'; export type IconProps = { dot?: boolean; tag: keyof HTMLElementTagNameMap | string; name?: string; size?: string | number; info?: string | number; badge?: string | number; color?: string; classPrefix: string; }; export type IconEvents = { onClick?(event: Event): void; }; const [createComponent, bem] = createNamespace('icon'); function isImage(name?: string): boolean { return name ? name.indexOf('/') !== -1 : false; } // compatible with legacy usage, should be removed in next major version const LEGACY_MAP: Record = { medel: 'medal', 'medel-o': 'medal-o', }; function correctName(name?: string) { return (name && LEGACY_MAP[name]) || name; } function Icon( h: CreateElement, props: IconProps, slots: DefaultSlots, ctx: RenderContext ) { const name = correctName(props.name); const imageIcon = isImage(name); return ( {slots.default && slots.default()} {imageIcon && } ); } Icon.props = { dot: Boolean, name: String, size: [Number, String], // @deprecated // should be removed in next major version info: [Number, String], badge: [Number, String], color: String, tag: { type: String, default: 'i', }, classPrefix: { type: String, default: bem(), }, }; export default createComponent(Icon);