@alfalab/core-components-circular-progress-bar 3.6.7 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/@alfalab/core-components-shared/package.json +26 -0
  2. package/Component.d.ts +36 -5
  3. package/Component.js +42 -7
  4. package/consts.d.ts +9 -1
  5. package/consts.js +11 -0
  6. package/cssm/Component.d.ts +36 -5
  7. package/cssm/Component.js +41 -6
  8. package/cssm/consts.d.ts +9 -1
  9. package/cssm/consts.js +11 -0
  10. package/cssm/index.d.ts +1 -0
  11. package/cssm/index.module.css +14 -1
  12. package/cssm/shared/index.d.ts +1 -0
  13. package/cssm/shared/index.js +9 -0
  14. package/cssm/types/component-size.d.ts +2 -0
  15. package/cssm/types/component-size.js +2 -0
  16. package/cssm/types/typography-color.d.ts +2 -0
  17. package/cssm/types/typography-color.js +2 -0
  18. package/cssm/use-timer.d.ts +2 -0
  19. package/cssm/use-timer.js +31 -0
  20. package/cssm/utils/get-circular-progress-bar-test-ids.d.ts +8 -0
  21. package/cssm/utils/get-circular-progress-bar-test-ids.js +17 -0
  22. package/cssm/utils/is-typography-color.d.ts +3 -0
  23. package/cssm/utils/is-typography-color.js +11 -0
  24. package/esm/Component.d.ts +36 -5
  25. package/esm/Component.js +43 -8
  26. package/esm/consts.d.ts +9 -1
  27. package/esm/consts.js +9 -1
  28. package/esm/index.css +63 -50
  29. package/esm/index.d.ts +1 -0
  30. package/esm/shared/index.d.ts +1 -0
  31. package/esm/shared/index.js +1 -0
  32. package/esm/types/component-size.d.ts +2 -0
  33. package/esm/types/component-size.js +1 -0
  34. package/esm/types/typography-color.d.ts +2 -0
  35. package/esm/types/typography-color.js +1 -0
  36. package/esm/use-timer.d.ts +2 -0
  37. package/esm/use-timer.js +27 -0
  38. package/esm/utils/get-circular-progress-bar-test-ids.d.ts +8 -0
  39. package/esm/utils/get-circular-progress-bar-test-ids.js +13 -0
  40. package/esm/utils/is-typography-color.d.ts +3 -0
  41. package/esm/utils/is-typography-color.js +7 -0
  42. package/index.css +63 -50
  43. package/index.d.ts +1 -0
  44. package/modern/Component.d.ts +36 -5
  45. package/modern/Component.js +49 -12
  46. package/modern/consts.d.ts +9 -1
  47. package/modern/consts.js +9 -1
  48. package/modern/index.css +63 -50
  49. package/modern/index.d.ts +1 -0
  50. package/modern/shared/index.d.ts +1 -0
  51. package/modern/shared/index.js +1 -0
  52. package/modern/types/component-size.d.ts +2 -0
  53. package/modern/types/component-size.js +1 -0
  54. package/modern/types/typography-color.d.ts +2 -0
  55. package/modern/types/typography-color.js +1 -0
  56. package/modern/use-timer.d.ts +2 -0
  57. package/modern/use-timer.js +24 -0
  58. package/modern/utils/get-circular-progress-bar-test-ids.d.ts +8 -0
  59. package/modern/utils/get-circular-progress-bar-test-ids.js +13 -0
  60. package/modern/utils/is-typography-color.d.ts +3 -0
  61. package/modern/utils/is-typography-color.js +5 -0
  62. package/moderncssm/Component.d.ts +36 -5
  63. package/moderncssm/Component.js +48 -11
  64. package/moderncssm/consts.d.ts +9 -1
  65. package/moderncssm/consts.js +9 -1
  66. package/moderncssm/index.d.ts +1 -0
  67. package/moderncssm/index.module.css +18 -0
  68. package/moderncssm/shared/index.d.ts +1 -0
  69. package/moderncssm/shared/index.js +1 -0
  70. package/moderncssm/types/component-size.d.ts +2 -0
  71. package/moderncssm/types/component-size.js +1 -0
  72. package/moderncssm/types/typography-color.d.ts +2 -0
  73. package/moderncssm/types/typography-color.js +1 -0
  74. package/moderncssm/use-timer.d.ts +2 -0
  75. package/moderncssm/use-timer.js +24 -0
  76. package/moderncssm/utils/get-circular-progress-bar-test-ids.d.ts +8 -0
  77. package/moderncssm/utils/get-circular-progress-bar-test-ids.js +13 -0
  78. package/moderncssm/utils/is-typography-color.d.ts +3 -0
  79. package/moderncssm/utils/is-typography-color.js +5 -0
  80. package/package.json +5 -4
  81. package/shared/index.d.ts +1 -0
  82. package/shared/index.js +9 -0
  83. package/shared/package.json +3 -0
  84. package/src/Component.tsx +111 -14
  85. package/src/consts.ts +10 -0
  86. package/src/index.module.css +18 -0
  87. package/src/index.ts +1 -0
  88. package/src/shared/index.ts +1 -0
  89. package/src/shared/package.json +3 -0
  90. package/src/types/component-size.ts +1 -0
  91. package/src/types/typography-color.ts +1 -0
  92. package/src/use-timer.ts +35 -0
  93. package/src/utils/get-circular-progress-bar-test-ids.ts +11 -0
  94. package/src/utils/is-typography-color.ts +5 -0
  95. package/types/component-size.d.ts +2 -0
  96. package/types/component-size.js +2 -0
  97. package/types/typography-color.d.ts +2 -0
  98. package/types/typography-color.js +2 -0
  99. package/use-timer.d.ts +2 -0
  100. package/use-timer.js +31 -0
  101. package/utils/get-circular-progress-bar-test-ids.d.ts +8 -0
  102. package/utils/get-circular-progress-bar-test-ids.js +17 -0
  103. package/utils/is-typography-color.d.ts +3 -0
  104. package/utils/is-typography-color.js +11 -0
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@alfalab/core-components-shared",
3
+ "version": "0.14.1",
4
+ "description": "Shared package for core-components",
5
+ "keywords": [],
6
+ "license": "MIT",
7
+ "main": "index.js",
8
+ "module": "./esm/index.js",
9
+ "publishConfig": {
10
+ "access": "public",
11
+ "directory": "dist"
12
+ },
13
+ "sideEffects": false,
14
+ "peerDependencies": {
15
+ "react": ">=16.8.0"
16
+ },
17
+ "dependencies": {
18
+ "@alfalab/hooks": "^1.13.1",
19
+ "tslib": "^2.4.0"
20
+ },
21
+ "devDependencies": {
22
+ "@maskito/core": "^1.7.0"
23
+ },
24
+ "themesVersion": "13.6.0",
25
+ "varsVersion": "9.16.0"
26
+ }
package/Component.d.ts CHANGED
@@ -1,12 +1,27 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { ElementType, ReactNode } from "react";
4
- type TypographyColor = 'primary' | 'secondary' | 'tertiary' | 'positive' | 'negative';
4
+ import { ComponentSize } from "./types/component-size";
5
+ import { TypographyColor } from "./types/typography-color";
5
6
  type CircularProgressBarProps = {
6
7
  /**
7
8
  * Уровень прогресса, %
8
9
  */
9
- value: number;
10
+ value: number | {
11
+ /**
12
+ * Время таймера в секундах
13
+ * Минимальное значение 0
14
+ * Максимальное значение 3600
15
+ */
16
+ timer: number;
17
+ /**
18
+ * Направлние отсчета таймера
19
+ * forward: считаем от 0 до указанного значения
20
+ * backward: считаем от указанного значения до 0
21
+ * @default backward
22
+ */
23
+ counting?: 'forward' | 'backward';
24
+ };
10
25
  /**
11
26
  * Дополнительный класс
12
27
  */
@@ -19,6 +34,16 @@ type CircularProgressBarProps = {
19
34
  * Цвет контента
20
35
  */
21
36
  contentColor?: TypographyColor | string;
37
+ /**
38
+ * Цвет заголовка
39
+ * Приоритет выше чем у `contentColor`
40
+ */
41
+ titleColor?: TypographyColor | string;
42
+ /**
43
+ * Цвет подзаголовка
44
+ * Приоритет выше чем у `contentColor`
45
+ */
46
+ subtitleColor?: TypographyColor | string;
22
47
  /**
23
48
  * Дополнительный текст
24
49
  */
@@ -37,9 +62,10 @@ type CircularProgressBarProps = {
37
62
  view?: 'positive' | 'negative';
38
63
  /**
39
64
  * Размер (xxl — 144×144px, xl — 128×128px, l — 80×80px, m — 64×64px, s — 48×48px, xs — 24×24px)
40
- * @description xs, s, m, l, xl, xxl deprecated, используйте вместо них 24, 48, 64 , 80, 128, 144 соответственно
65
+ * @description xs, s, m, l, xl, xxl deprecated, используйте вместо них 24, 48, 64, 80, 128, 144 соответственно
66
+ * @default 64
41
67
  */
42
- size?: 'xxl' | 'xl' | 'l' | 'm' | 's' | 'xs' | 24 | 48 | 64 | 80 | 128 | 144;
68
+ size?: ComponentSize;
43
69
  /**
44
70
  * Наличие желоба
45
71
  */
@@ -103,9 +129,14 @@ type CircularProgressBarProps = {
103
129
  * Цвет желоба
104
130
  */
105
131
  strokeColor?: string;
132
+ /**
133
+ * Направление заполнения круга
134
+ * @default desc
135
+ */
136
+ directionType?: 'asc' | 'desc';
106
137
  };
107
138
  /**
108
139
  * Компонент круглого прогресс бара.
109
140
  */
110
141
  declare const CircularProgressBar: React.FC<CircularProgressBarProps>;
111
- export { TypographyColor, CircularProgressBarProps, CircularProgressBar };
142
+ export { CircularProgressBarProps, CircularProgressBar };
package/Component.js CHANGED
@@ -5,15 +5,18 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib = require('tslib');
6
6
  var React = require('react');
7
7
  var cn = require('classnames');
8
+ var coreComponentsShared = require('@alfalab/core-components-shared');
8
9
  var coreComponentsTypography = require('@alfalab/core-components-typography');
10
+ var utils_isTypographyColor = require('./utils/is-typography-color.js');
9
11
  var consts = require('./consts.js');
12
+ var useTimer = require('./use-timer.js');
10
13
 
11
14
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
12
15
 
13
16
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
14
17
  var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
15
18
 
16
- var styles = {"component":"circular-progress-bar__component_5bj3o","bg-positive":"circular-progress-bar__bg-positive_5bj3o","bg-negative":"circular-progress-bar__bg-negative_5bj3o","svg":"circular-progress-bar__svg_5bj3o","title":"circular-progress-bar__title_5bj3o","subtitle":"circular-progress-bar__subtitle_5bj3o","labelWrapper":"circular-progress-bar__labelWrapper_5bj3o","label":"circular-progress-bar__label_5bj3o","typography":"circular-progress-bar__typography_5bj3o","size-144":"circular-progress-bar__size-144_5bj3o","size-128":"circular-progress-bar__size-128_5bj3o","size-80":"circular-progress-bar__size-80_5bj3o","size-64":"circular-progress-bar__size-64_5bj3o","size-48":"circular-progress-bar__size-48_5bj3o","size-24":"circular-progress-bar__size-24_5bj3o","backgroundCircle":"circular-progress-bar__backgroundCircle_5bj3o","progressCircle":"circular-progress-bar__progressCircle_5bj3o","positive":"circular-progress-bar__positive_5bj3o","negative":"circular-progress-bar__negative_5bj3o","stroke":"circular-progress-bar__stroke_5bj3o","iconWrapper":"circular-progress-bar__iconWrapper_5bj3o","icon-tertiary":"circular-progress-bar__icon-tertiary_5bj3o","icon-positive":"circular-progress-bar__icon-positive_5bj3o","icon-negative":"circular-progress-bar__icon-negative_5bj3o","icon-primary-inverted":"circular-progress-bar__icon-primary-inverted_5bj3o","icon-primary":"circular-progress-bar__icon-primary_5bj3o","icon-secondary":"circular-progress-bar__icon-secondary_5bj3o","icon":"circular-progress-bar__icon_5bj3o"};
19
+ var styles = {"component":"circular-progress-bar__component_1cf8i","bg-positive":"circular-progress-bar__bg-positive_1cf8i","bg-negative":"circular-progress-bar__bg-negative_1cf8i","svg":"circular-progress-bar__svg_1cf8i","title":"circular-progress-bar__title_1cf8i","subtitle":"circular-progress-bar__subtitle_1cf8i","labelWrapper":"circular-progress-bar__labelWrapper_1cf8i","label":"circular-progress-bar__label_1cf8i","typography":"circular-progress-bar__typography_1cf8i","size-144":"circular-progress-bar__size-144_1cf8i","size-128":"circular-progress-bar__size-128_1cf8i","size-96":"circular-progress-bar__size-96_1cf8i","size-80":"circular-progress-bar__size-80_1cf8i","size-64":"circular-progress-bar__size-64_1cf8i","size-48":"circular-progress-bar__size-48_1cf8i","size-24":"circular-progress-bar__size-24_1cf8i","backgroundCircle":"circular-progress-bar__backgroundCircle_1cf8i","progressCircle":"circular-progress-bar__progressCircle_1cf8i","positive":"circular-progress-bar__positive_1cf8i","negative":"circular-progress-bar__negative_1cf8i","stroke":"circular-progress-bar__stroke_1cf8i","iconWrapper":"circular-progress-bar__iconWrapper_1cf8i","icon-tertiary":"circular-progress-bar__icon-tertiary_1cf8i","icon-positive":"circular-progress-bar__icon-positive_1cf8i","icon-negative":"circular-progress-bar__icon-negative_1cf8i","icon-primary-inverted":"circular-progress-bar__icon-primary-inverted_1cf8i","icon-primary":"circular-progress-bar__icon-primary_1cf8i","icon-secondary":"circular-progress-bar__icon-secondary_1cf8i","icon":"circular-progress-bar__icon_1cf8i"};
17
20
  require('./index.css')
18
21
 
19
22
  /**
@@ -21,7 +24,21 @@ require('./index.css')
21
24
  */
22
25
  var CircularProgressBar = function (_a) {
23
26
  var _b, _c, _d;
24
- var value = _a.value, _e = _a.view, view = _e === void 0 ? 'positive' : _e, _f = _a.size, size = _f === void 0 ? 64 : _f, className = _a.className, dataTestId = _a.dataTestId, _g = _a.title, title = _g === void 0 ? value ? value.toString() : '0' : _g, titleComplete = _a.titleComplete, subtitle = _a.subtitle, _h = _a.contentColor, contentColor = _h === void 0 ? 'secondary' : _h, subtitleComplete = _a.subtitleComplete, _j = _a.stroke, stroke = _j === void 0 ? true : _j, fillComplete = _a.fillComplete, Icon = _a.icon, IconComplete = _a.iconComplete, completeTextColor = _a.completeTextColor, _k = _a.completeIconColor, completeIconColor = _k === void 0 ? 'tertiary' : _k, _l = _a.direction, direction = _l === void 0 ? 'clockwise' : _l, height = _a.height, children = _a.children, progressStrokeColor = _a.progressStrokeColor, circleColor = _a.circleColor, strokeColor = _a.strokeColor;
27
+ var _e;
28
+ var valueFromProps = _a.value, _f = _a.view, view = _f === void 0 ? 'positive' : _f, _g = _a.size, size = _g === void 0 ? 64 : _g, className = _a.className, dataTestId = _a.dataTestId, _h = _a.title, titleFromProps = _h === void 0 ? coreComponentsShared.isObject(valueFromProps) ? null : "".concat(valueFromProps) : _h, titleComplete = _a.titleComplete, subtitle = _a.subtitle, _j = _a.contentColor, contentColor = _j === void 0 ? 'secondary' : _j, subtitleComplete = _a.subtitleComplete, _k = _a.stroke, stroke = _k === void 0 ? true : _k, fillComplete = _a.fillComplete, Icon = _a.icon, IconComplete = _a.iconComplete, completeTextColor = _a.completeTextColor, _l = _a.completeIconColor, completeIconColor = _l === void 0 ? 'tertiary' : _l, _m = _a.direction, direction = _m === void 0 ? 'clockwise' : _m, height = _a.height, children = _a.children, progressStrokeColor = _a.progressStrokeColor, circleColor = _a.circleColor, strokeColor = _a.strokeColor, _o = _a.directionType, directionType = _o === void 0 ? 'asc' : _o, titleColor = _a.titleColor, subtitleColor = _a.subtitleColor;
29
+ var isTimer = coreComponentsShared.isObject(valueFromProps);
30
+ var _p = useTimer.useTimer(isTimer ? Math.min(Math.max(valueFromProps.timer, consts.MIN_TIMER_VALUE), consts.MAX_TIMER_VALUE) : -1, isTimer, isTimer ? (_e = valueFromProps.counting) !== null && _e !== void 0 ? _e : 'backward' : 'backward'), timerValue = _p[0], timerTitle = _p[1];
31
+ var value;
32
+ var title;
33
+ if (isTimer) {
34
+ value = timerValue;
35
+ title = timerTitle;
36
+ }
37
+ else {
38
+ value = valueFromProps;
39
+ title = titleFromProps;
40
+ }
41
+ value = directionType === 'desc' ? consts.MAX_PROGRESS_VALUE - value : value;
25
42
  var memorized = React.useMemo(function () {
26
43
  var strokeWidth = consts.STROKE[size];
27
44
  var maxProgress = 100;
@@ -42,7 +59,7 @@ var CircularProgressBar = function (_a) {
42
59
  strokeDasharray: strokeDasharray,
43
60
  strokeDashoffset: strokeDashoffset,
44
61
  };
45
- }, [value, size]);
62
+ }, [size, value]);
46
63
  var isComplete = value === 100;
47
64
  var isCompleteTextColor = isComplete && completeTextColor;
48
65
  var titleContent = titleComplete && isComplete ? titleComplete : title;
@@ -51,12 +68,30 @@ var CircularProgressBar = function (_a) {
51
68
  var typographyContentColor = consts.TYPOGRAPHY_COLOR.includes(contentColor)
52
69
  ? contentColor
53
70
  : undefined;
71
+ var getTextColor = function (color) {
72
+ if (isCompleteTextColor) {
73
+ return completeTextColor;
74
+ }
75
+ if (color) {
76
+ return utils_isTypographyColor.isTypographyColor(color) ? color : undefined;
77
+ }
78
+ return typographyContentColor;
79
+ };
80
+ var getTextStyleColor = function (color) {
81
+ if (color) {
82
+ if (!utils_isTypographyColor.isTypographyColor(color)) {
83
+ return { color: color };
84
+ }
85
+ return {};
86
+ }
87
+ return tslib.__assign({}, (!typographyContentColor && { color: contentColor }));
88
+ };
54
89
  var renderTitleString = function () {
55
- return consts.SIZES[size] > 64 ? (React__default.default.createElement(coreComponentsTypography.TitleMobile, { className: cn__default.default(styles.typography, styles.title), color: isCompleteTextColor ? completeTextColor : typographyContentColor, tag: 'div', font: 'system', view: consts.VIEW_TITLE[size], style: tslib.__assign({}, (!typographyContentColor && { color: contentColor })) }, titleContent)) : (React__default.default.createElement(coreComponentsTypography.Text, { className: styles.title, color: isCompleteTextColor ? completeTextColor : typographyContentColor, tag: 'div', weight: 'bold', view: consts.VIEW_TEXT[size], style: tslib.__assign({}, (!typographyContentColor && { color: contentColor })) }, titleContent));
90
+ return consts.SIZES[size] > 64 ? (React__default.default.createElement(coreComponentsTypography.TitleMobile, { className: cn__default.default(styles.typography, styles.title), color: getTextColor(titleColor), tag: 'div', font: 'system', view: consts.VIEW_TITLE[size], style: tslib.__assign({}, getTextStyleColor(titleColor)), dataTestId: coreComponentsShared.getDataTestId(dataTestId, 'title') }, titleContent)) : (React__default.default.createElement(coreComponentsTypography.Text, { className: styles.title, color: getTextColor(titleColor), tag: 'div', weight: 'bold', view: consts.VIEW_TEXT[size], style: tslib.__assign({}, getTextStyleColor(titleColor)), dataTestId: coreComponentsShared.getDataTestId(dataTestId, 'title') }, titleContent));
56
91
  };
57
92
  var renderTitle = function () { return (typeof title === 'string' ? renderTitleString() : titleContent); };
58
93
  var renderSubTitle = function () {
59
- return typeof subtitle === 'string' ? (React__default.default.createElement(coreComponentsTypography.Text, { tag: 'div', className: styles.subtitle, color: isCompleteTextColor ? completeTextColor : typographyContentColor, view: 'primary-small', style: tslib.__assign({}, (!typographyContentColor && { color: contentColor })) }, subtitleContent)) : (subtitleContent);
94
+ return typeof subtitle === 'string' ? (React__default.default.createElement(coreComponentsTypography.Text, { tag: 'div', className: styles.subtitle, color: getTextColor(subtitleColor), view: 'primary-small', dataTestId: coreComponentsShared.getDataTestId(dataTestId, 'subtitle'), style: tslib.__assign({}, getTextStyleColor(subtitleColor)) }, subtitleContent)) : (subtitleContent);
60
95
  };
61
96
  var renderIcon = function () {
62
97
  var _a;
@@ -75,10 +110,10 @@ var CircularProgressBar = function (_a) {
75
110
  React__default.default.createElement("svg", { viewBox: "0 0 ".concat(memorized.widthSVG, " ").concat(memorized.heightSVG), className: styles.svg, xmlns: 'http://www.w3.org/2000/svg' },
76
111
  React__default.default.createElement("circle", { className: cn__default.default(styles.backgroundCircle, styles[consts.SIZE_TO_CLASSNAME_MAP[size]], (_c = {},
77
112
  _c[styles.stroke] = !stroke,
78
- _c)), style: tslib.__assign({}, (strokeColor && stroke && { stroke: strokeColor })), cx: memorized.center, cy: memorized.center, r: memorized.radius, strokeWidth: consts.STROKE[size] }),
113
+ _c)), style: tslib.__assign({}, (strokeColor && stroke && { stroke: strokeColor })), cx: memorized.center, cy: memorized.center, r: memorized.radius, strokeWidth: consts.STROKE[size], "data-test-id": coreComponentsShared.getDataTestId(dataTestId, 'circle-progress-bar') }),
79
114
  React__default.default.createElement("circle", { className: cn__default.default(styles.progressCircle, styles[view], styles[consts.SIZE_TO_CLASSNAME_MAP[size]]), style: tslib.__assign({}, (progressStrokeColor && { stroke: progressStrokeColor })), cx: memorized.center, cy: memorized.center, r: memorized.radius, strokeWidth: consts.STROKE[size], strokeDasharray: memorized.strokeDasharray, strokeDashoffset: direction === 'counter-clockwise'
80
115
  ? -memorized.strokeDashoffset
81
- : memorized.strokeDashoffset, transform: "rotate(".concat(-90, " ").concat(memorized.center, " ").concat(memorized.center, ")") })),
116
+ : memorized.strokeDashoffset, transform: "rotate(".concat(-90, " ").concat(memorized.center, " ").concat(memorized.center, ")"), "data-test-id": coreComponentsShared.getDataTestId(dataTestId, 'circle-progress-value') })),
82
117
  React__default.default.createElement("div", { className: cn__default.default(styles.labelWrapper, (_d = {},
83
118
  _d[styles.label] = Icon || IconComplete,
84
119
  _d)) }, children || renderContent())));
