@cloud-ru/uikit-product-mobile-drawer 0.9.15 → 0.9.17
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/CHANGELOG.md +21 -0
- package/dist/cjs/components/MobileDrawer/MobileDrawer.d.ts +40 -0
- package/dist/cjs/components/MobileDrawer/MobileDrawer.js +29 -0
- package/dist/cjs/components/MobileDrawer/index.d.ts +1 -0
- package/dist/cjs/components/MobileDrawer/index.js +17 -0
- package/dist/cjs/components/MobileDrawer/styles.module.css +4 -0
- package/dist/cjs/components/MobileDrawerCustom/MobileDrawerCustom.d.ts +50 -0
- package/dist/cjs/components/MobileDrawerCustom/MobileDrawerCustom.js +72 -0
- package/dist/cjs/components/MobileDrawerCustom/constants.d.ts +10 -0
- package/dist/cjs/components/MobileDrawerCustom/constants.js +25 -0
- package/dist/cjs/components/MobileDrawerCustom/hooks.d.ts +22 -0
- package/dist/cjs/components/MobileDrawerCustom/hooks.js +164 -0
- package/dist/cjs/components/MobileDrawerCustom/index.d.ts +1 -0
- package/dist/cjs/components/MobileDrawerCustom/index.js +17 -0
- package/dist/cjs/components/MobileDrawerCustom/motion.css +117 -0
- package/dist/cjs/components/MobileDrawerCustom/styles.module.css +182 -0
- package/dist/cjs/components/index.d.ts +2 -0
- package/dist/cjs/components/index.js +18 -0
- package/dist/cjs/constants.d.ts +36 -0
- package/dist/cjs/constants.js +39 -0
- package/dist/cjs/helperComponents/Body/Body.d.ts +10 -0
- package/dist/cjs/helperComponents/Body/Body.js +27 -0
- package/dist/cjs/helperComponents/Body/index.d.ts +1 -0
- package/dist/cjs/helperComponents/Body/index.js +17 -0
- package/dist/cjs/helperComponents/Body/styles.module.css +9 -0
- package/dist/cjs/helperComponents/ButtonClose/ButtonClose.d.ts +5 -0
- package/dist/cjs/helperComponents/ButtonClose/ButtonClose.js +13 -0
- package/dist/cjs/helperComponents/ButtonClose/index.d.ts +1 -0
- package/dist/cjs/helperComponents/ButtonClose/index.js +17 -0
- package/dist/cjs/helperComponents/ButtonClose/styles.module.css +35 -0
- package/dist/cjs/helperComponents/Footer/Footer.d.ts +10 -0
- package/dist/cjs/helperComponents/Footer/Footer.js +27 -0
- package/dist/cjs/helperComponents/Footer/index.d.ts +1 -0
- package/dist/cjs/helperComponents/Footer/index.js +17 -0
- package/dist/cjs/helperComponents/Footer/styles.module.css +14 -0
- package/dist/cjs/helperComponents/Header/Header.d.ts +20 -0
- package/dist/cjs/helperComponents/Header/Header.js +29 -0
- package/dist/cjs/helperComponents/Header/index.d.ts +1 -0
- package/dist/cjs/helperComponents/Header/index.js +17 -0
- package/dist/cjs/helperComponents/Header/styles.module.css +32 -0
- package/dist/cjs/helperComponents/WithTooltip/WithTooltip.d.ts +8 -0
- package/dist/cjs/helperComponents/WithTooltip/WithTooltip.js +11 -0
- package/dist/cjs/helperComponents/WithTooltip/index.d.ts +1 -0
- package/dist/cjs/helperComponents/WithTooltip/index.js +17 -0
- package/dist/cjs/helperComponents/index.d.ts +4 -0
- package/dist/cjs/helperComponents/index.js +20 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +17 -0
- package/dist/cjs/types.d.ts +6 -0
- package/dist/cjs/types.js +2 -0
- package/dist/esm/components/MobileDrawer/MobileDrawer.d.ts +40 -0
- package/dist/esm/components/MobileDrawer/MobileDrawer.js +23 -0
- package/dist/esm/components/MobileDrawer/index.d.ts +1 -0
- package/dist/esm/components/MobileDrawer/index.js +1 -0
- package/dist/esm/components/MobileDrawer/styles.module.css +4 -0
- package/dist/esm/components/MobileDrawerCustom/MobileDrawerCustom.d.ts +50 -0
- package/dist/esm/components/MobileDrawerCustom/MobileDrawerCustom.js +66 -0
- package/dist/esm/components/MobileDrawerCustom/constants.d.ts +10 -0
- package/dist/esm/components/MobileDrawerCustom/constants.js +21 -0
- package/dist/esm/components/MobileDrawerCustom/hooks.d.ts +22 -0
- package/dist/esm/components/MobileDrawerCustom/hooks.js +158 -0
- package/dist/esm/components/MobileDrawerCustom/index.d.ts +1 -0
- package/dist/esm/components/MobileDrawerCustom/index.js +1 -0
- package/dist/esm/components/MobileDrawerCustom/motion.css +117 -0
- package/dist/esm/components/MobileDrawerCustom/styles.module.css +182 -0
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/index.js +2 -0
- package/dist/esm/constants.d.ts +36 -0
- package/dist/esm/constants.js +36 -0
- package/dist/esm/helperComponents/Body/Body.d.ts +10 -0
- package/dist/esm/helperComponents/Body/Body.js +21 -0
- package/dist/esm/helperComponents/Body/index.d.ts +1 -0
- package/dist/esm/helperComponents/Body/index.js +1 -0
- package/dist/esm/helperComponents/Body/styles.module.css +9 -0
- package/dist/esm/helperComponents/ButtonClose/ButtonClose.d.ts +5 -0
- package/dist/esm/helperComponents/ButtonClose/ButtonClose.js +7 -0
- package/dist/esm/helperComponents/ButtonClose/index.d.ts +1 -0
- package/dist/esm/helperComponents/ButtonClose/index.js +1 -0
- package/dist/esm/helperComponents/ButtonClose/styles.module.css +35 -0
- package/dist/esm/helperComponents/Footer/Footer.d.ts +10 -0
- package/dist/esm/helperComponents/Footer/Footer.js +21 -0
- package/dist/esm/helperComponents/Footer/index.d.ts +1 -0
- package/dist/esm/helperComponents/Footer/index.js +1 -0
- package/dist/esm/helperComponents/Footer/styles.module.css +14 -0
- package/dist/esm/helperComponents/Header/Header.d.ts +20 -0
- package/dist/esm/helperComponents/Header/Header.js +23 -0
- package/dist/esm/helperComponents/Header/index.d.ts +1 -0
- package/dist/esm/helperComponents/Header/index.js +1 -0
- package/dist/esm/helperComponents/Header/styles.module.css +32 -0
- package/dist/esm/helperComponents/WithTooltip/WithTooltip.d.ts +8 -0
- package/dist/esm/helperComponents/WithTooltip/WithTooltip.js +8 -0
- package/dist/esm/helperComponents/WithTooltip/index.d.ts +1 -0
- package/dist/esm/helperComponents/WithTooltip/index.js +1 -0
- package/dist/esm/helperComponents/index.d.ts +4 -0
- package/dist/esm/helperComponents/index.js +4 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/types.d.ts +6 -0
- package/dist/esm/types.js +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./WithTooltip"), exports);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Body"), exports);
|
|
18
|
+
__exportStar(require("./ButtonClose"), exports);
|
|
19
|
+
__exportStar(require("./Footer"), exports);
|
|
20
|
+
__exportStar(require("./Header"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./components"), exports);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ValueOf } from '@snack-uikit/utils';
|
|
2
|
+
import { MODAL_MODE, MODE, POSITION, SIZE } from './constants';
|
|
3
|
+
export type Size = ValueOf<typeof SIZE>;
|
|
4
|
+
export type Mode = ValueOf<typeof MODE>;
|
|
5
|
+
export type ModalMode = ValueOf<typeof MODAL_MODE>;
|
|
6
|
+
export type Position = ValueOf<typeof POSITION>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { MobileTooltipProps } from '@sbercloud/uikit-product-mobile-tooltip';
|
|
3
|
+
import { ButtonFilledProps, ButtonOutlineProps, ButtonSimpleProps } from '@snack-uikit/button';
|
|
4
|
+
import { DrawerBodyProps, DrawerHeaderProps } from '../../helperComponents';
|
|
5
|
+
import { Size } from '../../types';
|
|
6
|
+
import { MobileDrawerCustomProps } from '../MobileDrawerCustom';
|
|
7
|
+
export type DrawerProps = Omit<MobileDrawerCustomProps, 'size' | 'children' | 'nestedDrawer' | 'push' | 'closeButtonEnabled' | 'swipeEnabled'> & Pick<DrawerHeaderProps, 'titleTooltip' | 'image'> & Pick<DrawerBodyProps, 'content'> & {
|
|
8
|
+
/** Заголовок */
|
|
9
|
+
title: string;
|
|
10
|
+
/** Подзаголовок */
|
|
11
|
+
subtitle?: string;
|
|
12
|
+
/** Размер */
|
|
13
|
+
size?: Size;
|
|
14
|
+
/** Основная кнопка */
|
|
15
|
+
approveButton?: Omit<ButtonFilledProps, 'size'> & {
|
|
16
|
+
tooltip?: MobileTooltipProps;
|
|
17
|
+
};
|
|
18
|
+
/** Кнопка отмены */
|
|
19
|
+
cancelButton?: Omit<ButtonOutlineProps, 'size'> & {
|
|
20
|
+
tooltip?: MobileTooltipProps;
|
|
21
|
+
};
|
|
22
|
+
/** Дополнительная кнопка */
|
|
23
|
+
additionalButton?: Omit<ButtonSimpleProps, 'size'> & {
|
|
24
|
+
tooltip?: MobileTooltipProps;
|
|
25
|
+
};
|
|
26
|
+
/** Вложенный Drawer */
|
|
27
|
+
nestedDrawer?: ReactElement<DrawerProps>;
|
|
28
|
+
/**
|
|
29
|
+
* Максимальное кол-во строк
|
|
30
|
+
* <br> - `title` - в заголовке
|
|
31
|
+
* <br> - `subtitle` - в подзаголовке
|
|
32
|
+
* @default '{ <br>title: 1; <br>subtitle: 2; }'
|
|
33
|
+
*/
|
|
34
|
+
truncate?: {
|
|
35
|
+
title?: number;
|
|
36
|
+
subtitle?: number;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
/** Готовый компонент Drawer */
|
|
40
|
+
export declare function MobileDrawer({ title, titleTooltip, subtitle, image, content, approveButton, cancelButton, additionalButton, ...rest }: DrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
import { ButtonFilled, ButtonOutline, ButtonSimple, } from '@snack-uikit/button';
|
|
14
|
+
import { TEST_IDS } from '../../constants';
|
|
15
|
+
import { WithTooltip } from '../../helperComponents/WithTooltip';
|
|
16
|
+
import { MobileDrawerCustom } from '../MobileDrawerCustom';
|
|
17
|
+
import styles from './styles.module.css';
|
|
18
|
+
/** Готовый компонент Drawer */
|
|
19
|
+
export function MobileDrawer(_a) {
|
|
20
|
+
var { title, titleTooltip, subtitle, image, content, approveButton, cancelButton, additionalButton } = _a, rest = __rest(_a, ["title", "titleTooltip", "subtitle", "image", "content", "approveButton", "cancelButton", "additionalButton"]);
|
|
21
|
+
const needFooter = Boolean(approveButton) || Boolean(cancelButton) || Boolean(additionalButton);
|
|
22
|
+
return (_jsxs(MobileDrawerCustom, Object.assign({}, rest, { closeButtonEnabled: true, swipeEnabled: false, children: [_jsx(MobileDrawerCustom.Header, { title: title, titleTooltip: titleTooltip, subtitle: subtitle, image: image, "data-test-id": TEST_IDS.header }), _jsx(MobileDrawerCustom.Body, { content: content, "data-test-id": TEST_IDS.content }), needFooter ? (_jsx(MobileDrawerCustom.Footer, { "data-test-id": TEST_IDS.footer, actions: _jsxs(_Fragment, { children: [approveButton && (_jsx(WithTooltip, { tooltip: approveButton.tooltip, children: _jsx(ButtonFilled, Object.assign({ appearance: 'primary', size: 'm', "data-test-id": TEST_IDS.approveButton }, approveButton)) })), cancelButton && (_jsx(WithTooltip, { tooltip: cancelButton.tooltip, children: _jsx(ButtonOutline, Object.assign({ appearance: 'neutral', size: 'm', "data-test-id": TEST_IDS.cancelButton }, cancelButton)) })), additionalButton && (_jsx(WithTooltip, { tooltip: additionalButton.tooltip, children: _jsx(ButtonSimple, Object.assign({ appearance: 'neutral', size: 'm', "data-test-id": TEST_IDS.additionalButton }, additionalButton)) }))] }) })) : (_jsx("div", { className: styles.footerPlug }))] })));
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MobileDrawer';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MobileDrawer';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import 'rc-drawer/assets/index.css';
|
|
2
|
+
import { PropsWithChildren } from 'react';
|
|
3
|
+
import { WithSupportProps } from '@snack-uikit/utils';
|
|
4
|
+
import { DrawerBody, DrawerBodyProps, DrawerFooter, DrawerFooterProps, DrawerHeader, DrawerHeaderProps } from '../../helperComponents';
|
|
5
|
+
import { ModalMode, Mode, Position, Size } from '../../types';
|
|
6
|
+
export type MobileDrawerCustomProps = WithSupportProps<PropsWithChildren<{
|
|
7
|
+
/** Управление состоянием показан/не показан. */
|
|
8
|
+
open: boolean;
|
|
9
|
+
/** Колбэк закрытия */
|
|
10
|
+
onClose(): void;
|
|
11
|
+
/** Режим отображения */
|
|
12
|
+
mode?: Mode;
|
|
13
|
+
/**
|
|
14
|
+
* Режим отображения для модального окна:
|
|
15
|
+
* <br> - __`Regular`__ - есть закрытие по свайпу, клик на оверлей и нажатие кнопки `Esc` закрывают модалку
|
|
16
|
+
* <br> - __`Aggressive`__ - есть кнопка закрытия, но выключен клик на оверлей и не работает закрытие по клавише `Esc`
|
|
17
|
+
* <br> - __`Forced`__ - закрыть модальное окно можно только по нажатию на кнопку действия в нижней части
|
|
18
|
+
* @default Mode.Regular
|
|
19
|
+
*/
|
|
20
|
+
modalMode?: ModalMode;
|
|
21
|
+
/** Расположение открытого Drawer */
|
|
22
|
+
position?: Position;
|
|
23
|
+
/** CSS-класс для элемента с контентом */
|
|
24
|
+
className?: string;
|
|
25
|
+
/** CSS-класс для корневого элемента */
|
|
26
|
+
rootClassName?: string;
|
|
27
|
+
/** Размер */
|
|
28
|
+
size?: Size | string | number;
|
|
29
|
+
/** Контейнер в котором будет рендерится Drawer. По-умолчанию - body */
|
|
30
|
+
container?: string | HTMLElement;
|
|
31
|
+
/** Есть ли радиус у дровера */
|
|
32
|
+
hasBorderRadius?: boolean;
|
|
33
|
+
/** Есть ли бордер у дровера */
|
|
34
|
+
outline?: boolean;
|
|
35
|
+
/** Работает ли закрытие на свайп */
|
|
36
|
+
swipeEnabled?: boolean;
|
|
37
|
+
/** Показывать ли кнопку закрытия */
|
|
38
|
+
closeButtonEnabled?: boolean;
|
|
39
|
+
/** Закрывать при перемещении по истории браузера */
|
|
40
|
+
closeOnPopstate?: boolean;
|
|
41
|
+
}>>;
|
|
42
|
+
export declare function MobileDrawerCustom({ open: openProp, mode, position, onClose, rootClassName, className, size, container, children, hasBorderRadius, outline, swipeEnabled, modalMode, closeButtonEnabled, closeOnPopstate, ...rest }: MobileDrawerCustomProps): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
export declare namespace MobileDrawerCustom {
|
|
44
|
+
type HeaderProps = DrawerHeaderProps;
|
|
45
|
+
type BodyProps = DrawerBodyProps;
|
|
46
|
+
type FooterProps = DrawerFooterProps;
|
|
47
|
+
const Header: typeof DrawerHeader;
|
|
48
|
+
const Body: typeof DrawerBody;
|
|
49
|
+
const Footer: typeof DrawerFooter;
|
|
50
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
import 'rc-drawer/assets/index.css';
|
|
14
|
+
import cn from 'classnames';
|
|
15
|
+
import RcDrawer from 'rc-drawer';
|
|
16
|
+
import { useEffect } from 'react';
|
|
17
|
+
import { useUncontrolledProp } from 'uncontrollable';
|
|
18
|
+
import { extractSupportProps, useModalOpenState } from '@snack-uikit/utils';
|
|
19
|
+
import { MODAL_MODE, MODE, POSITION, SIZE, SIZE_AS_VALUES } from '../../constants';
|
|
20
|
+
import { ButtonClose, DrawerBody, DrawerFooter, DrawerHeader, } from '../../helperComponents';
|
|
21
|
+
import { DRAWER_CLOSING_TIMEOUT, motionProps } from './constants';
|
|
22
|
+
import { useSwipeProps } from './hooks';
|
|
23
|
+
import styles from './styles.module.css';
|
|
24
|
+
export function MobileDrawerCustom(_a) {
|
|
25
|
+
var { open: openProp, mode = MODE.Regular, position = POSITION.Left, onClose, rootClassName, className, size = SIZE.S, container, children, hasBorderRadius = false, outline = false, swipeEnabled = true, modalMode = MODAL_MODE.Regular, closeButtonEnabled = true, closeOnPopstate } = _a, rest = __rest(_a, ["open", "mode", "position", "onClose", "rootClassName", "className", "size", "container", "children", "hasBorderRadius", "outline", "swipeEnabled", "modalMode", "closeButtonEnabled", "closeOnPopstate"]);
|
|
26
|
+
const isRegular = mode === MODE.Regular;
|
|
27
|
+
const isPredefinedSize = typeof size === 'string' && SIZE_AS_VALUES.includes(size);
|
|
28
|
+
const [open, setOpen] = useUncontrolledProp(openProp, false);
|
|
29
|
+
const hasBlur = [MODAL_MODE.Forced, MODAL_MODE.Aggressive].includes(modalMode);
|
|
30
|
+
const hasSwipe = [MODAL_MODE.Regular, MODAL_MODE.Aggressive].includes(modalMode);
|
|
31
|
+
const handleClose = () => {
|
|
32
|
+
setOpen(false);
|
|
33
|
+
onClose();
|
|
34
|
+
};
|
|
35
|
+
useModalOpenState(open, () => hasSwipe && handleClose(), {
|
|
36
|
+
closeOnPopstate,
|
|
37
|
+
});
|
|
38
|
+
const { swipeRef, drawerStyles, maskStyles, drawerMotionProps, swipeProps, showPointer } = useSwipeProps({
|
|
39
|
+
position,
|
|
40
|
+
onSwiped: handleClose,
|
|
41
|
+
enabled: hasSwipe && swipeEnabled,
|
|
42
|
+
});
|
|
43
|
+
// Fix to prevent refresh when swiping on ios
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
const hasOtherDrawers = () => Boolean(document.querySelector('[data-content-wrapper]'));
|
|
46
|
+
const disableRefresh = () => (document.documentElement.style.overscrollBehaviorY = 'none');
|
|
47
|
+
const enableRefresh = () => (document.documentElement.style.overscrollBehaviorY = '');
|
|
48
|
+
if (open && !document.documentElement.style.overscrollBehaviorY) {
|
|
49
|
+
disableRefresh();
|
|
50
|
+
return () => {
|
|
51
|
+
setTimeout(() => !hasOtherDrawers() && enableRefresh(), DRAWER_CLOSING_TIMEOUT + 50);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}, [open]);
|
|
55
|
+
return (_jsx(RcDrawer, Object.assign({ mask: isRegular, maskClosable: isRegular, keyboard: isRegular, maskClassName: cn(styles.mask, {
|
|
56
|
+
[styles.maskBlur]: hasBlur,
|
|
57
|
+
}), width: !isPredefinedSize && (position === POSITION.Right || position === POSITION.Left) ? size : 'null',
|
|
58
|
+
height: !isPredefinedSize && (position === POSITION.Top || position === POSITION.Bottom) ? size : 'null', open: open, placement: position, destroyOnClose: true, push: false, afterOpenChange: setOpen, onClose: modalMode === MODAL_MODE.Regular ? handleClose : undefined, getContainer: container, className: styles.drawer, rootClassName: cn(styles.drawerRoot, rootClassName, {
|
|
59
|
+
[styles.drawerBlur]: hasBlur,
|
|
60
|
+
}) }, extractSupportProps(rest), { "data-content-wrapper": true, "data-blur": hasBlur || undefined, "data-border-radius": hasBorderRadius || undefined, "data-outline": outline || undefined, "data-size": isPredefinedSize ? size : undefined, "data-mode": mode, "data-position": position, contentWrapperStyle: drawerStyles, maskStyle: maskStyles, motion: Object.assign(Object.assign({}, (typeof motionProps.motion === 'function' ? motionProps.motion(position) : motionProps.motion)), drawerMotionProps), maskMotion: motionProps.maskMotion, children: _jsxs("div", Object.assign({ className: cn(className, styles.content) }, (swipeEnabled && hasSwipe ? swipeProps : undefined), { ref: swipeRef, "data-swipe": swipeEnabled || undefined, "data-pointers": showPointer || undefined, children: [swipeEnabled && _jsx("div", { className: styles.swiper, "data-position": position }), children, closeButtonEnabled && (_jsx("div", { className: styles.headerElements, children: _jsx(ButtonClose, { onClick: onClose }) }))] })) })));
|
|
61
|
+
}
|
|
62
|
+
(function (MobileDrawerCustom) {
|
|
63
|
+
MobileDrawerCustom.Header = DrawerHeader;
|
|
64
|
+
MobileDrawerCustom.Body = DrawerBody;
|
|
65
|
+
MobileDrawerCustom.Footer = DrawerFooter;
|
|
66
|
+
})(MobileDrawerCustom || (MobileDrawerCustom = {}));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import './motion.css';
|
|
2
|
+
import type { DrawerProps } from 'rc-drawer';
|
|
3
|
+
import type { SwipeDirections } from '@snack-uikit/utils';
|
|
4
|
+
import { Position } from '../../types';
|
|
5
|
+
export declare const maskMotion: DrawerProps['maskMotion'];
|
|
6
|
+
export declare const motion: DrawerProps['motion'];
|
|
7
|
+
export declare const motionProps: Partial<DrawerProps>;
|
|
8
|
+
export declare const SWIPE_DIRECTION_TO_POSITION_MAP: Record<SwipeDirections, Position>;
|
|
9
|
+
export declare const POSITION_TO_SWIPE_DIRECTION_MAP: Record<Position, SwipeDirections>;
|
|
10
|
+
export declare const DRAWER_CLOSING_TIMEOUT = 300;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import './motion.css';
|
|
2
|
+
export const maskMotion = {
|
|
3
|
+
motionAppear: true,
|
|
4
|
+
motionName: 'maskMotionMobile',
|
|
5
|
+
};
|
|
6
|
+
export const motion = placement => ({
|
|
7
|
+
motionAppear: true,
|
|
8
|
+
motionName: `panelMotionMobile-${placement}`,
|
|
9
|
+
});
|
|
10
|
+
export const motionProps = {
|
|
11
|
+
maskMotion,
|
|
12
|
+
motion,
|
|
13
|
+
};
|
|
14
|
+
export const SWIPE_DIRECTION_TO_POSITION_MAP = {
|
|
15
|
+
Right: 'right',
|
|
16
|
+
Left: 'left',
|
|
17
|
+
Up: 'top',
|
|
18
|
+
Down: 'bottom',
|
|
19
|
+
};
|
|
20
|
+
export const POSITION_TO_SWIPE_DIRECTION_MAP = Object.fromEntries(Object.entries(SWIPE_DIRECTION_TO_POSITION_MAP).map(([key, value]) => [value, key]));
|
|
21
|
+
export const DRAWER_CLOSING_TIMEOUT = 300;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { Position } from '../../types';
|
|
3
|
+
type UseSwipePropsProps = {
|
|
4
|
+
onSwiped(): void;
|
|
5
|
+
position: Position;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function useSwipeProps({ onSwiped, position, enabled }: UseSwipePropsProps): {
|
|
9
|
+
swipeRef: import("react").Ref<HTMLDivElement>;
|
|
10
|
+
drawerStyles: CSSProperties | undefined;
|
|
11
|
+
maskStyles: CSSProperties | undefined;
|
|
12
|
+
showPointer: boolean;
|
|
13
|
+
swipeProps: {
|
|
14
|
+
onMouseDown?(event: import("react").MouseEvent): void;
|
|
15
|
+
"data-swipe-directions"?: string;
|
|
16
|
+
};
|
|
17
|
+
drawerMotionProps: {
|
|
18
|
+
onLeaveActive: () => void;
|
|
19
|
+
onLeaveEnd: () => void;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import mergeRefs from 'merge-refs';
|
|
13
|
+
import { useRef, useState } from 'react';
|
|
14
|
+
import { DATA_SWIPE_DIRECTIONS_ATTRIBUTE, useSwipeable } from '@snack-uikit/utils';
|
|
15
|
+
import { POSITION_TO_SWIPE_DIRECTION_MAP, SWIPE_DIRECTION_TO_POSITION_MAP } from './constants';
|
|
16
|
+
const TRANSFORM = 0;
|
|
17
|
+
const SWIPE_DURATION = 500;
|
|
18
|
+
export function useSwipeProps({ onSwiped, position, enabled }) {
|
|
19
|
+
var _a, _b, _c;
|
|
20
|
+
const swipeRef = useRef(null);
|
|
21
|
+
const canCloseDrawer = useRef(true);
|
|
22
|
+
const itemSize = (_c = (position === 'bottom' || position === 'top' ? (_a = swipeRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight : (_b = swipeRef.current) === null || _b === void 0 ? void 0 : _b.offsetWidth)) !== null && _c !== void 0 ? _c : 0;
|
|
23
|
+
const swipeStart = useRef(0);
|
|
24
|
+
const getInitialDrag = () => ({
|
|
25
|
+
initial: TRANSFORM,
|
|
26
|
+
start: 0,
|
|
27
|
+
isDown: false,
|
|
28
|
+
drag: 0,
|
|
29
|
+
finished: true,
|
|
30
|
+
pointers: true,
|
|
31
|
+
});
|
|
32
|
+
const [drag, setDrag] = useState(getInitialDrag);
|
|
33
|
+
const [styles, setStyles] = useState();
|
|
34
|
+
const getDrawerTransform = (value) => {
|
|
35
|
+
switch (position) {
|
|
36
|
+
case 'bottom':
|
|
37
|
+
case 'top':
|
|
38
|
+
return `translateY(${TRANSFORM - value}px)`;
|
|
39
|
+
case 'right':
|
|
40
|
+
case 'left':
|
|
41
|
+
default:
|
|
42
|
+
return `translateX(${TRANSFORM - value}px)`;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const getMaskOpacity = (value) => 1 + value / itemSize;
|
|
46
|
+
const resetStyles = () => {
|
|
47
|
+
setStyles(undefined);
|
|
48
|
+
setDrag(getInitialDrag());
|
|
49
|
+
};
|
|
50
|
+
const isContainedInArea = ({ element, condition, }) => {
|
|
51
|
+
if (!element) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (element === swipeRef.current) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (!element.parentElement) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return condition(element) || isContainedInArea({ element: element.parentElement, condition });
|
|
61
|
+
};
|
|
62
|
+
const isSwipeEnabled = (eventData) => {
|
|
63
|
+
const element = eventData.event.target;
|
|
64
|
+
const equalDirectionsCondition = (el) => {
|
|
65
|
+
var _a, _b;
|
|
66
|
+
const directions = (_b = (_a = el.getAttribute(DATA_SWIPE_DIRECTIONS_ATTRIBUTE)) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];
|
|
67
|
+
return directions.some(direction => direction === eventData.dir);
|
|
68
|
+
};
|
|
69
|
+
if (isContainedInArea({ element, condition: equalDirectionsCondition })) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return position === SWIPE_DIRECTION_TO_POSITION_MAP[eventData.dir];
|
|
73
|
+
};
|
|
74
|
+
const handleSwipeStart = () => {
|
|
75
|
+
swipeStart.current = Date.now();
|
|
76
|
+
};
|
|
77
|
+
const handleSwiping = eventData => {
|
|
78
|
+
if (!isSwipeEnabled(eventData)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!canCloseDrawer.current) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
let adjustedDrag = 0;
|
|
85
|
+
const element = eventData.event.target;
|
|
86
|
+
switch (position) {
|
|
87
|
+
case 'left':
|
|
88
|
+
if (isContainedInArea({ element, condition: el => el.scrollWidth - el.offsetWidth > el.scrollLeft })) {
|
|
89
|
+
canCloseDrawer.current = false;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
adjustedDrag = Math.max(0, -eventData.deltaX);
|
|
93
|
+
break;
|
|
94
|
+
case 'right':
|
|
95
|
+
if (isContainedInArea({ element, condition: el => el.scrollLeft > 0 })) {
|
|
96
|
+
canCloseDrawer.current = false;
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
adjustedDrag = Math.min(0, -eventData.deltaX);
|
|
100
|
+
break;
|
|
101
|
+
case 'top':
|
|
102
|
+
if (isContainedInArea({ element, condition: el => el.scrollHeight - el.offsetHeight > el.scrollTop })) {
|
|
103
|
+
canCloseDrawer.current = false;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
adjustedDrag = Math.max(0, -eventData.deltaY);
|
|
107
|
+
break;
|
|
108
|
+
case 'bottom':
|
|
109
|
+
if (isContainedInArea({ element, condition: el => el.scrollTop > 0 })) {
|
|
110
|
+
canCloseDrawer.current = false;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
adjustedDrag = Math.min(0, -eventData.deltaY);
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
setDrag(prevDrag => (Object.assign(Object.assign({}, prevDrag), { drag: adjustedDrag, pointers: eventData.absX < Number.MIN_SAFE_INTEGER })));
|
|
119
|
+
setStyles({
|
|
120
|
+
drawer: { transform: getDrawerTransform(adjustedDrag), transition: 'none' },
|
|
121
|
+
mask: { opacity: getMaskOpacity(adjustedDrag), transition: 'none' },
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
const handleSwiped = eventData => {
|
|
125
|
+
if (!isSwipeEnabled(eventData)) {
|
|
126
|
+
return resetStyles();
|
|
127
|
+
}
|
|
128
|
+
if (Date.now() - swipeStart.current > SWIPE_DURATION) {
|
|
129
|
+
return resetStyles();
|
|
130
|
+
}
|
|
131
|
+
if (!canCloseDrawer.current) {
|
|
132
|
+
canCloseDrawer.current = true;
|
|
133
|
+
return resetStyles();
|
|
134
|
+
}
|
|
135
|
+
onSwiped();
|
|
136
|
+
setStyles({ drawer: { transform: getDrawerTransform(drag.drag) }, mask: { opacity: getMaskOpacity(drag.drag) } });
|
|
137
|
+
setDrag(prevDrag => (Object.assign(Object.assign({}, prevDrag), { drag: 0, isDown: false, finished: true, pointers: true })));
|
|
138
|
+
};
|
|
139
|
+
const _d = useSwipeable({
|
|
140
|
+
onSwipeStart: handleSwipeStart,
|
|
141
|
+
onSwiping: handleSwiping,
|
|
142
|
+
onSwiped: handleSwiped,
|
|
143
|
+
enabled,
|
|
144
|
+
availableDirections: [POSITION_TO_SWIPE_DIRECTION_MAP[position]],
|
|
145
|
+
trackMouse: true,
|
|
146
|
+
}), { ref } = _d, swipeProps = __rest(_d, ["ref"]);
|
|
147
|
+
return {
|
|
148
|
+
swipeRef: mergeRefs(ref, swipeRef),
|
|
149
|
+
drawerStyles: styles === null || styles === void 0 ? void 0 : styles.drawer,
|
|
150
|
+
maskStyles: styles === null || styles === void 0 ? void 0 : styles.mask,
|
|
151
|
+
showPointer: !drag.pointers,
|
|
152
|
+
swipeProps,
|
|
153
|
+
drawerMotionProps: {
|
|
154
|
+
onLeaveActive: () => setStyles(undefined),
|
|
155
|
+
onLeaveEnd: () => setStyles(undefined),
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MobileDrawerCustom';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MobileDrawerCustom';
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
.maskMotionMobile {
|
|
2
|
+
opacity: unset;
|
|
3
|
+
}
|
|
4
|
+
.maskMotionMobile-enter, .maskMotionMobile-appear {
|
|
5
|
+
opacity: 0;
|
|
6
|
+
}
|
|
7
|
+
.maskMotionMobile-enter-active, .maskMotionMobile-appear-active {
|
|
8
|
+
opacity: 1;
|
|
9
|
+
transition: opacity 0.2s;
|
|
10
|
+
}
|
|
11
|
+
.maskMotionMobile-leave {
|
|
12
|
+
opacity: 1;
|
|
13
|
+
}
|
|
14
|
+
.maskMotionMobile-leave-active {
|
|
15
|
+
opacity: 0;
|
|
16
|
+
transition: opacity 0.1s;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.panelMotionMobile {
|
|
20
|
+
transform: unset;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** LEFT */
|
|
24
|
+
.panelMotionMobile-left-enter-start, .panelMotionMobile-left-appear-start, .panelMotionMobile-left-leave-start {
|
|
25
|
+
transition: none !important;
|
|
26
|
+
}
|
|
27
|
+
.panelMotionMobile-left-enter-active, .panelMotionMobile-left-appear-active {
|
|
28
|
+
transition: transform 0.2s ease-in-out;
|
|
29
|
+
}
|
|
30
|
+
.panelMotionMobile-left-leave-active {
|
|
31
|
+
transition: transform 0.1s ease-out;
|
|
32
|
+
}
|
|
33
|
+
.panelMotionMobile-left-enter, .panelMotionMobile-left-appear {
|
|
34
|
+
transform: translateX(-100%);
|
|
35
|
+
}
|
|
36
|
+
.panelMotionMobile-left-enter-active, .panelMotionMobile-left-appear-active {
|
|
37
|
+
transform: translateX(0);
|
|
38
|
+
}
|
|
39
|
+
.panelMotionMobile-left-leave {
|
|
40
|
+
transform: translateX(0);
|
|
41
|
+
}
|
|
42
|
+
.panelMotionMobile-left-leave-active {
|
|
43
|
+
transform: translateX(-100%) !important;
|
|
44
|
+
}
|
|
45
|
+
/*********/
|
|
46
|
+
|
|
47
|
+
/** RIGHT */
|
|
48
|
+
.panelMotionMobile-right-enter-start, .panelMotionMobile-right-appear-start, .panelMotionMobile-right-leave-start {
|
|
49
|
+
transition: none !important;
|
|
50
|
+
}
|
|
51
|
+
.panelMotionMobile-right-enter-active, .panelMotionMobile-right-appear-active {
|
|
52
|
+
transition: transform 0.2s ease-in-out;
|
|
53
|
+
}
|
|
54
|
+
.panelMotionMobile-right-leave-active {
|
|
55
|
+
transition: transform 0.1s ease-out;
|
|
56
|
+
}
|
|
57
|
+
.panelMotionMobile-right-enter, .panelMotionMobile-right-appear {
|
|
58
|
+
transform: translateX(100%);
|
|
59
|
+
}
|
|
60
|
+
.panelMotionMobile-right-enter-active, .panelMotionMobile-right-appear-active {
|
|
61
|
+
transform: translateX(0);
|
|
62
|
+
}
|
|
63
|
+
.panelMotionMobile-right-leave {
|
|
64
|
+
transform: translateX(0);
|
|
65
|
+
}
|
|
66
|
+
.panelMotionMobile-right-leave-active {
|
|
67
|
+
transform: translateX(100%) !important;
|
|
68
|
+
}
|
|
69
|
+
/**********/
|
|
70
|
+
|
|
71
|
+
/** BOTTOM */
|
|
72
|
+
.panelMotionMobile-bottom-enter-start, .panelMotionMobile-bottom-appear-start, .panelMotionMobile-bottom-leave-start {
|
|
73
|
+
transition: none !important;
|
|
74
|
+
}
|
|
75
|
+
.panelMotionMobile-bottom-enter-active, .panelMotionMobile-bottom-appear-active {
|
|
76
|
+
transition: transform 0.2s ease-in-out;
|
|
77
|
+
}
|
|
78
|
+
.panelMotionMobile-bottom-leave-active {
|
|
79
|
+
transition: transform 0.1s ease-out;
|
|
80
|
+
}
|
|
81
|
+
.panelMotionMobile-bottom-enter, .panelMotionMobile-bottom-appear {
|
|
82
|
+
transform: translateY(100%);
|
|
83
|
+
}
|
|
84
|
+
.panelMotionMobile-bottom-enter-active, .panelMotionMobile-bottom-appear-active {
|
|
85
|
+
transform: translateY(0);
|
|
86
|
+
}
|
|
87
|
+
.panelMotionMobile-bottom-leave {
|
|
88
|
+
transform: translateY(0);
|
|
89
|
+
}
|
|
90
|
+
.panelMotionMobile-bottom-leave-active {
|
|
91
|
+
transform: translateY(100%) !important;
|
|
92
|
+
}
|
|
93
|
+
/***********/
|
|
94
|
+
|
|
95
|
+
/** TOP */
|
|
96
|
+
.panelMotionMobile-top-enter-start, .panelMotionMobile-top-appear-start, .panelMotionMobile-top-leave-start {
|
|
97
|
+
transition: none !important;
|
|
98
|
+
}
|
|
99
|
+
.panelMotionMobile-top-enter-active, .panelMotionMobile-top-appear-active {
|
|
100
|
+
transition: transform 0.2s ease-in-out;
|
|
101
|
+
}
|
|
102
|
+
.panelMotionMobile-top-leave-active {
|
|
103
|
+
transition: transform 0.1s ease-out;
|
|
104
|
+
}
|
|
105
|
+
.panelMotionMobile-top-enter, .panelMotionMobile-top-appear {
|
|
106
|
+
transform: translateY(-100%);
|
|
107
|
+
}
|
|
108
|
+
.panelMotionMobile-top-enter-active, .panelMotionMobile-top-appear-active {
|
|
109
|
+
transform: translateY(0);
|
|
110
|
+
}
|
|
111
|
+
.panelMotionMobile-top-leave {
|
|
112
|
+
transform: translateY(0);
|
|
113
|
+
}
|
|
114
|
+
.panelMotionMobile-top-leave-active {
|
|
115
|
+
transform: translateY(-100%) !important;
|
|
116
|
+
}
|
|
117
|
+
/********/
|