@invoicebox/ui 0.1.0-alpha.294 → 0.1.0-alpha.295

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 (26) hide show
  1. package/dist/components/common/Drawer/index.d.ts +2 -2
  2. package/dist/components/common/Drawer/index.js +83 -15
  3. package/dist/components/common/Drawer/styles.d.ts +16 -694
  4. package/dist/components/common/Drawer/styles.js +51 -35
  5. package/dist/components/common/Dropdown/index.d.ts +2 -2
  6. package/dist/components/common/Dropdown/index.js +63 -13
  7. package/dist/components/common/Dropdown/styles.d.ts +2 -0
  8. package/dist/components/common/Dropdown/styles.js +17 -3
  9. package/dist/components/form/Autocomplete/components/Autocomplete/index.js +3 -1
  10. package/dist/components/form/CountrySelect/index.js +3 -1
  11. package/dist/components/form/DateInput/index.js +3 -1
  12. package/dist/components/form/DateTimeInput/index.js +3 -1
  13. package/dist/components/form/Select/index.js +3 -1
  14. package/dist/esm/components/common/Drawer/index.js +84 -16
  15. package/dist/esm/components/common/Drawer/styles.js +50 -34
  16. package/dist/esm/components/common/Dropdown/index.js +64 -14
  17. package/dist/esm/components/common/Dropdown/styles.js +16 -2
  18. package/dist/esm/components/form/Autocomplete/components/Autocomplete/index.js +3 -1
  19. package/dist/esm/components/form/CountrySelect/index.js +4 -2
  20. package/dist/esm/components/form/DateInput/index.js +3 -1
  21. package/dist/esm/components/form/DateTimeInput/index.js +3 -1
  22. package/dist/esm/components/form/Select/index.js +3 -1
  23. package/dist/esm/hooks/useOutsideClick/index.js +15 -4
  24. package/dist/hooks/useOutsideClick/index.d.ts +2 -2
  25. package/dist/hooks/useOutsideClick/index.js +14 -4
  26. package/package.json +2 -2