package/consts.d.ts CHANGED
@@ -9,6 +9,7 @@ declare const SIZES: {
9
9
  48: number;
10
10
  64: number;
11
11
  80: number;
12
+ 96: number;
12
13
  128: number;
13
14
  144: number;
14
15
  };
@@ -23,6 +24,7 @@ declare const STROKE: {
23
24
  48: number;
24
25
  64: number;
25
26
  80: number;
27
+ 96: number;
26
28
  128: number;
27
29
  144: number;
28
30
  };
@@ -37,6 +39,7 @@ declare const VIEW_TITLE: {
37
39
  readonly 48: "small";
38
40
  readonly 64: "small";
39
41
  readonly 80: "xsmall";
42
+ readonly 96: "xsmall";
40
43
  readonly 128: "medium";
41
44
  readonly 144: "medium";
42
45
  };
@@ -51,6 +54,7 @@ declare const VIEW_TEXT: {
51
54
  readonly 48: "secondary-small";
52
55
  readonly 64: "secondary-large";
53
56
  readonly 80: "secondary-large";
57
+ readonly 96: "secondary-large";
54
58
  readonly 128: "secondary-large";
55
59
  readonly 144: "secondary-large";
56
60
  };
@@ -66,7 +70,11 @@ declare const SIZE_TO_CLASSNAME_MAP: {
66
70
  48: string;
67
71
  64: string;
68
72
  80: string;
73
+ 96: string;
69
74
  128: string;
70
75
  144: string;
71
76
  };
