@sberbusiness/triplex-next-mcp-server 1.50.0-beta → 1.53.1

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 (74) hide show
  1. package/README.md +1 -0
  2. package/bundle/components/AlertProcess.md +6 -3
  3. package/bundle/components/AlertProcessSpoiler.md +216 -0
  4. package/bundle/components/Badge.md +4 -3
  5. package/bundle/components/ButtonDropdown.md +5 -3
  6. package/bundle/components/Carousel.md +671 -0
  7. package/bundle/components/CarouselExtended.md +7 -5
  8. package/bundle/components/CarouselIndicators.md +666 -0
  9. package/bundle/components/CarouselItem.md +579 -0
  10. package/bundle/components/CarouselNextButton.md +633 -0
  11. package/bundle/components/CarouselPrevButton.md +633 -0
  12. package/bundle/components/CarouselViewport.md +631 -0
  13. package/bundle/components/CheckboxTreeExtended.md +21 -7
  14. package/bundle/components/CheckboxTreeExtendedCheckbox.md +591 -0
  15. package/bundle/components/CheckboxTreeExtendedNode.md +577 -0
  16. package/bundle/components/Chip.md +1 -0
  17. package/bundle/components/ChipDatePicker.md +332 -0
  18. package/bundle/components/ChipDatePickerTarget.md +316 -0
  19. package/bundle/components/ChipMonthYearPicker.md +4 -3
  20. package/bundle/components/ChipMonthYearPickerTarget.md +318 -0
  21. package/bundle/components/ChipMultiselect.md +63 -73
  22. package/bundle/components/ChipSelect.md +385 -0
  23. package/bundle/components/ChipSelectTarget.md +388 -0
  24. package/bundle/components/ChipSuggest.md +10 -16
  25. package/bundle/components/ChipSuggestTarget.md +506 -0
  26. package/bundle/components/CollapsibleTree.md +2 -1
  27. package/bundle/components/CollapsibleTreeExtended.md +2 -1
  28. package/bundle/components/DateField.md +4 -2
  29. package/bundle/components/DatePickerExtended.md +16 -14
  30. package/bundle/components/DateRange.md +17 -10
  31. package/bundle/components/Dropdown.md +36 -63
  32. package/bundle/components/EmptyView.md +9 -4
  33. package/bundle/components/ExpandAnimation.md +9 -5
  34. package/bundle/components/FormField.md +1 -1
  35. package/bundle/components/ImageGallery.md +19 -52
  36. package/bundle/components/ImageGalleryExtended.md +123 -139
  37. package/bundle/components/ListItemControlsButtonDropdown.md +3 -2
  38. package/bundle/components/LoaderSmall.md +5 -4
  39. package/bundle/components/MonthYearRange.md +334 -0
  40. package/bundle/components/MultiselectField.md +81 -143
  41. package/bundle/components/Notification.md +2 -1
  42. package/bundle/components/NotificationGrouped.md +174 -0
  43. package/bundle/components/NumberField.md +259 -116
  44. package/bundle/components/OrderedList.md +149 -112
  45. package/bundle/components/Overlay.md +3 -2
  46. package/bundle/components/PageIndicators.md +306 -0
  47. package/bundle/components/Pagination.md +81 -3
  48. package/bundle/components/PaginationExtended.md +160 -0
  49. package/bundle/components/Portal.md +5 -2
  50. package/bundle/components/Puller.md +375 -0
  51. package/bundle/components/SMSField.md +277 -102
  52. package/bundle/components/SelectExtendedField.md +11 -7
  53. package/bundle/components/SelectField.md +7 -4
  54. package/bundle/components/SmartSpot.md +259 -0
  55. package/bundle/components/Step.md +2 -1
  56. package/bundle/components/Stepper.md +7 -7
  57. package/bundle/components/Suggest.md +7 -6
  58. package/bundle/components/SuggestField.md +8 -6
  59. package/bundle/components/TableBasic.md +12 -14
  60. package/bundle/components/Tooltip.md +9 -8
  61. package/bundle/guides/commits.md +4 -1
  62. package/bundle/guides/context.md +5 -5
  63. package/bundle/guides/stories.md +29 -21
  64. package/bundle/manifest.json +145 -13
  65. package/bundle/release-notes/1.50.0.mdx +4 -0
  66. package/bundle/release-notes/1.51.0.mdx +57 -0
  67. package/bundle/release-notes/1.52.0.mdx +55 -0
  68. package/bundle/release-notes/1.53.0.mdx +60 -0
  69. package/bundle/release-notes/1.54.0.mdx +45 -0
  70. package/bundle/release-notes/1.55.0.mdx +7 -0
  71. package/bundle/tokens.json +377 -222
  72. package/dist/index.js +39 -1
  73. package/dist/index.js.map +1 -1
  74. package/package.json +1 -1
