@sima-land/ui-nucleons 40.3.0 → 41.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/arrow-button/index.d.ts +1 -0
- package/avatar/user.d.ts +1 -0
- package/card/index.d.ts +1 -0
- package/chips/index.d.ts +5 -14
- package/chips/index.js +24 -9
- package/chips/item.d.ts +15 -0
- package/chips/item.js +20 -0
- package/dot-nav/index.d.ts +1 -0
- package/hooks/index.d.ts +2 -1
- package/hooks/index.js +9 -7
- package/no-index-mark/index.d.ts +1 -0
- package/package.json +39 -39
- package/pagination/utils.d.ts +1 -1
- package/price/index.d.ts +1 -0
- package/readme.md +6 -6
- package/screen/index.d.ts +12 -47
- package/screen/index.js +30 -65
- package/screen/screen.module.scss +16 -15
- package/screen/slots.d.ts +32 -0
- package/screen/slots.js +64 -0
- package/screen/utils.d.ts +1 -2
- package/side-page/index.d.ts +15 -2
- package/side-page/index.js +2 -2
- package/super-ellipse-clip-path/index.d.ts +1 -0
- package/tabs/index.d.ts +32 -25
- package/tabs/index.js +30 -24
- package/tabs/tabs.module.scss +21 -19
- package/screen/screen-layout.d.ts +0 -57
- package/screen/screen-layout.js +0 -116
package/arrow-button/index.d.ts
CHANGED
package/avatar/user.d.ts
CHANGED
package/card/index.d.ts
CHANGED
package/chips/index.d.ts
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
interface ChipsItem {
|
|
3
|
-
href?: string;
|
|
4
|
-
children?: React.ReactNode;
|
|
5
|
-
withCross?: boolean;
|
|
6
|
-
target?: string;
|
|
7
|
-
[x: string]: any;
|
|
8
|
-
}
|
|
9
2
|
export interface ChipsProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
10
3
|
/** Элементы списка. */
|
|
11
|
-
|
|
12
|
-
/** Сработает при клике на элемент. */
|
|
13
|
-
onItemClick?: (item: ChipsItem, event: React.MouseEvent<HTMLAnchorElement>) => void;
|
|
14
|
-
/** Определит, отмечен ли переданный элемент. */
|
|
15
|
-
isItemChecked?: (item: ChipsItem, index: number) => boolean;
|
|
4
|
+
children: React.ReactNode;
|
|
16
5
|
/** Идентификатор для систем автоматизированного тестирования. */
|
|
17
6
|
'data-testid'?: string;
|
|
18
7
|
}
|
|
@@ -21,5 +10,7 @@ export interface ChipsProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
21
10
|
* @param props Свойства.
|
|
22
11
|
* @return Элемент.
|
|
23
12
|
*/
|
|
24
|
-
export declare const Chips:
|
|
25
|
-
|
|
13
|
+
export declare const Chips: {
|
|
14
|
+
({ children, className, "data-testid": testId, ...restProps }: ChipsProps): JSX.Element;
|
|
15
|
+
Item: ({ href, children, withCross, target, onClick, checked, }: import("./item").ChipsItemProps) => JSX.Element;
|
|
16
|
+
};
|
package/chips/index.js
CHANGED
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
2
21
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
22
|
var t = {};
|
|
4
23
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -15,9 +34,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
15
34
|
};
|
|
16
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
36
|
exports.Chips = void 0;
|
|
18
|
-
const react_1 =
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const item_1 = require("./item");
|
|
19
39
|
const bind_1 = __importDefault(require("classnames/bind"));
|
|
20
|
-
const cross_1 = __importDefault(require("@sima-land/ui-quarks/icons/16x16/Stroked/cross"));
|
|
21
40
|
const chips_module_scss_1 = __importDefault(require("./chips.module.scss"));
|
|
22
41
|
const cx = bind_1.default.bind(chips_module_scss_1.default);
|
|
23
42
|
/**
|
|
@@ -26,12 +45,8 @@ const cx = bind_1.default.bind(chips_module_scss_1.default);
|
|
|
26
45
|
* @return Элемент.
|
|
27
46
|
*/
|
|
28
47
|
const Chips = (_a) => {
|
|
29
|
-
var {
|
|
30
|
-
return (react_1.default.createElement("div", Object.assign({}, restProps, { className: cx('list', className), "data-testid": testId }),
|
|
31
|
-
const { href, target, children, withCross } = item;
|
|
32
|
-
return (react_1.default.createElement("a", { href: href, role: href ? undefined : 'button', key: index, className: cx('item', (isItemChecked === null || isItemChecked === void 0 ? void 0 : isItemChecked(item, index)) && 'checked'), target: target, onClick: e => onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, e), "data-testid": 'chips:item' },
|
|
33
|
-
react_1.default.createElement("span", { className: chips_module_scss_1.default.text }, children),
|
|
34
|
-
withCross && react_1.default.createElement(cross_1.default, { className: cx('cross-svg') })));
|
|
35
|
-
})));
|
|
48
|
+
var { children, className, 'data-testid': testId = 'chips' } = _a, restProps = __rest(_a, ["children", "className", 'data-testid']);
|
|
49
|
+
return (react_1.default.createElement("div", Object.assign({}, restProps, { className: cx('list', className), "data-testid": testId }), react_1.Children.toArray(children).filter(c => (0, react_1.isValidElement)(c) && c.type === item_1.ChipsItem)));
|
|
36
50
|
};
|
|
37
51
|
exports.Chips = Chips;
|
|
52
|
+
exports.Chips.Item = item_1.ChipsItem;
|
package/chips/item.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface ChipsItemProps {
|
|
3
|
+
href?: string;
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
withCross?: boolean;
|
|
6
|
+
target?: string;
|
|
7
|
+
onClick?: React.MouseEventHandler<HTMLAnchorElement>;
|
|
8
|
+
checked?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Элемент списка "чипсов".
|
|
12
|
+
* @param props Свойства.
|
|
13
|
+
* @return Элемент.
|
|
14
|
+
*/
|
|
15
|
+
export declare const ChipsItem: ({ href, children, withCross, target, onClick, checked, }: ChipsItemProps) => JSX.Element;
|
package/chips/item.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ChipsItem = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const bind_1 = __importDefault(require("classnames/bind"));
|
|
9
|
+
const cross_1 = __importDefault(require("@sima-land/ui-quarks/icons/16x16/Stroked/cross"));
|
|
10
|
+
const chips_module_scss_1 = __importDefault(require("./chips.module.scss"));
|
|
11
|
+
const cx = bind_1.default.bind(chips_module_scss_1.default);
|
|
12
|
+
/**
|
|
13
|
+
* Элемент списка "чипсов".
|
|
14
|
+
* @param props Свойства.
|
|
15
|
+
* @return Элемент.
|
|
16
|
+
*/
|
|
17
|
+
const ChipsItem = ({ href, children, withCross, target, onClick, checked, }) => (react_1.default.createElement("a", { href: href, role: href ? undefined : 'button', className: cx('item', { checked }), target: target, onClick: onClick, "data-testid": 'chips:item' },
|
|
18
|
+
react_1.default.createElement("span", { className: chips_module_scss_1.default.text }, children),
|
|
19
|
+
withCross && react_1.default.createElement(cross_1.default, { className: cx('cross-svg') })));
|
|
20
|
+
exports.ChipsItem = ChipsItem;
|
package/dot-nav/index.d.ts
CHANGED
package/hooks/index.d.ts
CHANGED
|
@@ -10,11 +10,12 @@ export declare const useIsTouchDevice: () => boolean;
|
|
|
10
10
|
* @param options Опции.
|
|
11
11
|
* @param options.onFullScroll Сработает при событии полной прокрутки.
|
|
12
12
|
* @param options.threshold Отступ от конца списка по которому событие должно срабатывать.
|
|
13
|
+
* @param moreDeps Зависимости эффекта (нужны, когда ref заполняется не на этапе render'а).
|
|
13
14
|
*/
|
|
14
15
|
export declare const useInfiniteScroll: (ref: React.MutableRefObject<HTMLElement | undefined | null>, { onFullScroll, threshold, }: {
|
|
15
16
|
onFullScroll?: ((event: UIEvent) => void) | undefined;
|
|
16
17
|
threshold?: number | undefined;
|
|
17
|
-
}) => void;
|
|
18
|
+
}, moreDeps?: React.DependencyList | undefined) => void;
|
|
18
19
|
/**
|
|
19
20
|
* Запускает переданный обработчик при клике вне элемента.
|
|
20
21
|
* @param elementRef Ref элемента, клик вне которого нужно обработать.
|
package/hooks/index.js
CHANGED
|
@@ -8,6 +8,7 @@ const react_1 = require("react");
|
|
|
8
8
|
const is_touch_device_1 = require("../helpers/is-touch-device");
|
|
9
9
|
const lodash_1 = require("lodash");
|
|
10
10
|
const on_1 = __importDefault(require("../helpers/on"));
|
|
11
|
+
const identity_1 = require("./identity");
|
|
11
12
|
/**
|
|
12
13
|
* При монтировании проверяет, поддерживает ли устройство touch события.
|
|
13
14
|
* @return True - если поддерживает, false - если нет.
|
|
@@ -26,21 +27,22 @@ exports.useIsTouchDevice = useIsTouchDevice;
|
|
|
26
27
|
* @param options Опции.
|
|
27
28
|
* @param options.onFullScroll Сработает при событии полной прокрутки.
|
|
28
29
|
* @param options.threshold Отступ от конца списка по которому событие должно срабатывать.
|
|
30
|
+
* @param moreDeps Зависимости эффекта (нужны, когда ref заполняется не на этапе render'а).
|
|
29
31
|
*/
|
|
30
|
-
const useInfiniteScroll = (ref, { onFullScroll, threshold = 0, }) => {
|
|
32
|
+
const useInfiniteScroll = (ref, { onFullScroll, threshold = 0, }, moreDeps) => {
|
|
33
|
+
const callbackRef = (0, identity_1.useIdentityRef)(onFullScroll);
|
|
31
34
|
(0, react_1.useEffect)(() => {
|
|
32
|
-
const
|
|
35
|
+
const element = ref.current;
|
|
33
36
|
if (element) {
|
|
34
|
-
return (0, on_1.default)(element, 'scroll',
|
|
37
|
+
return (0, on_1.default)(element, 'scroll', event => {
|
|
38
|
+
var _a;
|
|
35
39
|
const { scrollTop, clientHeight, scrollHeight } = event.target;
|
|
36
40
|
const bottom = threshold + scrollTop + clientHeight;
|
|
37
41
|
const isFullyScrolled = bottom >= scrollHeight;
|
|
38
|
-
|
|
39
|
-
onFullScroll(event);
|
|
40
|
-
}
|
|
42
|
+
isFullyScrolled && ((_a = callbackRef.current) === null || _a === void 0 ? void 0 : _a.call(callbackRef, event));
|
|
41
43
|
});
|
|
42
44
|
}
|
|
43
|
-
}, [ref
|
|
45
|
+
}, [ref, threshold, ...(moreDeps || [])]);
|
|
44
46
|
};
|
|
45
47
|
exports.useInfiniteScroll = useInfiniteScroll;
|
|
46
48
|
/**
|
package/no-index-mark/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sima-land/ui-nucleons",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "41.0.0",
|
|
4
4
|
"repository": "ssh://git@github.com:sima-land/ui-nucleons.git",
|
|
5
5
|
"author": "www.sima-land.ru team",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -10,74 +10,74 @@
|
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@krutoo/input-mask": "^0.0.8",
|
|
13
|
-
"@sima-land/ui-quarks": "^2.0
|
|
14
|
-
"@types/body-scroll-lock": "^2.6.1",
|
|
13
|
+
"@sima-land/ui-quarks": "^2.2.0",
|
|
15
14
|
"body-scroll-lock": "3.1.5",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
15
|
+
"classnames": "^2.3.1",
|
|
16
|
+
"date-fns": "^2.26.0",
|
|
17
|
+
"intersection-observer": "^0.12.0",
|
|
18
18
|
"lodash": "^4.17.21",
|
|
19
19
|
"overlayscrollbars": "^1.13.1",
|
|
20
|
-
"overlayscrollbars-react": "^0.2.
|
|
20
|
+
"overlayscrollbars-react": "^0.2.3",
|
|
21
21
|
"react-transition-group": "^4.4.2"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@babel/core": "^7.
|
|
25
|
-
"@babel/plugin-proposal-class-properties": "^7.
|
|
26
|
-
"@babel/plugin-proposal-optional-chaining": "^7.
|
|
27
|
-
"@babel/preset-env": "^7.
|
|
28
|
-
"@babel/preset-react": "^7.
|
|
29
|
-
"@rushstack/eslint-patch": "^1.0
|
|
30
|
-
"@sima-land/linters": "^2.1.
|
|
24
|
+
"@babel/core": "^7.16.0",
|
|
25
|
+
"@babel/plugin-proposal-class-properties": "^7.16.0",
|
|
26
|
+
"@babel/plugin-proposal-optional-chaining": "^7.16.0",
|
|
27
|
+
"@babel/preset-env": "^7.16.4",
|
|
28
|
+
"@babel/preset-react": "^7.16.0",
|
|
29
|
+
"@rushstack/eslint-patch": "^1.1.0",
|
|
30
|
+
"@sima-land/linters": "^2.1.1",
|
|
31
31
|
"@storybook/addon-actions": "^6.3.12",
|
|
32
32
|
"@storybook/addon-backgrounds": "^6.3.12",
|
|
33
33
|
"@storybook/addon-docs": "^6.3.12",
|
|
34
34
|
"@storybook/addon-storysource": "^6.3.12",
|
|
35
35
|
"@storybook/addons": "^6.3.12",
|
|
36
|
+
"@storybook/builder-webpack5": "^6.3.12",
|
|
37
|
+
"@storybook/manager-webpack5": "^6.3.12",
|
|
36
38
|
"@storybook/react": "^6.3.12",
|
|
37
39
|
"@storybook/theming": "^6.3.12",
|
|
38
40
|
"@svgr/core": "^5.5.0",
|
|
39
41
|
"@svgr/plugin-svgo": "^5.5.0",
|
|
40
42
|
"@svgr/webpack": "^5.5.0",
|
|
41
|
-
"@testing-library/react": "^12.
|
|
42
|
-
"@types/
|
|
43
|
-
"@types/enzyme": "^3.10.
|
|
43
|
+
"@testing-library/react": "^12.1.2",
|
|
44
|
+
"@types/body-scroll-lock": "^3.1.0",
|
|
45
|
+
"@types/enzyme": "^3.10.10",
|
|
44
46
|
"@types/jest": "^27.0.2",
|
|
45
|
-
"@types/lodash": "^4.14.
|
|
46
|
-
"@types/react": "^17.0.
|
|
47
|
-
"@types/react-dom": "^17.0.
|
|
48
|
-
"@types/react-transition-group": "^4.4.
|
|
49
|
-
"@typescript-eslint/eslint-plugin": "^4.
|
|
50
|
-
"@typescript-eslint/parser": "^4.
|
|
51
|
-
"@wojtekmaj/enzyme-adapter-react-17": "^0.6.
|
|
52
|
-
"babel-loader": "^8.
|
|
47
|
+
"@types/lodash": "^4.14.177",
|
|
48
|
+
"@types/react": "^17.0.36",
|
|
49
|
+
"@types/react-dom": "^17.0.11",
|
|
50
|
+
"@types/react-transition-group": "^4.4.4",
|
|
51
|
+
"@typescript-eslint/eslint-plugin": "^5.4.0",
|
|
52
|
+
"@typescript-eslint/parser": "^5.4.0",
|
|
53
|
+
"@wojtekmaj/enzyme-adapter-react-17": "^0.6.5",
|
|
54
|
+
"babel-loader": "^8.2.3",
|
|
53
55
|
"babel-preset-jest": "^27.2.0",
|
|
54
|
-
"classnames": "^2.2.6",
|
|
55
56
|
"copyfiles": "^2.4.1",
|
|
56
|
-
"css-loader": "^5.
|
|
57
|
-
"del": "^4.1.1",
|
|
57
|
+
"css-loader": "^5.2.7",
|
|
58
58
|
"enzyme": "^3.9.0",
|
|
59
|
-
"enzyme-
|
|
60
|
-
"enzyme-to-json": "^3.3.5",
|
|
59
|
+
"enzyme-to-json": "^3.6.2",
|
|
61
60
|
"eslint": "^7.31.0",
|
|
62
61
|
"file-loader": "^6.2.0",
|
|
63
|
-
"husky": "^
|
|
62
|
+
"husky": "^7.0.4",
|
|
64
63
|
"identity-obj-proxy": "^3.0.0",
|
|
65
64
|
"jest": "^27.3.1",
|
|
66
65
|
"jest-css-modules-transform": "^4.3.0",
|
|
67
|
-
"lint-staged": "^
|
|
68
|
-
"
|
|
66
|
+
"lint-staged": "^12.1.2",
|
|
67
|
+
"postcss": "^8.3.11",
|
|
68
|
+
"prettier": "^2.4.1",
|
|
69
69
|
"react": "^17.0.2",
|
|
70
70
|
"react-docgen-typescript": "^2.1.1",
|
|
71
71
|
"react-dom": "^17.0.2",
|
|
72
72
|
"rimraf": "^3.0.2",
|
|
73
|
-
"sass": "^1.
|
|
73
|
+
"sass": "^1.43.4",
|
|
74
74
|
"sass-loader": "^10.1.0",
|
|
75
75
|
"style-loader": "^2.0.0",
|
|
76
|
-
"stylelint": "^
|
|
76
|
+
"stylelint": "^14.1.0",
|
|
77
77
|
"ts-jest": "^27.0.7",
|
|
78
|
-
"typescript": "^4.
|
|
79
|
-
"typescript-plugin-css-modules": "^3.
|
|
80
|
-
"webpack": "^5.
|
|
78
|
+
"typescript": "^4.5.2",
|
|
79
|
+
"typescript-plugin-css-modules": "^3.4.0",
|
|
80
|
+
"webpack": "^5.64.2"
|
|
81
81
|
},
|
|
82
82
|
"peerDependencies": {
|
|
83
83
|
"react": ">=17",
|
|
@@ -88,14 +88,14 @@
|
|
|
88
88
|
"build:before": "rimraf build",
|
|
89
89
|
"build:main": "tsc --project tsconfig.build.json",
|
|
90
90
|
"build:after": "node dist.js",
|
|
91
|
-
"build": "
|
|
91
|
+
"build": "npm run build:before && npm run build:main && npm run build:after",
|
|
92
92
|
"test": "jest",
|
|
93
93
|
"type-check": "tsc -p . --noEmit",
|
|
94
94
|
"coverage": "jest --clearCache && jest --coverage",
|
|
95
95
|
"lint:scripts": "eslint --cache src/ --ext .js,.jsx,.ts,.tsx",
|
|
96
96
|
"lint:styles": "stylelint 'src/**/*.{css,scss}'",
|
|
97
97
|
"storybook": "start-storybook -p 9009 -c .storybook",
|
|
98
|
-
"storybook:build": "build-storybook --
|
|
98
|
+
"storybook:build": "build-storybook --quiet --loglevel error -o build-storybook",
|
|
99
99
|
"prettier": "prettier --write \"./src/**/*.{js,jsx,ts,tsx,css,scss}\" --loglevel error",
|
|
100
100
|
"prettier:check": "prettier --check \"./src/**/*.{js,jsx,ts,tsx,css,scss}\" --loglevel error"
|
|
101
101
|
}
|
package/pagination/utils.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ declare type State = {
|
|
|
7
7
|
range: number;
|
|
8
8
|
total: number;
|
|
9
9
|
};
|
|
10
|
-
export declare const cx: import("classnames
|
|
10
|
+
export declare const cx: (...args: import("classnames").Argument[]) => string;
|
|
11
11
|
/**
|
|
12
12
|
* Фабрика объектов с данными о кнопке страницы.
|
|
13
13
|
* @param value Номер целевой страницы.
|
package/price/index.d.ts
CHANGED
package/readme.md
CHANGED
|
@@ -158,12 +158,12 @@ declare module '*.svg' {
|
|
|
158
158
|
- компонент интерфейса не должен иметь внешних отступов по умолчанию
|
|
159
159
|
|
|
160
160
|
### Консольные команды, необходимые в процессе разработки
|
|
161
|
-
* ```
|
|
162
|
-
* ```
|
|
163
|
-
* ```
|
|
164
|
-
* ```
|
|
165
|
-
* ```
|
|
166
|
-
* ```
|
|
161
|
+
* ```npm run build``` - сборка компонентов в `./build` для публикации
|
|
162
|
+
* ```npm run test``` - запуск тестов *Jest*
|
|
163
|
+
* ```npm run lint:scripts``` - запуск линтера *ESLint*
|
|
164
|
+
* ```npm run lint:styles``` - запуск линтера *styleLint*
|
|
165
|
+
* ```npm run type-check``` - Проверка типов TS
|
|
166
|
+
* ```npm run storybook``` - запуск *storybook*
|
|
167
167
|
|
|
168
168
|
### Структура библиотеки
|
|
169
169
|
|
package/screen/index.d.ts
CHANGED
|
@@ -1,64 +1,29 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { ScreenLayoutProps, CallbackData } from './screen-layout';
|
|
3
|
-
import { OrNil } from './utils';
|
|
4
2
|
import { LoadingOverlayProps } from '../loading-overlay';
|
|
5
|
-
interface AdvancedCallbackData extends CallbackData {
|
|
6
|
-
rootElement: OrNil<HTMLDivElement>;
|
|
7
|
-
}
|
|
8
3
|
export interface ScreenProps {
|
|
9
4
|
/** Содержимое. */
|
|
10
5
|
children?: React.ReactNode;
|
|
11
|
-
/** Реф контента. */
|
|
12
|
-
contentRef?: ScreenLayoutProps['childrenRef'];
|
|
13
|
-
/** Содержимое подвала. */
|
|
14
|
-
footer?: any;
|
|
15
|
-
/** Отступ от нижней границы для срабатывания onFullScroll. */
|
|
16
|
-
fullScrollThreshold?: number;
|
|
17
6
|
/** Нужно ли выводить вместо содержимого состояние загрузки. */
|
|
18
7
|
loading?: boolean;
|
|
19
8
|
/** Определяет область отображаемую как загружающуюся. */
|
|
20
9
|
loadingArea?: 'content' | 'full';
|
|
21
10
|
/** Свойства компонента LoadingOverlay. */
|
|
22
11
|
loadingOverlayProps?: LoadingOverlayProps;
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
/** Сработает при полной прокрутке контента. */
|
|
30
|
-
onFullScroll?: ScreenLayoutProps['onFullScroll'];
|
|
31
|
-
/** Подзаголовок. */
|
|
32
|
-
subtitle?: string;
|
|
33
|
-
/** Заголовок. */
|
|
34
|
-
title?: string;
|
|
35
|
-
/** Нужно ли выводить кнопку "назад". */
|
|
36
|
-
withBackButton?: boolean;
|
|
37
|
-
/** Нужно ли выводить закрывающий крест. */
|
|
38
|
-
withCloseButton?: boolean;
|
|
39
|
-
/** Нужно ли рисовать черту между шапкой и основным содержимым. */
|
|
40
|
-
withDivideHeader?: boolean;
|
|
41
|
-
/** Нужно ли выводить кнопку "назад". */
|
|
42
|
-
withHeader?: boolean;
|
|
43
|
-
/** Нужно ли выводить Layer (при SSR необходимо указать false). */
|
|
44
|
-
inPortal?: boolean;
|
|
12
|
+
/** Будет вызвана при полной прокрутке содержимого экрана. */
|
|
13
|
+
onFullScroll?: () => void;
|
|
14
|
+
/** Отступ от нижней границы содержимого экрана, после которого начинает срабатывать onFullScroll. */
|
|
15
|
+
fullScrollThreshold?: number;
|
|
16
|
+
/** Идентификатор для систем автоматизированного тестирования. */
|
|
17
|
+
'data-testid'?: string;
|
|
45
18
|
}
|
|
46
19
|
/**
|
|
47
20
|
* Экран.
|
|
48
21
|
* @param props Свойства.
|
|
49
22
|
* @return Элемент.
|
|
50
23
|
*/
|
|
51
|
-
export declare const Screen:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
export declare const setRefValue: (ref: React.RefCallback<any> | React.MutableRefObject<any>, value: any) => void;
|
|
58
|
-
/**
|
|
59
|
-
* Записывает полученный элемент в ref и отключает прокрутку.
|
|
60
|
-
* @param ref Ref-контейнер.
|
|
61
|
-
* @param element Элемент для записи.
|
|
62
|
-
*/
|
|
63
|
-
export declare const takeScrollableElement: (ref: React.MutableRefObject<OrNil<HTMLDivElement>>, element?: HTMLDivElement | null | undefined) => void;
|
|
64
|
-
export {};
|
|
24
|
+
export declare const Screen: {
|
|
25
|
+
({ children, loading, loadingArea, loadingOverlayProps, onFullScroll, fullScrollThreshold, "data-testid": testId, }: ScreenProps): JSX.Element;
|
|
26
|
+
Header: ({ divided, title, subtitle, buttons, onBack, onClose, ...restProps }: import("./slots").HeaderSlotProps) => JSX.Element;
|
|
27
|
+
Body: React.FC<{}>;
|
|
28
|
+
Footer: React.FC<{}>;
|
|
29
|
+
};
|
package/screen/index.js
CHANGED
|
@@ -18,80 +18,45 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
18
18
|
__setModuleDefault(result, mod);
|
|
19
19
|
return result;
|
|
20
20
|
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
21
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.
|
|
25
|
+
exports.Screen = void 0;
|
|
23
26
|
const react_1 = __importStar(require("react"));
|
|
24
|
-
const
|
|
25
|
-
const lodash_1 = require("lodash");
|
|
26
|
-
const screen_layout_1 = require("./screen-layout");
|
|
27
|
-
const utils_1 = require("./utils");
|
|
27
|
+
const slots_1 = require("./slots");
|
|
28
28
|
const loading_overlay_1 = require("../loading-overlay");
|
|
29
|
-
const
|
|
29
|
+
const body_scroll_1 = require("../_internal/body-scroll");
|
|
30
30
|
const layer_1 = require("../helpers/layer");
|
|
31
|
+
const define_slots_1 = require("../helpers/define-slots");
|
|
32
|
+
const hooks_1 = require("../hooks");
|
|
33
|
+
const screen_module_scss_1 = __importDefault(require("./screen.module.scss"));
|
|
31
34
|
/**
|
|
32
35
|
* Экран.
|
|
33
36
|
* @param props Свойства.
|
|
34
37
|
* @return Элемент.
|
|
35
38
|
*/
|
|
36
|
-
const Screen = ({ children,
|
|
37
|
-
const
|
|
39
|
+
const Screen = ({ children, loading, loadingArea = 'full', loadingOverlayProps, onFullScroll, fullScrollThreshold = 320, 'data-testid': testId = 'screen', }) => {
|
|
40
|
+
const fullLoading = loading && loadingArea === 'full';
|
|
38
41
|
const layer = (0, layer_1.useLayer)() + 300; // 300 из-за монолита
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
onBack({
|
|
56
|
-
rootElement: rootRef.current,
|
|
57
|
-
contentElement,
|
|
58
|
-
});
|
|
59
|
-
}, onClose: ({ contentElement }) => {
|
|
60
|
-
onClose &&
|
|
61
|
-
onClose({
|
|
62
|
-
rootElement: rootRef.current,
|
|
63
|
-
contentElement,
|
|
64
|
-
});
|
|
65
|
-
}, onFullScroll: onFullScroll, fullScrollThreshold: fullScrollThreshold, navBarProps: navBarProps }))))));
|
|
42
|
+
const { header, body, footer } = (0, define_slots_1.defineSlots)(children, {
|
|
43
|
+
header: slots_1.HeaderSlot,
|
|
44
|
+
body: slots_1.BodySlot,
|
|
45
|
+
footer: slots_1.FooterSlot,
|
|
46
|
+
});
|
|
47
|
+
// при блокировке прокрутки нужно передавать элемент которому нужно сохранить возможность прокрутки
|
|
48
|
+
// https://github.com/willmcpo/body-scroll-lock/blame/79c4cf2c956eb7d5cf8d54a03d12751bc6ac8aa3/README.md#L52
|
|
49
|
+
// поэтому используем внутренний ref и useImperativeHandle
|
|
50
|
+
const bodyRef = (0, react_1.useRef)(null);
|
|
51
|
+
(0, body_scroll_1.useBodyScrollLock)(bodyRef, true);
|
|
52
|
+
(0, hooks_1.useInfiniteScroll)(bodyRef, { onFullScroll, threshold: fullScrollThreshold });
|
|
53
|
+
return (react_1.default.createElement("div", { className: screen_module_scss_1.default.root, style: { zIndex: layer }, "data-testid": testId },
|
|
54
|
+
react_1.default.createElement(layer_1.LayerProvider, { value: layer },
|
|
55
|
+
!fullLoading && header,
|
|
56
|
+
react_1.default.createElement("div", { ref: bodyRef, className: screen_module_scss_1.default.body, "data-testid": 'screen:body' }, loading ? (react_1.default.createElement(loading_overlay_1.LoadingOverlay, Object.assign({}, loadingOverlayProps, { fill: false, style: { height: '100%' } }))) : (body)),
|
|
57
|
+
!fullLoading && footer && (react_1.default.createElement("div", { className: screen_module_scss_1.default.footer, "data-testid": 'screen:footer' }, footer)))));
|
|
66
58
|
};
|
|
67
59
|
exports.Screen = Screen;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
* @param value Значение для записи.
|
|
72
|
-
*/
|
|
73
|
-
const setRefValue = (ref, value) => {
|
|
74
|
-
if ((0, lodash_1.isFunction)(ref)) {
|
|
75
|
-
ref(value);
|
|
76
|
-
}
|
|
77
|
-
else if (ref) {
|
|
78
|
-
ref.current = value;
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
exports.setRefValue = setRefValue;
|
|
82
|
-
/**
|
|
83
|
-
* Записывает полученный элемент в ref и отключает прокрутку.
|
|
84
|
-
* @param ref Ref-контейнер.
|
|
85
|
-
* @param element Элемент для записи.
|
|
86
|
-
*/
|
|
87
|
-
const takeScrollableElement = (ref, element) => {
|
|
88
|
-
if (element && element !== ref.current) {
|
|
89
|
-
// если элемент изменился - включаем прокрутку для старого
|
|
90
|
-
ref.current && (0, body_scroll_lock_1.enableBodyScroll)(ref.current);
|
|
91
|
-
// сохраняем новый элемент
|
|
92
|
-
ref.current = element;
|
|
93
|
-
// отключаем прокрутку для нового элемента
|
|
94
|
-
(0, body_scroll_lock_1.disableBodyScroll)(element);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
exports.takeScrollableElement = takeScrollableElement;
|
|
60
|
+
exports.Screen.Header = slots_1.HeaderSlot;
|
|
61
|
+
exports.Screen.Body = slots_1.BodySlot;
|
|
62
|
+
exports.Screen.Footer = slots_1.FooterSlot;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.
|
|
1
|
+
.root {
|
|
2
2
|
position: fixed;
|
|
3
3
|
|
|
4
4
|
// для корректного отображения с динамическим viewport переменная --offsetTop должна быть доступна
|
|
@@ -9,24 +9,25 @@
|
|
|
9
9
|
|
|
10
10
|
// для корректного отображения с динамическим viewport переменная --vh должна быть доступна
|
|
11
11
|
height: calc(var(--vh, 1vh) * 100);
|
|
12
|
+
width: 100%;
|
|
12
13
|
box-sizing: border-box;
|
|
13
14
|
background-color: #fff;
|
|
14
15
|
outline: 100px solid #fff;
|
|
15
|
-
.content {
|
|
16
|
-
height: 0;
|
|
17
|
-
overflow-y: auto;
|
|
18
|
-
flex-grow: 1;
|
|
19
|
-
flex-shrink: 0;
|
|
20
|
-
-webkit-overflow-scrolling: touch;
|
|
21
|
-
}
|
|
22
|
-
.footer {
|
|
23
|
-
min-height: 56px;
|
|
24
|
-
flex-grow: 0;
|
|
25
|
-
flex-shrink: 0;
|
|
26
|
-
box-shadow: inset 0 1px 0 #e0e0e0;
|
|
27
|
-
}
|
|
28
16
|
}
|
|
29
17
|
|
|
30
|
-
.
|
|
18
|
+
.body {
|
|
19
|
+
width: 100%;
|
|
20
|
+
height: 0;
|
|
21
|
+
overflow-y: auto;
|
|
22
|
+
flex-grow: 1;
|
|
23
|
+
flex-shrink: 0;
|
|
24
|
+
-webkit-overflow-scrolling: touch;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.footer {
|
|
28
|
+
min-height: 56px;
|
|
31
29
|
width: 100%;
|
|
30
|
+
flex-grow: 0;
|
|
31
|
+
flex-shrink: 0;
|
|
32
|
+
box-shadow: inset 0 1px 0 #e0e0e0;
|
|
32
33
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { NavBarProps } from '../nav-bar';
|
|
3
|
+
export interface HeaderSlotProps extends NavBarProps {
|
|
4
|
+
/** Нужна ли разделительная полоса внизу шапки экрана. */
|
|
5
|
+
divided?: boolean;
|
|
6
|
+
/** Заголовок. */
|
|
7
|
+
title?: string;
|
|
8
|
+
/** Подзаголовок. */
|
|
9
|
+
subtitle?: string;
|
|
10
|
+
/** Будет вызвана при нажатии на кнопку-стрелку. */
|
|
11
|
+
onBack?: () => void;
|
|
12
|
+
/** Будет вызвана при нажатии на кнопку-крести. */
|
|
13
|
+
onClose?: () => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Слот шапки экрана.
|
|
17
|
+
* @param props Свойства.
|
|
18
|
+
* @return Элемент.
|
|
19
|
+
*/
|
|
20
|
+
export declare const HeaderSlot: ({ divided, title, subtitle, buttons, onBack, onClose, ...restProps }: HeaderSlotProps) => JSX.Element;
|
|
21
|
+
/**
|
|
22
|
+
* Слот основного контента экрана.
|
|
23
|
+
* @param props Свойства.
|
|
24
|
+
* @return Элемент.
|
|
25
|
+
*/
|
|
26
|
+
export declare const BodySlot: React.FC;
|
|
27
|
+
/**
|
|
28
|
+
* Слот футера экрана.
|
|
29
|
+
* @param props Свойства.
|
|
30
|
+
* @return Элемент.
|
|
31
|
+
*/
|
|
32
|
+
export declare const FooterSlot: React.FC;
|
package/screen/slots.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.FooterSlot = exports.BodySlot = exports.HeaderSlot = void 0;
|
|
18
|
+
const react_1 = __importDefault(require("react"));
|
|
19
|
+
const nav_bar_1 = require("../nav-bar");
|
|
20
|
+
const lodash_1 = require("lodash");
|
|
21
|
+
const arrow_left_1 = __importDefault(require("@sima-land/ui-quarks/icons/24x24/Stroked/arrow-left"));
|
|
22
|
+
const cross_1 = __importDefault(require("@sima-land/ui-quarks/icons/24x24/Stroked/cross"));
|
|
23
|
+
/**
|
|
24
|
+
* Слот шапки экрана.
|
|
25
|
+
* @param props Свойства.
|
|
26
|
+
* @return Элемент.
|
|
27
|
+
*/
|
|
28
|
+
const HeaderSlot = (_a) => {
|
|
29
|
+
var { divided, title, subtitle, buttons, onBack, onClose } = _a, restProps = __rest(_a, ["divided", "title", "subtitle", "buttons", "onBack", "onClose"]);
|
|
30
|
+
return (react_1.default.createElement(nav_bar_1.NavBar, Object.assign({}, restProps, { title: title, subtitle: subtitle, bottomBordered: divided, buttons: Object.assign(Object.assign({}, buttons), { start: onBack
|
|
31
|
+
? {
|
|
32
|
+
// ВАЖНО: не подмешиваем свойства из buttons.start
|
|
33
|
+
// чтобы не распылять конфигурацию одной и той же кнопки по нескольким местам
|
|
34
|
+
icon: arrow_left_1.default,
|
|
35
|
+
onClick: onBack,
|
|
36
|
+
'aria-label': 'Вернуться назад',
|
|
37
|
+
'data-testid': 'screen:back',
|
|
38
|
+
}
|
|
39
|
+
: (0, lodash_1.get)(buttons, 'start'), end: onClose
|
|
40
|
+
? {
|
|
41
|
+
// ВАЖНО: не подмешиваем свойства из buttons.end
|
|
42
|
+
// чтобы не распылять конфигурацию одной и той же кнопки по нескольким местам
|
|
43
|
+
icon: cross_1.default,
|
|
44
|
+
onClick: onClose,
|
|
45
|
+
'aria-label': `Закрыть ${title || ''}`.trim(),
|
|
46
|
+
'data-testid': 'screen:close',
|
|
47
|
+
}
|
|
48
|
+
: (0, lodash_1.get)(buttons, 'end') }) })));
|
|
49
|
+
};
|
|
50
|
+
exports.HeaderSlot = HeaderSlot;
|
|
51
|
+
/**
|
|
52
|
+
* Слот основного контента экрана.
|
|
53
|
+
* @param props Свойства.
|
|
54
|
+
* @return Элемент.
|
|
55
|
+
*/
|
|
56
|
+
const BodySlot = ({ children }) => react_1.default.createElement(react_1.default.Fragment, null, children);
|
|
57
|
+
exports.BodySlot = BodySlot;
|
|
58
|
+
/**
|
|
59
|
+
* Слот футера экрана.
|
|
60
|
+
* @param props Свойства.
|
|
61
|
+
* @return Элемент.
|
|
62
|
+
*/
|
|
63
|
+
const FooterSlot = ({ children }) => react_1.default.createElement(react_1.default.Fragment, null, children);
|
|
64
|
+
exports.FooterSlot = FooterSlot;
|
package/screen/utils.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export declare
|
|
2
|
-
export declare const cx: import("classnames/types").ClassNamesFn;
|
|
1
|
+
export declare const cx: (...args: import("classnames").Argument[]) => string;
|
package/side-page/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { WithBodyScrollLock } from '../_internal/body-scroll';
|
|
3
|
+
import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
|
|
3
4
|
export interface SidePageProps extends WithBodyScrollLock {
|
|
4
5
|
/** Нужно ли показать компонент. */
|
|
5
6
|
shown?: boolean;
|
|
@@ -11,6 +12,18 @@ export interface SidePageProps extends WithBodyScrollLock {
|
|
|
11
12
|
children?: React.ReactNode;
|
|
12
13
|
/** Сработает при закрытии. */
|
|
13
14
|
onClose?: () => void;
|
|
15
|
+
/** Обработчик "onEntering" для CSSTransition. */
|
|
16
|
+
onEntering?: CSSTransitionProps['onEntering'];
|
|
17
|
+
/** Обработчик "onEnter" для CSSTransition. */
|
|
18
|
+
onEnter?: CSSTransitionProps['onEnter'];
|
|
19
|
+
/** Обработчик "onEntered" для CSSTransition. */
|
|
20
|
+
onEntered?: CSSTransitionProps['onEntered'];
|
|
21
|
+
/** Обработчик "onExiting" для CSSTransition. */
|
|
22
|
+
onExiting?: CSSTransitionProps['onExiting'];
|
|
23
|
+
/** Обработчик "onExited" для CSSTransition. */
|
|
24
|
+
onExited?: CSSTransitionProps['onExited'];
|
|
25
|
+
/** Обработчик "onExit" для CSSTransition. */
|
|
26
|
+
onExit?: CSSTransitionProps['onExit'];
|
|
14
27
|
}
|
|
15
28
|
/**
|
|
16
29
|
* Компонент модального окна, прикрепленного к правой стороне экрана.
|
|
@@ -18,7 +31,7 @@ export interface SidePageProps extends WithBodyScrollLock {
|
|
|
18
31
|
* @return Элемент.
|
|
19
32
|
*/
|
|
20
33
|
export declare const SidePage: {
|
|
21
|
-
({ shown, withTransitions, ...restProps }: SidePageProps): JSX.Element;
|
|
34
|
+
({ shown, withTransitions, onEnter, onEntering, onEntered, onExit, onExiting, onExited, ...restProps }: SidePageProps): JSX.Element;
|
|
22
35
|
Header: {
|
|
23
36
|
({ onBack, onClose, ...topBarProps }: import("../top-bar").TopBarProps & {
|
|
24
37
|
onBack?: (() => void) | undefined;
|
|
@@ -28,7 +41,7 @@ export declare const SidePage: {
|
|
|
28
41
|
};
|
|
29
42
|
Body: {
|
|
30
43
|
({ children }: {
|
|
31
|
-
children?: React.ReactNode;
|
|
44
|
+
children?: React.ReactNode; /** Обработчик "onExiting" для CSSTransition. */
|
|
32
45
|
}): JSX.Element;
|
|
33
46
|
displayName: string;
|
|
34
47
|
};
|
package/side-page/index.js
CHANGED
|
@@ -56,9 +56,9 @@ const transitionClasses = {
|
|
|
56
56
|
* @return Элемент.
|
|
57
57
|
*/
|
|
58
58
|
const SidePage = (_a) => {
|
|
59
|
-
var { shown, withTransitions } = _a, restProps = __rest(_a, ["shown", "withTransitions"]);
|
|
59
|
+
var { shown, withTransitions, onEnter, onEntering, onEntered, onExit, onExiting, onExited } = _a, restProps = __rest(_a, ["shown", "withTransitions", "onEnter", "onEntering", "onEntered", "onExit", "onExiting", "onExited"]);
|
|
60
60
|
const transitionDuration = withTransitions ? 300 : 0;
|
|
61
|
-
return (react_1.default.createElement(CSSTransition_1.default, { in: shown, timeout: transitionDuration, classNames: transitionClasses, unmountOnExit: true }, transitionStatus => (react_1.default.createElement(SidePageInner, Object.assign({}, restProps, { transitionStatus, transitionDuration })))));
|
|
61
|
+
return (react_1.default.createElement(CSSTransition_1.default, { in: shown, timeout: transitionDuration, classNames: transitionClasses, unmountOnExit: true, onEntering: onEntering, onEnter: onEnter, onEntered: onEntered, onExit: onExit, onExiting: onExiting, onExited: onExited }, transitionStatus => (react_1.default.createElement(SidePageInner, Object.assign({}, restProps, { transitionStatus, transitionDuration })))));
|
|
62
62
|
};
|
|
63
63
|
exports.SidePage = SidePage;
|
|
64
64
|
/**
|
package/tabs/index.d.ts
CHANGED
|
@@ -1,29 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* @param props.onSelectItem Функция, вызываемая при выборе элемента списка.
|
|
7
|
-
* @param props.isSelectedItem Функция, определяющая, является ли элемент выбранным.
|
|
8
|
-
* @param props.isDisabledItem Функция, определяющая, является ли элемент невыбираемым.
|
|
9
|
-
* @param props.type Тип таба.
|
|
10
|
-
* @param props.underline Нужно ли подчеркивание группы табов.
|
|
11
|
-
* @param props.stretch Необходимо ли растягивать табы под размер контейнера.
|
|
12
|
-
* @param props.gapSize Размер отступа между табами.
|
|
13
|
-
* @param props.className Внешние классы.
|
|
14
|
-
* @return Элемент.
|
|
15
|
-
*/
|
|
16
|
-
export declare function Tabs<T = any>({ items, getItemName, onSelectItem, isSelectedItem, isDisabledItem, view, underline, stretch, gapSize, className, 'data-testid': dataTestId, }: {
|
|
17
|
-
items?: T[];
|
|
18
|
-
} & {
|
|
19
|
-
getItemName?: (i: T) => string;
|
|
20
|
-
onSelectItem?: (i: T) => void;
|
|
21
|
-
isSelectedItem?: (i: T) => boolean | undefined;
|
|
22
|
-
isDisabledItem?: (i: T) => boolean | undefined;
|
|
23
|
-
view?: 'clean' | 'round';
|
|
24
|
-
underline?: boolean;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface TabsProps {
|
|
3
|
+
/** Визуальный вариант вкладок. */
|
|
4
|
+
view?: 'clean' | 'clean-underline' | 'round';
|
|
5
|
+
/** Необходимо ли растягивать вкладки под размер контейнера. */
|
|
25
6
|
stretch?: boolean;
|
|
7
|
+
/** Размер отступа между вкладками. */
|
|
26
8
|
gapSize?: 's' | 'm';
|
|
9
|
+
/** Внешние классы. */
|
|
27
10
|
className?: string;
|
|
11
|
+
/** Вкладки. */
|
|
12
|
+
children?: React.ReactNode;
|
|
13
|
+
/** Идентификатор для систем автоматизированного тестирования. */
|
|
14
|
+
'data-testid'?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TabsItemProps {
|
|
17
|
+
/** Название вкладки. */
|
|
18
|
+
name: string;
|
|
19
|
+
/** Выбрана ли вкладка. */
|
|
20
|
+
selected?: boolean;
|
|
21
|
+
/** Отключена ли вкладка. */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Идентификатор для систем автоматизированного тестирования. */
|
|
28
24
|
'data-testid'?: string;
|
|
29
|
-
|
|
25
|
+
/** Обработчик клика. */
|
|
26
|
+
onClick?: React.MouseEventHandler<HTMLLIElement>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Компонент строки вкладок.
|
|
30
|
+
* @param props Свойства.
|
|
31
|
+
* @return Элемент.
|
|
32
|
+
*/
|
|
33
|
+
export declare const Tabs: {
|
|
34
|
+
({ children, view, stretch, gapSize, className, "data-testid": testId, }: TabsProps): JSX.Element;
|
|
35
|
+
Item: ({ name, selected, disabled, "data-testid": testId, onClick, }: TabsItemProps) => JSX.Element;
|
|
36
|
+
};
|
package/tabs/index.js
CHANGED
|
@@ -1,37 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
2
21
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
23
|
};
|
|
5
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
25
|
exports.Tabs = void 0;
|
|
7
|
-
const react_1 =
|
|
26
|
+
const react_1 = __importStar(require("react"));
|
|
8
27
|
const bind_1 = __importDefault(require("classnames/bind"));
|
|
9
|
-
const lodash_1 = require("lodash");
|
|
10
|
-
const fp_1 = require("lodash/fp");
|
|
11
28
|
const tabs_module_scss_1 = __importDefault(require("./tabs.module.scss"));
|
|
12
29
|
const cx = bind_1.default.bind(tabs_module_scss_1.default);
|
|
13
30
|
/**
|
|
14
|
-
*
|
|
15
|
-
* @param props
|
|
16
|
-
* @
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*
|
|
21
|
-
* @param props
|
|
22
|
-
* @param props.underline Нужно ли подчеркивание группы табов.
|
|
23
|
-
* @param props.stretch Необходимо ли растягивать табы под размер контейнера.
|
|
24
|
-
* @param props.gapSize Размер отступа между табами.
|
|
25
|
-
* @param props.className Внешние классы.
|
|
31
|
+
* Вкладка.
|
|
32
|
+
* @param props Свойства.
|
|
33
|
+
* @return Элемент.
|
|
34
|
+
*/
|
|
35
|
+
const Tab = ({ name, selected, disabled, 'data-testid': testId = 'tab', onClick, }) => (react_1.default.createElement("li", { className: cx('item', { selected, disabled }), "data-testid": testId, onClick: disabled ? undefined : onClick }, String(name)));
|
|
36
|
+
/**
|
|
37
|
+
* Компонент строки вкладок.
|
|
38
|
+
* @param props Свойства.
|
|
26
39
|
* @return Элемент.
|
|
27
40
|
*/
|
|
28
|
-
|
|
29
|
-
return (react_1.default.createElement("ul", { "data-testid": dataTestId, className: cx('root', `view-${view}`, `gap-${gapSize}`, {
|
|
30
|
-
underline,
|
|
31
|
-
stretch,
|
|
32
|
-
}, className) }, items === null || items === void 0 ? void 0 : items.map((item, index) => (react_1.default.createElement("li", { key: index, onClick: () => onSelectItem === null || onSelectItem === void 0 ? void 0 : onSelectItem(item), className: cx('tab-item', {
|
|
33
|
-
selected: isSelectedItem(item),
|
|
34
|
-
disabled: isDisabledItem(item),
|
|
35
|
-
}), "data-testid": 'tab' }, getItemName(item))))));
|
|
36
|
-
}
|
|
41
|
+
const Tabs = ({ children, view = 'clean', stretch = false, gapSize = 'm', className, 'data-testid': testId = 'tabs', }) => (react_1.default.createElement("ul", { "data-testid": testId, className: cx('root', `view-${view}`, `gap-${gapSize}`, { stretch }, className) }, react_1.Children.toArray(children).filter(child => (0, react_1.isValidElement)(child) && child.type === Tab)));
|
|
37
42
|
exports.Tabs = Tabs;
|
|
43
|
+
exports.Tabs.Item = Tab;
|
package/tabs/tabs.module.scss
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
font-weight: 600;
|
|
11
11
|
line-height: 24px;
|
|
12
12
|
li {
|
|
13
|
+
display: block;
|
|
13
14
|
margin: 0;
|
|
14
15
|
&::before {
|
|
15
16
|
content: none;
|
|
@@ -17,13 +18,14 @@
|
|
|
17
18
|
}
|
|
18
19
|
&.stretch {
|
|
19
20
|
justify-items: stretch;
|
|
20
|
-
.
|
|
21
|
+
.item {
|
|
21
22
|
width: 100%;
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
&.view-clean
|
|
25
|
+
&.view-clean,
|
|
26
|
+
&.view-clean-underline {
|
|
25
27
|
height: 32px;
|
|
26
|
-
.
|
|
28
|
+
.item {
|
|
27
29
|
color: colors.$gray38;
|
|
28
30
|
&.selected {
|
|
29
31
|
position: relative;
|
|
@@ -49,22 +51,22 @@
|
|
|
49
51
|
color: colors.$gray54;
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
54
|
+
}
|
|
55
|
+
&.view-clean-underline {
|
|
56
|
+
height: 40px;
|
|
57
|
+
position: relative;
|
|
58
|
+
&::before {
|
|
59
|
+
position: absolute;
|
|
60
|
+
bottom: 0;
|
|
61
|
+
content: '';
|
|
62
|
+
height: 1px;
|
|
63
|
+
width: 100%;
|
|
64
|
+
background-color: colors.$gray12;
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
&.view-round {
|
|
66
68
|
height: 40px;
|
|
67
|
-
.
|
|
69
|
+
.item {
|
|
68
70
|
color: colors.$gray87;
|
|
69
71
|
padding: 8px 16px;
|
|
70
72
|
border-radius: 4px;
|
|
@@ -83,15 +85,15 @@
|
|
|
83
85
|
}
|
|
84
86
|
}
|
|
85
87
|
&.gap-m {
|
|
86
|
-
--gap: 24px;
|
|
88
|
+
--tabs-gap: 24px;
|
|
87
89
|
}
|
|
88
90
|
&.gap-s {
|
|
89
|
-
--gap: 16px;
|
|
91
|
+
--tabs-gap: 16px;
|
|
90
92
|
}
|
|
91
|
-
.
|
|
93
|
+
.item {
|
|
92
94
|
text-align: center;
|
|
93
95
|
&:not(:last-child) {
|
|
94
|
-
margin-right: var(--gap);
|
|
96
|
+
margin-right: var(--tabs-gap);
|
|
95
97
|
}
|
|
96
98
|
}
|
|
97
99
|
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { NavBarProps } from '../nav-bar';
|
|
3
|
-
import { OrNil } from './utils';
|
|
4
|
-
export interface CallbackData {
|
|
5
|
-
contentElement: OrNil<HTMLDivElement>;
|
|
6
|
-
}
|
|
7
|
-
export interface ScreenLayoutProps {
|
|
8
|
-
childrenRef?: React.MutableRefObject<OrNil<HTMLDivElement>> | React.RefCallback<OrNil<HTMLDivElement>>;
|
|
9
|
-
footer?: React.ReactNode;
|
|
10
|
-
fullScrollThreshold?: number;
|
|
11
|
-
navBarProps?: NavBarProps;
|
|
12
|
-
onBack?: (data: CallbackData) => void;
|
|
13
|
-
onClose?: (data: CallbackData) => void;
|
|
14
|
-
onFullScroll?: (data: CallbackData) => void;
|
|
15
|
-
subtitle?: string;
|
|
16
|
-
title?: string;
|
|
17
|
-
withBackButton?: boolean;
|
|
18
|
-
withCloseButton?: boolean;
|
|
19
|
-
withDivideHeader?: boolean;
|
|
20
|
-
withHeader?: boolean;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Разметка содержимого компонента Screen.
|
|
24
|
-
* @param props Свойства.
|
|
25
|
-
* @param props.children Содержимое.
|
|
26
|
-
* @param props.childrenRef Ref для элемента содержимого.
|
|
27
|
-
* @param props.footer Содержимое подвала.
|
|
28
|
-
* @param props.fullScrollThreshold Отступ от нижней границы для срабатывания onFullScroll.
|
|
29
|
-
* @param props.navBarProps Свойства компонента NavBar.
|
|
30
|
-
* @param props.onBack Сработает при клике на кнопку "назад".
|
|
31
|
-
* @param props.onClose Сработает при клике на крест.
|
|
32
|
-
* @param props.onFullScroll Сработает при полной прокрутке контента.
|
|
33
|
-
* @param props.subtitle Подзаголовок.
|
|
34
|
-
* @param props.title Заголовок.
|
|
35
|
-
* @param props.withBackButton Нужно ли выводить кнопку "назад".
|
|
36
|
-
* @param props.withCloseButton Нужно ли выводить закрывающий крест.
|
|
37
|
-
* @param props.withDivideHeader Нужно ли рисовать черту между шапкой и основным содержимым.
|
|
38
|
-
* @param props.withHeader Нужно ли выводить шапку с заголовком и кнопками.
|
|
39
|
-
* @return Элемент.
|
|
40
|
-
*/
|
|
41
|
-
export declare const ScreenLayout: React.FC<ScreenLayoutProps>;
|
|
42
|
-
/**
|
|
43
|
-
* Возвращает функцию сохранения аргумента в ref-контейнер.
|
|
44
|
-
* Возвращаемая функция выполняет подписку на "scroll" и вызывает callback в момент полной прокрутки.
|
|
45
|
-
* @param options Опции.
|
|
46
|
-
* @param options.elementRef Ref-контейнер для элемента.
|
|
47
|
-
* @param options.unsubscribeRef Ref-контейнер для функции отписки от "scroll".
|
|
48
|
-
* @param options.onFullScroll Сработает при полной прокрутке.
|
|
49
|
-
* @param options.fullScrollThreshold Отступ от нижней границы для срабатывания onFullScroll.
|
|
50
|
-
* @return Функция сохранения аргумента в ref-контейнер.
|
|
51
|
-
*/
|
|
52
|
-
export declare const createTakeContentRef: ({ elementRef, unsubscribeRef, onFullScroll, fullScrollThreshold: threshold, }: {
|
|
53
|
-
elementRef: React.MutableRefObject<OrNil<HTMLDivElement>>;
|
|
54
|
-
unsubscribeRef: React.MutableRefObject<undefined | (() => void)>;
|
|
55
|
-
onFullScroll?: ((data: CallbackData) => void) | undefined;
|
|
56
|
-
fullScrollThreshold?: number | undefined;
|
|
57
|
-
}) => (element?: HTMLDivElement | undefined) => void;
|
package/screen/screen-layout.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.createTakeContentRef = exports.ScreenLayout = void 0;
|
|
26
|
-
const react_1 = __importStar(require("react"));
|
|
27
|
-
const nav_bar_1 = require("../nav-bar");
|
|
28
|
-
const utils_1 = require("./utils");
|
|
29
|
-
const on_1 = __importDefault(require("../helpers/on"));
|
|
30
|
-
const is_fully_scrolled_1 = require("../helpers/is-fully-scrolled");
|
|
31
|
-
const lodash_1 = require("lodash");
|
|
32
|
-
const arrow_left_1 = __importDefault(require("@sima-land/ui-quarks/icons/24x24/Stroked/arrow-left"));
|
|
33
|
-
const cross_1 = __importDefault(require("@sima-land/ui-quarks/icons/24x24/Stroked/cross"));
|
|
34
|
-
/**
|
|
35
|
-
* Разметка содержимого компонента Screen.
|
|
36
|
-
* @param props Свойства.
|
|
37
|
-
* @param props.children Содержимое.
|
|
38
|
-
* @param props.childrenRef Ref для элемента содержимого.
|
|
39
|
-
* @param props.footer Содержимое подвала.
|
|
40
|
-
* @param props.fullScrollThreshold Отступ от нижней границы для срабатывания onFullScroll.
|
|
41
|
-
* @param props.navBarProps Свойства компонента NavBar.
|
|
42
|
-
* @param props.onBack Сработает при клике на кнопку "назад".
|
|
43
|
-
* @param props.onClose Сработает при клике на крест.
|
|
44
|
-
* @param props.onFullScroll Сработает при полной прокрутке контента.
|
|
45
|
-
* @param props.subtitle Подзаголовок.
|
|
46
|
-
* @param props.title Заголовок.
|
|
47
|
-
* @param props.withBackButton Нужно ли выводить кнопку "назад".
|
|
48
|
-
* @param props.withCloseButton Нужно ли выводить закрывающий крест.
|
|
49
|
-
* @param props.withDivideHeader Нужно ли рисовать черту между шапкой и основным содержимым.
|
|
50
|
-
* @param props.withHeader Нужно ли выводить шапку с заголовком и кнопками.
|
|
51
|
-
* @return Элемент.
|
|
52
|
-
*/
|
|
53
|
-
const ScreenLayout = ({ children, childrenRef, footer, fullScrollThreshold, navBarProps = {}, onBack, onClose, onFullScroll, subtitle, title, withBackButton, withCloseButton, withDivideHeader, withHeader, }) => {
|
|
54
|
-
const contentRef = (0, react_1.useRef)();
|
|
55
|
-
const unsubscribeRef = (0, react_1.useRef)();
|
|
56
|
-
(0, react_1.useImperativeHandle)(childrenRef, () => contentRef.current);
|
|
57
|
-
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
58
|
-
Boolean(withHeader) && (react_1.default.createElement(nav_bar_1.NavBar, Object.assign({}, navBarProps, { title: title, subtitle: subtitle, bottomBordered: withDivideHeader, buttons: Object.assign(Object.assign({}, navBarProps.buttons), { start: withBackButton
|
|
59
|
-
? {
|
|
60
|
-
// ВАЖНО: не подмешиваем свойства из navBarProps.buttons.start
|
|
61
|
-
// чтобы не распылять конфигурацию одной и той же кнопки по нескольким местам
|
|
62
|
-
icon: arrow_left_1.default,
|
|
63
|
-
onClick: () => onBack && onBack({ contentElement: contentRef.current }),
|
|
64
|
-
'aria-label': 'Вернуться назад',
|
|
65
|
-
'data-testid': 'screen:back',
|
|
66
|
-
}
|
|
67
|
-
: (0, lodash_1.get)(navBarProps.buttons, 'start'), end: withCloseButton
|
|
68
|
-
? {
|
|
69
|
-
// ВАЖНО: не подмешиваем свойства из navBarProps.buttons.end
|
|
70
|
-
// чтобы не распылять конфигурацию одной и той же кнопки по нескольким местам
|
|
71
|
-
icon: cross_1.default,
|
|
72
|
-
onClick: () => onClose && onClose({ contentElement: contentRef.current }),
|
|
73
|
-
'aria-label': `Закрыть ${title || ''}`.trim(),
|
|
74
|
-
'data-testid': 'screen:close',
|
|
75
|
-
}
|
|
76
|
-
: (0, lodash_1.get)(navBarProps.buttons, 'end') }) }))),
|
|
77
|
-
react_1.default.createElement("div", { className: (0, utils_1.cx)('content', 'full-width'), children: children, ref: (0, exports.createTakeContentRef)({
|
|
78
|
-
elementRef: contentRef,
|
|
79
|
-
unsubscribeRef,
|
|
80
|
-
onFullScroll,
|
|
81
|
-
fullScrollThreshold,
|
|
82
|
-
}) }),
|
|
83
|
-
Boolean(footer) && react_1.default.createElement("div", { className: (0, utils_1.cx)('footer', 'full-width') }, footer)));
|
|
84
|
-
};
|
|
85
|
-
exports.ScreenLayout = ScreenLayout;
|
|
86
|
-
/**
|
|
87
|
-
* Возвращает функцию сохранения аргумента в ref-контейнер.
|
|
88
|
-
* Возвращаемая функция выполняет подписку на "scroll" и вызывает callback в момент полной прокрутки.
|
|
89
|
-
* @param options Опции.
|
|
90
|
-
* @param options.elementRef Ref-контейнер для элемента.
|
|
91
|
-
* @param options.unsubscribeRef Ref-контейнер для функции отписки от "scroll".
|
|
92
|
-
* @param options.onFullScroll Сработает при полной прокрутке.
|
|
93
|
-
* @param options.fullScrollThreshold Отступ от нижней границы для срабатывания onFullScroll.
|
|
94
|
-
* @return Функция сохранения аргумента в ref-контейнер.
|
|
95
|
-
*/
|
|
96
|
-
const createTakeContentRef = ({ elementRef, unsubscribeRef, onFullScroll, fullScrollThreshold: threshold = 0, }) => (element) => {
|
|
97
|
-
if (!element) {
|
|
98
|
-
// чистим реф
|
|
99
|
-
elementRef.current = undefined;
|
|
100
|
-
// если ранее были подписаны - отписываемся
|
|
101
|
-
unsubscribeRef.current && unsubscribeRef.current();
|
|
102
|
-
}
|
|
103
|
-
else if (element !== elementRef.current) {
|
|
104
|
-
// сохраняем ссылку для последующей отправки в onClose/onBack
|
|
105
|
-
elementRef.current = element;
|
|
106
|
-
// если ранее были подписаны - отписываемся
|
|
107
|
-
unsubscribeRef.current && unsubscribeRef.current();
|
|
108
|
-
// выполняем подписку, сохраняем функцию отписки
|
|
109
|
-
unsubscribeRef.current = (0, on_1.default)(element, 'scroll', () => {
|
|
110
|
-
(0, is_fully_scrolled_1.isFullyScrolled)(element, { threshold }) &&
|
|
111
|
-
onFullScroll &&
|
|
112
|
-
onFullScroll({ contentElement: element });
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
exports.createTakeContentRef = createTakeContentRef;
|