72
- export { SIZES, STROKE, VIEW_TITLE, VIEW_TEXT, TYPOGRAPHY_COLOR, SIZE_TO_CLASSNAME_MAP };
77
+ declare const MAX_PROGRESS_VALUE = 100;
78
+ declare const MIN_TIMER_VALUE = 0;
79
+ declare const MAX_TIMER_VALUE = 3599;
80
+ export { SIZES, STROKE, VIEW_TITLE, VIEW_TEXT, TYPOGRAPHY_COLOR, SIZE_TO_CLASSNAME_MAP, MAX_PROGRESS_VALUE, MIN_TIMER_VALUE, MAX_TIMER_VALUE };
package/consts.js CHANGED
@@ -13,6 +13,7 @@ var SIZES = {
13
13
  48: 48,
14
14
  64: 64,
15
15
  80: 80,
16
+ 96: 96,
16
17
  128: 128,
17
18
  144: 144,
18
19
  };
@@ -27,6 +28,7 @@ var STROKE = {
27
28
  48: 4,
28
29
  64: 6,
29
30
  80: 8,
31
+ 96: 8,
30
32
  128: 10,
31
33
  144: 12,
32
34
  };
@@ -41,6 +43,7 @@ var VIEW_TITLE = {
41
43
  48: 'small',
42
44
  64: 'small',
43
45
  80: 'xsmall',
46
+ 96: 'xsmall',
44
47
  128: 'medium',
45
48
  144: 'medium',
46
49
  };
