@skbkontur/react-ui 0.0.0-a5ba2462c5 → 0.0.0-a6f09fbded

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 (246) hide show
  1. package/CHANGELOG.md +0 -30
  2. package/cjs/components/Autocomplete/Autocomplete.md +113 -0
  3. package/cjs/components/Button/Button.md +261 -0
  4. package/cjs/components/Calendar/Calendar.md +276 -0
  5. package/cjs/components/Calendar/CalendarDay.md +70 -0
  6. package/cjs/components/Center/Center.md +26 -0
  7. package/cjs/components/Checkbox/Checkbox.md +171 -0
  8. package/cjs/components/ComboBox/ComboBox.d.ts +11 -5
  9. package/cjs/components/ComboBox/ComboBox.js +10 -1
  10. package/cjs/components/ComboBox/ComboBox.js.map +1 -1
  11. package/cjs/components/ComboBox/ComboBox.md +574 -0
  12. package/cjs/components/CurrencyInput/CurrencyInput.md +39 -0
  13. package/cjs/components/CurrencyLabel/CurrencyLabel.js +2 -2
  14. package/cjs/components/CurrencyLabel/CurrencyLabel.js.map +1 -1
  15. package/cjs/components/CurrencyLabel/CurrencyLabel.md +29 -0
  16. package/cjs/components/DateInput/DateInput.md +111 -0
  17. package/cjs/components/DatePicker/DatePicker.md +368 -0
  18. package/cjs/components/Dropdown/Dropdown.md +45 -0
  19. package/cjs/components/DropdownMenu/DropdownMenu.md +290 -0
  20. package/cjs/components/FileUploader/FileUploader.md +131 -0
  21. package/cjs/components/FxInput/FxInput.md +31 -0
  22. package/cjs/components/Gapped/Gapped.md +44 -0
  23. package/cjs/components/GlobalLoader/GlobalLoader.md +97 -0
  24. package/cjs/components/Group/Group.md +19 -0
  25. package/cjs/components/Hint/Hint.md +86 -0
  26. package/cjs/components/Input/Input.md +86 -0
  27. package/cjs/components/Input/InputLayout/InputLayout.d.ts +1 -0
  28. package/cjs/components/Input/InputLayout/InputLayout.js +4 -2
  29. package/cjs/components/Input/InputLayout/InputLayout.js.map +1 -1
  30. package/cjs/components/Kebab/Kebab.md +306 -0
  31. package/cjs/components/Link/Link.md +182 -0
  32. package/cjs/components/Loader/Loader.md +33 -0
  33. package/cjs/components/MaskedInput/MaskedInput.d.ts +0 -8
  34. package/cjs/components/MaskedInput/MaskedInput.js +2 -23
  35. package/cjs/components/MaskedInput/MaskedInput.js.map +1 -1
  36. package/cjs/components/MaskedInput/MaskedInput.md +114 -0
  37. package/cjs/components/MenuFooter/MenuFooter.md +27 -0
  38. package/cjs/components/MenuHeader/MenuHeader.md +35 -0
  39. package/cjs/components/MenuItem/MenuItem.md +139 -0
  40. package/cjs/components/MenuSeparator/MenuSeparator.md +14 -0
  41. package/cjs/components/MiniModal/MiniModal.md +231 -0
  42. package/cjs/components/Modal/Modal.md +56 -0
  43. package/cjs/components/Paging/Paging.md +57 -0
  44. package/cjs/components/PasswordInput/PasswordInput.md +29 -0
  45. package/cjs/components/Radio/Radio.md +57 -0
  46. package/cjs/components/RadioGroup/RadioGroup.md +44 -0
  47. package/cjs/components/ResponsiveLayout/ResponsiveLayout.md +75 -0
  48. package/cjs/components/ScrollContainer/ScrollContainer.md +224 -0
  49. package/cjs/components/Select/Select.md +113 -0
  50. package/cjs/components/SidePage/SidePage.md +65 -0
  51. package/cjs/components/SingleToast/SingleToast.md +36 -0
  52. package/cjs/components/Spinner/Spinner.md +36 -0
  53. package/cjs/components/Sticky/Sticky.md +28 -0
  54. package/cjs/components/Switcher/Switcher.md +111 -0
  55. package/cjs/components/Tabs/Tab.md +73 -0
  56. package/cjs/components/Tabs/Tabs.md +54 -0
  57. package/cjs/components/Textarea/Textarea.d.ts +6 -1
  58. package/cjs/components/Textarea/Textarea.js +16 -3
  59. package/cjs/components/Textarea/Textarea.js.map +1 -1
  60. package/cjs/components/Textarea/Textarea.md +58 -0
  61. package/cjs/components/Textarea/Textarea.styles.js +2 -1
  62. package/cjs/components/Textarea/Textarea.styles.js.map +1 -1
  63. package/cjs/components/Toast/Toast.md +69 -0
  64. package/cjs/components/Toggle/Toggle.md +110 -0
  65. package/cjs/components/Token/Token.md +48 -0
  66. package/cjs/components/TokenInput/TokenInput.md +277 -0
  67. package/cjs/components/Tooltip/Tooltip.d.ts +1 -1
  68. package/cjs/components/Tooltip/Tooltip.js +6 -8
  69. package/cjs/components/Tooltip/Tooltip.js.map +1 -1
  70. package/cjs/components/Tooltip/Tooltip.md +322 -0
  71. package/cjs/components/TooltipMenu/TooltipMenu.md +241 -0
  72. package/cjs/internal/ClearCrossIcon/ClearCrossIcon.d.ts +1 -0
  73. package/cjs/internal/ClearCrossIcon/ClearCrossIcon.js +16 -7
  74. package/cjs/internal/ClearCrossIcon/ClearCrossIcon.js.map +1 -1
  75. package/cjs/internal/ClearCrossIcon/ClearCrossIcon.styles.d.ts +3 -0
  76. package/cjs/internal/ClearCrossIcon/ClearCrossIcon.styles.js +27 -9
  77. package/cjs/internal/ClearCrossIcon/ClearCrossIcon.styles.js.map +1 -1
  78. package/cjs/internal/CustomComboBox/ComboBoxView.d.ts +7 -6
  79. package/cjs/internal/CustomComboBox/ComboBoxView.js +2 -7
  80. package/cjs/internal/CustomComboBox/ComboBoxView.js.map +1 -1
  81. package/cjs/internal/CustomComboBox/CustomComboBox.d.ts +6 -5
  82. package/cjs/internal/CustomComboBox/CustomComboBox.js +1 -3
  83. package/cjs/internal/CustomComboBox/CustomComboBox.js.map +1 -1
  84. package/cjs/internal/CustomComboBox/getComboBoxTheme.d.ts +2 -1
  85. package/cjs/internal/CustomComboBox/getComboBoxTheme.js +10 -7
  86. package/cjs/internal/CustomComboBox/getComboBoxTheme.js.map +1 -1
  87. package/cjs/internal/DataTids/DATATIDS.md +12 -0
  88. package/cjs/internal/DataTids/DataTids.d.ts +12 -0
  89. package/cjs/internal/DataTids/DataTids.js +50 -0
  90. package/cjs/internal/DataTids/DataTids.js.map +1 -0
  91. package/cjs/internal/DataTids/DataTids.styles.d.ts +7 -0
  92. package/cjs/internal/DataTids/DataTids.styles.js +42 -0
  93. package/cjs/internal/DataTids/DataTids.styles.js.map +1 -0
  94. package/cjs/internal/DataTids/componentsDataTids.d.ts +5 -0
  95. package/cjs/internal/DataTids/componentsDataTids.js +15 -0
  96. package/cjs/internal/DataTids/componentsDataTids.js.map +1 -0
  97. package/cjs/internal/InputLikeText/InputLikeText.styles.d.ts +1 -0
  98. package/cjs/internal/InputLikeText/InputLikeText.styles.js +12 -4
  99. package/cjs/internal/InputLikeText/InputLikeText.styles.js.map +1 -1
  100. package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.d.ts +37 -0
  101. package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.js +235 -0
  102. package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.js.map +1 -0
  103. package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles.d.ts +3 -0
  104. package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles.js +10 -0
  105. package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles.js.map +1 -0
  106. package/cjs/internal/ThemePlayground/Playground.md +7 -0
  107. package/cjs/internal/ThemeShowcase/VariablesCollector.d.ts +1 -1
  108. package/cjs/internal/themes/BasicTheme.d.ts +2 -0
  109. package/cjs/internal/themes/BasicTheme.js +11 -6
  110. package/cjs/internal/themes/BasicTheme.js.map +1 -1
  111. package/cjs/internal/themes/DarkTheme5_4.js +10 -3
  112. package/cjs/internal/themes/DarkTheme5_4.js.map +1 -1
  113. package/cjs/internal/themes/LightTheme5_4.js +10 -3
  114. package/cjs/internal/themes/LightTheme5_4.js.map +1 -1
  115. package/cjs/internal/themes/consts.d.ts +7 -0
  116. package/cjs/internal/themes/consts.js +7 -0
  117. package/cjs/internal/themes/consts.js.map +1 -0
  118. package/cjs/lib/featureFlagsContext/FEATUREFLAGSCONTEXT.md +64 -0
  119. package/cjs/lib/locale/LOCALECONTEXT.md +222 -0
  120. package/cjs/lib/theming/ThemeContext.md +265 -0
  121. package/components/Autocomplete/Autocomplete.md +113 -0
  122. package/components/Button/Button.md +261 -0
  123. package/components/Calendar/Calendar.md +276 -0
  124. package/components/Calendar/CalendarDay.md +70 -0
  125. package/components/Center/Center.md +26 -0
  126. package/components/Checkbox/Checkbox.md +171 -0
  127. package/components/ComboBox/ComboBox/ComboBox.js +2 -1
  128. package/components/ComboBox/ComboBox/ComboBox.js.map +1 -1
  129. package/components/ComboBox/ComboBox.d.ts +11 -5
  130. package/components/ComboBox/ComboBox.md +574 -0
  131. package/components/CurrencyInput/CurrencyInput.md +39 -0
  132. package/components/CurrencyLabel/CurrencyLabel/CurrencyLabel.js +1 -1
  133. package/components/CurrencyLabel/CurrencyLabel/CurrencyLabel.js.map +1 -1
  134. package/components/CurrencyLabel/CurrencyLabel.md +29 -0
  135. package/components/DateInput/DateInput.md +111 -0
  136. package/components/DatePicker/DatePicker.md +368 -0
  137. package/components/Dropdown/Dropdown.md +45 -0
  138. package/components/DropdownMenu/DropdownMenu.md +290 -0
  139. package/components/FileUploader/FileUploader.md +131 -0
  140. package/components/FxInput/FxInput.md +31 -0
  141. package/components/Gapped/Gapped.md +44 -0
  142. package/components/GlobalLoader/GlobalLoader.md +97 -0
  143. package/components/Group/Group.md +19 -0
  144. package/components/Hint/Hint.md +86 -0
  145. package/components/Input/Input.md +86 -0
  146. package/components/Input/InputLayout/InputLayout/InputLayout.js +5 -2
  147. package/components/Input/InputLayout/InputLayout/InputLayout.js.map +1 -1
  148. package/components/Input/InputLayout/InputLayout.d.ts +1 -0
  149. package/components/Kebab/Kebab.md +306 -0
  150. package/components/Link/Link.md +182 -0
  151. package/components/Loader/Loader.md +33 -0
  152. package/components/MaskedInput/MaskedInput/MaskedInput.js +1 -11
  153. package/components/MaskedInput/MaskedInput/MaskedInput.js.map +1 -1
  154. package/components/MaskedInput/MaskedInput.d.ts +0 -8
  155. package/components/MaskedInput/MaskedInput.md +114 -0
  156. package/components/MenuFooter/MenuFooter.md +27 -0
  157. package/components/MenuHeader/MenuHeader.md +35 -0
  158. package/components/MenuItem/MenuItem.md +139 -0
  159. package/components/MenuSeparator/MenuSeparator.md +14 -0
  160. package/components/MiniModal/MiniModal.md +231 -0
  161. package/components/Modal/Modal.md +56 -0
  162. package/components/Paging/Paging.md +57 -0
  163. package/components/PasswordInput/PasswordInput.md +29 -0
  164. package/components/Radio/Radio.md +57 -0
  165. package/components/RadioGroup/RadioGroup.md +44 -0
  166. package/components/ResponsiveLayout/ResponsiveLayout.md +75 -0
  167. package/components/ScrollContainer/ScrollContainer.md +224 -0
  168. package/components/Select/Select.md +113 -0
  169. package/components/SidePage/SidePage.md +65 -0
  170. package/components/SingleToast/SingleToast.md +36 -0
  171. package/components/Spinner/Spinner.md +36 -0
  172. package/components/Sticky/Sticky.md +28 -0
  173. package/components/Switcher/Switcher.md +111 -0
  174. package/components/Tabs/Tab.md +73 -0
  175. package/components/Tabs/Tabs.md +54 -0
  176. package/components/Textarea/Textarea/Textarea.js +11 -2
  177. package/components/Textarea/Textarea/Textarea.js.map +1 -1
  178. package/components/Textarea/Textarea.d.ts +6 -1
  179. package/components/Textarea/Textarea.md +58 -0
  180. package/components/Textarea/Textarea.styles/Textarea.styles.js +1 -1
  181. package/components/Textarea/Textarea.styles/Textarea.styles.js.map +1 -1
  182. package/components/Toast/Toast.md +69 -0
  183. package/components/Toggle/Toggle.md +110 -0
  184. package/components/Token/Token.md +48 -0
  185. package/components/TokenInput/TokenInput.md +277 -0
  186. package/components/Tooltip/Tooltip/Tooltip.js +4 -7
  187. package/components/Tooltip/Tooltip/Tooltip.js.map +1 -1
  188. package/components/Tooltip/Tooltip.d.ts +1 -1
  189. package/components/Tooltip/Tooltip.md +322 -0
  190. package/components/TooltipMenu/TooltipMenu.md +241 -0
  191. package/internal/ClearCrossIcon/ClearCrossIcon/ClearCrossIcon.js +21 -7
  192. package/internal/ClearCrossIcon/ClearCrossIcon/ClearCrossIcon.js.map +1 -1
  193. package/internal/ClearCrossIcon/ClearCrossIcon.d.ts +1 -0
  194. package/internal/ClearCrossIcon/ClearCrossIcon.styles/ClearCrossIcon.styles.js +14 -5
  195. package/internal/ClearCrossIcon/ClearCrossIcon.styles/ClearCrossIcon.styles.js.map +1 -1
  196. package/internal/ClearCrossIcon/ClearCrossIcon.styles.d.ts +3 -0
  197. package/internal/CustomComboBox/ComboBoxView/ComboBoxView.js +44 -51
  198. package/internal/CustomComboBox/ComboBoxView/ComboBoxView.js.map +1 -1
  199. package/internal/CustomComboBox/ComboBoxView.d.ts +7 -6
  200. package/internal/CustomComboBox/CustomComboBox/CustomComboBox.js +3 -5
  201. package/internal/CustomComboBox/CustomComboBox/CustomComboBox.js.map +1 -1
  202. package/internal/CustomComboBox/CustomComboBox.d.ts +6 -5
  203. package/internal/CustomComboBox/getComboBoxTheme/getComboBoxTheme.js +5 -3
  204. package/internal/CustomComboBox/getComboBoxTheme/getComboBoxTheme.js.map +1 -1
  205. package/internal/CustomComboBox/getComboBoxTheme.d.ts +2 -1
  206. package/internal/DataTids/DATATIDS.md +12 -0
  207. package/internal/DataTids/DataTids/DataTids.js +69 -0
  208. package/internal/DataTids/DataTids/DataTids.js.map +1 -0
  209. package/internal/DataTids/DataTids/package.json +6 -0
  210. package/internal/DataTids/DataTids.d.ts +12 -0
  211. package/internal/DataTids/DataTids.styles/DataTids.styles.js +20 -0
  212. package/internal/DataTids/DataTids.styles/DataTids.styles.js.map +1 -0
  213. package/internal/DataTids/DataTids.styles/package.json +6 -0
  214. package/internal/DataTids/DataTids.styles.d.ts +7 -0
  215. package/internal/DataTids/componentsDataTids/componentsDataTids.js +12 -0
  216. package/internal/DataTids/componentsDataTids/componentsDataTids.js.map +1 -0
  217. package/internal/DataTids/componentsDataTids/package.json +6 -0
  218. package/internal/DataTids/componentsDataTids.d.ts +5 -0
  219. package/internal/InputLikeText/InputLikeText.styles/InputLikeText.styles.js +7 -4
  220. package/internal/InputLikeText/InputLikeText.styles/InputLikeText.styles.js.map +1 -1
  221. package/internal/InputLikeText/InputLikeText.styles.d.ts +1 -0
  222. package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout/InternalTextareaWithLayout.js +249 -0
  223. package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout/InternalTextareaWithLayout.js.map +1 -0
  224. package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout/package.json +6 -0
  225. package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.d.ts +37 -0
  226. package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles/InternalTextareaWithLayout.styles.js +8 -0
  227. package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles/InternalTextareaWithLayout.styles.js.map +1 -0
  228. package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles/package.json +6 -0
  229. package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles.d.ts +3 -0
  230. package/internal/ThemePlayground/Playground.md +7 -0
  231. package/internal/ThemeShowcase/VariablesCollector.d.ts +1 -1
  232. package/internal/themes/BasicTheme/BasicTheme.js +4 -4
  233. package/internal/themes/BasicTheme/BasicTheme.js.map +1 -1
  234. package/internal/themes/BasicTheme.d.ts +2 -0
  235. package/internal/themes/DarkTheme5_4/DarkTheme5_4.js +4 -2
  236. package/internal/themes/DarkTheme5_4/DarkTheme5_4.js.map +1 -1
  237. package/internal/themes/LightTheme5_4/LightTheme5_4.js +4 -2
  238. package/internal/themes/LightTheme5_4/LightTheme5_4.js.map +1 -1
  239. package/internal/themes/consts/consts.js +7 -0
  240. package/internal/themes/consts/consts.js.map +1 -0
  241. package/internal/themes/consts/package.json +6 -0
  242. package/internal/themes/consts.d.ts +7 -0
  243. package/lib/featureFlagsContext/FEATUREFLAGSCONTEXT.md +64 -0
  244. package/lib/locale/LOCALECONTEXT.md +222 -0
  245. package/lib/theming/ThemeContext.md +265 -0
  246. package/package.json +6 -1
