@skbkontur/react-ui 5.3.1 → 5.3.2
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 +8 -0
- package/package.json +1 -6
- package/cjs/components/Autocomplete/Autocomplete.md +0 -113
- package/cjs/components/Button/Button.md +0 -261
- package/cjs/components/Calendar/Calendar.md +0 -276
- package/cjs/components/Calendar/CalendarDay.md +0 -70
- package/cjs/components/Center/Center.md +0 -26
- package/cjs/components/Checkbox/Checkbox.md +0 -171
- package/cjs/components/ComboBox/ComboBox.md +0 -574
- package/cjs/components/CurrencyInput/CurrencyInput.md +0 -39
- package/cjs/components/CurrencyLabel/CurrencyLabel.md +0 -29
- package/cjs/components/DateInput/DateInput.md +0 -111
- package/cjs/components/DatePicker/DatePicker.md +0 -368
- package/cjs/components/Dropdown/Dropdown.md +0 -45
- package/cjs/components/DropdownMenu/DropdownMenu.md +0 -290
- package/cjs/components/FileUploader/FileUploader.md +0 -131
- package/cjs/components/FxInput/FxInput.md +0 -31
- package/cjs/components/Gapped/Gapped.md +0 -44
- package/cjs/components/GlobalLoader/GlobalLoader.md +0 -97
- package/cjs/components/Group/Group.md +0 -19
- package/cjs/components/Hint/Hint.md +0 -86
- package/cjs/components/Input/Input.md +0 -86
- package/cjs/components/Kebab/Kebab.md +0 -306
- package/cjs/components/Link/Link.md +0 -182
- package/cjs/components/Loader/Loader.md +0 -33
- package/cjs/components/MaskedInput/MaskedInput.md +0 -114
- package/cjs/components/MenuFooter/MenuFooter.md +0 -27
- package/cjs/components/MenuHeader/MenuHeader.md +0 -35
- package/cjs/components/MenuItem/MenuItem.md +0 -139
- package/cjs/components/MenuSeparator/MenuSeparator.md +0 -14
- package/cjs/components/MiniModal/MiniModal.md +0 -231
- package/cjs/components/Modal/Modal.md +0 -56
- package/cjs/components/Paging/Paging.md +0 -57
- package/cjs/components/PasswordInput/PasswordInput.md +0 -29
- package/cjs/components/Radio/Radio.md +0 -57
- package/cjs/components/RadioGroup/RadioGroup.md +0 -44
- package/cjs/components/ResponsiveLayout/ResponsiveLayout.md +0 -75
- package/cjs/components/ScrollContainer/ScrollContainer.md +0 -224
- package/cjs/components/Select/Select.md +0 -113
- package/cjs/components/SidePage/SidePage.md +0 -65
- package/cjs/components/SingleToast/SingleToast.md +0 -36
- package/cjs/components/Spinner/Spinner.md +0 -36
- package/cjs/components/Sticky/Sticky.md +0 -28
- package/cjs/components/Switcher/Switcher.md +0 -111
- package/cjs/components/Tabs/Tab.md +0 -73
- package/cjs/components/Tabs/Tabs.md +0 -54
- package/cjs/components/Textarea/Textarea.md +0 -58
- package/cjs/components/Toast/Toast.md +0 -69
- package/cjs/components/Toggle/Toggle.md +0 -110
- package/cjs/components/Token/Token.md +0 -48
- package/cjs/components/TokenInput/TokenInput.md +0 -277
- package/cjs/components/Tooltip/Tooltip.md +0 -322
- package/cjs/components/TooltipMenu/TooltipMenu.md +0 -241
- package/cjs/internal/DataTids/DATATIDS.md +0 -12
- package/cjs/internal/DataTids/DataTids.d.ts +0 -12
- package/cjs/internal/DataTids/DataTids.js +0 -50
- package/cjs/internal/DataTids/DataTids.js.map +0 -1
- package/cjs/internal/DataTids/DataTids.styles.d.ts +0 -7
- package/cjs/internal/DataTids/DataTids.styles.js +0 -42
- package/cjs/internal/DataTids/DataTids.styles.js.map +0 -1
- package/cjs/internal/DataTids/componentsDataTids.d.ts +0 -5
- package/cjs/internal/DataTids/componentsDataTids.js +0 -15
- package/cjs/internal/DataTids/componentsDataTids.js.map +0 -1
- package/cjs/internal/ThemePlayground/Playground.md +0 -7
- package/cjs/lib/featureFlagsContext/FEATUREFLAGSCONTEXT.md +0 -64
- package/cjs/lib/locale/LOCALECONTEXT.md +0 -222
- package/cjs/lib/theming/ThemeContext.md +0 -265
- package/components/Autocomplete/Autocomplete.md +0 -113
- package/components/Button/Button.md +0 -261
- package/components/Calendar/Calendar.md +0 -276
- package/components/Calendar/CalendarDay.md +0 -70
- package/components/Center/Center.md +0 -26
- package/components/Checkbox/Checkbox.md +0 -171
- package/components/ComboBox/ComboBox.md +0 -574
- package/components/CurrencyInput/CurrencyInput.md +0 -39
- package/components/CurrencyLabel/CurrencyLabel.md +0 -29
- package/components/DateInput/DateInput.md +0 -111
- package/components/DatePicker/DatePicker.md +0 -368
- package/components/Dropdown/Dropdown.md +0 -45
- package/components/DropdownMenu/DropdownMenu.md +0 -290
- package/components/FileUploader/FileUploader.md +0 -131
- package/components/FxInput/FxInput.md +0 -31
- package/components/Gapped/Gapped.md +0 -44
- package/components/GlobalLoader/GlobalLoader.md +0 -97
- package/components/Group/Group.md +0 -19
- package/components/Hint/Hint.md +0 -86
- package/components/Input/Input.md +0 -86
- package/components/Kebab/Kebab.md +0 -306
- package/components/Link/Link.md +0 -182
- package/components/Loader/Loader.md +0 -33
- package/components/MaskedInput/MaskedInput.md +0 -114
- package/components/MenuFooter/MenuFooter.md +0 -27
- package/components/MenuHeader/MenuHeader.md +0 -35
- package/components/MenuItem/MenuItem.md +0 -139
- package/components/MenuSeparator/MenuSeparator.md +0 -14
- package/components/MiniModal/MiniModal.md +0 -231
- package/components/Modal/Modal.md +0 -56
- package/components/Paging/Paging.md +0 -57
- package/components/PasswordInput/PasswordInput.md +0 -29
- package/components/Radio/Radio.md +0 -57
- package/components/RadioGroup/RadioGroup.md +0 -44
- package/components/ResponsiveLayout/ResponsiveLayout.md +0 -75
- package/components/ScrollContainer/ScrollContainer.md +0 -224
- package/components/Select/Select.md +0 -113
- package/components/SidePage/SidePage.md +0 -65
- package/components/SingleToast/SingleToast.md +0 -36
- package/components/Spinner/Spinner.md +0 -36
- package/components/Sticky/Sticky.md +0 -28
- package/components/Switcher/Switcher.md +0 -111
- package/components/Tabs/Tab.md +0 -73
- package/components/Tabs/Tabs.md +0 -54
- package/components/Textarea/Textarea.md +0 -58
- package/components/Toast/Toast.md +0 -69
- package/components/Toggle/Toggle.md +0 -110
- package/components/Token/Token.md +0 -48
- package/components/TokenInput/TokenInput.md +0 -277
- package/components/Tooltip/Tooltip.md +0 -322
- package/components/TooltipMenu/TooltipMenu.md +0 -241
- package/internal/DataTids/DATATIDS.md +0 -12
- package/internal/DataTids/DataTids/DataTids.js +0 -69
- package/internal/DataTids/DataTids/DataTids.js.map +0 -1
- package/internal/DataTids/DataTids/package.json +0 -6
- package/internal/DataTids/DataTids.d.ts +0 -12
- package/internal/DataTids/DataTids.styles/DataTids.styles.js +0 -20
- package/internal/DataTids/DataTids.styles/DataTids.styles.js.map +0 -1
- package/internal/DataTids/DataTids.styles/package.json +0 -6
- package/internal/DataTids/DataTids.styles.d.ts +0 -7
- package/internal/DataTids/componentsDataTids/componentsDataTids.js +0 -12
- package/internal/DataTids/componentsDataTids/componentsDataTids.js.map +0 -1
- package/internal/DataTids/componentsDataTids/package.json +0 -6
- package/internal/DataTids/componentsDataTids.d.ts +0 -5
- package/internal/ThemePlayground/Playground.md +0 -7
- package/lib/featureFlagsContext/FEATUREFLAGSCONTEXT.md +0 -64
- package/lib/locale/LOCALECONTEXT.md +0 -222
- package/lib/theming/ThemeContext.md +0 -265
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
Локализации компонентов через контекст `React.Context<LocaleContextProps>`
|
|
2
|
-
|
|
3
|
-
```typescript static
|
|
4
|
-
interface LocaleContextProps {
|
|
5
|
-
locale?: LocaleControls;
|
|
6
|
-
langCode?: LangCodes;
|
|
7
|
-
}
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
Доступные языки
|
|
11
|
-
|
|
12
|
-
```typescript static
|
|
13
|
-
enum LangCodes {
|
|
14
|
-
ru_RU = 'ru_RU',
|
|
15
|
-
en_GB = 'en_GB',
|
|
16
|
-
}
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
LocaleControls
|
|
20
|
-
|
|
21
|
-
```typescript static
|
|
22
|
-
interface LocaleControls {
|
|
23
|
-
Autocomplete?: AutocompleteLocale;
|
|
24
|
-
Spinner?: SpinnerLocale;
|
|
25
|
-
TokenInput?: TokenInputLocale;
|
|
26
|
-
ComboBox?: ComboBoxLocale;
|
|
27
|
-
Select?: SelectLocale;
|
|
28
|
-
Paging?: PagingLocale;
|
|
29
|
-
DatePicker?: DatePickerLocale;
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### Использование
|
|
34
|
-
|
|
35
|
-
Дефолтная локализация `<TokenInput />`
|
|
36
|
-
|
|
37
|
-
```jsx harmony
|
|
38
|
-
import { LangCodes, LocaleContext, TokenInput, TokenInputType } from '@skbkontur/react-ui';
|
|
39
|
-
|
|
40
|
-
const delay = time => args => new Promise(resolve => setTimeout(resolve, time, args));
|
|
41
|
-
|
|
42
|
-
<LocaleContext.Provider value={{ langCode: LangCodes.en_GB }}>
|
|
43
|
-
<TokenInput type={TokenInputType.Combined} getItems={() => Promise.resolve([]).then(delay(500))} />
|
|
44
|
-
</LocaleContext.Provider>;
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Кастомная локализация `<TokenInput />`
|
|
48
|
-
|
|
49
|
-
```jsx harmony
|
|
50
|
-
import { LocaleContext, TokenInput, TokenInputType } from '@skbkontur/react-ui';
|
|
51
|
-
|
|
52
|
-
const delay = time => args => new Promise(resolve => setTimeout(resolve, time, args));
|
|
53
|
-
|
|
54
|
-
const customLocale = {
|
|
55
|
-
TokenInput: {
|
|
56
|
-
addButtonComment: 'Press Enter or type Spacebar',
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
<LocaleContext.Provider value={{ locale: customLocale }}>
|
|
61
|
-
<TokenInput type={TokenInputType.Combined} delimiters={[' ']} getItems={() => Promise.resolve([]).then(delay(500))} />
|
|
62
|
-
</LocaleContext.Provider>;
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
Некоторые контролы используют компоненты других контролов.
|
|
66
|
-
<br/>
|
|
67
|
-
Для инкапсуляции локализации можно использовать несколько контекстов.
|
|
68
|
-
|
|
69
|
-
```jsx harmony
|
|
70
|
-
import { Gapped, LangCodes, LocaleContext, Spinner, TokenInput } from '@skbkontur/react-ui';
|
|
71
|
-
|
|
72
|
-
const delay = time => args => new Promise(resolve => setTimeout(resolve, time, args));
|
|
73
|
-
|
|
74
|
-
const customLocale = {
|
|
75
|
-
Spinner: {
|
|
76
|
-
loading: 'awaiting...',
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
<LocaleContext.Provider value={{ langCode: LangCodes.en_GB }}>
|
|
81
|
-
<Gapped vertical gap={10}>
|
|
82
|
-
<LocaleContext.Provider value={{ locale: customLocale }}>
|
|
83
|
-
<TokenInput getItems={() => Promise.resolve([]).then(delay(1500))} />
|
|
84
|
-
</LocaleContext.Provider>
|
|
85
|
-
<TokenInput getItems={() => Promise.resolve([]).then(delay(1500))} />
|
|
86
|
-
<Spinner />
|
|
87
|
-
</Gapped>
|
|
88
|
-
</LocaleContext.Provider>;
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Локализация функционального компонента через useContext.
|
|
92
|
-
|
|
93
|
-
```jsx harmony
|
|
94
|
-
import { useContext } from 'react';
|
|
95
|
-
import { LangCodes, LocaleContext } from '@skbkontur/react-ui';
|
|
96
|
-
|
|
97
|
-
const languages = {
|
|
98
|
-
[LangCodes.ru_RU]: 'Русский',
|
|
99
|
-
[LangCodes.en_GB]: 'English',
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
function LocalizedByHook() {
|
|
103
|
-
const { langCode } = useContext(LocaleContext);
|
|
104
|
-
return <div>{languages[langCode]}</div>;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
<LocaleContext.Provider value={{ langCode: LangCodes.en_GB }}>
|
|
108
|
-
<LocalizedByHook />
|
|
109
|
-
</LocaleContext.Provider>;
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Обзор всех доступных контролов
|
|
113
|
-
|
|
114
|
-
```jsx harmony
|
|
115
|
-
import {
|
|
116
|
-
ComboBox,
|
|
117
|
-
DateInput,
|
|
118
|
-
DatePicker,
|
|
119
|
-
Gapped,
|
|
120
|
-
LocaleContext,
|
|
121
|
-
Paging,
|
|
122
|
-
Select,
|
|
123
|
-
Spinner,
|
|
124
|
-
TokenInput,
|
|
125
|
-
LangCodes,
|
|
126
|
-
} from '@skbkontur/react-ui';
|
|
127
|
-
import { TokenInputType } from '@skbkontur/react-ui/components/TokenInput';
|
|
128
|
-
|
|
129
|
-
const delay = time => args => new Promise(resolve => setTimeout(resolve, time, args));
|
|
130
|
-
|
|
131
|
-
const items = [
|
|
132
|
-
{ label: 'aaa', value: 1 },
|
|
133
|
-
{ label: 'bbb', value: 2 },
|
|
134
|
-
{ label: 'ccc', value: 3 },
|
|
135
|
-
];
|
|
136
|
-
|
|
137
|
-
const LocalizationControlNames = {
|
|
138
|
-
ComboBox: 'ComboBox',
|
|
139
|
-
Spinner: 'Spinner',
|
|
140
|
-
TokenInput: 'TokenInput',
|
|
141
|
-
Select: 'Select',
|
|
142
|
-
Paging: 'Paging',
|
|
143
|
-
DatePicker: 'DatePicker',
|
|
144
|
-
DateInput: 'DateInput',
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
class LocalizationControls extends React.Component {
|
|
148
|
-
constructor(props) {
|
|
149
|
-
super(props);
|
|
150
|
-
this.state = {
|
|
151
|
-
langCode: LangCodes.ru_RU,
|
|
152
|
-
controlName: null,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
render() {
|
|
157
|
-
// попробуйте кастомизировать локаль любого контрола
|
|
158
|
-
const customLocaleRU = {};
|
|
159
|
-
const customLocaleEN = {};
|
|
160
|
-
|
|
161
|
-
const locale = this.state.langCode === LangCodes.en_GB ? customLocaleEN : customLocaleRU;
|
|
162
|
-
|
|
163
|
-
return (
|
|
164
|
-
<Gapped vertical gap={10}>
|
|
165
|
-
<Select
|
|
166
|
-
value={this.state.langCode}
|
|
167
|
-
placeholder="Выбрать язык"
|
|
168
|
-
items={Object.values(LangCodes)}
|
|
169
|
-
onValueChange={langCode => this.setState({ langCode })}
|
|
170
|
-
/>
|
|
171
|
-
<Select
|
|
172
|
-
value={this.state.controlName}
|
|
173
|
-
placeholder="Выбрать контрол"
|
|
174
|
-
items={Object.values(LocalizationControlNames)}
|
|
175
|
-
onValueChange={controlName => this.setState({ controlName })}
|
|
176
|
-
/>
|
|
177
|
-
<LocaleContext.Provider value={{ langCode: this.state.langCode, locale: locale }}>
|
|
178
|
-
{this.getControl(this.state.controlName)}
|
|
179
|
-
</LocaleContext.Provider>
|
|
180
|
-
</Gapped>
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
getControl(controlName) {
|
|
185
|
-
switch (controlName) {
|
|
186
|
-
case LocalizationControlNames.ComboBox:
|
|
187
|
-
return (
|
|
188
|
-
<ComboBox
|
|
189
|
-
getItems={str => Promise.resolve(items.filter(({ label }) => label.includes(str))).then(delay(500))}
|
|
190
|
-
onValueChange={({ label: langCode }) => this.setState({ langCode })}
|
|
191
|
-
/>
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
case LocalizationControlNames.TokenInput:
|
|
195
|
-
return <TokenInput type={TokenInputType.Combined} getItems={() => Promise.resolve([]).then(delay(500))} />;
|
|
196
|
-
|
|
197
|
-
case LocalizationControlNames.Spinner:
|
|
198
|
-
return <Spinner />;
|
|
199
|
-
|
|
200
|
-
case LocalizationControlNames.DatePicker:
|
|
201
|
-
return <DatePicker value="30.12.2012" />;
|
|
202
|
-
|
|
203
|
-
case LocalizationControlNames.DateInput:
|
|
204
|
-
return <DateInput value="30.12.2012" />;
|
|
205
|
-
|
|
206
|
-
case LocalizationControlNames.Select:
|
|
207
|
-
return <Select />;
|
|
208
|
-
|
|
209
|
-
case LocalizationControlNames.Paging:
|
|
210
|
-
return <Paging activePage={1} pagesCount={12} onPageChange={value => value} />;
|
|
211
|
-
}
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
<LocalizationControls />;
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
### Локализация @skbkontur/react-ui-addons
|
|
220
|
-
|
|
221
|
-
Компоненты `@skbkontur/react-ui-addons` так же поддерживают локализацию через `LocaleContext` из `@skbkontur/react-ui`.
|
|
222
|
-
См. пример с кастомной локализацией. Дефолтные локали описаны для каждого компонента в [докумендации аддонов](https://ui.gitlab-pages.kontur.host/docs/#/react-ui-addons).
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
Для кастомизации компонентов используется ThemeContext, реализуемый через `React.Context<Theme>`
|
|
2
|
-
|
|
3
|
-
Механизм работы: динамические стили генерируются в зависимости от темы в процессе render'а с помощью <a href="https://www.npmjs.com/package/emotion" target="_blank">emotion</a>, полученные классы добавляются в `className` соответствующих элементов.
|
|
4
|
-
|
|
5
|
-
Тема задается с помощью `ThemeContext.Provider`:
|
|
6
|
-
|
|
7
|
-
```jsx static
|
|
8
|
-
import { ThemeContext } from '@skbkontur/react-ui';
|
|
9
|
-
|
|
10
|
-
<ThemeContext.Provider value={theme}>{/* ... */}</ThemeContext.Provider>;
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Использовать тему в компоненте можно через `ThemeContext.Consumer`:
|
|
14
|
-
|
|
15
|
-
```jsx static
|
|
16
|
-
import { ThemeContext, Button } from '@skbkontur/react-ui';
|
|
17
|
-
|
|
18
|
-
<ThemeContext.Consumer>
|
|
19
|
-
{theme => /* ... */ }
|
|
20
|
-
</ThemeContext.Consumer>
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
`useContext` в функциональных компонентах:
|
|
24
|
-
|
|
25
|
-
```typescript static
|
|
26
|
-
const theme = useContext(ThemeContext);
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
или задать `contextType` для класса:
|
|
30
|
-
|
|
31
|
-
```typescript static
|
|
32
|
-
public static contextType = ThemeContext;
|
|
33
|
-
public context: Theme = this.context;
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Список существующих тем:
|
|
37
|
-
|
|
38
|
-
| Имя | Описание |
|
|
39
|
-
|-------------------------|---------------------------------------------------|
|
|
40
|
-
| `LIGHT_THEME` | Текущая светлая тема, включена по умолчанию. Всегда включает в себя актуальные визуальные обновления. |
|
|
41
|
-
| `DARK_THEME` | Текущая тёмная тема. Всегда включает в себя актуальные визуальные обновления. |
|
|
42
|
-
| `LIGHT_THEME_2022_0` | Вариант светлой темы без актуальных визуальных обновлений. |
|
|
43
|
-
| `DARK_THEME_2022_0` | Вариант тёмной темы без актуальных визуальных обновлений. |
|
|
44
|
-
|
|
45
|
-
Если не нужны постоянные визуальные изменения, то можно использовать вариант `_2022_N`. В будущем, новые варианты с постфиксом `_2022_N` будут появлятся при обновлении дизайн системы.
|
|
46
|
-
|
|
47
|
-
## Примеры использования
|
|
48
|
-
|
|
49
|
-
### Создание собственной темы
|
|
50
|
-
|
|
51
|
-
Собственные значения нужно передать в `ThemeFactory.create` и получившуюся тему можно использовать в `ThemeContext.Provider`. `ThemeFactory` расширяет переданный объект, задавая в качестве прототипа объект темы по умолчанию.
|
|
52
|
-
|
|
53
|
-
```jsx harmony
|
|
54
|
-
import { ThemeContext, ThemeFactory } from '@skbkontur/react-ui';
|
|
55
|
-
import { ShowcaseGroup } from '@skbkontur/react-ui/internal/ThemePlayground/ShowcaseGroup';
|
|
56
|
-
|
|
57
|
-
const myTheme = ThemeFactory.create({ btnBorderRadiusSmall: '10px' });
|
|
58
|
-
|
|
59
|
-
<ThemeContext.Provider value={myTheme}>
|
|
60
|
-
<div style={{height: '100%', background: '#fff', padding: '16px'}}>
|
|
61
|
-
<ShowcaseGroup title="My Theme" />
|
|
62
|
-
</div>
|
|
63
|
-
</ThemeContext.Provider>;
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Вторым аргументом `ThemeFactory.create` может принимать объект, который будет использован в качестве базовой темы.
|
|
67
|
-
|
|
68
|
-
```jsx static
|
|
69
|
-
import { ThemeFactory, LIGHT_THEME } from '@skbkontur/react-ui';
|
|
70
|
-
|
|
71
|
-
const myFlatTheme = ThemeFactory.create({ btnBorderRadiusSmall: '10px' }, LIGHT_THEME);
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Использование темы в своих компонентах
|
|
75
|
-
|
|
76
|
-
```jsx harmony
|
|
77
|
-
import { useContext } from 'react';
|
|
78
|
-
import { ThemeContext, Button } from '@skbkontur/react-ui';
|
|
79
|
-
|
|
80
|
-
function ButtonLinkWrapper(props) {
|
|
81
|
-
const theme = useContext(ThemeContext);
|
|
82
|
-
|
|
83
|
-
return (
|
|
84
|
-
<Button use="link" {...props}>
|
|
85
|
-
{props.children}
|
|
86
|
-
<span style={{ color: theme.textColorDefault }}> ↗</span>
|
|
87
|
-
</Button>
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
<ButtonLinkWrapper>ButtonLinkWrapper</ButtonLinkWrapper>;
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Добавление своих переменных
|
|
95
|
-
|
|
96
|
-
Если вы хотите дополнить одну из тем новыми переменными для своих компонентов, то вы можете использовать отдельный контекст в расширенным объектом темы.
|
|
97
|
-
|
|
98
|
-
```jsx harmony
|
|
99
|
-
import { useContext } from 'react';
|
|
100
|
-
import { ThemeFactory, Button } from '@skbkontur/react-ui';
|
|
101
|
-
|
|
102
|
-
const MyThemeContext = React.createContext(ThemeFactory.create({ myTextColor: 'orange' }));
|
|
103
|
-
|
|
104
|
-
MyThemeContext.displayName = 'MyThemeContext';
|
|
105
|
-
|
|
106
|
-
function ButtonLinkWrapper(props) {
|
|
107
|
-
const theme = useContext(MyThemeContext);
|
|
108
|
-
|
|
109
|
-
return (
|
|
110
|
-
<Button use="link" {...props}>
|
|
111
|
-
{props.children}
|
|
112
|
-
<span style={{ color: theme.myTextColor }}> ↗</span>
|
|
113
|
-
</Button>
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
<ButtonLinkWrapper>ButtonLinkWrapper</ButtonLinkWrapper>;
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Кастомизация в legacy-приложениях
|
|
121
|
-
|
|
122
|
-
В случае, если контролы рендерятся через какую-то общую обертку, достаточно добавить в нее `ThemeContext.Provider` с вашей темой. В противном случае, вам подойдет метод `ThemeFactory.overrideDefaultTheme()`.
|
|
123
|
-
|
|
124
|
-
```typescript static
|
|
125
|
-
import theme from './theme/theme';
|
|
126
|
-
import { ThemeFactory } from '@skbkontur/react-ui/lib/theming/ThemeFactory';
|
|
127
|
-
|
|
128
|
-
ThemeFactory.overrideDefaultTheme(theme);
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### Варианты кастомизации:
|
|
132
|
-
|
|
133
|
-
Несколько тем одновременно:
|
|
134
|
-
<br/>
|
|
135
|
-
|
|
136
|
-
```jsx harmony
|
|
137
|
-
import { ThemeContext, LIGHT_THEME, DARK_THEME } from '@skbkontur/react-ui';
|
|
138
|
-
import { ShowcaseGroup } from '@skbkontur/react-ui/internal/ThemePlayground/ShowcaseGroup';
|
|
139
|
-
|
|
140
|
-
const CombinedComponents = () => (
|
|
141
|
-
<>
|
|
142
|
-
<div style={{height: '100%', background: '#fff', padding: '16px'}}>
|
|
143
|
-
<ThemeContext.Provider value={LIGHT_THEME}>
|
|
144
|
-
<div>
|
|
145
|
-
<ShowcaseGroup title="LIGHT_THEME" />
|
|
146
|
-
</div>
|
|
147
|
-
</ThemeContext.Provider>
|
|
148
|
-
</div>
|
|
149
|
-
<div style={{height: '100%', background: '#000', padding: '16px'}}>
|
|
150
|
-
<ThemeContext.Provider value={DARK_THEME}>
|
|
151
|
-
<div>
|
|
152
|
-
<ShowcaseGroup title="DARK_THEME" />
|
|
153
|
-
</div>
|
|
154
|
-
</ThemeContext.Provider>
|
|
155
|
-
</div>
|
|
156
|
-
</ >
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
<CombinedComponents />;
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
Вложенные темы:
|
|
163
|
-
<br/>
|
|
164
|
-
|
|
165
|
-
```jsx harmony
|
|
166
|
-
import { ThemeContext, LIGHT_THEME, DARK_THEME } from '@skbkontur/react-ui';
|
|
167
|
-
import { ShowcaseGroup } from '@skbkontur/react-ui/internal/ThemePlayground/ShowcaseGroup';
|
|
168
|
-
|
|
169
|
-
const wrapperStyles = {
|
|
170
|
-
border: '1px solid rgb(188, 187, 187)',
|
|
171
|
-
padding: '0 15px 15px',
|
|
172
|
-
marginTop: 25,
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
const NestedThemes = () => (
|
|
176
|
-
<ThemeContext.Provider value={ LIGHT_THEME }>
|
|
177
|
-
<div style={{ ...wrapperStyles, width: 750, background: '#fff' }}>
|
|
178
|
-
<ShowcaseGroup title="LIGHT_THEME" />
|
|
179
|
-
<ThemeContext.Provider value={ DARK_THEME }>
|
|
180
|
-
<div style={{ ...wrapperStyles, background: '#000', color: '#fff' }}>
|
|
181
|
-
<ShowcaseGroup title="DARK_THEME" />
|
|
182
|
-
</div>
|
|
183
|
-
</ThemeContext.Provider>
|
|
184
|
-
</div>
|
|
185
|
-
</ThemeContext.Provider>
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
<NestedThemes />;
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
## Кастомизация @skbkontur/react-ui-addons
|
|
192
|
-
|
|
193
|
-
Компоненты `@skbkontur/react-ui-addons` так же поддерживают кастомизацию через `ThemeContext` из `@skbkontur/react-ui`. Достаточно переопределить нужные переменные, которые перечислены на страницах компонентов в [докумендации аддонов](https://ui.gitlab-pages.kontur.host/docs/#/react-ui-addons).
|
|
194
|
-
|
|
195
|
-
```tsx static
|
|
196
|
-
import { ThemeContext, ThemeFactory } from '@skbkontur/react-ui';
|
|
197
|
-
import { Logotype, AddonsThemeIn } from '@skbkontur/react-ui-addons';
|
|
198
|
-
|
|
199
|
-
const myTheme = ThemeFactory.create<AddonsThemeIn>({
|
|
200
|
-
logoColor: 'black',
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
<ThemeContext.Provider value={myTheme}>
|
|
204
|
-
<Logotype />
|
|
205
|
-
</ThemeContext.Provider>;
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
## Дополнительно
|
|
209
|
-
|
|
210
|
-
### ColorFunctions.ts / DimensionFunctions.ts
|
|
211
|
-
|
|
212
|
-
Несколько функций по работе с цветом вынесены из less в js, их можно использовать в своих темах (_ColorFunctions.ts_):
|
|
213
|
-
|
|
214
|
-
```typescript static
|
|
215
|
-
import { ColorFunctions } from '@skbkontur/react-ui'
|
|
216
|
-
|
|
217
|
-
ColorFunctions.lighten(colorString: string, amount: number | string, method?: 'absolute' | 'relative'): string
|
|
218
|
-
ColorFunctions.darken(colorString: string, amount: number | string, method?: 'absolute' | 'relative'): string
|
|
219
|
-
ColorFunctions.contrast(colorString: string, darkString?: string, lightString?: string, threshold: number = 0.43): string
|
|
220
|
-
ColorFunctions.red(colorString: string): string
|
|
221
|
-
ColorFunctions.green(colorString: string): string
|
|
222
|
-
ColorFunctions.blue(colorString: string): string
|
|
223
|
-
ColorFunctions.alpha(colorString: string): string
|
|
224
|
-
ColorFunctions.isValid(colorString: string): boolean // проверяет, можно ли распарсить строку в цвет
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
Документацию по их работе можно найти на сайте [less](http://lesscss.org/functions/#color-operations).
|
|
228
|
-
В качестве colorString можно передать цвет в одном из форматов: `keyword`, `hex`, `rgb(r, g, b)`, `rgba(r, g, b, a)`, `hsl(h, s, l)`, `hsla(h, s, l, a)`.
|
|
229
|
-
В качестве `amount` можно передать строку вида 'N%' или число от 0 до 1.
|
|
230
|
-
Все значения больше или меньше возможных обрезаются. Например, для `rgba(300, -100, 123, 20)` `r=255, g=0, b=123, a=1`.
|
|
231
|
-
Если распарсить `colorString` не получилось - выбрасывается исключение.
|
|
232
|
-
Если это возможно, результат возвращается в том же виде, что и входная строка:
|
|
233
|
-
|
|
234
|
-
```typescript static
|
|
235
|
-
import { ColorFunctions } from '@skbkontur/react-ui'
|
|
236
|
-
|
|
237
|
-
ColorFunctions.lighten('hsl(90, 0.8, 0.2)', '20%') === 'hsl(90, 0.8, 0.4)';
|
|
238
|
-
ColorFunctions.lighten('rgba(50, 50, 50, 0.2)', '20%') === 'rgba(102, 102, 102, 0.2)';
|
|
239
|
-
ColorFunctions.lighten('#80e619', 0.2) === '#b3f075';
|
|
240
|
-
ColorFunctions.lighten('crimson', '20%') === '#f16581';
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
Для работы с размерами предусмотрена одна функция (_DimensionFunctions.ts_):
|
|
244
|
-
|
|
245
|
-
```typescript static
|
|
246
|
-
shift(value: string, shift: string): string
|
|
247
|
-
|
|
248
|
-
// пример
|
|
249
|
-
import { DimensionFunctions } from '@skbkontur/react-ui'
|
|
250
|
-
|
|
251
|
-
DimensionFunctions.shift('100%', '-20') === '80%'
|
|
252
|
-
DimensionFunctions.shift('2em', '+2') === '4em'
|
|
253
|
-
DimensionFunctions.shift('12', '+1') === '13px' //если единица измерения не указана - используется px
|
|
254
|
-
DimensionFunctions.shift('10.2', '12.333451') === '22.5335px' //дробная часть округляется до 4 знаков
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
### Список кастомизируемых компонентов
|
|
258
|
-
|
|
259
|
-
Посмотреть, какие компоненты можно кастомизировать, а также увидеть, какие переменные используются в каждом из них, можно в [таблице](#/Customization/ThemeShowcase)
|
|
260
|
-
Информация собирается в рантайме с помощью `Proxy`, поэтому в IE таблица не отображается.
|
|
261
|
-
|
|
262
|
-
### Playground
|
|
263
|
-
|
|
264
|
-
Внутренний компонент `Playground` (_components/internal/ThemePlayground/Playground.tsx_) можно использовать для построения своей темы.
|
|
265
|
-
Для удобства в редакторе добавлено действие "вывести тему в консоль".
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
### Базовый пример
|
|
2
|
-
```jsx harmony
|
|
3
|
-
import { Autocomplete } from '@skbkontur/react-ui';
|
|
4
|
-
|
|
5
|
-
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
6
|
-
|
|
7
|
-
const [value, setValue] = React.useState('Kappa');
|
|
8
|
-
|
|
9
|
-
<Autocomplete source={items} value={value} onValueChange={setValue} />;
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
### Очистка Autocomplete
|
|
13
|
-
Очистить значение в `Autocomplete` можно только с помощью пустой строки.
|
|
14
|
-
```jsx harmony
|
|
15
|
-
import { Autocomplete, Button, Group } from '@skbkontur/react-ui';
|
|
16
|
-
|
|
17
|
-
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
18
|
-
|
|
19
|
-
const [value, setValue] = React.useState('Kappa');
|
|
20
|
-
|
|
21
|
-
<Group>
|
|
22
|
-
<Autocomplete source={items} value={value} onValueChange={setValue} />
|
|
23
|
-
<Button onClick={() => setValue('')}>Очистить</Button>
|
|
24
|
-
</Group>
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Размер
|
|
28
|
-
```jsx harmony
|
|
29
|
-
import { Autocomplete, Gapped } from '@skbkontur/react-ui';
|
|
30
|
-
|
|
31
|
-
const items = ['Маленький', 'Средний', 'Большой'];
|
|
32
|
-
|
|
33
|
-
const [valueSmall, setValueSmall] = React.useState('Маленький');
|
|
34
|
-
const [valueMedium, setValueMedium] = React.useState('Средний');
|
|
35
|
-
const [valueLarge, setValueLarge] = React.useState('Большой');
|
|
36
|
-
|
|
37
|
-
<Gapped vertical>
|
|
38
|
-
<Autocomplete source={items} value={valueSmall} onValueChange={setValueSmall} size={'small'} />
|
|
39
|
-
<Autocomplete source={items} value={valueMedium} onValueChange={setValueMedium} size={'medium'} />
|
|
40
|
-
<Autocomplete source={items} value={valueLarge} onValueChange={setValueLarge} size={'large'} />
|
|
41
|
-
</Gapped>
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Выделение введеного значения при фокусе
|
|
45
|
-
```jsx harmony
|
|
46
|
-
import { Autocomplete } from '@skbkontur/react-ui';
|
|
47
|
-
|
|
48
|
-
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
49
|
-
|
|
50
|
-
const [value, setValue] = React.useState('');
|
|
51
|
-
|
|
52
|
-
<Autocomplete source={items} value={value} onValueChange={setValue} selectAllOnFocus />
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Иконка
|
|
56
|
-
```jsx harmony
|
|
57
|
-
import { Autocomplete, Gapped } from '@skbkontur/react-ui';
|
|
58
|
-
import { SearchLoupeIcon16Regular } from '@skbkontur/icons/SearchLoupeIcon16Regular';
|
|
59
|
-
|
|
60
|
-
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
61
|
-
|
|
62
|
-
const [valueLeft, setValueLeft] = React.useState('');
|
|
63
|
-
const [valueRight, setValueRight] = React.useState('');
|
|
64
|
-
|
|
65
|
-
<Gapped>
|
|
66
|
-
<Autocomplete source={items} value={valueLeft} onValueChange={setValueLeft} leftIcon={<SearchLoupeIcon16Regular />} />
|
|
67
|
-
<Autocomplete source={items} value={valueRight} onValueChange={setValueRight} rightIcon={<SearchLoupeIcon16Regular />} />
|
|
68
|
-
</Gapped>
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Ширина меню
|
|
72
|
-
```jsx harmony
|
|
73
|
-
import { Autocomplete } from '@skbkontur/react-ui';
|
|
74
|
-
|
|
75
|
-
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
76
|
-
|
|
77
|
-
const [value, setValue] = React.useState('');
|
|
78
|
-
|
|
79
|
-
<Autocomplete source={items} value={value} onValueChange={setValue} menuWidth={'80%'} />
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Расположение выпадающего окна Autocomplete
|
|
83
|
-
```jsx harmony
|
|
84
|
-
import { Autocomplete } from '@skbkontur/react-ui';
|
|
85
|
-
|
|
86
|
-
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
87
|
-
|
|
88
|
-
const [value, setValue] = React.useState('');
|
|
89
|
-
|
|
90
|
-
<Autocomplete source={items} value={value} onValueChange={setValue} menuPos={'top'} />
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Тень у выпадающего меню
|
|
94
|
-
```jsx harmony
|
|
95
|
-
import { Autocomplete } from '@skbkontur/react-ui';
|
|
96
|
-
|
|
97
|
-
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
98
|
-
|
|
99
|
-
const [value, setValue] = React.useState('');
|
|
100
|
-
|
|
101
|
-
<Autocomplete source={items} value={value} onValueChange={setValue} hasShadow />
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### Режима прозрачной рамки
|
|
105
|
-
```jsx harmony
|
|
106
|
-
import { Autocomplete } from '@skbkontur/react-ui';
|
|
107
|
-
|
|
108
|
-
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
109
|
-
|
|
110
|
-
const [value, setValue] = React.useState('Kappa');
|
|
111
|
-
|
|
112
|
-
<Autocomplete source={items} value={value} onValueChange={setValue} borderless />
|
|
113
|
-
```
|