@@ -96,9 +96,9 @@ Loader: `Element_Background_Brand` использует также `LoaderMiddle
96
96
  - **`displayName = "LoaderSmall"`** — используется в React DevTools.
97
97
  - **Значения `ELoaderSmallTheme`** (`brand` / `neutral`) и наличие `ELoaderSmallSize` в barrel —
98
98
  часть публичного API, удаление или переименование — breaking change.
99
- - **`ILoaderSmallProps` — не только props этого компонента.** `DropdownMobileLoader` строит из
100
- него свой публичный интерфейс: `IDropownMobileLoaderProps extends Omit<ILoaderSmallProps,
101
- "theme" | "size">` (`src/components/Dropdown/mobile/DropdownMobileLoader.tsx:8`). Любое
99
+ - **`ILoaderSmallProps` — не только props этого компонента.** `PullerLoader` строит из
100
+ него свой публичный интерфейс: `IPullerLoaderProps extends Omit<ILoaderSmallProps,
101
+ "theme" | "size">` (`src/components/Puller/PullerLoader.tsx:8`). Любое
102
102
  изменение формы `ILoaderSmallProps` автоматически меняет публичный API и этого компонента.
103
103
  - **Токены `Loader-*` общие для семейства** — переименование ломает темизацию у потребителей
104
104
  и затрагивает `LoaderMiddle`.
@@ -135,7 +135,7 @@ Loader: `Element_Background_Brand` использует также `LoaderMiddle
135
135
  вида `queryByRole("status")` → `null`.
136
136
  Тему выбирает по теме кнопки (`SECONDARY` / `SECONDARY_LIGHT` → `BRAND`,
137
137
  остальные → `NEUTRAL`), размер — по размеру кнопки.
138
- - `Dropdown` (`DropdownList`, `DropdownMobileList`, `DropdownMobileLoader`), `SuggestField`,
138
+ - `Dropdown` (`DropdownList`), `Puller` (`PullerList`, `PullerLoader`), `SuggestField`,
139
139
  `ChipSuggest`, `SelectExtendedField`, `ListItemLoading` — показывают `LoaderSmall` с темой
140
140
  `BRAND` во время подгрузки данных. В `related` не входят: это контракт по рендеру, ссылка
141
141
  стоит с их стороны. `Button` — исключение «потребитель, опирающийся на хрупкую деталь»
@@ -172,6 +172,7 @@ Loader: `Element_Background_Brand` использует также `LoaderMiddle
172
172
  |---|---|
173
173
  | 2026-08-06 | Создан документ. AI-рефакторинг: JSDoc на компоненте, props и значениях `ELoaderSmallTheme`, документирован неиспользуемый `ELoaderSmallSize`, порядок импортов приведён к codestyle, константы-маппинги переименованы в `THEME_TO_CLASS_NAME_MAP` / `SIZE_TO_CLASS_NAME_MAP`, в стилях объединено дублирующееся объявление анимации точек — сама анимация задана один раз на `.dot`, а у `.dot1` / `.dot2` / `.dot3` осталась только `animation-delay` (правило `.dot1` с нулевой задержкой обязательно: без него класс исчезнет из CSS-модуля и из разметки), unit-тесты расширены с 3 до 6 кейсов. В stories `controls: { disable: true }` перенесён на верхний уровень `parameters` — внутри `docs` он не применялся. Публичный API, DOM и визуальное поведение не изменены. |
174
174
  | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListItemLoading`); из `related` убраны потребители `Dropdown`, `SuggestField`, `SelectExtendedField` — ссылка на контракт по рендеру стоит с их стороны; `Button` оставлен как исключение «потребитель, опирающийся на хрупкую деталь». Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