@@ -55,6 +58,7 @@ var VIEW_TEXT = {
55
58
  48: 'secondary-small',
56
59
  64: 'secondary-large',
57
60
  80: 'secondary-large',
61
+ 96: 'secondary-large',
58
62
  128: 'secondary-large',
59
63
  144: 'secondary-large',
60
64
  };
@@ -70,10 +74,17 @@ var SIZE_TO_CLASSNAME_MAP = {
70
74
  48: 'size-48',
71
75
  64: 'size-64',
72
76
  80: 'size-80',
77
+ 96: 'size-96',
73
78
  128: 'size-128',
74
79
  144: 'size-144',
75
80
  };
81
+ var MAX_PROGRESS_VALUE = 100;
82
+ var MIN_TIMER_VALUE = 0;
83
+ var MAX_TIMER_VALUE = 3599;
76
84
 
85
+ exports.MAX_PROGRESS_VALUE = MAX_PROGRESS_VALUE;
86
+ exports.MAX_TIMER_VALUE = MAX_TIMER_VALUE;
87
+ exports.MIN_TIMER_VALUE = MIN_TIMER_VALUE;
77
88
  exports.SIZES = SIZES;
78
89
  exports.SIZE_TO_CLASSNAME_MAP = SIZE_TO_CLASSNAME_MAP;
