# ZeenActionIcon

Компонент-обертка для иконок svg, который задает им размер

# Примеры:

  • Дефолтный размер small - ширина 10px

  • Размер middle - ширина 15px

  • Размер big - ширина 26px

  • Темы

    Default

    Dark

    Кастомные цвета в default теме

    Кастомные цвета в dark теме

# props

Название Тип Обязательный По умолчанию Описание
size string - small Размер отличается по ширине. Small - 10px, middle - 15px, big - 26px. Высота везде auto
theme string - default Тема default содержит основной цвет иконки в ховере и клике, а тема dark - темные цвета.
disabled boolean - - Если true, то кнопка становится disabled
color object - {} объект с кастомными цветами (подробнее см.ниже)

# Кастомные цвета в объекте color

Название Тип Обязательный По умолчанию
iconDefaultNormalColor основной цвет иконки в дефолтной теме - берет значение из темы ($icon-default-normal-color)
iconDefaultHoverColor цвет иконки при ховере в дефолтной теме - берет значение из темы ($icon-default-hover-color)
iconDefaultClickColor цвет для состояний focus и active в дефолтной теме - берет значение из темы ($icon-default-click-color)
iconDarkNormalColor основной цвет иконки в темной теме - берет значение из темы ($icon-dark-normal-color)
iconDarkHoverColor цвет иконки при ховере в темной теме - берет значение из темы ($icon-dark-hover-color)
iconDarkClickColor цвет для состояний focus и active в темной теме - берет значение из темы ($icon-dark-click-color)
iconDisabledColor цвет для состояния disabled, общий на обе темы - берет значение из темы ($icon-disabled-color)

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

<template>
  <button
    class="zeen-action-icon"
    :class="{
      'zeen-action-icon_middle': size === 'middle',
      'zeen-action-icon_big': size === 'big',
      [`zeen-action-icon_theme-${theme}`]: theme,
    }"
    :id="`zeen-action-icon-${componentId}`"
    v-on="$listeners"
    v-bind="$attrs"
    :disabled="disabled"
  >
    <slot></slot>
  </button>
</template>

<script>
export default {
  name: 'ZeenActionIcon',
  props: {
    size: {
      type: String,
      default: 'small',
      validator: (size) => ['small', 'middle', 'big'].includes(size),
    },
    theme: {
      type: String,
      default: 'default',
      validator: (theme) => ['default', 'dark', 'button'].includes(theme),
    },
    disabled: {
      type: Boolean,
      required: false,
    },
  },
  computed: {
    componentId() {
      return this._uid
    },
  },
}
</script>

<style lang="scss">
:root {
  /* Размеры */
  --action-icon-width: 12px;
  --action-icon-min-width-middle: 15px;
  --action-icon-min-width-large: 26px;
  --action-icon-button-size: 40px;
  --action-icon-button-radius: 50%;

  /* Цвета */
  --action-icon-color: var(--main-color);
  --action-icon-hover-color: var(--main-hover-color);
  --action-icon-focus-color: var(--main-hover-color);
  --action-icon-active-color: var(--main-active-color);
  --action-icon-disable-color: var(--main-disable-text-color);

  --action-icon-dark-color: var(--gray-1);
  --action-icon-dark-hover-color: var(--gray-2);
  --action-icon-dark-focus-color: var(--gray-2);
  --action-icon-dark-active-color: var(--gray-1);
  --action-icon-dark-disable-color: var(--gray-1);

  --action-icon-button-color: #f6f5f7;
  --action-icon-button-shadow: 0px 2px 7px rgba(116, 111, 135, 0.11);
}
</style>

<style lang="scss" scoped>
.zeen-action-icon {
  --action-icon-color-real: var(--action-icon-color);
  background-color: transparent;
  padding: 0;
  outline: none;
  border: 0;
  display: inline-flex;
  cursor: pointer;
  color: var(--action-icon-color-real);

  &:hover {
    --action-icon-color-real: var(--action-icon-hover-color);
  }

  &:focus {
    --action-icon-color-real: var(--action-icon-focus-color);
  }

  &:active {
    --action-icon-color-real: var(--action-icon-active-color);
  }

  &:disabled {
    cursor: auto;
    --action-icon-color-real: var(--action-icon-disable-color);
  }

  &_theme-dark {
    --action-icon-color-real: var(--action-icon-dark-color);
    &:hover {
      --action-icon-color-real: var(--action-icon-dark-hover-color);
    }
    &:focus {
      --action-icon-color-real: var(--action-icon-dark-focus-color);
    }
    &:active {
      --action-icon-color-real: var(--action-icon-dark-active-color);
    }
    &:disabled {
      --action-icon-color-real: var(--action-icon-dark-disable-color);
    }
  }

  svg {
    width: var(--action-icon-width);
    height: auto;
    fill: currentColor;
  }

  &_middle {
    svg {
      min-width: var(--action-icon-min-width-middle);
    }
  }

  &_big {
    svg {
      min-width: var(--action-icon-min-width-large);
    }
  }

  &_theme-button {
    display: flex;
    align-items: center;
    justify-content: center;
    width: var(--action-icon-button-size);
    height: var(--action-icon-button-size);
    background: var(--action-icon-button-color);
    box-shadow: var(--action-icon-button-shadow);
    border-radius: var(--action-icon-button-radius);
  }
}
</style>