@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,343 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: Confirm
|
|
3
|
+
category: Overlays
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [Island, LightBox, SideOverlay, Button, TriggerClickOnKeyDownEvent, Typography]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: ""
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Confirm
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Модальное подтверждение (диалог), встраиваемое **внутрь** уже открытого
|
|
17
|
+
`LightBox` или `SideOverlay`. Не содержит собственного бэкдропа/портала —
|
|
18
|
+
это компонент-контент, который рендерится поверх родительского overlay'а
|
|
19
|
+
и ограничивает свою максимальную ширину так, чтобы визуально помещаться
|
|
20
|
+
в контейнер родителя.
|
|
21
|
+
|
|
22
|
+
Внутри — `Island type=TYPE_1` с `role="dialog" aria-modal="true"`, секция
|
|
23
|
+
`Island.Body` с контентом (Title, SubTitle, Controls) и абсолютно
|
|
24
|
+
позиционированная кнопка закрытия (справа сверху).
|
|
25
|
+
|
|
26
|
+
Используй когда: нужно подтвердить действие (закрыть/удалить/отменить)
|
|
27
|
+
поверх уже открытого `LightBox` или `SideOverlay`.
|
|
28
|
+
Не используй как самостоятельный модал (он не создаёт свой overlay/backdrop)
|
|
29
|
+
— для автономных диалогов бери `ModalWindow` или используй `LightBox`
|
|
30
|
+
c `Confirm` внутри.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Файловая структура
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
src/components/Confirm/
|
|
38
|
+
├── Confirm.tsx # FC-обёртка над Island, compound FC (Close/Content/Controls)
|
|
39
|
+
├── enums.ts # EConfirmParentComponent
|
|
40
|
+
├── index.ts # Barrel: Confirm + enums
|
|
41
|
+
├── components/
|
|
42
|
+
│ ├── ConfirmClose.tsx # FC, условное оборачивание в TriggerClickOnKeyDownEvent (Esc)
|
|
43
|
+
│ ├── ConfirmCloseButton.tsx # forwardRef, Button с иконкой крестика
|
|
44
|
+
│ ├── ConfirmContent.tsx # FC, compound с Title/SubTitle
|
|
45
|
+
│ ├── ConfirmContentTitle.tsx # FC-обёртка Typography Title
|
|
46
|
+
│ └── ConfirmContentSubTitle.tsx # FC-обёртка Typography Text
|
|
47
|
+
└── styles/Confirm.module.less # Max-width по parentComponent, позиционирование кнопки закрытия
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Особенности:
|
|
51
|
+
- **Root — FC, не forwardRef.** Ref-форвардинг не реализован (известный
|
|
52
|
+
AI-ready debt, характерен для compound-обёрток). Ref, если нужен
|
|
53
|
+
родителю, идёт через `...htmlDivAttributes` в `Island`.
|
|
54
|
+
- **Compound через прямое присваивание:** `Confirm.Close = ConfirmClose;`
|
|
55
|
+
`Confirm.Content = ConfirmContent;` `Confirm.Controls = ConfirmControls;`
|
|
56
|
+
Тип `IConfirmFC extends React.FC<IConfirmProps>`.
|
|
57
|
+
- **ConfirmContent — тоже compound** (Title/SubTitle) через тот же паттерн.
|
|
58
|
+
- **Нет `__tests__` и нет `stories`** — документируется косвенно через
|
|
59
|
+
потребителей `LightBox`/`SideOverlay`.
|
|
60
|
+
- **Нет собственных дизайн-токенов** — все цвета/радиусы берутся из
|
|
61
|
+
`Island` (type=TYPE_1); ширина — из LESS-переменных родительского
|
|
62
|
+
overlay (`@sideOverlaySMWidth` etc.).
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Варианты и props
|
|
67
|
+
|
|
68
|
+
### Root: `IConfirmProps extends IIslandProps`
|
|
69
|
+
|
|
70
|
+
| Prop | Тип | Default | Описание |
|
|
71
|
+
|---|---|---|---|
|
|
72
|
+
| `parentComponent` | `EConfirmParentComponent` | `LIGHTBOX` | Определяет max-width: в `LightBox` — как у контента LightBox, в `SideOverlay` — как у соответствующей ширины боковой панели. |
|
|
73
|
+
| `children` | `ReactNode` | — | Обычно `Confirm.Close` + `Confirm.Content` + `Confirm.Controls`. |
|
|
74
|
+
| `className` | `string` | — | Добавляется через `clsx` к root-классу `.confirm` и parent-класс map. |
|
|
75
|
+
| `...IIslandProps` | — | — | Все пропсы `Island` (`id`, `onClick`, `data-tx` и др.). |
|
|
76
|
+
|
|
77
|
+
`role="dialog"` и `aria-modal="true"` проставлены жёстко в реализации и
|
|
78
|
+
не могут быть перебиты через `htmlDivAttributes` (spread идёт до них
|
|
79
|
+
— **неверно**: в реализации spread идёт **после** `role` и `aria-modal`,
|
|
80
|
+
значит пропс потребителя **перебьёт** дефолт). Если нужно — не
|
|
81
|
+
перебивать, семантика диалога обязательна.
|
|
82
|
+
|
|
83
|
+
### `EConfirmParentComponent` (enum string)
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
enum EConfirmParentComponent {
|
|
87
|
+
LIGHTBOX = "lightBox",
|
|
88
|
+
SIDE_OVERLAY_SM = "sideOverlaySM",
|
|
89
|
+
SIDE_OVERLAY_MD = "sideOverlayMD",
|
|
90
|
+
SIDE_OVERLAY_LG = "sideOverlayLG",
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Соответствие → LESS-классы:
|
|
95
|
+
- `LIGHTBOX` → `.isInLightBox` → `calc(var(--lightBox-content-max-width) - @page-padding-desktop-x*2)`
|
|
96
|
+
- `SIDE_OVERLAY_SM` → `.isInSideOverlaySM` → `calc(@sideOverlaySMWidth - @page-padding-desktop-x*2)`
|
|
97
|
+
- `SIDE_OVERLAY_MD` → `.isInSideOverlayMD` → `calc(@sideOverlayMDWidth - @page-padding-desktop-x*2)`
|
|
98
|
+
- `SIDE_OVERLAY_LG` → `.isInSideOverlayLG` → `calc(@sideOverlayLGWidth - @page-padding-desktop-x*2)`
|
|
99
|
+
|
|
100
|
+
### Compound: `Confirm.Close` — `IConfirmCloseProps extends IConfirmCloseButtonProps`
|
|
101
|
+
|
|
102
|
+
| Prop | Тип | Обязателен | Описание |
|
|
103
|
+
|---|---|---|---|
|
|
104
|
+
| `clickByEsc` | `boolean` | Да | Если `true` — оборачивает кнопку в `TriggerClickOnKeyDownEvent` с `ESCAPE`, клик кнопки симулируется при нажатии Esc. |
|
|
105
|
+
| `...IConfirmCloseButtonProps` | — | — | Все пропсы кнопки, кроме `theme/size/icon` (зафиксированы). |
|
|
106
|
+
|
|
107
|
+
**`IConfirmCloseButtonProps extends Omit<TButtonProps, "theme" \| "size" \| "icon">`:**
|
|
108
|
+
|
|
109
|
+
- `theme` зафиксирован в `EButtonTheme.SECONDARY`
|
|
110
|
+
- `size` зафиксирован в `EComponentSize.MD`
|
|
111
|
+
- `icon` зафиксирован в `<CrossStrokeSrvIcon20 paletteIndex={0} />`
|
|
112
|
+
- `title` по умолчанию `"Закрыть"`
|
|
113
|
+
- `className` объединяется с `.confirmCloseButton` (абсолютное позиционирование top/right: 24px; 16px на `< screen-sm-max`).
|
|
114
|
+
|
|
115
|
+
### Compound: `Confirm.Content` — `IConfirmContentProps extends HTMLAttributes<HTMLDivElement>`
|
|
116
|
+
|
|
117
|
+
Обычный `<div className={clsx(className, styles.confirmContent)}>` с
|
|
118
|
+
`margin-bottom: 24px` (16px на мобильных) и `padding-right: 56px`
|
|
119
|
+
(место под кнопку закрытия).
|
|
120
|
+
|
|
121
|
+
Compound-подкомпоненты:
|
|
122
|
+
|
|
123
|
+
**`Confirm.Content.Title` — `IConfirmContentTitleProps extends TTitleProps<"h1">`:**
|
|
124
|
+
- По умолчанию `size={ETitleSize.H3}`
|
|
125
|
+
- `margin-bottom: 12px` через `.confirmContentTitle`
|
|
126
|
+
|
|
127
|
+
**`Confirm.Content.SubTitle` — `IConfirmContentSubTitleProps extends TTextProps<"div">`:**
|
|
128
|
+
- По умолчанию `size={ETextSize.B2}`
|
|
129
|
+
- Рендерит `<Text tag="div" />`
|
|
130
|
+
|
|
131
|
+
### Compound: `Confirm.Controls` — `IConfirmControlsProps extends HTMLAttributes<HTMLDivElement>`
|
|
132
|
+
|
|
133
|
+
Обычный `<div className={clsx(className, styles.confirmControls)}>` —
|
|
134
|
+
стилизован `white-space: nowrap` (чтобы кнопки действий не переносились).
|
|
135
|
+
Внутри обычно два `Button` (подтвердить / отменить).
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Ключевые особенности реализации
|
|
140
|
+
|
|
141
|
+
### Confirm — это Island type=TYPE_1
|
|
142
|
+
|
|
143
|
+
```tsx
|
|
144
|
+
<Island
|
|
145
|
+
type={EIslandType.TYPE_1}
|
|
146
|
+
className={clsx(className, styles.confirm, parentComponentToClassNameMap[parentComponent])}
|
|
147
|
+
role="dialog"
|
|
148
|
+
aria-modal="true"
|
|
149
|
+
{...htmlDivAttributes}
|
|
150
|
+
>
|
|
151
|
+
<Island.Body>{children}</Island.Body>
|
|
152
|
+
</Island>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Почему Island, а не чистый div:** Island даёт фирменные радиусы,
|
|
156
|
+
тени и padding. TYPE_1 — "приподнятая" поверхность. Если захочется
|
|
157
|
+
другого типа — это смена визуала Confirm, breaking-change.
|
|
158
|
+
|
|
159
|
+
**`<Island.Body>` обязателен** — Island ожидает compound-структуру для
|
|
160
|
+
padding'а контента. Без Body контент приклеится к границам.
|
|
161
|
+
|
|
162
|
+
### `parentComponent` → max-width map
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
const parentComponentToClassNameMap = {
|
|
166
|
+
[EConfirmParentComponent.LIGHTBOX]: styles.isInLightBox,
|
|
167
|
+
[EConfirmParentComponent.SIDE_OVERLAY_SM]: styles.isInSideOverlaySM,
|
|
168
|
+
[EConfirmParentComponent.SIDE_OVERLAY_MD]: styles.isInSideOverlayMD,
|
|
169
|
+
[EConfirmParentComponent.SIDE_OVERLAY_LG]: styles.isInSideOverlayLG,
|
|
170
|
+
};
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Зачем: Confirm рендерится внутри родительского overlay'а и должен
|
|
174
|
+
визуально поместиться в его внутренний контент. `parentComponent`
|
|
175
|
+
сообщает компоненту, какой контейнер его содержит, чтобы он сам
|
|
176
|
+
подсчитал max-width. Если не проставить — дефолт `LIGHTBOX`.
|
|
177
|
+
|
|
178
|
+
**Если добавить новый parent (например, SIDE_OVERLAY_XL):** нужно
|
|
179
|
+
обновить и enum, и map, и добавить `.isInSideOverlayXL` в LESS.
|
|
180
|
+
|
|
181
|
+
### `clickByEsc` → обёртка в `TriggerClickOnKeyDownEvent`
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
if (clickByEsc) {
|
|
185
|
+
return (
|
|
186
|
+
<TriggerClickOnKeyDownEvent targetRef={ref} eventKeyCode={EVENT_KEY_CODES.ESCAPE}>
|
|
187
|
+
<ConfirmCloseButton {...buttonProps} ref={ref} />
|
|
188
|
+
</TriggerClickOnKeyDownEvent>
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
return <ConfirmCloseButton {...buttonProps} />;
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Важно:** `TriggerClickOnKeyDownEvent` слушает Esc на `document` и
|
|
195
|
+
программно кликает элемент по `ref`. Не вешает hard-bound listener
|
|
196
|
+
на кнопку. Если в родителе уже есть обработчик Escape (LightBox
|
|
197
|
+
обычно закрывается по Esc), появятся **конфликты** — Confirm должен
|
|
198
|
+
останавливать пропагацию или родитель должен учитывать модальную
|
|
199
|
+
вложенность. Это зона ответственности потребителя, не Confirm.
|
|
200
|
+
|
|
201
|
+
### Кнопка закрытия — absolute позиция
|
|
202
|
+
|
|
203
|
+
```less
|
|
204
|
+
.confirmCloseButton {
|
|
205
|
+
position: absolute;
|
|
206
|
+
top: 24px;
|
|
207
|
+
right: 24px;
|
|
208
|
+
}
|
|
209
|
+
@media (max-width: @screen-sm-max) {
|
|
210
|
+
.confirmCloseButton {
|
|
211
|
+
top: 16px;
|
|
212
|
+
right: 16px;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Абсолютное позиционирование** требует `position: relative` или
|
|
218
|
+
`position: absolute` на ближайшем предке. Island type=TYPE_1
|
|
219
|
+
создаёт этот контекст. Если оборачивать Confirm в произвольный
|
|
220
|
+
контейнер без position — кнопка "улетит" к ближайшему.
|
|
221
|
+
|
|
222
|
+
### `padding-right: 56px` у Content
|
|
223
|
+
|
|
224
|
+
`.confirmContent { padding-right: 56px; }` — место под кнопку закрытия,
|
|
225
|
+
чтобы текст Title не перекрывался с крестиком. Значение: ширина кнопки
|
|
226
|
+
(40px для MD) + gap (16px).
|
|
227
|
+
|
|
228
|
+
### Zero tokens — всё из родителей
|
|
229
|
+
|
|
230
|
+
В `Confirm.module.less` **нет** CSS-переменных вида
|
|
231
|
+
`--triplex-next-Confirm-*`. Используются:
|
|
232
|
+
- `--lightBox-content-max-width` (токен LightBox)
|
|
233
|
+
- `@lightBox-content-max-width-fallback` (LESS-fallback)
|
|
234
|
+
- `@sideOverlaySMWidth`, `@sideOverlayMDWidth`, `@sideOverlayLGWidth`
|
|
235
|
+
- `@page-padding-desktop-x`, `@screen-sm-max`
|
|
236
|
+
|
|
237
|
+
**Это осознанное решение**: Confirm — слой-"контент", не независимый
|
|
238
|
+
визуальный блок. Вся пластика — от Island. Размеры — от контейнера.
|
|
239
|
+
|
|
240
|
+
### `IConfirmFC` — кастомный тип интерфейса
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
export interface IConfirmFC extends React.FC<IConfirmProps> {
|
|
244
|
+
Close: typeof ConfirmClose;
|
|
245
|
+
Content: typeof ConfirmContent;
|
|
246
|
+
Controls: typeof ConfirmControls;
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Аналог Badge / AlertProcess / Chip. TS видит `Confirm.Close` типизированно,
|
|
251
|
+
без `as any`.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Инварианты
|
|
256
|
+
|
|
257
|
+
- **`role="dialog" aria-modal="true"`** — обязательны. Не переопределять
|
|
258
|
+
через пропсы (spread-order перебьёт, но не надо).
|
|
259
|
+
- **`Island.Body` обёртка** внутри Confirm — обязательна. Не превращать
|
|
260
|
+
`children` в прямых детей Island.
|
|
261
|
+
- **`parentComponentToClassNameMap` и enum синхронны** — при добавлении
|
|
262
|
+
нового значения enum обновлять и map, и LESS. Дефолт — `LIGHTBOX`.
|
|
263
|
+
- **`Confirm.Close` с `clickByEsc` должен стоять внутри одного Confirm**
|
|
264
|
+
— не выносить. `TriggerClickOnKeyDownEvent` работает через document,
|
|
265
|
+
Esc сработает где угодно.
|
|
266
|
+
- **Кнопка закрытия — absolute относительно Island** — требует
|
|
267
|
+
`position: relative` на `.confirm`/Island. Island задаёт это сам.
|
|
268
|
+
- **`padding-right: 56px` в `.confirmContent`** — резерв под кнопку.
|
|
269
|
+
Если убрать кнопку — уменьшить padding.
|
|
270
|
+
- **Нет собственных CSS-токенов** — не добавлять. Все стили делегируются
|
|
271
|
+
Island и родительскому overlay.
|
|
272
|
+
- **Нет forwardRef на root** — известный debt. Не добавлять точечно.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Accessibility
|
|
277
|
+
|
|
278
|
+
- **`role="dialog" aria-modal="true"`** — семантика модального диалога.
|
|
279
|
+
Screen reader объявит как модал и ограничит чтение его содержимым.
|
|
280
|
+
- **Focus management** — **не реализован самим Confirm**. Ожидается,
|
|
281
|
+
что родительский overlay (LightBox/SideOverlay) уже управляет focus
|
|
282
|
+
trap'ом, и внутри Confirm фокус сам попадает на первый интерактивный
|
|
283
|
+
элемент (обычно кнопку закрытия или первый контрол).
|
|
284
|
+
- **Esc handling** — через `clickByEsc` и `TriggerClickOnKeyDownEvent`.
|
|
285
|
+
Важно: Esc-listener вешается на document, не на Confirm. Если
|
|
286
|
+
родитель уже закрывается по Esc — возможен двойной trigger.
|
|
287
|
+
- **Label'ы** — Confirm сам `aria-label`/`aria-labelledby` не
|
|
288
|
+
проставляет. Если нужно явное имя для screen reader'а — передать
|
|
289
|
+
`aria-labelledby` через пропсы с id `Confirm.Content.Title` или
|
|
290
|
+
`aria-label` текстом.
|
|
291
|
+
- **Кнопка закрытия** имеет `title="Закрыть"` по умолчанию (becomes
|
|
292
|
+
tooltip + `aria-label` fallback для `<Button>` — зависит от
|
|
293
|
+
реализации Button).
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## Дизайн-токены
|
|
298
|
+
|
|
299
|
+
**Нет собственных.** Визуальные токены наследуются от `Island`
|
|
300
|
+
(type=TYPE_1): радиус, фон, тени, внутренние отступы. Layout-переменные
|
|
301
|
+
— LESS (`@sideOverlay*Width`, `@page-padding-desktop-x`, `@screen-sm-max`).
|
|
302
|
+
|
|
303
|
+
Если нужно кастомизировать Confirm в проекте — переопределять токены
|
|
304
|
+
Island или оборачивать в собственный CSS.
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Связанные компоненты
|
|
309
|
+
|
|
310
|
+
- `Island` (`src/components/Island`) — визуальная основа. Confirm =
|
|
311
|
+
`Island type=TYPE_1` + позиционирование + label-подкомпоненты.
|
|
312
|
+
- `LightBox` (`src/components/LightBox`) — основной контейнер, в котором
|
|
313
|
+
Confirm открывается поверх контента.
|
|
314
|
+
- `SideOverlay*` (`src/components/SideOverlay`) — вторичные контейнеры
|
|
315
|
+
(SM/MD/LG). Размеры задают ширину Confirm через `parentComponent`.
|
|
316
|
+
- `Button` (`src/components/Button`) — кнопка закрытия (SECONDARY, MD,
|
|
317
|
+
CrossStrokeSrvIcon20) и кнопки действий в `Confirm.Controls`.
|
|
318
|
+
- `TriggerClickOnKeyDownEvent` (`src/components/Triggers`) — механизм
|
|
319
|
+
Esc → click (`Confirm.Close` при `clickByEsc`).
|
|
320
|
+
- `Typography.Title` / `Typography.Text` — базы для
|
|
321
|
+
`Confirm.Content.Title` / `Confirm.Content.SubTitle`.
|
|
322
|
+
- `ModalWindow` — автономный диалог (с бэкдропом). Не замена Confirm:
|
|
323
|
+
разная семантика слоя.
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## Stories
|
|
328
|
+
|
|
329
|
+
**Нет собственных stories.** Документируется косвенно через сценарии
|
|
330
|
+
`LightBox`/`SideOverlay`, где Confirm появляется как подтверждение
|
|
331
|
+
закрытия.
|
|
332
|
+
|
|
333
|
+
Добавлять stories при миграции на AI-ready pattern — stories должны
|
|
334
|
+
эмулировать контекст (мок родительского overlay или использование
|
|
335
|
+
реального `LightBox`/`SideOverlay` с открытым Confirm внутри).
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## История изменений
|
|
340
|
+
|
|
341
|
+
| Дата | Изменение |
|
|
342
|
+
|---|---|
|
|
343
|
+
| 2026-04-18 | Создан документ |
|