@salutejs/plasma-new-hope 0.268.0-canary.1759.13370595563.0 → 0.268.1-dev.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. package/cjs/components/Popover/Popover.js +10 -2
  2. package/cjs/components/Popover/Popover.js.map +1 -1
  3. package/cjs/components/Popover/hooks/usePopoverOffset.js +48 -0
  4. package/cjs/components/Popover/hooks/usePopoverOffset.js.map +1 -0
  5. package/cjs/components/Tooltip/Tooltip.js +1 -1
  6. package/cjs/components/Tooltip/Tooltip.js.map +1 -1
  7. package/emotion/cjs/components/Popover/Popover.js +10 -2
  8. package/emotion/cjs/components/Popover/hooks/usePopoverOffset.js +51 -0
  9. package/emotion/cjs/components/Tooltip/Tooltip.js +2 -2
  10. package/emotion/cjs/examples/plasma_b2c/components/Popover/Popover.stories.tsx +27 -2
  11. package/emotion/es/components/Popover/Popover.js +10 -2
  12. package/emotion/es/components/Popover/hooks/usePopoverOffset.js +45 -0
  13. package/emotion/es/components/Tooltip/Tooltip.js +2 -2
  14. package/emotion/es/examples/plasma_b2c/components/Popover/Popover.stories.tsx +27 -2
  15. package/es/components/Popover/Popover.js +10 -2
  16. package/es/components/Popover/Popover.js.map +1 -1
  17. package/es/components/Popover/hooks/usePopoverOffset.js +44 -0
  18. package/es/components/Popover/hooks/usePopoverOffset.js.map +1 -0
  19. package/es/components/Tooltip/Tooltip.js +1 -1
  20. package/es/components/Tooltip/Tooltip.js.map +1 -1
  21. package/package.json +2 -2
  22. package/styled-components/cjs/components/Popover/Popover.js +10 -2
  23. package/styled-components/cjs/components/Popover/hooks/usePopoverOffset.js +51 -0
  24. package/styled-components/cjs/components/Tooltip/Tooltip.js +1 -1
  25. package/styled-components/cjs/examples/plasma_b2c/components/Popover/Popover.stories.tsx +27 -2
  26. package/styled-components/es/components/Popover/Popover.js +10 -2
  27. package/styled-components/es/components/Popover/hooks/usePopoverOffset.js +45 -0
  28. package/styled-components/es/components/Tooltip/Tooltip.js +1 -1
  29. package/styled-components/es/examples/plasma_b2c/components/Popover/Popover.stories.tsx +27 -2
  30. package/types/components/Popover/Popover.d.ts.map +1 -1
  31. package/types/components/Popover/hooks/usePopoverOffset.d.ts +9 -0
  32. package/types/components/Popover/hooks/usePopoverOffset.d.ts.map +1 -0
@@ -5,18 +5,40 @@ import type { StoryObj, Meta } from '@storybook/react';
5
5
 
6
6
  import { Button } from '../Button/Button';
7
7
  import { WithTheme } from '../../../_helpers';
8
+ import { IconDisclosureRight } from '../../../../components/_Icon';
9
+ import { IconButton } from '../IconButton/IconButton';
8
10
 
9
- import { Popover } from './Popover';
11
+ import { Popover, PopoverPlacement } from './Popover';
10
12
 
11
13
  import './style.css';
12
14
 
