@invoicebox/ui 0.1.0-alpha.320 → 0.1.0-alpha.322

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 (175) hide show
  1. package/dist/components/common/AppCardLink/index.js +2 -1
  2. package/dist/components/common/BgCard/index.js +2 -1
  3. package/dist/components/common/BgCard/styles.js +2 -1
  4. package/dist/components/common/Calendar/index.js +2 -1
  5. package/dist/components/common/Calendar/index.stories.js +2 -1
  6. package/dist/components/common/Calendar/styles.js +2 -1
  7. package/dist/components/common/Divider/index.js +2 -1
  8. package/dist/components/common/Drawer/index.js +2 -1
  9. package/dist/components/common/Drawer/index.stories.js +2 -1
  10. package/dist/components/common/Drawer/styles.js +2 -1
  11. package/dist/components/common/Dropdown/index.js +2 -1
  12. package/dist/components/common/Dropdown/styles.js +9 -8
  13. package/dist/components/common/EntityAutocompleteOptionsDrawer/index.js +2 -1
  14. package/dist/components/common/EntityAutocompleteOptionsDrawer/index.stories.js +2 -1
  15. package/dist/components/common/Flag/index.js +2 -1
  16. package/dist/components/common/Flag/styles.js +2 -1
  17. package/dist/components/common/InvoiceboxSpinner/index.js +2 -1
  18. package/dist/components/common/InvoiceboxSpinner/styles.js +2 -1
  19. package/dist/components/common/PointsLoader/index.js +2 -1
  20. package/dist/components/common/QRCode/index.js +2 -2
  21. package/dist/components/common/ReadOnlyLabelValueField/index.js +2 -1
  22. package/dist/components/common/Scrollbar/index.js +2 -1
  23. package/dist/components/common/Scrollbar/styles.js +2 -1
  24. package/dist/components/common/SecondaryButton/index.js +4 -3
  25. package/dist/components/common/SecondaryButton/styles.js +2 -1
  26. package/dist/components/common/Skeleton/index.js +2 -1
  27. package/dist/components/common/Skeleton/styles.js +2 -1
  28. package/dist/components/common/Toast/index.js +2 -1
  29. package/dist/components/common/Tooltip/index.js +2 -1
  30. package/dist/components/common/Typography/index.js +4 -3
  31. package/dist/components/common/WarningIcon/index.js +2 -1
  32. package/dist/components/form/Autocomplete/components/Autocomplete/index.js +2 -1
  33. package/dist/components/form/Autocomplete/components/Autocomplete/index.stories.js +2 -1
  34. package/dist/components/form/Autocomplete/components/OrganizationAutocompleteItem/index.js +2 -1
  35. package/dist/components/form/Checkbox/index.js +4 -3
  36. package/dist/components/form/Checkbox/index.stories.js +2 -1
  37. package/dist/components/form/CodeInput/index.js +2 -1
  38. package/dist/components/form/CodeInput/index.stories.js +2 -1
  39. package/dist/components/form/CountrySelect/components/CountryItem/index.d.ts +2 -1
  40. package/dist/components/form/CountrySelect/components/CountryItem/index.js +10 -4
  41. package/dist/components/form/CountrySelect/components/CountryItem/stlyes.d.ts +4 -0
  42. package/dist/components/form/CountrySelect/components/CountryItem/stlyes.js +18 -7
  43. package/dist/components/form/CountrySelect/index.d.ts +1 -0
  44. package/dist/components/form/CountrySelect/index.js +5 -3
  45. package/dist/components/form/CurrencyInput/CoreCurrencyInput/index.js +2 -1
  46. package/dist/components/form/CurrencyInput/CoreCurrencyInput/index.stories.js +2 -1
  47. package/dist/components/form/CurrencyInput/CurrencyInputNumber/index.js +2 -2
  48. package/dist/components/form/CurrencyInput/CurrencyInputNumber/index.stories.js +2 -1
  49. package/dist/components/form/CurrencyInput/CurrencyInputString/index.js +2 -2
  50. package/dist/components/form/CurrencyInput/CurrencyInputString/index.stories.js +2 -1
  51. package/dist/components/form/DateInput/components/CalendarIcon/index.js +2 -1
  52. package/dist/components/form/DateInput/components/MobileDrawerDateCalendar/index.js +2 -1
  53. package/dist/components/form/DateInput/components/MobileDrawerDateCalendar/index.stories.js +2 -1
  54. package/dist/components/form/DateInput/index.js +2 -1
  55. package/dist/components/form/DateInput/index.stories.js +2 -1
  56. package/dist/components/form/DateInput/logic.d.ts +1 -0
  57. package/dist/components/form/DateInput/logic.js +11 -0
  58. package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.d.ts +12 -0
  59. package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.js +83 -0
  60. package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.stories.d.ts +6 -0
  61. package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.stories.js +48 -0
  62. package/dist/components/form/DateTimeInput/components/MobileDatePicker/logic.d.ts +11 -0
  63. package/dist/components/form/DateTimeInput/components/MobileDatePicker/logic.js +92 -0
  64. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.d.ts +4 -0
  65. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.js +42 -22
  66. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.stories.js +2 -1
  67. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.d.ts +1 -2
  68. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.js +4 -8
  69. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.d.ts +14 -0
  70. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.js +259 -0
  71. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.d.ts +12 -0
  72. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.js +35 -0
  73. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/constants.d.ts +11 -0
  74. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/constants.js +40 -0
  75. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.d.ts +12 -0
  76. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.js +48 -0
  77. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.d.ts +5 -0
  78. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.js +47 -0
  79. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/palette.d.ts +9 -0
  80. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/palette.js +17 -0
  81. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/styles.d.ts +12 -0
  82. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/styles.js +39 -0
  83. package/dist/components/form/DateTimeInput/components/TimePicker/index.d.ts +1 -0
  84. package/dist/components/form/DateTimeInput/components/TimePicker/index.js +34 -16
  85. package/dist/components/form/DateTimeInput/components/TimePicker/index.stories.d.ts +1 -0
  86. package/dist/components/form/DateTimeInput/components/TimePicker/index.stories.js +31 -17
  87. package/dist/components/form/DateTimeInput/components/TimePicker/styles.d.ts +0 -4
  88. package/dist/components/form/DateTimeInput/components/TimePicker/styles.js +2 -13
  89. package/dist/components/form/DateTimeInput/index.js +22 -4
  90. package/dist/components/form/DateTimeInput/index.stories.js +2 -1
  91. package/dist/components/form/InputLabel/index.js +2 -1
  92. package/dist/components/form/InputLabel/styles.js +2 -1
  93. package/dist/components/form/ModernPlaceholder/index.js +2 -1
  94. package/dist/components/form/PhoneInput/index.d.ts +1 -0
  95. package/dist/components/form/PhoneInput/index.js +2 -1
  96. package/dist/components/form/PhoneInput/index.stories.js +4 -2
  97. package/dist/components/form/PhoneInput/phoneInputLogic.d.ts +2 -0
  98. package/dist/components/form/PhoneInput/types.d.ts +1 -0
  99. package/dist/components/form/PositiveIntegerInput/index.js +2 -1
  100. package/dist/components/form/PositiveIntegerInput/index.stories.js +2 -1
  101. package/dist/components/form/PositiveIntegerInput/styles.js +2 -1
  102. package/dist/components/form/PureInput/index.js +4 -3
  103. package/dist/components/form/PureInput/styles.js +2 -2
  104. package/dist/components/form/ResetButton/index.js +2 -1
  105. package/dist/components/form/SearchInput/index.js +2 -1
  106. package/dist/components/form/SearchInput/index.stories.js +2 -1
  107. package/dist/components/form/Select/components/Input/index.js +2 -1
  108. package/dist/components/form/Select/components/Loader/index.js +2 -1
  109. package/dist/components/form/Select/components/MultipleValue/index.js +2 -1
  110. package/dist/components/form/Select/components/MultipleValue/styles.js +2 -1
  111. package/dist/components/form/Select/index.js +2 -1
  112. package/dist/components/form/Select/index.stories.js +2 -1
  113. package/dist/components/form/Select/styles.js +2 -1
  114. package/dist/components/form/TagsInput/index.js +2 -1
  115. package/dist/components/form/TagsInput/index.stories.js +2 -1
  116. package/dist/components/form/TagsInput/styles.js +2 -2
  117. package/dist/components/form/TextInput/index.js +2 -1
  118. package/dist/components/form/TextInput/index.stories.js +2 -1
  119. package/dist/components/form/Toggle/index.js +4 -3
  120. package/dist/components/form/Toggle/index.stories.js +2 -1
  121. package/dist/components/form/Toggle/styles.js +10 -10
  122. package/dist/components/form/_hooks/useInputStyles.js +2 -1
  123. package/dist/components/form/common/DrawerHeader/index.d.ts +2 -0
  124. package/dist/components/form/common/DrawerHeader/index.js +15 -5
  125. package/dist/components/form/common/DrawerHeader/styles.d.ts +4 -0
  126. package/dist/components/form/common/DrawerHeader/styles.js +17 -7
  127. package/dist/esm/components/common/Dropdown/styles.js +7 -7
  128. package/dist/esm/components/common/QRCode/index.js +2 -2
  129. package/dist/esm/components/common/SecondaryButton/index.js +2 -2
  130. package/dist/esm/components/common/Typography/index.js +2 -2
  131. package/dist/esm/components/form/Checkbox/index.js +2 -2
  132. package/dist/esm/components/form/CountrySelect/components/CountryItem/index.js +8 -3
  133. package/dist/esm/components/form/CountrySelect/components/CountryItem/stlyes.js +17 -6
  134. package/dist/esm/components/form/CountrySelect/index.js +3 -2
  135. package/dist/esm/components/form/CurrencyInput/CurrencyInputNumber/index.js +2 -2
  136. package/dist/esm/components/form/CurrencyInput/CurrencyInputString/index.js +2 -2
  137. package/dist/esm/components/form/DateInput/logic.js +11 -0
  138. package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/index.js +74 -0
  139. package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/index.stories.js +39 -0
  140. package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/logic.js +86 -0
  141. package/dist/esm/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.js +40 -21
  142. package/dist/esm/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.js +3 -7
  143. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.js +250 -0
  144. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.js +28 -0
  145. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/constants.js +34 -0
  146. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/index.js +32 -0
  147. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.js +38 -0
  148. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/palette.js +10 -0
  149. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/styles.js +32 -0
  150. package/dist/esm/components/form/DateTimeInput/components/TimePicker/index.js +32 -15
  151. package/dist/esm/components/form/DateTimeInput/components/TimePicker/index.stories.js +29 -15
  152. package/dist/esm/components/form/DateTimeInput/components/TimePicker/styles.js +1 -12
  153. package/dist/esm/components/form/DateTimeInput/index.js +21 -4
  154. package/dist/esm/components/form/PhoneInput/index.stories.js +2 -1
  155. package/dist/esm/components/form/PureInput/index.js +2 -2
  156. package/dist/esm/components/form/PureInput/styles.js +2 -2
  157. package/dist/esm/components/form/TagsInput/styles.js +2 -2
  158. package/dist/esm/components/form/Toggle/index.js +2 -2
  159. package/dist/esm/components/form/Toggle/styles.js +10 -10
  160. package/dist/esm/components/form/common/DrawerHeader/index.js +13 -4
  161. package/dist/esm/components/form/common/DrawerHeader/styles.js +16 -6
  162. package/dist/esm/palette/context.js +2 -0
  163. package/dist/esm/palette/provider.js +2 -0
  164. package/dist/hooks/useUnupdatableHandler/index.stories.js +2 -1
  165. package/dist/palette/context.d.ts +2 -0
  166. package/dist/palette/context.js +48 -46
  167. package/dist/palette/provider.js +50 -47
  168. package/dist/palette/usePalette.d.ts +1 -0
  169. package/package.json +1 -1
  170. package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/index.d.ts +0 -8
  171. package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/index.js +0 -201
  172. package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/styles.d.ts +0 -7
  173. package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/styles.js +0 -27
  174. package/dist/esm/components/form/DateTimeInput/components/MobileNumbersColumn/index.js +0 -193
  175. package/dist/esm/components/form/DateTimeInput/components/MobileNumbersColumn/styles.js +0 -19
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.datePickerLogic = exports.MONTHS = void 0;
7
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
8
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
9
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
10
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
11
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
12
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
+ // Родительный падеж — барабан читается как одна строка: «20 июня 1986».
14
+ var MONTHS = exports.MONTHS = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
15
+
16
+ // Диапазон лет по умолчанию, когда minDate/maxDate не заданы.
17
+ var YEARS_BACK = 100;
18
+ var YEARS_FORWARD = 100;
19
+ var clampNumber = function clampNumber(value, min, max) {
20
+ return Math.min(Math.max(value, min), max);
21
+ };
22
+ var range = function range(from, to) {
23
+ return to < from ? [from] : new Array(to - from + 1).fill(0).map(function (item, index) {
24
+ return from + index;
25
+ });
26
+ };
27
+ var DatePickerLogic = /*#__PURE__*/function () {
28
+ function DatePickerLogic() {
29
+ _classCallCheck(this, DatePickerLogic);
30
+ }
31
+ return _createClass(DatePickerLogic, [{
32
+ key: "getDaysInMonth",
33
+ value: function getDaysInMonth(year, month) {
34
+ // Нулевой день следующего месяца — последний день текущего.
35
+ return new Date(year, month + 1, 0).getDate();
36
+ }
37
+ }, {
38
+ key: "getYearOptions",
39
+ value: function getYearOptions(minDate, maxDate) {
40
+ var currentYear = new Date().getFullYear();
41
+ var from = minDate ? minDate.getFullYear() : currentYear - YEARS_BACK;
42
+ var to = maxDate ? maxDate.getFullYear() : currentYear + YEARS_FORWARD;
43
+ return range(from, to).map(function (year) {
44
+ return {
45
+ value: year,
46
+ label: year.toString()
47
+ };
48
+ });
49
+ }
50
+ }, {
51
+ key: "getMonthOptions",
52
+ value: function getMonthOptions(year, minDate, maxDate) {
53
+ var from = minDate && year === minDate.getFullYear() ? minDate.getMonth() : 0;
54
+ var to = maxDate && year === maxDate.getFullYear() ? maxDate.getMonth() : 11;
55
+ return range(from, to).map(function (month) {
56
+ return {
57
+ value: month,
58
+ label: MONTHS[month]
59
+ };
60
+ });
61
+ }
62
+ }, {
63
+ key: "getDayOptions",
64
+ value: function getDayOptions(year, month, minDate, maxDate) {
65
+ var isMinMonth = !!minDate && year === minDate.getFullYear() && month === minDate.getMonth();
66
+ var isMaxMonth = !!maxDate && year === maxDate.getFullYear() && month === maxDate.getMonth();
67
+ var from = isMinMonth && minDate ? minDate.getDate() : 1;
68
+ var to = isMaxMonth && maxDate ? maxDate.getDate() : this.getDaysInMonth(year, month);
69
+ return range(from, to).map(function (day) {
70
+ return {
71
+ value: day,
72
+ label: day.toString()
73
+ };
74
+ });
75
+ }
76
+
77
+ // Приводит произвольную комбинацию колонок к дате внутри minDate/maxDate:
78
+ // сначала год, затем месяц (он зависит от года), затем день (зависит от обоих).
79
+ }, {
80
+ key: "clampDate",
81
+ value: function clampDate(year, month, day, minDate, maxDate) {
82
+ var yearOptions = this.getYearOptions(minDate, maxDate);
83
+ var safeYear = clampNumber(year, yearOptions[0].value, yearOptions[yearOptions.length - 1].value);
84
+ var monthOptions = this.getMonthOptions(safeYear, minDate, maxDate);
85
+ var safeMonth = clampNumber(month, monthOptions[0].value, monthOptions[monthOptions.length - 1].value);
86
+ var dayOptions = this.getDayOptions(safeYear, safeMonth, minDate, maxDate);
87
+ var safeDay = clampNumber(day, dayOptions[0].value, dayOptions[dayOptions.length - 1].value);
88
+ return new Date(safeYear, safeMonth, safeDay);
89
+ }
90
+ }]);
91
+ }();
92
+ var datePickerLogic = exports.datePickerLogic = new DatePickerLogic();
@@ -11,4 +11,8 @@ export type TProps = Pick<TCalendarProps, 'maxDate' | 'minDate'> & {
11
11
  minTime?: [number, number];
12
12
  maxTime?: [number, number];
13
13
  };
