@rc-component/drawer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +81 -0
- package/assets/index.css +42 -0
- package/es/Drawer.d.ts +18 -0
- package/es/Drawer.js +108 -0
- package/es/DrawerPanel.d.ts +26 -0
- package/es/DrawerPanel.js +34 -0
- package/es/DrawerPopup.d.ts +40 -0
- package/es/DrawerPopup.js +274 -0
- package/es/context.d.ts +12 -0
- package/es/context.js +4 -0
- package/es/index.d.ts +4 -0
- package/es/index.js +3 -0
- package/es/inter.d.ts +11 -0
- package/es/inter.js +1 -0
- package/es/util.d.ts +3 -0
- package/es/util.js +13 -0
- package/lib/Drawer.d.ts +18 -0
- package/lib/Drawer.js +117 -0
- package/lib/DrawerPanel.d.ts +26 -0
- package/lib/DrawerPanel.js +43 -0
- package/lib/DrawerPopup.d.ts +40 -0
- package/lib/DrawerPopup.js +283 -0
- package/lib/context.d.ts +12 -0
- package/lib/context.js +12 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +10 -0
- package/lib/inter.d.ts +11 -0
- package/lib/inter.js +5 -0
- package/lib/util.d.ts +3 -0
- package/lib/util.js +21 -0
- package/package.json +90 -0
package/es/index.js
ADDED
package/es/inter.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface DrawerClassNames {
|
|
3
|
+
mask?: string;
|
|
4
|
+
wrapper?: string;
|
|
5
|
+
section?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DrawerStyles {
|
|
8
|
+
mask?: React.CSSProperties;
|
|
9
|
+
wrapper?: React.CSSProperties;
|
|
10
|
+
section?: React.CSSProperties;
|
|
11
|
+
}
|
package/es/inter.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/es/util.d.ts
ADDED
package/es/util.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import warning from "@rc-component/util/es/warning";
|
|
2
|
+
import canUseDom from "@rc-component/util/es/Dom/canUseDom";
|
|
3
|
+
export function parseWidthHeight(value) {
|
|
4
|
+
if (typeof value === 'string' && String(Number(value)) === value) {
|
|
5
|
+
warning(false, 'Invalid value type of `width` or `height` which should be number type instead.');
|
|
6
|
+
return Number(value);
|
|
7
|
+
}
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
export function warnCheck(props) {
|
|
11
|
+
warning(!('wrapperClassName' in props), `'wrapperClassName' is removed. Please use 'rootClassName' instead.`);
|
|
12
|
+
warning(canUseDom() || !props.open, `Drawer with 'open' in SSR is not work since no place to createPortal. Please move to 'useEffect' instead.`);
|
|
13
|
+
}
|
package/lib/Drawer.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PortalProps } from '@rc-component/portal';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import type { DrawerPanelAccessibility, DrawerPanelEvents } from './DrawerPanel';
|
|
4
|
+
import type { DrawerPopupProps } from './DrawerPopup';
|
|
5
|
+
import type { DrawerClassNames, DrawerStyles } from './inter';
|
|
6
|
+
export type Placement = 'left' | 'top' | 'right' | 'bottom';
|
|
7
|
+
export interface DrawerProps extends Omit<DrawerPopupProps, 'prefixCls' | 'inline' | 'scrollLocker'>, DrawerPanelEvents, DrawerPanelAccessibility {
|
|
8
|
+
prefixCls?: string;
|
|
9
|
+
open?: boolean;
|
|
10
|
+
onClose?: (e: React.MouseEvent | React.KeyboardEvent) => void;
|
|
11
|
+
destroyOnClose?: boolean;
|
|
12
|
+
getContainer?: PortalProps['getContainer'];
|
|
13
|
+
panelRef?: React.Ref<HTMLDivElement>;
|
|
14
|
+
classNames?: DrawerClassNames;
|
|
15
|
+
styles?: DrawerStyles;
|
|
16
|
+
}
|
|
17
|
+
declare const Drawer: React.FC<DrawerProps>;
|
|
18
|
+
export default Drawer;
|
package/lib/Drawer.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _portal = _interopRequireDefault(require("@rc-component/portal"));
|
|
8
|
+
var _useLayoutEffect = _interopRequireDefault(require("@rc-component/util/lib/hooks/useLayoutEffect"));
|
|
9
|
+
var React = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _context = require("./context");
|
|
11
|
+
var _DrawerPopup = _interopRequireDefault(require("./DrawerPopup"));
|
|
12
|
+
var _util = require("./util");
|
|
13
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
const Drawer = props => {
|
|
17
|
+
const {
|
|
18
|
+
open = false,
|
|
19
|
+
prefixCls = 'rc-drawer',
|
|
20
|
+
placement = 'right',
|
|
21
|
+
autoFocus = true,
|
|
22
|
+
keyboard = true,
|
|
23
|
+
width = 378,
|
|
24
|
+
mask = true,
|
|
25
|
+
maskClosable = true,
|
|
26
|
+
getContainer,
|
|
27
|
+
forceRender,
|
|
28
|
+
afterOpenChange,
|
|
29
|
+
destroyOnClose,
|
|
30
|
+
onMouseEnter,
|
|
31
|
+
onMouseOver,
|
|
32
|
+
onMouseLeave,
|
|
33
|
+
onClick,
|
|
34
|
+
onKeyDown,
|
|
35
|
+
onKeyUp,
|
|
36
|
+
// Refs
|
|
37
|
+
panelRef
|
|
38
|
+
} = props;
|
|
39
|
+
const [animatedVisible, setAnimatedVisible] = React.useState(false);
|
|
40
|
+
|
|
41
|
+
// ============================= Warn =============================
|
|
42
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
43
|
+
(0, _util.warnCheck)(props);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ============================= Open =============================
|
|
47
|
+
const [mounted, setMounted] = React.useState(false);
|
|
48
|
+
(0, _useLayoutEffect.default)(() => {
|
|
49
|
+
setMounted(true);
|
|
50
|
+
}, []);
|
|
51
|
+
const mergedOpen = mounted ? open : false;
|
|
52
|
+
|
|
53
|
+
// ============================ Focus =============================
|
|
54
|
+
const popupRef = React.useRef(null);
|
|
55
|
+
const lastActiveRef = React.useRef(null);
|
|
56
|
+
(0, _useLayoutEffect.default)(() => {
|
|
57
|
+
if (mergedOpen) {
|
|
58
|
+
lastActiveRef.current = document.activeElement;
|
|
59
|
+
}
|
|
60
|
+
}, [mergedOpen]);
|
|
61
|
+
|
|
62
|
+
// ============================= Open =============================
|
|
63
|
+
const internalAfterOpenChange = nextVisible => {
|
|
64
|
+
setAnimatedVisible(nextVisible);
|
|
65
|
+
afterOpenChange?.(nextVisible);
|
|
66
|
+
if (!nextVisible && lastActiveRef.current && !popupRef.current?.contains(lastActiveRef.current)) {
|
|
67
|
+
lastActiveRef.current?.focus({
|
|
68
|
+
preventScroll: true
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// =========================== Context ============================
|
|
74
|
+
const refContext = React.useMemo(() => ({
|
|
75
|
+
panel: panelRef
|
|
76
|
+
}), [panelRef]);
|
|
77
|
+
|
|
78
|
+
// ============================ Render ============================
|
|
79
|
+
if (!forceRender && !animatedVisible && !mergedOpen && destroyOnClose) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const eventHandlers = {
|
|
83
|
+
onMouseEnter,
|
|
84
|
+
onMouseOver,
|
|
85
|
+
onMouseLeave,
|
|
86
|
+
onClick,
|
|
87
|
+
onKeyDown,
|
|
88
|
+
onKeyUp
|
|
89
|
+
};
|
|
90
|
+
const drawerPopupProps = {
|
|
91
|
+
...props,
|
|
92
|
+
open: mergedOpen,
|
|
93
|
+
prefixCls,
|
|
94
|
+
placement,
|
|
95
|
+
autoFocus,
|
|
96
|
+
keyboard,
|
|
97
|
+
width,
|
|
98
|
+
mask,
|
|
99
|
+
maskClosable,
|
|
100
|
+
inline: getContainer === false,
|
|
101
|
+
afterOpenChange: internalAfterOpenChange,
|
|
102
|
+
ref: popupRef,
|
|
103
|
+
...eventHandlers
|
|
104
|
+
};
|
|
105
|
+
return /*#__PURE__*/React.createElement(_context.RefContext.Provider, {
|
|
106
|
+
value: refContext
|
|
107
|
+
}, /*#__PURE__*/React.createElement(_portal.default, {
|
|
108
|
+
open: mergedOpen || forceRender || animatedVisible,
|
|
109
|
+
autoDestroy: false,
|
|
110
|
+
getContainer: getContainer,
|
|
111
|
+
autoLock: mask && (mergedOpen || animatedVisible)
|
|
112
|
+
}, /*#__PURE__*/React.createElement(_DrawerPopup.default, drawerPopupProps)));
|
|
113
|
+
};
|
|
114
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
115
|
+
Drawer.displayName = 'Drawer';
|
|
116
|
+
}
|
|
117
|
+
var _default = exports.default = Drawer;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface DrawerPanelRef {
|
|
3
|
+
focus: VoidFunction;
|
|
4
|
+
}
|
|
5
|
+
export interface DrawerPanelEvents {
|
|
6
|
+
onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;
|
|
7
|
+
onMouseOver?: React.MouseEventHandler<HTMLDivElement>;
|
|
8
|
+
onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;
|
|
9
|
+
onClick?: React.MouseEventHandler<HTMLDivElement>;
|
|
10
|
+
onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;
|
|
11
|
+
onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;
|
|
12
|
+
}
|
|
13
|
+
export type DrawerPanelAccessibility = Pick<React.DialogHTMLAttributes<HTMLDivElement>, keyof React.AriaAttributes>;
|
|
14
|
+
export interface DrawerPanelProps extends DrawerPanelEvents, DrawerPanelAccessibility {
|
|
15
|
+
prefixCls: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
id?: string;
|
|
18
|
+
style?: React.CSSProperties;
|
|
19
|
+
children?: React.ReactNode;
|
|
20
|
+
containerRef?: React.Ref<HTMLDivElement>;
|
|
21
|
+
}
|
|
22
|
+
declare const DrawerPanel: {
|
|
23
|
+
(props: DrawerPanelProps): React.JSX.Element;
|
|
24
|
+
displayName: string;
|
|
25
|
+
};
|
|
26
|
+
export default DrawerPanel;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
8
|
+
var React = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _context = require("./context");
|
|
10
|
+
var _pickAttrs = _interopRequireDefault(require("@rc-component/util/lib/pickAttrs"));
|
|
11
|
+
var _ref = require("@rc-component/util/lib/ref");
|
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
16
|
+
const DrawerPanel = props => {
|
|
17
|
+
const {
|
|
18
|
+
prefixCls,
|
|
19
|
+
className,
|
|
20
|
+
containerRef,
|
|
21
|
+
...restProps
|
|
22
|
+
} = props;
|
|
23
|
+
const {
|
|
24
|
+
panel: panelRef
|
|
25
|
+
} = React.useContext(_context.RefContext);
|
|
26
|
+
const mergedRef = (0, _ref.useComposeRef)(panelRef, containerRef);
|
|
27
|
+
|
|
28
|
+
// =============================== Render ===============================
|
|
29
|
+
|
|
30
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
31
|
+
className: (0, _classnames.default)(`${prefixCls}-section`, className),
|
|
32
|
+
role: "dialog",
|
|
33
|
+
ref: mergedRef
|
|
34
|
+
}, (0, _pickAttrs.default)(props, {
|
|
35
|
+
aria: true
|
|
36
|
+
}), {
|
|
37
|
+
"aria-modal": "true"
|
|
38
|
+
}, restProps));
|
|
39
|
+
};
|
|
40
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
41
|
+
DrawerPanel.displayName = 'DrawerPanel';
|
|
42
|
+
}
|
|
43
|
+
var _default = exports.default = DrawerPanel;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CSSMotionProps } from '@rc-component/motion';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import type { DrawerPanelAccessibility, DrawerPanelEvents } from './DrawerPanel';
|
|
4
|
+
import type { DrawerClassNames, DrawerStyles } from './inter';
|
|
5
|
+
export type Placement = 'left' | 'right' | 'top' | 'bottom';
|
|
6
|
+
export interface PushConfig {
|
|
7
|
+
distance?: number | string;
|
|
8
|
+
}
|
|
9
|
+
export interface DrawerPopupProps extends DrawerPanelEvents, DrawerPanelAccessibility {
|
|
10
|
+
prefixCls: string;
|
|
11
|
+
open?: boolean;
|
|
12
|
+
inline?: boolean;
|
|
13
|
+
push?: boolean | PushConfig;
|
|
14
|
+
forceRender?: boolean;
|
|
15
|
+
autoFocus?: boolean;
|
|
16
|
+
keyboard?: boolean;
|
|
17
|
+
rootClassName?: string;
|
|
18
|
+
rootStyle?: React.CSSProperties;
|
|
19
|
+
zIndex?: number;
|
|
20
|
+
placement?: Placement;
|
|
21
|
+
id?: string;
|
|
22
|
+
className?: string;
|
|
23
|
+
style?: React.CSSProperties;
|
|
24
|
+
children?: React.ReactNode;
|
|
25
|
+
width?: number | string;
|
|
26
|
+
height?: number | string;
|
|
27
|
+
mask?: boolean;
|
|
28
|
+
maskClosable?: boolean;
|
|
29
|
+
maskClassName?: string;
|
|
30
|
+
maskStyle?: React.CSSProperties;
|
|
31
|
+
motion?: CSSMotionProps | ((placement: Placement) => CSSMotionProps);
|
|
32
|
+
maskMotion?: CSSMotionProps;
|
|
33
|
+
afterOpenChange?: (open: boolean) => void;
|
|
34
|
+
onClose?: (event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) => void;
|
|
35
|
+
classNames?: DrawerClassNames;
|
|
36
|
+
styles?: DrawerStyles;
|
|
37
|
+
drawerRender?: (node: React.ReactNode) => React.ReactNode;
|
|
38
|
+
}
|
|
39
|
+
declare const RefDrawerPopup: React.ForwardRefExoticComponent<DrawerPopupProps & React.RefAttributes<HTMLDivElement>>;
|
|
40
|
+
export default RefDrawerPopup;
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
8
|
+
var _motion = _interopRequireDefault(require("@rc-component/motion"));
|
|
9
|
+
var _KeyCode = _interopRequireDefault(require("@rc-component/util/lib/KeyCode"));
|
|
10
|
+
var _pickAttrs = _interopRequireDefault(require("@rc-component/util/lib/pickAttrs"));
|
|
11
|
+
var React = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _context = _interopRequireDefault(require("./context"));
|
|
13
|
+
var _DrawerPanel = _interopRequireDefault(require("./DrawerPanel"));
|
|
14
|
+
var _util = require("./util");
|
|
15
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
16
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
19
|
+
const sentinelStyle = {
|
|
20
|
+
width: 0,
|
|
21
|
+
height: 0,
|
|
22
|
+
overflow: 'hidden',
|
|
23
|
+
outline: 'none',
|
|
24
|
+
position: 'absolute'
|
|
25
|
+
};
|
|
26
|
+
function DrawerPopup(props, ref) {
|
|
27
|
+
const {
|
|
28
|
+
prefixCls,
|
|
29
|
+
open,
|
|
30
|
+
placement,
|
|
31
|
+
inline,
|
|
32
|
+
push,
|
|
33
|
+
forceRender,
|
|
34
|
+
autoFocus,
|
|
35
|
+
keyboard,
|
|
36
|
+
// classNames
|
|
37
|
+
classNames: drawerClassNames,
|
|
38
|
+
// Root
|
|
39
|
+
rootClassName,
|
|
40
|
+
rootStyle,
|
|
41
|
+
zIndex,
|
|
42
|
+
// Drawer
|
|
43
|
+
className,
|
|
44
|
+
id,
|
|
45
|
+
style,
|
|
46
|
+
motion,
|
|
47
|
+
width,
|
|
48
|
+
height,
|
|
49
|
+
children,
|
|
50
|
+
// Mask
|
|
51
|
+
mask,
|
|
52
|
+
maskClosable,
|
|
53
|
+
maskMotion,
|
|
54
|
+
maskClassName,
|
|
55
|
+
maskStyle,
|
|
56
|
+
// Events
|
|
57
|
+
afterOpenChange,
|
|
58
|
+
onClose,
|
|
59
|
+
onMouseEnter,
|
|
60
|
+
onMouseOver,
|
|
61
|
+
onMouseLeave,
|
|
62
|
+
onClick,
|
|
63
|
+
onKeyDown,
|
|
64
|
+
onKeyUp,
|
|
65
|
+
styles,
|
|
66
|
+
drawerRender
|
|
67
|
+
} = props;
|
|
68
|
+
|
|
69
|
+
// ================================ Refs ================================
|
|
70
|
+
const panelRef = React.useRef(null);
|
|
71
|
+
const sentinelStartRef = React.useRef(null);
|
|
72
|
+
const sentinelEndRef = React.useRef(null);
|
|
73
|
+
React.useImperativeHandle(ref, () => panelRef.current);
|
|
74
|
+
const onPanelKeyDown = event => {
|
|
75
|
+
const {
|
|
76
|
+
keyCode,
|
|
77
|
+
shiftKey
|
|
78
|
+
} = event;
|
|
79
|
+
switch (keyCode) {
|
|
80
|
+
// Tab active
|
|
81
|
+
case _KeyCode.default.TAB:
|
|
82
|
+
{
|
|
83
|
+
if (keyCode === _KeyCode.default.TAB) {
|
|
84
|
+
if (!shiftKey && document.activeElement === sentinelEndRef.current) {
|
|
85
|
+
sentinelStartRef.current?.focus({
|
|
86
|
+
preventScroll: true
|
|
87
|
+
});
|
|
88
|
+
} else if (shiftKey && document.activeElement === sentinelStartRef.current) {
|
|
89
|
+
sentinelEndRef.current?.focus({
|
|
90
|
+
preventScroll: true
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Close
|
|
98
|
+
case _KeyCode.default.ESC:
|
|
99
|
+
{
|
|
100
|
+
if (onClose && keyboard) {
|
|
101
|
+
event.stopPropagation();
|
|
102
|
+
onClose(event);
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// ========================== Control ===========================
|
|
110
|
+
// Auto Focus
|
|
111
|
+
React.useEffect(() => {
|
|
112
|
+
if (open && autoFocus) {
|
|
113
|
+
panelRef.current?.focus({
|
|
114
|
+
preventScroll: true
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}, [open]);
|
|
118
|
+
|
|
119
|
+
// ============================ Push ============================
|
|
120
|
+
const [pushed, setPushed] = React.useState(false);
|
|
121
|
+
const parentContext = React.useContext(_context.default);
|
|
122
|
+
|
|
123
|
+
// Merge push distance
|
|
124
|
+
let pushConfig;
|
|
125
|
+
if (typeof push === 'boolean') {
|
|
126
|
+
pushConfig = push ? {} : {
|
|
127
|
+
distance: 0
|
|
128
|
+
};
|
|
129
|
+
} else {
|
|
130
|
+
pushConfig = push || {};
|
|
131
|
+
}
|
|
132
|
+
const pushDistance = pushConfig?.distance ?? parentContext?.pushDistance ?? 180;
|
|
133
|
+
const mergedContext = React.useMemo(() => ({
|
|
134
|
+
pushDistance,
|
|
135
|
+
push: () => {
|
|
136
|
+
setPushed(true);
|
|
137
|
+
},
|
|
138
|
+
pull: () => {
|
|
139
|
+
setPushed(false);
|
|
140
|
+
}
|
|
141
|
+
}), [pushDistance]);
|
|
142
|
+
|
|
143
|
+
// ========================= ScrollLock =========================
|
|
144
|
+
// Tell parent to push
|
|
145
|
+
React.useEffect(() => {
|
|
146
|
+
if (open) {
|
|
147
|
+
parentContext?.push?.();
|
|
148
|
+
} else {
|
|
149
|
+
parentContext?.pull?.();
|
|
150
|
+
}
|
|
151
|
+
}, [open]);
|
|
152
|
+
|
|
153
|
+
// Clean up
|
|
154
|
+
React.useEffect(() => () => {
|
|
155
|
+
parentContext?.pull?.();
|
|
156
|
+
}, []);
|
|
157
|
+
|
|
158
|
+
// ============================ Mask ============================
|
|
159
|
+
const maskNode = mask && /*#__PURE__*/React.createElement(_motion.default, _extends({
|
|
160
|
+
key: "mask"
|
|
161
|
+
}, maskMotion, {
|
|
162
|
+
visible: open
|
|
163
|
+
}), ({
|
|
164
|
+
className: motionMaskClassName,
|
|
165
|
+
style: motionMaskStyle
|
|
166
|
+
}, maskRef) => /*#__PURE__*/React.createElement("div", {
|
|
167
|
+
className: (0, _classnames.default)(`${prefixCls}-mask`, motionMaskClassName, drawerClassNames?.mask, maskClassName),
|
|
168
|
+
style: {
|
|
169
|
+
...motionMaskStyle,
|
|
170
|
+
...maskStyle,
|
|
171
|
+
...styles?.mask
|
|
172
|
+
},
|
|
173
|
+
onClick: maskClosable && open ? onClose : undefined,
|
|
174
|
+
ref: maskRef
|
|
175
|
+
}));
|
|
176
|
+
|
|
177
|
+
// =========================== Panel ============================
|
|
178
|
+
const motionProps = typeof motion === 'function' ? motion(placement) : motion;
|
|
179
|
+
const wrapperStyle = {};
|
|
180
|
+
if (pushed && pushDistance) {
|
|
181
|
+
switch (placement) {
|
|
182
|
+
case 'top':
|
|
183
|
+
wrapperStyle.transform = `translateY(${pushDistance}px)`;
|
|
184
|
+
break;
|
|
185
|
+
case 'bottom':
|
|
186
|
+
wrapperStyle.transform = `translateY(${-pushDistance}px)`;
|
|
187
|
+
break;
|
|
188
|
+
case 'left':
|
|
189
|
+
wrapperStyle.transform = `translateX(${pushDistance}px)`;
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
wrapperStyle.transform = `translateX(${-pushDistance}px)`;
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (placement === 'left' || placement === 'right') {
|
|
197
|
+
wrapperStyle.width = (0, _util.parseWidthHeight)(width);
|
|
198
|
+
} else {
|
|
199
|
+
wrapperStyle.height = (0, _util.parseWidthHeight)(height);
|
|
200
|
+
}
|
|
201
|
+
const eventHandlers = {
|
|
202
|
+
onMouseEnter,
|
|
203
|
+
onMouseOver,
|
|
204
|
+
onMouseLeave,
|
|
205
|
+
onClick,
|
|
206
|
+
onKeyDown,
|
|
207
|
+
onKeyUp
|
|
208
|
+
};
|
|
209
|
+
const panelNode = /*#__PURE__*/React.createElement(_motion.default, _extends({
|
|
210
|
+
key: "panel"
|
|
211
|
+
}, motionProps, {
|
|
212
|
+
visible: open,
|
|
213
|
+
forceRender: forceRender,
|
|
214
|
+
onVisibleChanged: nextVisible => {
|
|
215
|
+
afterOpenChange?.(nextVisible);
|
|
216
|
+
},
|
|
217
|
+
removeOnLeave: false,
|
|
218
|
+
leavedClassName: `${prefixCls}-content-wrapper-hidden`
|
|
219
|
+
}), ({
|
|
220
|
+
className: motionClassName,
|
|
221
|
+
style: motionStyle
|
|
222
|
+
}, motionRef) => {
|
|
223
|
+
const content = /*#__PURE__*/React.createElement(_DrawerPanel.default, _extends({
|
|
224
|
+
id: id,
|
|
225
|
+
containerRef: motionRef,
|
|
226
|
+
prefixCls: prefixCls,
|
|
227
|
+
className: (0, _classnames.default)(className, drawerClassNames?.section),
|
|
228
|
+
style: {
|
|
229
|
+
...style,
|
|
230
|
+
...styles?.section
|
|
231
|
+
}
|
|
232
|
+
}, (0, _pickAttrs.default)(props, {
|
|
233
|
+
aria: true
|
|
234
|
+
}), eventHandlers), children);
|
|
235
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
236
|
+
className: (0, _classnames.default)(`${prefixCls}-content-wrapper`, drawerClassNames?.wrapper, motionClassName),
|
|
237
|
+
style: {
|
|
238
|
+
...wrapperStyle,
|
|
239
|
+
...motionStyle,
|
|
240
|
+
...styles?.wrapper
|
|
241
|
+
}
|
|
242
|
+
}, (0, _pickAttrs.default)(props, {
|
|
243
|
+
data: true
|
|
244
|
+
})), drawerRender ? drawerRender(content) : content);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// =========================== Render ===========================
|
|
248
|
+
const containerStyle = {
|
|
249
|
+
...rootStyle
|
|
250
|
+
};
|
|
251
|
+
if (zIndex) {
|
|
252
|
+
containerStyle.zIndex = zIndex;
|
|
253
|
+
}
|
|
254
|
+
return /*#__PURE__*/React.createElement(_context.default.Provider, {
|
|
255
|
+
value: mergedContext
|
|
256
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
257
|
+
className: (0, _classnames.default)(prefixCls, `${prefixCls}-${placement}`, rootClassName, {
|
|
258
|
+
[`${prefixCls}-open`]: open,
|
|
259
|
+
[`${prefixCls}-inline`]: inline
|
|
260
|
+
}),
|
|
261
|
+
style: containerStyle,
|
|
262
|
+
tabIndex: -1,
|
|
263
|
+
ref: panelRef,
|
|
264
|
+
onKeyDown: onPanelKeyDown
|
|
265
|
+
}, maskNode, /*#__PURE__*/React.createElement("div", {
|
|
266
|
+
tabIndex: 0,
|
|
267
|
+
ref: sentinelStartRef,
|
|
268
|
+
style: sentinelStyle,
|
|
269
|
+
"aria-hidden": "true",
|
|
270
|
+
"data-sentinel": "start"
|
|
271
|
+
}), panelNode, /*#__PURE__*/React.createElement("div", {
|
|
272
|
+
tabIndex: 0,
|
|
273
|
+
ref: sentinelEndRef,
|
|
274
|
+
style: sentinelStyle,
|
|
275
|
+
"aria-hidden": "true",
|
|
276
|
+
"data-sentinel": "end"
|
|
277
|
+
})));
|
|
278
|
+
}
|
|
279
|
+
const RefDrawerPopup = /*#__PURE__*/React.forwardRef(DrawerPopup);
|
|
280
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
281
|
+
RefDrawerPopup.displayName = 'DrawerPopup';
|
|
282
|
+
}
|
|
283
|
+
var _default = exports.default = RefDrawerPopup;
|
package/lib/context.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface DrawerContextProps {
|
|
3
|
+
pushDistance?: number | string;
|
|
4
|
+
push: VoidFunction;
|
|
5
|
+
pull: VoidFunction;
|
|
6
|
+
}
|
|
7
|
+
declare const DrawerContext: React.Context<DrawerContextProps>;
|
|
8
|
+
export interface RefContextProps {
|
|
9
|
+
panel?: React.Ref<HTMLDivElement>;
|
|
10
|
+
}
|
|
11
|
+
export declare const RefContext: React.Context<RefContextProps>;
|
|
12
|
+
export default DrawerContext;
|
package/lib/context.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.RefContext = void 0;
|
|
7
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
9
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
10
|
+
const DrawerContext = /*#__PURE__*/React.createContext(null);
|
|
11
|
+
const RefContext = exports.RefContext = /*#__PURE__*/React.createContext({});
|
|
12
|
+
var _default = exports.default = DrawerContext;
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _Drawer = _interopRequireDefault(require("./Drawer"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
// export this package's api
|
|
10
|
+
var _default = exports.default = _Drawer.default;
|
package/lib/inter.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface DrawerClassNames {
|
|
3
|
+
mask?: string;
|
|
4
|
+
wrapper?: string;
|
|
5
|
+
section?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DrawerStyles {
|
|
8
|
+
mask?: React.CSSProperties;
|
|
9
|
+
wrapper?: React.CSSProperties;
|
|
10
|
+
section?: React.CSSProperties;
|
|
11
|
+
}
|
package/lib/inter.js
ADDED
package/lib/util.d.ts
ADDED
package/lib/util.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.parseWidthHeight = parseWidthHeight;
|
|
7
|
+
exports.warnCheck = warnCheck;
|
|
8
|
+
var _warning = _interopRequireDefault(require("@rc-component/util/lib/warning"));
|
|
9
|
+
var _canUseDom = _interopRequireDefault(require("@rc-component/util/lib/Dom/canUseDom"));
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
function parseWidthHeight(value) {
|
|
12
|
+
if (typeof value === 'string' && String(Number(value)) === value) {
|
|
13
|
+
(0, _warning.default)(false, 'Invalid value type of `width` or `height` which should be number type instead.');
|
|
14
|
+
return Number(value);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function warnCheck(props) {
|
|
19
|
+
(0, _warning.default)(!('wrapperClassName' in props), `'wrapperClassName' is removed. Please use 'rootClassName' instead.`);
|
|
20
|
+
(0, _warning.default)((0, _canUseDom.default)() || !props.open, `Drawer with 'open' in SSR is not work since no place to createPortal. Please move to 'useEffect' instead.`);
|
|
21
|
+
}
|