79
90
  exports.STROKE = STROKE;
@@ -1,12 +1,27 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { ElementType, ReactNode } from "react";
4
- type TypographyColor = 'primary' | 'secondary' | 'tertiary' | 'positive' | 'negative';
4
+ import { ComponentSize } from "./types/component-size";
5
+ import { TypographyColor } from "./types/typography-color";
5
6
  type CircularProgressBarProps = {
6
7
  /**
7
8
  * Уровень прогресса, %
8
9
  */
9
- value: number;
10
+ value: number | {
11
+ /**
12
+ * Время таймера в секундах
13
+ * Минимальное значение 0
14
+ * Максимальное значение 3600
15
+ */
16
+ timer: number;
17
+ /**
18
+ * Направлние отсчета таймера
19
+ * forward: считаем от 0 до указанного значения
20
+ * backward: считаем от указанного значения до 0
21
+ * @default backward
22
+ */
23
+ counting?: 'forward' | 'backward';
24
+ };
10
25
  /**
11
26
  * Дополнительный класс
12
27
  */
@@ -19,6 +34,16 @@ type CircularProgressBarProps = {
19
34
  * Цвет контента
20
35
  */
21
36
  contentColor?: TypographyColor | string;
37
+ /**
38
+ * Цвет заголовка
39
+ * Приоритет выше чем у `contentColor`
40
+ */
41
+ titleColor?: TypographyColor | string;
42
+ /**
43
+ * Цвет подзаголовка
44
+ * Приоритет выше чем у `contentColor`
45
+ */
46
+ subtitleColor?: TypographyColor | string;
22
47
  /**
23
48
  * Дополнительный текст
24
49
  */
@@ -37,9 +62,10 @@ type CircularProgressBarProps = {
37
62
  view?: 'positive' | 'negative';
38
63
  /**
39
64
  * Размер (xxl — 144×144px, xl — 128×128px, l — 80×80px, m — 64×64px, s — 48×48px, xs — 24×24px)
40
- * @description xs, s, m, l, xl, xxl deprecated, используйте вместо них 24, 48, 64 , 80, 128, 144 соответственно
65
+ * @description xs, s, m, l, xl, xxl deprecated, используйте вместо них 24, 48, 64, 80, 128, 144 соответственно
66
+ * @default 64
41
67
  */
42
- size?: 'xxl' | 'xl' | 'l' | 'm' | 's' | 'xs' | 24 | 48 | 64 | 80 | 128 | 144;
68
+ size?: ComponentSize;
43
69
  /**
44
70
  * Наличие желоба
45
71
  */
@@ -103,9 +129,14 @@ type CircularProgressBarProps = {
103
129
  * Цвет желоба
104
130
  */
105
131
  strokeColor?: string;
132
+ /**
133
+ * Направление заполнения круга
134
+ * @default desc
135
+ */
136
+ directionType?: 'asc' | 'desc';
106
137
  };
107
138
  /**
108
139
  * Компонент круглого прогресс бара.
109
140
  */
110
141
  declare const CircularProgressBar: React.FC<CircularProgressBarProps>;
111
- export { TypographyColor, CircularProgressBarProps, CircularProgressBar };
142
+ export { CircularProgressBarProps, CircularProgressBar };
package/cssm/Component.js CHANGED
@@ -5,8 +5,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib = require('tslib');
6
6
  var React = require('react');
7
7
  var cn = require('classnames');
8
+ var coreComponentsShared = require('@alfalab/core-components-shared/cssm');
8
9
  var coreComponentsTypography = require('@alfalab/core-components-typography/cssm');
10
+ var utils_isTypographyColor = require('./utils/is-typography-color.js');
9
11
  var consts = require('./consts.js');
12
+ var useTimer = require('./use-timer.js');
10
13
  var styles = require('./index.module.css');
11
14
 
12
15
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
@@ -20,7 +23,21 @@ var styles__default = /*#__PURE__*/_interopDefaultCompat(styles);
20
23
  */
21
24
  var CircularProgressBar = function (_a) {
22
25
  var _b, _c, _d;
23
- var value = _a.value, _e = _a.view, view = _e === void 0 ? 'positive' : _e, _f = _a.size, size = _f === void 0 ? 64 : _f, className = _a.className, dataTestId = _a.dataTestId, _g = _a.title, title = _g === void 0 ? value ? value.toString() : '0' : _g, titleComplete = _a.titleComplete, subtitle = _a.subtitle, _h = _a.contentColor, contentColor = _h === void 0 ? 'secondary' : _h, subtitleComplete = _a.subtitleComplete, _j = _a.stroke, stroke = _j === void 0 ? true : _j, fillComplete = _a.fillComplete, Icon = _a.icon, IconComplete = _a.iconComplete, completeTextColor = _a.completeTextColor, _k = _a.completeIconColor, completeIconColor = _k === void 0 ? 'tertiary' : _k, _l = _a.direction, direction = _l === void 0 ? 'clockwise' : _l, height = _a.height, children = _a.children, progressStrokeColor = _a.progressStrokeColor, circleColor = _a.circleColor, strokeColor = _a.strokeColor;
26
+ var _e;
27
+ var valueFromProps = _a.value, _f = _a.view, view = _f === void 0 ? 'positive' : _f, _g = _a.size, size = _g === void 0 ? 64 : _g, className = _a.className, dataTestId = _a.dataTestId, _h = _a.title, titleFromProps = _h === void 0 ? coreComponentsShared.isObject(valueFromProps) ? null : "".concat(valueFromProps) : _h, titleComplete = _a.titleComplete, subtitle = _a.subtitle, _j = _a.contentColor, contentColor = _j === void 0 ? 'secondary' : _j, subtitleComplete = _a.subtitleComplete, _k = _a.stroke, stroke = _k === void 0 ? true : _k, fillComplete = _a.fillComplete, Icon = _a.icon, IconComplete = _a.iconComplete, completeTextColor = _a.completeTextColor, _l = _a.completeIconColor, completeIconColor = _l === void 0 ? 'tertiary' : _l, _m = _a.direction, direction = _m === void 0 ? 'clockwise' : _m, height = _a.height, children = _a.children, progressStrokeColor = _a.progressStrokeColor, circleColor = _a.circleColor, strokeColor = _a.strokeColor, _o = _a.directionType, directionType = _o === void 0 ? 'asc' : _o, titleColor = _a.titleColor, subtitleColor = _a.subtitleColor;
28
+ var isTimer = coreComponentsShared.isObject(valueFromProps);
29
+ var _p = useTimer.useTimer(isTimer ? Math.min(Math.max(valueFromProps.timer, consts.MIN_TIMER_VALUE), consts.MAX_TIMER_VALUE) : -1, isTimer, isTimer ? (_e = valueFromProps.counting) !== null && _e !== void 0 ? _e : 'backward' : 'backward'), timerValue = _p[0], timerTitle = _p[1];
30
+ var value;
31
+ var title;
32
+ if (isTimer) {
33
+ value = timerValue;
34
+ title = timerTitle;
35
+ }
36
+ else {
37
+ value = valueFromProps;
38
+ title = titleFromProps;
39
+ }
40
+ value = directionType === 'desc' ? consts.MAX_PROGRESS_VALUE - value : value;
24
41
  var memorized = React.useMemo(function () {
25
42
  var strokeWidth = consts.STROKE[size];
26
43
  var maxProgress = 100;
@@ -41,7 +58,7 @@ var CircularProgressBar = function (_a) {
41
58
  strokeDasharray: strokeDasharray,
42
59
  strokeDashoffset: strokeDashoffset,
43
60
  };
44
- }, [value, size]);
61
+ }, [size, value]);
45
62
  var isComplete = value === 100;
46
63
  var isCompleteTextColor = isComplete && completeTextColor;
47
64
  var titleContent = titleComplete && isComplete ? titleComplete : title;
@@ -50,12 +67,30 @@ var CircularProgressBar = function (_a) {
50
67
  var typographyContentColor = consts.TYPOGRAPHY_COLOR.includes(contentColor)
51
68
  ? contentColor
52
69
  : undefined;
70
+ var getTextColor = function (color) {
71
+ if (isCompleteTextColor) {
72
+ return completeTextColor;
73
+ }
74
+ if (color) {
75
+ return utils_isTypographyColor.isTypographyColor(color) ? color : undefined;
76
+ }
77
+ return typographyContentColor;
78
+ };
79
+ var getTextStyleColor = function (color) {
80
+ if (color) {
81
+ if (!utils_isTypographyColor.isTypographyColor(color)) {
82
+ return { color: color };
83
+ }
84
+ return {};
85
+ }
86
+ return tslib.__assign({}, (!typographyContentColor && { color: contentColor }));
87
+ };
53
88
  var renderTitleString = function () {
54
- return consts.SIZES[size] > 64 ? (React__default.default.createElement(coreComponentsTypography.TitleMobile, { className: cn__default.default(styles__default.default.typography, styles__default.default.title), color: isCompleteTextColor ? completeTextColor : typographyContentColor, tag: 'div', font: 'system', view: consts.VIEW_TITLE[size], style: tslib.__assign({}, (!typographyContentColor && { color: contentColor })) }, titleContent)) : (React__default.default.createElement(coreComponentsTypography.Text, { className: styles__default.default.title, color: isCompleteTextColor ? completeTextColor : typographyContentColor, tag: 'div', weight: 'bold', view: consts.VIEW_TEXT[size], style: tslib.__assign({}, (!typographyContentColor && { color: contentColor })) }, titleContent));
89
+ return consts.SIZES[size] > 64 ? (React__default.default.createElement(coreComponentsTypography.TitleMobile, { className: cn__default.default(styles__default.default.typography, styles__default.default.title), color: getTextColor(titleColor), tag: 'div', font: 'system', view: consts.VIEW_TITLE[size], style: tslib.__assign({}, getTextStyleColor(titleColor)), dataTestId: coreComponentsShared.getDataTestId(dataTestId, 'title') }, titleContent)) : (React__default.default.createElement(coreComponentsTypography.Text, { className: styles__default.default.title, color: getTextColor(titleColor), tag: 'div', weight: 'bold', view: consts.VIEW_TEXT[size], style: tslib.__assign({}, getTextStyleColor(titleColor)), dataTestId: coreComponentsShared.getDataTestId(dataTestId, 'title') }, titleContent));
55
90
  };
56
91
  var renderTitle = function () { return (typeof title === 'string' ? renderTitleString() : titleContent); };
57
92
  var renderSubTitle = function () {
58
- return typeof subtitle === 'string' ? (React__default.default.createElement(coreComponentsTypography.Text, { tag: 'div', className: styles__default.default.subtitle, color: isCompleteTextColor ? completeTextColor : typographyContentColor, view: 'primary-small', style: tslib.__assign({}, (!typographyContentColor && { color: contentColor })) }, subtitleContent)) : (subtitleContent);
93
+ return typeof subtitle === 'string' ? (React__default.default.createElement(coreComponentsTypography.Text, { tag: 'div', className: styles__default.default.subtitle, color: getTextColor(subtitleColor), view: 'primary-small', dataTestId: coreComponentsShared.getDataTestId(dataTestId, 'subtitle'), style: tslib.__assign({}, getTextStyleColor(subtitleColor)) }, subtitleContent)) : (subtitleContent);
59
94
  };
60
95
  var renderIcon = function () {
61
96
  var _a;
@@ -74,10 +109,10 @@ var CircularProgressBar = function (_a) {
74
109
  React__default.default.createElement("svg", { viewBox: "0 0 ".concat(memorized.widthSVG, " ").concat(memorized.heightSVG), className: styles__default.default.svg, xmlns: 'http://www.w3.org/2000/svg' },
75
110
  React__default.default.createElement("circle", { className: cn__default.default(styles__default.default.backgroundCircle, styles__default.default[consts.SIZE_TO_CLASSNAME_MAP[size]], (_c = {},
76
111
  _c[styles__default.default.stroke] = !stroke,
77
- _c)), style: tslib.__assign({}, (strokeColor && stroke && { stroke: strokeColor })), cx: memorized.center, cy: memorized.center, r: memorized.radius, strokeWidth: consts.STROKE[size] }),
112
+ _c)), style: tslib.__assign({}, (strokeColor && stroke && { stroke: strokeColor })), cx: memorized.center, cy: memorized.center, r: memorized.radius, strokeWidth: consts.STROKE[size], "data-test-id": coreComponentsShared.getDataTestId(dataTestId, 'circle-progress-bar') }),
78
113
  React__default.default.createElement("circle", { className: cn__default.default(styles__default.default.progressCircle, styles__default.default[view], styles__default.default[consts.SIZE_TO_CLASSNAME_MAP[size]]), style: tslib.__assign({}, (progressStrokeColor && { stroke: progressStrokeColor })), cx: memorized.center, cy: memorized.center, r: memorized.radius, strokeWidth: consts.STROKE[size], strokeDasharray: memorized.strokeDasharray, strokeDashoffset: direction === 'counter-clockwise'
79
114
  ? -memorized.strokeDashoffset
80
- : memorized.strokeDashoffset, transform: "rotate(".concat(-90, " ").concat(memorized.center, " ").concat(memorized.center, ")") })),
115
+ : memorized.strokeDashoffset, transform: "rotate(".concat(-90, " ").concat(memorized.center, " ").concat(memorized.center, ")"), "data-test-id": coreComponentsShared.getDataTestId(dataTestId, 'circle-progress-value') })),
81
116
  React__default.default.createElement("div", { className: cn__default.default(styles__default.default.labelWrapper, (_d = {},
82
117
  _d[styles__default.default.label] = Icon || IconComplete,
83
118
  _d)) }, children || renderContent())));
