// Styles import "../../../src/components/VBadge/VBadge.sass"; // Components import VIcon from '../VIcon/VIcon'; // Mixins import Colorable from '../../mixins/colorable'; import Themeable from '../../mixins/themeable'; import Toggleable from '../../mixins/toggleable'; import Transitionable from '../../mixins/transitionable'; import { factory as PositionableFactory } from '../../mixins/positionable'; // Utilities import mixins from '../../util/mixins'; import { convertToUnit, getSlot } from '../../util/helpers'; export default mixins(Colorable, PositionableFactory(['left', 'bottom']), Themeable, Toggleable, Transitionable).extend({ name: 'v-badge', props: { avatar: Boolean, bordered: Boolean, color: { type: String, default: 'primary' }, content: { required: false }, dot: Boolean, label: { type: String, default: '$vuetify.badge' }, icon: String, inline: Boolean, offsetX: [Number, String], offsetY: [Number, String], overlap: Boolean, tile: Boolean, transition: { type: String, default: 'scale-rotate-transition' }, value: { default: true } }, computed: { classes() { return { 'v-badge--avatar': this.avatar, 'v-badge--bordered': this.bordered, 'v-badge--bottom': this.bottom, 'v-badge--dot': this.dot, 'v-badge--icon': this.icon != null, 'v-badge--inline': this.inline, 'v-badge--left': this.left, 'v-badge--overlap': this.overlap, 'v-badge--tile': this.tile, ...this.themeClasses }; }, computedBottom() { return this.bottom ? 'auto' : this.computedYOffset; }, computedLeft() { if (this.isRtl) { return this.left ? this.computedXOffset : 'auto'; } return this.left ? 'auto' : this.computedXOffset; }, computedRight() { if (this.isRtl) { return this.left ? 'auto' : this.computedXOffset; } return !this.left ? 'auto' : this.computedXOffset; }, computedTop() { return this.bottom ? this.computedYOffset : 'auto'; }, computedXOffset() { return this.calcPosition(this.offsetX); }, computedYOffset() { return this.calcPosition(this.offsetY); }, isRtl() { return this.$vuetify.rtl; }, // Default fallback if offsetX // or offsetY are undefined. offset() { if (this.overlap) return this.dot ? 8 : 12; return this.dot ? 2 : 4; }, styles() { if (this.inline) return {}; return { bottom: this.computedBottom, left: this.computedLeft, right: this.computedRight, top: this.computedTop }; } }, methods: { calcPosition(offset) { return `calc(100% - ${convertToUnit(offset || this.offset)})`; }, genBadge() { const lang = this.$vuetify.lang; const label = this.$attrs['aria-label'] || lang.t(this.label); const data = this.setBackgroundColor(this.color, { staticClass: 'v-badge__badge', style: this.styles, attrs: { 'aria-atomic': this.$attrs['aria-atomic'] || 'true', 'aria-label': label, 'aria-live': this.$attrs['aria-live'] || 'polite', title: this.$attrs.title, role: this.$attrs.role || 'status' }, directives: [{ name: 'show', value: this.isActive }] }); const badge = this.$createElement('span', data, [this.genBadgeContent()]); if (!this.transition) return badge; return this.$createElement('transition', { props: { name: this.transition, origin: this.origin, mode: this.mode } }, [badge]); }, genBadgeContent() { // Dot prop shows no content if (this.dot) return undefined; const slot = getSlot(this, 'badge'); if (slot) return slot; if (this.content) return String(this.content); if (this.icon) return this.$createElement(VIcon, this.icon); return undefined; }, genBadgeWrapper() { return this.$createElement('span', { staticClass: 'v-badge__wrapper' }, [this.genBadge()]); } }, render(h) { const badge = [this.genBadgeWrapper()]; const children = [getSlot(this)]; const { 'aria-atomic': _x, 'aria-label': _y, 'aria-live': _z, role, title, ...attrs } = this.$attrs; if (this.inline && this.left) children.unshift(badge);else children.push(badge); return h('span', { staticClass: 'v-badge', attrs, class: this.classes }, children); } }); //# sourceMappingURL=VBadge.js.map