# ZeenSpeakerItem
Компонент карточки спикера. Содержит в себе: фотографию спикера, имя, компанию и должность
Принимает в себя слоты с именами: speaker-name, post, company
# Примеры
Поведение по умолчанию
Наталья МоскаленкоCEO Главный директор особо важных делНациональный фонд помощи общественным организациям помогающим национальным фондамПередача цвета в имя спикера
--speaker-item-name-color: red
Наталья МоскаленкоCEO Главный директор особо важных делНациональный фонд помощи общественным организациям помогающим национальным фондамПередача цвета в должность спикера
--speaker-item-post-color: green
Наталья МоскаленкоCEO Главный директор особо важных делНациональный фонд помощи общественным организациям помогающим национальным фондамПередача цвета в должность спикера
--speaker-item-company-color: blue
Наталья МоскаленкоCEO Главный директор особо важных делНациональный фонд помощи общественным организациям помогающим национальным фондамПередача всех параметров
:style="{ '--speaker-item-name-color': 'red', '--speaker-item-post-color': 'green', '--speaker-item-company-color': 'blue', }"
Наталья МоскаленкоCEO Главный директор особо важных делНациональный фонд помощи общественным организациям помогающим национальным фондамОткрытие бейджа при клике
:badge="true" компмонент бейджа в разработке
Наталья МоскаленкоCEO Главный директор особо важных делНациональный фонд помощи общественным организациям помогающим национальным фондам
# Props
Название | Тип | Обязательный | По умолчанию | Описание |
---|---|---|---|---|
src | string | + | - | Путь до изображения |
nameColor | string | - | - | Цвет поля «имя спикера» |
postColor | string | - | - | Цвет поля «имя должность» |
companyColor | string | - | - | Цвет поля «компания» |
badge | Boolean | - | - | Нужно ли открывать бейдж или нет (в разработке) |
# Слоты
Название | Описание |
---|---|
speaker-name | Текст имени спикера |
post | Текст должности спикера |
company | Текст компании спикера |
# Source Code - исходный код компонента
<template>
<div
class="speaker-item"
:class="{
'speaker-item_pointer': badge,
}"
:id="`speaker-item-${componentId}`"
@click.prevent="openBadge(speaker.id)"
>
<ZeenPicture
class="speaker-item__picture"
:src="src"
alt=""
aspect-ratio="1:1"
:style="{'--picture-border-radius': '50%'}"
/>
<div class="speaker-item__text-block" v-if="!onlyAvatar">
<div class="speaker-item__speaker-name">
<slot name="name" :speaker="speaker">
{{ speaker.name }}
</slot>
</div>
<div class="speaker-item__post">
<slot name="post" :speaker="speaker">
{{ speaker.position }}
</slot>
</div>
<div class="speaker-item__company">
<slot name="company" :speaker="speaker">
{{ speaker.company_name }}
</slot>
</div>
</div>
</div>
</template>
<script>
import ZeenPicture from '../ZeenPicture/ZeenPicture'
export default {
name: 'ZeenSpeakerItem',
components: {ZeenPicture},
props: {
speaker: {
type: Object,
require: true,
},
badge: {
type: Boolean,
default: false,
},
onlyAvatar: Boolean,
},
methods: {
openBadge(speaker) {
this.$vfm.show(speaker)
},
},
computed: {
src() {
return this.speaker?.picture
},
componentId() {
return this._uid
},
},
}
</script>
<style lang="scss">
@import '/src/styles/mixins.scss';
:root {
/* Размеры */
--speaker-item-name-size: var(--main-text-size, 16px);
--speaker-item-post-size: var(--main-smallest-text, 12px);
--speaker-item-company-size: var(--main-smallest-text, 12px);
--speaker-item-image-size: 50px;
/* Цвета */
--speaker-item-name-color: var(--main-text-color);
--speaker-item-name-hover-color: var(--main-color);
--speaker-item-post-color: var(--main-text-color);
--speaker-item-company-color: var(--main-text-color);
@include phones {
/* Размеры */
--speaker-item-image-size: 40px;
--speaker-item-name-size: var(--main-text-size, 14px);
--speaker-item-post-size: var(--main-smallest-text, 10px);
}
}
</style>
<style lang="scss" scoped>
@import '/src/styles/mixins.scss';
.speaker-item {
display: flex;
&_pointer {
cursor: pointer;
&:hover {
--speaker-item-name-color: var(--speaker-item-name-hover-color);
}
}
&__picture {
margin-right: 20px;
width: var(--speaker-item-image-size);
height: var(--speaker-item-image-size);
@include phones {
margin-right: 10px;
}
}
&__text-block {
overflow: hidden;
}
&__speaker-name {
font-size: var(--speaker-item-name-size);
color: var(--speaker-item-name-color);
font-weight: 600;
margin-top: 0;
margin-bottom: 5px;
line-height: 1.375;
transition-timing-function: ease-in-out;
transition-property: color;
transition-duration: 200ms;
@include phones {
margin-bottom: 5px;
}
}
&__post {
font-size: var(--speaker-item-post-size);
color: var(--speaker-item-post-color);
margin-top: 0;
margin-bottom: 3px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
line-height: 1.5;
}
&__company {
font-size: var(--speaker-item-company-size);
color: var(--speaker-item-company-color);
margin: 0;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
line-height: 1.5;
@include phones {
max-height: 54px;
}
}
}
</style>