@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.
Files changed (140) hide show
  1. package/README.md +124 -0
  2. package/bundle/.gitkeep +0 -0
  3. package/bundle/components/AbstractTree.md +198 -0
  4. package/bundle/components/AccordionBase.md +227 -0
  5. package/bundle/components/Alert.md +317 -0
  6. package/bundle/components/Amount.md +225 -0
  7. package/bundle/components/AmountField.md +289 -0
  8. package/bundle/components/Avatar.md +209 -0
  9. package/bundle/components/Badge.md +277 -0
  10. package/bundle/components/Body.md +167 -0
  11. package/bundle/components/Button.md +230 -0
  12. package/bundle/components/ButtonDropdown.md +159 -0
  13. package/bundle/components/ButtonIcon.md +122 -0
  14. package/bundle/components/Calendar.md +445 -0
  15. package/bundle/components/Card.md +374 -0
  16. package/bundle/components/CarouselExtended.md +250 -0
  17. package/bundle/components/Checkbox.md +126 -0
  18. package/bundle/components/CheckboxTree.md +280 -0
  19. package/bundle/components/CheckboxTreeExtended.md +321 -0
  20. package/bundle/components/CheckboxXGroup.md +68 -0
  21. package/bundle/components/CheckboxYGroup.md +67 -0
  22. package/bundle/components/Chip.md +404 -0
  23. package/bundle/components/ChipGroup.md +179 -0
  24. package/bundle/components/Col.md +221 -0
  25. package/bundle/components/CollapsableTree.md +255 -0
  26. package/bundle/components/Confirm.md +343 -0
  27. package/bundle/components/DateField.md +371 -0
  28. package/bundle/components/DatePickerExtended.md +342 -0
  29. package/bundle/components/DateRange.md +275 -0
  30. package/bundle/components/DesignTokens.md +385 -0
  31. package/bundle/components/Divider.md +196 -0
  32. package/bundle/components/DocumentNumberEdit.md +280 -0
  33. package/bundle/components/Dropdown.md +433 -0
  34. package/bundle/components/Ellipsis.md +208 -0
  35. package/bundle/components/EmptyView.md +99 -0
  36. package/bundle/components/ExpandAnimation.md +281 -0
  37. package/bundle/components/Footer.md +339 -0
  38. package/bundle/components/FormField.md +326 -0
  39. package/bundle/components/FormGroup.md +99 -0
  40. package/bundle/components/Gap.md +113 -0
  41. package/bundle/components/Header.md +280 -0
  42. package/bundle/components/HelpBox.md +154 -0
  43. package/bundle/components/IconWrapper.md +145 -0
  44. package/bundle/components/Island.md +197 -0
  45. package/bundle/components/IslandAccordion.md +230 -0
  46. package/bundle/components/IslandWidget.md +233 -0
  47. package/bundle/components/KeyDownListener.md +157 -0
  48. package/bundle/components/LightBox.md +322 -0
  49. package/bundle/components/Link.md +161 -0
  50. package/bundle/components/List.md +247 -0
  51. package/bundle/components/ListMaster.md +204 -0
  52. package/bundle/components/Loader.md +161 -0
  53. package/bundle/components/LoaderScreen.md +134 -0
  54. package/bundle/components/Marker.md +127 -0
  55. package/bundle/components/MarkerStatus.md +148 -0
  56. package/bundle/components/MediaWidth.md +169 -0
  57. package/bundle/components/MobileView.md +120 -0
  58. package/bundle/components/ModalWindow.md +308 -0
  59. package/bundle/components/MonthYearField.md +168 -0
  60. package/bundle/components/MultiselectField.md +213 -0
  61. package/bundle/components/Notification.md +233 -0
  62. package/bundle/components/NumberField.md +178 -0
  63. package/bundle/components/OrderedList.md +169 -0
  64. package/bundle/components/Overlay.md +237 -0
  65. package/bundle/components/Page.md +246 -0
  66. package/bundle/components/Pagination.md +298 -0
  67. package/bundle/components/Portal.md +119 -0
  68. package/bundle/components/Radio.md +174 -0
  69. package/bundle/components/Row.md +125 -0
  70. package/bundle/components/SMSField.md +160 -0
  71. package/bundle/components/SegmentedControl.md +235 -0
  72. package/bundle/components/SelectExtendedField.md +322 -0
  73. package/bundle/components/SelectField.md +213 -0
  74. package/bundle/components/Skeleton.md +129 -0
  75. package/bundle/components/Slider.md +157 -0
  76. package/bundle/components/SliderExtended.md +210 -0
  77. package/bundle/components/SliderRange.md +160 -0
  78. package/bundle/components/SmallInput.md +101 -0
  79. package/bundle/components/Spoiler.md +121 -0
  80. package/bundle/components/StatusTracker.md +151 -0
  81. package/bundle/components/Step.md +121 -0
  82. package/bundle/components/Stepper.md +163 -0
  83. package/bundle/components/Suggest.md +160 -0
  84. package/bundle/components/SuggestField.md +157 -0
  85. package/bundle/components/SwipeableArea.md +144 -0
  86. package/bundle/components/Table.md +199 -0
  87. package/bundle/components/Tabs.md +152 -0
  88. package/bundle/components/TabsExtended.md +273 -0
  89. package/bundle/components/TabsLine.md +189 -0
  90. package/bundle/components/Tag.md +135 -0
  91. package/bundle/components/TagColor.md +121 -0
  92. package/bundle/components/TagGroup.md +100 -0
  93. package/bundle/components/TextField.md +152 -0
  94. package/bundle/components/TextareaField.md +124 -0
  95. package/bundle/components/ThemeProvider.md +181 -0
  96. package/bundle/components/Tooltip.md +254 -0
  97. package/bundle/components/TopOverlay.md +145 -0
  98. package/bundle/components/TreeView.md +224 -0
  99. package/bundle/components/Triggers.md +121 -0
  100. package/bundle/guides/codestyle.md +205 -0
  101. package/bundle/guides/commits.md +166 -0
  102. package/bundle/guides/context.md +277 -0
  103. package/bundle/guides/stories.md +618 -0
  104. package/bundle/guides/template.md +154 -0
  105. package/bundle/guides/tests.md +301 -0
  106. package/bundle/icons.json +4156 -0
  107. package/bundle/manifest.json +796 -0
  108. package/bundle/release-notes/1.1.0.mdx +26 -0
  109. package/bundle/release-notes/1.1.1.mdx +14 -0
  110. package/bundle/release-notes/1.10.0.mdx +43 -0
  111. package/bundle/release-notes/1.11.0.mdx +19 -0
  112. package/bundle/release-notes/1.12.0.mdx +21 -0
  113. package/bundle/release-notes/1.13.0.mdx +43 -0
  114. package/bundle/release-notes/1.14.0.mdx +29 -0
  115. package/bundle/release-notes/1.15.0.mdx +56 -0
  116. package/bundle/release-notes/1.16.0.mdx +55 -0
  117. package/bundle/release-notes/1.17.0.mdx +15 -0
  118. package/bundle/release-notes/1.18.0.mdx +24 -0
  119. package/bundle/release-notes/1.19.0.mdx +48 -0
  120. package/bundle/release-notes/1.19.1.mdx +9 -0
  121. package/bundle/release-notes/1.2.0.mdx +80 -0
  122. package/bundle/release-notes/1.20.0.mdx +48 -0
  123. package/bundle/release-notes/1.21.0.mdx +66 -0
  124. package/bundle/release-notes/1.22.0.mdx +75 -0
  125. package/bundle/release-notes/1.23.0.mdx +50 -0
  126. package/bundle/release-notes/1.24.0.mdx +59 -0
  127. package/bundle/release-notes/1.25.0.mdx +52 -0
  128. package/bundle/release-notes/1.26.0.mdx +11 -0
  129. package/bundle/release-notes/1.3.0.mdx +21 -0
  130. package/bundle/release-notes/1.4.0.mdx +37 -0
  131. package/bundle/release-notes/1.5.0.mdx +24 -0
  132. package/bundle/release-notes/1.6.0.mdx +37 -0
  133. package/bundle/release-notes/1.6.1.mdx +11 -0
  134. package/bundle/release-notes/1.7.0.mdx +29 -0
  135. package/bundle/release-notes/1.8.0.mdx +38 -0
  136. package/bundle/release-notes/1.9.0.mdx +28 -0
  137. package/dist/index.d.ts +2 -0
  138. package/dist/index.js +324 -0
  139. package/dist/index.js.map +1 -0
  140. package/package.json +51 -0
