@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.
Files changed (43) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +27 -4
  3. package/cjs/components/Autocomplete/Autocomplete.md +15 -1
  4. package/cjs/components/ComboBox/ComboBox.md +32 -0
  5. package/cjs/components/DatePicker/DatePicker.md +18 -0
  6. package/cjs/components/FxInput/FxInput.md +13 -0
  7. package/cjs/components/Input/Input.md +12 -0
  8. package/cjs/components/Loader/Loader.d.ts +11 -2
  9. package/cjs/components/Loader/Loader.js +10 -1
  10. package/cjs/components/Loader/Loader.js.map +1 -1
  11. package/cjs/components/Loader/Loader.md +30 -23
  12. package/cjs/components/Select/Select.md +14 -0
  13. package/cjs/components/Spinner/Spinner.d.ts +11 -2
  14. package/cjs/components/Spinner/Spinner.js +10 -1
  15. package/cjs/components/Spinner/Spinner.js.map +1 -1
  16. package/cjs/components/Textarea/Textarea.md +19 -0
  17. package/cjs/internal/ZIndex/ZIndex.d.ts +17 -3
  18. package/cjs/internal/ZIndex/ZIndex.js +55 -14
  19. package/cjs/internal/ZIndex/ZIndex.js.map +1 -1
  20. package/cjs/lib/rootNode/getRootNode.d.ts +1 -1
  21. package/cjs/lib/rootNode/getRootNode.js +37 -12
  22. package/cjs/lib/rootNode/getRootNode.js.map +1 -1
  23. package/components/Autocomplete/Autocomplete.md +15 -1
  24. package/components/ComboBox/ComboBox.md +32 -0
  25. package/components/DatePicker/DatePicker.md +18 -0
  26. package/components/FxInput/FxInput.md +13 -0
  27. package/components/Input/Input.md +12 -0
  28. package/components/Loader/Loader/Loader.js +3 -1
  29. package/components/Loader/Loader/Loader.js.map +1 -1
  30. package/components/Loader/Loader.d.ts +11 -2
  31. package/components/Loader/Loader.md +30 -23
  32. package/components/Select/Select.md +14 -0
  33. package/components/Spinner/Spinner/Spinner.js +1 -1
  34. package/components/Spinner/Spinner/Spinner.js.map +1 -1
  35. package/components/Spinner/Spinner.d.ts +11 -2
  36. package/components/Textarea/Textarea.md +19 -0
  37. package/internal/ZIndex/ZIndex/ZIndex.js +46 -27
  38. package/internal/ZIndex/ZIndex/ZIndex.js.map +1 -1
  39. package/internal/ZIndex/ZIndex.d.ts +17 -3
  40. package/lib/rootNode/getRootNode/getRootNode.js +28 -10
  41. package/lib/rootNode/getRootNode/getRootNode.js.map +1 -1
  42. package/lib/rootNode/getRootNode.d.ts +1 -1
  43. package/package.json +2 -2