@@ -4,51 +4,67 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.Title = exports.StyledSheetContainer = exports.StyledSheetBackdrop = exports.DragIndicatorWrapper = exports.ChildrenWrapper = void 0;
7
+ exports.Title = exports.Sheet = exports.Root = exports.DragIndicator = exports.DragHandle = exports.ChildrenWrapper = exports.Backdrop = void 0;
8
8
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
9
- var _reactModalSheet = require("react-modal-sheet");
10
9
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
11
10
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
12
- var Title = exports.Title = _styledComponents["default"].div.withConfig({
13
- displayName: "styles__Title",
11
+ var Root = exports.Root = _styledComponents["default"].div.withConfig({
12
+ displayName: "styles__Root",
14
13
  componentId: "sc-1kysg49-0"
15
- })(["background-color:", ";padding:30px;position:relative;text-align:center;border-radius:10px 10px 0 0;"], function (_ref) {
16
- var $bg = _ref.$bg;
17
- return $bg;
18
- });
19
- var DragIndicatorWrapper = exports.DragIndicatorWrapper = _styledComponents["default"].div.withConfig({
20
- displayName: "styles__DragIndicatorWrapper",
14
+ })(["position:fixed;inset:0;z-index:1000;display:flex;align-items:flex-end;justify-content:center;"]);
15
+ var Backdrop = exports.Backdrop = _styledComponents["default"].div.withConfig({
16
+ displayName: "styles__Backdrop",
21
17
  componentId: "sc-1kysg49-1"
22
- })(["position:absolute;top:12px;left:50%;transform:translateX(-50%);"]);
23
- var ChildrenWrapper = exports.ChildrenWrapper = _styledComponents["default"].div.withConfig({
24
- displayName: "styles__ChildrenWrapper",
25
- componentId: "sc-1kysg49-2"
26
- })(["", ";background-color:", ";", ""], function (_ref2) {
27
- var $isPadding = _ref2.$isPadding;
28
- return $isPadding && 'padding: 32px 16px 36px';
29
- }, function (_ref3) {
30
- var $bgColor = _ref3.$bgColor;
18
+ })(["position:absolute;inset:0;background-color:", ";opacity:", ";transition:opacity 300ms ease;"], function (_ref) {
19
+ var $bgColor = _ref.$bgColor;
31
20
  return $bgColor;
21
+ }, function (_ref2) {
22
+ var $isVisible = _ref2.$isVisible;
23
+ return $isVisible ? 1 : 0;
24
+ });
25
+ var Sheet = exports.Sheet = _styledComponents["default"].div.withConfig({
26
+ displayName: "styles__Sheet",
27
+ componentId: "sc-1kysg49-2"
28
+ })(["position:relative;width:100%;max-height:90vh;display:flex;flex-direction:column;box-shadow:none;border-radius:10px 10px 0 0;will-change:transform;transition:transform 300ms cubic-bezier(0.32,0.72,0,1);", " ", " ", ""], function (_ref3) {
29
+ var $isDragging = _ref3.$isDragging;
30
+ return $isDragging && (0, _styledComponents.css)(["transition:none;"]);
32
31
  }, function (_ref4) {
33
- var $isBorderRadius = _ref4.$isBorderRadius;
34
- return $isBorderRadius && (0, _styledComponents.css)(["border-radius:10px 10px 0 0;"]);
32
+ var $isErrorBorder = _ref4.$isErrorBorder,
33
+ $errorColor = _ref4.$errorColor,
34
+ $borderColor = _ref4.$borderColor;
35
+ return ($isErrorBorder || $borderColor) && (0, _styledComponents.css)(["border-top:2px solid ", ";"], $borderColor || $errorColor);
36
+ }, function (_ref5) {
37
+ var $overflow = _ref5.$overflow;
38
+ return $overflow === 'visible' ? (0, _styledComponents.css)(["overflow:visible;"]) : (0, _styledComponents.css)(["overflow-y:auto;"]);
35
39
  });
36
- var StyledSheetContainer = exports.StyledSheetContainer = (0, _styledComponents["default"])(_reactModalSheet.Sheet.Container).withConfig({
37
- displayName: "styles__StyledSheetContainer",
40
+ var DragHandle = exports.DragHandle = _styledComponents["default"].div.withConfig({
41
+ displayName: "styles__DragHandle",
38
42
  componentId: "sc-1kysg49-3"
39
- })(["box-shadow:none;border-radius:10px 10px 0 0;", " ", ""], function (_ref5) {
40
- var $isErrorBorder = _ref5.$isErrorBorder,
41
- $errorColor = _ref5.$errorColor,
42
- $borderColor = _ref5.$borderColor;
43
- return ($isErrorBorder || $borderColor) && (0, _styledComponents.css)(["border-top:2px solid ", ";"], $borderColor || $errorColor);
44
- }, function (_ref6) {
45
- var $overflow = _ref6.$overflow;
46
- return $overflow === 'visible' && (0, _styledComponents.css)(["overflow:visible;.react-modal-sheet-content-scroller{overflow-y:visible !important;}"]);
43
+ })(["position:relative;flex:0 0 auto;height:28px;background-color:", ";border-radius:10px 10px 0 0;touch-action:none;cursor:grab;&:active{cursor:grabbing;}"], function (_ref6) {
44
+ var $bg = _ref6.$bg;
45
+ return $bg;
47
46
  });
48
- var StyledSheetBackdrop = exports.StyledSheetBackdrop = (0, _styledComponents["default"])(_reactModalSheet.Sheet.Backdrop).withConfig({
49
- displayName: "styles__StyledSheetBackdrop",
47
+ var DragIndicator = exports.DragIndicator = _styledComponents["default"].div.withConfig({
48
+ displayName: "styles__DragIndicator",
50
49
  componentId: "sc-1kysg49-4"
51
- })(["background-color:", " !important;"], function (_ref7) {
52
- var $bgColor = _ref7.$bgColor;
50
+ })(["position:absolute;top:12px;left:50%;transform:translateX(-50%);width:40px;height:4px;border-radius:99px;background-color:rgba(53,63,71,0.2);"]);
51
+ var Title = exports.Title = _styledComponents["default"].div.withConfig({
52
+ displayName: "styles__Title",
53
+ componentId: "sc-1kysg49-5"
54
+ })(["background-color:", ";padding:30px;position:relative;text-align:center;border-radius:10px 10px 0 0;"], function (_ref7) {
55
+ var $bg = _ref7.$bg;
56
+ return $bg;
57
+ });
58
+ var ChildrenWrapper = exports.ChildrenWrapper = _styledComponents["default"].div.withConfig({
59
+ displayName: "styles__ChildrenWrapper",
60
+ componentId: "sc-1kysg49-6"
61
+ })(["", ";background-color:", ";", ""], function (_ref8) {
62
+ var $isPadding = _ref8.$isPadding;
63
+ return $isPadding && 'padding: 32px 16px 36px';
64
+ }, function (_ref9) {
65
+ var $bgColor = _ref9.$bgColor;
53
66
  return $bgColor;
67
+ }, function (_ref10) {
68
+ var $isBorderRadius = _ref10.$isBorderRadius;
69
+ return $isBorderRadius && (0, _styledComponents.css)(["border-radius:10px 10px 0 0;"]);
54
70
  });
@@ -1,4 +1,4 @@
1
- import { FC, ReactNode } from 'react';
1
+ import React, { ReactNode } from 'react';
2
2
  export type TProps = {
3
3
  children: ReactNode;
4
4
  isOpen: boolean;
@@ -13,4 +13,4 @@ export type TProps = {
13
13
  isTopPosition?: boolean;
14
14
  usePadding?: boolean;
15
15
  };
16
- export declare const Dropdown: FC<TProps>;
16
+ export declare const Dropdown: React.ForwardRefExoticComponent<TProps & React.RefAttributes<HTMLDivElement>>;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.Dropdown = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
+ var _reactDom = require("react-dom");
9
10
  var S = _interopRequireWildcard(require("./styles"));
10
11
  var _palette = require("../../../palette");
11
12
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
@@ -16,7 +17,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
16
17
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
17
18
  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; } }
18
19
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
19
- var Dropdown = exports.Dropdown = function Dropdown(_ref) {
20
+ var Dropdown = exports.Dropdown = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, forwardedRef) {
20
21
  var children = _ref.children,
21
22
  isOpen = _ref.isOpen,
22
23
  _ref$isAutoPosition = _ref.isAutoPosition,
@@ -46,6 +47,42 @@ var Dropdown = exports.Dropdown = function Dropdown(_ref) {
46
47
  _useState2 = _slicedToArray(_useState, 2),
47
48
  elRef = _useState2[0],
48
49
  setElRef = _useState2[1];
50
+
51
+ // Якорь остаётся в потоке на месте поля-триггера; по его родителю (само поле) считаем,
52
+ // куда поставить вынесенный порталом дропдаун.
53
+ var anchorRef = (0, _react.useRef)(null);
54
+ var _useState3 = (0, _react.useState)(null),
55
+ _useState4 = _slicedToArray(_useState3, 2),
56
+ layerRect = _useState4[0],
57
+ setLayerRect = _useState4[1];
58
+
59
+ // Дропдаун вынесён в body порталом и спозиционирован `fixed` → НЕ растит документ (баг с
60
+ // пустой полосой внизу) и не зависит от `overflow`/`transform` предков. Слой-обёртка
61
+ // (`PositionLayer`) `fixed` точно над полем: внутренний `Wrapper` остаётся `absolute`
62
+ // относительно него, поэтому ВСЯ старая логика позиционирования (top/bottom/left/right/
63
+ // translateY) и измерения работают без изменений. Пересчёт на скролл/resize, пока открыт.
64
+ (0, _react.useLayoutEffect)(function () {
65
+ var updateRect = function updateRect() {
66
+ var _anchorRef$current;
67
+ var field = (_anchorRef$current = anchorRef.current) === null || _anchorRef$current === void 0 ? void 0 : _anchorRef$current.parentElement;
68
+ if (!field) return;
69
+ var rect = field.getBoundingClientRect();
70
+ setLayerRect({
71
+ top: rect.top,
72
+ left: rect.left,
73
+ width: rect.width,
74
+ height: rect.height
75
+ });
76
+ };
77
+ updateRect();
78
+ if (!isOpen) return undefined;
79
+ window.addEventListener('scroll', updateRect, true);
80
+ window.addEventListener('resize', updateRect);
81
+ return function () {
82
+ window.removeEventListener('scroll', updateRect, true);
83
+ window.removeEventListener('resize', updateRect);
84
+ };
85
+ }, [isOpen]);
49
86
  var handleCloseTransitionEnd = (0, _react.useCallback)(function (event) {
50
87
  if (event.propertyName !== 'opacity') return;
51
88
  if (isOpen) return;
@@ -68,18 +105,17 @@ var Dropdown = exports.Dropdown = function Dropdown(_ref) {
68
105
  };
69
106
  var isMoreSpaceBelowThanAbove = belowHeight >= aboveHeight;
70
107
  if (isMoreSpaceBelowThanAbove) {
71
- var outOfViewPortHeight = dropdownHeight + dropdownIndent - belowHeight;
108
+ var _outOfViewPortHeight = dropdownHeight + dropdownIndent - belowHeight;
72
109
  return {
73
110
  isAbove: false,
74
- translateY: "-".concat(outOfViewPortHeight, "px")
75
- };
76
- } else {
77
- var _outOfViewPortHeight = dropdownHeight + dropdownIndent - aboveHeight;
78
- return {
79
- isAbove: true,
80
- translateY: "".concat(_outOfViewPortHeight, "px")
111
+ translateY: "-".concat(_outOfViewPortHeight, "px")
81
112
  };
82
113
  }
114
+ var outOfViewPortHeight = dropdownHeight + dropdownIndent - aboveHeight;
115
+ return {
116
+ isAbove: true,
117
+ translateY: "".concat(outOfViewPortHeight, "px")
118
+ };
83
119
  }, []);
84
120
  var openFlagCache = (0, _react.useRef)(null);
85
121
  if (elRef) {
@@ -104,8 +140,21 @@ var Dropdown = exports.Dropdown = function Dropdown(_ref) {
104
140
  };
105
141
  }
106
142
  }
107
- return /*#__PURE__*/_react["default"].createElement(S.Wrapper, {
108
- ref: setElRef,
143
+ var setWrapperRef = (0, _react.useCallback)(function (node) {
144
+ setElRef(node);
145
+ if (typeof forwardedRef === 'function') forwardedRef(node);else if (forwardedRef) forwardedRef.current = node;
146
+ }, [forwardedRef]);
147
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(S.Anchor, {
148
+ ref: anchorRef
149
+ }), layerRect && /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react["default"].createElement(S.PositionLayer, {
150
+ style: {
151
+ top: layerRect.top,
152
+ left: layerRect.left,
153
+ width: layerRect.width,
154
+ height: layerRect.height
155
+ }
156
+ }, /*#__PURE__*/_react["default"].createElement(S.Wrapper, {
157
+ ref: setWrapperRef,
109
158
  $isVisible: isOpen,
110
159
  $isAbove: position.current.isAbove,
111
160
  $translateY: position.current.translateY,
@@ -118,5 +167,6 @@ var Dropdown = exports.Dropdown = function Dropdown(_ref) {
118
167
  onTransitionEnd: handleCloseTransitionEnd,
119
168
  $palette: palette,
120
169
  $usePadding: usePadding
121
- }, children);
122
- };
170
+ }, children)), document.body));
171
+ });
172
+ Dropdown.displayName = 'Dropdown';
@@ -1,5 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import { TDropdownPalette } from './palette';
3
+ export declare const Anchor: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, never>> & string;
4
+ export declare const PositionLayer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
3
5
  export declare const Wrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
4
6
  $isVisible: boolean;
5
7
  $isAbove: boolean;
@@ -4,16 +4,30 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.Wrapper = void 0;
7
+ exports.Wrapper = exports.PositionLayer = exports.Anchor = void 0;
8
8
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
9
9
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
10
10
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
11
+ // Невидимый якорь в потоке: по его родителю (поле-триггер) считаем позицию портал-дропдауна.
12
+ // display:none — не влияет на вёрстку, но parentElement (само поле) доступен для измерений.
13
+ var Anchor = exports.Anchor = _styledComponents["default"].span.withConfig({
14
+ displayName: "styles__Anchor",
15
+ componentId: "sc-1f1enhf-0"
16
+ })(["display:none;"]);
17
+
18
+ // Слой-обёртка дропдауна: вынесена порталом в body и спозиционирована fixed точно над полем
19
+ // (через inline top/left/width/height). pointer-events:none — сам слой не перехватывает клики
20
+ // (его площадь = полю), кликабелен только внутренний Wrapper.
21
+ var PositionLayer = exports.PositionLayer = _styledComponents["default"].div.withConfig({
22
+ displayName: "styles__PositionLayer",
23
+ componentId: "sc-1f1enhf-1"
24
+ })(["position:fixed;z-index:1000;pointer-events:none;"]);
11
25
  var hidden = (0, _styledComponents.css)(["visibility:hidden;opacity:0;transition:visibility 0ms 200ms,opacity 200ms 0ms ease;"]);
12
26
  var visible = (0, _styledComponents.css)(["visibility:visible;opacity:1;transition:visibility 0ms 0ms,opacity 200ms 0ms ease;"]);
13
27
  var Wrapper = exports.Wrapper = _styledComponents["default"].div.withConfig({
14
28
  displayName: "styles__Wrapper",
15
- componentId: "sc-1f1enhf-0"
16
- })(["padding:", ";overflow:hidden;border-radius:20px;box-shadow:0 4px 50px 0 ", ";background:", ";outline:1px solid ", ";min-width:", ";width:", ";position:absolute;left:", ";right:", ";z-index:", ";", ";", ";", ";"], function (_ref) {
29
+ componentId: "sc-1f1enhf-2"
30
+ })(["pointer-events:auto;padding:", ";overflow:hidden;border-radius:20px;box-shadow:0 4px 50px 0 ", ";background:", ";outline:1px solid ", ";min-width:", ";width:", ";position:absolute;left:", ";right:", ";z-index:", ";", ";", ";", ";"], function (_ref) {
17
31
  var $usePadding = _ref.$usePadding;
18
32
  return $usePadding ? '8px 0;' : 'none';
19
33
  }, function (_ref2) {
@@ -96,7 +96,8 @@ var Autocomplete = exports.Autocomplete = /*#__PURE__*/(0, _react.forwardRef)(fu
96
96
  setIsOpen(false);
97
97
  setActiveIndex(-1);
98
98
  }, []);
99
- var wrapperRef = (0, _useOutsideClick.useOutsideClick)(handleClose);
99
+ var dropdownRef = (0, _react.useRef)(null);
100
+ var wrapperRef = (0, _useOutsideClick.useOutsideClick)(handleClose, [dropdownRef]);
100
101
  var handleChange = (0, _react.useCallback)(function (event) {
101
102
  // Ввод нового запроса сбрасывает клавиатурную подсветку (результаты сменятся).
102
103
  setActiveIndex(-1);
@@ -232,6 +233,7 @@ var Autocomplete = exports.Autocomplete = /*#__PURE__*/(0, _react.forwardRef)(fu
232
233
  "aria-autocomplete": "list",
233
234
  "aria-activedescendant": isDropdownOpen && activeIndex >= 0 ? getOptionId(activeIndex) : undefined
234
235
  }, paddingOptions)))), /*#__PURE__*/_react["default"].createElement(_Dropdown.Dropdown, {
236
+ ref: dropdownRef,
235
237
  isOpen: isOpen && (!!options.length || !!isLoading),
236
238
  isAutoPosition: true,
237
239
  width: dropdownWidth || '100%',
@@ -66,7 +66,8 @@ var CountrySelect = exports.CountrySelect = function CountrySelect(_ref) {
66
66
  return !flag;
67
67
  });
68
68
  }, []);
