@sberbusiness/triplex-next-mcp-server 0.24.0-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -0
- package/bundle/.gitkeep +0 -0
- package/bundle/components/AbstractTree.md +198 -0
- package/bundle/components/AccordionBase.md +227 -0
- package/bundle/components/Alert.md +317 -0
- package/bundle/components/Amount.md +225 -0
- package/bundle/components/AmountField.md +289 -0
- package/bundle/components/Avatar.md +209 -0
- package/bundle/components/Badge.md +277 -0
- package/bundle/components/Body.md +167 -0
- package/bundle/components/Button.md +230 -0
- package/bundle/components/ButtonDropdown.md +159 -0
- package/bundle/components/ButtonIcon.md +122 -0
- package/bundle/components/Calendar.md +445 -0
- package/bundle/components/Card.md +374 -0
- package/bundle/components/CarouselExtended.md +250 -0
- package/bundle/components/Checkbox.md +126 -0
- package/bundle/components/CheckboxTree.md +280 -0
- package/bundle/components/CheckboxTreeExtended.md +321 -0
- package/bundle/components/CheckboxXGroup.md +68 -0
- package/bundle/components/CheckboxYGroup.md +67 -0
- package/bundle/components/Chip.md +404 -0
- package/bundle/components/ChipGroup.md +179 -0
- package/bundle/components/Col.md +221 -0
- package/bundle/components/CollapsableTree.md +255 -0
- package/bundle/components/Confirm.md +343 -0
- package/bundle/components/DateField.md +371 -0
- package/bundle/components/DatePickerExtended.md +342 -0
- package/bundle/components/DateRange.md +275 -0
- package/bundle/components/DesignTokens.md +385 -0
- package/bundle/components/Divider.md +196 -0
- package/bundle/components/DocumentNumberEdit.md +280 -0
- package/bundle/components/Dropdown.md +433 -0
- package/bundle/components/Ellipsis.md +208 -0
- package/bundle/components/EmptyView.md +99 -0
- package/bundle/components/ExpandAnimation.md +281 -0
- package/bundle/components/Footer.md +339 -0
- package/bundle/components/FormField.md +326 -0
- package/bundle/components/FormGroup.md +99 -0
- package/bundle/components/Gap.md +113 -0
- package/bundle/components/Header.md +280 -0
- package/bundle/components/HelpBox.md +154 -0
- package/bundle/components/IconWrapper.md +145 -0
- package/bundle/components/Island.md +197 -0
- package/bundle/components/IslandAccordion.md +230 -0
- package/bundle/components/IslandWidget.md +233 -0
- package/bundle/components/KeyDownListener.md +157 -0
- package/bundle/components/LightBox.md +322 -0
- package/bundle/components/Link.md +161 -0
- package/bundle/components/List.md +247 -0
- package/bundle/components/ListMaster.md +204 -0
- package/bundle/components/Loader.md +161 -0
- package/bundle/components/LoaderScreen.md +134 -0
- package/bundle/components/Marker.md +127 -0
- package/bundle/components/MarkerStatus.md +148 -0
- package/bundle/components/MediaWidth.md +169 -0
- package/bundle/components/MobileView.md +120 -0
- package/bundle/components/ModalWindow.md +308 -0
- package/bundle/components/MonthYearField.md +168 -0
- package/bundle/components/MultiselectField.md +213 -0
- package/bundle/components/Notification.md +233 -0
- package/bundle/components/NumberField.md +178 -0
- package/bundle/components/OrderedList.md +169 -0
- package/bundle/components/Overlay.md +237 -0
- package/bundle/components/Page.md +246 -0
- package/bundle/components/Pagination.md +298 -0
- package/bundle/components/Portal.md +119 -0
- package/bundle/components/Radio.md +174 -0
- package/bundle/components/Row.md +125 -0
- package/bundle/components/SMSField.md +160 -0
- package/bundle/components/SegmentedControl.md +235 -0
- package/bundle/components/SelectExtendedField.md +322 -0
- package/bundle/components/SelectField.md +213 -0
- package/bundle/components/Skeleton.md +129 -0
- package/bundle/components/Slider.md +157 -0
- package/bundle/components/SliderExtended.md +210 -0
- package/bundle/components/SliderRange.md +160 -0
- package/bundle/components/SmallInput.md +101 -0
- package/bundle/components/Spoiler.md +121 -0
- package/bundle/components/StatusTracker.md +151 -0
- package/bundle/components/Step.md +121 -0
- package/bundle/components/Stepper.md +163 -0
- package/bundle/components/Suggest.md +160 -0
- package/bundle/components/SuggestField.md +157 -0
- package/bundle/components/SwipeableArea.md +144 -0
- package/bundle/components/Table.md +199 -0
- package/bundle/components/Tabs.md +152 -0
- package/bundle/components/TabsExtended.md +273 -0
- package/bundle/components/TabsLine.md +189 -0
- package/bundle/components/Tag.md +135 -0
- package/bundle/components/TagColor.md +121 -0
- package/bundle/components/TagGroup.md +100 -0
- package/bundle/components/TextField.md +152 -0
- package/bundle/components/TextareaField.md +124 -0
- package/bundle/components/ThemeProvider.md +181 -0
- package/bundle/components/Tooltip.md +254 -0
- package/bundle/components/TopOverlay.md +145 -0
- package/bundle/components/TreeView.md +224 -0
- package/bundle/components/Triggers.md +121 -0
- package/bundle/guides/codestyle.md +205 -0
- package/bundle/guides/commits.md +166 -0
- package/bundle/guides/context.md +277 -0
- package/bundle/guides/stories.md +618 -0
- package/bundle/guides/template.md +154 -0
- package/bundle/guides/tests.md +301 -0
- package/bundle/icons.json +4156 -0
- package/bundle/manifest.json +796 -0
- package/bundle/release-notes/1.1.0.mdx +26 -0
- package/bundle/release-notes/1.1.1.mdx +14 -0
- package/bundle/release-notes/1.10.0.mdx +43 -0
- package/bundle/release-notes/1.11.0.mdx +19 -0
- package/bundle/release-notes/1.12.0.mdx +21 -0
- package/bundle/release-notes/1.13.0.mdx +43 -0
- package/bundle/release-notes/1.14.0.mdx +29 -0
- package/bundle/release-notes/1.15.0.mdx +56 -0
- package/bundle/release-notes/1.16.0.mdx +55 -0
- package/bundle/release-notes/1.17.0.mdx +15 -0
- package/bundle/release-notes/1.18.0.mdx +24 -0
- package/bundle/release-notes/1.19.0.mdx +48 -0
- package/bundle/release-notes/1.19.1.mdx +9 -0
- package/bundle/release-notes/1.2.0.mdx +80 -0
- package/bundle/release-notes/1.20.0.mdx +48 -0
- package/bundle/release-notes/1.21.0.mdx +66 -0
- package/bundle/release-notes/1.22.0.mdx +75 -0
- package/bundle/release-notes/1.23.0.mdx +50 -0
- package/bundle/release-notes/1.24.0.mdx +59 -0
- package/bundle/release-notes/1.25.0.mdx +52 -0
- package/bundle/release-notes/1.26.0.mdx +11 -0
- package/bundle/release-notes/1.3.0.mdx +21 -0
- package/bundle/release-notes/1.4.0.mdx +37 -0
- package/bundle/release-notes/1.5.0.mdx +24 -0
- package/bundle/release-notes/1.6.0.mdx +37 -0
- package/bundle/release-notes/1.6.1.mdx +11 -0
- package/bundle/release-notes/1.7.0.mdx +29 -0
- package/bundle/release-notes/1.8.0.mdx +38 -0
- package/bundle/release-notes/1.9.0.mdx +28 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +324 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: Tag
|
|
3
|
+
category: Data Display
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [TagColor, TagGroup, ButtonIcon]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: stories/Tag/Tag.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Tag
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Тег для отображения выбранного значения параметра (фильтра/категории).
|
|
17
|
+
Структура: `<span>` с `Text` контентом + опциональная кнопка редактирования
|
|
18
|
+
(`ButtonIcon` с edit-иконкой) + всегда кнопка удаления (`ButtonIcon` с
|
|
19
|
+
cross-иконкой). Иконки масштабируются по `size` (16/20/24).
|
|
20
|
+
|
|
21
|
+
Используй когда: нужно показать выбранное значение со встроенной возможностью
|
|
22
|
+
удалить или редактировать. Для цветной маркировки (categorical labels) —
|
|
23
|
+
`TagColor`. Для управления коллекцией тегов — `TagGroup`.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Файловая структура
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
src/components/Tag/
|
|
31
|
+
├── Tag.tsx # forwardRef<HTMLSpanElement, ITagProps>
|
|
32
|
+
├── types.ts # ITagProps
|
|
33
|
+
├── styles/Tag.module.less
|
|
34
|
+
├── __tests__/
|
|
35
|
+
└── index.ts
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Публичный API
|
|
41
|
+
|
|
42
|
+
### `ITagProps`
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
extends HTMLAttributes<HTMLSpanElement>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| Prop | Тип | Default | Описание |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| `id` | `string` | — | Уникальный id; передаётся в `onEdit(id)` / `onRemove(id)`. |
|
|
51
|
+
| `size` | `EComponentSize` | — | **Обязателен** (нет default'а). Маппится на размер иконки и текста. |
|
|
52
|
+
| `disabled?` | `boolean` | — | Disabled-состояние; влияет на цвет текста (`EFontType.DISABLED`) и `disabled` обеих кнопок. |
|
|
53
|
+
| `onEdit?` | `(id: string) => void` | — | Если передан — рендерится edit-кнопка. |
|
|
54
|
+
| `onRemove?` | `(id: string) => void` | — | Колбэк удаления; **remove-кнопка рендерится всегда**. |
|
|
55
|
+
| `editButtonProps?` | `IButtonIconProps` | — | HTML/aria-атрибуты для edit-кнопки (объединяется с `onClick`). |
|
|
56
|
+
| `removeButtonProps?` | `IButtonIconProps` | — | HTML/aria-атрибуты для remove-кнопки. |
|
|
57
|
+
| `children` | `ReactNode` | — | Содержимое (текст тега). |
|
|
58
|
+
| `...HTMLAttributes<HTMLSpanElement>` | — | — | На корневой `<span>`. |
|
|
59
|
+
|
|
60
|
+
### Размер → иконка/текст
|
|
61
|
+
|
|
62
|
+
| `size` | Edit/Remove иконка | Text size |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| `SM` | `*StrokeSrvIcon16` | `B4` |
|
|
65
|
+
| `MD` | `*StrokeSrvIcon20` | `B3` |
|
|
66
|
+
| `LG` | `*StrokeSrvIcon24` | `B2` |
|
|
67
|
+
|
|
68
|
+
Иконки — `paletteIndex={5}` (приглушённая палитра).
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Поведение
|
|
73
|
+
|
|
74
|
+
### Edit-кнопка
|
|
75
|
+
|
|
76
|
+
- Рендерится **только** если передан `onEdit`.
|
|
77
|
+
- `onClick` объединяет `onEdit(id)` + `editButtonProps.onClick(event)`.
|
|
78
|
+
|
|
79
|
+
### Remove-кнопка
|
|
80
|
+
|
|
81
|
+
- Рендерится **всегда** (даже без `onRemove`).
|
|
82
|
+
- `onClick` вызывает `onRemove?.(id)` (опционально) + `removeButtonProps.onClick(event)`.
|
|
83
|
+
- Если `onRemove` не передан — кнопка остаётся видимой, но клик ничего не делает (кроме `removeButtonProps.onClick`).
|
|
84
|
+
|
|
85
|
+
### Disabled
|
|
86
|
+
|
|
87
|
+
- `Text type = DISABLED`.
|
|
88
|
+
- `ButtonIcon disabled` — обе кнопки.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Инварианты
|
|
93
|
+
|
|
94
|
+
- **`forwardRef<HTMLSpanElement>`** — не убирать.
|
|
95
|
+
- **`size` обязателен** — нет default'а; передавать всегда.
|
|
96
|
+
- **Remove-кнопка всегда в DOM** — даже без `onRemove`. Если нужно скрыть — `display:none` через `removeButtonProps.style` (или собственная обёртка); поведение `Tag` это не поддерживает напрямую.
|
|
97
|
+
- **`onEdit` определяет видимость edit-кнопки** — единственный механизм. `editButtonProps` без `onEdit` не отрендерит кнопку.
|
|
98
|
+
- **`id` прокидывается ТОЛЬКО в колбэки** (`onEdit`/`onRemove`), не в DOM. Если нужен HTML id — через `restProps`.
|
|
99
|
+
- **Иконки `paletteIndex={5}`** — намеренно. Менять только координированно с дизайн-системой.
|
|
100
|
+
- **`Text` size маппится через `sizeToTextSizeMap`**, иконки — через `sizeTo{Edit,Remove}IconMap`. Все три должны обновляться синхронно при добавлении нового размера.
|
|
101
|
+
- **Корень — `<span>`**, не `<div>` — чтобы тег был inline-friendly.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Accessibility
|
|
106
|
+
|
|
107
|
+
- Корневой `<span>` без явной ARIA-роли — потребитель должен задать смысл через `aria-label` или родительский контекст (`TagGroup`).
|
|
108
|
+
- Edit/Remove кнопки — `<button>` через `ButtonIcon`; добавлять `aria-label` через `editButtonProps`/`removeButtonProps` (например, `aria-label="Удалить тег Москва"`).
|
|
109
|
+
- `disabled` отключает кнопки (`aria-disabled` + `disabled` атрибут от `ButtonIcon`).
|
|
110
|
+
- Иконки декоративные — содержание описывается через `aria-label` кнопки.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Связанные компоненты
|
|
115
|
+
|
|
116
|
+
- `TagColor` — категориальные цветные теги (без edit/remove).
|
|
117
|
+
- `TagGroup` — контейнер для коллекции тегов (с overflow).
|
|
118
|
+
- `ButtonIcon` — кнопки edit/remove.
|
|
119
|
+
- `Typography.Text` — текст внутри.
|
|
120
|
+
- `@sberbusiness/icons-next` — `EditStrokeSrvIcon{16,20,24}`, `CrossStrokeSrvIcon{16,20,24}`.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Stories
|
|
125
|
+
|
|
126
|
+
Основные истории: `stories/Tag/Tag.stories.tsx`
|
|
127
|
+
Примеры: `stories/Tag/examples/`
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## История изменений
|
|
132
|
+
|
|
133
|
+
| Дата | Изменение |
|
|
134
|
+
|---|---|
|
|
135
|
+
| 2026-04-18 | Создан документ |
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: TagColor
|
|
3
|
+
category: Data Display
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [Tag, TagGroup]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: stories/TagColor/TagColor.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# TagColor
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Цветной маркировочный тег: `<span>` с фоном/обводкой по статусу
|
|
17
|
+
(`DEFAULT`/`SUCCESS`/`INFO`/`WARNING`/`ERROR`). Без интерактивности —
|
|
18
|
+
только визуальная классификация (категории, статусы операций, лейблы).
|
|
19
|
+
|
|
20
|
+
Используй когда: нужно подсветить состояние/категорию (например, статус
|
|
21
|
+
заявки, тип сообщения). Для интерактивного тега с кнопками edit/remove —
|
|
22
|
+
`Tag`.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Файловая структура
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
src/components/TagColor/
|
|
30
|
+
├── TagColor.tsx # forwardRef<HTMLSpanElement, ITagColorProps>
|
|
31
|
+
├── enums.ts # ETagColorStatus
|
|
32
|
+
├── types.ts # ITagColorProps
|
|
33
|
+
├── styles/TagColor.module.less
|
|
34
|
+
├── __tests__/
|
|
35
|
+
└── index.ts
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Публичный API
|
|
41
|
+
|
|
42
|
+
### `ITagColorProps`
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
extends HTMLAttributes<HTMLSpanElement>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| Prop | Тип | Default | Описание |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| `size` | `EComponentSize` | — | **Обязателен** — нет default'а. Маппится в CSS-класс через `createSizeToClassNameMap`. |
|
|
51
|
+
| `status?` | `ETagColorStatus` | `DEFAULT` | Цветовой статус. |
|
|
52
|
+
| `children` | `ReactNode` | — | Содержимое (текст). Оборачивается в `<span class="content">`. |
|
|
53
|
+
| `...HTMLAttributes<HTMLSpanElement>` | — | — | На корневой `<span>`. |
|
|
54
|
+
|
|
55
|
+
### `ETagColorStatus`
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
enum ETagColorStatus {
|
|
59
|
+
DEFAULT = "default",
|
|
60
|
+
SUCCESS = "success",
|
|
61
|
+
INFO = "info",
|
|
62
|
+
WARNING = "warning",
|
|
63
|
+
ERROR = "error",
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Маппинг в CSS-классы — `STATUS_TO_CLASS_NAME_MAP` внутри компонента.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Структура DOM
|
|
72
|
+
|
|
73
|
+
```html
|
|
74
|
+
<span class="tagColor {size} {status} {className}">
|
|
75
|
+
<span class="content">{children}</span>
|
|
76
|
+
</span>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Внешний `<span>` несёт фон/обводку, внутренний — паддинги контента
|
|
80
|
+
(вынесено для управления line-height независимо от рамки).
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Инварианты
|
|
85
|
+
|
|
86
|
+
- **`forwardRef<HTMLSpanElement>`** — не убирать.
|
|
87
|
+
- **`size` обязателен** (нет default'а в типе и в компоненте).
|
|
88
|
+
- **`status` default = `DEFAULT`** — допускается опускать.
|
|
89
|
+
- **Корень — `<span>`**, inline-friendly.
|
|
90
|
+
- **Двойной `<span>` обязателен** — внутренний `.content` нужен для корректного отображения паддингов вместе с фоном внешнего span'а; не сокращать.
|
|
91
|
+
- **`ETagColorStatus` экспортируется** — часть публичного API; не переименовывать значения.
|
|
92
|
+
- **Нет интерактивности** — никаких кнопок, hover-эффектов, click-handler'ов в реализации. Если нужна интерактивность — оборачивать снаружи (но обычно это означает, что нужен `Tag`, а не `TagColor`).
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Accessibility
|
|
97
|
+
|
|
98
|
+
- Нет специальной ARIA — это визуальный маркер.
|
|
99
|
+
- Цвет статуса **не должен** быть единственным носителем смысла. Текст внутри (`children`) — основной канал для screen-reader.
|
|
100
|
+
- При необходимости потребитель может добавить `role="status"` или `aria-label` через restProps.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Связанные компоненты
|
|
105
|
+
|
|
106
|
+
- `Tag` — тег с edit/remove кнопками.
|
|
107
|
+
- `TagGroup` — контейнер для коллекции тегов с overflow.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Stories
|
|
112
|
+
|
|
113
|
+
Основные истории: `stories/TagColor/TagColor.stories.tsx`
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## История изменений
|
|
118
|
+
|
|
119
|
+
| Дата | Изменение |
|
|
120
|
+
|---|---|
|
|
121
|
+
| 2026-04-18 | Создан документ |
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: TagGroup
|
|
3
|
+
category: Data Display
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [Tag, TagColor]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: stories/TagGroup/TagGroup.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# TagGroup
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Контейнер для коллекции `Tag` / `TagColor`: задаёт общий
|
|
17
|
+
горизонтальный/вертикальный gap по `size` и `role="group"`. Не управляет
|
|
18
|
+
overflow или выбором — чистая разметка.
|
|
19
|
+
|
|
20
|
+
Используй когда: нужно сгруппировать несколько тегов с одинаковым размером
|
|
21
|
+
и стандартным отступом. Сами теги передаются как children — потребитель
|
|
22
|
+
решает, что внутри (`Tag`, `TagColor`, миксы).
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Файловая структура
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
src/components/TagGroup/
|
|
30
|
+
├── TagGroup.tsx # forwardRef<HTMLDivElement, ITagGroupProps>
|
|
31
|
+
├── types.ts # ITagGroupProps
|
|
32
|
+
├── styles/TagGroup.module.less
|
|
33
|
+
├── __tests__/
|
|
34
|
+
└── index.ts
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Публичный API
|
|
40
|
+
|
|
41
|
+
### `ITagGroupProps`
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
extends HTMLAttributes<HTMLDivElement>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
| Prop | Тип | Default | Описание |
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
| `size` | `EComponentSize` | — | **Обязателен**. Маппится на класс gap'а через `createSizeToClassNameMap`. |
|
|
50
|
+
| `children` | `ReactNode` | — | Теги внутри. Размер тегов **не** прокидывается автоматически — выставлять у каждого `Tag`/`TagColor` отдельно. |
|
|
51
|
+
| `...HTMLAttributes<HTMLDivElement>` | — | — | На корневой div (role=group). |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Структура DOM
|
|
56
|
+
|
|
57
|
+
```html
|
|
58
|
+
<div class="tagGroup {size} {className}" role="group">
|
|
59
|
+
{children}
|
|
60
|
+
</div>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Инварианты
|
|
66
|
+
|
|
67
|
+
- **`forwardRef<HTMLDivElement>`** — не убирать.
|
|
68
|
+
- **`size` обязателен**, без default'а — потребитель указывает явно.
|
|
69
|
+
- **`size` НЕ прокидывается в children** — каждый `Tag`/`TagColor` принимает свой `size` независимо. `TagGroup.size` влияет только на gap между ними.
|
|
70
|
+
- **`role="group"`** — фиксированно. Не переопределять без причины.
|
|
71
|
+
- **Корень — `<div>`** (в отличие от `Tag`/`TagColor`, которые `<span>`).
|
|
72
|
+
- **Нет overflow-логики** — все теги рендерятся inline; перенос строк регулируется CSS (`flex-wrap` в LESS).
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Accessibility
|
|
77
|
+
|
|
78
|
+
- `role="group"` — семантическая группа; рекомендуется добавить `aria-label` или `aria-labelledby` через restProps для описания назначения группы (например, "Активные фильтры").
|
|
79
|
+
- Каждый тег внутри отвечает за свою ARIA сам.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Связанные компоненты
|
|
84
|
+
|
|
85
|
+
- `Tag` — интерактивные теги (edit/remove).
|
|
86
|
+
- `TagColor` — цветные маркеры.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Stories
|
|
91
|
+
|
|
92
|
+
Основные истории: `stories/TagGroup/TagGroup.stories.tsx`
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## История изменений
|
|
97
|
+
|
|
98
|
+
| Дата | Изменение |
|
|
99
|
+
|---|---|
|
|
100
|
+
| 2026-04-18 | Создан документ |
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: TextField
|
|
3
|
+
category: Form Controls
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [TextareaField, MaskedField, AmountField, FormField, TextFieldBase]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: stories/TextFields/TextField.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# TextField
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Однострочное текстовое поле: тонкая обёртка над `TextFieldBase`,
|
|
17
|
+
вставляющая `FormFieldInput` (`<input type="text">`). Также в этом
|
|
18
|
+
бандле — `MaskedField` (с `FormFieldMaskedInput`), идентичная по
|
|
19
|
+
структуре. Компактное представление поля поверх `FormGroup` + `FormField`.
|
|
20
|
+
|
|
21
|
+
Используй когда: нужен стандартный однострочный ввод с label/description/
|
|
22
|
+
prefix/postfix/counter. Для многострочного — `TextareaField`. С маской —
|
|
23
|
+
`MaskedField`. Для сумм — `AmountField`.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Файловая структура
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
src/components/TextField/
|
|
31
|
+
├── TextField.tsx # FC<ITextFieldProps>; TextFieldBase + FormFieldInput
|
|
32
|
+
├── MaskedField.tsx # FC<IMaskedFieldProps>; TextFieldBase + FormFieldMaskedInput
|
|
33
|
+
├── TextFieldBase.tsx # forwardRef<HTMLDivElement, ITextFieldBaseProps>; общая структура
|
|
34
|
+
└── index.ts # export TextField, MaskedField
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Публичный API
|
|
40
|
+
|
|
41
|
+
### `ITextFieldProps`
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
extends Omit<ITextFieldBaseProps, "children">
|
|
45
|
+
{
|
|
46
|
+
inputProps: IFormFieldInputProps & { ref?: RefObject<HTMLInputElement> };
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
| Prop | Тип | Описание |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `inputProps` | `IFormFieldInputProps & { ref? }` | **Обязателен**. Прокидывается на `FormFieldInput`. Может содержать `ref` на `<input>`. |
|
|
53
|
+
| `label?` | `ReactNode` | Лейбл (плавающий). |
|
|
54
|
+
| `description?` | `ReactNode` | Описание / текст ошибки. |
|
|
55
|
+
| `counter?` | `ReactNode` | Счётчик символов (внутри description). |
|
|
56
|
+
| `prefix?` / `postfix?` | `ReactNode` | Префикс/постфикс (иконка, кнопка, текст). |
|
|
57
|
+
| `...IFormFieldProps` | — | size, status, disabled, focused, error и т.д. от `FormField`. |
|
|
58
|
+
|
|
59
|
+
### `IMaskedFieldProps`
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
extends Omit<ITextFieldBaseProps, "children">
|
|
63
|
+
{
|
|
64
|
+
maskedInputProps: IFormFieldMaskedInputProps & { ref?: RefObject<HTMLInputElement> };
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Идентична `ITextFieldProps`, но input с маской.
|
|
69
|
+
|
|
70
|
+
### `ITextFieldBaseProps`
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
extends Omit<IFormFieldProps, "prefix" | "postfix">
|
|
74
|
+
{
|
|
75
|
+
children: ReactNode; // обязателен — само поле ввода
|
|
76
|
+
description?: ReactNode;
|
|
77
|
+
counter?: ReactNode;
|
|
78
|
+
prefix?: ReactNode;
|
|
79
|
+
postfix?: ReactNode;
|
|
80
|
+
label?: ReactNode;
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`TextFieldBase` — `forwardRef<HTMLDivElement>`. Используется напрямую,
|
|
85
|
+
если нужен кастомный input (не Input/Masked/Textarea).
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Структура DOM
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
<FormGroup>
|
|
93
|
+
<FormField {...formFieldProps} ref={ref}>
|
|
94
|
+
{prefix && <FormFieldPrefix>{prefix}</FormFieldPrefix>}
|
|
95
|
+
{children} {/* FormFieldInput / MaskedInput / Textarea */}
|
|
96
|
+
{label && <FormFieldLabel>{label}</FormFieldLabel>}
|
|
97
|
+
{postfix && <FormFieldPostfix>{postfix}</FormFieldPostfix>}
|
|
98
|
+
</FormField>
|
|
99
|
+
{(description || counter) && (
|
|
100
|
+
<FormFieldDescription>
|
|
101
|
+
{description}
|
|
102
|
+
{counter && <FormFieldCounter>{counter}</FormFieldCounter>}
|
|
103
|
+
</FormFieldDescription>
|
|
104
|
+
)}
|
|
105
|
+
</FormGroup>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Инварианты
|
|
111
|
+
|
|
112
|
+
- **`TextField` / `MaskedField` — `FC, не forwardRef`**. Ref на `<input>` — через `inputProps.ref` / `maskedInputProps.ref`. `TextFieldBase` — `forwardRef<HTMLDivElement>` (сохранять).
|
|
113
|
+
- **`inputProps` / `maskedInputProps` обязательны** — нельзя default'ить.
|
|
114
|
+
- **Label рендерится после children в DOM** — требование `FormField` (плавающий лейбл через CSS), не менять порядок.
|
|
115
|
+
- **`description` и `counter` объединены в одну `FormFieldDescription`** — counter внутри `<FormFieldCounter>`. Не дублировать обёртку.
|
|
116
|
+
- **`prefix` / `postfix` поддерживаются `TextFieldBase` напрямую** (`Omit<IFormFieldProps, "prefix" | "postfix">` → переопределяет на ReactNode).
|
|
117
|
+
- **`displayName` выставлен** на `TextField`, `MaskedField`, `TextFieldBase`.
|
|
118
|
+
- **`MaskedField` отличается ТОЛЬКО типом input'а** — никакой собственной логики маскирования, она внутри `FormFieldMaskedInput`.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Accessibility
|
|
123
|
+
|
|
124
|
+
- `<input>` (или masked input) — приходит из `FormFieldInput`, отвечает за `id`, `aria-describedby`, `aria-invalid`.
|
|
125
|
+
- `<label htmlFor>` — связь с input'ом через `FormFieldLabel`/`FormField`.
|
|
126
|
+
- Описание/ошибка — через `description` (попадает в `FormFieldDescription`), `aria-describedby` подвязывается автоматически.
|
|
127
|
+
- `disabled`/`readonly`/`required` — на `inputProps`.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Связанные компоненты
|
|
132
|
+
|
|
133
|
+
- `TextareaField` — многострочный аналог.
|
|
134
|
+
- `MaskedField` — экспортируется отсюда же; ввод по маске.
|
|
135
|
+
- `AmountField` — для денежных сумм.
|
|
136
|
+
- `TextFieldBase` — общая база (используется напрямую при кастомном input'е).
|
|
137
|
+
- `FormField`, `FormGroup`, `FormFieldInput`, `FormFieldMaskedInput`, `FormFieldLabel`, `FormFieldDescription`, `FormFieldCounter`, `FormFieldPrefix`, `FormFieldPostfix` — внутренние составляющие.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Stories
|
|
142
|
+
|
|
143
|
+
Основные истории: `stories/TextFields/TextField.stories.tsx` (а также `MaskedField.stories.tsx`, `AmountField.stories.tsx` рядом).
|
|
144
|
+
Примеры: `stories/TextFields/examples/`.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## История изменений
|
|
149
|
+
|
|
150
|
+
| Дата | Изменение |
|
|
151
|
+
|---|---|
|
|
152
|
+
| 2026-04-18 | Создан документ |
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: TextareaField
|
|
3
|
+
category: Form Controls
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [TextField, FormField, FormFieldTextarea, TextFieldBase]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: stories/TextareaField/TextareaField.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# TextareaField
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Многострочное текстовое поле: тонкая обёртка над `TextFieldBase`,
|
|
17
|
+
вставляющая `FormFieldTextarea` вместо `FormFieldInput`. Получает все
|
|
18
|
+
возможности `TextFieldBase` (label, description, prefix/postfix, counter,
|
|
19
|
+
ошибки, клонирование пропсов через FormField).
|
|
20
|
+
|
|
21
|
+
Используй когда: нужен большой ввод (комментарий, обращение, описание).
|
|
22
|
+
Для однострочного ввода — `TextField`.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Файловая структура
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
src/components/TextareaField/
|
|
30
|
+
├── TextareaField.tsx # FC<ITextareaFieldProps>; <TextFieldBase><FormFieldTextarea/></TextFieldBase>
|
|
31
|
+
├── types.ts # ITextareaFieldProps
|
|
32
|
+
├── __tests__/
|
|
33
|
+
└── index.ts
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Публичный API
|
|
39
|
+
|
|
40
|
+
### `ITextareaFieldProps`
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
extends Omit<ITextFieldBaseProps, "children">
|
|
44
|
+
{
|
|
45
|
+
textareaProps: IFormFieldTextareaProps & DataAttributes & RefAttributes<HTMLTextAreaElement>;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
| Prop | Тип | Описание |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `textareaProps` | `IFormFieldTextareaProps & DataAttributes & RefAttributes<HTMLTextAreaElement>` | **Обязателен**. Прокидывается на `FormFieldTextarea`. Включая `ref` на textarea. |
|
|
52
|
+
| `label?` | `ReactNode` | Лейбл (`FormFieldLabel`). От `TextFieldBase`. |
|
|
53
|
+
| `description?` | `ReactNode` | Описание / ошибка (`FormFieldDescription`). |
|
|
54
|
+
| `counter?` | `ReactNode` | Счётчик символов (`FormFieldCounter`), внутри description. |
|
|
55
|
+
| `prefix?` / `postfix?` | `ReactNode` | Префикс/постфикс (`FormFieldPrefix`/`FormFieldPostfix`). |
|
|
56
|
+
| `...IFormFieldProps` | — | Все props `FormField` (size, status, disabled, focused и т.д.). |
|
|
57
|
+
|
|
58
|
+
`IFormFieldProps` приходит из `FormField` (см. FormField-AI.md, если существует).
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Структура DOM
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
<FormGroup>
|
|
66
|
+
<FormField {...formFieldProps}>
|
|
67
|
+
{prefix && <FormFieldPrefix>{prefix}</FormFieldPrefix>}
|
|
68
|
+
<FormFieldTextarea {...textareaProps} />
|
|
69
|
+
{label && <FormFieldLabel>{label}</FormFieldLabel>}
|
|
70
|
+
{postfix && <FormFieldPostfix>{postfix}</FormFieldPostfix>}
|
|
71
|
+
</FormField>
|
|
72
|
+
{(description || counter) && (
|
|
73
|
+
<FormFieldDescription>
|
|
74
|
+
{description}
|
|
75
|
+
{counter && <FormFieldCounter>{counter}</FormFieldCounter>}
|
|
76
|
+
</FormFieldDescription>
|
|
77
|
+
)}
|
|
78
|
+
</FormGroup>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Реализация полностью наследуется от `TextFieldBase` — изменения в нём
|
|
82
|
+
автоматически распространяются на `TextareaField`.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Инварианты
|
|
87
|
+
|
|
88
|
+
- **`FC, не forwardRef`** — для ref'а на DIV-обёртку используется `TextFieldBase` (forwardRef'нутый), но `TextareaField` сам ref не пробрасывает на корневой элемент. Ref на `<textarea>` — через `textareaProps.ref`.
|
|
89
|
+
- **`textareaProps` обязателен** (нет default'а).
|
|
90
|
+
- **Label рендерится ПОСЛЕ children** в DOM — это требование `FormField` (для CSS-эффекта плавающего лейбла); порядок не менять.
|
|
91
|
+
- **`description` и `counter` объединены в одну `FormFieldDescription`** — counter внутри `<FormFieldCounter>`. Не дублировать.
|
|
92
|
+
- **Структура зашита** — нет children API. Для кастомного содержимого `FormField` использовать `TextFieldBase` напрямую.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Accessibility
|
|
97
|
+
|
|
98
|
+
- `<textarea>` приходит из `FormFieldTextarea` — он отвечает за `id`, `aria-describedby`, `aria-invalid` и т.п.
|
|
99
|
+
- `label` — `<label>` с правильным `htmlFor` от `FormField`/`FormFieldLabel`.
|
|
100
|
+
- Ошибки — через `description` + `status` `FormField`'а.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Связанные компоненты
|
|
105
|
+
|
|
106
|
+
- `TextField` — однострочный аналог.
|
|
107
|
+
- `TextFieldBase` — общая база.
|
|
108
|
+
- `FormFieldTextarea` — реальный `<textarea>` с обёрткой стилей.
|
|
109
|
+
- `FormField` / `FormGroup` / `FormFieldLabel` / `FormFieldDescription` / `FormFieldCounter` / `FormFieldPrefix` / `FormFieldPostfix` — внутренние составляющие.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Stories
|
|
114
|
+
|
|
115
|
+
Основные истории: `stories/TextareaField/TextareaField.stories.tsx`
|
|
116
|
+
Примеры: `stories/TextareaField/examples/`
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## История изменений
|
|
121
|
+
|
|
122
|
+
| Дата | Изменение |
|
|
123
|
+
|---|---|
|
|
124
|
+
| 2026-04-18 | Создан документ |
|