package/cssm/consts.d.ts CHANGED
@@ -9,6 +9,7 @@ declare const SIZES: {
9
9
  48: number;
10
10
  64: number;
11
11
  80: number;
12
+ 96: number;
12
13
  128: number;
13
14
  144: number;
14
15
  };
@@ -23,6 +24,7 @@ declare const STROKE: {
23
24
  48: number;
24
25
  64: number;
25
26
  80: number;
27
+ 96: number;
26
28
  128: number;
27
29
  144: number;
28
30
  };
@@ -37,6 +39,7 @@ declare const VIEW_TITLE: {
37
39
  readonly 48: "small";
38
40
  readonly 64: "small";
39
41
  readonly 80: "xsmall";
42
+ readonly 96: "xsmall";
40
43
  readonly 128: "medium";
41
44
  readonly 144: "medium";
42
45
  };
@@ -51,6 +54,7 @@ declare const VIEW_TEXT: {
51
54
  readonly 48: "secondary-small";
52
55
  readonly 64: "secondary-large";
53
56
  readonly 80: "secondary-large";
57
+ readonly 96: "secondary-large";
54
58
  readonly 128: "secondary-large";
55
59
  readonly 144: "secondary-large";
56
60
  };
@@ -66,7 +70,11 @@ declare const SIZE_TO_CLASSNAME_MAP: {
66
70
  48: string;
67
71
  64: string;
68
72
  80: string;
73
+ 96: string;
69
74
  128: string;
70
75
  144: string;
71
76
  };
