@cloud-ru/uikit-product-mobile-drawer 0.9.15 → 0.9.16

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 (100) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/components/MobileDrawer/MobileDrawer.d.ts +40 -0
  3. package/dist/cjs/components/MobileDrawer/MobileDrawer.js +29 -0
  4. package/dist/cjs/components/MobileDrawer/index.d.ts +1 -0
  5. package/dist/cjs/components/MobileDrawer/index.js +17 -0
  6. package/dist/cjs/components/MobileDrawer/styles.module.css +4 -0
  7. package/dist/cjs/components/MobileDrawerCustom/MobileDrawerCustom.d.ts +50 -0
  8. package/dist/cjs/components/MobileDrawerCustom/MobileDrawerCustom.js +72 -0
  9. package/dist/cjs/components/MobileDrawerCustom/constants.d.ts +10 -0
  10. package/dist/cjs/components/MobileDrawerCustom/constants.js +25 -0
  11. package/dist/cjs/components/MobileDrawerCustom/hooks.d.ts +22 -0
  12. package/dist/cjs/components/MobileDrawerCustom/hooks.js +164 -0
  13. package/dist/cjs/components/MobileDrawerCustom/index.d.ts +1 -0
  14. package/dist/cjs/components/MobileDrawerCustom/index.js +17 -0
  15. package/dist/cjs/components/MobileDrawerCustom/motion.css +117 -0
  16. package/dist/cjs/components/MobileDrawerCustom/styles.module.css +182 -0
  17. package/dist/cjs/components/index.d.ts +2 -0
  18. package/dist/cjs/components/index.js +18 -0
  19. package/dist/cjs/constants.d.ts +36 -0
  20. package/dist/cjs/constants.js +39 -0
  21. package/dist/cjs/helperComponents/Body/Body.d.ts +10 -0
  22. package/dist/cjs/helperComponents/Body/Body.js +27 -0
  23. package/dist/cjs/helperComponents/Body/index.d.ts +1 -0
  24. package/dist/cjs/helperComponents/Body/index.js +17 -0
  25. package/dist/cjs/helperComponents/Body/styles.module.css +9 -0
  26. package/dist/cjs/helperComponents/ButtonClose/ButtonClose.d.ts +5 -0
  27. package/dist/cjs/helperComponents/ButtonClose/ButtonClose.js +13 -0
  28. package/dist/cjs/helperComponents/ButtonClose/index.d.ts +1 -0
  29. package/dist/cjs/helperComponents/ButtonClose/index.js +17 -0
  30. package/dist/cjs/helperComponents/ButtonClose/styles.module.css +35 -0
  31. package/dist/cjs/helperComponents/Footer/Footer.d.ts +10 -0
  32. package/dist/cjs/helperComponents/Footer/Footer.js +27 -0
  33. package/dist/cjs/helperComponents/Footer/index.d.ts +1 -0
  34. package/dist/cjs/helperComponents/Footer/index.js +17 -0
  35. package/dist/cjs/helperComponents/Footer/styles.module.css +14 -0
  36. package/dist/cjs/helperComponents/Header/Header.d.ts +20 -0
  37. package/dist/cjs/helperComponents/Header/Header.js +29 -0
  38. package/dist/cjs/helperComponents/Header/index.d.ts +1 -0
  39. package/dist/cjs/helperComponents/Header/index.js +17 -0
  40. package/dist/cjs/helperComponents/Header/styles.module.css +32 -0
  41. package/dist/cjs/helperComponents/WithTooltip/WithTooltip.d.ts +8 -0
  42. package/dist/cjs/helperComponents/WithTooltip/WithTooltip.js +11 -0
  43. package/dist/cjs/helperComponents/WithTooltip/index.d.ts +1 -0
  44. package/dist/cjs/helperComponents/WithTooltip/index.js +17 -0
  45. package/dist/cjs/helperComponents/index.d.ts +4 -0
  46. package/dist/cjs/helperComponents/index.js +20 -0
  47. package/dist/cjs/index.d.ts +1 -0
  48. package/dist/cjs/index.js +17 -0
  49. package/dist/cjs/types.d.ts +6 -0
  50. package/dist/cjs/types.js +2 -0
  51. package/dist/esm/components/MobileDrawer/MobileDrawer.d.ts +40 -0
  52. package/dist/esm/components/MobileDrawer/MobileDrawer.js +23 -0
  53. package/dist/esm/components/MobileDrawer/index.d.ts +1 -0
  54. package/dist/esm/components/MobileDrawer/index.js +1 -0
  55. package/dist/esm/components/MobileDrawer/styles.module.css +4 -0
  56. package/dist/esm/components/MobileDrawerCustom/MobileDrawerCustom.d.ts +50 -0
  57. package/dist/esm/components/MobileDrawerCustom/MobileDrawerCustom.js +66 -0
  58. package/dist/esm/components/MobileDrawerCustom/constants.d.ts +10 -0
  59. package/dist/esm/components/MobileDrawerCustom/constants.js +21 -0
  60. package/dist/esm/components/MobileDrawerCustom/hooks.d.ts +22 -0
  61. package/dist/esm/components/MobileDrawerCustom/hooks.js +158 -0
  62. package/dist/esm/components/MobileDrawerCustom/index.d.ts +1 -0
  63. package/dist/esm/components/MobileDrawerCustom/index.js +1 -0
  64. package/dist/esm/components/MobileDrawerCustom/motion.css +117 -0
  65. package/dist/esm/components/MobileDrawerCustom/styles.module.css +182 -0
  66. package/dist/esm/components/index.d.ts +2 -0
  67. package/dist/esm/components/index.js +2 -0
  68. package/dist/esm/constants.d.ts +36 -0
  69. package/dist/esm/constants.js +36 -0
  70. package/dist/esm/helperComponents/Body/Body.d.ts +10 -0
  71. package/dist/esm/helperComponents/Body/Body.js +21 -0
  72. package/dist/esm/helperComponents/Body/index.d.ts +1 -0
  73. package/dist/esm/helperComponents/Body/index.js +1 -0
  74. package/dist/esm/helperComponents/Body/styles.module.css +9 -0
  75. package/dist/esm/helperComponents/ButtonClose/ButtonClose.d.ts +5 -0
  76. package/dist/esm/helperComponents/ButtonClose/ButtonClose.js +7 -0
  77. package/dist/esm/helperComponents/ButtonClose/index.d.ts +1 -0
  78. package/dist/esm/helperComponents/ButtonClose/index.js +1 -0
  79. package/dist/esm/helperComponents/ButtonClose/styles.module.css +35 -0
  80. package/dist/esm/helperComponents/Footer/Footer.d.ts +10 -0
  81. package/dist/esm/helperComponents/Footer/Footer.js +21 -0
  82. package/dist/esm/helperComponents/Footer/index.d.ts +1 -0
  83. package/dist/esm/helperComponents/Footer/index.js +1 -0
  84. package/dist/esm/helperComponents/Footer/styles.module.css +14 -0
  85. package/dist/esm/helperComponents/Header/Header.d.ts +20 -0
  86. package/dist/esm/helperComponents/Header/Header.js +23 -0
  87. package/dist/esm/helperComponents/Header/index.d.ts +1 -0
  88. package/dist/esm/helperComponents/Header/index.js +1 -0
  89. package/dist/esm/helperComponents/Header/styles.module.css +32 -0
  90. package/dist/esm/helperComponents/WithTooltip/WithTooltip.d.ts +8 -0
  91. package/dist/esm/helperComponents/WithTooltip/WithTooltip.js +8 -0
  92. package/dist/esm/helperComponents/WithTooltip/index.d.ts +1 -0
  93. package/dist/esm/helperComponents/WithTooltip/index.js +1 -0
  94. package/dist/esm/helperComponents/index.d.ts +4 -0
  95. package/dist/esm/helperComponents/index.js +4 -0
  96. package/dist/esm/index.d.ts +1 -0
  97. package/dist/esm/index.js +1 -0
  98. package/dist/esm/types.d.ts +6 -0
  99. package/dist/esm/types.js +1 -0
  100. 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,4 @@
1
+ export * from './Body';
2
+ export * from './ButtonClose';
3
+ export * from './Footer';
4
+ export * from './Header';
@@ -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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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,4 @@
1
+ .footerPlug{
2
+ min-height:16px;
3
+ height:16px;
4
+ }
@@ -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
+ /********/