import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/scripts/Classes/PropertiesTypes - Типы свойств'/>

# Класс PropertiesTypes

Класс `PropertiesTypes` является системным справочником и анализатором типов свойств в дизайн-системе. Его основная роль — определение категории свойства (переменная, селектор, состояние, медиа-запрос и др.) на основе специальных символов-префиксов или соглашений об именовании ключей.

## Список символов и типов

Система использует следующие соответствия символов типам:

- `$` — **var** (CSS-переменная)
- `::` — **virtual** (виртуальный элемент)
- `:` — **selector** (SCSS-селектор)
- `~` — **state** (состояние, например, :hover)
- `#` — **subclass** (подкласс)
- `@@` — **linkClass** (ссылка на класс)
- `@` — **link** (ссылка на токен)
- `&&` — **root** (SCSS @at-root)
- `&` — **scss** (SCSS-селектор)
- `--` — **none** (игнорируемое свойство)

## Инициализация

Класс содержит только статические методы и не требует создания экземпляра через `new`.

```typescript
import { PropertiesTypes } from '@dxtmisha/scripts'

// Использование статических методов
const type = PropertiesTypes.getTypeInName('$primary-color')
```

## Методы

### `isInType`
Проверяет, входит ли текущий тип свойства в список разрешенных типов. Используется для фильтрации свойств при генерации специфических блоков (например, только медиа-запросов).

**Параметры:**
- `type: PropertyItem['_type']` — проверяемый тип свойства.
- `name: PropertyType[]` — массив разрешенных типов.

**Возвращает:** `boolean` — `true`, если тип совпадает с одним из списка.

```typescript
const isMedia = PropertiesTypes.isInType(type, ['media', 'media-max']);
```

### `isTypeInName`
Определяет, содержит ли переданная строка названия (ключ) какой-либо из зарезервированных символов типа в начале.

**Параметры:**
- `name: string` — название ключа свойства.

**Возвращает:** `boolean` — `true`, если найден символ типа.

```typescript
const hasSymbol = PropertiesTypes.isTypeInName('$myVar');
// Результат: true
```

### `isMedia`
Специализированная проверка, определяющая, относится ли тип к медиа-запросам (`media` или `media-max`).

**Параметры:**
- `type: PropertyItem['_type']` — тип свойства.

**Возвращает:** `boolean` — `true`, если это медиа-тип.

```typescript
if (PropertiesTypes.isMedia(item.type)) { /* ... */ }
```

### `getTypeInName`
Основной метод для извлечения типа из названия ключа. Если в начале ключа найден спецсимвол, метод возвращает соответствующий ему тип. Если символ не найден, но в ключе есть разделитель `|`, часть перед разделителем преобразуется в kebab-case и возвращается как тип.

**Параметры:**
- `name: string` — название ключа свойства.

**Возвращает:** `PropertyItem['_type']` — найденный идентификатор типа или `null`.

```typescript
const type1 = PropertiesTypes.getTypeInName('$color'); // 'var'
const type2 = PropertiesTypes.getTypeInName('custom|value'); // 'custom'
```

### `getBySymbol`
Возвращает название типа, закрепленное за конкретным символом или строкой.

**Параметры:**
- `name: string` — символ (например, `$`).

**Возвращает:** `string | undefined` — название типа (например, `var`).

```typescript
const typeName = PropertiesTypes.getBySymbol('$'); // 'var'
```

## Операции

### Механизм распознавания через RegExp

Поиск символов в `PropertiesTypes` реализован через динамическое регулярное выражение, формируемое из ключей словаря `SYMBOLS`. Метод `getExpSymbols` создает выражение, которое:
1. Ищет зарезервированные символы в начале строки (например, `@`, `&&`, `~`).
2. Ищет пользовательские именованные типы перед вертикальной чертой (например, `media|...`).
3. Группирует результаты для удобного извлечения типа методом `getTypeInName`.

## Примеры

### Определение типа при парсинге токенов
```typescript
import { PropertiesTypes } from '@dxtmisha/scripts'

const keys = ['$primary', ':hover', '@link'];

keys.forEach(key => {
  console.log(`${key} is type: ${PropertiesTypes.getTypeInName(key)}`);
});
```
