vuetify
Version:
Vue.js 2 Semantic Component Framework
97 lines (80 loc) • 2.53 kB
JavaScript
require('../../stylus/components/_icons.styl')
import Themeable from '../../mixins/themeable'
import Colorable from '../../mixins/colorable'
const SIZE_MAP = {
small: '16px',
default: '24px',
medium: '28px',
large: '36px',
xLarge: '40px'
}
export default {
name: 'v-icon',
functional: true,
mixins: [Colorable, Themeable],
props: {
disabled: Boolean,
large: Boolean,
left: Boolean,
medium: Boolean,
right: Boolean,
size: {
type: [Number, String]
},
small: Boolean,
xLarge: Boolean
},
render (h, { props, data, children = [] }) {
let fontSize = props.size
switch (true) {
case props.small: fontSize = SIZE_MAP.small
break
case props.medium: fontSize = SIZE_MAP.medium
break
case props.large: fontSize = SIZE_MAP.large
break
case props.xLarge: fontSize = SIZE_MAP.xLarge
break
}
if (fontSize) {
data.style = { fontSize, ...data.style }
}
let iconName = ''
if (children.length) {
iconName = children.pop().text
} else if (data.domProps && data.domProps.textContent) {
iconName = data.domProps.textContent
delete data.domProps.textContent
} else if (data.domProps && data.domProps.innerHTML) {
iconName = data.domProps.innerHTML
delete data.domProps.innerHTML
}
let iconType = 'material-icons'
const thirdPartyIcon = iconName.indexOf('-') > -1
if (thirdPartyIcon) iconType = iconName.slice(0, iconName.indexOf('-'))
data.staticClass = (`${iconType} icon ${data.staticClass || ''}`).trim()
data.attrs = data.attrs || {}
if (!('aria-hidden' in data.attrs)) {
data.attrs['aria-hidden'] = true
}
const classes = Object.assign({
'icon--disabled': props.disabled,
'icon--left': props.left,
'icon--right': props.right,
'theme--dark': props.dark,
'theme--light': props.light
}, props.color ? Colorable.methods.addTextColorClassChecks.call(props, {}, 'color') : {
'primary--text': props.primary,
'secondary--text': props.secondary,
'success--text': props.success,
'info--text': props.info,
'warning--text': props.warning,
'error--text': props.error
})
const iconClasses = Object.keys(classes).filter(k => classes[k]).join(' ')
iconClasses && (data.staticClass += ` ${iconClasses}`)
if (thirdPartyIcon) data.staticClass += ` ${iconName}`
else children.push(iconName)
return h('i', data, children)
}
}