quasar
Version:
Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time
68 lines (56 loc) • 1.7 kB
JavaScript
import { h, computed } from 'vue'
import { createComponent } from '../../utils/private.create/create.js'
import { hMergeSlot } from '../../utils/private.render/render.js'
const alignValues = ['top', 'middle', 'bottom']
export default createComponent({
name: 'QBadge',
props: {
color: String,
textColor: String,
floating: Boolean,
transparent: Boolean,
multiLine: Boolean,
outline: Boolean,
rounded: Boolean,
label: [Number, String],
align: {
type: String,
validator: v => alignValues.includes(v)
}
},
setup(props, { slots }) {
const style = computed(() =>
props.align !== void 0 ? { verticalAlign: props.align } : null
)
const classes = computed(() => {
const text =
props.outline === true
? props.color || props.textColor
: props.textColor
return (
'q-badge flex inline items-center no-wrap' +
` q-badge--${props.multiLine === true ? 'multi' : 'single'}-line` +
(props.outline === true
? ' q-badge--outline'
: props.color !== void 0
? ` bg-${props.color}`
: '') +
(text !== void 0 ? ` text-${text}` : '') +
(props.floating === true ? ' q-badge--floating' : '') +
(props.rounded === true ? ' q-badge--rounded' : '') +
(props.transparent === true ? ' q-badge--transparent' : '')
)
})
return () =>
h(
'div',
{
class: classes.value,
style: style.value,
role: 'status',
'aria-label': props.label
},
hMergeSlot(slots.default, props.label !== void 0 ? [props.label] : [])
)
}
})