# ZeenTextArea

Компонент textarea для форм

# Примеры:

  • TextArea:

  • Disabled

  • С ошибкой:

  • С текстом, что все верно:

  • С 2 строками

  • TextArea с кастомными цветами и текстом, что все верно:

# props

Название Тип Обязательный По умолчанию Описание
value string + то, что указано в data родителя
placeholder string - -
required boolean - false если true, то при инпуту добавится атрибут required
name string - -
error string - '' если значение truthy, то отобразится переданный текст и сменится цвет лейбла и бордера
correct string - '' если значение truthy, то отобразится переданный текст и сменится цвет лейбла и бордера
color object - {} объект с кастомными цветами (подробнее см.ниже)
rows number - 6 количество строк

Благодаря v-bind="$attrs" поддерживаются дополнительные атрибуты. В стиле textarea указано resize: none.

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

Обработка цветов осуществляется миксином InputColorMixin

Название Тип Обязательный По умолчанию
textColor цвет текста инпута - берет значение из темы ($input-text-color)
backgroundColor цвет фона инпута - берет значение из темы ($input-background-color)
borderFocusColor цвет бордера инпута при фокусе - берет значение из темы ($input-main-color)
errorColor цвет лейбла и бордера при truthy error - берет значение из темы ($input-error-color)
correctColor цвет лейбла и бордера при truthy correct - берет значение из темы ($input-correct-color)

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

<template>
  <div
    :id="`zeen-text-area-${componentId}`"
    class="zeen-text-area"
    :class="{
      'zeen-text-area_error': error,
      'zeen-text-area_correct': correct,
    }"
  >
    <label class="zeen-text-area__label" :for="componentId">{{ error || correct }}</label>
    <div class="zeen-text-area__wrapper">
      <textarea
        class="zeen-text-area__text-area"
        :value="value"
        :placeholder="placeholder"
        :required="required"
        :disabled="disabled"
        :name="name"
        :rows="rows"
        @input="onInput"
        v-bind="$attrs"
        :id="componentId"
      />
    </div>
  </div>
</template>

<script>
export default {
  name: 'ZeenTextArea',
  props: {
    value: {
      type: String,
      default: '',
    },
    placeholder: {
      type: String,
      required: false,
    },
    required: {
      type: Boolean,
      required: false,
    },
    disabled: {
      type: Boolean,
      required: false,
    },
    name: {
      type: String,
      required: false,
    },
    error: {
      type: String,
      default: '',
    },
    correct: {
      type: String,
      default: '',
    },
    rows: {
      type: [String, Number],
      default: 6,
    },
  },
  methods: {
    onInput(e) {
      this.$emit('input', e.target.value)
    },
  },
  computed: {
    componentId() {
      return this._uid
    },
  },
}
</script>

<style lang="scss">
:root {
  /* Размеры */
  --text-area-label-size: var(--main-input-label-size);
  --text-area-label-line-height: 1.4;
  --text-area-border-width: var(--main-input-border-width);
  --text-area-border-radius: var(--main-input-radius);
  --text-area-text-size: var(--main-size);
  --text-area-horizontal-padding: 15px;
  --text-area-vertical-padding: 20px;

  /* Цвета */
  --text-area-label-base-color: var(--input-main-placeholder-color);
  --text-area-label-error-color: var(--input-error-color);
  --text-area-label-correct-color: var(--input-correct-color);
  --text-area-border-base-focus-color: var(--input-main-color);
  --text-area-color: var(--input-main-value-color);
  --text-area-background: var(--input-background-color);

  --text-area-border-color: transparent;
  --text-area-border-error-color: var(--text-area-label-error-color);
  --text-area-border-correct-color: var(--text-area-label-correct-color);

  --text-area-placeholder-color: var(--input-main-placeholder-color);
  --text-area-placeholder-disable-color: var(--input-placeholder-disable-color);
}
</style>

<style lang="scss" scoped>
.zeen-text-area {
  --text-area-label-color: var(--text-area-label-base-color);
  --text-area-border-focus-color: var(--text-area-border-base-focus-color);

  &_error {
    --text-area-label-color: var(--text-area-label-error-color);
    --text-area-border-focus-color: var(--text-area-border-error-color);
    --text-area-border-color: var(--text-area-border-focus-color);
  }

  &_correct {
    --text-area-label-color: var(--text-area-label-correct-color);
    --text-area-border-focus-color: var(--text-area-border-correct-color);
    --text-area-border-color: var(--text-area-border-focus-color);
  }

  &__label {
    display: block;
    font-size: var(--text-area-label-size);
    line-height: var(--text-area-label-line-height);
    color: var(--text-area-label-color);
    margin: 0 0 var(--main-input-label-offset-bottom) var(--main-input-label-offset-left);
  }

  &__wrapper {
    position: relative;
  }

  &__text-area {
    width: 100%;
    box-sizing: border-box;
    border-radius: var(--text-area-border-radius);
    border: var(--text-area-border-width) solid var(--text-area-border-color);
    padding: var(--text-area-vertical-padding) var(--text-area-horizontal-padding);
    font-size: var(--text-area-text-size);
    line-height: 1.5;
    -webkit-appearance: none;
    outline: none;
    resize: none;
    font-family: inherit;
    color: var(--text-area-color);
    background: var(--text-area-background);

    &:focus {
      --text-area-border-color: var(--text-area-border-focus-color);
    }

    &:disabled {
      --text-area-border-color: transparent;

      &::placeholder {
        --text-area-placeholder-color: var(--text-area-placeholder-disable-color);
      }
    }

    &::placeholder {
      color: var(--text-area-placeholder-color);
    }
  }
}
</style>