72
- export { SIZES, STROKE, VIEW_TITLE, VIEW_TEXT, TYPOGRAPHY_COLOR, SIZE_TO_CLASSNAME_MAP };
77
+ declare const MAX_PROGRESS_VALUE = 100;
78
+ declare const MIN_TIMER_VALUE = 0;
79
+ declare const MAX_TIMER_VALUE = 3599;
80
+ export { SIZES, STROKE, VIEW_TITLE, VIEW_TEXT, TYPOGRAPHY_COLOR, SIZE_TO_CLASSNAME_MAP, MAX_PROGRESS_VALUE, MIN_TIMER_VALUE, MAX_TIMER_VALUE };
package/cssm/consts.js CHANGED
@@ -13,6 +13,7 @@ var SIZES = {
13
13
  48: 48,
14
14
  64: 64,
15
15
  80: 80,
16
+ 96: 96,
16
17
  128: 128,
17
18
  144: 144,
18
19
  };
@@ -27,6 +28,7 @@ var STROKE = {
27
28
  48: 4,
28
29
  64: 6,
29
30
  80: 8,
31
+ 96: 8,
30
32
  128: 10,
31
33
  144: 12,
32
34
  };
@@ -41,6 +43,7 @@ var VIEW_TITLE = {
41
43
  48: 'small',
42
44
  64: 'small',
43
45
  80: 'xsmall',
46
+ 96: 'xsmall',
44
47
  128: 'medium',
45
48
  144: 'medium',
46
49
  };