175
+ | 2026-10-21 | Переход на `Puller` (TRIPLEX-961): `IDropownMobileLoaderProps` переименован в `IPullerLoaderProps` и перенесён в `src/components/Puller/PullerLoader.tsx`. |
175
176
 
176
177
  ---
177
178
 
@@ -0,0 +1,334 @@
1
+ ---
2
+ component: MonthYearRange
3
+ category: Date components
4
+ related: [DateRange]
5
+ tokens: []
6
+ stories: stories/MonthYearRange/MonthYearRange.stories.tsx
7
+ version: "1.0"
8
+ ---
9
+
10
+ # MonthYearRange
11
+
12
+ ## Назначение
13
+
14
+ Управляемый диапазон месяцев с двумя полями «от» / «до» и кнопками сдвига обеих границ назад и вперёд. Поля и кнопки предоставляет потребитель через render-props; компонент задаёт раскладку, согласует выбранные границы и выполняет арифметику дат.
15
+
16
+ Используй когда: нужно выбрать период с точностью до месяца и перелистывать его на месяц, квартал или год.
17
+
18
+ Не используй когда: нужен диапазон полных дат с выбором дня — `DateRange`; нужен один месяц — `MonthYearField` или `ChipMonthYearPicker`; нужна только сетка календаря — `Calendar`.
19
+
20
+ ---
21
+
22
+ ## Варианты и props
23
+
24
+ `IMonthYearRangeProps` наследует HTML-атрибуты `div` без `defaultValue` и стандартного `onChange`. Состояние диапазона хранит потребитель: компонент вызывает `onChange`, а новые значения получает через `value`.
25
+
26
+ ### Обязательные props
27
+
28
+ | Prop | Тип | Описание |
29
+ |---|---|---|
30
+ | `value` | `TMonthYearRangeValue` | Кортеж `[start, end]` в формате `format` (по умолчанию `YYYYMMDD`). Пустая строка означает невыбранную границу. |
31
+ | `onChange` | Callback | Получает обе границы при изменении любого поля или сдвиге диапазона. |
32
+ | `renderPickerFrom` | Render-prop | Поле выбора месяца «от». |
33
+ | `renderPickerTo` | Render-prop | Поле выбора месяца «до». |
34
+ | `renderButtonBack` | Render-prop | Кнопка сдвига назад. Обязателен по типу даже при `hideNavigation`. |
35
+ | `renderButtonForward` | Render-prop | Кнопка сдвига вперёд. Обязателен по типу даже при `hideNavigation`. |
36
+
37
+ ### Опциональные props
38
+
39
+ | Prop | По умолчанию | Описание |
40
+ |---|---|---|
41
+ | `format` | `dateFormatYYYYMMDD` | Формат дат moment в `value` и в `onChange` пикеров. Передаётся пикерам в render-props вместе с `value` и `onChange`. |
42
+ | `shiftAmount` | `1` | Величина сдвига обеих границ в единицах `shiftUnit`. |
43
+ | `shiftUnit` | `EMonthYearRangeShiftUnit.MONTH` | `MONTH`, `QUARTER` или `YEAR`: значения enum — строки `month`, `quarter`, `year` для Moment. |
44
+ | `hideNavigation` | `false` | Скрывает обе кнопки: их render-props не вызываются. |
45
+ | `className` | — | Дополнительный класс корневого контейнера, объединяется с внутренним через `clsx`. |
46
+
47
+ ### Значение и согласование границ
48
+
49
+ Формат дат задаёт `format`, по умолчанию — `dateFormatYYYYMMDD` из `src/consts/DateConst.ts`. Хотя поля выбирают месяц, компонент хранит полную дату и не приводит день к первому числу месяца. Допускается неполный диапазон: `["", end]`, `[start, ""]` или `["", ""]`.
50
+
51
+ Обработчики полей сравнивают даты хронологически через `isDateAfter` из `src/components/DateRange/utils.ts`: обе строго парсятся `moment(value, format, true)`, сравнение строк не используется.
52
+
53
+ - новая граница «от» больше непустой «до» → `onChange([date, ""])`;
54
+ - новая граница «до» меньше непустой «от» → `onChange(["", date])`;
55
+ - равные границы сохраняются; если новая или противоположная граница пустая, порядок не проверяется.
56
+
57
+ Если хотя бы одна из сравниваемых дат невалидна в `format`, порядок считается корректным и значение записывается как есть: компонент не валидирует строку пикера в обработчике поля. Потребитель отвечает за формат и исходный порядок `value`.
58
+
59
+ ### Что получают render-props
60
+
61
+ | Поле | Кому передаётся | Контракт |
62
+ |---|---|---|
63
+ | `value` | Пикерам | Соответствующая строка `start` или `end`. |
64
+ | `format` | Пикерам | Значение `format` компонента. При spread в `MonthYearField` задаёт полю тот же формат. |
65
+ | `onChange` | Пикерам | Принимает новую строку и согласует границы по правилам выше. |
66
+ | `children` | Кнопкам | Иконка направления: `CaretleftStrokeSrvIcon20` / `CaretrightStrokeSrvIcon20` с `paletteIndex={5}`. |
67
+ | `className` | Кнопкам | Класс `monthYearRangeButton` из LESS-модуля; отдельный класс `disabled` не добавляется. |
68
+ | `disabled` | Кнопкам | `true`, если хотя бы одна граница пустая. Применить его к DOM-кнопке обязан потребитель. |
69
+ | `onClick` | Кнопкам | Обработчик сдвига; при неполном или невалидном диапазоне не вызывает `onChange`. |
70
+
71
+ В примерах объект пикера целиком передаётся в `MonthYearField`, объект кнопки — в `ButtonIcon`. Собственных props `size`, `status` или `limitRange` у диапазона нет: их настраивают на полях. `format` задаётся на MonthYearRange и приходит в объект пикера. Не задавай `format` полю отдельно: если он стоит в JSX до spread, его перезапишет формат диапазона; если после — формат поля и диапазона разойдутся.
72
+
73
+ ### Сдвиг диапазона
74
+
75
+ - Сдвиг (`shiftDateRange` из `src/components/DateRange/utils.ts`, общий с `DateRange`) строго парсит обе границы через `moment(value, format, true)`. Если хотя бы одна невалидна, функция возвращает `null` и `onChange` не вызывается.
76
+ - Кнопка назад сдвигает границы на `-shiftAmount`, вперёд — на `shiftAmount` через `Moment.add`. Обе границы сдвигаются независимо на одну величину; день сохраняется или сокращается до последнего дня целевого месяца. Например, `20240331` минус месяц → `20240229`, `20240229` плюс год → `20250228`.
77
+ - `shiftAmount` передаётся в Moment без проверки: рассчитан на целые положительные значения, отрицательное меняет направление кнопок.
78
+ - Сдвиг не исправляет порядок входного кортежа и не проверяет ограничения календаря `limitRange`. Потребитель согласует их с полями самостоятельно.
79
+ - Результат сериализуется обратно в `format`. Сдвиг на месяц, квартал или год может изменить длину диапазона в днях.
80
+
81
+ ### Корневой элемент
82
+
83
+ `ref` указывает на корневой `div`. Остальные HTML-атрибуты (`id`, `data-*`, `aria-*`, `style`, обработчики событий) передаются на этот же элемент. `children` допускается унаследованным типом, но содержимое контейнера задаётся render-props и иконкой-разделителем.
84
+
85
+ ---
86
+
87
+ ## Дизайн-токены
88
+
89
+ Собственных дизайн-токенов нет: `styles/MonthYearRange.module.less` задаёт только flex-раскладку, `z-index` кнопок и размер разделителя 16 × 16 px. Цвета иконок задаются `paletteIndex={5}`.
90
+
91
+ Внешний вид полей и кнопок зависит от компонентов, возвращённых из render-props. Их токены переопределяются через `ThemeProvider`; см. `MonthYearField-ai.md`, `ButtonIcon-ai.md` и `ThemeProvider-ai.md`.
92
+
93
+ ---
94
+
95
+ ## Инварианты
96
+
97
+ - `forwardRef` обязателен; корневой DOM-элемент и ref-target — `HTMLDivElement`.
98
+ - Публичные имена `MonthYearRange`, `IMonthYearRangeProps`, `IMonthYearRangeButtonProvideProps`, `IMonthYearRangePickerProvideProps`, `TMonthYearRangeValue` и `EMonthYearRangeShiftUnit` экспортируются через `src/components/MonthYearRange/index.ts`; интерфейсы и `TMonthYearRangeValue` живут в `types.ts`, компонент — в `MonthYearRange.tsx`, enum — в `enums.ts`. Имена, типы и enum-значения нельзя менять без согласования. Собственного `utils.ts` нет: сравнение и сдвиг импортируются из `DateRange/utils.ts`, поэтому значения `EMonthYearRangeShiftUnit` должны оставаться строковыми единицами `moment`.
99
+ - Формат по умолчанию `YYYYMMDD` и пустая строка как невыбранная граница — часть контракта. `value` и аргумент `onChange` пикера должны быть в формате `format`.
100
+ - `disabled` кнопок зависит только от пустых границ; невалидные даты блокирует сам обработчик сдвига.
101
+ - Порядок содержимого: кнопка назад → поле «от» → иконка-разделитель → поле «до» → кнопка вперёд. `hideNavigation` исключает вызовы обоих render-props кнопок.
102
+ - `displayName` — `"MonthYearRange"`; React 17-совместимость сохраняется, React 18-only API не добавлять.
103
+ - Story IDs `components-date-components-monthyearrange--*` связаны с baseline `__screenshots__/date-components-monthyearrange--{story}--{xs|xl}.png`: test-runner удаляет префикс `components-` из имени файла. Не переименовывать stories без обновления скриншот-тестов.
104
+
105
+ ---
106
+
107
+ ## Accessibility
108
+
109
+ - Корневой `div` — контейнер без собственной роли, фокус-менеджмента или клавиатурной навигации. Переданные `aria-*` относятся к нему.
110
+ - Доступные имена полей «от» / «до» и кнопок с иконками задаёт потребитель. В `renderButtonBack` / `renderButtonForward` следует передать локализованные `aria-label` или `title`; компонент текста не добавляет.
111
+ - Переданный render-prop `disabled` нужно применить к нативной кнопке. Даже если потребитель его проигнорирует, обработчик дополнительно блокирует сдвиг неполного диапазона.
112
+ - Поведение полей, календаря, сообщения об ошибке и порядок табуляции определяются возвращёнными компонентами. Собственного `aria-live` и автоматического объявления изменённого диапазона нет.
113
+
114
+ ---
115
+
116
+ ## Связанные компоненты
117
+
118
+ - `DateRange` — альтернатива для диапазона полных дат. Имеет похожий render-prop API и дополнительные единицы сдвига `DAY` / `WEEK`; валидность дат перед сдвигом проверяет так же.
119
+ - `MonthYearField` — поле выбора одного месяца, используемое в примерах для обеих границ. Компонент диапазона не импортирует его напрямую.
120
+ - `ButtonIcon` — кнопка для переданных иконки, класса, `disabled` и `onClick` в примерах; доступное имя добавляет потребитель.
121
+
122
+ В `related` включён `DateRange` как альтернатива. Поля и кнопки выбирает потребитель, прямой зависимости по рендеру или наследования их интерфейсов в MonthYearRange нет.
123
+
124
+ ---
125
+
126
+ ## Stories
127
+
128
+ Основные истории: `stories/MonthYearRange/MonthYearRange.stories.tsx`
129
+ Файлы примеров: `stories/MonthYearRange/examples/`
130
+
131
+ | Story | Example file | Что демонстрирует |
132
+ |---|---|---|
133
+ | `Playground` | `Playground.tsx` | Интерактивное управление `shiftAmount`, `shiftUnit` и `hideNavigation`. |
134
+ | `Default` | `Default.tsx` | Два пустых `MonthYearField`, неактивные кнопки и сдвиг на месяц. |
135
+ | `Sizes` | `Sizes.tsx` | Поля SM / MD / LG; размер задаётся полям в render-props. |
136
+ | `WithoutNavigation` | `WithoutNavigation.tsx` | Только поля и разделитель; кнопки скрыты. |
137
+ | `Production` | `Production.tsx` | Пример `Example: production`: поля с `HelpBox` в постфиксе. |
138
+ | `VisualTests` | `VisualTests.tsx` | Заполненный диапазон `["19700101", "19700101"]` с активными кнопками. |
139
+
140
+ `Playground` исключён из скриншот-тестов. Остальные пять stories покрыты десятью baseline для viewport xs / xl в `__screenshots__/`. `Playground` и `VisualTests` не включаются в MCP bundle.
141
+
142
+ ---
143
+
144
+ ## История изменений
145
+
146
+ | Дата | Изменение |
147
+ |---|---|
148
+ | 2026-10-08 | Создан документ |
149
+ | 2026-10-15 | Добавлен prop `format` (по умолчанию `YYYYMMDD`), передаётся пикерам в render-props (`IMonthYearRangePickerProvideProps.format`). Границы сравниваются хронологически вместо сравнения строк. Сравнение и сдвиг используют `isDateAfter` и `shiftDateRange` из `DateRange/utils.ts`. Интерфейсы props и `TMonthYearRangeValue` вынесены в `types.ts` |
150
+
151
+ ---
152
+
153
+ ## Примеры использования
154
+
155
+ ### Default
156
+
157
+ `stories/MonthYearRange/examples/Default.tsx`
158
+
159
+ ```tsx
160
+ import React, { useState } from "react";
161
+ import {
162
+ ButtonIcon,
163
+ MonthYearField,
164
+ MonthYearRange,
165
+ EMonthYearRangeShiftUnit,
166
+ IMonthYearRangeButtonProvideProps,
167
+ IMonthYearRangePickerProvideProps,
168
+ TMonthYearRangeValue,
169
+ } from "@sberbusiness/triplex-next";
170
+
171
+ export const Default = () => {
172
+ const [value, setValue] = useState<TMonthYearRangeValue>(["", ""]);
173
+ const renderPicker = (props: IMonthYearRangePickerProvideProps) => (
174
+ <MonthYearField label="Label" placeholder="Select to proceed" {...props} />
175
+ );
176
+ const renderButton = (props: IMonthYearRangeButtonProvideProps) => <ButtonIcon {...props} />;
177
+
178
+ return (
179
+ <div style={{ maxWidth: "400px" }}>
180
+ <MonthYearRange
181
+ value={value}
182
+ onChange={setValue}
183
+ shiftAmount={1}
184
+ shiftUnit={EMonthYearRangeShiftUnit.MONTH}
185
+ renderPickerFrom={renderPicker}
186
+ renderPickerTo={renderPicker}
187
+ renderButtonBack={renderButton}
188
+ renderButtonForward={renderButton}
189
+ />
190
+ </div>
191
+ );
192
+ };
193
+ ```
194
+
195
+ ### Sizes
196
+
197
+ `stories/MonthYearRange/examples/Sizes.tsx`
198
+
199
+ ```tsx
200
+ import React, { useState } from "react";
201
+ import {
202
+ ButtonIcon,
203
+ MonthYearField,
204
+ MonthYearRange,
205
+ EMonthYearRangeShiftUnit,
206
+ IMonthYearRangeButtonProvideProps,
207
+ IMonthYearRangePickerProvideProps,
208
+ TMonthYearRangeValue,
209
+ EComponentSize,
210
+ } from "@sberbusiness/triplex-next";
211
+
212
+ interface ISizeItemProps {
213
+ size: EComponentSize;
214
+ }
215
+
216
+ const SizeItem = ({ size }: ISizeItemProps) => {
217
+ const [value, setValue] = useState<TMonthYearRangeValue>(["", ""]);
218
+
219
+ const renderPicker = (props: IMonthYearRangePickerProvideProps) => (
220
+ <MonthYearField label="Label" placeholder="Select to proceed" size={size} {...props} />
221
+ );
222
+ const renderButton = (props: IMonthYearRangeButtonProvideProps) => <ButtonIcon {...props} />;
223
+
224
+ return (
225
+ <div style={{ maxWidth: 500 }}>
226
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{size.toUpperCase()}</div>
227
+ <MonthYearRange
228
+ value={value}
229
+ onChange={setValue}
230
+ shiftAmount={1}
231
+ shiftUnit={EMonthYearRangeShiftUnit.MONTH}
232
+ renderPickerFrom={renderPicker}
233
+ renderPickerTo={renderPicker}
234
+ renderButtonBack={renderButton}
235
+ renderButtonForward={renderButton}
236
+ />
237
+ </div>
238
+ );
239
+ };
240
+
241
+ const SIZES = Object.values(EComponentSize);
242
+
243
+ export const Sizes = () => (
244
+ <div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
245
+ {SIZES.map((size) => (
246
+ <SizeItem key={size} size={size} />
247
+ ))}
248
+ </div>
249
+ );
250
+ ```
251
+
252
+ ### WithoutNavigation
253
+
254
+ `stories/MonthYearRange/examples/WithoutNavigation.tsx`
255
+
256
+ ```tsx
257
+ import React, { useState } from "react";
258
+ import {
259
+ MonthYearField,
260
+ MonthYearRange,
261
+ IMonthYearRangePickerProvideProps,
262
+ TMonthYearRangeValue,
263
+ } from "@sberbusiness/triplex-next";
264
+
265
+ export const WithoutNavigation = () => {
266
+ const [value, setValue] = useState<TMonthYearRangeValue>(["", ""]);
267
+ const renderPicker = (props: IMonthYearRangePickerProvideProps) => (
268
+ <MonthYearField label="Label" placeholder="Select to proceed" {...props} />
269
+ );
270
+
271
+ return (
272
+ <div style={{ maxWidth: "300px" }}>
273
+ <MonthYearRange
274
+ value={value}
275
+ onChange={setValue}
276
+ hideNavigation
277
+ renderPickerFrom={renderPicker}
278
+ renderPickerTo={renderPicker}
279
+ renderButtonBack={() => null}
280
+ renderButtonForward={() => null}
281
+ />
282
+ </div>
283
+ );
284
+ };
285
+ ```
286
+
287
+ ### Production
288
+
289
+ `stories/MonthYearRange/examples/Production.tsx`
290
+
291
+ ```tsx
292
+ import React, { useState } from "react";
293
+ import {
294
+ ButtonIcon,
295
+ MonthYearField,
296
+ MonthYearRange,
297
+ EMonthYearRangeShiftUnit,
298
+ IMonthYearRangeButtonProvideProps,
299
+ IMonthYearRangePickerProvideProps,
300
+ TMonthYearRangeValue,
301
+ HelpBox,
302
+ ETooltipSize,
303
+ } from "@sberbusiness/triplex-next";
304
+
305
+ export const Production = () => {
306
+ const [value, setValue] = useState<TMonthYearRangeValue>(["", ""]);
307
+
308
+ const renderPicker = (props: IMonthYearRangePickerProvideProps) => (
309
+ <MonthYearField
310
+ label="Label"
311
+ placeholder="Select to proceed"
312
+ targetProps={{ postfix: <HelpBox tooltipSize={ETooltipSize.SM}>HelpBox text</HelpBox>, inputProps: {} }}
313
+ {...props}
314
+ />
315
+ );
316
+ const renderButton = (props: IMonthYearRangeButtonProvideProps) => <ButtonIcon {...props} />;
317
+
318
+ return (
319
+ <div style={{ maxWidth: 660 }}>
320
+ <MonthYearRange
321
+ value={value}
322
+ onChange={setValue}
323
+ shiftAmount={1}
324
+ shiftUnit={EMonthYearRangeShiftUnit.MONTH}
325
+ renderPickerFrom={renderPicker}
326
+ renderPickerTo={renderPicker}
327
+ renderButtonBack={renderButton}
328
+ renderButtonForward={renderButton}
329
+ />
330
+ </div>
331
+ );
332
+ };
333
+ ```
334
+