@@ -0,0 +1,182 @@
1
+ ### Базовый пример
2
+
3
+ ```jsx harmony
4
+ <Link href="https://kontur.ru" target="_blank">Обычная ссылка</Link>
5
+ ```
6
+
7
+ ### Корневой элемент
8
+ Cсылка может рендерить кнопку в качестве корневого элемента, c помощью пропа `component`. Cсылка принимает все пропы переданного в `component` компонента.
9
+ Рекомендуется к использованию вместо кнопки с `use=link`, если нужна кнопка с визуалом ссылки.
10
+
11
+ ```jsx harmony
12
+ import { Link } from '@skbkontur/react-ui';
13
+
14
+ <Link component='button'>Кнопка, но выглядит как ссылка</Link>
15
+ ```
16
+
17
+ ### Проп `component`
18
+ С помощью пропа `component`, ссылка может рендерить компонент `Link` из `react router` в качестве корневого элемента.
19
+
20
+ ```jsx static
21
+ import { Link } from '@skbkontur/react-ui';
22
+ import { Link as RouterLink, BrowserRouter } from 'react-router-dom';
23
+
24
+ <BrowserRouter>
25
+ <Link to='/dashboard' component={RouterLink}>react-router-dom link</Link>
26
+ </BrowserRouter>
27
+ ```
28
+
29
+ ### Стили и disabled
30
+
31
+ ```jsx harmony
32
+ import { Gapped } from '@skbkontur/react-ui';
33
+
34
+ <Gapped gap={15}>
35
+ <Link>Обычная ссылка</Link>
36
+ <Link use="success">Успешная ссылка</Link>
37
+ <Link use="danger">Опасная ссылка</Link>
38
+ <Link use="grayed">Работающая ссылка серого цвета</Link>
39
+ <Link disabled>Отключенная ссылка</Link>
40
+ </Gapped>;
41
+ ```
42
+
43
+ ### Иконка
44
+
45
+ ```jsx harmony
46
+ import { Gapped } from '@skbkontur/react-ui';
47
+ import { CheckAIcon16Light } from '@skbkontur/icons/CheckAIcon16Light';
48
+
49
+ <Gapped gap={20}>
50
+ <Link icon={<CheckAIcon16Light />}>Ссылка с иконкой слева</Link>
51
+ <Link icon={<CheckAIcon16Light />} rightIcon={<CheckAIcon16Light />}>Ссылка с двумя иконками</Link>
52
+ <Link rightIcon={<CheckAIcon16Light />}>Ссылка с иконкой справа</Link>
53
+ </Gapped>
54
+ ```
55
+
56
+ ### Ссылки, ведущие на внешние ресурсы
57
+
58
+ _Примечание_:
59
+
60
+ Если в контрол `Link` передана ссылка, ведущая на внешний ресурс, контрол `Link` неявно добавит атрибут `rel` со значением необходимым для внешних ссылок, при этом не трогая атрибут `target`.
61
+
62
+ Открытие ссылки в новой вкладке остаётся на усмотрение разработчика.
63
+
64
+ ```jsx harmony
65
+ import { Gapped } from '@skbkontur/react-ui';
66
+
67
+ <Gapped>
68
+ <Link href="https://www.youtube.com/">
69
+ Откроется <span style={{ color: "#e3071c" }}>в этой</span> вкладке
70
+ </Link>
71
+ <Link target="_blank" href="https://www.youtube.com/">
72
+ Откроется <span style={{ color: "#3f9726" }}>в новой</span> вкладке
73
+ </Link>
74
+ </Gapped>
75
+ ```
76
+
77
+ ### Состояние загрузки
78
+
79
+ **Поведение**: если у ссылки есть иконка, она заменяется на спиннер, когда иконки две заменяется только левая.
80
+
81
+ ```jsx harmony
82
+ import { Gapped, Button } from '@skbkontur/react-ui';
83
+ import { CheckAIcon16Light } from '@skbkontur/icons/CheckAIcon16Light';
84
+
85
+ const [isLoading, setIsLoading] = React.useState(false);
86
+
87
+ <Gapped vertical gap={15}>
88
+ <Button onClick={() => setIsLoading(!isLoading)}>{isLoading ? "Прекратить загрузку!" : "Начать загрузку!"}</Button>
89
+ <Gapped gap={20}>
90
+ <Link loading={isLoading} icon={<CheckAIcon16Light />}>С иконкой слева</Link>
91
+ <Link loading={isLoading} icon={<CheckAIcon16Light />} rightIcon={<CheckAIcon16Light />}>С двумя иконками</Link>
92
+ <Link loading={isLoading} rightIcon={<CheckAIcon16Light />}>С иконкой справа</Link>
93
+ <Link loading={isLoading}>Без иконки</Link>
94
+ </Gapped>
95
+ </Gapped>
96
+ ```
97
+
98
+ ### Кастомное действие при нажатии
99
+
100
+ ```jsx harmony
101
+ import { Toast } from '@skbkontur/react-ui';
102
+
103
+ <Link onClick={() => Toast.push("Ты нажал на ссылку!")}>Ссылка с кастомным действием</Link>
104
+ ```
105
+
106
+ ### Проп `theme`
107
+
108
+ ```jsx harmony
109
+ import { Link, Gapped } from '@skbkontur/react-ui';
110
+
111
+ <Gapped>
112
+ <Link theme={{linkColor: '#C00000'}}>Ok</Link>
113
+ <Link>Ok</Link>
114
+ </Gapped>
115
+ ```
116
+
117
+
118
+ ### Кастомизация ссылки
119
+
120
+ ```jsx harmony
121
+ import { Toast, Button } from "@skbkontur/react-ui";
122
+ import { CopyIcon16Regular } from "@skbkontur/icons/CopyIcon16Regular"
123
+
124
+ const textDecorationStyles = {
125
+ linkTextUnderlineOffset: '1px'
126
+ }
127
+
128
+ const underlineOnHoverStyles = {
129
+ linkTextDecorationColor: 'transparent',
130
+ }
131
+
132
+ const differentColorStyles = {
133
+ linkColor: 'blue',
134
+ linkHoverColor: 'blue',
135
+ linkActiveColor: 'blue',
136
+ }
137
+
138
+ const stringify = (styles) => {
139
+ return `${Object.entries(styles).map(([key, value]) => `${key}: "${value}"`).join(", ")}`
140
+ }
141
+
142
+ const copyStyles = (styles) => {
143
+ navigator.clipboard.writeText(stringify(styles));
144
+ Toast.push('Copied');
145
+ }
146
+
147
+ const tableStyle = {
148
+ borderCollapse: 'collapse',
149
+ width: '100%',
150
+ };
151
+
152
+ const tdStyle = {
153
+ border: '1px solid',
154
+ padding: '8px',
155
+ };
156
+
157
+ const renderExampleRow = (title, styles) => {
158
+ return (
159
+ <tr>
160
+ <td style={tdStyle}>{title}</td>
161
+ <td style={tdStyle}><Link theme={styles}>Link</Link></td>
162
+ <td style={tdStyle}>
163
+ <div style={{display: 'flex'}}>
164
+ <div style={{width: '80%', whiteSpace: 'pre-line'}}>{stringify(styles).replace(/, /g, '\n')}</div>
165
+ <Button icon={<CopyIcon16Regular />} use={'text'} onClick={() => copyStyles(styles)}/>
166
+ </div>
167
+ </td>
168
+ </tr>
169
+ )
170
+ }
171
+
172
+ <table style={tableStyle}>
173
+ <tr style={{textAlign: 'left'}}>
174
+ <th style={tdStyle}></th>
175
+ <th style={tdStyle}>Пример</th>
176
+ <th style={tdStyle}>Переменные темы</th>
177
+ </tr>
178
+ {renderExampleRow('Ссылка с подчеркиванием без отступа', textDecorationStyles)}
179
+ {renderExampleRow('Ссылка с подчеркиванием при наведении', underlineOnHoverStyles)}
180
+ {renderExampleRow('Изменение цвета ссылки', differentColorStyles)}
181
+ </table>
182
+ ```
@@ -0,0 +1,33 @@
1
+ ### Базовый пример
2
+ ```jsx harmony
3
+ import { Button } from '@skbkontur/react-ui';
4
+
5
+ const [isActive, setIsActive] = React.useState(true);
6
+
7
+ <>
8
+ <Button onClick={() => setIsActive(!isActive)}>{isActive ? 'Остановить загрузку' : 'Продолжить загрузку'}</Button>
9
+ <Loader type="big" active={isActive}>
10
+ <h1>Yeah, and if you were the pope they'd be all, "Straighten your pope hat." And "Put on your good vestments."</h1>
11
+ <p>
12
+ No, I'm Santa Claus! I guess if you want children beaten, you have to do it yourself. We're also Santa Claus! Leela,
13
+ Bender, we're going grave robbing.
14
+ </p>
15
+ <p>
16
+ Are you crazy? I can't swallow that. Large bet on myself in round one. Hey, whatcha watching?
17
+ <strong> Moving along… I guess if you want children beaten, you have to do it yourself.</strong>
18
+ <em>It's okay, Bender.</em> I like cooking too.
19
+ </p>
20
+ <h2>Oh, I think we should just stay friends.</h2>
21
+ <p>
22
+ No argument here. And when we woke up, we had these bodies. You guys go on without me! I'm going to go… look for
23
+ more stuff to steal! Oh, how awful. Did he at least die painlessly? …To shreds, you say. Well, how is his wife
24
+ holding up? …To shreds, you say.
25
+ </p>
26
+ <ol>
27
+ <li>No! The kind with looting and maybe starting a few fires!</li>
28
+ <li>You are the last hope of the universe.</li>
29
+ <li>Hey, guess what you're accessories to.</li>
30
+ </ol>
31
+ </Loader>
32
+ </>
33
+ ```
@@ -1,7 +1,6 @@
1
1
  import type { IMaskInputProps } from '@skbkontur/react-imask';