15
+ const placements: Array<PopoverPlacement> = [
16
+ 'top',
17
+ 'top-start',
18
+ 'top-end',
19
+
20
+ 'bottom',
21
+ 'bottom-start',
22
+ 'bottom-end',
23
+
24
+ 'left',
25
+ 'left-start',
26
+ 'left-end',
27
+
28
+ 'right',
29
+ 'right-start',
30
+ 'right-end',
31
+
32
+ 'auto',
33
+ ];
34
+
13
35
  const meta: Meta<typeof Popover> = {
14
36
  title: 'b2c/Overlay/Popover',
15
37
  decorators: [WithTheme],
16
38
  component: Popover,
17
39
  argTypes: {
18
40
  placement: {
19
- options: ['top', 'bottom', 'right', 'left', 'auto'],
41
+ options: placements,
20
42
  control: {
21
43
  type: 'select',
22
44
  },
@@ -116,5 +138,8 @@ const StoryDefault = (args: StoryPopoverProps) => {
116
138
  };
117
139
 
118
140
  export const Default: StoryObj<StoryPopoverProps> = {
141
+ args: {
142
+ placement: 'bottom-start',
143
+ },
119
144
  render: (args) => <StoryDefault {...args} />,
120
145
  };
@@ -23,6 +23,7 @@ import { Portal } from '../Portal';
23
23
  import { base as viewCSS } from './variations/_view/base';
24
24
  import { StyledArrow, StyledPopover, StyledRoot, StyledWrapper } from './Popover.styles';
25
25
  import { classes } from './Popover.tokens';
26
+ import { usePopoverOffset } from './hooks/usePopoverOffset';
26
27
  export var ESCAPE_KEYCODE = 27;
27
28
  export var POPOVER_PORTAL_ID = 'plasma-popover-root';
28
29
 
@@ -66,6 +67,7 @@ export var popoverRoot = function popoverRoot(Root) {
66
67
  var popoverRef = useRef(null);
67
68
  var handleRef = useForkRef(rootRef, outerRootRef);
68
69
  var portalRef = useRef(null);
70
+ var targetRef = useRef(null);
69
71
  var trapRef = useFocusTrap(innerIsOpen && isFocusTrapped);
70
72
  var popoverForkRef = useForkRef(popoverRef, trapRef);
71
73
  var _useState = useState(null),
@@ -84,6 +86,11 @@ export var popoverRoot = function popoverRoot(Root) {
84
86
  var isAuto = isAutoArray || placement.startsWith('auto');
85
87
  var openClass = innerIsOpen && shouldRender ? classes.open : undefined;
86
88
  var animatedClass = animated ? classes.animate : undefined;
89
+ var offsetInner = usePopoverOffset({
90
+ handleRef: targetRef,
91
+ placement: placement,
92
+ offsetOuter: offset
93
+ });
87
94
  var _usePopper = usePopper(rootRef.current, popoverRef.current, {
88
95
  // TODO: #1121
89
96
  // eslint-disable-next-line no-nested-ternary
@@ -96,7 +103,7 @@ export var popoverRoot = function popoverRoot(Root) {
96
103
  }, {
97
104
  name: 'offset',
98
105
  options: {
99
- offset: [offset[0], offset[1]]
106
+ offset: [offsetInner[0], offsetInner[1]]
100
107
  }
101
108
  }, {
102
109
  name: 'flip',
@@ -227,7 +234,8 @@ export var popoverRoot = function popoverRoot(Root) {
227
234
  }, /*#__PURE__*/React.createElement(StyledWrapper, {
228
235
  className: cx(classes.wrapper, ! /*#__PURE__*/isValidElement(target) && classes.targetAsRef),
229
236
  onMouseEnter: onMouseEnter,
230
- onMouseLeave: onMouseLeave
237
+ onMouseLeave: onMouseLeave,
238
+ ref: targetRef
231
239
  }, /*#__PURE__*/React.createElement(StyledRoot, {
232
240
  ref: handleRef,
233
241
  onClick: onClick,
@@ -0,0 +1,45 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import { useEffect, useState } from 'react';
8
+ var allowedPlacements = ['top-start', 'top-end', 'bottom-start', 'bottom-end', 'left-start', 'left-end', 'right-start', 'right-end'];
9
+ var widthThreshold = 28;
10
+ var offsetXStartThreshold = 17;
11
+ var offsetXEndThreshold = 19;
12
+ export var usePopoverOffset = function usePopoverOffset(_ref) {
13
+ var handleRef = _ref.handleRef,
14
+ placement = _ref.placement,
15
+ offsetOuter = _ref.offsetOuter;
16
+ var _useState = useState(offsetOuter),
17
+ _useState2 = _slicedToArray(_useState, 2),
18
+ offset = _useState2[0],
19
+ setOffset = _useState2[1];
20
+ useEffect(function () {
21
+ var refElement = handleRef.current;
22
+ if (!refElement || !allowedPlacements.includes(placement)) {
23
+ setOffset(offsetOuter);
24
+ return;
25
+ }
26
+ var _refElement$getBoundi = refElement.getBoundingClientRect(),
27
+ width = _refElement$getBoundi.width,
28
+ height = _refElement$getBoundi.height;
29
+ var isVertical = (placement === null || placement === void 0 ? void 0 : placement.startsWith('top')) || (placement === null || placement === void 0 ? void 0 : placement.startsWith('bottom'));
30
+ var isEnd = placement === null || placement === void 0 ? void 0 : placement.endsWith('end');
31
+ var isStart = placement === null || placement === void 0 ? void 0 : placement.endsWith('start');
32
+ var offsetX = offsetOuter[0];
33
+ var offsetY = offsetOuter[1];
34
+ if (isVertical) {
35
+ if ((isStart || isEnd) && width < widthThreshold) {
36
+ offsetX = isEnd ? offsetXStartThreshold - width / 2 + offsetOuter[0] : -offsetXStartThreshold + width / 2 - offsetOuter[0];
37
+ }
38
+ }
39
+ if (!isVertical && (isStart || isEnd) && height < widthThreshold) {
40
+ offsetX = isStart ? -offsetXEndThreshold + height / 2 : offsetXEndThreshold - height / 2;
41
+ }
42
+ setOffset([offsetX, offsetY]);
43
+ }, [handleRef, placement, offsetOuter]);
44
+ return offset;
45
+ };
@@ -42,7 +42,7 @@ export var tooltipRoot = function tooltipRoot(Root) {
42
42
  arrow = _ref.arrow,
43
43
  animated = _ref.animated,
44
44
  _ref$offset = _ref.offset,
45
- offset = _ref$offset === void 0 ? [0, 8] : _ref$offset,
45
+ offset = _ref$offset === void 0 ? [3, 8] : _ref$offset,
46
46
  minWidth = _ref.minWidth,
47
47
  maxWidth = _ref.maxWidth,
48
48
  _ref$placement = _ref.placement,
@@ -5,18 +5,40 @@ import type { StoryObj, Meta } from '@storybook/react';
5
5
 
6
6
  import { Button } from '../Button/Button';
7
7
  import { WithTheme } from '../../../_helpers';
8
+ import { IconDisclosureRight } from '../../../../components/_Icon';
9
+ import { IconButton } from '../IconButton/IconButton';
8
10
 
9
- import { Popover } from './Popover';
11
+ import { Popover, PopoverPlacement } from './Popover';
10
12
 
11
13
  import './style.css';
12
14
 
15
+ const placements: Array<PopoverPlacement> = [
16
+ 'top',
17
+ 'top-start',
18
+ 'top-end',
19
+
20
+ 'bottom',
21
+ 'bottom-start',
22
+ 'bottom-end',
23
+
24
+ 'left',
25
+ 'left-start',
26
+ 'left-end',
27
+
28
+ 'right',
29
+ 'right-start',
30
+ 'right-end',
31
+
32
+ 'auto',
33
+ ];
34
+
13
35
  const meta: Meta<typeof Popover> = {
14
36
  title: 'b2c/Overlay/Popover',
15
37
  decorators: [WithTheme],
16
38
  component: Popover,
17
39
  argTypes: {
18
40
  placement: {
19
- options: ['top', 'bottom', 'right', 'left', 'auto'],
41
+ options: placements,
20
42
  control: {
21
43
  type: 'select',
22
44
  },
@@ -116,5 +138,8 @@ const StoryDefault = (args: StoryPopoverProps) => {
116
138
  };
117
139
 
118
140
  export const Default: StoryObj<StoryPopoverProps> = {
141
+ args: {
142
+ placement: 'bottom-start',
143
+ },
119
144
  render: (args) => <StoryDefault {...args} />,
120
145
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../../src/components/Popover/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+E,MAAM,OAAO,CAAC;AAIpG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAMrD,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAItE,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,WAAW,SAAU,UAAU,cAAc,EAAE,YAAY,CAAC,+JAgRpE,CAAC;AAEN,eAAO,MAAM,aAAa;;;mBAlRQ,UAAU,cAAc,EAAE,YAAY,CAAC;;;;;;;;;;CA+RxE,CAAC"}
1
+ {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../../src/components/Popover/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+E,MAAM,OAAO,CAAC;AAIpG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAMrD,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKtE,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,WAAW,SAAU,UAAU,cAAc,EAAE,YAAY,CAAC,+JAwRpE,CAAC;AAEN,eAAO,MAAM,aAAa;;;mBA1RQ,UAAU,cAAc,EAAE,YAAY,CAAC;;;;;;;;;;CAuSxE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ interface UsePopoverOffsetOptions {
3
+ handleRef: React.RefObject<HTMLDivElement>;
4
+ placement?: string;
5
+ offsetOuter: [number, number];
6
+ }
7
+ export declare const usePopoverOffset: ({ handleRef, placement, offsetOuter }: UsePopoverOffsetOptions) => [number, number];
8
+ export {};
9
+ //# sourceMappingURL=usePopoverOffset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePopoverOffset.d.ts","sourceRoot":"","sources":["../../../../src/components/Popover/hooks/usePopoverOffset.ts"],"names":[],"mappings":";AAmBA,UAAU,uBAAuB;IAC7B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,gBAAgB,0CAA2C,uBAAuB,KAAG,CAAC,MAAM,EAAE,MAAM,CAoChH,CAAC"}