@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.
- package/CHANGELOG.md +0 -30
- package/cjs/components/Autocomplete/Autocomplete.md +113 -0
- package/cjs/components/Button/Button.md +261 -0
- package/cjs/components/Calendar/Calendar.md +276 -0
- package/cjs/components/Calendar/CalendarDay.md +70 -0
- package/cjs/components/Center/Center.md +26 -0
- package/cjs/components/Checkbox/Checkbox.md +171 -0
- package/cjs/components/ComboBox/ComboBox.d.ts +11 -5
- package/cjs/components/ComboBox/ComboBox.js +10 -1
- package/cjs/components/ComboBox/ComboBox.js.map +1 -1
- package/cjs/components/ComboBox/ComboBox.md +574 -0
- package/cjs/components/CurrencyInput/CurrencyInput.md +39 -0
- package/cjs/components/CurrencyLabel/CurrencyLabel.js +2 -2
- package/cjs/components/CurrencyLabel/CurrencyLabel.js.map +1 -1
- package/cjs/components/CurrencyLabel/CurrencyLabel.md +29 -0
- package/cjs/components/DateInput/DateInput.md +111 -0
- package/cjs/components/DatePicker/DatePicker.md +368 -0
- package/cjs/components/Dropdown/Dropdown.md +45 -0
- package/cjs/components/DropdownMenu/DropdownMenu.md +290 -0
- package/cjs/components/FileUploader/FileUploader.md +131 -0
- package/cjs/components/FxInput/FxInput.md +31 -0
- package/cjs/components/Gapped/Gapped.md +44 -0
- package/cjs/components/GlobalLoader/GlobalLoader.md +97 -0
- package/cjs/components/Group/Group.md +19 -0
- package/cjs/components/Hint/Hint.md +86 -0
- package/cjs/components/Input/Input.md +86 -0
- package/cjs/components/Input/InputLayout/InputLayout.d.ts +1 -0
- package/cjs/components/Input/InputLayout/InputLayout.js +4 -2
- package/cjs/components/Input/InputLayout/InputLayout.js.map +1 -1
- package/cjs/components/Kebab/Kebab.md +306 -0
- package/cjs/components/Link/Link.md +182 -0
- package/cjs/components/Loader/Loader.md +33 -0
- package/cjs/components/MaskedInput/MaskedInput.d.ts +0 -8
- package/cjs/components/MaskedInput/MaskedInput.js +2 -23
- package/cjs/components/MaskedInput/MaskedInput.js.map +1 -1
- package/cjs/components/MaskedInput/MaskedInput.md +114 -0
- package/cjs/components/MenuFooter/MenuFooter.md +27 -0
- package/cjs/components/MenuHeader/MenuHeader.md +35 -0
- package/cjs/components/MenuItem/MenuItem.md +139 -0
- package/cjs/components/MenuSeparator/MenuSeparator.md +14 -0
- package/cjs/components/MiniModal/MiniModal.md +231 -0
- package/cjs/components/Modal/Modal.md +56 -0
- package/cjs/components/Paging/Paging.md +57 -0
- package/cjs/components/PasswordInput/PasswordInput.md +29 -0
- package/cjs/components/Radio/Radio.md +57 -0
- package/cjs/components/RadioGroup/RadioGroup.md +44 -0
- package/cjs/components/ResponsiveLayout/ResponsiveLayout.md +75 -0
- package/cjs/components/ScrollContainer/ScrollContainer.md +224 -0
- package/cjs/components/Select/Select.md +113 -0
- package/cjs/components/SidePage/SidePage.md +65 -0
- package/cjs/components/SingleToast/SingleToast.md +36 -0
- package/cjs/components/Spinner/Spinner.md +36 -0
- package/cjs/components/Sticky/Sticky.md +28 -0
- package/cjs/components/Switcher/Switcher.md +111 -0
- package/cjs/components/Tabs/Tab.md +73 -0
- package/cjs/components/Tabs/Tabs.md +54 -0
- package/cjs/components/Textarea/Textarea.d.ts +6 -1
- package/cjs/components/Textarea/Textarea.js +16 -3
- package/cjs/components/Textarea/Textarea.js.map +1 -1
- package/cjs/components/Textarea/Textarea.md +58 -0
- package/cjs/components/Textarea/Textarea.styles.js +2 -1
- package/cjs/components/Textarea/Textarea.styles.js.map +1 -1
- package/cjs/components/Toast/Toast.md +69 -0
- package/cjs/components/Toggle/Toggle.md +110 -0
- package/cjs/components/Token/Token.md +48 -0
- package/cjs/components/TokenInput/TokenInput.md +277 -0
- package/cjs/components/Tooltip/Tooltip.d.ts +1 -1
- package/cjs/components/Tooltip/Tooltip.js +6 -8
- package/cjs/components/Tooltip/Tooltip.js.map +1 -1
- package/cjs/components/Tooltip/Tooltip.md +322 -0
- package/cjs/components/TooltipMenu/TooltipMenu.md +241 -0
- package/cjs/internal/ClearCrossIcon/ClearCrossIcon.d.ts +1 -0
- package/cjs/internal/ClearCrossIcon/ClearCrossIcon.js +16 -7
- package/cjs/internal/ClearCrossIcon/ClearCrossIcon.js.map +1 -1
- package/cjs/internal/ClearCrossIcon/ClearCrossIcon.styles.d.ts +3 -0
- package/cjs/internal/ClearCrossIcon/ClearCrossIcon.styles.js +27 -9
- package/cjs/internal/ClearCrossIcon/ClearCrossIcon.styles.js.map +1 -1
- package/cjs/internal/CustomComboBox/ComboBoxView.d.ts +7 -6
- package/cjs/internal/CustomComboBox/ComboBoxView.js +2 -7
- package/cjs/internal/CustomComboBox/ComboBoxView.js.map +1 -1
- package/cjs/internal/CustomComboBox/CustomComboBox.d.ts +6 -5
- package/cjs/internal/CustomComboBox/CustomComboBox.js +1 -3
- package/cjs/internal/CustomComboBox/CustomComboBox.js.map +1 -1
- package/cjs/internal/CustomComboBox/getComboBoxTheme.d.ts +2 -1
- package/cjs/internal/CustomComboBox/getComboBoxTheme.js +10 -7
- package/cjs/internal/CustomComboBox/getComboBoxTheme.js.map +1 -1
- package/cjs/internal/DataTids/DATATIDS.md +12 -0
- package/cjs/internal/DataTids/DataTids.d.ts +12 -0
- package/cjs/internal/DataTids/DataTids.js +50 -0
- package/cjs/internal/DataTids/DataTids.js.map +1 -0
- package/cjs/internal/DataTids/DataTids.styles.d.ts +7 -0
- package/cjs/internal/DataTids/DataTids.styles.js +42 -0
- package/cjs/internal/DataTids/DataTids.styles.js.map +1 -0
- package/cjs/internal/DataTids/componentsDataTids.d.ts +5 -0
- package/cjs/internal/DataTids/componentsDataTids.js +15 -0
- package/cjs/internal/DataTids/componentsDataTids.js.map +1 -0
- package/cjs/internal/InputLikeText/InputLikeText.styles.d.ts +1 -0
- package/cjs/internal/InputLikeText/InputLikeText.styles.js +12 -4
- package/cjs/internal/InputLikeText/InputLikeText.styles.js.map +1 -1
- package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.d.ts +37 -0
- package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.js +235 -0
- package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.js.map +1 -0
- package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles.d.ts +3 -0
- package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles.js +10 -0
- package/cjs/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles.js.map +1 -0
- package/cjs/internal/ThemePlayground/Playground.md +7 -0
- package/cjs/internal/ThemeShowcase/VariablesCollector.d.ts +1 -1
- package/cjs/internal/themes/BasicTheme.d.ts +2 -0
- package/cjs/internal/themes/BasicTheme.js +11 -6
- package/cjs/internal/themes/BasicTheme.js.map +1 -1
- package/cjs/internal/themes/DarkTheme5_4.js +10 -3
- package/cjs/internal/themes/DarkTheme5_4.js.map +1 -1
- package/cjs/internal/themes/LightTheme5_4.js +10 -3
- package/cjs/internal/themes/LightTheme5_4.js.map +1 -1
- package/cjs/internal/themes/consts.d.ts +7 -0
- package/cjs/internal/themes/consts.js +7 -0
- package/cjs/internal/themes/consts.js.map +1 -0
- package/cjs/lib/featureFlagsContext/FEATUREFLAGSCONTEXT.md +64 -0
- package/cjs/lib/locale/LOCALECONTEXT.md +222 -0
- package/cjs/lib/theming/ThemeContext.md +265 -0
- package/components/Autocomplete/Autocomplete.md +113 -0
- package/components/Button/Button.md +261 -0
- package/components/Calendar/Calendar.md +276 -0
- package/components/Calendar/CalendarDay.md +70 -0
- package/components/Center/Center.md +26 -0
- package/components/Checkbox/Checkbox.md +171 -0
- package/components/ComboBox/ComboBox/ComboBox.js +2 -1
- package/components/ComboBox/ComboBox/ComboBox.js.map +1 -1
- package/components/ComboBox/ComboBox.d.ts +11 -5
- package/components/ComboBox/ComboBox.md +574 -0
- package/components/CurrencyInput/CurrencyInput.md +39 -0
- package/components/CurrencyLabel/CurrencyLabel/CurrencyLabel.js +1 -1
- package/components/CurrencyLabel/CurrencyLabel/CurrencyLabel.js.map +1 -1
- package/components/CurrencyLabel/CurrencyLabel.md +29 -0
- package/components/DateInput/DateInput.md +111 -0
- package/components/DatePicker/DatePicker.md +368 -0
- package/components/Dropdown/Dropdown.md +45 -0
- package/components/DropdownMenu/DropdownMenu.md +290 -0
- package/components/FileUploader/FileUploader.md +131 -0
- package/components/FxInput/FxInput.md +31 -0
- package/components/Gapped/Gapped.md +44 -0
- package/components/GlobalLoader/GlobalLoader.md +97 -0
- package/components/Group/Group.md +19 -0
- package/components/Hint/Hint.md +86 -0
- package/components/Input/Input.md +86 -0
- package/components/Input/InputLayout/InputLayout/InputLayout.js +5 -2
- package/components/Input/InputLayout/InputLayout/InputLayout.js.map +1 -1
- package/components/Input/InputLayout/InputLayout.d.ts +1 -0
- package/components/Kebab/Kebab.md +306 -0
- package/components/Link/Link.md +182 -0
- package/components/Loader/Loader.md +33 -0
- package/components/MaskedInput/MaskedInput/MaskedInput.js +1 -11
- package/components/MaskedInput/MaskedInput/MaskedInput.js.map +1 -1
- package/components/MaskedInput/MaskedInput.d.ts +0 -8
- package/components/MaskedInput/MaskedInput.md +114 -0
- package/components/MenuFooter/MenuFooter.md +27 -0
- package/components/MenuHeader/MenuHeader.md +35 -0
- package/components/MenuItem/MenuItem.md +139 -0
- package/components/MenuSeparator/MenuSeparator.md +14 -0
- package/components/MiniModal/MiniModal.md +231 -0
- package/components/Modal/Modal.md +56 -0
- package/components/Paging/Paging.md +57 -0
- package/components/PasswordInput/PasswordInput.md +29 -0
- package/components/Radio/Radio.md +57 -0
- package/components/RadioGroup/RadioGroup.md +44 -0
- package/components/ResponsiveLayout/ResponsiveLayout.md +75 -0
- package/components/ScrollContainer/ScrollContainer.md +224 -0
- package/components/Select/Select.md +113 -0
- package/components/SidePage/SidePage.md +65 -0
- package/components/SingleToast/SingleToast.md +36 -0
- package/components/Spinner/Spinner.md +36 -0
- package/components/Sticky/Sticky.md +28 -0
- package/components/Switcher/Switcher.md +111 -0
- package/components/Tabs/Tab.md +73 -0
- package/components/Tabs/Tabs.md +54 -0
- package/components/Textarea/Textarea/Textarea.js +11 -2
- package/components/Textarea/Textarea/Textarea.js.map +1 -1
- package/components/Textarea/Textarea.d.ts +6 -1
- package/components/Textarea/Textarea.md +58 -0
- package/components/Textarea/Textarea.styles/Textarea.styles.js +1 -1
- package/components/Textarea/Textarea.styles/Textarea.styles.js.map +1 -1
- package/components/Toast/Toast.md +69 -0
- package/components/Toggle/Toggle.md +110 -0
- package/components/Token/Token.md +48 -0
- package/components/TokenInput/TokenInput.md +277 -0
- package/components/Tooltip/Tooltip/Tooltip.js +4 -7
- package/components/Tooltip/Tooltip/Tooltip.js.map +1 -1
- package/components/Tooltip/Tooltip.d.ts +1 -1
- package/components/Tooltip/Tooltip.md +322 -0
- package/components/TooltipMenu/TooltipMenu.md +241 -0
- package/internal/ClearCrossIcon/ClearCrossIcon/ClearCrossIcon.js +21 -7
- package/internal/ClearCrossIcon/ClearCrossIcon/ClearCrossIcon.js.map +1 -1
- package/internal/ClearCrossIcon/ClearCrossIcon.d.ts +1 -0
- package/internal/ClearCrossIcon/ClearCrossIcon.styles/ClearCrossIcon.styles.js +14 -5
- package/internal/ClearCrossIcon/ClearCrossIcon.styles/ClearCrossIcon.styles.js.map +1 -1
- package/internal/ClearCrossIcon/ClearCrossIcon.styles.d.ts +3 -0
- package/internal/CustomComboBox/ComboBoxView/ComboBoxView.js +44 -51
- package/internal/CustomComboBox/ComboBoxView/ComboBoxView.js.map +1 -1
- package/internal/CustomComboBox/ComboBoxView.d.ts +7 -6
- package/internal/CustomComboBox/CustomComboBox/CustomComboBox.js +3 -5
- package/internal/CustomComboBox/CustomComboBox/CustomComboBox.js.map +1 -1
- package/internal/CustomComboBox/CustomComboBox.d.ts +6 -5
- package/internal/CustomComboBox/getComboBoxTheme/getComboBoxTheme.js +5 -3
- package/internal/CustomComboBox/getComboBoxTheme/getComboBoxTheme.js.map +1 -1
- package/internal/CustomComboBox/getComboBoxTheme.d.ts +2 -1
- package/internal/DataTids/DATATIDS.md +12 -0
- package/internal/DataTids/DataTids/DataTids.js +69 -0
- package/internal/DataTids/DataTids/DataTids.js.map +1 -0
- package/internal/DataTids/DataTids/package.json +6 -0
- package/internal/DataTids/DataTids.d.ts +12 -0
- package/internal/DataTids/DataTids.styles/DataTids.styles.js +20 -0
- package/internal/DataTids/DataTids.styles/DataTids.styles.js.map +1 -0
- package/internal/DataTids/DataTids.styles/package.json +6 -0
- package/internal/DataTids/DataTids.styles.d.ts +7 -0
- package/internal/DataTids/componentsDataTids/componentsDataTids.js +12 -0
- package/internal/DataTids/componentsDataTids/componentsDataTids.js.map +1 -0
- package/internal/DataTids/componentsDataTids/package.json +6 -0
- package/internal/DataTids/componentsDataTids.d.ts +5 -0
- package/internal/InputLikeText/InputLikeText.styles/InputLikeText.styles.js +7 -4
- package/internal/InputLikeText/InputLikeText.styles/InputLikeText.styles.js.map +1 -1
- package/internal/InputLikeText/InputLikeText.styles.d.ts +1 -0
- package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout/InternalTextareaWithLayout.js +249 -0
- package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout/InternalTextareaWithLayout.js.map +1 -0
- package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout/package.json +6 -0
- package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.d.ts +37 -0
- package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles/InternalTextareaWithLayout.styles.js +8 -0
- package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles/InternalTextareaWithLayout.styles.js.map +1 -0
- package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles/package.json +6 -0
- package/internal/InternalTextareaWithLayout/InternalTextareaWithLayout.styles.d.ts +3 -0
- package/internal/ThemePlayground/Playground.md +7 -0
- package/internal/ThemeShowcase/VariablesCollector.d.ts +1 -1
- package/internal/themes/BasicTheme/BasicTheme.js +4 -4
- package/internal/themes/BasicTheme/BasicTheme.js.map +1 -1
- package/internal/themes/BasicTheme.d.ts +2 -0
- package/internal/themes/DarkTheme5_4/DarkTheme5_4.js +4 -2
- package/internal/themes/DarkTheme5_4/DarkTheme5_4.js.map +1 -1
- package/internal/themes/LightTheme5_4/LightTheme5_4.js +4 -2
- package/internal/themes/LightTheme5_4/LightTheme5_4.js.map +1 -1
- package/internal/themes/consts/consts.js +7 -0
- package/internal/themes/consts/consts.js.map +1 -0
- package/internal/themes/consts/package.json +6 -0
- package/internal/themes/consts.d.ts +7 -0
- package/lib/featureFlagsContext/FEATUREFLAGSCONTEXT.md +64 -0
- package/lib/locale/LOCALECONTEXT.md +222 -0
- package/lib/theming/ThemeContext.md +265 -0
- 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", "
|
|
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
|
+
```
|