2
2
  import type { InputProps, InputType } from '../Input';
3
3
  import { Input } from '../Input';
4
- export type MaskedInputOnBeforePasteValue = (value: string) => string;
5
4
  export interface MaskedProps {
6
5
  /** Паттерн маски */
7
6
  mask: string;
@@ -22,13 +21,6 @@ export interface MaskedProps {
22
21
  * @param blink вспыхнуть акцентным цвтетом.
23
22
  */
24
23
  onUnexpectedInput?: (value: string, blink: () => void) => void;
25
- /** Задает обработчик вставки значения в инпут.
26
- * В value будет передано значение из буфера обмена.
27
- * Возвращаемое значение будет использовано как значение инпута.
28
- * Используется для фильтрации значения при вставке из буфера обмена.
29
- * @param value значение вставки.
30
- */
31
- onBeforePasteValue?: MaskedInputOnBeforePasteValue;
32
24
  /** Убирает из value символы, не введённые пользователем
33
25
  * @default false */
34
26
  unmask?: boolean;
@@ -12,17 +12,7 @@ var _ThemeContext = require("../../lib/theming/ThemeContext");
12
12
  var _MaskedInput = require("./MaskedInput.styles");
13
13
  var _MaskedInput2 = require("./MaskedInput.helpers");
14
14
  var _ColorableInputElement = require("./ColorableInputElement");
15
- var _FixedIMaskInput = require("./FixedIMaskInput");var _excluded = ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onChange", "onBeforePasteValue", "element", "className"];
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
15
+ var _FixedIMaskInput = require("./FixedIMaskInput");var _excluded = ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onChange", "element", "className"];
26
16
 
27
17
 
28
18
 
@@ -111,8 +101,7 @@ var MaskedInput = exports.MaskedInput = (0, _forwardRefAndName.forwardRefAndName
111
101
 
112
102
 
113
103
 
114
-
115
- props.mask,maskChar = props.maskChar,formatChars = props.formatChars,_props$alwaysShowMask = props.alwaysShowMask,alwaysShowMask = _props$alwaysShowMask === void 0 ? false : _props$alwaysShowMask,_props$colored = props.colored,colored = _props$colored === void 0 ? true : _props$colored,_props$imaskProps = props.imaskProps,customIMaskProps = _props$imaskProps === void 0 ? {} : _props$imaskProps,_props$unmask = props.unmask,unmask = _props$unmask === void 0 ? false : _props$unmask,onValueChange = props.onValueChange,onUnexpectedInput = props.onUnexpectedInput,onChange = props.onChange,onBeforePasteValue = props.onBeforePasteValue,element = props.element,className = props.className,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
104
+ props.mask,maskChar = props.maskChar,formatChars = props.formatChars,_props$alwaysShowMask = props.alwaysShowMask,alwaysShowMask = _props$alwaysShowMask === void 0 ? false : _props$alwaysShowMask,_props$colored = props.colored,colored = _props$colored === void 0 ? true : _props$colored,_props$imaskProps = props.imaskProps,customIMaskProps = _props$imaskProps === void 0 ? {} : _props$imaskProps,_props$unmask = props.unmask,unmask = _props$unmask === void 0 ? false : _props$unmask,onValueChange = props.onValueChange,onUnexpectedInput = props.onUnexpectedInput,onChange = props.onChange,element = props.element,className = props.className,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
116
105
  var theme = (0, _react.useContext)(_ThemeContext.ThemeContext);
117
106
 
118
107
  var inputRef = (0, _react.useRef)(null);
@@ -158,7 +147,6 @@ var MaskedInput = exports.MaskedInput = (0, _forwardRefAndName.forwardRefAndName
158
147
  onBlur: handleBlur,
159
148
  onInput: handleInput,
160
149
  onKeyDown: handleKeyDown,
161
- onPaste: handlePaste,
162
150
  className: (0, _Emotion.cx)(_MaskedInput.globalClasses.root, uiFontGlobalClassesRoot, className, _MaskedInput.styles.root(theme)),
163
151
  element:
164
152
  colored ? /*#__PURE__*/
@@ -172,15 +160,6 @@ var MaskedInput = exports.MaskedInput = (0, _forwardRefAndName.forwardRefAndName
172
160
  ));
173
161
 
174
162
 
175
- function handlePaste(event) {
176
- if (onBeforePasteValue && onValueChange) {var _event$clipboardData$, _event$clipboardData;
177
- event.preventDefault();
178
- onValueChange == null || onValueChange(onBeforePasteValue((_event$clipboardData$ = (_event$clipboardData = event.clipboardData) == null ? void 0 : _event$clipboardData.getData('text')) != null ? _event$clipboardData$ : ''));
179
- }
180
-
181
- props.onPaste == null || props.onPaste(event);
182
- }
183
-
184
163
  function getCompatibleIMaskProps() {
185
164
  return (0, _extends2.default)({
186
165
  mask: mask.replace(/0/g, '{\\0}'),
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_forwardRefAndName","_Emotion","_Input","_identifiers","_ThemeContext","_MaskedInput","_MaskedInput2","_ColorableInputElement","_FixedIMaskInput","_excluded","getSafeMaskInputType","exports","type","MaskedInput","forwardRefAndName","props","ref","mask","maskChar","formatChars","_props$alwaysShowMask","alwaysShowMask","_props$colored","colored","_props$imaskProps","imaskProps","customIMaskProps","_props$unmask","unmask","onValueChange","onUnexpectedInput","onChange","onBeforePasteValue","element","className","inputProps","_objectWithoutPropertiesLoose2","default","theme","useContext","ThemeContext","inputRef","useRef","_useState","useState","focused","setFocused","prevValue","value","String","defaultValue","prevSelectionStart","useImperativeHandle","current","Object","assign","selectAll","_inputRef$current","_inputRef$current2","focus","delaySelectAll","useEffect","_inputRef$current3","input","selectionStart","getCompatibleIMaskProps","uiFontGlobalClassesRoot","createElement","Input","_extends2","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","onKeyDown","handleKeyDown","onPaste","handlePaste","cx","globalClasses","root","styles","ColorableInputElement","showOnFocus","FixedIMaskInput","onAccept","handleAccept","event","_event$clipboardData$","_event$clipboardData","preventDefault","clipboardData","getData","replace","placeholderChar","getMaskChar","definitions","getDefinitions","eager","overwrite","lazy","disabled","_len","arguments","length","args","Array","_key","e","_e$currentTarget","currentTarget","handleUnexpectedInput","_inputRef$current4","selectAllOnFocus","_inputRef$current5","blink","bind","undefined","_e$currentTarget2","selectionEnd","isKeyBackspace","isKeyDelete"],"sources":["MaskedInput.tsx"],"sourcesContent":["import React, { useImperativeHandle, useRef, useState, useEffect, useContext } from 'react';\nimport type { IMaskInputProps } from '@skbkontur/react-imask';\nimport type { Ref } from 'react';\n\nimport { forwardRefAndName } from '../../lib/forwardRefAndName';\nimport { cx } from '../../lib/theming/Emotion';\nimport type { InputProps, InputType } from '../Input';\nimport { Input } from '../Input';\nimport { isKeyBackspace, isKeyDelete } from '../../lib/events/keyboard/identifiers';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\n\nimport { globalClasses, styles } from './MaskedInput.styles';\nimport { getDefinitions, getMaskChar } from './MaskedInput.helpers';\nimport { ColorableInputElement } from './ColorableInputElement';\nimport { FixedIMaskInput } from './FixedIMaskInput';\n\nexport type MaskedInputOnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedProps {\n /** Паттерн маски */\n mask: string;\n\n /** Устанавливает символ маски\n * @default _ */\n maskChar?: string;\n\n /** Задает словарь символов-регулярок для задания маски.\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */\n formatChars?: Record<string, string>;\n\n /** Включает показ символов маски.\n * @default false */\n alwaysShowMask?: boolean;\n\n /** Задает обработчик неправильного ввода.\n * Вторым агрументом будет передан метод вспыхивания акцентным цветом.\n *\n * Если обработчик не задан, то инпут вспыхивает по-умолчанию.\n * @param value значение инпута.\n * @param blink вспыхнуть акцентным цвтетом.\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /** Задает обработчик вставки значения в инпут.\n * В value будет передано значение из буфера обмена.\n * Возвращаемое значение будет использовано как значение инпута.\n * Используется для фильтрации значения при вставке из буфера обмена.\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputOnBeforePasteValue;\n\n /** Убирает из value символы, не введённые пользователем\n * @default false */\n unmask?: boolean;\n\n /** Раскрашивает символы маски.\n * @default true\n * @ignore */\n colored?: boolean;\n\n /** Задает пропы для компонента `IMaskInput`. Необходимы для юнит-тестов\n * @ignore */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nexport const getSafeMaskInputType = (type?: InputType): MaskInputType | undefined => {\n if (!type) {\n return type;\n }\n\n switch (type) {\n case 'number':\n case 'date':\n case 'time':\n case 'password':\n return 'text';\n default:\n return type;\n }\n};\n\nexport interface MaskedInputProps\n extends MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n}\n\n/**\n * Интерфейс пропсов наследуется от `Input`.\n * Из пропсов `Input` исключены некоторые не применимые к полю с маской пропсы и сокращен список возможных значений в type.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = {},\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onChange,\n onBeforePasteValue,\n element,\n className,\n ...inputProps\n } = props;\n const theme = useContext(ThemeContext);\n\n const inputRef = useRef<Input>(null);\n\n const [focused, setFocused] = useState(false);\n const prevValue = useRef<string>(props.value || String(props.defaultValue) || '');\n const prevSelectionStart = useRef<number | null>(null);\n\n useImperativeHandle(\n ref,\n () =>\n inputRef.current &&\n Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n inputRef.current?.delaySelectAll();\n },\n }),\n [],\n );\n\n useEffect(() => {\n // Для корректной работы onUnexpectedInput надо знать предыдущий value,\n // но imask при монтировании не вызывает onAccept, если value невалиден или laze=false.\n // Поэтому актуальный value при монтировании надо получать вручную\n if (inputRef.current?.input) {\n prevValue.current = inputRef.current.input.value;\n prevSelectionStart.current = inputRef.current.input.selectionStart;\n }\n }, []);\n\n const imaskProps = getCompatibleIMaskProps();\n\n // TODO: Удалить в следующем мажоре\n // Селекторы могут ожидать определённый порядок классов\n const uiFontGlobalClassesRoot = 'react-ui-ui-font-root';\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n className={cx(globalClasses.root, uiFontGlobalClassesRoot, className, styles.root(theme))}\n element={\n colored ? (\n <ColorableInputElement showOnFocus={false}>\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n </ColorableInputElement>\n ) : (\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n )\n }\n />\n );\n\n function handlePaste(event: React.ClipboardEvent<HTMLInputElement>) {\n if (onBeforePasteValue && onValueChange) {\n event.preventDefault();\n onValueChange?.(onBeforePasteValue(event.clipboardData?.getData('text') ?? ''));\n }\n\n props.onPaste?.(event);\n }\n\n function getCompatibleIMaskProps(): IMaskInputProps<HTMLInputElement> {\n return {\n mask: mask.replace(/0/g, '{\\\\0}') as any,\n placeholderChar: getMaskChar(maskChar),\n definitions: getDefinitions(formatChars),\n // FIXME: Должно быть eager=true, но в imask ломается удаление по delete\n eager: 'append',\n overwrite: 'shift',\n lazy: !alwaysShowMask && (props.disabled || !focused),\n unmask,\n ...customIMaskProps,\n } as IMaskInputProps<HTMLInputElement>;\n }\n\n function handleAccept(...args: Parameters<Required<IMaskInputProps<HTMLInputElement>>['onAccept']>) {\n const [value, , e] = args;\n\n // Метод onAccept может вызываться при монтировании, если не задан проп defaultValue.\n // Но нативный input никогда не вызывает onChange при монтировании.\n // Наше событие onValueChange в Input вывается в тех же случаях, что и нативный onChange,\n // поэтому чтобы сохранить консинстентность будем ориентироваться на наличие аргумента e.\n // Он содержит нативное событие, вызвавшее изменение.\n e && onValueChange?.(value);\n !e && (prevValue.current = value);\n }\n\n /**\n * Отслеживаем неожиданные нажатия\n * handleAccept не вызывается когда значение с маской не меняется\n * Сначала вызывается handleAccept, затем handleInput\n */\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n const { value, selectionStart } = e.currentTarget;\n\n // При вводе неожиданных символов или удалении каретка может перепрыгивать фиксированные символы.\n // Такие случаи не расцениваем как неожиданный ввод, т.к. пользователь может намеренно их вводить.\n if (prevValue.current === value && selectionStart === prevSelectionStart.current) {\n handleUnexpectedInput(value);\n }\n prevValue.current = value;\n prevSelectionStart.current = selectionStart;\n\n props.onInput?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n\n // Если value из пропов отличается от value, которое получит input после обработки,\n // то imask будет ставить каретку за последним валидным символом.\n props.selectAllOnFocus && inputRef.current?.delaySelectAll();\n }\n\n function handleUnexpectedInput(value: string) {\n const blink = inputRef.current?.blink.bind(inputRef.current) || (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(value, blink) : blink();\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const { value, selectionStart, selectionEnd } = e.currentTarget;\n\n if (\n (isKeyBackspace(e) && selectionStart === 0 && selectionEnd === 0) ||\n (isKeyDelete(e) && prevSelectionStart.current === value.length)\n ) {\n // Случаи, когда нажатие клавиш не тригерит `onInput`\n handleUnexpectedInput(value);\n prevValue.current = e.currentTarget.value;\n }\n prevSelectionStart.current = selectionStart;\n\n props.onKeyDown?.(e);\n }\n },\n);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_forwardRefAndName","_Emotion","_Input","_identifiers","_ThemeContext","_MaskedInput","_MaskedInput2","_ColorableInputElement","_FixedIMaskInput","_excluded","getSafeMaskInputType","exports","type","MaskedInput","forwardRefAndName","props","ref","mask","maskChar","formatChars","_props$alwaysShowMask","alwaysShowMask","_props$colored","colored","_props$imaskProps","imaskProps","customIMaskProps","_props$unmask","unmask","onValueChange","onUnexpectedInput","onChange","element","className","inputProps","_objectWithoutPropertiesLoose2","default","theme","useContext","ThemeContext","inputRef","useRef","_useState","useState","focused","setFocused","prevValue","value","String","defaultValue","prevSelectionStart","useImperativeHandle","current","Object","assign","selectAll","_inputRef$current","_inputRef$current2","focus","delaySelectAll","useEffect","_inputRef$current3","input","selectionStart","getCompatibleIMaskProps","uiFontGlobalClassesRoot","createElement","Input","_extends2","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","onKeyDown","handleKeyDown","cx","globalClasses","root","styles","ColorableInputElement","showOnFocus","FixedIMaskInput","onAccept","handleAccept","replace","placeholderChar","getMaskChar","definitions","getDefinitions","eager","overwrite","lazy","disabled","_len","arguments","length","args","Array","_key","e","_e$currentTarget","currentTarget","handleUnexpectedInput","_inputRef$current4","selectAllOnFocus","_inputRef$current5","blink","bind","undefined","_e$currentTarget2","selectionEnd","isKeyBackspace","isKeyDelete"],"sources":["MaskedInput.tsx"],"sourcesContent":["import React, { useImperativeHandle, useRef, useState, useEffect, useContext } from 'react';\nimport type { IMaskInputProps } from '@skbkontur/react-imask';\nimport type { Ref } from 'react';\n\nimport { forwardRefAndName } from '../../lib/forwardRefAndName';\nimport { cx } from '../../lib/theming/Emotion';\nimport type { InputProps, InputType } from '../Input';\nimport { Input } from '../Input';\nimport { isKeyBackspace, isKeyDelete } from '../../lib/events/keyboard/identifiers';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\n\nimport { globalClasses, styles } from './MaskedInput.styles';\nimport { getDefinitions, getMaskChar } from './MaskedInput.helpers';\nimport { ColorableInputElement } from './ColorableInputElement';\nimport { FixedIMaskInput } from './FixedIMaskInput';\n\nexport interface MaskedProps {\n /** Паттерн маски */\n mask: string;\n\n /** Устанавливает символ маски\n * @default _ */\n maskChar?: string;\n\n /** Задает словарь символов-регулярок для задания маски.\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */\n formatChars?: Record<string, string>;\n\n /** Включает показ символов маски.\n * @default false */\n alwaysShowMask?: boolean;\n\n /** Задает обработчик неправильного ввода.\n * Вторым агрументом будет передан метод вспыхивания акцентным цветом.\n *\n * Если обработчик не задан, то инпут вспыхивает по-умолчанию.\n * @param value значение инпута.\n * @param blink вспыхнуть акцентным цвтетом.\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /** Убирает из value символы, не введённые пользователем\n * @default false */\n unmask?: boolean;\n\n /** Раскрашивает символы маски.\n * @default true\n * @ignore */\n colored?: boolean;\n\n /** Задает пропы для компонента `IMaskInput`. Необходимы для юнит-тестов\n * @ignore */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nexport const getSafeMaskInputType = (type?: InputType): MaskInputType | undefined => {\n if (!type) {\n return type;\n }\n\n switch (type) {\n case 'number':\n case 'date':\n case 'time':\n case 'password':\n return 'text';\n default:\n return type;\n }\n};\n\nexport interface MaskedInputProps\n extends MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n}\n\n/**\n * Интерфейс пропсов наследуется от `Input`.\n * Из пропсов `Input` исключены некоторые не применимые к полю с маской пропсы и сокращен список возможных значений в type.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = {},\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onChange,\n element,\n className,\n ...inputProps\n } = props;\n const theme = useContext(ThemeContext);\n\n const inputRef = useRef<Input>(null);\n\n const [focused, setFocused] = useState(false);\n const prevValue = useRef<string>(props.value || String(props.defaultValue) || '');\n const prevSelectionStart = useRef<number | null>(null);\n\n useImperativeHandle(\n ref,\n () =>\n inputRef.current &&\n Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n inputRef.current?.delaySelectAll();\n },\n }),\n [],\n );\n\n useEffect(() => {\n // Для корректной работы onUnexpectedInput надо знать предыдущий value,\n // но imask при монтировании не вызывает onAccept, если value невалиден или laze=false.\n // Поэтому актуальный value при монтировании надо получать вручную\n if (inputRef.current?.input) {\n prevValue.current = inputRef.current.input.value;\n prevSelectionStart.current = inputRef.current.input.selectionStart;\n }\n }, []);\n\n const imaskProps = getCompatibleIMaskProps();\n\n // TODO: Удалить в следующем мажоре\n // Селекторы могут ожидать определённый порядок классов\n const uiFontGlobalClassesRoot = 'react-ui-ui-font-root';\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n className={cx(globalClasses.root, uiFontGlobalClassesRoot, className, styles.root(theme))}\n element={\n colored ? (\n <ColorableInputElement showOnFocus={false}>\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n </ColorableInputElement>\n ) : (\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n )\n }\n />\n );\n\n function getCompatibleIMaskProps(): IMaskInputProps<HTMLInputElement> {\n return {\n mask: mask.replace(/0/g, '{\\\\0}') as any,\n placeholderChar: getMaskChar(maskChar),\n definitions: getDefinitions(formatChars),\n // FIXME: Должно быть eager=true, но в imask ломается удаление по delete\n eager: 'append',\n overwrite: 'shift',\n lazy: !alwaysShowMask && (props.disabled || !focused),\n unmask,\n ...customIMaskProps,\n } as IMaskInputProps<HTMLInputElement>;\n }\n\n function handleAccept(...args: Parameters<Required<IMaskInputProps<HTMLInputElement>>['onAccept']>) {\n const [value, , e] = args;\n\n // Метод onAccept может вызываться при монтировании, если не задан проп defaultValue.\n // Но нативный input никогда не вызывает onChange при монтировании.\n // Наше событие onValueChange в Input вывается в тех же случаях, что и нативный onChange,\n // поэтому чтобы сохранить консинстентность будем ориентироваться на наличие аргумента e.\n // Он содержит нативное событие, вызвавшее изменение.\n e && onValueChange?.(value);\n !e && (prevValue.current = value);\n }\n\n /**\n * Отслеживаем неожиданные нажатия\n * handleAccept не вызывается когда значение с маской не меняется\n * Сначала вызывается handleAccept, затем handleInput\n */\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n const { value, selectionStart } = e.currentTarget;\n\n // При вводе неожиданных символов или удалении каретка может перепрыгивать фиксированные символы.\n // Такие случаи не расцениваем как неожиданный ввод, т.к. пользователь может намеренно их вводить.\n if (prevValue.current === value && selectionStart === prevSelectionStart.current) {\n handleUnexpectedInput(value);\n }\n prevValue.current = value;\n prevSelectionStart.current = selectionStart;\n\n props.onInput?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n\n // Если value из пропов отличается от value, которое получит input после обработки,\n // то imask будет ставить каретку за последним валидным символом.\n props.selectAllOnFocus && inputRef.current?.delaySelectAll();\n }\n\n function handleUnexpectedInput(value: string) {\n const blink = inputRef.current?.blink.bind(inputRef.current) || (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(value, blink) : blink();\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const { value, selectionStart, selectionEnd } = e.currentTarget;\n\n if (\n (isKeyBackspace(e) && selectionStart === 0 && selectionEnd === 0) ||\n (isKeyDelete(e) && prevSelectionStart.current === value.length)\n ) {\n // Случаи, когда нажатие клавиш не тригерит `onInput`\n handleUnexpectedInput(value);\n prevValue.current = e.currentTarget.value;\n }\n prevSelectionStart.current = selectionStart;\n\n props.onKeyDown?.(e);\n }\n },\n);\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,114 @@
1
+ ### Проп `mask`
2
+
3
+ Паттерн ввода. Пример с номером телефона.
4
+
5
+ ```jsx harmony
6
+ const [value, setValue] = React.useState('');
7
+
8
+ <>
9
+ <span>value: "{value}"</span>
10
+ <br />
11
+ <br />
12
+ <MaskedInput
13
+ mask="+7 (999) 999-99-99"
14
+ placeholder="Номер телефона"
15
+ value={value}
16
+ onValueChange={setValue}
17
+ />
18
+ </>
19
+ ```
20
+
21
+ ### Проп `alwaysShowMask`
22
+
23
+ Показывает маску всегда.
24
+
25
+ ```jsx harmony
26
+ <MaskedInput mask="+7 (999) 999-99-99" alwaysShowMask />
27
+ ```
28
+
29
+ ### Проп `maskChar`
30
+
31
+ Символом маски может быть любой символ.
32
+
33
+ ```jsx harmony
34
+ const [value, setValue] = React.useState('');
35
+
36
+ <>
37
+ <span>value: "{value}"</span>
38
+ <br />
39
+ <br />
40
+ <MaskedInput
41
+ mask="9999 9999 9999 9999"
42
+ maskChar="X"
43
+ placeholder="Номер карты"
44
+ alwaysShowMask
45
+ value={value}
46
+ onValueChange={setValue}
47
+ />
48
+ </>
49
+ ```
50
+
51
+ ### Проп `formatChars`
52
+
53
+ При необходимости можно настроить собственный словарь.
54
+
55
+ ```jsx harmony
56
+ const [value, setValue] = React.useState('');
57
+
58
+ <MaskedInput
59
+ mask="Hh:Mm:Ss"
60
+ alwaysShowMask
61
+ formatChars={{
62
+ H: '[0-2]',
63
+ h: value.startsWith('2') ? '[0-3]' : '[0-9]',
64
+ M: '[0-5]',
65
+ m: '[0-9]',
66
+ S: '[0-5]',
67
+ s: '[0-9]',
68
+ }}
69
+ value={value}
70
+ onValueChange={setValue}
71
+ />
72
+ ```
73
+
74
+ ### Проп `unmask`
75
+
76
+ Можно сразу получать очищенный value, содержащий только введённый пользователем символы.
77
+
78
+ ```jsx harmony
79
+ const [value, setValue] = React.useState('');
80
+
81
+ <>
82
+ <span>value: "{value}"</span>
83
+ <br />
84
+ <br />
85
+ <MaskedInput
86
+ mask="+7 (999) 999-99-99"
87
+ unmask
88
+ alwaysShowMask
89
+ value={value}
90
+ onValueChange={setValue}
91
+ />
92
+ </>
93
+ ```
94
+
95
+ ### Проп `unmask` с фигурными скобками
96
+
97
+ Если обернуть фиксированные символы в фигурные скобки, то они попадут в `value` при `unmask = true`.
98
+
99
+ ```jsx harmony
100
+ const [value, setValue] = React.useState('');
101
+
102
+ <>
103
+ <span>value: "{value}"</span>
104
+ <br />
105
+ <br />
106
+ <MaskedInput
107
+ mask="+{7} (999) 999-99-99"
108
+ unmask
109
+ alwaysShowMask
110
+ value={value}
111
+ onValueChange={setValue}
112
+ />
113
+ </>
114
+ ```
@@ -0,0 +1,27 @@
1
+ ### Базовый пример меню с заголовками
2
+
3
+ ```jsx harmony
4
+ import { Button, MenuItem, DropdownMenu } from '@skbkontur/react-ui';
5
+
6
+ <DropdownMenu
7
+ menuMaxHeight="10rem"
8
+ caption={<Button use="primary">Сотрудники компании</Button>}
9
+ >
10
+ <MenuItem>Вася</MenuItem>
11
+ <MenuItem>Петя</MenuItem>
12
+ <MenuItem>Маша</MenuItem>
13
+ <MenuFooter>Всего 3 человека</MenuFooter>
14
+ </DropdownMenu>
15
+ ```
16
+
17
+ ### Размер
18
+
19
+ ```jsx harmony
20
+ import { Gapped } from '@skbkontur/react-ui';
21
+
22
+ <Gapped vertical>
23
+ <MenuFooter size={'small'}>Маленький</MenuFooter>
24
+ <MenuFooter size={'medium'}>Средний</MenuFooter>
25
+ <MenuFooter size={'large'}>Большой</MenuFooter>
26
+ </Gapped>
27
+ ```
@@ -0,0 +1,35 @@
1
+ ### Базовый пример меню с заголовками
2
+
3
+ ```jsx harmony
4
+ import { Button, MenuItem, DropdownMenu } from '@skbkontur/react-ui';
5
+
6
+ <DropdownMenu
7
+ menuMaxHeight="10rem"
8
+ caption={<Button use="primary">Сотрудники компании</Button>}
9
+ >
10
+ <MenuHeader>Разработчики</MenuHeader>
11
+ <MenuItem>Вася</MenuItem>
12
+ <MenuItem>Петя</MenuItem>
13
+ <MenuItem>Маша</MenuItem>
14
+ <MenuHeader>Дизайнеры</MenuHeader>
15
+ <MenuItem>Галя</MenuItem>
16
+ <MenuItem>Гриша</MenuItem>
17
+ <MenuItem>Гена</MenuItem>
18
+ <MenuHeader>Продакты</MenuHeader>
19
+ <MenuItem>Валя</MenuItem>
20
+ <MenuItem>Аля</MenuItem>
21
+ <MenuItem>Артём</MenuItem>
22
+ </DropdownMenu>
23
+ ```
24
+
25
+ ### Размер
26
+
27
+ ```jsx harmony
28
+ import { Gapped } from '@skbkontur/react-ui';
29
+
30
+ <Gapped vertical>
31
+ <MenuHeader size={'small'}>Маленький</MenuHeader>
32
+ <MenuHeader size={'medium'}>Средний</MenuHeader>
33
+ <MenuHeader size={'large'}>Большой</MenuHeader>
34
+ </Gapped>
35
+ ```