@skbkontur/react-ui 4.5.1 → 4.5.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 +12 -0
- package/README.md +27 -4
- package/cjs/components/Autocomplete/Autocomplete.md +15 -1
- package/cjs/components/ComboBox/ComboBox.md +32 -0
- package/cjs/components/DatePicker/DatePicker.md +18 -0
- package/cjs/components/FxInput/FxInput.md +13 -0
- package/cjs/components/Input/Input.md +12 -0
- package/cjs/components/Loader/Loader.d.ts +11 -2
- package/cjs/components/Loader/Loader.js +10 -1
- package/cjs/components/Loader/Loader.js.map +1 -1
- package/cjs/components/Loader/Loader.md +30 -23
- package/cjs/components/Select/Select.md +14 -0
- package/cjs/components/Spinner/Spinner.d.ts +11 -2
- package/cjs/components/Spinner/Spinner.js +10 -1
- package/cjs/components/Spinner/Spinner.js.map +1 -1
- package/cjs/components/Textarea/Textarea.md +19 -0
- package/cjs/internal/ZIndex/ZIndex.d.ts +17 -3
- package/cjs/internal/ZIndex/ZIndex.js +55 -14
- package/cjs/internal/ZIndex/ZIndex.js.map +1 -1
- package/cjs/lib/rootNode/getRootNode.d.ts +1 -1
- package/cjs/lib/rootNode/getRootNode.js +37 -12
- package/cjs/lib/rootNode/getRootNode.js.map +1 -1
- package/components/Autocomplete/Autocomplete.md +15 -1
- package/components/ComboBox/ComboBox.md +32 -0
- package/components/DatePicker/DatePicker.md +18 -0
- package/components/FxInput/FxInput.md +13 -0
- package/components/Input/Input.md +12 -0
- package/components/Loader/Loader/Loader.js +3 -1
- package/components/Loader/Loader/Loader.js.map +1 -1
- package/components/Loader/Loader.d.ts +11 -2
- package/components/Loader/Loader.md +30 -23
- package/components/Select/Select.md +14 -0
- package/components/Spinner/Spinner/Spinner.js +1 -1
- package/components/Spinner/Spinner/Spinner.js.map +1 -1
- package/components/Spinner/Spinner.d.ts +11 -2
- package/components/Textarea/Textarea.md +19 -0
- package/internal/ZIndex/ZIndex/ZIndex.js +46 -27
- package/internal/ZIndex/ZIndex/ZIndex.js.map +1 -1
- package/internal/ZIndex/ZIndex.d.ts +17 -3
- package/lib/rootNode/getRootNode/getRootNode.js +28 -10
- package/lib/rootNode/getRootNode/getRootNode.js.map +1 -1
- package/lib/rootNode/getRootNode.d.ts +1 -1
- package/package.json +2 -2
|
@@ -1,25 +1,32 @@
|
|
|
1
1
|
```jsx harmony
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
</
|
|
8
|
-
<
|
|
9
|
-
|
|
10
|
-
<
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
</
|
|
2
|
+
import { Button } from '@skbkontur/react-ui';
|
|
3
|
+
|
|
4
|
+
const [isActive, setIsActive] = React.useState(true);
|
|
5
|
+
|
|
6
|
+
<>
|
|
7
|
+
<Button onClick={() => setIsActive(!isActive)}>{isActive ? 'Остановить загрузку' : 'Продолжить загрузку'}</Button>
|
|
8
|
+
<Loader type="big" active={isActive}>
|
|
9
|
+
<h1>Yeah, and if you were the pope they'd be all, "Straighten your pope hat." And "Put on your good vestments."</h1>
|
|
10
|
+
<p>
|
|
11
|
+
No, I'm Santa Claus! I guess if you want children beaten, you have to do it yourself. We're also Santa Claus! Leela,
|
|
12
|
+
Bender, we're going grave robbing.
|
|
13
|
+
</p>
|
|
14
|
+
<p>
|
|
15
|
+
Are you crazy? I can't swallow that. Large bet on myself in round one. Hey, whatcha watching?
|
|
16
|
+
<strong> Moving along… I guess if you want children beaten, you have to do it yourself.</strong>
|
|
17
|
+
<em>It's okay, Bender.</em> I like cooking too.
|
|
18
|
+
</p>
|
|
19
|
+
<h2>Oh, I think we should just stay friends.</h2>
|
|
20
|
+
<p>
|
|
21
|
+
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
|
|
22
|
+
more stuff to steal! Oh, how awful. Did he at least die painlessly? …To shreds, you say. Well, how is his wife
|
|
23
|
+
holding up? …To shreds, you say.
|
|
24
|
+
</p>
|
|
25
|
+
<ol>
|
|
26
|
+
<li>No! The kind with looting and maybe starting a few fires!</li>
|
|
27
|
+
<li>You are the last hope of the universe.</li>
|
|
28
|
+
<li>Hey, guess what you're accessories to.</li>
|
|
29
|
+
</ol>
|
|
30
|
+
</Loader>
|
|
31
|
+
</>
|
|
25
32
|
```
|
|
@@ -8,6 +8,20 @@ const items = [Select.static(() => <Select.Item>Not selectable</Select.Item>), '
|
|
|
8
8
|
<Select items={items} value={value} onValueChange={setValue} />;
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
Очистить значение в `Select`'е можно только с помощью `null`
|
|
12
|
+
```jsx harmony
|
|
13
|
+
import { Button, Group } from '@skbkontur/react-ui';
|
|
14
|
+
|
|
15
|
+
const [value, setValue] = React.useState();
|
|
16
|
+
|
|
17
|
+
const items = ['One', 'Two', 'Three', 'Four'];
|
|
18
|
+
|
|
19
|
+
<Group>
|
|
20
|
+
<Select items={items} value={value} onValueChange={setValue} />
|
|
21
|
+
<Button onClick={() => setValue(null)}>Очистить</Button>
|
|
22
|
+
</Group>
|
|
23
|
+
```
|
|
24
|
+
|
|
11
25
|
Пример с полем поиска.
|
|
12
26
|
|
|
13
27
|
```jsx harmony
|
|
@@ -24,7 +24,7 @@ export var SpinnerDataTids = {
|
|
|
24
24
|
};
|
|
25
25
|
export
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
27
|
+
* Используйте компонент `Spinner`, если вам нужен спиннер, без дополнительного функционала, который предоставляет компонент [Loader](https://tech.skbkontur.ru/react-ui/#/Components/Loader)
|
|
28
28
|
*/
|
|
29
29
|
var Spinner = (_dec = locale('Spinner', SpinnerLocaleHelper), rootNode(_class = _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_React$Component) {
|
|
30
30
|
_inheritsLoose(Spinner, _React$Component);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Spinner.tsx"],"names":["React","PropTypes","locale","ThemeContext","SpinnerIcon","CommonWrapper","cx","rootNode","createPropsGetter","styles","SpinnerLocaleHelper","types","big","mini","normal","SpinnerDataTids","root","Spinner","getProps","defaultProps","renderSpinner","type","dimmed","inline","circle","theme","props","color","circleDimmedColor","circleWithoutColorAnimation","width","renderCaption","caption","captionColor","render","renderMain","loading","setRootNode","spinner","inner","Component","__KONTUR_REACT_UI__","propTypes","node","bool","oneOf","Object","keys","Types"],"mappings":"iKAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,SAAP,MAAsB,YAAtB;;AAEA,SAASC,MAAT,QAAuB,6BAAvB;;AAEA,SAASC,YAAT,QAA6B,gCAA7B;AACA,SAASC,WAAT,QAA4B,kCAA5B;AACA,SAAsBC,aAAtB,QAA2C,8BAA3C;AACA,SAASC,EAAT,QAAmB,2BAAnB;AACA,SAASC,QAAT,QAAuC,oBAAvC;AACA,SAASC,iBAAT,QAAkC,6BAAlC;;AAEA,SAASC,MAAT,QAAuB,kBAAvB;AACA,SAAwBC,mBAAxB,QAAmD,UAAnD;;AAEA,IAAMC,KAAuC,GAAG;AAC9CC,EAAAA,GAAG,EAAE,KADyC;AAE9CC,EAAAA,IAAI,EAAE,MAFwC;AAG9CC,EAAAA,MAAM,EAAE,QAHsC,EAAhD
|
|
1
|
+
{"version":3,"sources":["Spinner.tsx"],"names":["React","PropTypes","locale","ThemeContext","SpinnerIcon","CommonWrapper","cx","rootNode","createPropsGetter","styles","SpinnerLocaleHelper","types","big","mini","normal","SpinnerDataTids","root","Spinner","getProps","defaultProps","renderSpinner","type","dimmed","inline","circle","theme","props","color","circleDimmedColor","circleWithoutColorAnimation","width","renderCaption","caption","captionColor","render","renderMain","loading","setRootNode","spinner","inner","Component","__KONTUR_REACT_UI__","propTypes","node","bool","oneOf","Object","keys","Types"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { locale } from '../../lib/locale/decorators';\nimport { Theme } from '../../lib/theming/Theme';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { SpinnerIcon } from '../../internal/icons/SpinnerIcon';\nimport { CommonProps, CommonWrapper } from '../../internal/CommonWrapper';\nimport { cx } from '../../lib/theming/Emotion';\nimport { rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\n\nimport { styles } from './Spinner.styles';\nimport { SpinnerLocale, SpinnerLocaleHelper } from './locale';\n\nconst types: Record<SpinnerType, SpinnerType> = {\n big: 'big',\n mini: 'mini',\n normal: 'normal',\n};\n\nexport type SpinnerType = 'mini' | 'normal' | 'big';\n\nexport interface SpinnerProps extends CommonProps {\n /**\n * Подпись под спиннером\n */\n caption?: React.ReactNode;\n /**\n * Переводит спиннер в \"затемнённый режим\"\n *\n * Цвет спиннера в \"затемнённом режиме\" определяется переменной `spinnerDimmedColor`\n */\n dimmed?: boolean;\n /**\n * Размер спиннера и текста\n *\n * @default normal\n */\n type?: SpinnerType;\n inline?: boolean;\n /**\n * Толщина спиннера\n */\n width?: number;\n /**\n * Цвет спиннера\n */\n color?: React.CSSProperties['color'];\n}\n\nexport const SpinnerDataTids = {\n root: 'Spinner__root',\n} as const;\n\ntype DefaultProps = Required<Pick<SpinnerProps, 'type'>>;\n\n/**\n * Используйте компонент `Spinner`, если вам нужен спиннер, без дополнительного функционала, который предоставляет компонент [Loader](https://tech.skbkontur.ru/react-ui/#/Components/Loader)\n */\n\n@rootNode\n@locale('Spinner', SpinnerLocaleHelper)\nexport class Spinner extends React.Component<SpinnerProps> {\n public static __KONTUR_REACT_UI__ = 'Spinner';\n\n public static propTypes = {\n /**\n * Текст рядом с мини-лоадером.\n *\n * 'Загрузка' - значение по-умолчанию\n */\n caption: PropTypes.node,\n\n dimmed: PropTypes.bool,\n\n /**\n * Тип спиннера: mini, normal, big\n *\n * Значение по-умолчанию - normal\n *\n * Spinner.types - все доступные типы\n */\n type: PropTypes.oneOf(Object.keys(types)),\n };\n\n public static defaultProps: DefaultProps = {\n type: 'normal',\n };\n\n private getProps = createPropsGetter(Spinner.defaultProps);\n\n public static Types: typeof types = types;\n private theme!: Theme;\n private readonly locale!: SpinnerLocale;\n private setRootNode!: TSetRootNode;\n\n public render() {\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n this.theme = theme;\n return this.renderMain();\n }}\n </ThemeContext.Consumer>\n );\n }\n\n private renderMain() {\n const { caption = this.locale.loading, dimmed, inline } = this.props;\n const type = this.getProps().type;\n\n return (\n <CommonWrapper rootNodeRef={this.setRootNode} {...this.props}>\n <div data-tid={SpinnerDataTids.root} className={styles.spinner()}>\n <span className={styles.inner()}>{this.renderSpinner(type, dimmed, inline)}</span>\n {caption && this.renderCaption(type, caption)}\n </div>\n </CommonWrapper>\n );\n }\n\n private renderSpinner = (type: SpinnerType, dimmed?: boolean, inline?: boolean) => {\n return (\n <SpinnerIcon\n size={type}\n className={cx({\n [styles.circle(this.theme)]: !dimmed && !this.props.color,\n [styles.circleDimmedColor(this.theme)]: dimmed,\n [styles.circleWithoutColorAnimation()]: dimmed || !!this.props.color,\n })}\n dimmed={dimmed}\n width={this.props.width}\n color={this.props.color}\n inline={inline}\n />\n );\n };\n\n private renderCaption = (type: SpinnerType, caption: React.ReactNode) => (\n <span className={cx(styles[type](this.theme), styles.captionColor(this.theme))}>{caption}</span>\n );\n}\n"]}
|
|
@@ -4,10 +4,19 @@ import { CommonProps } from '../../internal/CommonWrapper';
|
|
|
4
4
|
declare const types: Record<SpinnerType, SpinnerType>;
|
|
5
5
|
export declare type SpinnerType = 'mini' | 'normal' | 'big';
|
|
6
6
|
export interface SpinnerProps extends CommonProps {
|
|
7
|
+
/**
|
|
8
|
+
* Подпись под спиннером
|
|
9
|
+
*/
|
|
7
10
|
caption?: React.ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Переводит спиннер в "затемнённый режим"
|
|
13
|
+
*
|
|
14
|
+
* Цвет спиннера в "затемнённом режиме" определяется переменной `spinnerDimmedColor`
|
|
15
|
+
*/
|
|
8
16
|
dimmed?: boolean;
|
|
9
17
|
/**
|
|
10
|
-
*
|
|
18
|
+
* Размер спиннера и текста
|
|
19
|
+
*
|
|
11
20
|
* @default normal
|
|
12
21
|
*/
|
|
13
22
|
type?: SpinnerType;
|
|
@@ -26,7 +35,7 @@ export declare const SpinnerDataTids: {
|
|
|
26
35
|
};
|
|
27
36
|
declare type DefaultProps = Required<Pick<SpinnerProps, 'type'>>;
|
|
28
37
|
/**
|
|
29
|
-
*
|
|
38
|
+
* Используйте компонент `Spinner`, если вам нужен спиннер, без дополнительного функционала, который предоставляет компонент [Loader](https://tech.skbkontur.ru/react-ui/#/Components/Loader)
|
|
30
39
|
*/
|
|
31
40
|
export declare class Spinner extends React.Component<SpinnerProps> {
|
|
32
41
|
static __KONTUR_REACT_UI__: string;
|
|
@@ -9,6 +9,25 @@ const [value, setValue] = React.useState('');
|
|
|
9
9
|
/>;
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
+
Очистить значение в `Textarea` можно только с помощью пустой строки
|
|
13
|
+
|
|
14
|
+
```jsx harmony
|
|
15
|
+
import { Group, Button } from '@skbkontur/react-ui';
|
|
16
|
+
|
|
17
|
+
const [value, setValue] = React.useState('Значение');
|
|
18
|
+
|
|
19
|
+
<Group>
|
|
20
|
+
<Textarea
|
|
21
|
+
value={value}
|
|
22
|
+
onValueChange={setValue}
|
|
23
|
+
autoResize
|
|
24
|
+
rows={1}
|
|
25
|
+
placeholder="Плейсхолдер"
|
|
26
|
+
/>
|
|
27
|
+
<Button style={{ height: '52px' }} onClick={() => setValue('')}>Очистить значение</Button>
|
|
28
|
+
</Group>
|
|
29
|
+
```
|
|
30
|
+
|
|
12
31
|
Счетчик введенных символов
|
|
13
32
|
|
|
14
33
|
```jsx harmony
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
3
|
import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose";
|
|
4
|
-
var _excluded = ["style", "children", "delta", "priority", "applyZIndex", "coverChildren", "createStackingContext", "wrapperRef"];
|
|
4
|
+
var _excluded = ["style", "children", "delta", "priority", "applyZIndex", "coverChildren", "createStackingContext", "wrapperRef", "useWrapper"];
|
|
5
5
|
|
|
6
6
|
var _class, _class2, _temp;
|
|
7
7
|
|
|
@@ -23,8 +23,10 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
|
|
|
23
23
|
var _this;
|
|
24
24
|
|
|
25
25
|
_this = _React$Component.call(this, props) || this;
|
|
26
|
+
_this.state = {
|
|
27
|
+
zIndex: 0
|
|
28
|
+
};
|
|
26
29
|
_this.getProps = createPropsGetter(ZIndex.defaultProps);
|
|
27
|
-
_this.zIndex = 0;
|
|
28
30
|
|
|
29
31
|
_this.wrapperRef = function (element) {
|
|
30
32
|
var wrapperRef = _this.props.wrapperRef;
|
|
@@ -34,38 +36,53 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
|
|
|
34
36
|
wrapperRef && callChildRef(wrapperRef, element);
|
|
35
37
|
};
|
|
36
38
|
|
|
37
|
-
_this.
|
|
39
|
+
_this.increment = function () {
|
|
40
|
+
var _this$getProps = _this.getProps(),
|
|
41
|
+
priority = _this$getProps.priority,
|
|
42
|
+
delta = _this$getProps.delta;
|
|
43
|
+
|
|
44
|
+
return incrementZIndex(priority, delta);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
_this.state.zIndex = _this.increment();
|
|
38
48
|
return _this;
|
|
39
49
|
}
|
|
40
50
|
|
|
41
51
|
var _proto = ZIndex.prototype;
|
|
42
52
|
|
|
53
|
+
_proto.componentDidUpdate = function componentDidUpdate(prevProps) {
|
|
54
|
+
if (prevProps.priority !== this.props.priority || prevProps.delta !== this.props.delta) {
|
|
55
|
+
removeZIndex(this.state.zIndex);
|
|
56
|
+
this.setState({
|
|
57
|
+
zIndex: this.increment()
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
43
62
|
_proto.componentWillUnmount = function componentWillUnmount() {
|
|
44
|
-
removeZIndex(this.zIndex);
|
|
63
|
+
removeZIndex(this.state.zIndex);
|
|
45
64
|
};
|
|
46
65
|
|
|
47
66
|
_proto.render = function render() {
|
|
48
|
-
var _this2 = this;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
wrapperRef = _this$getProps.wrapperRef,
|
|
62
|
-
rest = _objectWithoutPropertiesLoose(_this$getProps, _excluded);
|
|
67
|
+
var _this2 = this;
|
|
68
|
+
|
|
69
|
+
var _this$getProps2 = this.getProps(),
|
|
70
|
+
style = _this$getProps2.style,
|
|
71
|
+
children = _this$getProps2.children,
|
|
72
|
+
delta = _this$getProps2.delta,
|
|
73
|
+
priority = _this$getProps2.priority,
|
|
74
|
+
applyZIndex = _this$getProps2.applyZIndex,
|
|
75
|
+
coverChildren = _this$getProps2.coverChildren,
|
|
76
|
+
createStackingContext = _this$getProps2.createStackingContext,
|
|
77
|
+
wrapperRef = _this$getProps2.wrapperRef,
|
|
78
|
+
useWrapper = _this$getProps2.useWrapper,
|
|
79
|
+
rest = _objectWithoutPropertiesLoose(_this$getProps2, _excluded);
|
|
63
80
|
|
|
64
81
|
var wrapperStyle = {};
|
|
65
82
|
return /*#__PURE__*/React.createElement(ZIndexContext.Consumer, null, function (_ref) {
|
|
66
83
|
var parentLayerZIndex = _ref.parentLayerZIndex,
|
|
67
84
|
maxZIndex = _ref.maxZIndex;
|
|
68
|
-
var
|
|
85
|
+
var zIndexContextValue = {
|
|
69
86
|
parentLayerZIndex: parentLayerZIndex,
|
|
70
87
|
maxZIndex: maxZIndex
|
|
71
88
|
};
|
|
@@ -74,7 +91,7 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
|
|
|
74
91
|
var newZIndex = _this2.calcZIndex(parentLayerZIndex, maxZIndex);
|
|
75
92
|
|
|
76
93
|
wrapperStyle.zIndex = newZIndex;
|
|
77
|
-
|
|
94
|
+
zIndexContextValue = coverChildren ? {
|
|
78
95
|
parentLayerZIndex: parentLayerZIndex,
|
|
79
96
|
maxZIndex: newZIndex
|
|
80
97
|
} : {
|
|
@@ -87,17 +104,18 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
|
|
|
87
104
|
}
|
|
88
105
|
}
|
|
89
106
|
|
|
90
|
-
|
|
91
|
-
value: zIndexContexValue
|
|
92
|
-
}, /*#__PURE__*/React.createElement("div", _extends({
|
|
107
|
+
var child = !useWrapper ? children : /*#__PURE__*/React.createElement("div", _extends({
|
|
93
108
|
style: _extends({}, style, wrapperStyle),
|
|
94
109
|
ref: _this2.wrapperRef
|
|
95
|
-
}, rest), children)
|
|
110
|
+
}, rest), children);
|
|
111
|
+
return /*#__PURE__*/React.createElement(ZIndexContext.Provider, {
|
|
112
|
+
value: zIndexContextValue
|
|
113
|
+
}, child);
|
|
96
114
|
});
|
|
97
115
|
};
|
|
98
116
|
|
|
99
117
|
_proto.calcZIndex = function calcZIndex(parentLayerZIndex, maxZIndex) {
|
|
100
|
-
var newZIndex = this.zIndex;
|
|
118
|
+
var newZIndex = this.state.zIndex;
|
|
101
119
|
|
|
102
120
|
if (Number.isFinite(maxZIndex)) {
|
|
103
121
|
var allowedValuesIntervalLength = maxZIndex - parentLayerZIndex;
|
|
@@ -116,7 +134,8 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
|
|
|
116
134
|
style: {},
|
|
117
135
|
applyZIndex: true,
|
|
118
136
|
coverChildren: false,
|
|
119
|
-
createStackingContext: false
|
|
137
|
+
createStackingContext: false,
|
|
138
|
+
useWrapper: true
|
|
120
139
|
}, _class2.propTypes = {
|
|
121
140
|
delta: function delta(props) {
|
|
122
141
|
if ((props.delta || _class2.defaultProps.delta) <= 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ZIndex.tsx"],"names":["React","callChildRef","rootNode","isBrowser","createPropsGetter","incrementZIndex","removeZIndex","upperBorder","ZIndexContext","createContext","parentLayerZIndex","maxZIndex","Infinity","displayName","ZIndex","props","
|
|
1
|
+
{"version":3,"sources":["ZIndex.tsx"],"names":["React","callChildRef","rootNode","isBrowser","createPropsGetter","incrementZIndex","removeZIndex","upperBorder","ZIndexContext","createContext","parentLayerZIndex","maxZIndex","Infinity","displayName","ZIndex","props","state","zIndex","getProps","defaultProps","wrapperRef","element","setRootNode","increment","priority","delta","componentDidUpdate","prevProps","setState","componentWillUnmount","render","style","children","applyZIndex","coverChildren","createStackingContext","useWrapper","rest","wrapperStyle","zIndexContextValue","newZIndex","calcZIndex","Number","isFinite","document","body","isolation","transform","child","allowedValuesIntervalLength","scale","Math","ceil","Component","__KONTUR_REACT_UI__","propTypes","Error","trunc"],"mappings":"+YAAA,OAAOA,KAAP,MAAkB,OAAlB;;AAEA,SAASC,YAAT,QAA6B,qCAA7B;AACA,SAASC,QAAT,QAAuC,oBAAvC;AACA,SAASC,SAAT,QAA0B,kBAA1B;AACA,SAASC,iBAAT,QAAkC,6BAAlC;;AAEA,SAASC,eAAT,EAA0BC,YAA1B,EAAwCC,WAAxC,QAA+E,iBAA/E;;AAEA,IAAMC,aAAa,gBAAGR,KAAK,CAACS,aAAN,CAAoB,EAAEC,iBAAiB,EAAE,CAArB,EAAwBC,SAAS,EAAEC,QAAnC,EAApB,CAAtB;;AAEAJ,aAAa,CAACK,WAAd,GAA4B,eAA5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,WAAaC,MAAb,GADCZ,QACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCE,kBAAYa,KAAZ,EAAgC;AAC9B,wCAAMA,KAAN,UAD8B,MAnBzBC,KAmByB,GAnBjB,EACbC,MAAM,EAAE,CADK,EAmBiB,OAfxBC,QAewB,GAfbd,iBAAiB,CAACU,MAAM,CAACK,YAAR,CAeJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkExBC,IAAAA,UAlEwB,GAkEX,UAACC,OAAD,EAAoC;AACvD,UAAQD,UAAR,GAAuB,MAAKL,KAA5B,CAAQK,UAAR;AACA,YAAKE,WAAL,CAAiBD,OAAjB;AACAD,MAAAA,UAAU,IAAInB,YAAY,CAACmB,UAAD,EAAaC,OAAb,CAA1B;AACD,KAtE+B;;;;;;;;;;;;;;;;AAsFxBE,IAAAA,SAtFwB,GAsFZ,YAAM;AACxB,2BAA4B,MAAKL,QAAL,EAA5B,CAAQM,QAAR,kBAAQA,QAAR,CAAkBC,KAAlB,kBAAkBA,KAAlB;;AAEA,aAAOpB,eAAe,CAACmB,QAAD,EAAWC,KAAX,CAAtB;AACD,KA1F+B,CAE9B,MAAKT,KAAL,CAAWC,MAAX,GAAoB,MAAKM,SAAL,EAApB,CAF8B,aAG/B,CAnCH,qCAqCSG,kBArCT,GAqCE,4BAA0BC,SAA1B,EAA4D,CAC1D,IAAIA,SAAS,CAACH,QAAV,KAAuB,KAAKT,KAAL,CAAWS,QAAlC,IAA8CG,SAAS,CAACF,KAAV,KAAoB,KAAKV,KAAL,CAAWU,KAAjF,EAAwF,CACtFnB,YAAY,CAAC,KAAKU,KAAL,CAAWC,MAAZ,CAAZ,CACA,KAAKW,QAAL,CAAc,EAAEX,MAAM,EAAE,KAAKM,SAAL,EAAV,EAAd,EACD,CACF,CA1CH,QA4CSM,oBA5CT,GA4CE,gCAA8B,CAC5BvB,YAAY,CAAC,KAAKU,KAAL,CAAWC,MAAZ,CAAZ,CACD,CA9CH,QAgDSa,MAhDT,GAgDE,kBAAgB,mBACd,sBAWI,KAAKZ,QAAL,EAXJ,CACEa,KADF,mBACEA,KADF,CAEEC,QAFF,mBAEEA,QAFF,CAGEP,KAHF,mBAGEA,KAHF,CAIED,QAJF,mBAIEA,QAJF,CAKES,WALF,mBAKEA,WALF,CAMEC,aANF,mBAMEA,aANF,CAOEC,qBAPF,mBAOEA,qBAPF,CAQEf,UARF,mBAQEA,UARF,CASEgB,UATF,mBASEA,UATF,CAUKC,IAVL,6DAaA,IAAMC,YAAiC,GAAG,EAA1C,CAEA,oBACE,oBAAC,aAAD,CAAe,QAAf,QACG,gBAAsC,KAAnC5B,iBAAmC,QAAnCA,iBAAmC,CAAhBC,SAAgB,QAAhBA,SAAgB,CACrC,IAAI4B,kBAAkB,GAAG,EAAE7B,iBAAiB,EAAjBA,iBAAF,EAAqBC,SAAS,EAATA,SAArB,EAAzB,CAEA,IAAIsB,WAAJ,EAAiB,CACf,IAAMO,SAAS,GAAG,MAAI,CAACC,UAAL,CAAgB/B,iBAAhB,EAAmCC,SAAnC,CAAlB,CACA2B,YAAY,CAACrB,MAAb,GAAsBuB,SAAtB,CAEAD,kBAAkB,GAAGL,aAAa,GAC9B,EAAExB,iBAAiB,EAAjBA,iBAAF,EAAqBC,SAAS,EAAE6B,SAAhC,EAD8B,GAE9B,EAAE9B,iBAAiB,EAAE8B,SAArB,EAAgC7B,SAAS,EAAE+B,MAAM,CAACC,QAAP,CAAgBhC,SAAhB,IAA6B6B,SAA7B,GAAyC5B,QAApF,EAFJ,CAIA,IAAIuB,qBAAJ,EAA2B,CACzBhC,SAAS,IAAI,eAAeyC,QAAQ,CAACC,IAAT,CAAcd,KAA1C,GACKO,YAAY,CAACQ,SAAb,GAAyB,SAD9B,GAEKR,YAAY,CAACS,SAAb,GAAyB,WAF9B,CAGD,CACF,CAED,IAAMC,KAAK,GAAG,CAACZ,UAAD,GACZJ,QADY,gBAGZ,sCAAK,KAAK,eAAOD,KAAP,EAAiBO,YAAjB,CAAV,EAA2C,GAAG,EAAE,MAAI,CAAClB,UAArD,IAAqEiB,IAArE,GACGL,QADH,CAHF,CAQA,oBAAO,oBAAC,aAAD,CAAe,QAAf,IAAwB,KAAK,EAAEO,kBAA/B,IAAoDS,KAApD,CAAP,CACD,CA5BH,CADF,CAgCD,CAhGH,QAwGUP,UAxGV,GAwGE,oBAAmB/B,iBAAnB,EAA8CC,SAA9C,EAAiE,CAC/D,IAAI6B,SAAS,GAAG,KAAKxB,KAAL,CAAWC,MAA3B,CAEA,IAAIyB,MAAM,CAACC,QAAP,CAAgBhC,SAAhB,CAAJ,EAAgC,CAC9B,IAAMsC,2BAA2B,GAAGtC,SAAS,GAAGD,iBAAhD,CACA,IAAMwC,KAAK,GAAG3C,WAAW,GAAG0C,2BAA5B,CACAT,SAAS,GAAGW,IAAI,CAACC,IAAL,CAAUZ,SAAS,GAAGU,KAAtB,CAAZ,CACD,CAEDV,SAAS,IAAI9B,iBAAb,CAEA,OAAO8B,SAAP,CACD,CApHH,iBAA4BxC,KAAK,CAACqD,SAAlC,WACgBC,mBADhB,GACsC,QADtC,UAGgBnC,YAHhB,GAG6C,EACzCM,KAAK,EAAE,EADkC,EAEzCD,QAAQ,EAAE,CAF+B,EAGzCO,KAAK,EAAE,EAHkC,EAIzCE,WAAW,EAAE,IAJ4B,EAKzCC,aAAa,EAAE,KAL0B,EAMzCC,qBAAqB,EAAE,KANkB,EAOzCC,UAAU,EAAE,IAP6B,EAH7C,UAmBgBmB,SAnBhB,GAmB4B,EACxB9B,KADwB,iBAClBV,KADkB,EACE,CACxB,IAAI,CAACA,KAAK,CAACU,KAAN,IAAeX,OAAM,CAACK,YAAP,CAAoBM,KAApC,KAA8C,CAAlD,EAAqD,CACnD,OAAO,IAAI+B,KAAJ,8DAAqEzC,KAAK,CAACU,KAA3E,CAAP,CACD,CACD,IAAI0B,IAAI,CAACM,KAAL,CAAW1C,KAAK,CAACU,KAAN,IAAeX,OAAM,CAACK,YAAP,CAAoBM,KAA9C,MAAyDV,KAAK,CAACU,KAAnE,EAA0E,CACxE,OAAO,IAAI+B,KAAJ,uDAA8DzC,KAAK,CAACU,KAApE,CAAP,CACD,CACF,CARuB,EAnB5B","sourcesContent":["import React from 'react';\n\nimport { callChildRef } from '../../lib/callChildRef/callChildRef';\nimport { rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { isBrowser } from '../../lib/client';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\n\nimport { incrementZIndex, removeZIndex, upperBorder, LayerComponentName } from './ZIndexStorage';\n\nconst ZIndexContext = React.createContext({ parentLayerZIndex: 0, maxZIndex: Infinity });\n\nZIndexContext.displayName = 'ZIndexContext';\n\nexport interface ZIndexProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Приращение к z-index\n */\n delta?: number;\n priority?: number | LayerComponentName;\n style?: React.CSSProperties;\n createStackingContext?: boolean;\n coverChildren?: boolean;\n applyZIndex?: boolean;\n className?: string;\n wrapperRef?: React.Ref<HTMLDivElement> | undefined | null;\n\n /**\n * Явно указывает, что вложенные элементы должны быть обёрнуты в `<div/>`.\n * Для случаев, когда необходимо задать **только** контекст для области.\n *\n * @default true\n */\n useWrapper?: boolean;\n}\n\ntype DefaultProps = Required<\n Pick<\n ZIndexProps,\n 'delta' | 'priority' | 'style' | 'applyZIndex' | 'coverChildren' | 'createStackingContext' | 'useWrapper'\n >\n>;\n\ninterface ZIndexState {\n zIndex: number;\n}\n\n@rootNode\nexport class ZIndex extends React.Component<ZIndexProps, ZIndexState> {\n public static __KONTUR_REACT_UI__ = 'ZIndex';\n\n public static defaultProps: DefaultProps = {\n delta: 10,\n priority: 0,\n style: {},\n applyZIndex: true,\n coverChildren: false,\n createStackingContext: false,\n useWrapper: true,\n };\n\n public state = {\n zIndex: 0,\n };\n\n private getProps = createPropsGetter(ZIndex.defaultProps);\n\n public static propTypes = {\n delta(props: ZIndexProps) {\n if ((props.delta || ZIndex.defaultProps.delta) <= 0) {\n return new Error(`[ZIndex]: Prop 'delta' must be greater than 0, received ${props.delta}`);\n }\n if (Math.trunc(props.delta || ZIndex.defaultProps.delta) !== props.delta) {\n return new Error(`[ZIndex]: Prop 'delta' must be integer, received ${props.delta}`);\n }\n },\n };\n\n private setRootNode!: TSetRootNode;\n\n constructor(props: ZIndexProps) {\n super(props);\n this.state.zIndex = this.increment();\n }\n\n public componentDidUpdate(prevProps: Readonly<ZIndexProps>) {\n if (prevProps.priority !== this.props.priority || prevProps.delta !== this.props.delta) {\n removeZIndex(this.state.zIndex);\n this.setState({ zIndex: this.increment() });\n }\n }\n\n public componentWillUnmount() {\n removeZIndex(this.state.zIndex);\n }\n\n public render() {\n const {\n style,\n children,\n delta,\n priority,\n applyZIndex,\n coverChildren,\n createStackingContext,\n wrapperRef,\n useWrapper,\n ...rest\n } = this.getProps();\n\n const wrapperStyle: React.CSSProperties = {};\n\n return (\n <ZIndexContext.Consumer>\n {({ parentLayerZIndex, maxZIndex }) => {\n let zIndexContextValue = { parentLayerZIndex, maxZIndex };\n\n if (applyZIndex) {\n const newZIndex = this.calcZIndex(parentLayerZIndex, maxZIndex);\n wrapperStyle.zIndex = newZIndex;\n\n zIndexContextValue = coverChildren\n ? { parentLayerZIndex, maxZIndex: newZIndex }\n : { parentLayerZIndex: newZIndex, maxZIndex: Number.isFinite(maxZIndex) ? newZIndex : Infinity };\n\n if (createStackingContext) {\n isBrowser && 'isolation' in document.body.style\n ? (wrapperStyle.isolation = 'isolate')\n : (wrapperStyle.transform = 'rotate(0)');\n }\n }\n\n const child = !useWrapper ? (\n children\n ) : (\n <div style={{ ...style, ...wrapperStyle }} ref={this.wrapperRef} {...rest}>\n {children}\n </div>\n );\n\n return <ZIndexContext.Provider value={zIndexContextValue}>{child}</ZIndexContext.Provider>;\n }}\n </ZIndexContext.Consumer>\n );\n }\n\n private wrapperRef = (element: HTMLDivElement | null) => {\n const { wrapperRef } = this.props;\n this.setRootNode(element);\n wrapperRef && callChildRef(wrapperRef, element);\n };\n\n private calcZIndex(parentLayerZIndex: number, maxZIndex: number) {\n let newZIndex = this.state.zIndex;\n\n if (Number.isFinite(maxZIndex)) {\n const allowedValuesIntervalLength = maxZIndex - parentLayerZIndex;\n const scale = upperBorder / allowedValuesIntervalLength;\n newZIndex = Math.ceil(newZIndex / scale);\n }\n\n newZIndex += parentLayerZIndex;\n\n return newZIndex;\n }\n\n private increment = () => {\n const { priority, delta } = this.getProps();\n\n return incrementZIndex(priority, delta);\n };\n}\n"]}
|
|
@@ -12,21 +12,35 @@ export interface ZIndexProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
12
12
|
applyZIndex?: boolean;
|
|
13
13
|
className?: string;
|
|
14
14
|
wrapperRef?: React.Ref<HTMLDivElement> | undefined | null;
|
|
15
|
+
/**
|
|
16
|
+
* Явно указывает, что вложенные элементы должны быть обёрнуты в `<div/>`.
|
|
17
|
+
* Для случаев, когда необходимо задать **только** контекст для области.
|
|
18
|
+
*
|
|
19
|
+
* @default true
|
|
20
|
+
*/
|
|
21
|
+
useWrapper?: boolean;
|
|
15
22
|
}
|
|
16
|
-
declare type DefaultProps = Required<Pick<ZIndexProps, 'delta' | 'priority' | 'style' | 'applyZIndex' | 'coverChildren' | 'createStackingContext'>>;
|
|
17
|
-
|
|
23
|
+
declare type DefaultProps = Required<Pick<ZIndexProps, 'delta' | 'priority' | 'style' | 'applyZIndex' | 'coverChildren' | 'createStackingContext' | 'useWrapper'>>;
|
|
24
|
+
interface ZIndexState {
|
|
25
|
+
zIndex: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class ZIndex extends React.Component<ZIndexProps, ZIndexState> {
|
|
18
28
|
static __KONTUR_REACT_UI__: string;
|
|
19
29
|
static defaultProps: DefaultProps;
|
|
30
|
+
state: {
|
|
31
|
+
zIndex: number;
|
|
32
|
+
};
|
|
20
33
|
private getProps;
|
|
21
34
|
static propTypes: {
|
|
22
35
|
delta(props: ZIndexProps): Error | undefined;
|
|
23
36
|
};
|
|
24
|
-
private zIndex;
|
|
25
37
|
private setRootNode;
|
|
26
38
|
constructor(props: ZIndexProps);
|
|
39
|
+
componentDidUpdate(prevProps: Readonly<ZIndexProps>): void;
|
|
27
40
|
componentWillUnmount(): void;
|
|
28
41
|
render(): JSX.Element;
|
|
29
42
|
private wrapperRef;
|
|
30
43
|
private calcZIndex;
|
|
44
|
+
private increment;
|
|
31
45
|
}
|
|
32
46
|
export {};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/* eslint-disable react/no-find-dom-node */
|
|
2
2
|
import { findDOMNode } from 'react-dom';
|
|
3
|
+
import warning from 'warning';
|
|
3
4
|
import { isElement, isNode } from "../../SSRSafe";
|
|
4
5
|
import { canUseDOM } from "../../client";
|
|
5
6
|
import { isInstanceWithRootNode } from "../rootNodeDecorator";
|
|
6
7
|
/**
|
|
7
|
-
* Extracts component's root
|
|
8
|
+
* Extracts component's root Element (HTMLElement/SVGElement) out of it's instance
|
|
8
9
|
* following the "StrictMode support convention" (@see README.md#strictmode, #2518).
|
|
9
10
|
*
|
|
10
11
|
* Replaces findDOMNode but falls back to it if "convention" is not respected.
|
|
@@ -14,14 +15,21 @@ import { isInstanceWithRootNode } from "../rootNodeDecorator";
|
|
|
14
15
|
*/
|
|
15
16
|
|
|
16
17
|
export var getRootNode = function getRootNode(instance) {
|
|
18
|
+
/**
|
|
19
|
+
* Options of what instance can be:
|
|
20
|
+
* 1. null or undefined
|
|
21
|
+
* 2. DOM Element
|
|
22
|
+
* 3. class Component instance (object)
|
|
23
|
+
* 4. literally anything, returned from useImperativeHandle
|
|
24
|
+
*/
|
|
17
25
|
if (!canUseDOM || !instance) {
|
|
18
26
|
// instance can be `null` if component was unmounted
|
|
19
|
-
// also checking undefined for
|
|
27
|
+
// also checking undefined for convenient usage
|
|
20
28
|
return null;
|
|
21
29
|
}
|
|
22
30
|
|
|
23
31
|
if (isElement(instance)) {
|
|
24
|
-
// instance can be
|
|
32
|
+
// instance can be an Element already if its coming
|
|
25
33
|
// from Refs of intrinsic elements (<div />, <button />, etc.)
|
|
26
34
|
return instance;
|
|
27
35
|
}
|
|
@@ -31,7 +39,7 @@ export var getRootNode = function getRootNode(instance) {
|
|
|
31
39
|
if (isInstanceWithRootNode(instance)) {
|
|
32
40
|
// it happened to be that native Node interface also has
|
|
33
41
|
// the "getRootNode" method, but we can ignore it here
|
|
34
|
-
// because we'd already checked the instance on being an
|
|
42
|
+
// because we'd already checked the instance on being an Element
|
|
35
43
|
// which is a subclass of Node, so, just fixing types here
|
|
36
44
|
if (!isNode(instance)) {
|
|
37
45
|
rootNode = instance.getRootNode();
|
|
@@ -39,15 +47,25 @@ export var getRootNode = function getRootNode(instance) {
|
|
|
39
47
|
}
|
|
40
48
|
|
|
41
49
|
if (rootNode !== undefined) {
|
|
42
|
-
//
|
|
43
|
-
// or null (which is also OK, e.g. Popup/Tooltip/Hint before opening)
|
|
50
|
+
// the getter exists and has returned something, it should be what we are looking for
|
|
51
|
+
// probably its an Element or null (which is also OK, e.g. Popup/Tooltip/Hint before opening)
|
|
44
52
|
return rootNode;
|
|
45
|
-
}
|
|
46
|
-
// anyway, it tell us that the convention is not respected (by the component itself or its children),
|
|
47
|
-
// so, we have to fall back to the deprecated findDOMNode, which always works but breaks StrictMode
|
|
53
|
+
}
|
|
48
54
|
|
|
55
|
+
try {
|
|
56
|
+
// rootNode is undefined, which means that the getter doesn't exists or returns the undefined
|
|
57
|
+
// anyway, it tell us that the convention is not respected,
|
|
58
|
+
// so, we have to fall back to the deprecated findDOMNode, which breaks StrictMode
|
|
59
|
+
// instance can still be a class component or an imperative handle (i.e., anything, except null/undefined/Element)
|
|
60
|
+
rootNode = findDOMNode(instance);
|
|
61
|
+
} catch (e) {
|
|
62
|
+
// but findDOMNode doesn`t accept everything that instance can be at this point,
|
|
63
|
+
// so we have to handle exceptions
|
|
64
|
+
// see https://github.com/facebook/react/blob/cae63505/packages/react-dom/src/__tests__/findDOMNode-test.js#L66-L86
|
|
65
|
+
warning(false, '[getRootNode]: can`t fallback to findDOMNode.' + '\n' + 'See https://github.com/skbkontur/retail-ui/blob/master/packages/react-ui/README.md#strictmode' + '\n\n' + e.message);
|
|
66
|
+
return null;
|
|
67
|
+
} // the findDOMNode can also return Text, but we are only interested in Elements, so just filter it
|
|
49
68
|
|
|
50
|
-
rootNode = findDOMNode(instance); // the findDOMNode can also return Text, but we are only intrested in HTMLElements, so just filter it
|
|
51
69
|
|
|
52
70
|
return isElement(rootNode) ? rootNode : null;
|
|
53
71
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["getRootNode.ts"],"names":["findDOMNode","isElement","isNode","canUseDOM","isInstanceWithRootNode","getRootNode","instance","rootNode","undefined"],"mappings":"AAAA;AACA,SAASA,WAAT,QAA4B,WAA5B
|
|
1
|
+
{"version":3,"sources":["getRootNode.ts"],"names":["findDOMNode","warning","isElement","isNode","canUseDOM","isInstanceWithRootNode","getRootNode","instance","rootNode","undefined","e","message"],"mappings":"AAAA;AACA,SAASA,WAAT,QAA4B,WAA5B;;AAEA,OAAOC,OAAP,MAAoB,SAApB;;;AAGA,SAASC,SAAT,EAAoBC,MAApB,QAAkC,YAAlC;AACA,SAASC,SAAT,QAA0B,WAA1B;;AAEA,SAASC,sBAAT,QAAuC,qBAAvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,IAAMC,WAAW,GAAG,SAAdA,WAAc,CAACC,QAAD,EAAgE;AACzF;AACF;AACA;AACA;AACA;AACA;AACA;;AAEE,MAAI,CAACH,SAAD,IAAc,CAACG,QAAnB,EAA6B;AAC3B;AACA;AACA,WAAO,IAAP;AACD;;AAED,MAAIL,SAAS,CAACK,QAAD,CAAb,EAAyB;AACvB;AACA;AACA,WAAOA,QAAP;AACD;;AAED,MAAIC,QAAJ;;AAEA,MAAIH,sBAAsB,CAACE,QAAD,CAA1B,EAAsC;AACpC;AACA;AACA;AACA;AACA,QAAI,CAACJ,MAAM,CAACI,QAAD,CAAX,EAAuB;AACrBC,MAAAA,QAAQ,GAAGD,QAAQ,CAACD,WAAT,EAAX;AACD;AACF;;AAED,MAAIE,QAAQ,KAAKC,SAAjB,EAA4B;AAC1B;AACA;AACA,WAAOD,QAAP;AACD;;AAED,MAAI;AACF;AACA;AACA;AACA;AACAA,IAAAA,QAAQ,GAAGR,WAAW,CAACO,QAAD,CAAtB;AACD,GAND,CAME,OAAOG,CAAP,EAAU;AACV;AACA;AACA;AACAT,IAAAA,OAAO;AACL,SADK;AAEL;AACE,QADF;AAEE,mGAFF;AAGE,UAHF;AAIES,IAAAA,CAAC,CAACC,OANC,CAAP;;AAQA,WAAO,IAAP;AACD;;AAED;AACA,SAAOT,SAAS,CAACM,QAAD,CAAT,GAAsBA,QAAtB,GAAiC,IAAxC;AACD,CA9DM","sourcesContent":["/* eslint-disable react/no-find-dom-node */\nimport { findDOMNode } from 'react-dom';\nimport React from 'react';\nimport warning from 'warning';\n\nimport { Nullable } from '../../typings/utility-types';\nimport { isElement, isNode } from '../SSRSafe';\nimport { canUseDOM } from '../client';\n\nimport { isInstanceWithRootNode } from './rootNodeDecorator';\n\n/**\n * Extracts component's root Element (HTMLElement/SVGElement) out of it's instance\n * following the \"StrictMode support convention\" (@see README.md#strictmode, #2518).\n *\n * Replaces findDOMNode but falls back to it if \"convention\" is not respected.\n *\n * @param instance Component's instance provided by React.Ref or `this` inside class-components.\n * @returns Component's root `Element` or null\n */\n\nexport const getRootNode = (instance: Nullable<React.ReactInstance>): Nullable<Element> => {\n /**\n * Options of what instance can be:\n * 1. null or undefined\n * 2. DOM Element\n * 3. class Component instance (object)\n * 4. literally anything, returned from useImperativeHandle\n */\n\n if (!canUseDOM || !instance) {\n // instance can be `null` if component was unmounted\n // also checking undefined for convenient usage\n return null;\n }\n\n if (isElement(instance)) {\n // instance can be an Element already if its coming\n // from Refs of intrinsic elements (<div />, <button />, etc.)\n return instance;\n }\n\n let rootNode;\n\n if (isInstanceWithRootNode(instance)) {\n // it happened to be that native Node interface also has\n // the \"getRootNode\" method, but we can ignore it here\n // because we'd already checked the instance on being an Element\n // which is a subclass of Node, so, just fixing types here\n if (!isNode(instance)) {\n rootNode = instance.getRootNode();\n }\n }\n\n if (rootNode !== undefined) {\n // the getter exists and has returned something, it should be what we are looking for\n // probably its an Element or null (which is also OK, e.g. Popup/Tooltip/Hint before opening)\n return rootNode;\n }\n\n try {\n // rootNode is undefined, which means that the getter doesn't exists or returns the undefined\n // anyway, it tell us that the convention is not respected,\n // so, we have to fall back to the deprecated findDOMNode, which breaks StrictMode\n // instance can still be a class component or an imperative handle (i.e., anything, except null/undefined/Element)\n rootNode = findDOMNode(instance);\n } catch (e) {\n // but findDOMNode doesn`t accept everything that instance can be at this point,\n // so we have to handle exceptions\n // see https://github.com/facebook/react/blob/cae63505/packages/react-dom/src/__tests__/findDOMNode-test.js#L66-L86\n warning(\n false,\n '[getRootNode]: can`t fallback to findDOMNode.' +\n '\\n' +\n 'See https://github.com/skbkontur/retail-ui/blob/master/packages/react-ui/README.md#strictmode' +\n '\\n\\n' +\n e.message,\n );\n return null;\n }\n\n // the findDOMNode can also return Text, but we are only interested in Elements, so just filter it\n return isElement(rootNode) ? rootNode : null;\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Nullable } from '../../typings/utility-types';
|
|
3
3
|
/**
|
|
4
|
-
* Extracts component's root
|
|
4
|
+
* Extracts component's root Element (HTMLElement/SVGElement) out of it's instance
|
|
5
5
|
* following the "StrictMode support convention" (@see README.md#strictmode, #2518).
|
|
6
6
|
*
|
|
7
7
|
* Replaces findDOMNode but falls back to it if "convention" is not respected.
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skbkontur/react-ui",
|
|
3
|
-
"version": "4.5.
|
|
3
|
+
"version": "4.5.2",
|
|
4
4
|
"description": "UI Components",
|
|
5
5
|
"main": "cjs/index.js",
|
|
6
6
|
"module": "index.js",
|
|
7
7
|
"sideEffects": false,
|
|
8
|
-
"homepage": "https://tech.skbkontur.ru/react-ui/4.5.
|
|
8
|
+
"homepage": "https://tech.skbkontur.ru/react-ui/4.5.2/",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
11
|
"url": "git@github.com:skbkontur/retail-ui.git"
|