14
+ /**
15
+ * Ввод даты и времени барабанами, как в системных пикерах: сначала шаг с датой,
16
+ * затем шаг со временем. «Отмена» закрывает шторку целиком, правая кнопка ведёт вперёд.
17
+ */
14
18
  export declare const MobileDrawerDateTimeCalendar: FC<TProps>;
@@ -8,33 +8,51 @@ exports.MobileDrawerDateTimeCalendar = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _Drawer = require("../../../../common/Drawer");
10
10
  var S = _interopRequireWildcard(require("./styles"));
11
- var _Calendar = require("../../../../common/Calendar");
12
11
  var _TimePicker = require("../TimePicker");
12
+ var _MobileDatePicker = require("../MobileDatePicker");
13
13
  var _logic = require("../../../DateInput/logic");
14
14
  var _DrawerHeader = require("../../../common/DrawerHeader");
15
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
15
+ 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
+ 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; }
16
17
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
17
18
  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."); }
18
19
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
19
20
  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; }
20
21
  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; } }
21
22
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
22
- var MobileDrawerDateTimeCalendar = exports.MobileDrawerDateTimeCalendar = function MobileDrawerDateTimeCalendar(_ref) {
23
- var isOpen = _ref.isOpen,
24
- onClose = _ref.onClose,
25
- maxDate = _ref.maxDate,
26
- minDate = _ref.minDate,
27
- onCalendarChange = _ref.onCalendarChange,
28
- calendarDropdownValue = _ref.calendarDropdownValue,
29
- afterSubmit = _ref.afterSubmit,
30
- onSubmit = _ref.onSubmit,
31
- onTimeChange = _ref.onTimeChange,
32
- maxTime = _ref.maxTime,
33
- minTime = _ref.minTime;
23
+ // Барабан времени должен открываться на допустимом значении: иначе после выбора даты
24
+ // «Готово» остаётся недоступным, пока пользователь вручную не прокрутит часы.
25
+ var clampTime = function clampTime(_ref, minTime, maxTime) {
26
+ var _ref2 = _slicedToArray(_ref, 2),
27
+ hour = _ref2[0],
28
+ minute = _ref2[1];
29
+ if (minTime && (hour < minTime[0] || hour === minTime[0] && minute < minTime[1])) return minTime;
30
+ if (maxTime && (hour > maxTime[0] || hour === maxTime[0] && minute > maxTime[1])) return maxTime;
31
+ return [hour, minute];
32
+ };
33
+
34
+ /**
35
+ * Ввод даты и времени барабанами, как в системных пикерах: сначала шаг с датой,
36
+ * затем шаг со временем. «Отмена» закрывает шторку целиком, правая кнопка ведёт вперёд.
37
+ */
38
+ var MobileDrawerDateTimeCalendar = exports.MobileDrawerDateTimeCalendar = function MobileDrawerDateTimeCalendar(_ref3) {
39
+ var isOpen = _ref3.isOpen,
40
+ onClose = _ref3.onClose,
41
+ maxDate = _ref3.maxDate,
42
+ minDate = _ref3.minDate,
43
+ onCalendarChange = _ref3.onCalendarChange,
44
+ calendarDropdownValue = _ref3.calendarDropdownValue,
45
+ afterSubmit = _ref3.afterSubmit,
46
+ onSubmit = _ref3.onSubmit,
47
+ onTimeChange = _ref3.onTimeChange,
48
+ maxTime = _ref3.maxTime,
49
+ minTime = _ref3.minTime;
34
50
  var _useState = (0, _react.useState)(true),
35
51
  _useState2 = _slicedToArray(_useState, 2),
36
52
  isDateStep = _useState2[0],
37
53
  setIsDateStep = _useState2[1];
54
+ var currentHour = (calendarDropdownValue === null || calendarDropdownValue === void 0 ? void 0 : calendarDropdownValue.getHours()) || 0;
55
+ var currentMinute = (calendarDropdownValue === null || calendarDropdownValue === void 0 ? void 0 : calendarDropdownValue.getMinutes()) || 0;
38
56
  var handleClose = function handleClose() {
39
57
  onClose();
40
58
  setIsDateStep(true);
@@ -42,14 +60,14 @@ var MobileDrawerDateTimeCalendar = exports.MobileDrawerDateTimeCalendar = functi
42
60
  var handleDone = function handleDone() {
43
61
  if (isDateStep) {
44
62
  setIsDateStep(false);
63
+ var safeTime = clampTime([currentHour, currentMinute], minTime, maxTime);
64
+ if (safeTime[0] !== currentHour || safeTime[1] !== currentMinute) onTimeChange(safeTime);
45
65
  } else {
46
66
  onSubmit();
47
67
  afterSubmit();
48
68
  setIsDateStep(true);
49
69
  }
50
70
  };
51
- var currentHour = (calendarDropdownValue === null || calendarDropdownValue === void 0 ? void 0 : calendarDropdownValue.getHours()) || 0;
52
- var currentMinute = (calendarDropdownValue === null || calendarDropdownValue === void 0 ? void 0 : calendarDropdownValue.getMinutes()) || 0;
53
71
  return /*#__PURE__*/_react["default"].createElement(_Drawer.Drawer, {
54
72
  onClose: handleClose,
55
73
  isOpen: isOpen,
@@ -57,15 +75,17 @@ var MobileDrawerDateTimeCalendar = exports.MobileDrawerDateTimeCalendar = functi
57
75
  }, /*#__PURE__*/_react["default"].createElement(_DrawerHeader.DrawerHeader, {
58
76
  onClose: handleClose,
59
77
  onSubmit: handleDone,
60
- label: isDateStep ? 'Выберите дату' : 'Выберите время',
61
- isSubmitDisabled: isDateStep ? !calendarDropdownValue : !calendarDropdownValue || !_logic.logic.isBetweenMinAndMax(calendarDropdownValue, minDate, maxDate)
62
- }), isDateStep ? /*#__PURE__*/_react["default"].createElement(S.MobileCalendarWrapper, null, /*#__PURE__*/_react["default"].createElement(_Calendar.Calendar, {
78
+ closeLabel: 'Отмена',
79
+ submitLabel: isDateStep ? 'Далее' : 'Готово',
80
+ label: isDateStep ? 'Дата' : 'Время',
81
+ isSubmitDisabled: !calendarDropdownValue || !isDateStep && !_logic.logic.isBetweenMinAndMax(calendarDropdownValue, minDate, maxDate)
82
+ }), /*#__PURE__*/_react["default"].createElement(S.PickerWrapper, null, isDateStep ? /*#__PURE__*/_react["default"].createElement(_MobileDatePicker.MobileDatePicker, {
63
83
  value: calendarDropdownValue,
64
84
  onChange: onCalendarChange,
65
85
  minDate: minDate,
66
- maxDate: maxDate,
67
- isLargeMobileSize: true
68
- })) : /*#__PURE__*/_react["default"].createElement(S.TimePickerWrapper, null, /*#__PURE__*/_react["default"].createElement(_TimePicker.TimePicker, {
86
+ maxDate: maxDate
87
+ }) : /*#__PURE__*/_react["default"].createElement(_TimePicker.TimePicker, {
88
+ isMobile: true,
69
89
  value: [currentHour, currentMinute],
70
90
  onChange: onTimeChange,
71
91
  maxTime: maxTime,
@@ -9,7 +9,8 @@ var _index = require("./index");
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  require("react-calendar/dist/Calendar.css");
11
11
  var _logic = require("../../../DateInput/logic");
12
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
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); }
13
+ 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; }
13
14
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
14
15
  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."); }
15
16
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
@@ -1,3 +1,2 @@
1
1
  /// <reference types="react" />
2
- export declare const MobileCalendarWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
3
- export declare const TimePickerWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
2
+ export declare const PickerWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
@@ -3,14 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.TimePickerWrapper = exports.MobileCalendarWrapper = void 0;
6
+ exports.PickerWrapper = void 0;
7
7
  var _styledComponents = _interopRequireDefault(require("styled-components"));
8
8
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
9
- var MobileCalendarWrapper = exports.MobileCalendarWrapper = _styledComponents["default"].div.withConfig({
10
- displayName: "styles__MobileCalendarWrapper",
9
+ var PickerWrapper = exports.PickerWrapper = _styledComponents["default"].div.withConfig({
10
+ displayName: "styles__PickerWrapper",
11
11
  componentId: "sc-vw0y4c-0"
12
- })(["padding:18px 16px 30px;display:flex;justify-content:center;"]);
13
- var TimePickerWrapper = exports.TimePickerWrapper = _styledComponents["default"].div.withConfig({
14
- displayName: "styles__TimePickerWrapper",
15
- componentId: "sc-vw0y4c-1"
16
- })(["padding-bottom:30px;display:flex;justify-content:center;"]);
12
+ })(["padding:20px 16px 30px;display:flex;justify-content:center;"]);
@@ -0,0 +1,14 @@
1
+ import { FC } from 'react';
2
+ export type TWheelOption = {
3
+ value: number;
4
+ label: string;
5
+ };
6
+ export type TProps = {
7
+ options: Array<TWheelOption>;
8
+ value: number;
9
+ onChange: (value: number) => void;
10
+ label: string;
11
+ align?: 'left' | 'center' | 'right';
12
+ width?: number;
13
+ };
14
+ export declare const WheelColumn: FC<TProps>;
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.WheelColumn = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var S = _interopRequireWildcard(require("./styles"));
10
+ var _constants = require("../../constants");
11
+ var _palette = require("../../../../../../../palette");
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); }
13
+ 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; }
14
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
15
+ 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."); }
16
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
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; }
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; } }
19
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
20
+ // Затухание строк по мере удаления от центра — имитация барабана из нативных пикеров.
21
+ var OPACITY_STEPS = [1, 0.75, 0.45, 0.28, 0.18];
22
+ var INCLINE_STEPS = [0, 22, 42, 58, 68];
23
+ var SCALE_STEPS = [1, 0.94, 0.87, 0.82, 0.78];
24
+ var getIndexByScrollTop = function getIndexByScrollTop(scrollTop, count) {
25
+ return Math.min(Math.max(Math.round(scrollTop / _constants.ITEM_HEIGHT), 0), Math.max(count - 1, 0));
26
+ };
27
+ var clampVelocity = function clampVelocity(velocity) {
28
+ return Math.min(Math.max(velocity, -_constants.MAX_VELOCITY), _constants.MAX_VELOCITY);
29
+ };
30
+ var WheelColumn = exports.WheelColumn = function WheelColumn(_ref) {
31
+ var _options$activeIndex;
32
+ var options = _ref.options,
33
+ value = _ref.value,
34
+ onChange = _ref.onChange,
35
+ label = _ref.label,
36
+ _ref$align = _ref.align,
37
+ align = _ref$align === void 0 ? 'center' : _ref$align,
38
+ width = _ref.width;
39
+ var palette = (0, _palette.useComponentPalette)('mobileWheelPicker');
40
+ var containerRef = (0, _react.useRef)(null);
41
+ var rafRef = (0, _react.useRef)(null);
42
+ var settleRef = (0, _react.useRef)(null);
43
+ var isUserScrollingRef = (0, _react.useRef)(false);
44
+ var isMountedRef = (0, _react.useRef)(false);
45
+ var dragRef = (0, _react.useRef)(null);
46
+ var inertiaRef = (0, _react.useRef)(null);
47
+ var isClickSuppressedRef = (0, _react.useRef)(false);
48
+ var valueIndex = (0, _react.useMemo)(function () {
49
+ var index = options.findIndex(function (option) {
50
+ return option.value === value;
51
+ });
52
+ return index === -1 ? 0 : index;
53
+ }, [options, value]);
54
+ var _useState = (0, _react.useState)(valueIndex),
55
+ _useState2 = _slicedToArray(_useState, 2),
56
+ activeIndex = _useState2[0],
57
+ setActiveIndex = _useState2[1];
58
+
59
+ // Подписка на скролл вешается один раз: пересоздание слушателя сбрасывало бы
60
+ // таймер остановки барабана, и onChange мог не долететь до родителя.
61
+ var optionsRef = (0, _react.useRef)(options);
62
+ var valueRef = (0, _react.useRef)(value);
63
+ var onChangeRef = (0, _react.useRef)(onChange);
64
+ (0, _react.useEffect)(function () {
65
+ optionsRef.current = options;
66
+ valueRef.current = value;
67
+ onChangeRef.current = onChange;
68
+ });
69
+
70
+ // Подсветка следует за значением, когда его меняют снаружи (например, клампят день после смены месяца).
71
+ (0, _react.useEffect)(function () {
72
+ return setActiveIndex(valueIndex);
73
+ }, [valueIndex]);
74
+
75
+ // Доводим барабан до выбранного значения. Пока палец на экране не вмешиваемся,
76
+ // иначе перерисовка родителя дёргала бы скролл из-под пользователя.
77
+ (0, _react.useEffect)(function () {
78
+ var container = containerRef.current;
79
+ if (!container || isUserScrollingRef.current) return;
80
+ var top = valueIndex * _constants.ITEM_HEIGHT;
81
+ if (Math.abs(container.scrollTop - top) < 1) return;
82
+ container.scrollTo({
83
+ top: top,
84
+ behavior: isMountedRef.current ? 'smooth' : 'auto'
85
+ });
86
+ }, [valueIndex, options.length]);
87
+ (0, _react.useEffect)(function () {
88
+ isMountedRef.current = true;
89
+ }, []);
90
+ (0, _react.useEffect)(function () {
91
+ var container = containerRef.current;
92
+ if (!container) return undefined;
93
+ var handleScroll = function handleScroll() {
94
+ isUserScrollingRef.current = true;
95
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
96
+ rafRef.current = requestAnimationFrame(function () {
97
+ // setState с тем же индексом React отбрасывает, поэтому перерисовка
98
+ // происходит не на каждый кадр, а только при переходе на новую строку.
99
+ setActiveIndex(getIndexByScrollTop(container.scrollTop, optionsRef.current.length));
100
+ });
101
+ if (settleRef.current) clearTimeout(settleRef.current);
102
+ settleRef.current = setTimeout(function () {
103
+ isUserScrollingRef.current = false;
104
+ var index = getIndexByScrollTop(container.scrollTop, optionsRef.current.length);
105
+ setActiveIndex(index);
106
+ var option = optionsRef.current[index];
107
+ if (option && option.value !== valueRef.current) onChangeRef.current(option.value);
108
+ }, _constants.SETTLE_MS);
109
+ };
110
+ container.addEventListener('scroll', handleScroll, {
111
+ passive: true
112
+ });
113
+ return function () {
114
+ container.removeEventListener('scroll', handleScroll);
115
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
116
+ if (settleRef.current) clearTimeout(settleRef.current);
117
+ };
118
+ }, []);
119
+ var stopInertia = (0, _react.useCallback)(function () {
120
+ if (!inertiaRef.current) return;
121
+ cancelAnimationFrame(inertiaRef.current);
122
+ inertiaRef.current = null;
123
+ }, []);
124
+ (0, _react.useEffect)(function () {
125
+ return stopInertia;
126
+ }, [stopInertia]);
127
+
128
+ // Пока барабан ведёт палец или инерция, залипание выключено: браузер иначе
129
+ // отматывал бы scrollTop обратно к ближайшей строке на каждый кадр.
130
+ var setSnapEnabled = (0, _react.useCallback)(function (isEnabled) {
131
+ var container = containerRef.current;
132
+ if (container) container.style.scrollSnapType = isEnabled ? '' : 'none';
133
+ }, []);
134
+
135
+ // Барабан остановился — возвращаем залипание и доводим до строки. onChange
136
+ // отправит общий обработчик скролла, когда доводка закончится.
137
+ var finishDrag = (0, _react.useCallback)(function () {
138
+ var container = containerRef.current;
139
+ if (!container) return;
140
+ setSnapEnabled(true);
141
+ var index = getIndexByScrollTop(container.scrollTop, optionsRef.current.length);
142
+ container.scrollTo({
143
+ top: index * _constants.ITEM_HEIGHT,
144
+ behavior: 'smooth'
145
+ });
146
+ }, [setSnapEnabled]);
147
+ var startInertia = (0, _react.useCallback)(function (initialVelocity) {
148
+ var container = containerRef.current;
149
+ if (!container) return;
150
+ var velocity = initialVelocity;
151
+ var previousTime = performance.now();
152
+ var _step = function step(now) {
153
+ // Кадр мог быть пропущен (вкладка в фоне) — не даём барабану прыгнуть.
154
+ var elapsed = Math.min(now - previousTime, 50);
155
+ previousTime = now;
156
+ var shift = velocity * elapsed;
157
+ var scrollTopBefore = container.scrollTop;
158
+ container.scrollTop = scrollTopBefore - shift;
159
+ velocity *= Math.pow(_constants.FRICTION_PER_FRAME, elapsed / _constants.FRAME_MS);
160
+
161
+ // scrollTop не сдвинулся, хотя должен был — упёрлись в край списка.
162
+ var isStuck = Math.abs(shift) >= 1 && container.scrollTop === scrollTopBefore;
163
+ if (Math.abs(velocity) < _constants.MIN_VELOCITY || isStuck) {
164
+ inertiaRef.current = null;
165
+ finishDrag();
166
+ return;
167
+ }
168
+ inertiaRef.current = requestAnimationFrame(_step);
169
+ };
170
+ inertiaRef.current = requestAnimationFrame(_step);
171
+ }, [finishDrag]);
172
+ var handlePointerDown = (0, _react.useCallback)(function (event) {
173
+ var _event$currentTarget$, _event$currentTarget;
174
+ // Толчок по крутящемуся барабану ловит его — как в нативных пикерах.
175
+ stopInertia();
176
+ setSnapEnabled(false);
177
+ isClickSuppressedRef.current = false;
178
+ isUserScrollingRef.current = true;
179
+ dragRef.current = {
180
+ pointerId: event.pointerId,
181
+ startY: event.clientY,
182
+ lastY: event.clientY,
183
+ lastTime: event.timeStamp,
184
+ velocity: 0,
185
+ isMoved: false
186
+ };
187
+ (_event$currentTarget$ = (_event$currentTarget = event.currentTarget).setPointerCapture) === null || _event$currentTarget$ === void 0 || _event$currentTarget$.call(_event$currentTarget, event.pointerId);
188
+ }, [setSnapEnabled, stopInertia]);
189
+ var handlePointerMove = (0, _react.useCallback)(function (event) {
190
+ var drag = dragRef.current;
191
+ var container = containerRef.current;
192
+ if (!drag || !container || drag.pointerId !== event.pointerId) return;
193
+ var shift = event.clientY - drag.lastY;
194
+ var elapsed = event.timeStamp - drag.lastTime;
195
+ container.scrollTop -= shift;
196
+
197
+ // Скорость сглаживаем: дрожание пальца в конце жеста иначе гасит бросок.
198
+ if (elapsed > 0) drag.velocity = drag.velocity * 0.7 + shift / elapsed * 0.3;
199
+ if (Math.abs(event.clientY - drag.startY) > _constants.DRAG_THRESHOLD) drag.isMoved = true;
200
+ drag.lastY = event.clientY;
201
+ drag.lastTime = event.timeStamp;
202
+ }, []);
203
+ var handlePointerUp = (0, _react.useCallback)(function (event) {
204
+ var drag = dragRef.current;
205
+ if (!drag || drag.pointerId !== event.pointerId) return;
206
+ dragRef.current = null;
207
+ isClickSuppressedRef.current = drag.isMoved;
208
+
209
+ // Палец замер перед отпусканием — это доводка, а не бросок.
210
+ var isStale = event.timeStamp - drag.lastTime > _constants.STALE_DRAG_MS;
211
+ var velocity = isStale ? 0 : clampVelocity(drag.velocity);
212
+ if (Math.abs(velocity) < _constants.MIN_VELOCITY) {
213
+ finishDrag();
214
+ return;
215
+ }
216
+ startInertia(velocity);
217
+ }, [finishDrag, startInertia]);
218
+ var handleItemClick = (0, _react.useCallback)(function (index) {
219
+ var _containerRef$current;
220
+ if (isClickSuppressedRef.current) return;
221
+ (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 || _containerRef$current.scrollTo({
222
+ top: index * _constants.ITEM_HEIGHT,
223
+ behavior: 'smooth'
224
+ });
225
+ }, []);
226
+ var activeValue = (_options$activeIndex = options[activeIndex]) === null || _options$activeIndex === void 0 ? void 0 : _options$activeIndex.value;
227
+ return /*#__PURE__*/_react["default"].createElement(S.Wrapper, {
228
+ ref: containerRef,
229
+ $align: align,
230
+ style: width ? {
231
+ width: width
232
+ } : undefined,
233
+ role: "listbox",
234
+ "aria-label": label,
235
+ tabIndex: -1,
236
+ onPointerDown: handlePointerDown,
237
+ onPointerMove: handlePointerMove,
238
+ onPointerUp: handlePointerUp,
239
+ onPointerCancel: handlePointerUp
240
+ }, options.map(function (option, index) {
241
+ var step = Math.min(Math.abs(index - activeIndex), OPACITY_STEPS.length - 1);
242
+ var isActive = index === activeIndex;
243
+ return /*#__PURE__*/_react["default"].createElement(S.Item, {
244
+ key: option.value,
245
+ type: "button",
246
+ role: "option",
247
+ "aria-selected": option.value === activeValue,
248
+ onClick: function onClick() {
249
+ return handleItemClick(index);
250
+ },
251
+ $color: palette.value,
252
+ $colorActive: palette.valueActive,
253
+ $isActive: isActive,
254
+ $opacity: OPACITY_STEPS[step],
255
+ $incline: INCLINE_STEPS[step],
256
+ $scale: SCALE_STEPS[step]
257
+ }, option.label);
258
+ }));
259
+ };
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ 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>, {
3
+ $align: 'left' | 'center' | 'right';
4
+ }>> & string;
5
+ export declare const Item: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {
6
+ $color: string;
7
+ $colorActive: string;
8
+ $isActive: boolean;
9
+ $opacity: number;
10
+ $incline: number;
11
+ $scale: number;
12
+ }>> & string;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Wrapper = exports.Item = void 0;
7
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
8
+ var _reducedMotion = require("../../../../../../../utils/reducedMotion");
9
+ var _constants = require("../../constants");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
11
+ var Wrapper = exports.Wrapper = _styledComponents["default"].div.withConfig({
12
+ displayName: "styles__Wrapper",
13
+ componentId: "sc-xvigbn-0"
14
+ })(["height:100%;flex-shrink:0;box-sizing:border-box;padding:", "px 0;overflow-y:scroll;overscroll-behavior:contain;scroll-snap-type:y mandatory;-webkit-overflow-scrolling:touch;text-align:", ";touch-action:none;user-select:none;-webkit-user-select:none;cursor:grab;&:active{cursor:grabbing;}scrollbar-width:none;-ms-overflow-style:none;&::-webkit-scrollbar{display:none;}"], _constants.EDGE_PADDING, function (_ref) {
15
+ var $align = _ref.$align;
16
+ return $align;
17
+ });
18
+ var Item = exports.Item = _styledComponents["default"].button.withConfig({
19
+ displayName: "styles__Item",
20
+ componentId: "sc-xvigbn-1"
21
+ })(["display:block;width:100%;height:", "px;padding:0;margin:0;border:none;background:transparent;cursor:pointer;outline:none;white-space:nowrap;scroll-snap-align:center;font:inherit;text-align:inherit;line-height:", "px;color:", ";opacity:", ";transform:rotateX(", "deg) scale(", ");backface-visibility:hidden;transition:opacity 0.12s ease,transform 0.12s ease,color 0.12s ease;", ""], _constants.ITEM_HEIGHT, _constants.ITEM_HEIGHT, function (_ref2) {
22
+ var $isActive = _ref2.$isActive,
23
+ $color = _ref2.$color,
24
+ $colorActive = _ref2.$colorActive;
25
+ return $isActive ? $colorActive : $color;
26
+ }, function (_ref3) {
27
+ var $opacity = _ref3.$opacity;
28
+ return $opacity;
29
+ }, function (_ref4) {
30
+ var $incline = _ref4.$incline;
31
+ return $incline;
32
+ }, function (_ref5) {
33
+ var $scale = _ref5.$scale;
34
+ return $scale;
35
+ }, _reducedMotion.reducedMotion);
@@ -0,0 +1,11 @@
1
+ export declare const ITEM_HEIGHT = 34;
2
+ export declare const VISIBLE_ITEMS = 5;
3
+ export declare const WHEEL_HEIGHT: number;
4
+ export declare const EDGE_PADDING: number;
5
+ export declare const SETTLE_MS = 140;
6
+ export declare const FRICTION_PER_FRAME = 0.94;
7
+ export declare const FRAME_MS: number;
8
+ export declare const MIN_VELOCITY = 0.02;
9
+ export declare const MAX_VELOCITY = 4;
10
+ export declare const DRAG_THRESHOLD = 4;
11
+ export declare const STALE_DRAG_MS = 80;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.WHEEL_HEIGHT = exports.VISIBLE_ITEMS = exports.STALE_DRAG_MS = exports.SETTLE_MS = exports.MIN_VELOCITY = exports.MAX_VELOCITY = exports.ITEM_HEIGHT = exports.FRICTION_PER_FRAME = exports.FRAME_MS = exports.EDGE_PADDING = exports.DRAG_THRESHOLD = void 0;
7
+ // Геометрия барабана. Все вычисления скролла завязаны на эти константы:
8
+ // scrollTop выбранного элемента === index * ITEM_HEIGHT (см. getIndexByScrollTop).
9
+ var ITEM_HEIGHT = exports.ITEM_HEIGHT = 34;
10
+
11
+ // Нечётное число, чтобы выбранный элемент оказался ровно по центру колонки.
12
+ var VISIBLE_ITEMS = exports.VISIBLE_ITEMS = 5;
13
+ var WHEEL_HEIGHT = exports.WHEEL_HEIGHT = ITEM_HEIGHT * VISIBLE_ITEMS;
14
+
15
+ // Сколько пустого места нужно сверху и снизу, чтобы крайние элементы вставали в центр.
16
+ var EDGE_PADDING = exports.EDGE_PADDING = ITEM_HEIGHT * ((VISIBLE_ITEMS - 1) / 2);
17
+
18
+ // Пауза без событий скролла, после которой считаем, что барабан остановился.
19
+ var SETTLE_MS = exports.SETTLE_MS = 140;
20
+
21
+ // --- Инерция ---
22
+ // Барабан крутится сам после броска. Нативный fling есть только у тач-скролла, поэтому
23
+ // перетаскивание ведём сами: так «толчок» работает и пальцем, и мышью, и одинаково
24
+ // ощущается на всех платформах.
25
+
26
+ // Доля скорости, сохраняемая за кадр при 60fps. Меньше — барабан встаёт резче.
27
+ var FRICTION_PER_FRAME = exports.FRICTION_PER_FRAME = 0.94;
28
+ var FRAME_MS = exports.FRAME_MS = 1000 / 60;
29
+
30
+ // Скорость в px/ms, ниже которой барабан считаем остановившимся.
31
+ var MIN_VELOCITY = exports.MIN_VELOCITY = 0.02;
32
+
33
+ // Потолок броска: без него резкий свайп улетал бы на сотни строк.
34
+ var MAX_VELOCITY = exports.MAX_VELOCITY = 4;
35
+
36
+ // Сдвиг в px, после которого жест перестаёт быть кликом по строке.
37
+ var DRAG_THRESHOLD = exports.DRAG_THRESHOLD = 4;
38
+
39
+ // Если перед отпусканием палец простоял дольше — это не бросок, а точная доводка.
40
+ var STALE_DRAG_MS = exports.STALE_DRAG_MS = 80;