@@ -55,6 +58,7 @@ var VIEW_TEXT = {
55
58
  48: 'secondary-small',
56
59
  64: 'secondary-large',
57
60
  80: 'secondary-large',
61
+ 96: 'secondary-large',
58
62
  128: 'secondary-large',
59
63
  144: 'secondary-large',
60
64
  };
@@ -70,10 +74,17 @@ var SIZE_TO_CLASSNAME_MAP = {
70
74
  48: 'size-48',
71
75
  64: 'size-64',
72
76
  80: 'size-80',
77
+ 96: 'size-96',
73
78
  128: 'size-128',
74
79
  144: 'size-144',
75
80
  };
81
+ var MAX_PROGRESS_VALUE = 100;
82
+ var MIN_TIMER_VALUE = 0;
83
+ var MAX_TIMER_VALUE = 3599;
76
84
 
85
+ exports.MAX_PROGRESS_VALUE = MAX_PROGRESS_VALUE;
86
+ exports.MAX_TIMER_VALUE = MAX_TIMER_VALUE;
87
+ exports.MIN_TIMER_VALUE = MIN_TIMER_VALUE;
77
88
  exports.SIZES = SIZES;
78
89
  exports.SIZE_TO_CLASSNAME_MAP = SIZE_TO_CLASSNAME_MAP;
79
90
  exports.STROKE = STROKE;
package/cssm/index.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export * from "./Component";
2
+ export * from "./types/typography-color";
@@ -23,7 +23,10 @@
23
23
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
24
24
 
25
25
  /* новые значения, используйте их */
26
- --gap-0: 0;
26
+
27
+ /* no-unit может приводить к проблемам в calc (#1559) */
28
+ /* stylelint-disable-next-line length-zero-no-unit */
29
+ --gap-0: 0px;
27
30
  } :root {
28
31
  --font-family-system: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Helvetica,
29
32
  sans-serif;
@@ -92,6 +95,13 @@
92
95
  max-width: 108px;
93
96
  } .size-128 .title {
94
97
  max-height: 32px;
98
+ } .size-96 {
99
+ width: 96px;
100
+ height: 96px
101
+ } .size-96 .labelWrapper {
102
+ max-width: 64px;
103
+ } .size-96 .title {
104
+ max-height: 20px;
95
105
  } .size-80 {
96
106
  width: 80px;
97
107
  height: 80px
@@ -145,6 +155,9 @@
145
155
  } .iconWrapper.size-128 {
146
156
  max-width: 64px;
147
157
  max-height: 64px;
158
+ } .iconWrapper.size-96 {
159
+ max-width: 48px;
160
+ max-height: 48px;
148
161
  } .iconWrapper.size-80 {
149
162
  max-width: 48px;
150
163
  max-height: 48px;
@@ -0,0 +1 @@
1
+ export { getCircularProgressBarTestIds } from "../utils/get-circular-progress-bar-test-ids";
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var utils_getCircularProgressBarTestIds = require('../utils/get-circular-progress-bar-test-ids.js');
6
+
7
+
8
+
9
+ exports.getCircularProgressBarTestIds = utils_getCircularProgressBarTestIds.getCircularProgressBarTestIds;
@@ -0,0 +1,2 @@
1
+ type ComponentSize = 'xxl' | 'xl' | 'l' | 'm' | 's' | 'xs' | 24 | 48 | 64 | 80 | 128 | 144;
2
+ export { ComponentSize };
@@ -0,0 +1,2 @@
1
+ 'use strict';
2
+
@@ -0,0 +1,2 @@
1
+ type TypographyColor = 'primary' | 'secondary' | 'tertiary' | 'positive' | 'negative';
2
+ export { TypographyColor };
@@ -0,0 +1,2 @@
1
+ 'use strict';
2
+
@@ -0,0 +1,2 @@
1
+ declare function useTimer(time: number, active: boolean | undefined, counting: 'forward' | 'backward', interval?: number, step?: number): [value: number, title: string];
2
+ export { useTimer };