@alfalab/core-components-base-modal 6.0.0 → 6.1.0-snapshot-92b8690
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/dynamic-mixins/Component.d.ts +164 -0
- package/dynamic-mixins/Component.js +289 -0
- package/dynamic-mixins/Component.js.map +1 -0
- package/dynamic-mixins/helpers/lockScroll.d.ts +8 -0
- package/dynamic-mixins/helpers/lockScroll.js +29 -0
- package/dynamic-mixins/helpers/lockScroll.js.map +1 -0
- package/dynamic-mixins/index.css +59 -0
- package/dynamic-mixins/index.d.ts +3 -0
- package/dynamic-mixins/index.js +22 -0
- package/dynamic-mixins/index.js.map +1 -0
- package/dynamic-mixins/index.module.css.js +8 -0
- package/dynamic-mixins/index.module.css.js.map +1 -0
- package/dynamic-mixins/matches-polyfill.d.ts +1 -0
- package/dynamic-mixins/matches-polyfill.js +21 -0
- package/dynamic-mixins/matches-polyfill.js.map +1 -0
- package/dynamic-mixins/utils.d.ts +5 -0
- package/dynamic-mixins/utils.js +100 -0
- package/dynamic-mixins/utils.js.map +1 -0
- package/esm/index.css +14 -14
- package/esm/index.module.css.js +1 -1
- package/esm/index.module.css.js.map +1 -1
- package/index.css +14 -14
- package/index.module.css.js +1 -1
- package/index.module.css.js.map +1 -1
- package/modern/index.css +14 -14
- package/modern/index.module.css.js +1 -1
- package/modern/index.module.css.js.map +1 -1
- package/moderncssm/index.module.css +2 -0
- package/package.json +9 -9
- package/src/index.module.css +1 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import React, { ComponentType, KeyboardEvent, MouseEvent, MutableRefObject, ReactNode, Ref, WheelEvent } from 'react';
|
|
2
|
+
import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
|
|
3
|
+
import { BackdropProps } from '@alfalab/core-components-backdrop';
|
|
4
|
+
import { PortalProps } from '@alfalab/core-components-portal';
|
|
5
|
+
import './matches-polyfill';
|
|
6
|
+
export declare type BaseModalProps = {
|
|
7
|
+
/**
|
|
8
|
+
* Контент
|
|
9
|
+
*/
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Компонент бэкдропа
|
|
13
|
+
*/
|
|
14
|
+
Backdrop?: ComponentType<BackdropProps>;
|
|
15
|
+
/**
|
|
16
|
+
* Свойства для Бэкдропа
|
|
17
|
+
*/
|
|
18
|
+
backdropProps?: Partial<BackdropProps> & Record<string, unknown>;
|
|
19
|
+
/**
|
|
20
|
+
* Нода, компонент или функция возвращающая их
|
|
21
|
+
*
|
|
22
|
+
* Контейнер к которому будут добавляться порталы
|
|
23
|
+
*/
|
|
24
|
+
container?: PortalProps['getPortalContainer'];
|
|
25
|
+
/**
|
|
26
|
+
* Отключает автоматический перевод фокуса на модалку при открытии
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
disableAutoFocus?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Отключает ловушку фокуса
|
|
32
|
+
* @default false
|
|
33
|
+
*/
|
|
34
|
+
disableFocusLock?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Отключает восстановление фокуса на предыдущем элементе после закрытия модалки
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
disableRestoreFocus?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Отключает вызов `callback` при нажатии Escape
|
|
42
|
+
* @default false
|
|
43
|
+
*/
|
|
44
|
+
disableEscapeKeyDown?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Отключает вызов `callback` при клике на бэкдроп
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
disableBackdropClick?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Отключает блокировку скролла при открытии модального окна
|
|
52
|
+
* @default false
|
|
53
|
+
*/
|
|
54
|
+
disableBlockingScroll?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Содержимое модалки всегда в DOM
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
keepMounted?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Управление видимостью модалки
|
|
62
|
+
*/
|
|
63
|
+
open: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Дополнительный класс
|
|
66
|
+
*/
|
|
67
|
+
className?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Дополнительный класс
|
|
70
|
+
*/
|
|
71
|
+
contentClassName?: string;
|
|
72
|
+
/**
|
|
73
|
+
* Дополнительные пропсы на dialog wrapper
|
|
74
|
+
*/
|
|
75
|
+
wrapperProps?: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;
|
|
76
|
+
/**
|
|
77
|
+
* Дополнительные пропсы на обертку контента
|
|
78
|
+
*/
|
|
79
|
+
contentProps?: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;
|
|
80
|
+
/**
|
|
81
|
+
* Дополнительные пропсы на компонентную обертку контента
|
|
82
|
+
*/
|
|
83
|
+
componentDivProps?: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;
|
|
84
|
+
/**
|
|
85
|
+
* Дополнительный класс для обертки (Modal)
|
|
86
|
+
*/
|
|
87
|
+
wrapperClassName?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Обработчик скролла контента
|
|
90
|
+
*/
|
|
91
|
+
scrollHandler?: 'wrapper' | 'content' | MutableRefObject<HTMLDivElement | null>;
|
|
92
|
+
/**
|
|
93
|
+
* Пропсы для анимации (CSSTransition)
|
|
94
|
+
*/
|
|
95
|
+
transitionProps?: Partial<CSSTransitionProps>;
|
|
96
|
+
/**
|
|
97
|
+
* Рендерить ли в контейнер через портал.
|
|
98
|
+
* @default true
|
|
99
|
+
*/
|
|
100
|
+
usePortal?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Обработчик события нажатия на бэкдроп
|
|
103
|
+
*/
|
|
104
|
+
onBackdropClick?: (event: MouseEvent) => void;
|
|
105
|
+
/**
|
|
106
|
+
* Обработчик события нажатия на Escape
|
|
107
|
+
*
|
|
108
|
+
* Если `disableEscapeKeyDown` - false и модальное окно в фокусе
|
|
109
|
+
*/
|
|
110
|
+
onEscapeKeyDown?: (event: KeyboardEvent) => void;
|
|
111
|
+
/**
|
|
112
|
+
* Обработчик закрытия
|
|
113
|
+
*/
|
|
114
|
+
onClose?: (event: MouseEvent<HTMLElement> | KeyboardEvent<HTMLElement>, reason?: 'backdropClick' | 'escapeKeyDown' | 'closerClick') => void;
|
|
115
|
+
/**
|
|
116
|
+
* Обработчик события onEntered компонента Transition
|
|
117
|
+
*/
|
|
118
|
+
onMount?: () => void;
|
|
119
|
+
/**
|
|
120
|
+
* Обработчик события onExited компонента Transition
|
|
121
|
+
*/
|
|
122
|
+
onUnmount?: () => void;
|
|
123
|
+
/**
|
|
124
|
+
* Идентификатор для систем автоматизированного тестирования
|
|
125
|
+
*/
|
|
126
|
+
dataTestId?: string;
|
|
127
|
+
/**
|
|
128
|
+
* z-index компонента
|
|
129
|
+
*/
|
|
130
|
+
zIndex?: number;
|
|
131
|
+
/**
|
|
132
|
+
* Реф, который должен быть установлен компонентной области
|
|
133
|
+
*/
|
|
134
|
+
componentRef?: MutableRefObject<HTMLDivElement | null>;
|
|
135
|
+
/**
|
|
136
|
+
* Реф контентной области
|
|
137
|
+
*/
|
|
138
|
+
contentElementRef?: MutableRefObject<HTMLDivElement | null>;
|
|
139
|
+
/**
|
|
140
|
+
* Блокирует скролл когда модальное окно открыто. Работает только на iOS.
|
|
141
|
+
*/
|
|
142
|
+
iOSLock?: boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Хэндлер события прокрутки колесиком
|
|
145
|
+
*/
|
|
146
|
+
onWheel?: (e: WheelEvent<HTMLElement>) => void;
|
|
147
|
+
};
|
|
148
|
+
export declare type BaseModalContext = {
|
|
149
|
+
parentRef: React.RefObject<HTMLDivElement>;
|
|
150
|
+
componentRef: React.RefObject<HTMLDivElement>;
|
|
151
|
+
hasFooter?: boolean;
|
|
152
|
+
hasHeader?: boolean;
|
|
153
|
+
hasScroll?: boolean;
|
|
154
|
+
headerHighlighted?: boolean;
|
|
155
|
+
footerHighlighted?: boolean;
|
|
156
|
+
headerOffset?: number;
|
|
157
|
+
setHeaderOffset: (offset: number) => void;
|
|
158
|
+
contentRef: Ref<HTMLElement>;
|
|
159
|
+
setHasHeader: (exists: boolean) => void;
|
|
160
|
+
setHasFooter: (exists: boolean) => void;
|
|
161
|
+
onClose: Required<BaseModalProps>['onClose'];
|
|
162
|
+
};
|
|
163
|
+
export declare const BaseModalContext: React.Context<BaseModalContext>;
|
|
164
|
+
export declare const BaseModal: React.ForwardRefExoticComponent<BaseModalProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tslib = require('tslib');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var FocusLock = require('react-focus-lock');
|
|
8
|
+
var mergeRefs = require('react-merge-refs');
|
|
9
|
+
var reactTransitionGroup = require('react-transition-group');
|
|
10
|
+
var resizeObserver = require('@juggle/resize-observer');
|
|
11
|
+
var cn = require('classnames');
|
|
12
|
+
var dynamicMixins$4 = require('@alfalab/core-components-backdrop/dynamic-mixins');
|
|
13
|
+
var dynamicMixins$2 = require('@alfalab/core-components-portal/dynamic-mixins');
|
|
14
|
+
var dynamicMixins$1 = require('@alfalab/core-components-shared/dynamic-mixins');
|
|
15
|
+
var dynamicMixins$3 = require('@alfalab/core-components-stack/dynamic-mixins');
|
|
16
|
+
var dynamicMixins = require('@alfalab/core-components-stack-context/dynamic-mixins');
|
|
17
|
+
var lockScroll = require('./helpers/lockScroll.js');
|
|
18
|
+
var utils = require('./utils.js');
|
|
19
|
+
var index_module = require('./index.module.css.js');
|
|
20
|
+
require('./matches-polyfill.js');
|
|
21
|
+
|
|
22
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
23
|
+
|
|
24
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
25
|
+
var FocusLock__default = /*#__PURE__*/_interopDefaultCompat(FocusLock);
|
|
26
|
+
var mergeRefs__default = /*#__PURE__*/_interopDefaultCompat(mergeRefs);
|
|
27
|
+
var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
|
|
28
|
+
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
30
|
+
var BaseModalContext = React__default.default.createContext({
|
|
31
|
+
parentRef: { current: null },
|
|
32
|
+
componentRef: { current: null },
|
|
33
|
+
hasFooter: false,
|
|
34
|
+
hasHeader: false,
|
|
35
|
+
hasScroll: false,
|
|
36
|
+
headerHighlighted: false,
|
|
37
|
+
footerHighlighted: false,
|
|
38
|
+
headerOffset: 0,
|
|
39
|
+
setHeaderOffset: function () { return null; },
|
|
40
|
+
contentRef: function () { return null; },
|
|
41
|
+
setHasHeader: function () { return null; },
|
|
42
|
+
setHasFooter: function () { return null; },
|
|
43
|
+
onClose: function () { return null; },
|
|
44
|
+
});
|
|
45
|
+
var BaseModal = React.forwardRef(function (_a, ref) {
|
|
46
|
+
var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? dynamicMixins$4.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.disableBlockingScroll, disableBlockingScroll = _k === void 0 ? false : _k, _l = _a.keepMounted, keepMounted = _l === void 0 ? false : _l, className = _a.className, contentClassName = _a.contentClassName, wrapperProps = _a.wrapperProps, contentProps = _a.contentProps, componentDivProps = _a.componentDivProps, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _m = _a.zIndex, zIndex = _m === void 0 ? dynamicMixins.stackingOrder.MODAL : _m, _o = _a.componentRef, componentRef = _o === void 0 ? null : _o, _p = _a.contentElementRef, contentElementRef = _p === void 0 ? null : _p, _q = _a.usePortal, usePortal = _q === void 0 ? true : _q, _r = _a.iOSLock, iOSLock = _r === void 0 ? false : _r, onWheel = _a.onWheel;
|
|
47
|
+
var _s = React.useState(null), exited = _s[0], setExited = _s[1];
|
|
48
|
+
var _t = React.useState(false), hasScroll = _t[0], setHasScroll = _t[1];
|
|
49
|
+
var _u = React.useState(false), hasHeader = _u[0], setHasHeader = _u[1];
|
|
50
|
+
var _v = React.useState(false), hasFooter = _v[0], setHasFooter = _v[1];
|
|
51
|
+
var _w = React.useState(false), headerHighlighted = _w[0], setHeaderHighlighted = _w[1];
|
|
52
|
+
var _x = React.useState(false), footerHighlighted = _x[0], setFooterHighlighted = _x[1];
|
|
53
|
+
var _y = React.useState(0), headerOffset = _y[0], setHeaderOffset = _y[1];
|
|
54
|
+
var componentNodeRef = React.useRef(null);
|
|
55
|
+
var wrapperRef = React.useRef(null);
|
|
56
|
+
var scrollableNodeRef = React.useRef(null);
|
|
57
|
+
var contentNodeRef = React.useRef(null);
|
|
58
|
+
var restoreContainerStylesRef = React.useRef(null);
|
|
59
|
+
var mouseDownTarget = React.useRef();
|
|
60
|
+
var resizeObserverRef = React.useRef();
|
|
61
|
+
var checkToHasScrollBar = function () {
|
|
62
|
+
if (scrollableNodeRef.current) {
|
|
63
|
+
var scrollExists = utils.hasScrollbar(scrollableNodeRef.current);
|
|
64
|
+
setFooterHighlighted(scrollExists);
|
|
65
|
+
setHasScroll(scrollExists);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var isExited = exited || exited === null;
|
|
69
|
+
var shouldRender = keepMounted || open || !isExited;
|
|
70
|
+
var getContainer = React.useCallback(function () { return (container ? container() : document.body); }, [container]);
|
|
71
|
+
var addResizeHandle = React.useCallback(function () {
|
|
72
|
+
if (!resizeObserverRef.current)
|
|
73
|
+
return;
|
|
74
|
+
if (scrollableNodeRef.current) {
|
|
75
|
+
resizeObserverRef.current.observe(scrollableNodeRef.current);
|
|
76
|
+
}
|
|
77
|
+
if (contentNodeRef.current) {
|
|
78
|
+
resizeObserverRef.current.observe(contentNodeRef.current);
|
|
79
|
+
}
|
|
80
|
+
}, []);
|
|
81
|
+
var removeResizeHandle = React.useCallback(function () { var _a; return (_a = resizeObserverRef.current) === null || _a === void 0 ? void 0 : _a.disconnect(); }, []);
|
|
82
|
+
var contentRef = React.useCallback(function (node) {
|
|
83
|
+
if (node !== null) {
|
|
84
|
+
contentNodeRef.current = node;
|
|
85
|
+
if (resizeObserverRef.current) {
|
|
86
|
+
resizeObserverRef.current.observe(node);
|
|
87
|
+
}
|
|
88
|
+
checkToHasScrollBar();
|
|
89
|
+
}
|
|
90
|
+
}, []);
|
|
91
|
+
var handleScroll = React.useCallback(function () {
|
|
92
|
+
if (!scrollableNodeRef.current || !componentNodeRef.current)
|
|
93
|
+
return;
|
|
94
|
+
if (hasHeader) {
|
|
95
|
+
setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
|
|
96
|
+
componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 1);
|
|
97
|
+
}
|
|
98
|
+
if (hasFooter) {
|
|
99
|
+
setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
|
|
100
|
+
componentNodeRef.current.getBoundingClientRect().bottom >=
|
|
101
|
+
window.innerHeight - 1);
|
|
102
|
+
}
|
|
103
|
+
}, [hasFooter, hasHeader, headerOffset]);
|
|
104
|
+
var handleClose = React.useCallback(function (event, reason) {
|
|
105
|
+
if (iOSLock && dynamicMixins$1.os.isIOS()) {
|
|
106
|
+
lockScroll.unlockScroll();
|
|
107
|
+
}
|
|
108
|
+
if (onClose) {
|
|
109
|
+
onClose(event, reason);
|
|
110
|
+
}
|
|
111
|
+
if (reason === 'backdropClick' && onBackdropClick) {
|
|
112
|
+
onBackdropClick(event);
|
|
113
|
+
}
|
|
114
|
+
if (reason === 'escapeKeyDown' && onEscapeKeyDown) {
|
|
115
|
+
onEscapeKeyDown(event);
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}, [onBackdropClick, onClose, onEscapeKeyDown, iOSLock]);
|
|
119
|
+
var handleBackdropMouseDown = function (event) {
|
|
120
|
+
var _a;
|
|
121
|
+
var clickedOnScrollbar = false;
|
|
122
|
+
var clientWidth = (_a = event.target) === null || _a === void 0 ? void 0 : _a.clientWidth;
|
|
123
|
+
if (event.clientX && clientWidth) {
|
|
124
|
+
// Устанавливаем смещение для абсолютно спозиционированного скроллбара в OSX в 17px.
|
|
125
|
+
var offset = dynamicMixins$1.browser.getScrollbarSize() === 0 ? 17 : 0;
|
|
126
|
+
clickedOnScrollbar = event.clientX + offset > clientWidth;
|
|
127
|
+
}
|
|
128
|
+
if (!disableBackdropClick && !clickedOnScrollbar) {
|
|
129
|
+
mouseDownTarget.current = event.target;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
var handleBackdropMouseUp = function (event) {
|
|
133
|
+
if (!disableBackdropClick &&
|
|
134
|
+
event.target === wrapperRef.current &&
|
|
135
|
+
mouseDownTarget.current === wrapperRef.current) {
|
|
136
|
+
handleClose(event, 'backdropClick');
|
|
137
|
+
}
|
|
138
|
+
mouseDownTarget.current = undefined;
|
|
139
|
+
};
|
|
140
|
+
var handleKeyDown = React.useCallback(function (event) {
|
|
141
|
+
/*
|
|
142
|
+
* Чтобы сохранить дефолтное поведение элементов и событий форм,
|
|
143
|
+
* обработчик не устанавливает event.preventDefault()
|
|
144
|
+
*/
|
|
145
|
+
if (event.key !== 'Escape') {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Если есть обработчик escape на body
|
|
149
|
+
event.stopPropagation();
|
|
150
|
+
if (!disableEscapeKeyDown && handleClose) {
|
|
151
|
+
handleClose(event, 'escapeKeyDown');
|
|
152
|
+
}
|
|
153
|
+
}, [disableEscapeKeyDown, handleClose]);
|
|
154
|
+
var getScrollHandler = React.useCallback(function () {
|
|
155
|
+
if (scrollHandler === 'wrapper')
|
|
156
|
+
return wrapperRef.current;
|
|
157
|
+
if (scrollHandler === 'content')
|
|
158
|
+
return componentNodeRef.current;
|
|
159
|
+
return scrollHandler.current || wrapperRef.current;
|
|
160
|
+
}, [scrollHandler]);
|
|
161
|
+
var handleEntered = React.useCallback(function (node, isAppearing) {
|
|
162
|
+
scrollableNodeRef.current = getScrollHandler();
|
|
163
|
+
addResizeHandle();
|
|
164
|
+
if (scrollableNodeRef.current) {
|
|
165
|
+
scrollableNodeRef.current.addEventListener('scroll', handleScroll);
|
|
166
|
+
handleScroll();
|
|
167
|
+
}
|
|
168
|
+
if (transitionProps.onEntered) {
|
|
169
|
+
transitionProps.onEntered(node, isAppearing);
|
|
170
|
+
}
|
|
171
|
+
if (onMount)
|
|
172
|
+
onMount();
|
|
173
|
+
}, [addResizeHandle, getScrollHandler, handleScroll, onMount, transitionProps]);
|
|
174
|
+
var handleExited = React.useCallback(function (node) {
|
|
175
|
+
removeResizeHandle();
|
|
176
|
+
setExited(true);
|
|
177
|
+
if (scrollableNodeRef.current) {
|
|
178
|
+
scrollableNodeRef.current.removeEventListener('scroll', handleScroll);
|
|
179
|
+
}
|
|
180
|
+
if (transitionProps.onExited) {
|
|
181
|
+
transitionProps.onExited(node);
|
|
182
|
+
}
|
|
183
|
+
if (onUnmount)
|
|
184
|
+
onUnmount();
|
|
185
|
+
if (restoreContainerStylesRef.current) {
|
|
186
|
+
restoreContainerStylesRef.current();
|
|
187
|
+
}
|
|
188
|
+
}, [handleScroll, onUnmount, removeResizeHandle, transitionProps]);
|
|
189
|
+
React.useEffect(function () {
|
|
190
|
+
if (open && isExited) {
|
|
191
|
+
if (!disableBlockingScroll) {
|
|
192
|
+
var el_1 = getContainer();
|
|
193
|
+
var shouldIOSLock = iOSLock && dynamicMixins$1.os.isIOS();
|
|
194
|
+
utils.handleContainer(el_1, shouldIOSLock);
|
|
195
|
+
if (shouldIOSLock) {
|
|
196
|
+
lockScroll.syncHeight();
|
|
197
|
+
lockScroll.lockScroll();
|
|
198
|
+
}
|
|
199
|
+
restoreContainerStylesRef.current = function () {
|
|
200
|
+
restoreContainerStylesRef.current = null;
|
|
201
|
+
utils.restoreContainerStyles(el_1);
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
setExited(false);
|
|
205
|
+
}
|
|
206
|
+
if (!open) {
|
|
207
|
+
lockScroll.unlockScroll();
|
|
208
|
+
}
|
|
209
|
+
}, [getContainer, open, disableBlockingScroll, isExited, iOSLock]);
|
|
210
|
+
React.useEffect(function () {
|
|
211
|
+
var ResizeObserver = window.ResizeObserver || resizeObserver.ResizeObserver;
|
|
212
|
+
resizeObserverRef.current = new ResizeObserver(checkToHasScrollBar);
|
|
213
|
+
return function () {
|
|
214
|
+
if (restoreContainerStylesRef.current) {
|
|
215
|
+
restoreContainerStylesRef.current();
|
|
216
|
+
}
|
|
217
|
+
if (resizeObserverRef.current) {
|
|
218
|
+
resizeObserverRef.current.disconnect();
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
}, []);
|
|
222
|
+
React.useEffect(function () {
|
|
223
|
+
var _a;
|
|
224
|
+
if (disableAutoFocus || !open)
|
|
225
|
+
return;
|
|
226
|
+
(_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
227
|
+
}, [open, disableAutoFocus]);
|
|
228
|
+
var contextValue = React.useMemo(function () { return ({
|
|
229
|
+
parentRef: wrapperRef,
|
|
230
|
+
componentRef: componentNodeRef,
|
|
231
|
+
hasHeader: hasHeader,
|
|
232
|
+
hasFooter: hasFooter,
|
|
233
|
+
hasScroll: hasScroll,
|
|
234
|
+
headerHighlighted: headerHighlighted,
|
|
235
|
+
footerHighlighted: footerHighlighted,
|
|
236
|
+
headerOffset: headerOffset,
|
|
237
|
+
setHeaderOffset: setHeaderOffset,
|
|
238
|
+
contentRef: contentRef,
|
|
239
|
+
setHasHeader: setHasHeader,
|
|
240
|
+
setHasFooter: setHasFooter,
|
|
241
|
+
onClose: handleClose,
|
|
242
|
+
}); }, [
|
|
243
|
+
contentRef,
|
|
244
|
+
hasHeader,
|
|
245
|
+
hasFooter,
|
|
246
|
+
hasScroll,
|
|
247
|
+
headerHighlighted,
|
|
248
|
+
footerHighlighted,
|
|
249
|
+
headerOffset,
|
|
250
|
+
setHeaderOffset,
|
|
251
|
+
handleClose,
|
|
252
|
+
]);
|
|
253
|
+
var renderContent = function () { return (React__default.default.createElement(dynamicMixins$3.Stack, { value: zIndex }, function (computedZIndex) {
|
|
254
|
+
var _a, _b;
|
|
255
|
+
return (React__default.default.createElement(BaseModalContext.Provider, { value: contextValue },
|
|
256
|
+
React__default.default.createElement(FocusLock__default.default, { disabled: disableFocusLock || !open, returnFocus: !disableRestoreFocus },
|
|
257
|
+
Backdrop && (React__default.default.createElement(Backdrop, tslib.__assign({}, backdropProps, { className: cn__default.default(backdropProps.className, index_module.backdrop), open: open, style: {
|
|
258
|
+
zIndex: computedZIndex,
|
|
259
|
+
} }))),
|
|
260
|
+
React__default.default.createElement("div", tslib.__assign({}, wrapperProps, { role: 'dialog', className: cn__default.default(index_module.wrapper, wrapperClassName, wrapperProps === null || wrapperProps === void 0 ? void 0 : wrapperProps.className, (_a = {},
|
|
261
|
+
_a[index_module.hidden] = !open && isExited,
|
|
262
|
+
_a)), ref: mergeRefs__default.default([
|
|
263
|
+
ref,
|
|
264
|
+
wrapperRef,
|
|
265
|
+
wrapperProps === null || wrapperProps === void 0 ? void 0 : wrapperProps.ref,
|
|
266
|
+
]), onKeyDown: handleKeyDown, onMouseDown: handleBackdropMouseDown, onMouseUp: handleBackdropMouseUp, onWheel: onWheel, tabIndex: -1, "data-test-id": dataTestId, style: {
|
|
267
|
+
zIndex: computedZIndex,
|
|
268
|
+
} }),
|
|
269
|
+
React__default.default.createElement(reactTransitionGroup.CSSTransition, tslib.__assign({ appear: true, timeout: 200, classNames: index_module, nodeRef: componentNodeRef }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
|
|
270
|
+
React__default.default.createElement("div", tslib.__assign({}, componentDivProps, { className: cn__default.default(index_module.component, className, componentDivProps === null || componentDivProps === void 0 ? void 0 : componentDivProps.className), ref: mergeRefs__default.default([
|
|
271
|
+
componentRef,
|
|
272
|
+
componentNodeRef,
|
|
273
|
+
(componentDivProps === null || componentDivProps === void 0 ? void 0 : componentDivProps.ref) || null,
|
|
274
|
+
]) }),
|
|
275
|
+
React__default.default.createElement("div", tslib.__assign({}, contentProps, { className: cn__default.default(index_module.content, contentClassName, contentProps === null || contentProps === void 0 ? void 0 : contentProps.className, (_b = {},
|
|
276
|
+
_b[index_module.hasFooter] = hasFooter,
|
|
277
|
+
_b[index_module.hasHeader] = hasHeader,
|
|
278
|
+
_b)), ref: contentElementRef }), children)))))));
|
|
279
|
+
})); };
|
|
280
|
+
if (!shouldRender)
|
|
281
|
+
return null;
|
|
282
|
+
return usePortal ? (React__default.default.createElement(dynamicMixins$2.Portal, { getPortalContainer: container, immediateMount: true }, renderContent())) : (renderContent());
|
|
283
|
+
});
|
|
284
|
+
BaseModal.displayName = 'BaseModal';
|
|
285
|
+
BaseModalContext.displayName = 'BaseModalContext';
|
|
286
|
+
|
|
287
|
+
exports.BaseModal = BaseModal;
|
|
288
|
+
exports.BaseModalContext = BaseModalContext;
|
|
289
|
+
//# sourceMappingURL=Component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../src/Component.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\nimport React, {\n ComponentType,\n forwardRef,\n KeyboardEvent,\n MouseEvent,\n MutableRefObject,\n ReactNode,\n Ref,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n WheelEvent,\n} from 'react';\nimport FocusLock from 'react-focus-lock';\nimport mergeRefs from 'react-merge-refs';\nimport { CSSTransition } from 'react-transition-group';\nimport { CSSTransitionProps } from 'react-transition-group/CSSTransition';\nimport { ResizeObserver as ResizeObserverPolyfill } from '@juggle/resize-observer';\nimport cn from 'classnames';\n\nimport { Backdrop as DefaultBackdrop, BackdropProps } from '@alfalab/core-components-backdrop';\nimport { Portal, PortalProps } from '@alfalab/core-components-portal';\nimport { browser, os } from '@alfalab/core-components-shared';\nimport { Stack } from '@alfalab/core-components-stack';\nimport { stackingOrder } from '@alfalab/core-components-stack-context';\n\nimport { lockScroll, syncHeight, unlockScroll } from './helpers/lockScroll';\nimport {\n handleContainer,\n hasScrollbar,\n isScrolledToBottom,\n isScrolledToTop,\n restoreContainerStyles,\n} from './utils';\n\nimport styles from './index.module.css';\n\n// TODO Без полифила крашится FocusLock в IE11. Выпилить в будущем!!!.\nimport './matches-polyfill';\n\nexport type BaseModalProps = {\n /**\n * Контент\n */\n children?: ReactNode;\n\n /**\n * Компонент бэкдропа\n */\n Backdrop?: ComponentType<BackdropProps>;\n\n /**\n * Свойства для Бэкдропа\n */\n backdropProps?: Partial<BackdropProps> & Record<string, unknown>;\n\n /**\n * Нода, компонент или функция возвращающая их\n *\n * Контейнер к которому будут добавляться порталы\n */\n container?: PortalProps['getPortalContainer'];\n\n /**\n * Отключает автоматический перевод фокуса на модалку при открытии\n * @default false\n */\n disableAutoFocus?: boolean;\n\n /**\n * Отключает ловушку фокуса\n * @default false\n */\n disableFocusLock?: boolean;\n\n /**\n * Отключает восстановление фокуса на предыдущем элементе после закрытия модалки\n * @default false\n */\n disableRestoreFocus?: boolean;\n\n /**\n * Отключает вызов `callback` при нажатии Escape\n * @default false\n */\n disableEscapeKeyDown?: boolean;\n\n /**\n * Отключает вызов `callback` при клике на бэкдроп\n * @default false\n */\n disableBackdropClick?: boolean;\n\n /**\n * Отключает блокировку скролла при открытии модального окна\n * @default false\n */\n disableBlockingScroll?: boolean;\n\n /**\n * Содержимое модалки всегда в DOM\n * @default false\n */\n keepMounted?: boolean;\n\n /**\n * Управление видимостью модалки\n */\n open: boolean;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс\n */\n contentClassName?: string;\n\n /**\n * Дополнительные пропсы на dialog wrapper\n */\n wrapperProps?: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\n /**\n * Дополнительные пропсы на обертку контента\n */\n contentProps?: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\n /**\n * Дополнительные пропсы на компонентную обертку контента\n */\n componentDivProps?: React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n >;\n\n /**\n * Дополнительный класс для обертки (Modal)\n */\n wrapperClassName?: string;\n\n /**\n * Обработчик скролла контента\n */\n scrollHandler?: 'wrapper' | 'content' | MutableRefObject<HTMLDivElement | null>;\n\n /**\n * Пропсы для анимации (CSSTransition)\n */\n transitionProps?: Partial<CSSTransitionProps>;\n\n /**\n * Рендерить ли в контейнер через портал.\n * @default true\n */\n usePortal?: boolean;\n\n /**\n * Обработчик события нажатия на бэкдроп\n */\n onBackdropClick?: (event: MouseEvent) => void;\n\n /**\n * Обработчик события нажатия на Escape\n *\n * Если `disableEscapeKeyDown` - false и модальное окно в фокусе\n */\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n\n /**\n * Обработчик закрытия\n */\n onClose?: (\n event: MouseEvent<HTMLElement> | KeyboardEvent<HTMLElement>,\n reason?: 'backdropClick' | 'escapeKeyDown' | 'closerClick',\n ) => void;\n\n /**\n * Обработчик события onEntered компонента Transition\n */\n onMount?: () => void;\n\n /**\n * Обработчик события onExited компонента Transition\n */\n onUnmount?: () => void;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * z-index компонента\n */\n zIndex?: number;\n\n /**\n * Реф, который должен быть установлен компонентной области\n */\n componentRef?: MutableRefObject<HTMLDivElement | null>;\n\n /**\n * Реф контентной области\n */\n contentElementRef?: MutableRefObject<HTMLDivElement | null>;\n\n /**\n * Блокирует скролл когда модальное окно открыто. Работает только на iOS.\n */\n iOSLock?: boolean;\n\n /**\n * Хэндлер события прокрутки колесиком\n */\n onWheel?: (e: WheelEvent<HTMLElement>) => void;\n};\n\nexport type BaseModalContext = {\n parentRef: React.RefObject<HTMLDivElement>;\n componentRef: React.RefObject<HTMLDivElement>;\n hasFooter?: boolean;\n hasHeader?: boolean;\n hasScroll?: boolean;\n headerHighlighted?: boolean;\n footerHighlighted?: boolean;\n headerOffset?: number;\n setHeaderOffset: (offset: number) => void;\n contentRef: Ref<HTMLElement>;\n setHasHeader: (exists: boolean) => void;\n setHasFooter: (exists: boolean) => void;\n onClose: Required<BaseModalProps>['onClose'];\n};\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const BaseModalContext = React.createContext<BaseModalContext>({\n parentRef: { current: null },\n componentRef: { current: null },\n hasFooter: false,\n hasHeader: false,\n hasScroll: false,\n headerHighlighted: false,\n footerHighlighted: false,\n headerOffset: 0,\n setHeaderOffset: () => null,\n contentRef: () => null,\n setHasHeader: () => null,\n setHasFooter: () => null,\n onClose: () => null,\n});\n\nexport const BaseModal = forwardRef<HTMLDivElement, BaseModalProps>(\n (\n {\n open,\n container,\n children,\n scrollHandler = 'wrapper',\n Backdrop = DefaultBackdrop,\n backdropProps = {},\n transitionProps = {},\n disableBackdropClick,\n disableAutoFocus = false,\n disableFocusLock = false,\n disableEscapeKeyDown = false,\n disableRestoreFocus = false,\n disableBlockingScroll = false,\n keepMounted = false,\n className,\n contentClassName,\n wrapperProps,\n contentProps,\n componentDivProps,\n wrapperClassName,\n onBackdropClick,\n onClose,\n onEscapeKeyDown,\n onMount,\n onUnmount,\n dataTestId,\n zIndex = stackingOrder.MODAL,\n componentRef = null,\n contentElementRef = null,\n usePortal = true,\n iOSLock = false,\n onWheel,\n },\n ref,\n ) => {\n const [exited, setExited] = useState<boolean | null>(null);\n const [hasScroll, setHasScroll] = useState(false);\n const [hasHeader, setHasHeader] = useState(false);\n const [hasFooter, setHasFooter] = useState(false);\n const [headerHighlighted, setHeaderHighlighted] = useState(false);\n const [footerHighlighted, setFooterHighlighted] = useState(false);\n const [headerOffset, setHeaderOffset] = useState(0);\n\n const componentNodeRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const scrollableNodeRef = useRef<HTMLDivElement | null>(null);\n const contentNodeRef = useRef<HTMLDivElement | null>(null);\n const restoreContainerStylesRef = useRef<null | (() => void)>(null);\n const mouseDownTarget = useRef<HTMLElement>();\n const resizeObserverRef = useRef<ResizeObserver>();\n\n const checkToHasScrollBar = () => {\n if (scrollableNodeRef.current) {\n const scrollExists = hasScrollbar(scrollableNodeRef.current);\n\n setFooterHighlighted(scrollExists);\n setHasScroll(scrollExists);\n }\n };\n\n const isExited = exited || exited === null;\n const shouldRender = keepMounted || open || !isExited;\n\n const getContainer = useCallback(\n () => (container ? container() : document.body) as HTMLElement,\n [container],\n );\n\n const addResizeHandle = useCallback(() => {\n if (!resizeObserverRef.current) return;\n\n if (scrollableNodeRef.current) {\n resizeObserverRef.current.observe(scrollableNodeRef.current);\n }\n if (contentNodeRef.current) {\n resizeObserverRef.current.observe(contentNodeRef.current);\n }\n }, []);\n\n const removeResizeHandle = useCallback(() => resizeObserverRef.current?.disconnect(), []);\n\n const contentRef = useCallback((node: HTMLDivElement) => {\n if (node !== null) {\n contentNodeRef.current = node;\n if (resizeObserverRef.current) {\n resizeObserverRef.current.observe(node);\n }\n checkToHasScrollBar();\n }\n }, []);\n\n const handleScroll = useCallback(() => {\n if (!scrollableNodeRef.current || !componentNodeRef.current) return;\n\n if (hasHeader) {\n setHeaderHighlighted(\n !isScrolledToTop(scrollableNodeRef.current) &&\n componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 1,\n );\n }\n\n if (hasFooter) {\n setFooterHighlighted(\n !isScrolledToBottom(scrollableNodeRef.current) &&\n componentNodeRef.current.getBoundingClientRect().bottom >=\n window.innerHeight - 1,\n );\n }\n }, [hasFooter, hasHeader, headerOffset]);\n\n const handleClose = useCallback<Required<BaseModalProps>['onClose']>(\n (event, reason) => {\n if (iOSLock && os.isIOS()) {\n unlockScroll();\n }\n\n if (onClose) {\n onClose(event, reason);\n }\n\n if (reason === 'backdropClick' && onBackdropClick) {\n onBackdropClick(event as MouseEvent);\n }\n\n if (reason === 'escapeKeyDown' && onEscapeKeyDown) {\n onEscapeKeyDown(event as KeyboardEvent);\n }\n\n return null;\n },\n [onBackdropClick, onClose, onEscapeKeyDown, iOSLock],\n );\n\n const handleBackdropMouseDown = (event: MouseEvent<HTMLElement>) => {\n let clickedOnScrollbar = false;\n const clientWidth = (event.target as HTMLElement)?.clientWidth;\n\n if (event.clientX && clientWidth) {\n // Устанавливаем смещение для абсолютно спозиционированного скроллбара в OSX в 17px.\n const offset = browser.getScrollbarSize() === 0 ? 17 : 0;\n\n clickedOnScrollbar = event.clientX + offset > clientWidth;\n }\n\n if (!disableBackdropClick && !clickedOnScrollbar) {\n mouseDownTarget.current = event.target as HTMLElement;\n }\n };\n\n const handleBackdropMouseUp = (event: MouseEvent<HTMLElement>) => {\n if (\n !disableBackdropClick &&\n event.target === wrapperRef.current &&\n mouseDownTarget.current === wrapperRef.current\n ) {\n handleClose(event, 'backdropClick');\n }\n\n mouseDownTarget.current = undefined;\n };\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n /*\n * Чтобы сохранить дефолтное поведение элементов и событий форм,\n * обработчик не устанавливает event.preventDefault()\n */\n if (event.key !== 'Escape') {\n return;\n }\n\n // Если есть обработчик escape на body\n event.stopPropagation();\n\n if (!disableEscapeKeyDown && handleClose) {\n handleClose(event, 'escapeKeyDown');\n }\n },\n [disableEscapeKeyDown, handleClose],\n );\n\n const getScrollHandler = useCallback(() => {\n if (scrollHandler === 'wrapper') return wrapperRef.current;\n if (scrollHandler === 'content') return componentNodeRef.current;\n\n return scrollHandler.current || wrapperRef.current;\n }, [scrollHandler]);\n\n const handleEntered: Required<CSSTransitionProps>['onEntered'] = useCallback(\n (node, isAppearing) => {\n scrollableNodeRef.current = getScrollHandler();\n\n addResizeHandle();\n\n if (scrollableNodeRef.current) {\n scrollableNodeRef.current.addEventListener('scroll', handleScroll);\n handleScroll();\n }\n\n if (transitionProps.onEntered) {\n transitionProps.onEntered(node, isAppearing);\n }\n\n if (onMount) onMount();\n },\n [addResizeHandle, getScrollHandler, handleScroll, onMount, transitionProps],\n );\n\n const handleExited: Required<CSSTransitionProps>['onExited'] = useCallback(\n (node) => {\n removeResizeHandle();\n\n setExited(true);\n\n if (scrollableNodeRef.current) {\n scrollableNodeRef.current.removeEventListener('scroll', handleScroll);\n }\n\n if (transitionProps.onExited) {\n transitionProps.onExited(node);\n }\n\n if (onUnmount) onUnmount();\n\n if (restoreContainerStylesRef.current) {\n restoreContainerStylesRef.current();\n }\n },\n [handleScroll, onUnmount, removeResizeHandle, transitionProps],\n );\n\n useEffect(() => {\n if (open && isExited) {\n if (!disableBlockingScroll) {\n const el = getContainer();\n\n const shouldIOSLock = iOSLock && os.isIOS();\n\n handleContainer(el, shouldIOSLock);\n if (shouldIOSLock) {\n syncHeight();\n lockScroll();\n }\n\n restoreContainerStylesRef.current = () => {\n restoreContainerStylesRef.current = null;\n restoreContainerStyles(el);\n };\n }\n\n setExited(false);\n }\n\n if (!open) {\n unlockScroll();\n }\n }, [getContainer, open, disableBlockingScroll, isExited, iOSLock]);\n\n useEffect(() => {\n const ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;\n\n resizeObserverRef.current = new ResizeObserver(checkToHasScrollBar);\n\n return () => {\n if (restoreContainerStylesRef.current) {\n restoreContainerStylesRef.current();\n }\n\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n };\n }, []);\n\n useEffect(() => {\n if (disableAutoFocus || !open) return;\n\n wrapperRef.current?.focus();\n }, [open, disableAutoFocus]);\n\n const contextValue = useMemo<BaseModalContext>(\n () => ({\n parentRef: wrapperRef,\n componentRef: componentNodeRef,\n hasHeader,\n hasFooter,\n hasScroll,\n headerHighlighted,\n footerHighlighted,\n headerOffset,\n setHeaderOffset,\n contentRef,\n setHasHeader,\n setHasFooter,\n onClose: handleClose,\n }),\n [\n contentRef,\n hasHeader,\n hasFooter,\n hasScroll,\n headerHighlighted,\n footerHighlighted,\n headerOffset,\n setHeaderOffset,\n handleClose,\n ],\n );\n\n const renderContent = () => (\n <Stack value={zIndex}>\n {(computedZIndex) => (\n <BaseModalContext.Provider value={contextValue}>\n <FocusLock\n disabled={disableFocusLock || !open}\n returnFocus={!disableRestoreFocus}\n >\n {Backdrop && (\n <Backdrop\n {...backdropProps}\n className={cn(backdropProps.className, styles.backdrop)}\n open={open}\n style={{\n zIndex: computedZIndex,\n }}\n />\n )}\n <div\n {...wrapperProps}\n role='dialog'\n className={cn(\n styles.wrapper,\n wrapperClassName,\n wrapperProps?.className,\n {\n [styles.hidden]: !open && isExited,\n },\n )}\n ref={mergeRefs([\n ref,\n wrapperRef,\n wrapperProps?.ref as Ref<HTMLDivElement>,\n ])}\n onKeyDown={handleKeyDown}\n onMouseDown={handleBackdropMouseDown}\n onMouseUp={handleBackdropMouseUp}\n onWheel={onWheel}\n tabIndex={-1}\n data-test-id={dataTestId}\n style={{\n zIndex: computedZIndex,\n }}\n >\n <CSSTransition\n appear={true}\n timeout={200}\n classNames={styles}\n nodeRef={componentNodeRef}\n {...transitionProps}\n in={open}\n onEntered={handleEntered}\n onExited={handleExited}\n >\n <div\n {...componentDivProps}\n className={cn(\n styles.component,\n className,\n componentDivProps?.className,\n )}\n ref={mergeRefs([\n componentRef,\n componentNodeRef,\n componentDivProps?.ref || null,\n ])}\n >\n <div\n {...contentProps}\n className={cn(\n styles.content,\n contentClassName,\n contentProps?.className,\n {\n [styles.hasFooter]: hasFooter,\n [styles.hasHeader]: hasHeader,\n },\n )}\n ref={contentElementRef}\n >\n {children}\n </div>\n </div>\n </CSSTransition>\n </div>\n </FocusLock>\n </BaseModalContext.Provider>\n )}\n </Stack>\n );\n\n if (!shouldRender) return null;\n\n return usePortal ? (\n <Portal getPortalContainer={container} immediateMount={true}>\n {renderContent()}\n </Portal>\n ) : (\n renderContent()\n );\n },\n);\n\nBaseModal.displayName = 'BaseModal';\nBaseModalContext.displayName = 'BaseModalContext';\n"],"names":["React","forwardRef","DefaultBackdrop","stackingOrder","useState","useRef","hasScrollbar","useCallback","isScrolledToTop","isScrolledToBottom","os","unlockScroll","browser","useEffect","handleContainer","syncHeight","lockScroll","restoreContainerStyles","ResizeObserverPolyfill","useMemo","Stack","FocusLock","__assign","cn","styles","mergeRefs","CSSTransition","Portal"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Хелпер для блокирования скроллинга в iOS
|
|
3
|
+
* В проекте используется overflow: hidden для блокировки, но в некоторых случаях этого недостаточно. Данный хелпер призван решать эту проблему
|
|
4
|
+
*/
|
|
5
|
+
export declare const isScrollLocked: () => boolean;
|
|
6
|
+
export declare const lockScroll: () => void;
|
|
7
|
+
export declare const unlockScroll: () => void;
|
|
8
|
+
export declare const syncHeight: () => void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Хелпер для блокирования скроллинга в iOS
|
|
7
|
+
* В проекте используется overflow: hidden для блокировки, но в некоторых случаях этого недостаточно. Данный хелпер призван решать эту проблему
|
|
8
|
+
*/
|
|
9
|
+
var scrollY;
|
|
10
|
+
var isScrollLocked = function () { return document.body.classList.contains('is-locked'); };
|
|
11
|
+
var lockScroll = function () {
|
|
12
|
+
scrollY = window.scrollY;
|
|
13
|
+
document.body.classList.add('is-locked');
|
|
14
|
+
};
|
|
15
|
+
var unlockScroll = function () {
|
|
16
|
+
if (!isScrollLocked())
|
|
17
|
+
return;
|
|
18
|
+
document.body.classList.remove('is-locked');
|
|
19
|
+
window.scrollTo(0, scrollY);
|
|
20
|
+
};
|
|
21
|
+
var syncHeight = function () {
|
|
22
|
+
document.body.style.setProperty('--window-inner-scrollY', "".concat(window.scrollY, "px"));
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
exports.isScrollLocked = isScrollLocked;
|
|
26
|
+
exports.lockScroll = lockScroll;
|
|
27
|
+
exports.syncHeight = syncHeight;
|
|
28
|
+
exports.unlockScroll = unlockScroll;
|
|
29
|
+
//# sourceMappingURL=lockScroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockScroll.js","sources":["../../src/helpers/lockScroll.ts"],"sourcesContent":["/**\n * Хелпер для блокирования скроллинга в iOS\n * В проекте используется overflow: hidden для блокировки, но в некоторых случаях этого недостаточно. Данный хелпер призван решать эту проблему\n */\n\nlet scrollY: number;\n\nexport const isScrollLocked = () => document.body.classList.contains('is-locked');\n\nexport const lockScroll = () => {\n scrollY = window.scrollY;\n document.body.classList.add('is-locked');\n};\n\nexport const unlockScroll = () => {\n if (!isScrollLocked()) return;\n\n document.body.classList.remove('is-locked');\n window.scrollTo(0, scrollY);\n};\n\nexport const syncHeight = () => {\n document.body.style.setProperty('--window-inner-scrollY', `${window.scrollY}px`);\n};\n"],"names":[],"mappings":";;;;AAAA;;;AAGG;AAEH,IAAI,OAAe;AAEN,IAAA,cAAc,GAAG,YAAM,EAAA,OAAA,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAEpE,IAAA,UAAU,GAAG,YAAA;AACtB,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO;IACxB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;AAC5C;AAEa,IAAA,YAAY,GAAG,YAAA;IACxB,IAAI,CAAC,cAAc,EAAE;QAAE;IAEvB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;AAC3C,IAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;AAC/B;AAEa,IAAA,UAAU,GAAG,YAAA;AACtB,IAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,UAAG,MAAM,CAAC,OAAO,EAAA,IAAA,CAAI,CAAC;AACpF;;;;;;;"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--color-light-modal-bg-primary: #fff;
|
|
3
|
+
} :root {
|
|
4
|
+
--gap-0: 0px;
|
|
5
|
+
} :root {
|
|
6
|
+
--window-inner-scrollY: 10px;
|
|
7
|
+
} body.is-locked {
|
|
8
|
+
margin-top: calc(var(--window-inner-scrollY) * -1);
|
|
9
|
+
position: fixed;
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
} .base-modal__component_1equ8 {
|
|
12
|
+
position: relative;
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
background: var(--color-light-modal-bg-primary);
|
|
15
|
+
margin: auto;
|
|
16
|
+
flex-shrink: 0;
|
|
17
|
+
} .base-modal__wrapper_1equ8 {
|
|
18
|
+
position: fixed;
|
|
19
|
+
top: var(--gap-0);
|
|
20
|
+
left: var(--gap-0);
|
|
21
|
+
right: var(--gap-0);
|
|
22
|
+
bottom: var(--gap-0);
|
|
23
|
+
|
|
24
|
+
overflow: auto;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
align-items: center;
|
|
28
|
+
outline: 0;
|
|
29
|
+
overscroll-behavior: none;
|
|
30
|
+
} .base-modal__content_1equ8 {
|
|
31
|
+
width: 100%;
|
|
32
|
+
height: 100%;
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
flex: 1
|
|
36
|
+
} @media (display-mode: standalone) { .base-modal__content_1equ8.base-modal__hasFooter_1equ8 {
|
|
37
|
+
padding-bottom: unset
|
|
38
|
+
}
|
|
39
|
+
} @media (display-mode: standalone) { .base-modal__content_1equ8.base-modal__hasHeader_1equ8 {
|
|
40
|
+
padding-top: unset
|
|
41
|
+
}
|
|
42
|
+
} .base-modal__hidden_1equ8 {
|
|
43
|
+
display: none;
|
|
44
|
+
} .base-modal__backdrop_1equ8 {
|
|
45
|
+
z-index: 0;
|
|
46
|
+
} .base-modal__appear_1equ8,
|
|
47
|
+
.base-modal__enter_1equ8 {
|
|
48
|
+
opacity: 0;
|
|
49
|
+
} .base-modal__appearActive_1equ8,
|
|
50
|
+
.base-modal__enterActive_1equ8 {
|
|
51
|
+
opacity: 1;
|
|
52
|
+
transition: opacity 200ms ease-in;
|
|
53
|
+
} .base-modal__exit_1equ8 {
|
|
54
|
+
opacity: 1;
|
|
55
|
+
} .base-modal__exitActive_1equ8,
|
|
56
|
+
.base-modal__exitDone_1equ8 {
|
|
57
|
+
opacity: 0;
|
|
58
|
+
transition: opacity 200ms ease-out;
|
|
59
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var Component = require('./Component.js');
|
|
6
|
+
var utils = require('./utils.js');
|
|
7
|
+
var lockScroll = require('./helpers/lockScroll.js');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.BaseModal = Component.BaseModal;
|
|
12
|
+
exports.BaseModalContext = Component.BaseModalContext;
|
|
13
|
+
exports.handleContainer = utils.handleContainer;
|
|
14
|
+
exports.hasScrollbar = utils.hasScrollbar;
|
|
15
|
+
exports.isScrolledToBottom = utils.isScrolledToBottom;
|
|
16
|
+
exports.isScrolledToTop = utils.isScrolledToTop;
|
|
17
|
+
exports.restoreContainerStyles = utils.restoreContainerStyles;
|
|
18
|
+
exports.isScrollLocked = lockScroll.isScrollLocked;
|
|
19
|
+
exports.lockScroll = lockScroll.lockScroll;
|
|
20
|
+
exports.syncHeight = lockScroll.syncHeight;
|
|
21
|
+
exports.unlockScroll = lockScroll.unlockScroll;
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('./index.css');
|
|
4
|
+
|
|
5
|
+
var styles = {"component":"base-modal__component_1equ8","wrapper":"base-modal__wrapper_1equ8","content":"base-modal__content_1equ8","hasFooter":"base-modal__hasFooter_1equ8","hasHeader":"base-modal__hasHeader_1equ8","hidden":"base-modal__hidden_1equ8","backdrop":"base-modal__backdrop_1equ8","appear":"base-modal__appear_1equ8","enter":"base-modal__enter_1equ8","appearActive":"base-modal__appearActive_1equ8","enterActive":"base-modal__enterActive_1equ8","exit":"base-modal__exit_1equ8","exitActive":"base-modal__exitActive_1equ8","exitDone":"base-modal__exitDone_1equ8"};
|
|
6
|
+
|
|
7
|
+
module.exports = styles;
|
|
8
|
+
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.module.css.js","sources":["src/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/no-dynamic-mixins-index.css';\n\n:root {\n --window-inner-scrollY: 10px; /* fallback value to prevent ci error */\n}\n\nbody:global(.is-locked) {\n margin-top: calc(var(--window-inner-scrollY) * -1);\n position: fixed;\n overflow: hidden;\n}\n\n.component {\n position: relative;\n box-sizing: border-box;\n background: var(--color-light-modal-bg-primary);\n margin: auto;\n flex-shrink: 0;\n}\n\n.wrapper {\n position: fixed;\n top: var(--gap-0);\n left: var(--gap-0);\n right: var(--gap-0);\n bottom: var(--gap-0);\n\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: 0;\n overscroll-behavior: none;\n}\n\n.content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &.hasFooter {\n @media (display-mode: standalone) {\n padding-bottom: unset;\n }\n }\n\n &.hasHeader {\n @media (display-mode: standalone) {\n padding-top: unset;\n }\n }\n}\n\n.hidden {\n display: none;\n}\n\n.backdrop {\n z-index: 0;\n}\n\n.appear,\n.enter {\n opacity: 0;\n}\n\n.appearActive,\n.enterActive {\n opacity: 1;\n transition: opacity 200ms ease-in;\n}\n\n.exit {\n opacity: 1;\n}\n\n.exitActive,\n.exitDone {\n opacity: 0;\n transition: opacity 200ms ease-out;\n}\n"],"names":[],"mappings":";;;;AAEgB,aAAe,CAAC,WAAW,CAAC,6BAA6B,CAAC,SAAS,CAAC,2BAA2B,CAAC,SAAS,CAAC,2BAA2B,CAAC,WAAW,CAAC,6BAA6B,CAAC,WAAW,CAAC,6BAA6B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,UAAU,CAAC,4BAA4B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,gCAAgC,CAAC,aAAa,CAAC,+BAA+B,CAAC,MAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,8BAA8B,CAAC,UAAU,CAAC,4BAA4B,CAAC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
// @ts-nocheck
|
|
5
|
+
if (typeof window !== 'undefined') {
|
|
6
|
+
if (Element && !Element.prototype.matches) {
|
|
7
|
+
Element.prototype.matches =
|
|
8
|
+
Element.prototype.matchesSelector ||
|
|
9
|
+
Element.prototype.mozMatchesSelector ||
|
|
10
|
+
Element.prototype.msMatchesSelector ||
|
|
11
|
+
Element.prototype.oMatchesSelector ||
|
|
12
|
+
Element.prototype.webkitMatchesSelector ||
|
|
13
|
+
function (s) {
|
|
14
|
+
var matches = (this.document || this.ownerDocument).querySelectorAll(s);
|
|
15
|
+
var i = matches.length;
|
|
16
|
+
while (--i >= 0 && matches.item(i) !== this) { }
|
|
17
|
+
return i > -1;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=matches-polyfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matches-polyfill.js","sources":["../src/matches-polyfill.ts"],"sourcesContent":["/* eslint-disable */\n// @ts-nocheck\n\nif (typeof window !== 'undefined') {\n if (Element && !Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.matchesSelector ||\n Element.prototype.mozMatchesSelector ||\n Element.prototype.msMatchesSelector ||\n Element.prototype.oMatchesSelector ||\n Element.prototype.webkitMatchesSelector ||\n function (s) {\n const matches = (this.document || this.ownerDocument).querySelectorAll(s);\n let i = matches.length;\n while (--i >= 0 && matches.item(i) !== this) {}\n return i > -1;\n };\n }\n}\n\nexport {};\n"],"names":[],"mappings":";;AAAA;AACA;AAEA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IAC/B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE;QACvC,OAAO,CAAC,SAAS,CAAC,OAAO;YACrB,OAAO,CAAC,SAAS,CAAC,eAAe;gBACjC,OAAO,CAAC,SAAS,CAAC,kBAAkB;gBACpC,OAAO,CAAC,SAAS,CAAC,iBAAiB;gBACnC,OAAO,CAAC,SAAS,CAAC,gBAAgB;gBAClC,OAAO,CAAC,SAAS,CAAC,qBAAqB;AACvC,gBAAA,UAAU,CAAC,EAAA;AACP,oBAAA,IAAM,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACzE,oBAAA,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM;AACtB,oBAAA,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;AAC7C,oBAAA,OAAO,CAAC,GAAG,EAAE;AACjB,iBAAC;AACR;AACJ;;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function isScrolledToTop(target: HTMLElement): boolean;
|
|
2
|
+
export declare function isScrolledToBottom(target: HTMLElement): boolean;
|
|
3
|
+
export declare function hasScrollbar(target: HTMLElement): boolean;
|
|
4
|
+
export declare const restoreContainerStyles: (container: HTMLElement) => void;
|
|
5
|
+
export declare const handleContainer: (container?: HTMLElement, shouldIOSLock?: boolean) => void;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var dynamicMixins = require('@alfalab/core-components-global-store/dynamic-mixins');
|
|
6
|
+
var dynamicMixins$1 = require('@alfalab/core-components-shared/dynamic-mixins');
|
|
7
|
+
|
|
8
|
+
function isScrolledToTop(target) {
|
|
9
|
+
return target.scrollTop <= 0;
|
|
10
|
+
}
|
|
11
|
+
function isScrolledToBottom(target) {
|
|
12
|
+
return target.scrollHeight - target.offsetHeight <= target.scrollTop;
|
|
13
|
+
}
|
|
14
|
+
function hasScrollbar(target) {
|
|
15
|
+
return target.scrollHeight > target.clientHeight;
|
|
16
|
+
}
|
|
17
|
+
var isOverflowing = function (container) {
|
|
18
|
+
if (document.body === container) {
|
|
19
|
+
return window.innerWidth > document.documentElement.clientWidth;
|
|
20
|
+
}
|
|
21
|
+
return container.scrollHeight > container.clientHeight;
|
|
22
|
+
};
|
|
23
|
+
var getPaddingRight = function (node) {
|
|
24
|
+
return parseInt(window.getComputedStyle(node).paddingRight, 10) || 0;
|
|
25
|
+
};
|
|
26
|
+
var restoreContainerStyles = function (container) {
|
|
27
|
+
var modalRestoreStyles = dynamicMixins.getModalStore().getRestoreStyles();
|
|
28
|
+
var index = modalRestoreStyles.findIndex(function (s) { return s.container === container; });
|
|
29
|
+
var existingStyles = modalRestoreStyles[index];
|
|
30
|
+
if (!existingStyles)
|
|
31
|
+
return;
|
|
32
|
+
existingStyles.modals -= 1;
|
|
33
|
+
if (existingStyles.modals <= 0) {
|
|
34
|
+
modalRestoreStyles.splice(index, 1);
|
|
35
|
+
existingStyles.styles.forEach(function (_a) {
|
|
36
|
+
var value = _a.value, el = _a.el, key = _a.key;
|
|
37
|
+
if (value) {
|
|
38
|
+
el.style.setProperty(key, value);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
el.style.removeProperty(key);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var handleContainer = function (container, shouldIOSLock) {
|
|
47
|
+
if (shouldIOSLock === void 0) { shouldIOSLock = false; }
|
|
48
|
+
if (!container)
|
|
49
|
+
return;
|
|
50
|
+
var modalRestoreStyles = dynamicMixins.getModalStore().getRestoreStyles();
|
|
51
|
+
var existingStyles = modalRestoreStyles.find(function (s) { return s.container === container; });
|
|
52
|
+
if (existingStyles) {
|
|
53
|
+
existingStyles.modals += 1;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
var containerStyles = [];
|
|
57
|
+
if (isOverflowing(container)) {
|
|
58
|
+
// Вычисляет размер до применения `overflow hidden` для избежания скачков
|
|
59
|
+
var scrollbarSize = dynamicMixins$1.browser.getScrollbarSize();
|
|
60
|
+
containerStyles.push({
|
|
61
|
+
value: container.style.paddingRight,
|
|
62
|
+
key: 'padding-right',
|
|
63
|
+
el: container,
|
|
64
|
+
});
|
|
65
|
+
// Вычисляем стили, чтобы получить реальный `padding` c шириной сколлбара
|
|
66
|
+
// eslint-disable-next-line no-param-reassign
|
|
67
|
+
container.style.paddingRight = "".concat(getPaddingRight(container) + scrollbarSize, "px");
|
|
68
|
+
}
|
|
69
|
+
var parent = container.parentElement;
|
|
70
|
+
var scrollContainer =
|
|
71
|
+
// TODO: заменить на optional chaining
|
|
72
|
+
parent &&
|
|
73
|
+
parent.nodeName === 'HTML' &&
|
|
74
|
+
window.getComputedStyle(parent).overflowY === 'scroll'
|
|
75
|
+
? parent
|
|
76
|
+
: container;
|
|
77
|
+
// Блокируем скролл даже если отсутствует скроллбар
|
|
78
|
+
if (scrollContainer.style.overflow !== 'hidden') {
|
|
79
|
+
containerStyles.push({
|
|
80
|
+
value: scrollContainer.style.overflow,
|
|
81
|
+
key: 'overflow',
|
|
82
|
+
el: scrollContainer,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (!shouldIOSLock) {
|
|
86
|
+
scrollContainer.style.overflow = 'hidden';
|
|
87
|
+
}
|
|
88
|
+
modalRestoreStyles.push({
|
|
89
|
+
container: container,
|
|
90
|
+
modals: 1,
|
|
91
|
+
styles: containerStyles,
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
exports.handleContainer = handleContainer;
|
|
96
|
+
exports.hasScrollbar = hasScrollbar;
|
|
97
|
+
exports.isScrolledToBottom = isScrolledToBottom;
|
|
98
|
+
exports.isScrolledToTop = isScrolledToTop;
|
|
99
|
+
exports.restoreContainerStyles = restoreContainerStyles;
|
|
100
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["import { getModalStore, SavedStyle } from '@alfalab/core-components-global-store';\nimport { browser } from '@alfalab/core-components-shared';\n\nexport function isScrolledToTop(target: HTMLElement) {\n return target.scrollTop <= 0;\n}\n\nexport function isScrolledToBottom(target: HTMLElement) {\n return target.scrollHeight - target.offsetHeight <= target.scrollTop;\n}\n\nexport function hasScrollbar(target: HTMLElement) {\n return target.scrollHeight > target.clientHeight;\n}\n\nconst isOverflowing = (container: Element) => {\n if (document.body === container) {\n return window.innerWidth > document.documentElement.clientWidth;\n }\n\n return container.scrollHeight > container.clientHeight;\n};\n\nconst getPaddingRight = (node: Element) =>\n parseInt(window.getComputedStyle(node).paddingRight, 10) || 0;\n\nexport const restoreContainerStyles = (container: HTMLElement) => {\n const modalRestoreStyles = getModalStore().getRestoreStyles();\n\n const index = modalRestoreStyles.findIndex((s) => s.container === container);\n const existingStyles = modalRestoreStyles[index];\n\n if (!existingStyles) return;\n\n existingStyles.modals -= 1;\n\n if (existingStyles.modals <= 0) {\n modalRestoreStyles.splice(index, 1);\n\n existingStyles.styles.forEach(({ value, el, key }) => {\n if (value) {\n el.style.setProperty(key, value);\n } else {\n el.style.removeProperty(key);\n }\n });\n }\n};\n\nexport const handleContainer = (container?: HTMLElement, shouldIOSLock = false) => {\n if (!container) return;\n\n const modalRestoreStyles = getModalStore().getRestoreStyles();\n\n const existingStyles = modalRestoreStyles.find((s) => s.container === container);\n\n if (existingStyles) {\n existingStyles.modals += 1;\n\n return;\n }\n\n const containerStyles: SavedStyle[] = [];\n\n if (isOverflowing(container)) {\n // Вычисляет размер до применения `overflow hidden` для избежания скачков\n const scrollbarSize = browser.getScrollbarSize();\n\n containerStyles.push({\n value: container.style.paddingRight,\n key: 'padding-right',\n el: container,\n });\n // Вычисляем стили, чтобы получить реальный `padding` c шириной сколлбара\n // eslint-disable-next-line no-param-reassign\n container.style.paddingRight = `${getPaddingRight(container) + scrollbarSize}px`;\n }\n\n const parent = container.parentElement;\n const scrollContainer =\n // TODO: заменить на optional chaining\n parent &&\n parent.nodeName === 'HTML' &&\n window.getComputedStyle(parent).overflowY === 'scroll'\n ? parent\n : container;\n\n // Блокируем скролл даже если отсутствует скроллбар\n if (scrollContainer.style.overflow !== 'hidden') {\n containerStyles.push({\n value: scrollContainer.style.overflow,\n key: 'overflow',\n el: scrollContainer,\n });\n }\n\n if (!shouldIOSLock) {\n scrollContainer.style.overflow = 'hidden';\n }\n\n modalRestoreStyles.push({\n container,\n modals: 1,\n styles: containerStyles,\n });\n};\n"],"names":["getModalStore","browser"],"mappings":";;;;;;;AAGM,SAAU,eAAe,CAAC,MAAmB,EAAA;AAC/C,IAAA,OAAO,MAAM,CAAC,SAAS,IAAI,CAAC;AAChC;AAEM,SAAU,kBAAkB,CAAC,MAAmB,EAAA;IAClD,OAAO,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,SAAS;AACxE;AAEM,SAAU,YAAY,CAAC,MAAmB,EAAA;AAC5C,IAAA,OAAO,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;AACpD;AAEA,IAAM,aAAa,GAAG,UAAC,SAAkB,EAAA;AACrC,IAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;QAC7B,OAAO,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW;AAClE;AAED,IAAA,OAAO,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY;AAC1D,CAAC;AAED,IAAM,eAAe,GAAG,UAAC,IAAa,EAAA;AAClC,IAAA,OAAA,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC;AAA7D,CAA6D;AAE1D,IAAM,sBAAsB,GAAG,UAAC,SAAsB,EAAA;AACzD,IAAA,IAAM,kBAAkB,GAAGA,2BAAa,EAAE,CAAC,gBAAgB,EAAE;AAE7D,IAAA,IAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,UAAC,CAAC,EAAA,EAAK,OAAA,CAAC,CAAC,SAAS,KAAK,SAAS,CAAzB,EAAyB,CAAC;AAC5E,IAAA,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,CAAC;AAEhD,IAAA,IAAI,CAAC,cAAc;QAAE;AAErB,IAAA,cAAc,CAAC,MAAM,IAAI,CAAC;AAE1B,IAAA,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE;AAC5B,QAAA,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAEnC,QAAA,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,EAAkB,EAAA;AAAhB,YAAA,IAAA,KAAK,WAAA,EAAE,EAAE,GAAA,EAAA,CAAA,EAAA,EAAE,GAAG,GAAA,EAAA,CAAA,GAAA;AAC3C,YAAA,IAAI,KAAK,EAAE;gBACP,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC;AACnC;AAAM,iBAAA;AACH,gBAAA,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC;AAC/B;AACL,SAAC,CAAC;AACL;AACL;AAEa,IAAA,eAAe,GAAG,UAAC,SAAuB,EAAE,aAAqB,EAAA;AAArB,IAAA,IAAA,aAAA,KAAA,MAAA,EAAA,EAAA,aAAqB,GAAA,KAAA,CAAA;AAC1E,IAAA,IAAI,CAAC,SAAS;QAAE;AAEhB,IAAA,IAAM,kBAAkB,GAAGA,2BAAa,EAAE,CAAC,gBAAgB,EAAE;AAE7D,IAAA,IAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,UAAC,CAAC,EAAA,EAAK,OAAA,CAAC,CAAC,SAAS,KAAK,SAAS,CAAzB,EAAyB,CAAC;AAEhF,IAAA,IAAI,cAAc,EAAE;AAChB,QAAA,cAAc,CAAC,MAAM,IAAI,CAAC;QAE1B;AACH;IAED,IAAM,eAAe,GAAiB,EAAE;AAExC,IAAA,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE;;AAE1B,QAAA,IAAM,aAAa,GAAGC,uBAAO,CAAC,gBAAgB,EAAE;QAEhD,eAAe,CAAC,IAAI,CAAC;AACjB,YAAA,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY;AACnC,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,EAAE,EAAE,SAAS;AAChB,SAAA,CAAC;;;AAGF,QAAA,SAAS,CAAC,KAAK,CAAC,YAAY,GAAG,EAAA,CAAA,MAAA,CAAG,eAAe,CAAC,SAAS,CAAC,GAAG,aAAa,OAAI;AACnF;AAED,IAAA,IAAM,MAAM,GAAG,SAAS,CAAC,aAAa;AACtC,IAAA,IAAM,eAAe;;IAEjB,MAAM;QACN,MAAM,CAAC,QAAQ,KAAK,MAAM;QAC1B,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK;AAC1C,UAAE;UACA,SAAS;;AAGnB,IAAA,IAAI,eAAe,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE;QAC7C,eAAe,CAAC,IAAI,CAAC;AACjB,YAAA,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ;AACrC,YAAA,GAAG,EAAE,UAAU;AACf,YAAA,EAAE,EAAE,eAAe;AACtB,SAAA,CAAC;AACL;IAED,IAAI,CAAC,aAAa,EAAE;AAChB,QAAA,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AAC5C;IAED,kBAAkB,CAAC,IAAI,CAAC;AACpB,QAAA,SAAS,EAAA,SAAA;AACT,QAAA,MAAM,EAAE,CAAC;AACT,QAAA,MAAM,EAAE,eAAe;AAC1B,KAAA,CAAC;AACN;;;;;;;;"}
|
package/esm/index.css
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
margin-top: calc(var(--window-inner-scrollY) * -1);
|
|
9
9
|
position: fixed;
|
|
10
10
|
overflow: hidden;
|
|
11
|
-
} .base-
|
|
11
|
+
} .base-modal__component_1equ8 {
|
|
12
12
|
position: relative;
|
|
13
13
|
box-sizing: border-box;
|
|
14
14
|
background: var(--color-light-modal-bg-primary);
|
|
15
15
|
margin: auto;
|
|
16
16
|
flex-shrink: 0;
|
|
17
|
-
} .base-
|
|
17
|
+
} .base-modal__wrapper_1equ8 {
|
|
18
18
|
position: fixed;
|
|
19
19
|
top: var(--gap-0);
|
|
20
20
|
left: var(--gap-0);
|
|
@@ -27,33 +27,33 @@
|
|
|
27
27
|
align-items: center;
|
|
28
28
|
outline: 0;
|
|
29
29
|
overscroll-behavior: none;
|
|
30
|
-
} .base-
|
|
30
|
+
} .base-modal__content_1equ8 {
|
|
31
31
|
width: 100%;
|
|
32
32
|
height: 100%;
|
|
33
33
|
display: flex;
|
|
34
34
|
flex-direction: column;
|
|
35
35
|
flex: 1
|
|
36
|
-
} @media (display-mode: standalone) { .base-
|
|
36
|
+
} @media (display-mode: standalone) { .base-modal__content_1equ8.base-modal__hasFooter_1equ8 {
|
|
37
37
|
padding-bottom: unset
|
|
38
38
|
}
|
|
39
|
-
} @media (display-mode: standalone) { .base-
|
|
39
|
+
} @media (display-mode: standalone) { .base-modal__content_1equ8.base-modal__hasHeader_1equ8 {
|
|
40
40
|
padding-top: unset
|
|
41
41
|
}
|
|
42
|
-
} .base-
|
|
42
|
+
} .base-modal__hidden_1equ8 {
|
|
43
43
|
display: none;
|
|
44
|
-
} .base-
|
|
44
|
+
} .base-modal__backdrop_1equ8 {
|
|
45
45
|
z-index: 0;
|
|
46
|
-
} .base-
|
|
47
|
-
.base-
|
|
46
|
+
} .base-modal__appear_1equ8,
|
|
47
|
+
.base-modal__enter_1equ8 {
|
|
48
48
|
opacity: 0;
|
|
49
|
-
} .base-
|
|
50
|
-
.base-
|
|
49
|
+
} .base-modal__appearActive_1equ8,
|
|
50
|
+
.base-modal__enterActive_1equ8 {
|
|
51
51
|
opacity: 1;
|
|
52
52
|
transition: opacity 200ms ease-in;
|
|
53
|
-
} .base-
|
|
53
|
+
} .base-modal__exit_1equ8 {
|
|
54
54
|
opacity: 1;
|
|
55
|
-
} .base-
|
|
56
|
-
.base-
|
|
55
|
+
} .base-modal__exitActive_1equ8,
|
|
56
|
+
.base-modal__exitDone_1equ8 {
|
|
57
57
|
opacity: 0;
|
|
58
58
|
transition: opacity 200ms ease-out;
|
|
59
59
|
}
|
package/esm/index.module.css.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
var styles = {"component":"base-
|
|
3
|
+
var styles = {"component":"base-modal__component_1equ8","wrapper":"base-modal__wrapper_1equ8","content":"base-modal__content_1equ8","hasFooter":"base-modal__hasFooter_1equ8","hasHeader":"base-modal__hasHeader_1equ8","hidden":"base-modal__hidden_1equ8","backdrop":"base-modal__backdrop_1equ8","appear":"base-modal__appear_1equ8","enter":"base-modal__enter_1equ8","appearActive":"base-modal__appearActive_1equ8","enterActive":"base-modal__enterActive_1equ8","exit":"base-modal__exit_1equ8","exitActive":"base-modal__exitActive_1equ8","exitDone":"base-modal__exitDone_1equ8"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.css.js","sources":["src/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n\n:root {\n --window-inner-scrollY: 10px; /* fallback value to prevent ci error */\n}\n\nbody:global(.is-locked) {\n margin-top: calc(var(--window-inner-scrollY) * -1);\n position: fixed;\n overflow: hidden;\n}\n\n.component {\n position: relative;\n box-sizing: border-box;\n background: var(--color-light-modal-bg-primary);\n margin: auto;\n flex-shrink: 0;\n}\n\n.wrapper {\n position: fixed;\n top: var(--gap-0);\n left: var(--gap-0);\n right: var(--gap-0);\n bottom: var(--gap-0);\n\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: 0;\n overscroll-behavior: none;\n}\n\n.content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &.hasFooter {\n @media (display-mode: standalone) {\n padding-bottom: unset;\n }\n }\n\n &.hasHeader {\n @media (display-mode: standalone) {\n padding-top: unset;\n }\n }\n}\n\n.hidden {\n display: none;\n}\n\n.backdrop {\n z-index: 0;\n}\n\n.appear,\n.enter {\n opacity: 0;\n}\n\n.appearActive,\n.enterActive {\n opacity: 1;\n transition: opacity 200ms ease-in;\n}\n\n.exit {\n opacity: 1;\n}\n\n.exitActive,\n.exitDone {\n opacity: 0;\n transition: opacity 200ms ease-out;\n}\n"],"names":[],"mappings":";;AAEgB,aAAe,CAAC,WAAW,CAAC,6BAA6B,CAAC,SAAS,CAAC,2BAA2B,CAAC,SAAS,CAAC,2BAA2B,CAAC,WAAW,CAAC,6BAA6B,CAAC,WAAW,CAAC,6BAA6B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,UAAU,CAAC,4BAA4B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,gCAAgC,CAAC,aAAa,CAAC,+BAA+B,CAAC,MAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,8BAA8B,CAAC,UAAU,CAAC,4BAA4B,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"index.module.css.js","sources":["src/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/no-dynamic-mixins-index.css';\n\n:root {\n --window-inner-scrollY: 10px; /* fallback value to prevent ci error */\n}\n\nbody:global(.is-locked) {\n margin-top: calc(var(--window-inner-scrollY) * -1);\n position: fixed;\n overflow: hidden;\n}\n\n.component {\n position: relative;\n box-sizing: border-box;\n background: var(--color-light-modal-bg-primary);\n margin: auto;\n flex-shrink: 0;\n}\n\n.wrapper {\n position: fixed;\n top: var(--gap-0);\n left: var(--gap-0);\n right: var(--gap-0);\n bottom: var(--gap-0);\n\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: 0;\n overscroll-behavior: none;\n}\n\n.content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &.hasFooter {\n @media (display-mode: standalone) {\n padding-bottom: unset;\n }\n }\n\n &.hasHeader {\n @media (display-mode: standalone) {\n padding-top: unset;\n }\n }\n}\n\n.hidden {\n display: none;\n}\n\n.backdrop {\n z-index: 0;\n}\n\n.appear,\n.enter {\n opacity: 0;\n}\n\n.appearActive,\n.enterActive {\n opacity: 1;\n transition: opacity 200ms ease-in;\n}\n\n.exit {\n opacity: 1;\n}\n\n.exitActive,\n.exitDone {\n opacity: 0;\n transition: opacity 200ms ease-out;\n}\n"],"names":[],"mappings":";;AAEgB,aAAe,CAAC,WAAW,CAAC,6BAA6B,CAAC,SAAS,CAAC,2BAA2B,CAAC,SAAS,CAAC,2BAA2B,CAAC,WAAW,CAAC,6BAA6B,CAAC,WAAW,CAAC,6BAA6B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,UAAU,CAAC,4BAA4B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,gCAAgC,CAAC,aAAa,CAAC,+BAA+B,CAAC,MAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,8BAA8B,CAAC,UAAU,CAAC,4BAA4B,CAAC;;;;"}
|
package/index.css
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
margin-top: calc(var(--window-inner-scrollY) * -1);
|
|
9
9
|
position: fixed;
|
|
10
10
|
overflow: hidden;
|
|
11
|
-
} .base-
|
|
11
|
+
} .base-modal__component_1equ8 {
|
|
12
12
|
position: relative;
|
|
13
13
|
box-sizing: border-box;
|
|
14
14
|
background: var(--color-light-modal-bg-primary);
|
|
15
15
|
margin: auto;
|
|
16
16
|
flex-shrink: 0;
|
|
17
|
-
} .base-
|
|
17
|
+
} .base-modal__wrapper_1equ8 {
|
|
18
18
|
position: fixed;
|
|
19
19
|
top: var(--gap-0);
|
|
20
20
|
left: var(--gap-0);
|
|
@@ -27,33 +27,33 @@
|
|
|
27
27
|
align-items: center;
|
|
28
28
|
outline: 0;
|
|
29
29
|
overscroll-behavior: none;
|
|
30
|
-
} .base-
|
|
30
|
+
} .base-modal__content_1equ8 {
|
|
31
31
|
width: 100%;
|
|
32
32
|
height: 100%;
|
|
33
33
|
display: flex;
|
|
34
34
|
flex-direction: column;
|
|
35
35
|
flex: 1
|
|
36
|
-
} @media (display-mode: standalone) { .base-
|
|
36
|
+
} @media (display-mode: standalone) { .base-modal__content_1equ8.base-modal__hasFooter_1equ8 {
|
|
37
37
|
padding-bottom: unset
|
|
38
38
|
}
|
|
39
|
-
} @media (display-mode: standalone) { .base-
|
|
39
|
+
} @media (display-mode: standalone) { .base-modal__content_1equ8.base-modal__hasHeader_1equ8 {
|
|
40
40
|
padding-top: unset
|
|
41
41
|
}
|
|
42
|
-
} .base-
|
|
42
|
+
} .base-modal__hidden_1equ8 {
|
|
43
43
|
display: none;
|
|
44
|
-
} .base-
|
|
44
|
+
} .base-modal__backdrop_1equ8 {
|
|
45
45
|
z-index: 0;
|
|
46
|
-
} .base-
|
|
47
|
-
.base-
|
|
46
|
+
} .base-modal__appear_1equ8,
|
|
47
|
+
.base-modal__enter_1equ8 {
|
|
48
48
|
opacity: 0;
|
|
49
|
-
} .base-
|
|
50
|
-
.base-
|
|
49
|
+
} .base-modal__appearActive_1equ8,
|
|
50
|
+
.base-modal__enterActive_1equ8 {
|
|
51
51
|
opacity: 1;
|
|
52
52
|
transition: opacity 200ms ease-in;
|
|
53
|
-
} .base-
|
|
53
|
+
} .base-modal__exit_1equ8 {
|
|
54
54
|
opacity: 1;
|
|
55
|
-
} .base-
|
|
56
|
-
.base-
|
|
55
|
+
} .base-modal__exitActive_1equ8,
|
|
56
|
+
.base-modal__exitDone_1equ8 {
|
|
57
57
|
opacity: 0;
|
|
58
58
|
transition: opacity 200ms ease-out;
|
|
59
59
|
}
|
package/index.module.css.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require('./index.css');
|
|
4
4
|
|
|
5
|
-
var styles = {"component":"base-
|
|
5
|
+
var styles = {"component":"base-modal__component_1equ8","wrapper":"base-modal__wrapper_1equ8","content":"base-modal__content_1equ8","hasFooter":"base-modal__hasFooter_1equ8","hasHeader":"base-modal__hasHeader_1equ8","hidden":"base-modal__hidden_1equ8","backdrop":"base-modal__backdrop_1equ8","appear":"base-modal__appear_1equ8","enter":"base-modal__enter_1equ8","appearActive":"base-modal__appearActive_1equ8","enterActive":"base-modal__enterActive_1equ8","exit":"base-modal__exit_1equ8","exitActive":"base-modal__exitActive_1equ8","exitDone":"base-modal__exitDone_1equ8"};
|
|
6
6
|
|
|
7
7
|
module.exports = styles;
|
|
8
8
|
//# sourceMappingURL=index.module.css.js.map
|
package/index.module.css.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.css.js","sources":["src/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n\n:root {\n --window-inner-scrollY: 10px; /* fallback value to prevent ci error */\n}\n\nbody:global(.is-locked) {\n margin-top: calc(var(--window-inner-scrollY) * -1);\n position: fixed;\n overflow: hidden;\n}\n\n.component {\n position: relative;\n box-sizing: border-box;\n background: var(--color-light-modal-bg-primary);\n margin: auto;\n flex-shrink: 0;\n}\n\n.wrapper {\n position: fixed;\n top: var(--gap-0);\n left: var(--gap-0);\n right: var(--gap-0);\n bottom: var(--gap-0);\n\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: 0;\n overscroll-behavior: none;\n}\n\n.content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &.hasFooter {\n @media (display-mode: standalone) {\n padding-bottom: unset;\n }\n }\n\n &.hasHeader {\n @media (display-mode: standalone) {\n padding-top: unset;\n }\n }\n}\n\n.hidden {\n display: none;\n}\n\n.backdrop {\n z-index: 0;\n}\n\n.appear,\n.enter {\n opacity: 0;\n}\n\n.appearActive,\n.enterActive {\n opacity: 1;\n transition: opacity 200ms ease-in;\n}\n\n.exit {\n opacity: 1;\n}\n\n.exitActive,\n.exitDone {\n opacity: 0;\n transition: opacity 200ms ease-out;\n}\n"],"names":[],"mappings":";;;;AAEgB,aAAe,CAAC,WAAW,CAAC,6BAA6B,CAAC,SAAS,CAAC,2BAA2B,CAAC,SAAS,CAAC,2BAA2B,CAAC,WAAW,CAAC,6BAA6B,CAAC,WAAW,CAAC,6BAA6B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,UAAU,CAAC,4BAA4B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,gCAAgC,CAAC,aAAa,CAAC,+BAA+B,CAAC,MAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,8BAA8B,CAAC,UAAU,CAAC,4BAA4B,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"index.module.css.js","sources":["src/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/no-dynamic-mixins-index.css';\n\n:root {\n --window-inner-scrollY: 10px; /* fallback value to prevent ci error */\n}\n\nbody:global(.is-locked) {\n margin-top: calc(var(--window-inner-scrollY) * -1);\n position: fixed;\n overflow: hidden;\n}\n\n.component {\n position: relative;\n box-sizing: border-box;\n background: var(--color-light-modal-bg-primary);\n margin: auto;\n flex-shrink: 0;\n}\n\n.wrapper {\n position: fixed;\n top: var(--gap-0);\n left: var(--gap-0);\n right: var(--gap-0);\n bottom: var(--gap-0);\n\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: 0;\n overscroll-behavior: none;\n}\n\n.content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &.hasFooter {\n @media (display-mode: standalone) {\n padding-bottom: unset;\n }\n }\n\n &.hasHeader {\n @media (display-mode: standalone) {\n padding-top: unset;\n }\n }\n}\n\n.hidden {\n display: none;\n}\n\n.backdrop {\n z-index: 0;\n}\n\n.appear,\n.enter {\n opacity: 0;\n}\n\n.appearActive,\n.enterActive {\n opacity: 1;\n transition: opacity 200ms ease-in;\n}\n\n.exit {\n opacity: 1;\n}\n\n.exitActive,\n.exitDone {\n opacity: 0;\n transition: opacity 200ms ease-out;\n}\n"],"names":[],"mappings":";;;;AAEgB,aAAe,CAAC,WAAW,CAAC,6BAA6B,CAAC,SAAS,CAAC,2BAA2B,CAAC,SAAS,CAAC,2BAA2B,CAAC,WAAW,CAAC,6BAA6B,CAAC,WAAW,CAAC,6BAA6B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,UAAU,CAAC,4BAA4B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,gCAAgC,CAAC,aAAa,CAAC,+BAA+B,CAAC,MAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,8BAA8B,CAAC,UAAU,CAAC,4BAA4B,CAAC;;;;"}
|
package/modern/index.css
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
margin-top: calc(var(--window-inner-scrollY) * -1);
|
|
9
9
|
position: fixed;
|
|
10
10
|
overflow: hidden;
|
|
11
|
-
} .base-
|
|
11
|
+
} .base-modal__component_1equ8 {
|
|
12
12
|
position: relative;
|
|
13
13
|
box-sizing: border-box;
|
|
14
14
|
background: var(--color-light-modal-bg-primary);
|
|
15
15
|
margin: auto;
|
|
16
16
|
flex-shrink: 0;
|
|
17
|
-
} .base-
|
|
17
|
+
} .base-modal__wrapper_1equ8 {
|
|
18
18
|
position: fixed;
|
|
19
19
|
top: var(--gap-0);
|
|
20
20
|
left: var(--gap-0);
|
|
@@ -27,33 +27,33 @@
|
|
|
27
27
|
align-items: center;
|
|
28
28
|
outline: 0;
|
|
29
29
|
overscroll-behavior: none;
|
|
30
|
-
} .base-
|
|
30
|
+
} .base-modal__content_1equ8 {
|
|
31
31
|
width: 100%;
|
|
32
32
|
height: 100%;
|
|
33
33
|
display: flex;
|
|
34
34
|
flex-direction: column;
|
|
35
35
|
flex: 1
|
|
36
|
-
} @media (display-mode: standalone) { .base-
|
|
36
|
+
} @media (display-mode: standalone) { .base-modal__content_1equ8.base-modal__hasFooter_1equ8 {
|
|
37
37
|
padding-bottom: unset
|
|
38
38
|
}
|
|
39
|
-
} @media (display-mode: standalone) { .base-
|
|
39
|
+
} @media (display-mode: standalone) { .base-modal__content_1equ8.base-modal__hasHeader_1equ8 {
|
|
40
40
|
padding-top: unset
|
|
41
41
|
}
|
|
42
|
-
} .base-
|
|
42
|
+
} .base-modal__hidden_1equ8 {
|
|
43
43
|
display: none;
|
|
44
|
-
} .base-
|
|
44
|
+
} .base-modal__backdrop_1equ8 {
|
|
45
45
|
z-index: 0;
|
|
46
|
-
} .base-
|
|
47
|
-
.base-
|
|
46
|
+
} .base-modal__appear_1equ8,
|
|
47
|
+
.base-modal__enter_1equ8 {
|
|
48
48
|
opacity: 0;
|
|
49
|
-
} .base-
|
|
50
|
-
.base-
|
|
49
|
+
} .base-modal__appearActive_1equ8,
|
|
50
|
+
.base-modal__enterActive_1equ8 {
|
|
51
51
|
opacity: 1;
|
|
52
52
|
transition: opacity 200ms ease-in;
|
|
53
|
-
} .base-
|
|
53
|
+
} .base-modal__exit_1equ8 {
|
|
54
54
|
opacity: 1;
|
|
55
|
-
} .base-
|
|
56
|
-
.base-
|
|
55
|
+
} .base-modal__exitActive_1equ8,
|
|
56
|
+
.base-modal__exitDone_1equ8 {
|
|
57
57
|
opacity: 0;
|
|
58
58
|
transition: opacity 200ms ease-out;
|
|
59
59
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
const styles = {"component":"base-
|
|
3
|
+
const styles = {"component":"base-modal__component_1equ8","wrapper":"base-modal__wrapper_1equ8","content":"base-modal__content_1equ8","hasFooter":"base-modal__hasFooter_1equ8","hasHeader":"base-modal__hasHeader_1equ8","hidden":"base-modal__hidden_1equ8","backdrop":"base-modal__backdrop_1equ8","appear":"base-modal__appear_1equ8","enter":"base-modal__enter_1equ8","appearActive":"base-modal__appearActive_1equ8","enterActive":"base-modal__enterActive_1equ8","exit":"base-modal__exit_1equ8","exitActive":"base-modal__exitActive_1equ8","exitDone":"base-modal__exitDone_1equ8"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.css.js","sources":["src/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n\n:root {\n --window-inner-scrollY: 10px; /* fallback value to prevent ci error */\n}\n\nbody:global(.is-locked) {\n margin-top: calc(var(--window-inner-scrollY) * -1);\n position: fixed;\n overflow: hidden;\n}\n\n.component {\n position: relative;\n box-sizing: border-box;\n background: var(--color-light-modal-bg-primary);\n margin: auto;\n flex-shrink: 0;\n}\n\n.wrapper {\n position: fixed;\n top: var(--gap-0);\n left: var(--gap-0);\n right: var(--gap-0);\n bottom: var(--gap-0);\n\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: 0;\n overscroll-behavior: none;\n}\n\n.content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &.hasFooter {\n @media (display-mode: standalone) {\n padding-bottom: unset;\n }\n }\n\n &.hasHeader {\n @media (display-mode: standalone) {\n padding-top: unset;\n }\n }\n}\n\n.hidden {\n display: none;\n}\n\n.backdrop {\n z-index: 0;\n}\n\n.appear,\n.enter {\n opacity: 0;\n}\n\n.appearActive,\n.enterActive {\n opacity: 1;\n transition: opacity 200ms ease-in;\n}\n\n.exit {\n opacity: 1;\n}\n\n.exitActive,\n.exitDone {\n opacity: 0;\n transition: opacity 200ms ease-out;\n}\n"],"names":[],"mappings":";;AAEgB,eAAe,CAAC,WAAW,CAAC,6BAA6B,CAAC,SAAS,CAAC,2BAA2B,CAAC,SAAS,CAAC,2BAA2B,CAAC,WAAW,CAAC,6BAA6B,CAAC,WAAW,CAAC,6BAA6B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,UAAU,CAAC,4BAA4B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,gCAAgC,CAAC,aAAa,CAAC,+BAA+B,CAAC,MAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,8BAA8B,CAAC,UAAU,CAAC,4BAA4B,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"index.module.css.js","sources":["src/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/no-dynamic-mixins-index.css';\n\n:root {\n --window-inner-scrollY: 10px; /* fallback value to prevent ci error */\n}\n\nbody:global(.is-locked) {\n margin-top: calc(var(--window-inner-scrollY) * -1);\n position: fixed;\n overflow: hidden;\n}\n\n.component {\n position: relative;\n box-sizing: border-box;\n background: var(--color-light-modal-bg-primary);\n margin: auto;\n flex-shrink: 0;\n}\n\n.wrapper {\n position: fixed;\n top: var(--gap-0);\n left: var(--gap-0);\n right: var(--gap-0);\n bottom: var(--gap-0);\n\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: 0;\n overscroll-behavior: none;\n}\n\n.content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &.hasFooter {\n @media (display-mode: standalone) {\n padding-bottom: unset;\n }\n }\n\n &.hasHeader {\n @media (display-mode: standalone) {\n padding-top: unset;\n }\n }\n}\n\n.hidden {\n display: none;\n}\n\n.backdrop {\n z-index: 0;\n}\n\n.appear,\n.enter {\n opacity: 0;\n}\n\n.appearActive,\n.enterActive {\n opacity: 1;\n transition: opacity 200ms ease-in;\n}\n\n.exit {\n opacity: 1;\n}\n\n.exitActive,\n.exitDone {\n opacity: 0;\n transition: opacity 200ms ease-out;\n}\n"],"names":[],"mappings":";;AAEgB,eAAe,CAAC,WAAW,CAAC,6BAA6B,CAAC,SAAS,CAAC,2BAA2B,CAAC,SAAS,CAAC,2BAA2B,CAAC,WAAW,CAAC,6BAA6B,CAAC,WAAW,CAAC,6BAA6B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,UAAU,CAAC,4BAA4B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,gCAAgC,CAAC,aAAa,CAAC,+BAA+B,CAAC,MAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,8BAA8B,CAAC,UAAU,CAAC,4BAA4B,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/core-components-base-modal",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.1.0-snapshot-92b8690",
|
|
4
4
|
"description": "BaseModal component",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
"main": "index.js",
|
|
11
11
|
"module": "./esm/index.js",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@alfalab/core-components-backdrop": "
|
|
14
|
-
"@alfalab/core-components-global-store": "
|
|
15
|
-
"@alfalab/core-components-portal": "
|
|
16
|
-
"@alfalab/core-components-shared": "
|
|
17
|
-
"@alfalab/core-components-stack": "
|
|
13
|
+
"@alfalab/core-components-backdrop": "4.1.0-snapshot-92b8690",
|
|
14
|
+
"@alfalab/core-components-global-store": "3.1.0-snapshot-92b8690",
|
|
15
|
+
"@alfalab/core-components-portal": "4.1.0-snapshot-92b8690",
|
|
16
|
+
"@alfalab/core-components-shared": "1.1.0-snapshot-92b8690",
|
|
17
|
+
"@alfalab/core-components-stack": "6.1.0-snapshot-92b8690",
|
|
18
18
|
"@juggle/resize-observer": "^3.3.1",
|
|
19
19
|
"@types/react-transition-group": "^4.4.5",
|
|
20
20
|
"classnames": "^2.5.1",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"tslib": "^2.4.0"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@alfalab/core-components-stack-context": "
|
|
27
|
+
"@alfalab/core-components-stack-context": "1.1.0-snapshot-92b8690",
|
|
28
28
|
"react": "^16.9.0 || ^17.0.1 || ^18.0.0",
|
|
29
29
|
"react-dom": "^16.9.0 || ^17.0.1 || ^18.0.0"
|
|
30
30
|
},
|
|
@@ -32,6 +32,6 @@
|
|
|
32
32
|
"access": "public",
|
|
33
33
|
"directory": "dist"
|
|
34
34
|
},
|
|
35
|
-
"themesVersion": "14.
|
|
36
|
-
"varsVersion": "10.
|
|
35
|
+
"themesVersion": "14.1.0-snapshot-92b8690",
|
|
36
|
+
"varsVersion": "10.1.0-snapshot-92b8690"
|
|
37
37
|
}
|
package/src/index.module.css
CHANGED