@alfalab/core-components-popover 6.0.9 → 6.2.0

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/Component.d.ts CHANGED
@@ -77,7 +77,7 @@ type PopoverProps = {
77
77
  /**
78
78
  * Хранит функцию, с помощью которой можно обновить положение компонента
79
79
  */
80
- update?: MutableRefObject<() => void>;
80
+ update?: MutableRefObject<(() => void) | undefined>;
81
81
  /**
82
82
  * Дополнительный класс
83
83
  */
package/Component.js CHANGED
@@ -12,6 +12,7 @@ var cn = require('classnames');
12
12
  var maxSize = require('popper-max-size-modifier');
13
13
  var coreComponentsPortal = require('@alfalab/core-components-portal');
14
14
  var coreComponentsStack = require('@alfalab/core-components-stack');
15
+ var hooks = require('@alfalab/hooks');
15
16
 
16
17
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
17
18
 
@@ -20,7 +21,7 @@ var mergeRefs__default = /*#__PURE__*/_interopDefaultCompat(mergeRefs);
20
21
  var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
21
22
  var maxSize__default = /*#__PURE__*/_interopDefaultCompat(maxSize);
22
23
 
23
- var styles = {"component":"popover__component_15gnr","inner":"popover__inner_15gnr","scrollableContent":"popover__scrollableContent_15gnr","arrow":"popover__arrow_15gnr","arrowShift":"popover__arrowShift_15gnr","enter":"popover__enter_15gnr","enterActive":"popover__enterActive_15gnr","exit":"popover__exit_15gnr","exitActive":"popover__exitActive_15gnr"};
24
+ var styles = {"component":"popover__component_1btnx","inner":"popover__inner_1btnx","scrollableContent":"popover__scrollableContent_1btnx","arrow":"popover__arrow_1btnx","arrowShift":"popover__arrowShift_1btnx","enter":"popover__enter_1btnx","enterActive":"popover__enterActive_1btnx","exit":"popover__exit_1btnx","exitActive":"popover__exitActive_1btnx"};
24
25
  require('./index.css')
25
26
 
26
27
  var DEFAULT_TRANSITION = {
@@ -95,7 +96,7 @@ var Popover = React.forwardRef(function (_a, ref) {
95
96
  if (updatePopper) {
96
97
  updatePopperRef.current = updatePopper;
97
98
  }
98
- React.useEffect(function () {
99
+ hooks.useLayoutEffect_SAFE_FOR_SSR(function () {
99
100
  setReferenceElement(anchorElement);
100
101
  }, [anchorElement]);
101
102
  React.useEffect(function () {
@@ -104,7 +105,7 @@ var Popover = React.forwardRef(function (_a, ref) {
104
105
  }
105
106
  }, [updatePopper, arrowElement, children]);
106
107
  React.useEffect(function () {
107
- if (update && !update.current && updatePopper) {
108
+ if (update && updatePopper) {
108
109
  // eslint-disable-next-line no-param-reassign
109
110
  update.current = updatePopper;
110
111
  }
@@ -77,7 +77,7 @@ type PopoverProps = {
77
77
  /**
78
78
  * Хранит функцию, с помощью которой можно обновить положение компонента
79
79
  */
80
- update?: MutableRefObject<() => void>;
80
+ update?: MutableRefObject<(() => void) | undefined>;
81
81
  /**
82
82
  * Дополнительный класс
83
83
  */
package/cssm/Component.js CHANGED
@@ -12,6 +12,7 @@ var cn = require('classnames');
12
12
  var maxSize = require('popper-max-size-modifier');
13
13
  var coreComponentsPortal = require('@alfalab/core-components-portal/cssm');
14
14
  var coreComponentsStack = require('@alfalab/core-components-stack/cssm');
15
+ var hooks = require('@alfalab/hooks');
15
16
  var styles = require('./index.module.css');
16
17
 
17
18
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
@@ -94,7 +95,7 @@ var Popover = React.forwardRef(function (_a, ref) {
94
95
  if (updatePopper) {
95
96
  updatePopperRef.current = updatePopper;
96
97
  }
97
- React.useEffect(function () {
98
+ hooks.useLayoutEffect_SAFE_FOR_SSR(function () {
98
99
  setReferenceElement(anchorElement);
99
100
  }, [anchorElement]);
100
101
  React.useEffect(function () {
@@ -103,7 +104,7 @@ var Popover = React.forwardRef(function (_a, ref) {
103
104
  }
104
105
  }, [updatePopper, arrowElement, children]);
105
106
  React.useEffect(function () {
106
- if (update && !update.current && updatePopper) {
107
+ if (update && updatePopper) {
107
108
  // eslint-disable-next-line no-param-reassign
108
109
  update.current = updatePopper;
109
110
  }
package/cssm/index.js CHANGED
@@ -13,6 +13,7 @@ require('classnames');
13
13
  require('popper-max-size-modifier');
14
14
  require('@alfalab/core-components-portal/cssm');
15
15
  require('@alfalab/core-components-stack/cssm');
16
+ require('@alfalab/hooks');
16
17
  require('./index.module.css');
17
18
 
18
19
 
@@ -1,6 +1,6 @@
1
1
  :root {
2
2
  } /* deprecated */ :root {
3
- --color-light-bg-primary: #fff;
3
+ --color-light-modal-bg-primary: #fff;
4
4
  --color-light-text-primary: #0e0e0e; /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
5
5
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
6
  } :root {
@@ -24,7 +24,7 @@
24
24
  color: var(--color-light-text-primary);
25
25
  } .inner {
26
26
  position: relative;
27
- background-color: var(--color-light-bg-primary);
27
+ background-color: var(--color-light-modal-bg-primary);
28
28
  box-shadow: var(--shadow-m);
29
29
  border: 1px solid var(--popover-border-color);
30
30
  box-sizing: border-box;
@@ -41,7 +41,7 @@
41
41
  position: absolute;
42
42
  width: 12px;
43
43
  height: 12px;
44
- background-color: var(--color-light-bg-primary);
44
+ background-color: var(--color-light-modal-bg-primary);
45
45
  border: 1px solid var(--popover-border-color);
46
46
  box-sizing: border-box;
47
47
  transform: rotate(45deg);
@@ -77,7 +77,7 @@ type PopoverProps = {
77
77
  /**
78
78
  * Хранит функцию, с помощью которой можно обновить положение компонента
79
79
  */
80
- update?: MutableRefObject<() => void>;
80
+ update?: MutableRefObject<(() => void) | undefined>;
81
81
  /**
82
82
  * Дополнительный класс
83
83
  */
package/esm/Component.js CHANGED
@@ -8,8 +8,9 @@ import cn from 'classnames';
8
8
  import maxSize from 'popper-max-size-modifier';
9
9
  import { Portal } from '@alfalab/core-components-portal/esm';
10
10
  import { stackingOrder, Stack } from '@alfalab/core-components-stack/esm';
11
+ import { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';
11
12
 
12
- var styles = {"component":"popover__component_15gnr","inner":"popover__inner_15gnr","scrollableContent":"popover__scrollableContent_15gnr","arrow":"popover__arrow_15gnr","arrowShift":"popover__arrowShift_15gnr","enter":"popover__enter_15gnr","enterActive":"popover__enterActive_15gnr","exit":"popover__exit_15gnr","exitActive":"popover__exitActive_15gnr"};
13
+ var styles = {"component":"popover__component_1btnx","inner":"popover__inner_1btnx","scrollableContent":"popover__scrollableContent_1btnx","arrow":"popover__arrow_1btnx","arrowShift":"popover__arrowShift_1btnx","enter":"popover__enter_1btnx","enterActive":"popover__enterActive_1btnx","exit":"popover__exit_1btnx","exitActive":"popover__exitActive_1btnx"};
13
14
  require('./index.css')
14
15
 
15
16
  var DEFAULT_TRANSITION = {
@@ -84,7 +85,7 @@ var Popover = forwardRef(function (_a, ref) {
84
85
  if (updatePopper) {
85
86
  updatePopperRef.current = updatePopper;
86
87
  }
87
- useEffect(function () {
88
+ useLayoutEffect_SAFE_FOR_SSR(function () {
88
89
  setReferenceElement(anchorElement);
89
90
  }, [anchorElement]);
90
91
  useEffect(function () {
@@ -93,7 +94,7 @@ var Popover = forwardRef(function (_a, ref) {
93
94
  }
94
95
  }, [updatePopper, arrowElement, children]);
95
96
  useEffect(function () {
96
- if (update && !update.current && updatePopper) {
97
+ if (update && updatePopper) {
97
98
  // eslint-disable-next-line no-param-reassign
98
99
  update.current = updatePopper;
99
100
  }
package/esm/index.css CHANGED
@@ -1,7 +1,7 @@
1
- /* hash: 1nyfl */
1
+ /* hash: m7e7m */
2
2
  :root {
3
3
  } /* deprecated */ :root {
4
- --color-light-bg-primary: #fff;
4
+ --color-light-modal-bg-primary: #fff;
5
5
  --color-light-text-primary: #0e0e0e; /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
6
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
7
7
  } :root {
@@ -20,93 +20,93 @@
20
20
  } :root {
21
21
  } :root {
22
22
  --popover-border-color: transparent;
23
- } .popover__component_15gnr {
23
+ } .popover__component_1btnx {
24
24
  background-color: transparent;
25
25
  color: var(--color-light-text-primary);
26
- } .popover__inner_15gnr {
26
+ } .popover__inner_1btnx {
27
27
  position: relative;
28
- background-color: var(--color-light-bg-primary);
28
+ background-color: var(--color-light-modal-bg-primary);
29
29
  box-shadow: var(--shadow-m);
30
30
  border: 1px solid var(--popover-border-color);
31
31
  box-sizing: border-box;
32
32
  will-change: transform;
33
- } .popover__scrollableContent_15gnr {
33
+ } .popover__scrollableContent_1btnx {
34
34
  position: relative;
35
35
  z-index: 2;
36
36
  overflow-y: auto;
37
- } .popover__arrow_15gnr {
37
+ } .popover__arrow_1btnx {
38
38
  z-index: 1;
39
- } .popover__arrow_15gnr:after {
39
+ } .popover__arrow_1btnx:after {
40
40
  content: '';
41
41
  display: block;
42
42
  position: absolute;
43
43
  width: 12px;
44
44
  height: 12px;
45
- background-color: var(--color-light-bg-primary);
45
+ background-color: var(--color-light-modal-bg-primary);
46
46
  border: 1px solid var(--popover-border-color);
47
47
  box-sizing: border-box;
48
48
  transform: rotate(45deg);
49
- } .popover__component_15gnr[data-popper-placement='left'] .popover__arrow_15gnr,
50
- .popover__component_15gnr[data-popper-placement='left-start'] .popover__arrow_15gnr,
51
- .popover__component_15gnr[data-popper-placement='left-end'] .popover__arrow_15gnr {
49
+ } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx,
50
+ .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx,
51
+ .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx {
52
52
  right: 5px
53
- } .popover__component_15gnr[data-popper-placement='left'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='left-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='left-end'] .popover__arrow_15gnr:after {
53
+ } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx:after {
54
54
  top: -6px;
55
55
  border-bottom: none;
56
56
  border-left: none;
57
- } .popover__component_15gnr[data-popper-placement='left-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
57
+ } .popover__component_1btnx[data-popper-placement='left-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
58
58
  top: -7px;
59
- } .popover__component_15gnr[data-popper-placement='left-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
59
+ } .popover__component_1btnx[data-popper-placement='left-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
60
60
  top: -5px;
61
- } .popover__component_15gnr[data-popper-placement='right'] .popover__arrow_15gnr,
62
- .popover__component_15gnr[data-popper-placement='right-start'] .popover__arrow_15gnr,
63
- .popover__component_15gnr[data-popper-placement='right-end'] .popover__arrow_15gnr {
61
+ } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx,
62
+ .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx,
63
+ .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx {
64
64
  left: -7px
65
- } .popover__component_15gnr[data-popper-placement='right'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='right-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='right-end'] .popover__arrow_15gnr:after {
65
+ } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx:after {
66
66
  top: -6px;
67
67
  border-top: none;
68
68
  border-right: none;
69
- } .popover__component_15gnr[data-popper-placement='right-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
69
+ } .popover__component_1btnx[data-popper-placement='right-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
70
70
  top: -7px;
71
- } .popover__component_15gnr[data-popper-placement='right-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
71
+ } .popover__component_1btnx[data-popper-placement='right-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
72
72
  top: -5px;
73
- } .popover__component_15gnr[data-popper-placement='top'] .popover__arrow_15gnr,
74
- .popover__component_15gnr[data-popper-placement='top-start'] .popover__arrow_15gnr,
75
- .popover__component_15gnr[data-popper-placement='top-end'] .popover__arrow_15gnr {
73
+ } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx,
74
+ .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx,
75
+ .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx {
76
76
  bottom: 5px
77
- } .popover__component_15gnr[data-popper-placement='top'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='top-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='top-end'] .popover__arrow_15gnr:after {
77
+ } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx:after {
78
78
  left: -6px;
79
79
  border-top: none;
80
80
  border-left: none;
81
- } .popover__component_15gnr[data-popper-placement='top-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
81
+ } .popover__component_1btnx[data-popper-placement='top-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
82
82
  left: -17px;
83
- } .popover__component_15gnr[data-popper-placement='top-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
83
+ } .popover__component_1btnx[data-popper-placement='top-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
84
84
  left: 5px;
85
- } .popover__component_15gnr[data-popper-placement='bottom'] .popover__arrow_15gnr,
86
- .popover__component_15gnr[data-popper-placement='bottom-start'] .popover__arrow_15gnr,
87
- .popover__component_15gnr[data-popper-placement='bottom-end'] .popover__arrow_15gnr {
85
+ } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx,
86
+ .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx,
87
+ .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx {
88
88
  top: -7px
89
- } .popover__component_15gnr[data-popper-placement='bottom'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='bottom-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='bottom-end'] .popover__arrow_15gnr:after {
89
+ } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx:after {
90
90
  left: -6px;
91
91
  border-bottom: none;
92
92
  border-right: none;
93
- } .popover__component_15gnr[data-popper-placement='bottom-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
93
+ } .popover__component_1btnx[data-popper-placement='bottom-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
94
94
  left: -17px;
95
- } .popover__component_15gnr[data-popper-placement='bottom-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
95
+ } .popover__component_1btnx[data-popper-placement='bottom-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
96
96
  left: 5px;
97
- } .popover__enter_15gnr .popover__inner_15gnr {
97
+ } .popover__enter_1btnx .popover__inner_1btnx {
98
98
  opacity: 0;
99
99
  transform: scale(0.98);
100
- } .popover__enterActive_15gnr .popover__inner_15gnr {
100
+ } .popover__enterActive_1btnx .popover__inner_1btnx {
101
101
  opacity: 1;
102
102
  transform: scale(1);
103
103
  transition-property: opacity, transform;
104
104
  transition-timing-function: ease-in-out;
105
105
  transition-duration: 150ms;
106
- } .popover__exit_15gnr .popover__inner_15gnr {
106
+ } .popover__exit_1btnx .popover__inner_1btnx {
107
107
  opacity: 1;
108
108
  transform: scale(1);
109
- } .popover__exitActive_15gnr .popover__inner_15gnr {
109
+ } .popover__exitActive_1btnx .popover__inner_1btnx {
110
110
  opacity: 0;
111
111
  transform: scale(0.98);
112
112
  transition-property: opacity, transform;
package/esm/index.js CHANGED
@@ -9,3 +9,4 @@ import 'classnames';
9
9
  import 'popper-max-size-modifier';
10
10
  import '@alfalab/core-components-portal/esm';
11
11
  import '@alfalab/core-components-stack/esm';
12
+ import '@alfalab/hooks';
package/index.css CHANGED
@@ -1,7 +1,7 @@
1
- /* hash: 1nyfl */
1
+ /* hash: m7e7m */
2
2
  :root {
3
3
  } /* deprecated */ :root {
4
- --color-light-bg-primary: #fff;
4
+ --color-light-modal-bg-primary: #fff;
5
5
  --color-light-text-primary: #0e0e0e; /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
6
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
7
7
  } :root {
@@ -20,93 +20,93 @@
20
20
  } :root {
21
21
  } :root {
22
22
  --popover-border-color: transparent;
23
- } .popover__component_15gnr {
23
+ } .popover__component_1btnx {
24
24
  background-color: transparent;
25
25
  color: var(--color-light-text-primary);
26
- } .popover__inner_15gnr {
26
+ } .popover__inner_1btnx {
27
27
  position: relative;
28
- background-color: var(--color-light-bg-primary);
28
+ background-color: var(--color-light-modal-bg-primary);
29
29
  box-shadow: var(--shadow-m);
30
30
  border: 1px solid var(--popover-border-color);
31
31
  box-sizing: border-box;
32
32
  will-change: transform;
33
- } .popover__scrollableContent_15gnr {
33
+ } .popover__scrollableContent_1btnx {
34
34
  position: relative;
35
35
  z-index: 2;
36
36
  overflow-y: auto;
37
- } .popover__arrow_15gnr {
37
+ } .popover__arrow_1btnx {
38
38
  z-index: 1;
39
- } .popover__arrow_15gnr:after {
39
+ } .popover__arrow_1btnx:after {
40
40
  content: '';
41
41
  display: block;
42
42
  position: absolute;
43
43
  width: 12px;
44
44
  height: 12px;
45
- background-color: var(--color-light-bg-primary);
45
+ background-color: var(--color-light-modal-bg-primary);
46
46
  border: 1px solid var(--popover-border-color);
47
47
  box-sizing: border-box;
48
48
  transform: rotate(45deg);
49
- } .popover__component_15gnr[data-popper-placement='left'] .popover__arrow_15gnr,
50
- .popover__component_15gnr[data-popper-placement='left-start'] .popover__arrow_15gnr,
51
- .popover__component_15gnr[data-popper-placement='left-end'] .popover__arrow_15gnr {
49
+ } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx,
50
+ .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx,
51
+ .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx {
52
52
  right: 5px
53
- } .popover__component_15gnr[data-popper-placement='left'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='left-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='left-end'] .popover__arrow_15gnr:after {
53
+ } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx:after {
54
54
  top: -6px;
55
55
  border-bottom: none;
56
56
  border-left: none;
57
- } .popover__component_15gnr[data-popper-placement='left-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
57
+ } .popover__component_1btnx[data-popper-placement='left-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
58
58
  top: -7px;
59
- } .popover__component_15gnr[data-popper-placement='left-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
59
+ } .popover__component_1btnx[data-popper-placement='left-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
60
60
  top: -5px;
61
- } .popover__component_15gnr[data-popper-placement='right'] .popover__arrow_15gnr,
62
- .popover__component_15gnr[data-popper-placement='right-start'] .popover__arrow_15gnr,
63
- .popover__component_15gnr[data-popper-placement='right-end'] .popover__arrow_15gnr {
61
+ } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx,
62
+ .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx,
63
+ .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx {
64
64
  left: -7px
65
- } .popover__component_15gnr[data-popper-placement='right'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='right-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='right-end'] .popover__arrow_15gnr:after {
65
+ } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx:after {
66
66
  top: -6px;
67
67
  border-top: none;
68
68
  border-right: none;
69
- } .popover__component_15gnr[data-popper-placement='right-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
69
+ } .popover__component_1btnx[data-popper-placement='right-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
70
70
  top: -7px;
71
- } .popover__component_15gnr[data-popper-placement='right-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
71
+ } .popover__component_1btnx[data-popper-placement='right-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
72
72
  top: -5px;
73
- } .popover__component_15gnr[data-popper-placement='top'] .popover__arrow_15gnr,
74
- .popover__component_15gnr[data-popper-placement='top-start'] .popover__arrow_15gnr,
75
- .popover__component_15gnr[data-popper-placement='top-end'] .popover__arrow_15gnr {
73
+ } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx,
74
+ .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx,
75
+ .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx {
76
76
  bottom: 5px
77
- } .popover__component_15gnr[data-popper-placement='top'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='top-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='top-end'] .popover__arrow_15gnr:after {
77
+ } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx:after {
78
78
  left: -6px;
79
79
  border-top: none;
80
80
  border-left: none;
81
- } .popover__component_15gnr[data-popper-placement='top-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
81
+ } .popover__component_1btnx[data-popper-placement='top-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
82
82
  left: -17px;
83
- } .popover__component_15gnr[data-popper-placement='top-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
83
+ } .popover__component_1btnx[data-popper-placement='top-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
84
84
  left: 5px;
85
- } .popover__component_15gnr[data-popper-placement='bottom'] .popover__arrow_15gnr,
86
- .popover__component_15gnr[data-popper-placement='bottom-start'] .popover__arrow_15gnr,
87
- .popover__component_15gnr[data-popper-placement='bottom-end'] .popover__arrow_15gnr {
85
+ } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx,
86
+ .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx,
87
+ .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx {
88
88
  top: -7px
89
- } .popover__component_15gnr[data-popper-placement='bottom'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='bottom-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='bottom-end'] .popover__arrow_15gnr:after {
89
+ } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx:after {
90
90
  left: -6px;
91
91
  border-bottom: none;
92
92
  border-right: none;
93
- } .popover__component_15gnr[data-popper-placement='bottom-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
93
+ } .popover__component_1btnx[data-popper-placement='bottom-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
94
94
  left: -17px;
95
- } .popover__component_15gnr[data-popper-placement='bottom-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
95
+ } .popover__component_1btnx[data-popper-placement='bottom-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
96
96
  left: 5px;
97
- } .popover__enter_15gnr .popover__inner_15gnr {
97
+ } .popover__enter_1btnx .popover__inner_1btnx {
98
98
  opacity: 0;
99
99
  transform: scale(0.98);
100
- } .popover__enterActive_15gnr .popover__inner_15gnr {
100
+ } .popover__enterActive_1btnx .popover__inner_1btnx {
101
101
  opacity: 1;
102
102
  transform: scale(1);
103
103
  transition-property: opacity, transform;
104
104
  transition-timing-function: ease-in-out;
105
105
  transition-duration: 150ms;
106
- } .popover__exit_15gnr .popover__inner_15gnr {
106
+ } .popover__exit_1btnx .popover__inner_1btnx {
107
107
  opacity: 1;
108
108
  transform: scale(1);
109
- } .popover__exitActive_15gnr .popover__inner_15gnr {
109
+ } .popover__exitActive_1btnx .popover__inner_1btnx {
110
110
  opacity: 0;
111
111
  transform: scale(0.98);
112
112
  transition-property: opacity, transform;
package/index.js CHANGED
@@ -13,6 +13,7 @@ require('classnames');
13
13
  require('popper-max-size-modifier');
14
14
  require('@alfalab/core-components-portal');
15
15
  require('@alfalab/core-components-stack');
16
+ require('@alfalab/hooks');
16
17
 
17
18
 
18
19
 
@@ -77,7 +77,7 @@ type PopoverProps = {
77
77
  /**
78
78
  * Хранит функцию, с помощью которой можно обновить положение компонента
79
79
  */
80
- update?: MutableRefObject<() => void>;
80
+ update?: MutableRefObject<(() => void) | undefined>;
81
81
  /**
82
82
  * Дополнительный класс
83
83
  */
@@ -7,8 +7,9 @@ import cn from 'classnames';
7
7
  import maxSize from 'popper-max-size-modifier';
8
8
  import { Portal } from '@alfalab/core-components-portal/modern';
9
9
  import { Stack, stackingOrder } from '@alfalab/core-components-stack/modern';
10
+ import { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';
10
11
 
11
- const styles = {"component":"popover__component_15gnr","inner":"popover__inner_15gnr","scrollableContent":"popover__scrollableContent_15gnr","arrow":"popover__arrow_15gnr","arrowShift":"popover__arrowShift_15gnr","enter":"popover__enter_15gnr","enterActive":"popover__enterActive_15gnr","exit":"popover__exit_15gnr","exitActive":"popover__exitActive_15gnr"};
12
+ const styles = {"component":"popover__component_1btnx","inner":"popover__inner_1btnx","scrollableContent":"popover__scrollableContent_1btnx","arrow":"popover__arrow_1btnx","arrowShift":"popover__arrowShift_1btnx","enter":"popover__enter_1btnx","enterActive":"popover__enterActive_1btnx","exit":"popover__exit_1btnx","exitActive":"popover__exitActive_1btnx"};
12
13
  require('./index.css')
13
14
 
14
15
  const DEFAULT_TRANSITION = {
@@ -81,7 +82,7 @@ const Popover = forwardRef(({ children, getPortalContainer, transition = DEFAULT
81
82
  if (updatePopper) {
82
83
  updatePopperRef.current = updatePopper;
83
84
  }
84
- useEffect(() => {
85
+ useLayoutEffect_SAFE_FOR_SSR(() => {
85
86
  setReferenceElement(anchorElement);
86
87
  }, [anchorElement]);
87
88
  useEffect(() => {
@@ -90,7 +91,7 @@ const Popover = forwardRef(({ children, getPortalContainer, transition = DEFAULT
90
91
  }
91
92
  }, [updatePopper, arrowElement, children]);
92
93
  useEffect(() => {
93
- if (update && !update.current && updatePopper) {
94
+ if (update && updatePopper) {
94
95
  // eslint-disable-next-line no-param-reassign
95
96
  update.current = updatePopper;
96
97
  }
package/modern/index.css CHANGED
@@ -1,7 +1,7 @@
1
- /* hash: 1nyfl */
1
+ /* hash: m7e7m */
2
2
  :root {
3
3
  } /* deprecated */ :root {
4
- --color-light-bg-primary: #fff;
4
+ --color-light-modal-bg-primary: #fff;
5
5
  --color-light-text-primary: #0e0e0e; /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
6
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
7
7
  } :root {
@@ -20,93 +20,93 @@
20
20
  } :root {
21
21
  } :root {
22
22
  --popover-border-color: transparent;
23
- } .popover__component_15gnr {
23
+ } .popover__component_1btnx {
24
24
  background-color: transparent;
25
25
  color: var(--color-light-text-primary);
26
- } .popover__inner_15gnr {
26
+ } .popover__inner_1btnx {
27
27
  position: relative;
28
- background-color: var(--color-light-bg-primary);
28
+ background-color: var(--color-light-modal-bg-primary);
29
29
  box-shadow: var(--shadow-m);
30
30
  border: 1px solid var(--popover-border-color);
31
31
  box-sizing: border-box;
32
32
  will-change: transform;
33
- } .popover__scrollableContent_15gnr {
33
+ } .popover__scrollableContent_1btnx {
34
34
  position: relative;
35
35
  z-index: 2;
36
36
  overflow-y: auto;
37
- } .popover__arrow_15gnr {
37
+ } .popover__arrow_1btnx {
38
38
  z-index: 1;
39
- } .popover__arrow_15gnr:after {
39
+ } .popover__arrow_1btnx:after {
40
40
  content: '';
41
41
  display: block;
42
42
  position: absolute;
43
43
  width: 12px;
44
44
  height: 12px;
45
- background-color: var(--color-light-bg-primary);
45
+ background-color: var(--color-light-modal-bg-primary);
46
46
  border: 1px solid var(--popover-border-color);
47
47
  box-sizing: border-box;
48
48
  transform: rotate(45deg);
49
- } .popover__component_15gnr[data-popper-placement='left'] .popover__arrow_15gnr,
50
- .popover__component_15gnr[data-popper-placement='left-start'] .popover__arrow_15gnr,
51
- .popover__component_15gnr[data-popper-placement='left-end'] .popover__arrow_15gnr {
49
+ } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx,
50
+ .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx,
51
+ .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx {
52
52
  right: 5px
53
- } .popover__component_15gnr[data-popper-placement='left'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='left-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='left-end'] .popover__arrow_15gnr:after {
53
+ } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx:after {
54
54
  top: -6px;
55
55
  border-bottom: none;
56
56
  border-left: none;
57
- } .popover__component_15gnr[data-popper-placement='left-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
57
+ } .popover__component_1btnx[data-popper-placement='left-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
58
58
  top: -7px;
59
- } .popover__component_15gnr[data-popper-placement='left-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
59
+ } .popover__component_1btnx[data-popper-placement='left-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
60
60
  top: -5px;
61
- } .popover__component_15gnr[data-popper-placement='right'] .popover__arrow_15gnr,
62
- .popover__component_15gnr[data-popper-placement='right-start'] .popover__arrow_15gnr,
63
- .popover__component_15gnr[data-popper-placement='right-end'] .popover__arrow_15gnr {
61
+ } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx,
62
+ .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx,
63
+ .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx {
64
64
  left: -7px
65
- } .popover__component_15gnr[data-popper-placement='right'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='right-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='right-end'] .popover__arrow_15gnr:after {
65
+ } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx:after {
66
66
  top: -6px;
67
67
  border-top: none;
68
68
  border-right: none;
69
- } .popover__component_15gnr[data-popper-placement='right-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
69
+ } .popover__component_1btnx[data-popper-placement='right-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
70
70
  top: -7px;
71
- } .popover__component_15gnr[data-popper-placement='right-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
71
+ } .popover__component_1btnx[data-popper-placement='right-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
72
72
  top: -5px;
73
- } .popover__component_15gnr[data-popper-placement='top'] .popover__arrow_15gnr,
74
- .popover__component_15gnr[data-popper-placement='top-start'] .popover__arrow_15gnr,
75
- .popover__component_15gnr[data-popper-placement='top-end'] .popover__arrow_15gnr {
73
+ } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx,
74
+ .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx,
75
+ .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx {
76
76
  bottom: 5px
77
- } .popover__component_15gnr[data-popper-placement='top'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='top-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='top-end'] .popover__arrow_15gnr:after {
77
+ } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx:after {
78
78
  left: -6px;
79
79
  border-top: none;
80
80
  border-left: none;
81
- } .popover__component_15gnr[data-popper-placement='top-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
81
+ } .popover__component_1btnx[data-popper-placement='top-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
82
82
  left: -17px;
83
- } .popover__component_15gnr[data-popper-placement='top-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
83
+ } .popover__component_1btnx[data-popper-placement='top-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
84
84
  left: 5px;
85
- } .popover__component_15gnr[data-popper-placement='bottom'] .popover__arrow_15gnr,
86
- .popover__component_15gnr[data-popper-placement='bottom-start'] .popover__arrow_15gnr,
87
- .popover__component_15gnr[data-popper-placement='bottom-end'] .popover__arrow_15gnr {
85
+ } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx,
86
+ .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx,
87
+ .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx {
88
88
  top: -7px
89
- } .popover__component_15gnr[data-popper-placement='bottom'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='bottom-start'] .popover__arrow_15gnr:after, .popover__component_15gnr[data-popper-placement='bottom-end'] .popover__arrow_15gnr:after {
89
+ } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx:after {
90
90
  left: -6px;
91
91
  border-bottom: none;
92
92
  border-right: none;
93
- } .popover__component_15gnr[data-popper-placement='bottom-start'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
93
+ } .popover__component_1btnx[data-popper-placement='bottom-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
94
94
  left: -17px;
95
- } .popover__component_15gnr[data-popper-placement='bottom-end'].popover__arrowShift_15gnr .popover__arrow_15gnr:after {
95
+ } .popover__component_1btnx[data-popper-placement='bottom-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
96
96
  left: 5px;
97
- } .popover__enter_15gnr .popover__inner_15gnr {
97
+ } .popover__enter_1btnx .popover__inner_1btnx {
98
98
  opacity: 0;
99
99
  transform: scale(0.98);
100
- } .popover__enterActive_15gnr .popover__inner_15gnr {
100
+ } .popover__enterActive_1btnx .popover__inner_1btnx {
101
101
  opacity: 1;
102
102
  transform: scale(1);
103
103
  transition-property: opacity, transform;
104
104
  transition-timing-function: ease-in-out;
105
105
  transition-duration: 150ms;
106
- } .popover__exit_15gnr .popover__inner_15gnr {
106
+ } .popover__exit_1btnx .popover__inner_1btnx {
107
107
  opacity: 1;
108
108
  transform: scale(1);
109
- } .popover__exitActive_15gnr .popover__inner_15gnr {
109
+ } .popover__exitActive_1btnx .popover__inner_1btnx {
110
110
  opacity: 0;
111
111
  transform: scale(0.98);
112
112
  transition-property: opacity, transform;
package/modern/index.js CHANGED
@@ -8,3 +8,4 @@ import 'classnames';
8
8
  import 'popper-max-size-modifier';
9
9
  import '@alfalab/core-components-portal/modern';
10
10
  import '@alfalab/core-components-stack/modern';
11
+ import '@alfalab/hooks';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-popover",
3
- "version": "6.0.9",
3
+ "version": "6.2.0",
4
4
  "description": "Popover component",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -15,8 +15,9 @@
15
15
  "react-dom": "^16.9.0 || ^17.0.1 || ^18.0.0"
16
16
  },
17
17
  "dependencies": {
18
- "@alfalab/core-components-portal": "^3.1.5",
19
- "@alfalab/core-components-stack": "^4.0.4",
18
+ "@alfalab/core-components-portal": "^3.2.0",
19
+ "@alfalab/core-components-stack": "^4.1.0",
20
+ "@alfalab/hooks": "^1.13.0",
20
21
  "@juggle/resize-observer": "^3.3.1",
21
22
  "@popperjs/core": "^2.3.3",
22
23
  "classnames": "^2.3.1",
@@ -0,0 +1,390 @@
1
+ import React, {
2
+ CSSProperties,
3
+ forwardRef,
4
+ MutableRefObject,
5
+ ReactNode,
6
+ useEffect,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ } from 'react';
11
+ import mergeRefs from 'react-merge-refs';
12
+ import { usePopper } from 'react-popper';
13
+ import { CSSTransition } from 'react-transition-group';
14
+ import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
15
+ import { ResizeObserver as ResizeObserverPolyfill } from '@juggle/resize-observer';
16
+ import { BasePlacement, ModifierArguments, Obj, VariationPlacement } from '@popperjs/core';
17
+ import cn from 'classnames';
18
+ import maxSize from 'popper-max-size-modifier';
19
+
20
+ import { Portal } from '@alfalab/core-components-portal';
21
+ import { Stack, stackingOrder } from '@alfalab/core-components-stack';
22
+ import { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';
23
+
24
+ import styles from './index.module.css';
25
+
26
+ type RefElement = HTMLElement | null;
27
+
28
+ export type Position = BasePlacement | VariationPlacement;
29
+
30
+ type PopperModifier = {
31
+ name: string;
32
+ options: Obj;
33
+ };
34
+
35
+ export type PopoverProps = {
36
+ /**
37
+ * Управление состоянием поповера (открыт/закрыт)
38
+ */
39
+ open: boolean;
40
+
41
+ /**
42
+ * Элемент, относительного которого появляется поповер
43
+ */
44
+ anchorElement: RefElement;
45
+
46
+ /**
47
+ * Использовать ширину родительского элемента
48
+ */
49
+ useAnchorWidth?: boolean;
50
+
51
+ /**
52
+ * Позиционирование поповера
53
+ */
54
+ position?: Position;
55
+
56
+ /**
57
+ * Запрещает поповеру менять свою позицию.
58
+ * Например, если места снизу недостаточно,то он все равно будет показан снизу
59
+ */
60
+ preventFlip?: boolean;
61
+
62
+ /**
63
+ * Запрещает поповеру менять свою позицию, если он не влезает в видимую область.
64
+ */
65
+ preventOverflow?: boolean;
66
+
67
+ /**
68
+ * Позволяет поповеру подствраивать свою высоту под границы экрана, если из-за величины контента он выходит за рамки видимой области экрана
69
+ */
70
+ availableHeight?: boolean;
71
+
72
+ /**
73
+ * Если `true`, будет отрисована стрелочка
74
+ */
75
+ withArrow?: boolean;
76
+
77
+ /**
78
+ * Смещение поповера.
79
+ * Если позиционирование top, bottom, то [x, y].
80
+ * Если позиционирование left, right то [y, x].
81
+ */
82
+ offset?: [number, number];
83
+
84
+ /**
85
+ * Дополнительный класс для поповера
86
+ */
87
+ popperClassName?: string;
88
+
89
+ /**
90
+ * Дополнительный класс для стрелочки
91
+ */
92
+ arrowClassName?: string;
93
+
94
+ /**
95
+ * Функция, возвращающая контейнер, в который будет рендериться поповер
96
+ */
97
+ getPortalContainer?: () => HTMLElement;
98
+
99
+ /**
100
+ * CSSTransitionProps, прокидываются в компонент CSSTransitionProps.
101
+ */
102
+ transition?: CSSTransitionProps;
103
+
104
+ /**
105
+ * Выставляет кастомное свойство transition-duration
106
+ */
107
+ transitionDuration?: CSSProperties['transitionDuration'];
108
+
109
+ /**
110
+ * Рендерит компонент, обернутый в Transition
111
+ */
112
+ withTransition?: boolean;
113
+
114
+ /**
115
+ * Идентификатор для систем автоматизированного тестирования
116
+ */
117
+ dataTestId?: string;
118
+
119
+ /**
120
+ * Хранит функцию, с помощью которой можно обновить положение компонента
121
+ */
122
+ update?: MutableRefObject<(() => void) | undefined>;
123
+
124
+ /**
125
+ * Дополнительный класс
126
+ */
127
+ className?: string;
128
+
129
+ /**
130
+ * z-index компонента
131
+ */
132
+ zIndex?: number;
133
+
134
+ /**
135
+ * Если поповер не помещается в переданной позиции (position), он попробует открыться в другой позиции,
136
+ * по очереди для каждой позиции из этого списка.
137
+ * Если не передавать, то поповер открывается в противоположном направлении от переданного position.
138
+ */
139
+ fallbackPlacements?: Position[];
140
+
141
+ /**
142
+ * Контент
143
+ */
144
+ children?: ReactNode;
145
+ };
146
+
147
+ const DEFAULT_TRANSITION: PopoverProps['transition'] = {
148
+ timeout: 150,
149
+ };
150
+
151
+ const CSS_TRANSITION_CLASS_NAMES = {
152
+ enter: styles.enter,
153
+ enterActive: styles.enterActive,
154
+ exit: styles.exit,
155
+ exitActive: styles.exitActive,
156
+ };
157
+
158
+ const availableHieghtModifier = {
159
+ name: 'availableHeight',
160
+ enabled: true,
161
+ phase: 'beforeWrite',
162
+ requires: ['maxSize'],
163
+ fn({
164
+ state: {
165
+ modifiersData,
166
+ elements: { popper },
167
+ },
168
+ }: ModifierArguments<Obj>) {
169
+ const { height } = modifiersData.maxSize;
170
+
171
+ const content = popper.querySelector(`.${styles.scrollableContent}`) as HTMLElement;
172
+
173
+ if (content && !content.style.maxHeight) {
174
+ content.style.maxHeight = `${height}px`;
175
+ }
176
+ },
177
+ };
178
+
179
+ /**
180
+ * Минимальный размер anchorElement,
181
+ * при котором возможно смещение стрелочки относительно центра
182
+ */
183
+ const MIN_ARROW_SHIFT_SIZE = 75;
184
+
185
+ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
186
+ (
187
+ {
188
+ children,
189
+ getPortalContainer,
190
+ transition = DEFAULT_TRANSITION,
191
+ anchorElement,
192
+ useAnchorWidth,
193
+ offset = [0, 0],
194
+ withArrow = false,
195
+ withTransition = true,
196
+ position = 'left',
197
+ preventFlip,
198
+ popperClassName,
199
+ arrowClassName,
200
+ className,
201
+ open,
202
+ dataTestId,
203
+ update,
204
+ transitionDuration = `${transition.timeout}ms`,
205
+ zIndex = stackingOrder.POPOVER,
206
+ fallbackPlacements,
207
+ preventOverflow = true,
208
+ availableHeight = false,
209
+ },
210
+ ref,
211
+ ) => {
212
+ const [referenceElement, setReferenceElement] = useState<RefElement>(anchorElement);
213
+ const [popperElement, setPopperElement] = useState<RefElement>(null);
214
+ const [arrowElement, setArrowElement] = useState<RefElement>(null);
215
+ const [arrowShift, setArrowShift] = useState(false);
216
+
217
+ const updatePopperRef = useRef<() => void>();
218
+
219
+ const popperRef = useRef<HTMLDivElement>(null);
220
+ const innerRef = useRef<HTMLDivElement>(null);
221
+
222
+ const popperModifiers = useMemo(() => {
223
+ const modifiers: PopperModifier[] = [{ name: 'offset', options: { offset } }];
224
+
225
+ if (withArrow) {
226
+ modifiers.push({ name: 'arrow', options: { element: arrowElement } });
227
+ }
228
+
229
+ if (preventFlip) {
230
+ modifiers.push({ name: 'flip', options: { fallbackPlacements: [] } });
231
+ }
232
+
233
+ if (fallbackPlacements) {
234
+ modifiers.push({ name: 'flip', options: { fallbackPlacements } });
235
+ }
236
+
237
+ if (preventOverflow) {
238
+ modifiers.push({ name: 'preventOverflow', options: { mainAxis: false } });
239
+ }
240
+
241
+ if (availableHeight) {
242
+ modifiers.push({ ...maxSize, options: {} });
243
+ modifiers.push({ ...availableHieghtModifier, options: {} });
244
+ }
245
+
246
+ return modifiers;
247
+ }, [
248
+ offset,
249
+ withArrow,
250
+ preventFlip,
251
+ fallbackPlacements,
252
+ preventOverflow,
253
+ availableHeight,
254
+ arrowElement,
255
+ ]);
256
+
257
+ const {
258
+ styles: popperStyles,
259
+ attributes,
260
+ update: updatePopper,
261
+ } = usePopper(referenceElement, popperElement, {
262
+ placement: position,
263
+ modifiers: popperModifiers,
264
+ });
265
+
266
+ if (updatePopper) {
267
+ updatePopperRef.current = updatePopper;
268
+ }
269
+
270
+ useLayoutEffect_SAFE_FOR_SSR(() => {
271
+ setReferenceElement(anchorElement);
272
+ }, [anchorElement]);
273
+
274
+ useEffect(() => {
275
+ if (updatePopper) {
276
+ updatePopper();
277
+ }
278
+ }, [updatePopper, arrowElement, children]);
279
+
280
+ useEffect(() => {
281
+ if (update && updatePopper) {
282
+ // eslint-disable-next-line no-param-reassign
283
+ update.current = updatePopper;
284
+ }
285
+ });
286
+
287
+ useEffect(() => {
288
+ if (useAnchorWidth) {
289
+ const updatePopoverWidth = () => updatePopperRef.current?.();
290
+ const ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;
291
+ const observer = new ResizeObserver(updatePopoverWidth);
292
+
293
+ if (anchorElement) {
294
+ observer.observe(anchorElement);
295
+ }
296
+
297
+ return () => {
298
+ observer.disconnect();
299
+ };
300
+ }
301
+
302
+ return () => ({});
303
+ }, [anchorElement, useAnchorWidth]);
304
+
305
+ /**
306
+ * По дизайну, если у тултипа позиционирование -start/-end, то стрелочка немного сдвигается вбок.
307
+ * Но если anchorElement слишком маленький, то стрелочка сдвигаться не должна.
308
+ */
309
+ useEffect(() => {
310
+ const shiftedPosition = position.includes('-start') || position.includes('-end');
311
+
312
+ if (shiftedPosition && referenceElement) {
313
+ const { width, height } = referenceElement.getBoundingClientRect();
314
+
315
+ const size =
316
+ position.includes('left') || position.includes('right') ? height : width;
317
+
318
+ if (size >= MIN_ARROW_SHIFT_SIZE) {
319
+ setArrowShift(true);
320
+ }
321
+ }
322
+ }, [referenceElement, position]);
323
+
324
+ const renderContent = (computedZIndex: number) => (
325
+ <div
326
+ ref={mergeRefs([ref, popperRef, setPopperElement])}
327
+ style={{
328
+ zIndex: computedZIndex,
329
+ width: useAnchorWidth ? referenceElement?.offsetWidth : undefined,
330
+ ...popperStyles.popper,
331
+ ...(popperStyles.popper?.transform ? null : { visibility: 'hidden' }),
332
+ }}
333
+ data-test-id={dataTestId}
334
+ className={cn(styles.component, className, {
335
+ [styles.arrowShift]: arrowShift,
336
+ })}
337
+ {...attributes.popper}
338
+ >
339
+ <div className={cn(styles.inner, popperClassName)} ref={innerRef}>
340
+ <div className={cn({ [styles.scrollableContent]: availableHeight })}>
341
+ {children}
342
+ </div>
343
+
344
+ {withArrow && (
345
+ <div
346
+ ref={setArrowElement}
347
+ style={popperStyles.arrow}
348
+ className={cn(styles.arrow, arrowClassName)}
349
+ />
350
+ )}
351
+ </div>
352
+ </div>
353
+ );
354
+
355
+ return (
356
+ <Stack value={zIndex}>
357
+ {(computedZIndex) => (
358
+ <Portal getPortalContainer={getPortalContainer}>
359
+ {withTransition ? (
360
+ <CSSTransition
361
+ unmountOnExit={true}
362
+ classNames={CSS_TRANSITION_CLASS_NAMES}
363
+ nodeRef={popperRef}
364
+ {...transition}
365
+ in={open}
366
+ onEntering={(node: HTMLElement, isAppearing: boolean) => {
367
+ // Меняем transition-duration только в случае, если передано значение отличное от дефолтного.
368
+ if (
369
+ innerRef.current &&
370
+ transitionDuration !== `${DEFAULT_TRANSITION.timeout}ms`
371
+ ) {
372
+ innerRef.current.style.setProperty(
373
+ 'transition-duration',
374
+ transitionDuration,
375
+ );
376
+ }
377
+ transition?.onEntering?.(node, isAppearing);
378
+ }}
379
+ >
380
+ {renderContent(computedZIndex)}
381
+ </CSSTransition>
382
+ ) : (
383
+ open && renderContent(computedZIndex)
384
+ )}
385
+ </Portal>
386
+ )}
387
+ </Stack>
388
+ );
389
+ },
390
+ );
@@ -0,0 +1,147 @@
1
+ @import '@alfalab/core-components-themes/src/default.css';
2
+
3
+ :root {
4
+ --popover-border-color: transparent;
5
+ }
6
+
7
+ .component {
8
+ background-color: transparent;
9
+ color: var(--color-light-text-primary);
10
+ }
11
+
12
+ .inner {
13
+ position: relative;
14
+ background-color: var(--color-light-modal-bg-primary);
15
+ box-shadow: var(--shadow-m);
16
+ border: 1px solid var(--popover-border-color);
17
+ box-sizing: border-box;
18
+ will-change: transform;
19
+ }
20
+
21
+ .scrollableContent {
22
+ position: relative;
23
+ z-index: 2;
24
+ overflow-y: auto;
25
+ }
26
+
27
+ .arrow {
28
+ z-index: 1;
29
+ }
30
+
31
+ .arrow:after {
32
+ content: '';
33
+ display: block;
34
+ position: absolute;
35
+ width: 12px;
36
+ height: 12px;
37
+ background-color: var(--color-light-modal-bg-primary);
38
+ border: 1px solid var(--popover-border-color);
39
+ box-sizing: border-box;
40
+ transform: rotate(45deg);
41
+ }
42
+
43
+ .component[data-popper-placement='left'] .arrow,
44
+ .component[data-popper-placement='left-start'] .arrow,
45
+ .component[data-popper-placement='left-end'] .arrow {
46
+ right: 5px;
47
+
48
+ &:after {
49
+ top: -6px;
50
+ border-bottom: none;
51
+ border-left: none;
52
+ }
53
+ }
54
+
55
+ .component[data-popper-placement='left-start'].arrowShift .arrow:after {
56
+ top: -7px;
57
+ }
58
+
59
+ .component[data-popper-placement='left-end'].arrowShift .arrow:after {
60
+ top: -5px;
61
+ }
62
+
63
+ .component[data-popper-placement='right'] .arrow,
64
+ .component[data-popper-placement='right-start'] .arrow,
65
+ .component[data-popper-placement='right-end'] .arrow {
66
+ left: -7px;
67
+
68
+ &:after {
69
+ top: -6px;
70
+ border-top: none;
71
+ border-right: none;
72
+ }
73
+ }
74
+
75
+ .component[data-popper-placement='right-start'].arrowShift .arrow:after {
76
+ top: -7px;
77
+ }
78
+
79
+ .component[data-popper-placement='right-end'].arrowShift .arrow:after {
80
+ top: -5px;
81
+ }
82
+
83
+ .component[data-popper-placement='top'] .arrow,
84
+ .component[data-popper-placement='top-start'] .arrow,
85
+ .component[data-popper-placement='top-end'] .arrow {
86
+ bottom: 5px;
87
+
88
+ &:after {
89
+ left: -6px;
90
+ border-top: none;
91
+ border-left: none;
92
+ }
93
+ }
94
+
95
+ .component[data-popper-placement='top-start'].arrowShift .arrow:after {
96
+ left: -17px;
97
+ }
98
+
99
+ .component[data-popper-placement='top-end'].arrowShift .arrow:after {
100
+ left: 5px;
101
+ }
102
+
103
+ .component[data-popper-placement='bottom'] .arrow,
104
+ .component[data-popper-placement='bottom-start'] .arrow,
105
+ .component[data-popper-placement='bottom-end'] .arrow {
106
+ top: -7px;
107
+
108
+ &:after {
109
+ left: -6px;
110
+ border-bottom: none;
111
+ border-right: none;
112
+ }
113
+ }
114
+
115
+ .component[data-popper-placement='bottom-start'].arrowShift .arrow:after {
116
+ left: -17px;
117
+ }
118
+
119
+ .component[data-popper-placement='bottom-end'].arrowShift .arrow:after {
120
+ left: 5px;
121
+ }
122
+
123
+ .enter .inner {
124
+ opacity: 0;
125
+ transform: scale(0.98);
126
+ }
127
+
128
+ .enterActive .inner {
129
+ opacity: 1;
130
+ transform: scale(1);
131
+ transition-property: opacity, transform;
132
+ transition-timing-function: ease-in-out;
133
+ transition-duration: 150ms;
134
+ }
135
+
136
+ .exit .inner {
137
+ opacity: 1;
138
+ transform: scale(1);
139
+ }
140
+
141
+ .exitActive .inner {
142
+ opacity: 0;
143
+ transform: scale(0.98);
144
+ transition-property: opacity, transform;
145
+ transition-timing-function: ease-in-out;
146
+ transition-duration: 150ms;
147
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './Component';