@@ -0,0 +1,280 @@
1
+ ---
2
+ component: DocumentNumberEdit
3
+ category: Form
4
+ figma-node: ""
5
+ figma-file: ""
6
+ related: [SmallInput, Link, Typography]
7
+ tokens: []
8
+ stories: stories/DocumentNumberEdit/DocumentNumberEdit.stories.tsx
9
+ version: "1.0"
10
+ ---
11
+
12
+ # DocumentNumberEdit
13
+
14
+ ## Назначение
15
+
16
+ Инлайн-виджет "номер документа" в режиме **просмотра** (подпись + текст)
17
+ / **редактирования** (SmallInput c числовой маской). Используется
18
+ типично в формах создания документов, где номер по умолчанию
19
+ присваивается автоматически, но пользователь может его изменить.
20
+
21
+ Три состояния:
22
+ 1. **Нет значения + не в режиме edit** — текст `emptyNumberLabel` +
23
+ ссылка `emptyNumberButtonLabel` ("Задать номер").
24
+ 2. **Есть значение + не в режиме edit** — текст `{numberLabel} {value}`
25
+ + ссылка `buttonLabel` ("Изменить").
26
+ 3. **В режиме edit** — текст `numberLabel` + SmallInput (цифры, ≤6
27
+ символов).
28
+
29
+ Используй когда: форма документа с редактируемым номером и placeholder-логикой.
30
+ Не используй для: произвольного числового поля — бери `SmallInput` или
31
+ `NumberField`.
32
+
33
+ ---
34
+
35
+ ## Файловая структура
36
+
37
+ ```text
38
+ src/components/DocumentNumberEdit/
39
+ ├── DocumentNumberEdit.tsx # FC, НЕ forwardRef
40
+ ├── index.ts # Barrel
41
+ └── styles/DocumentNumberEdit.module.less # .label (inline-block + 8px right), .inputEditWrapper (68px)
42
+ ```
43
+
44
+ Особенности:
45
+ - **НЕ `forwardRef`** — FC. Известный AI-ready debt.
46
+ - **Внутренний state `editingMode`** — компонент сам управляет
47
+ переключением "просмотр ↔ редактирование". Внешнего управления нет.
48
+ - **`value`** — controlled-only (без defaultValue).
49
+ - **Нет `__tests__`** — покрытие через `SmallInput`-тесты косвенно.
50
+ - **Нет `data-tx`** — не ставит атрибут версии.
51
+
52
+ ---
53
+
54
+ ## Варианты и props
55
+
56
+ ### `IDocumentNumberEditProps extends ISmallInputProps`
57
+
58
+ **DocumentNumberEdit-specific:**
59
+
60
+ | Prop | Тип | Default | Описание |
61
+ |---|---|---|---|
62
+ | `value` | `React.ReactText` (`string \| number`) | — | Текущий номер. Falsy → empty-state. |
63
+ | `numberLabel` | `string` | — (обязателен) | Префикс текста в view-mode ("Документ №"). |
64
+ | `emptyNumberLabel` | `string` | — (обязателен) | Полный текст в empty-state ("Номер документа будет присвоен автоматически"). |
65
+ | `buttonLabel` | `string` | — (обязателен) | Текст ссылки в view-mode ("Изменить"). |
66
+ | `emptyNumberButtonLabel` | `string` | — (обязателен) | Текст ссылки в empty-state ("Задать номер"). |
67
+ | `maxLength` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6` | `6` | Максимум цифр. Влияет на `placeholder` (`"0"*maxLength`) и `SmallInput.maxLength`. |
68
+
69
+ **Остальные:** все пропсы `ISmallInputProps` (включая `onChange`,
70
+ `onBlur`, `onKeyDown`, `className`, `...`).
71
+
72
+ ### `labelText` — вычисляемый
73
+
74
+ ```ts
75
+ const labelText = useMemo(() => {
76
+ if (editingMode) return numberLabel; // только "Документ №"
77
+ if (value) return `${numberLabel} ${value}`; // "Документ № 12345"
78
+ return emptyNumberLabel; // "Номер ... будет присвоен автоматически"
79
+ }, [value, numberLabel, emptyNumberLabel, editingMode]);
80
+ ```
81
+
82
+ ---
83
+
84
+ ## Ключевые особенности реализации
85
+
86
+ ### State `editingMode` — внутренний uncontrolled switch
87
+
88
+ ```ts
89
+ const [editingMode, setEditingMode] = useState(false);
90
+ ```
91
+
92
+ **Включается:** клик по ссылке (`handleButtonClick`, `preventDefault()`).
93
+ **Выключается:** Enter в input (`handleInputKeyDown`) или blur input
94
+ (`handleInputBlur`).
95
+
96
+ **Нет `controlled` варианта** — потребитель не может извне открыть
97
+ редактирование. Если нужно — оборачивать в свою логику.
98
+
99
+ ### Фильтрация цифр + сохранение позиции курсора
100
+
101
+ ```ts
102
+ const handleInputChange = (event) => {
103
+ const caret = getCaretPosition(event.target);
104
+ const value = getFilteredValue(event.target.value);
105
+ const caretShift = value.length - event.target.value.length;
106
+
107
+ event.target.value = value;
108
+ setCaretPosition(event.target, caret + caretShift);
109
+
110
+ onChange?.(event);
111
+ };
112
+
113
+ const getFilteredValue = (value: string) => {
114
+ const buffer: string[] = [];
115
+ for (let i = 0; i < value.length; i++) {
116
+ if (StringUtils.isDigit(value[i])) buffer.push(value[i]);
117
+ }
118
+ return buffer.join("");
119
+ };
120
+ ```
121
+
122
+ **Зачем `caretShift`:** если пользователь вставил "12a3" → фильтр
123
+ вернёт "123", длина уменьшилась на 1. Курсор должен сдвинуться на `-1`
124
+ относительно момента вставки, чтобы остаться на правильном месте.
125
+ Без этого курсор "прыгнет" в конец.
126
+
127
+ **`StringUtils.isDigit`** — проверка по регулярке (0-9). Не
128
+ поддерживает юникод-цифры, только ASCII.
129
+
130
+ **Мутация `event.target.value` напрямую** — это анти-паттерн, но
131
+ React принимает это, так как мы работаем с uncontrolled SmallInput
132
+ под капотом (controlled через onChange). Вариант: принять внешний
133
+ onChange(filteredValue), но тогда `value` не обновится моментально
134
+ до ре-рендера.
135
+
136
+ ### `autoFocus={true}` на SmallInput
137
+
138
+ При переключении в edit-mode input появляется **с фокусом**. Важно
139
+ для UX — пользователь кликнул "Изменить" и сразу может вводить.
140
+
141
+ ### Ссылка — `Link` с `href="#"` + preventDefault
142
+
143
+ ```tsx
144
+ <Link href="#" onClick={handleButtonClick}>
145
+ {value ? buttonLabel : emptyNumberButtonLabel}
146
+ </Link>
147
+ ```
148
+
149
+ **`href="#"`** — чтобы ссылка была "настоящей" (правильный фокус,
150
+ подчёркивание). `preventDefault` в обработчике клика предотвращает
151
+ прыжок страницы наверх.
152
+
153
+ **Альтернатива — `<button>`**, но дизайн требует ссылочного вида.
154
+ Компромисс: семантика button + визуал Link.
155
+
156
+ ### Выход из edit-mode: Enter или blur
157
+
158
+ ```ts
159
+ if (isKey(event.code, "ENTER")) setEditingMode(false);
160
+ // + onBlur → setEditingMode(false)
161
+ ```
162
+
163
+ **Esc не выходит** — это UX-решение. Если нужно — потребитель может
164
+ сам обработать в `onKeyDown` и програмно вызвать blur.
165
+
166
+ ### Placeholder — `"0".repeat(maxLength)`
167
+
168
+ `inputPlaceholder = "0".repeat(maxLength)` → "000000" для maxLength=6.
169
+ Визуально показывает сколько символов ожидается. Меняется с maxLength.
170
+
171
+ ### Ширина input — 68px (hardcoded)
172
+
173
+ ```less
174
+ .inputEditWrapper { width: 68px; }
175
+ ```
176
+
177
+ **Hardcoded** и рассчитана под 6 цифр в SmallInput. Если изменить
178
+ `maxLength`, input может не помещать значение — 68px могут быть
179
+ слишком широки или узки. **Потребители с кастомным maxLength ≠ 6
180
+ должны переопределять ширину через className/style на wrapper**
181
+ (но wrapper — внутренний, override невозможен без хака).
182
+
183
+ **Это известное ограничение**: компонент заточен под 6-значный номер.
184
+
185
+ ### `inline-block` разметка
186
+
187
+ ```less
188
+ .label { display: inline-block; margin-right: 8px; }
189
+ .inputEditWrapper { width: 68px; display: inline-block; }
190
+ ```
191
+
192
+ Label и кнопка/input стоят **в одну строку** (inline-block). Без
193
+ grid/flex. Это требование дизайна — "в одну строку".
194
+
195
+ ### Рендер: всегда label + один из (renderButton / renderInput)
196
+
197
+ ```tsx
198
+ <div className={styles.documentNumberEdit}>
199
+ <Text className={styles.label}>{labelText}</Text>
200
+ {editingMode ? renderInput() : renderButton()}
201
+ </div>
202
+ ```
203
+
204
+ **Без анимации перехода** — моментальная замена.
205
+
206
+ ---
207
+
208
+ ## Инварианты
209
+
210
+ - **`editingMode` — внутренний state**. Нет controlled-варианта.
211
+ - **`value` — controlled only** (через проп). Нет defaultValue.
212
+ - **`maxLength: 0..6`** — жёсткое ограничение в типе. Расширять только
213
+ с обновлением `.inputEditWrapper.width` в LESS.
214
+ - **Фильтрация только ASCII-цифр** через `StringUtils.isDigit`.
215
+ - **`caretShift` в `handleInputChange`** — не удалять. Сохраняет
216
+ позицию курсора при фильтрации.
217
+ - **Ссылка `Link href="#" + preventDefault`** — семантичная кнопка
218
+ визуально, без button-стилей. Не заменять на button без
219
+ дизайн-согласования.
220
+ - **Enter и blur выходят из edit-mode**, Esc — нет. Не менять.
221
+ - **Placeholder = "0".repeat(maxLength)** — генерируется из maxLength.
222
+ - **`autoFocus=true`** на SmallInput — обязателен для UX.
223
+ - **`.inputEditWrapper` 68px** — hardcoded под 6 цифр.
224
+ - **НЕТ forwardRef** — известный debt.
225
+ - **НЕТ `data-tx`** — наследованный пропуск.
226
+
227
+ ---
228
+
229
+ ## Accessibility
230
+
231
+ - **Link с href="#"** — семантически ссылка, обнаруживается screen
232
+ reader'ом, фокусируется Tab'ом. Минус — href="#" может быть
233
+ нежелательным для SEO (не актуально для form-виджетов).
234
+ - **Input** — SmallInput со своими ARIA (`aria-label` если передан
235
+ через `...rest`).
236
+ - **Transition между view/edit** — визуальный, не объявляется screen
237
+ reader'у отдельно. Пользователь видит / слышит новую разметку.
238
+ - **Нет live-region** — если input появился асинхронно (а не по
239
+ клику), screen reader может пропустить. В текущем сценарии это
240
+ реакция на клик, поэтому не критично.
241
+ - **Placeholder "000000"** — может сбить с толку, если пользователь
242
+ читает screen reader'ом. Лучше полагаться на `aria-label` через
243
+ rest.
244
+
245
+ ---
246
+
247
+ ## Дизайн-токены
248
+
249
+ **Нет собственных.** Все стили от `SmallInput`, `Link`, `Typography.Text`.
250
+
251
+ ---
252
+
253
+ ## Связанные компоненты
254
+
255
+ - `SmallInput` (`src/components/SmallInput`) — input в edit-mode.
256
+ - `Link` (`src/components/Link`) — кнопка-ссылка.
257
+ - `Typography.Text` — label перед номером.
258
+ - `NumberField` — альтернатива для более "обычных" числовых полей
259
+ (без specific "edit / view" UX).
260
+
261
+ ---
262
+
263
+ ## Stories
264
+
265
+ `stories/DocumentNumberEdit/DocumentNumberEdit.stories.tsx`
266
+ Примеры: `stories/DocumentNumberEdit/examples/`
267
+
268
+ Типовые stories:
269
+ - `Default` — с числом
270
+ - `Empty` — без числа (empty-state UI)
271
+ - `MaxLengths` — разные длины
272
+ - `Playground` — интерактив
273
+
274
+ ---
275
+
276
+ ## История изменений
277
+
278
+ | Дата | Изменение |
279
+ |---|---|
280
+ | 2026-04-18 | Создан документ |