@@ -1,25 +1,32 @@
1
1
  ```jsx harmony
2
- <Loader type="big" active>
3
- <h1>Yeah, and if you were the pope they'd be all, "Straighten your pope hat." And "Put on your good vestments."</h1>
4
- <p>
5
- No, I'm Santa Claus! I guess if you want children beaten, you have to do it yourself. We're also Santa Claus! Leela,
6
- Bender, we're going grave robbing.
7
- </p>
8
- <p>
9
- Are you crazy? I can't swallow that. Large bet on myself in round one. Hey, whatcha watching?
10
- <strong> Moving along… I guess if you want children beaten, you have to do it yourself.</strong>
11
- <em>It's okay, Bender.</em> I like cooking too.
12
- </p>
13
- <h2>Oh, I think we should just stay friends.</h2>
14
- <p>
15
- 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
16
- more stuff to steal! Oh, how awful. Did he at least die painlessly? …To shreds, you say. Well, how is his wife
17
- holding up? …To shreds, you say.
18
- </p>
19
- <ol>
20
- <li>No! The kind with looting and maybe starting a few fires!</li>
21
- <li>You are the last hope of the universe.</li>
22
- <li>Hey, guess what you're accessories to.</li>
23
- </ol>
24
- </Loader>
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
- * DRAFT - инлайн-лоадер
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":"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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 caption?: React.ReactNode;\n dimmed?: boolean;\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 * DRAFT - инлайн-лоадер\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"]}
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
- * DRAFT - инлайн-лоадер
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.zIndex = incrementZIndex(_this.getProps().priority, _this.getProps().delta);
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; // TODO: Enable this rule in functional components.
49
-
50
- /* eslint-disable @typescript-eslint/no-unused-vars */
51
-
52
-
53
- var _this$getProps = this.getProps(),
54
- style = _this$getProps.style,
55
- children = _this$getProps.children,
56
- delta = _this$getProps.delta,
57
- priority = _this$getProps.priority,
58
- applyZIndex = _this$getProps.applyZIndex,
59
- coverChildren = _this$getProps.coverChildren,
60
- createStackingContext = _this$getProps.createStackingContext,
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 zIndexContexValue = {
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
- zIndexContexValue = coverChildren ? {
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
- return /*#__PURE__*/React.createElement(ZIndexContext.Provider, {
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","getProps","defaultProps","zIndex","wrapperRef","element","setRootNode","priority","delta","componentWillUnmount","render","style","children","applyZIndex","coverChildren","createStackingContext","rest","wrapperStyle","zIndexContexValue","newZIndex","calcZIndex","Number","isFinite","document","body","isolation","transform","allowedValuesIntervalLength","scale","Math","ceil","Component","__KONTUR_REACT_UI__","propTypes","Error","trunc"],"mappings":"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","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\ntype DefaultProps = Required<\n Pick<ZIndexProps, 'delta' | 'priority' | 'style' | 'applyZIndex' | 'coverChildren' | 'createStackingContext'>\n>;\n\n@rootNode\nexport class ZIndex extends React.Component<ZIndexProps> {\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 };\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 zIndex = 0;\n\n private setRootNode!: TSetRootNode;\n\n constructor(props: ZIndexProps) {\n super(props);\n this.zIndex = incrementZIndex(this.getProps().priority, this.getProps().delta);\n }\n\n public componentWillUnmount() {\n removeZIndex(this.zIndex);\n }\n\n public render() {\n // TODO: Enable this rule in functional components.\n /* eslint-disable @typescript-eslint/no-unused-vars */\n const { style, children, delta, priority, applyZIndex, coverChildren, createStackingContext, wrapperRef, ...rest } =\n this.getProps();\n\n const wrapperStyle: React.CSSProperties = {};\n\n return (\n <ZIndexContext.Consumer>\n {({ parentLayerZIndex, maxZIndex }) => {\n let zIndexContexValue = { parentLayerZIndex, maxZIndex };\n\n if (applyZIndex) {\n const newZIndex = this.calcZIndex(parentLayerZIndex, maxZIndex);\n wrapperStyle.zIndex = newZIndex;\n\n zIndexContexValue = 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 return (\n <ZIndexContext.Provider value={zIndexContexValue}>\n <div style={{ ...style, ...wrapperStyle }} ref={this.wrapperRef} {...rest}>\n {children}\n </div>\n </ZIndexContext.Provider>\n );\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.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"]}
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":"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","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
- export declare class ZIndex extends React.Component<ZIndexProps> {
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 `Element` out of it's instance
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 convinient usage
27
+ // also checking undefined for convenient usage
20
28
  return null;
21
29
  }
22
30
 
23
31
  if (isElement(instance)) {
24
- // instance can be a `Element` already if comming
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 `Element`
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
- // at this point, it is rather `Element` (what we are looking for)
43
- // or null (which is also OK, e.g. Popup/Tooltip/Hint before opening), so, just return it
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
- } // node is undefined, which means that the instance's root node getter doesn't exists or returns the undefined
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;;;;AAIA,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,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;AACA;AACA;AACAA,EAAAA,QAAQ,GAAGP,WAAW,CAACM,QAAD,CAAtB;;AAEA;AACA,SAAOL,SAAS,CAACM,QAAD,CAAT,GAAsBA,QAAtB,GAAiC,IAAxC;AACD,CAtCM","sourcesContent":["/* eslint-disable react/no-find-dom-node */\nimport { findDOMNode } from 'react-dom';\nimport React from 'react';\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` 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 if (!canUseDOM || !instance) {\n // instance can be `null` if component was unmounted\n // also checking undefined for convinient usage\n return null;\n }\n\n if (isElement(instance)) {\n // instance can be a `Element` already if comming\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 // at this point, it is rather `Element` (what we are looking for)\n // or null (which is also OK, e.g. Popup/Tooltip/Hint before opening), so, just return it\n return rootNode;\n }\n\n // node is undefined, which means that the instance's root node getter doesn't exists or returns the undefined\n // anyway, it tell us that the convention is not respected (by the component itself or its children),\n // so, we have to fall back to the deprecated findDOMNode, which always works but breaks StrictMode\n rootNode = findDOMNode(instance);\n\n // the findDOMNode can also return Text, but we are only intrested in HTMLElements, so just filter it\n return isElement(rootNode) ? rootNode : null;\n};\n"]}
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 `Element` out of it's instance
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.1",
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.1/",
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"