# ZeenLeaderboard

Компонент ZeenLeaderboard

# Примеры:

Примеры использования блока ZeenLeaderboard

Топ 5

1
Иванов Иван
40
2
John Doe
35
3
Ольга
25
4
Ольга Малыгина
20
5
Ольга Малыгина
15

Таблица лидеров

5
Ольга Малыгина
15
1
Иванов Иван
40
2
John Doe
35
3
Ольга
25
4
Ольга Малыгина
20
5
Ольга Малыгина
15
10
Ольга
10

# props

Название Тип Обязательный По умолчанию Описание
leaderboard array [] массив со списком лидеров
leaderUser object {} объект с данными юзера-лидера(отображает место авторизованного юзера в списке лидеров), если его нет, то блок не отображается
theme string general тема, которая передается ZeenLeaderboardItem и отвечает за внешний вид. general - стандартный, top-list - тема лидеров в топ-5

# slots

Название Описание
title слот для заголовка

# Source Code - исходный код компонента

<template lang="pug">
  section.zeen-leaderboard
    ZeenContainer
      slot(name='title')
      slot(name='leader-user')
        .zeen-leaderboard__user(v-if='leaderUser')
          ZeenLeaderboardItem(:item='leaderUser' theme='leader-user')
            template(v-for='(slot, slotName) in userLeaderSlots' v-slot:[slotName]='params')
              slot(:name='`${userLeaderPrefix}${slotName}`' v-bind='params')
      .zeen-leaderboard__list(:class='classList')
        .zeen-leaderboard__item(v-for='leader in leaderboard')
          ZeenLeaderboardItem(:item='leader' :theme='theme')
            template(v-for='(slot, slotName) in leaderboardSlots' v-slot:[slotName]='params')
              slot(:name='`${leaderboardPrefix}${slotName}`' v-bind='params')
</template>

<script>
import ZeenLeaderboardItem from '../../components/ZeenLeaderboardItem/ZeenLeaderboardItem.vue'
import ZeenContainer from '../../components/ZeenContainer/ZeenContainer.vue'
import {createSlotsFor} from '../../helpers/createBlockData'
export default {
  name: 'ZeenLeaderboard',
  components: {
    ZeenLeaderboardItem,
    ZeenContainer,
  },
  props: {
    leaderboard: {
      type: Array,
      default: () => [],
    },
    leaderUser: {
      type: Object,
      default: () => {},
    },
    theme: {
      type: String,
      default: 'general',
      validator: (theme) => ['general', 'top-list'].includes(theme),
    },
  },
  computed: {
    leaderboardPrefix() {
      return 'leaderboard_'
    },
    leaderboardSlots() {
      return createSlotsFor(this, this.leaderboardPrefix)
    },
    userLeaderPrefix() {
      return 'user-leader_'
    },
    userLeaderSlots() {
      return createSlotsFor(this, this.userLeaderPrefix)
    },
    classList() {
      return {
        [`zeen-leaderboard_theme-${this.theme}`]: this.theme,
      }
    },
  },
}
</script>

<style lang="scss">
@import '../../styles/mixins.scss';

:root {
  --zeen-leaderboard-user-margin-bottom: 24px;
  --zeen-leaderboard-margin-vertical: -8px;
  --zeen-leaderboard-margin-horizontal: 0;
  --zeen-leaderboard-padding-vertical: 8px;
  --zeen-leaderboard-padding-horizontal: 0;
  --zeen-leaderboard-width: 100%;
  --zeen-leaderboard-top-width: 20%;
  --zeen-leaderboard-top-padding-vertical: 10px;
  --zeen-leaderboard-top-padding-horizontal: 10px;
  --zeen-leaderboard-top-margin-vertical: -10px;
  --zeen-leaderboard-top-margin-horizontal: -10px;

  @include desktop {
    --zeen-leaderboard-top-width: 33.33%;
  }

  @include phones {
    --zeen-leaderboard-width: 100%;
    --zeen-leaderboard-padding-vertical: 4px;
    --zeen-leaderboard-margin-vertical: -4px;
    --zeen-leaderboard-padding-horizontal: 0;
    --zeen-leaderboard-margin-horizontal: 0;
    --zeen-leaderboard-top-width: 100%;
    --zeen-leaderboard-top-width: 100%;
    --zeen-leaderboard-top-padding-vertical: 4px;
    --zeen-leaderboard-top-margin-vertical: -4px;
    --zeen-leaderboard-top-padding-horizontal: 0;
    --zeen-leaderboard-top-margin-horizontal: 0;
  }
}
</style>

<style lang="scss">
@import '../../styles/mixins.scss';

.zeen-leaderboard {
  &_theme {
    &-top-list {
      flex-direction: row;
      flex-wrap: wrap;
      margin: var(--zeen-leaderboard-top-margin-vertical) var(--zeen-leaderboard-top-margin-horizontal);

      & .zeen-leaderboard__item {
        width: var(--zeen-leaderboard-top-width);
        padding: var(--zeen-leaderboard-top-padding-vertical) var(--zeen-leaderboard-top-padding-horizontal);
      }
    }

    &-general {
      flex-direction: column;
    }
  }

  &__user {
    margin-bottom: var(--zeen-leaderboard-user-margin-bottom);
  }

  &__list {
    display: flex;
    margin: var(--zeen-leaderboard-margin-vertical) var(--zeen-leaderboard-margin-horizontal);
  }

  &__item {
    padding: var(--zeen-leaderboard-padding-vertical) var(--zeen-leaderboard-padding-horizontal);
    width: var(--zeen-leaderboard-width);
  }
}
</style>