69
- var wrapperRef = (0, _useOutsideClick.useOutsideClick)(handleDropdownClose);
69
+ var dropdownRef = (0, _react.useRef)(null);
70
+ var wrapperRef = (0, _useOutsideClick.useOutsideClick)(handleDropdownClose, [dropdownRef]);
70
71
  var sortedOptions = (0, _react.useMemo)(function () {
71
72
  return [selectedOption].concat(_toConsumableArray(options.filter(function (option) {
72
73
  return option !== selectedOption;
@@ -93,6 +94,7 @@ var CountrySelect = exports.CountrySelect = function CountrySelect(_ref) {
93
94
  }), !disabled && /*#__PURE__*/_react["default"].createElement(_Arrow.Arrow, {
94
95
  isOpen: isOpen
95
96
  })), /*#__PURE__*/_react["default"].createElement(_Dropdown.Dropdown, _extends({
97
+ ref: dropdownRef,
96
98
  isOpen: isOpen,
97
99
  onCloseTransitionEnd: handleClear,
98
100
  zIndex: 6,
@@ -63,7 +63,8 @@ var DateInput = exports.DateInput = function DateInput(_ref) {
63
63
  var handleClose = (0, _react.useCallback)(function () {
64
64
  return setOpenFlag(false);
65
65
  }, []);
66
- var elRef = (0, _useOutsideClick.useOutsideClick)(handleClose);
66
+ var dropdownRef = (0, _react.useRef)(null);
67
+ var elRef = (0, _useOutsideClick.useOutsideClick)(handleClose, [dropdownRef]);
67
68
  var _useInputFocus = (0, _useInputFocus2.useInputFocus)({
68
69
  onFocus: onFocus,
69
70
  onBlur: onBlur
@@ -169,6 +170,7 @@ var DateInput = exports.DateInput = function DateInput(_ref) {
169
170
  minDate: minDate,
170
171
  maxDate: maxDate
171
172
  }) : /*#__PURE__*/_react["default"].createElement(_Dropdown.Dropdown, _extends({
173
+ ref: dropdownRef,
172
174
  isOpen: isOpen,
173
175
  isAutoPosition: true
174
176
  }, dropdownProps), /*#__PURE__*/_react["default"].createElement(S.CalendarWrapper, null, /*#__PURE__*/_react["default"].createElement(_Calendar.Calendar, {
@@ -78,7 +78,8 @@ var DateTimeInput = exports.DateTimeInput = function DateTimeInput(_ref) {
78
78
  var handleTrigger = (0, _react.useCallback)(function () {
79
79
  return isOpen ? handleCloseAndSkipDropdownValue() : setOpenFlag(true);
80
80
  }, [handleCloseAndSkipDropdownValue, isOpen]);
81
- var elRef = (0, _useOutsideClick.useOutsideClick)(handleCloseAndSkipDropdownValue);
81
+ var dropdownRef = (0, _react.useRef)(null);
82
+ var elRef = (0, _useOutsideClick.useOutsideClick)(handleCloseAndSkipDropdownValue, [dropdownRef]);
82
83
  var _useTimePickerHeight = (0, _useTimePickerHeight2.useTimePickerHeight)(isOpen),
83
84
  calendarRef = _useTimePickerHeight.calendarRef,
84
85
  handleTimePickerSetHeight = _useTimePickerHeight.handleTimePickerSetHeight,
@@ -189,6 +190,7 @@ var DateTimeInput = exports.DateTimeInput = function DateTimeInput(_ref) {
189
190
  onClick: handleTrigger,
190
191
  $color: palette.icon
191
192
  }, /*#__PURE__*/_react["default"].createElement(_CalendarIcon.CalendarIcon, null)))), !isMobile ? /*#__PURE__*/_react["default"].createElement(_Dropdown.Dropdown, _extends({
193
+ ref: dropdownRef,
192
194
  isOpen: isOpen,
193
195
  isAutoPosition: true
194
196
  }, dropdownProps), /*#__PURE__*/_react["default"].createElement(S.CalendarWithTimePicker, {
@@ -95,7 +95,8 @@ var Select = exports.Select = function Select(_ref) {
95
95
  var handleHide = (0, _react.useCallback)(function () {
96
96
  return setIsOpen(false);
97
97
  }, []);
98
- var wrapperRef = (0, _useOutsideClick.useOutsideClick)(handleHide);
98
+ var dropdownRef = (0, _react.useRef)(null);
99
+ var wrapperRef = (0, _useOutsideClick.useOutsideClick)(handleHide, [dropdownRef]);
99
100
  var handleFocus = (0, _react.useCallback)(function (event) {
100
101
  handleShow();
101
102
  focusHandler(event);
@@ -244,6 +245,7 @@ var Select = exports.Select = function Select(_ref) {
244
245
  isOpen: isOpen,
245
246
  isPadding: false
246
247
  }, /*#__PURE__*/_react["default"].createElement(S.DrawerContent, null, handleDrawerContentRender())) : /*#__PURE__*/_react["default"].createElement(_Dropdown.Dropdown, {
248
+ ref: dropdownRef,
247
249
  isOpen: isOpen,
248
250
  isAutoPosition: true,
249
251
  width: dropdownWidth || '100%',
@@ -4,11 +4,12 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
4
4
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
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
6
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
- import React, { useEffect, useState } from 'react';
7
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
8
8
  import * as S from './styles';
9
9
  import { Typography } from '../Typography';
10
10
  import { useComponentPalette } from '../../../palette';
11
- import { Sheet } from 'react-modal-sheet';
11
+ var ANIMATION_MS = 300;
12
+ var DRAG_CLOSE_THRESHOLD = 80;
12
13
  export var Drawer = function Drawer(_ref) {
13
14
  var isOpen = _ref.isOpen,
14
15
  children = _ref.children,
@@ -25,32 +26,102 @@ export var Drawer = function Drawer(_ref) {
25
26
  _useState2 = _slicedToArray(_useState, 2),
26
27
  shouldRender = _useState2[0],
27
28
  setShouldRender = _useState2[1];
29
+ var _useState3 = useState(false),
30
+ _useState4 = _slicedToArray(_useState3, 2),
31
+ isEntered = _useState4[0],
32
+ setIsEntered = _useState4[1];
33
+ var _useState5 = useState(0),
34
+ _useState6 = _slicedToArray(_useState5, 2),
35
+ dragOffset = _useState6[0],
36
+ setDragOffset = _useState6[1];
37
+ var dragStartYRef = useRef(null);
38
+ var sheetRef = useRef(null);
28
39
 
29
- // delay for close drawer and unmount
40
+ // Монтируем при открытии, размонтируем после анимации закрытия (как раньше — задержка 300мс).
30
41
  useEffect(function () {
31
42
  if (isOpen) {
32
43
  setShouldRender(true);
33
44
  } else {
45
+ setIsEntered(false);
34
46
  var timer = setTimeout(function () {
35
47
  return setShouldRender(false);
36
- }, 300);
48
+ }, ANIMATION_MS);
37
49
  return function () {
38
50
  return clearTimeout(timer);
39
51
  };
40
52
  }
53
+ return undefined;
41
54
  }, [isOpen]);
55
+
56
+ // Запускаем enter-переход на кадр позже маунта: сначала лист за экраном (translateY 100%), затем 0.
57
+ useEffect(function () {
58
+ if (!shouldRender || !isOpen) return undefined;
59
+ var raf = requestAnimationFrame(function () {
60
+ return setIsEntered(true);
61
+ });
62
+ return function () {
63
+ return cancelAnimationFrame(raf);
64
+ };
65
+ }, [shouldRender, isOpen]);
66
+
67
+ // Блокируем скролл фона, пока боттомшит открыт (как делал react-modal-sheet).
68
+ useEffect(function () {
69
+ if (!shouldRender) return undefined;
70
+ var prev = document.body.style.overflow;
71
+ document.body.style.overflow = 'hidden';
72
+ return function () {
73
+ document.body.style.overflow = prev;
74
+ };
75
+ }, [shouldRender]);
76
+ var handleTransitionEnd = useCallback(function (event) {
77
+ if (event.target !== sheetRef.current || event.propertyName !== 'transform') return;
78
+ if (isOpen && isEntered && onOpenEnd) onOpenEnd();
79
+ }, [isOpen, isEntered, onOpenEnd]);
80
+ var handlePointerDown = useCallback(function (event) {
81
+ var _event$currentTarget$, _event$currentTarget;
82
+ dragStartYRef.current = event.clientY;
83
+ (_event$currentTarget$ = (_event$currentTarget = event.currentTarget).setPointerCapture) === null || _event$currentTarget$ === void 0 || _event$currentTarget$.call(_event$currentTarget, event.pointerId);
84
+ }, []);
85
+ var handlePointerMove = useCallback(function (event) {
86
+ if (dragStartYRef.current === null) return;
87
+ var delta = event.clientY - dragStartYRef.current;
88
+ setDragOffset(delta > 0 ? delta : 0);
89
+ }, []);
90
+ var handlePointerUp = useCallback(function () {
91
+ if (dragStartYRef.current === null) return;
92
+ var offset = dragOffset;
93
+ dragStartYRef.current = null;
94
+ setDragOffset(0);
95
+ if (offset > DRAG_CLOSE_THRESHOLD) onClose();
96
+ }, [dragOffset, onClose]);
42
97
  if (!shouldRender) return null;
43
- return /*#__PURE__*/React.createElement(Sheet, {
44
- detent: "content",
45
- isOpen: isOpen,
46
- onClose: onClose,
47
- onOpenEnd: onOpenEnd
48
- }, /*#__PURE__*/React.createElement(S.StyledSheetContainer, {
98
+ var isDragging = dragOffset > 0;
99
+ var translateY = !isEntered ? '100%' : "".concat(dragOffset, "px");
100
+ return /*#__PURE__*/React.createElement(S.Root, {
101
+ role: "dialog",
102
+ "aria-modal": "true"
103
+ }, /*#__PURE__*/React.createElement(S.Backdrop, {
104
+ $bgColor: palette.backdropBg,
105
+ $isVisible: isEntered,
106
+ onClick: onClose
107
+ }), /*#__PURE__*/React.createElement(S.Sheet, {
108
+ ref: sheetRef,
109
+ style: {
110
+ transform: "translateY(".concat(translateY, ")")
111
+ },
112
+ $isDragging: isDragging,
49
113
  $isErrorBorder: isErrorBorder,
50
114
  $errorColor: palette.error,
51
115
  $borderColor: borderColor,
52
- $overflow: overflow
53
- }, /*#__PURE__*/React.createElement(Sheet.Content, null, /*#__PURE__*/React.createElement(S.DragIndicatorWrapper, null, /*#__PURE__*/React.createElement(Sheet.DragIndicator, null)), title && /*#__PURE__*/React.createElement(S.Title, {
116
+ $overflow: overflow,
117
+ onTransitionEnd: handleTransitionEnd
118
+ }, /*#__PURE__*/React.createElement(S.DragHandle, {
119
+ $bg: title ? palette.titleBg : palette.bg,
120
+ onPointerDown: handlePointerDown,
121
+ onPointerMove: handlePointerMove,
122
+ onPointerUp: handlePointerUp,
123
+ onPointerCancel: handlePointerUp
124
+ }, /*#__PURE__*/React.createElement(S.DragIndicator, null)), title && /*#__PURE__*/React.createElement(S.Title, {
54
125
  $bg: palette.titleBg
55
126
  }, /*#__PURE__*/React.createElement(Typography, {
56
127
  variant: "headline4"
@@ -58,8 +129,5 @@ export var Drawer = function Drawer(_ref) {
58
129
  $isBorderRadius: !title,
59
130
  $bgColor: palette.bg,
60
131
  $isPadding: isPadding
61
- }, children))), /*#__PURE__*/React.createElement(S.StyledSheetBackdrop, {
62
- onTap: onClose,
63
- $bgColor: palette.backdropBg
64
- }));
132
+ }, children)));
65
133
  };
@@ -1,45 +1,61 @@
1
1
  import styled, { css } from 'styled-components';
2
- import { Sheet } from 'react-modal-sheet';
3
- export var Title = styled.div.withConfig({
4
- displayName: "styles__Title",
2
+ export var Root = styled.div.withConfig({
3
+ displayName: "styles__Root",
5
4
  componentId: "sc-1kysg49-0"
6
- })(["background-color:", ";padding:30px;position:relative;text-align:center;border-radius:10px 10px 0 0;"], function (_ref) {
7
- var $bg = _ref.$bg;
8
- return $bg;
9
- });
10
- export var DragIndicatorWrapper = styled.div.withConfig({
11
- displayName: "styles__DragIndicatorWrapper",
5
+ })(["position:fixed;inset:0;z-index:1000;display:flex;align-items:flex-end;justify-content:center;"]);
6
+ export var Backdrop = styled.div.withConfig({
7
+ displayName: "styles__Backdrop",
12
8
  componentId: "sc-1kysg49-1"
13
- })(["position:absolute;top:12px;left:50%;transform:translateX(-50%);"]);
14
- export var ChildrenWrapper = styled.div.withConfig({
15
- displayName: "styles__ChildrenWrapper",
16
- componentId: "sc-1kysg49-2"
17
- })(["", ";background-color:", ";", ""], function (_ref2) {
18
- var $isPadding = _ref2.$isPadding;
19
- return $isPadding && 'padding: 32px 16px 36px';
20
- }, function (_ref3) {
21
- var $bgColor = _ref3.$bgColor;
9
+ })(["position:absolute;inset:0;background-color:", ";opacity:", ";transition:opacity 300ms ease;"], function (_ref) {
10
+ var $bgColor = _ref.$bgColor;
22
11
  return $bgColor;
12
+ }, function (_ref2) {
13
+ var $isVisible = _ref2.$isVisible;
14
+ return $isVisible ? 1 : 0;
15
+ });
16
+ export var Sheet = styled.div.withConfig({
17
+ displayName: "styles__Sheet",
18
+ componentId: "sc-1kysg49-2"
19
+ })(["position:relative;width:100%;max-height:90vh;display:flex;flex-direction:column;box-shadow:none;border-radius:10px 10px 0 0;will-change:transform;transition:transform 300ms cubic-bezier(0.32,0.72,0,1);", " ", " ", ""], function (_ref3) {
20
+ var $isDragging = _ref3.$isDragging;
21
+ return $isDragging && css(["transition:none;"]);
23
22
  }, function (_ref4) {
24
- var $isBorderRadius = _ref4.$isBorderRadius;
25
- return $isBorderRadius && css(["border-radius:10px 10px 0 0;"]);
23
+ var $isErrorBorder = _ref4.$isErrorBorder,
24
+ $errorColor = _ref4.$errorColor,
25
+ $borderColor = _ref4.$borderColor;
26
+ return ($isErrorBorder || $borderColor) && css(["border-top:2px solid ", ";"], $borderColor || $errorColor);
27
+ }, function (_ref5) {
28
+ var $overflow = _ref5.$overflow;
29
+ return $overflow === 'visible' ? css(["overflow:visible;"]) : css(["overflow-y:auto;"]);
26
30
  });
27
- export var StyledSheetContainer = styled(Sheet.Container).withConfig({
28
- displayName: "styles__StyledSheetContainer",
31
+ export var DragHandle = styled.div.withConfig({
32
+ displayName: "styles__DragHandle",
29
33
  componentId: "sc-1kysg49-3"
30
- })(["box-shadow:none;border-radius:10px 10px 0 0;", " ", ""], function (_ref5) {
31
- var $isErrorBorder = _ref5.$isErrorBorder,
32
- $errorColor = _ref5.$errorColor,
33
- $borderColor = _ref5.$borderColor;
34
- return ($isErrorBorder || $borderColor) && css(["border-top:2px solid ", ";"], $borderColor || $errorColor);
35
- }, function (_ref6) {
36
- var $overflow = _ref6.$overflow;
37
- return $overflow === 'visible' && css(["overflow:visible;.react-modal-sheet-content-scroller{overflow-y:visible !important;}"]);
34
+ })(["position:relative;flex:0 0 auto;height:28px;background-color:", ";border-radius:10px 10px 0 0;touch-action:none;cursor:grab;&:active{cursor:grabbing;}"], function (_ref6) {
35
+ var $bg = _ref6.$bg;
36
+ return $bg;
38
37
  });
39
- export var StyledSheetBackdrop = styled(Sheet.Backdrop).withConfig({
40
- displayName: "styles__StyledSheetBackdrop",
38
+ export var DragIndicator = styled.div.withConfig({
39
+ displayName: "styles__DragIndicator",
41
40
  componentId: "sc-1kysg49-4"
42
- })(["background-color:", " !important;"], function (_ref7) {
43
- var $bgColor = _ref7.$bgColor;
41
+ })(["position:absolute;top:12px;left:50%;transform:translateX(-50%);width:40px;height:4px;border-radius:99px;background-color:rgba(53,63,71,0.2);"]);
42
+ export var Title = styled.div.withConfig({
43
+ displayName: "styles__Title",
44
+ componentId: "sc-1kysg49-5"
45
+ })(["background-color:", ";padding:30px;position:relative;text-align:center;border-radius:10px 10px 0 0;"], function (_ref7) {
46
+ var $bg = _ref7.$bg;
47
+ return $bg;
48
+ });
49
+ export var ChildrenWrapper = styled.div.withConfig({
50
+ displayName: "styles__ChildrenWrapper",
51
+ componentId: "sc-1kysg49-6"
52
+ })(["", ";background-color:", ";", ""], function (_ref8) {
53
+ var $isPadding = _ref8.$isPadding;
54
+ return $isPadding && 'padding: 32px 16px 36px';
55
+ }, function (_ref9) {
56
+ var $bgColor = _ref9.$bgColor;
44
57
  return $bgColor;
58
+ }, function (_ref10) {
59
+ var $isBorderRadius = _ref10.$isBorderRadius;
60
+ return $isBorderRadius && css(["border-radius:10px 10px 0 0;"]);
45
61
  });