# ZeenSpeakerBadge
Компонент бейджа, принимает в себя: картинку, заголовок, текст, маленький бейдж, кнопку, социальные иконки
# Примеры:
Стандартный пример, набор всего с дефолтными значениями
Пример без кнопки
Пример без кнопки
Пример без кнопки (работает пока что не совсем верно, нужен компонент ZeenSvgIcron)
# props
Название | Тип | Обязательный | По умолчанию | Описание |
---|---|---|---|---|
modalName | string | + | - | Ключевое имя для открытия модального окна |
pictureAttrs | object | + | Некоторые значения объекта могут быть заданы автоматически, но ключ объекта src должен быть передан обязательно | Объект с значениями ключами которыми являются реальные значения пропсов вложенных компонентов. Объект отвечает за поведение картинки |
headlineAttrs | object | - | Некоторые значения объекта могут быть заданы автоматически | Объект с значениями ключами которыми являются реальные значения пропсов вложенных компонентов. Объект отвечает за поведение заголовка |
textAttrs | object | - | Некоторые значения объекта могут быть заданы автоматически | Объект с значениями ключами которыми являются реальные значения пропсов вложенных компонентов. Объект отвечает за поведение текста |
socialIconAttrs | object | - | Некоторые значения объекта могут быть заданы автоматически | Объект с значениями ключами которыми являются реальные значения пропсов вложенных компонентов. Объект отвечает за поведение svg иконки |
buttonAttrs | object | - | Некоторые значения объекта могут быть заданы автоматически | Объект с значениями ключами которыми являются реальные значения пропсов вложенных компонентов. Объект отвечает за поведение кнопки |
textButton | string | - | - | Текст кнопки |
# Slots
Название | Описание |
---|---|
name-speaker | Заголовок бейджа |
about-speaker | Текст под заголовком |
# Source Code - исходный код компонента
<template>
<client-only>
<ZeenModal :name="modalName">
<div class="speaker-badge">
<div class="speaker-badge__header">
<ZeenPicture v-bind="setPictureAttrs" />
<div class="speaker-badge__header-content">
<div>
<ZeenSmallBadge> Small badge Сбербанк </ZeenSmallBadge>
</div>
<ZeenHeadline v-bind="setHeadlineAttrs">
<slot name="name-speaker" />
</ZeenHeadline>
<!-- Надо передавать объект с именами иконками и через v-for его выводить, пока что реализация топорная-->
<div class="speaker-badge__social-icons-container">
<ZeenSocialLinkIcon v-bind="setSocialIconAttrs">
<slot name="email-social-icon" />
</ZeenSocialLinkIcon>
<ZeenSocialLinkIcon v-bind="setSocialIconAttrs">
<slot name="facebook-social-icon" />
</ZeenSocialLinkIcon>
<ZeenSocialLinkIcon v-bind="setSocialIconAttrs">
<slot name="telegram-social-icon" />
</ZeenSocialLinkIcon>
<ZeenSocialLinkIcon v-bind="setSocialIconAttrs">
<slot name="vk-social-icon" />
</ZeenSocialLinkIcon>
<ZeenSocialLinkIcon v-bind="setSocialIconAttrs">
<slot name="youtube-social-icon" />
</ZeenSocialLinkIcon>
</div>
</div>
</div>
<div class="speaker-badge__body">
<ZeenText v-bind="setTextAttrs">
<slot name="about-speaker" />
</ZeenText>
</div>
<div v-if="textButton" class="speaker-badge__footer">
<ZeenButton v-bind="buttonAttrs">{{ this.textButton }}</ZeenButton>
</div>
</div>
</ZeenModal>
</client-only>
</template>
<script>
import ZeenPicture from '../ZeenPicture/ZeenPicture'
import ZeenHeadline from '../ZeenHeadline/ZeenHeadline'
import ZeenText from '../ZeenText/ZeenText'
import ZeenSocialLinkIcon from '../ZeenSocialLinklIcon/ZeenSocialLinkIcon'
import ZeenButton from '../ZeenButton/ZeenButton'
import ZeenModal from '../ZeenModal/ZeenModal'
import ZeenSmallBadge from '../ZeenSmallBadge/ZeenSmallBadge'
export default {
name: 'ZeenSpeakerBadge',
components: {
ZeenSmallBadge,
ZeenModal,
ZeenButton,
ZeenSocialLinkIcon,
ZeenText,
ZeenHeadline,
ZeenPicture,
},
inheritAttrs: false,
props: {
modalName: {
type: String,
require: true,
},
pictureAttrs: {
type: Object,
require: true,
},
headlineAttrs: {
type: Object,
require: false,
default: () => {},
},
textAttrs: {
type: Object,
require: false,
default: () => {},
},
socialIconAttrs: {
type: Object,
require: false,
default: () => {},
},
buttonAttrs: {
type: Object,
require: false,
default: () => {},
},
textButton: {
type: String,
require: false,
default: () => {},
},
},
computed: {
setPictureAttrs() {
let attrs = {}
if (!this.pictureAttrs.boarderRadius) {
attrs.boarderRadius = 1000
}
if (!this.pictureAttrs.maxWidth) {
attrs.maxWidth = 110
}
if (!this.pictureAttrs.maxHeight) {
attrs.maxHeight = 110
}
if (!this.pictureAttrs.alt) {
attrs.alt = 'Фотография спикера'
}
return {...attrs, ...this.pictureAttrs}
},
setHeadlineAttrs() {
let attrs = {}
if (this.headlineAttrs) {
attrs = {...attrs, ...this.headlineAttrs}
}
if (!this.headlineAttrs || !this.headlineAttrs.tag) {
attrs.tag = 'h3'
}
if (!this.headlineAttrs || !this.headlineAttrs.type) {
attrs.type = 'dark-24'
}
return {...attrs}
},
setTextAttrs() {
let attrs = {}
if (this.textAttrs) {
attrs = {...attrs, ...this.textAttrs}
}
if (!this.textAttrs || !this.textAttrs.type) {
attrs.type = 'dark-16'
}
return {...attrs}
},
setSocialIconAttrs() {
let attrs = {}
if (this.socialIconAttrs) {
attrs = {...attrs, ...this.socialIconAttrs}
}
if (!this.socialIconAttrs || !this.socialIconAttrs.theme) {
attrs.theme = 'main-outline'
}
if (!this.socialIconAttrs || !this.socialIconAttrs.width) {
attrs.width = 30
}
if (!this.socialIconAttrs || !this.socialIconAttrs.height) {
attrs.height = 30
}
if (!this.socialIconAttrs || !this.socialIconAttrs.ariaLabel) {
attrs.ariaLabel = 'Ссылка на социальную сеть'
}
return {...attrs}
},
},
}
</script>
<style lang="scss" scoped>
.speaker-badge {
&__header {
display: flex;
align-items: center;
.zeen-picture {
margin-right: 30px;
}
&-content {
max-height: 110px;
display: flex;
flex-direction: column;
justify-content: space-between;
.zeen-headline {
margin-top: 10px;
margin-bottom: 15px;
}
}
}
&__social-icons-container {
display: flex;
.social-link-icon:not(:last-child) {
margin-right: 10px;
}
}
&__body {
.zeen-text {
margin-top: 47px;
margin-bottom: 40px;
}
}
}
</style>