## Специальные символы

Свойство `special` определяет специальные символы для обозначения мест пользовательского ввода в маске и настройку их расширенного поведения.

**Возможные значения:**

- `string` — одиночный специальный символ (по умолчанию `'*'`)
- `string[]` — массив специальных символов для разных типов групп
- `MaskSpecialList` — объект с расширенной конфигурацией каждого символа

Специальные символы в шаблоне маски обозначают позиции, где пользователь может вводить данные, в отличие от литеральных символов, которые вставляются автоматически.

При использовании простой строки (например, `special="*"`) все места ввода в маске ограничиваются одинаковыми правилами валидации.

Массив символов (например, `special="['*', 'A', '#']"`) позволяет создавать разные типы групп с индивидуальными ограничениями: одна группа для цифр, другая для букв, третья для специальных символов.

Объектная нотация `MaskSpecialList` (см. [детальное описание ниже](#maskspeciallist)) предоставляет максимальную гибкость. Каждый специальный символ настраивается отдельно с возможностью задать значения по умолчанию, резиновые группы переменной длины, символы автоперехода и кастомную валидацию.

Для встроенных типов (`currency`, `number`, `date`, `time`) система автоматически генерирует специальные символы с учётом региональных настроек, игнорируя пользовательское значение `special`.

```html
<!-- Простой специальный символ -->
<Mask mask="***-***" special="*" />

<!-- Несколько типов групп -->
<Mask mask="AA*-###" :special="['A', '*', '#']" />

<!-- Расширенная конфигурация -->
<Mask
  mask="***-***"
  :special="{
    '*': {
      pattern: '\\d',
      view: '_',
      rubber: true,
      minLength: 2,
      maxLength: 8,
      transitionChar: ' '
    }
  }"
/>

<!-- Группы с значениями по умолчанию -->
<Mask
  mask="DD/MM/YYYY"
  :special="{
    'D': { defaultValue: '01', pattern: '\\d' },
    'M': { defaultValue: '01', pattern: '\\d' },
    'Y': { defaultValue: '2024', pattern: '\\d' }
  }"
/>
```

## MaskSpecialList

`MaskSpecialList` — объект расширенной конфигурации специальных символов маски, где каждый ключ соответствует специальному символу в шаблоне.

### Структура типа

```typescript
type MaskSpecialList = Record<string, MaskSpecialItem>

interface MaskSpecialItem {
  /** Значение по умолчанию для группы */
  defaultValue?: string

  /** Включает режим переменной длины (резиновая группа) */
  rubber?: boolean

  /** Символы автоматического перехода к следующей группе */
  transitionChar?: string | string[]

  /** Минимальная длина для резиновой группы */
  minLength?: number

  /** Максимальная длина для резиновой группы */
  maxLength?: number

  /** Регулярное выражение для валидации символов */
  match?: RegExp | string

  /** Паттерн валидации группы */
  pattern?: FieldPatternItemOrFunction

  /** Отображаемый символ placeholder */
  view?: string
}
```

### Свойства

#### `defaultValue`

Строка с начальным значением для группы. Автоматически подставляется при инициализации или когда пользователь не ввёл данные.

#### `rubber`

Логическое значение, включающее режим резиновой группы с переменной длиной. Позволяет пользователю вводить от `minLength` до `maxLength` символов в одной группе.

#### `transitionChar`

Символ или массив символов, при вводе которых резиновая группа завершается и курсор переходит к следующей части маски. Работает только для резиновых групп (`rubber: true`).

#### `minLength`

Минимальное количество символов для резиновой группы. Работает только при `rubber: true`.

#### `maxLength`

Максимальное количество символов для резиновой группы. Работает только при `rubber: true`.

#### `match`

Регулярное выражение или строка для валидации вводимых символов в группе.

#### `pattern`

Регулярное выражение или строка для валидации символов в текущей группе при вводе. Также может быть функцией, которая динамически возвращает паттерн на основе данных маски.

**Тип:**

```typescript
type FieldPatternItemOrFunction = FieldPatternItem | ((item: FieldMasks) => FieldPatternItem)
type FieldPatternItem = string | Partial<HTMLInputElement>
```

Где `FieldMasks` — объект с информацией о всех группах маски, каждая из которых содержит:
- `group` — ключ группы
- `value` — накопленное значение группы
- `maxLength` — максимальная длина фрагмента
- `full` — флаг заполненности фрагмента
- `end` — флаг конца ввода
- `chars` — массив символов значения

#### `view`

Символ, отображаемый в качестве placeholder для незаполненных позиций группы.

### Пример использования

```html
<script setup>
import { ref } from 'vue'

const phoneCode = ref('')
const productCode = ref('')
const dateValue = ref('')
</script>

<template>
  <!-- Телефонный код переменной длины с автозавершением -->
  <Mask
    v-model="phoneCode"
    mask="+* (***) *** ** **"
    :special="{
      '*': {
        rubber: true,
        minLength: 1,
        maxLength: 3,
        pattern: '\\d',
        transitionChar: ' '
      }
    }"
  />

  <!-- Код товара переменной длины -->
  <Mask
    v-model="productCode"
    mask="PRD-***"
    :special="{
      '*': {
        rubber: true,
        minLength: 4,
        maxLength: 10,
        match: /[A-Z0-9]/,
        view: '_'
      }
    }"
  />

  <!-- Дата с значениями по умолчанию -->
  <Mask
    v-model="dateValue"
    mask="DD/MM/YYYY"
    :special="{
      'D': {
        defaultValue: '01',
        pattern: '\\d',
        view: '0'
      },
      'M': {
        defaultValue: '01',
        pattern: '\\d',
        view: '0'
      },
      'Y': {
        defaultValue: '2024',
        pattern: '\\d',
        view: '0'
      }
    }"
  />
</template>
```
