UNPKG

9.5 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.isHorizontal = isHorizontal;
9exports.getAnchor = getAnchor;
10exports.default = exports.styles = void 0;
11
12var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
14var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
16var _react = _interopRequireDefault(require("react"));
17
18var _propTypes = _interopRequireDefault(require("prop-types"));
19
20var _clsx = _interopRequireDefault(require("clsx"));
21
22var _Modal = _interopRequireDefault(require("../Modal"));
23
24var _Backdrop = _interopRequireDefault(require("../Backdrop"));
25
26var _withStyles = _interopRequireDefault(require("../styles/withStyles"));
27
28var _Slide = _interopRequireDefault(require("../Slide"));
29
30var _Paper = _interopRequireDefault(require("../Paper"));
31
32var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
33
34var _transitions = require("../styles/transitions");
35
36var _useTheme = _interopRequireDefault(require("../styles/useTheme"));
37
38var styles = function styles(theme) {
39 return {
40 /* Styles applied to the root element. */
41 root: {},
42
43 /* Styles applied to the root element if `variant="permanent or persistent"`. */
44 docked: {
45 flex: '0 0 auto'
46 },
47
48 /* Styles applied to the `Paper` component. */
49 paper: {
50 overflowY: 'auto',
51 display: 'flex',
52 flexDirection: 'column',
53 height: '100%',
54 flex: '1 0 auto',
55 zIndex: theme.zIndex.drawer,
56 WebkitOverflowScrolling: 'touch',
57 // Add iOS momentum scrolling.
58 // temporary style
59 position: 'fixed',
60 top: 0,
61 // We disable the focus ring for mouse, touch and keyboard users.
62 // At some point, it would be better to keep it for keyboard users.
63 // :focus-ring CSS pseudo-class will help.
64 outline: 0
65 },
66
67 /* Styles applied to the `Paper` component if `anchor="left"`. */
68 paperAnchorLeft: {
69 left: 0,
70 right: 'auto'
71 },
72
73 /* Styles applied to the `Paper` component if `anchor="right"`. */
74 paperAnchorRight: {
75 left: 'auto',
76 right: 0
77 },
78
79 /* Styles applied to the `Paper` component if `anchor="top"`. */
80 paperAnchorTop: {
81 top: 0,
82 left: 0,
83 bottom: 'auto',
84 right: 0,
85 height: 'auto',
86 maxHeight: '100%'
87 },
88
89 /* Styles applied to the `Paper` component if `anchor="bottom"`. */
90 paperAnchorBottom: {
91 top: 'auto',
92 left: 0,
93 bottom: 0,
94 right: 0,
95 height: 'auto',
96 maxHeight: '100%'
97 },
98
99 /* Styles applied to the `Paper` component if `anchor="left"` and `variant` is not "temporary". */
100 paperAnchorDockedLeft: {
101 borderRight: "1px solid ".concat(theme.palette.divider)
102 },
103
104 /* Styles applied to the `Paper` component if `anchor="top"` and `variant` is not "temporary". */
105 paperAnchorDockedTop: {
106 borderBottom: "1px solid ".concat(theme.palette.divider)
107 },
108
109 /* Styles applied to the `Paper` component if `anchor="right"` and `variant` is not "temporary". */
110 paperAnchorDockedRight: {
111 borderLeft: "1px solid ".concat(theme.palette.divider)
112 },
113
114 /* Styles applied to the `Paper` component if `anchor="bottom"` and `variant` is not "temporary". */
115 paperAnchorDockedBottom: {
116 borderTop: "1px solid ".concat(theme.palette.divider)
117 },
118
119 /* Styles applied to the `Modal` component. */
120 modal: {}
121 };
122};
123
124exports.styles = styles;
125var oppositeDirection = {
126 left: 'right',
127 right: 'left',
128 top: 'down',
129 bottom: 'up'
130};
131
132function isHorizontal(anchor) {
133 return ['left', 'right'].indexOf(anchor) !== -1;
134}
135
136function getAnchor(theme, anchor) {
137 return theme.direction === 'rtl' && isHorizontal(anchor) ? oppositeDirection[anchor] : anchor;
138}
139
140var defaultTransitionDuration = {
141 enter: _transitions.duration.enteringScreen,
142 exit: _transitions.duration.leavingScreen
143};
144/**
145 * The props of the [Modal](/api/modal/) component are available
146 * when `variant="temporary"` is set.
147 */
148
149var Drawer = _react.default.forwardRef(function Drawer(props, ref) {
150 var _props$anchor = props.anchor,
151 anchorProp = _props$anchor === void 0 ? 'left' : _props$anchor,
152 BackdropProps = props.BackdropProps,
153 children = props.children,
154 classes = props.classes,
155 className = props.className,
156 _props$elevation = props.elevation,
157 elevation = _props$elevation === void 0 ? 16 : _props$elevation,
158 _props$ModalProps = props.ModalProps;
159 _props$ModalProps = _props$ModalProps === void 0 ? {} : _props$ModalProps;
160 var BackdropPropsProp = _props$ModalProps.BackdropProps,
161 ModalProps = (0, _objectWithoutProperties2.default)(_props$ModalProps, ["BackdropProps"]),
162 onClose = props.onClose,
163 _props$open = props.open,
164 open = _props$open === void 0 ? false : _props$open,
165 _props$PaperProps = props.PaperProps,
166 PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,
167 SlideProps = props.SlideProps,
168 _props$transitionDura = props.transitionDuration,
169 transitionDuration = _props$transitionDura === void 0 ? defaultTransitionDuration : _props$transitionDura,
170 _props$variant = props.variant,
171 variant = _props$variant === void 0 ? 'temporary' : _props$variant,
172 other = (0, _objectWithoutProperties2.default)(props, ["anchor", "BackdropProps", "children", "classes", "className", "elevation", "ModalProps", "onClose", "open", "PaperProps", "SlideProps", "transitionDuration", "variant"]);
173 var theme = (0, _useTheme.default)(); // Let's assume that the Drawer will always be rendered on user space.
174 // We use this state is order to skip the appear transition during the
175 // initial mount of the component.
176
177 var mounted = _react.default.useRef(false);
178
179 _react.default.useEffect(function () {
180 mounted.current = true;
181 }, []);
182
183 var anchor = getAnchor(theme, anchorProp);
184
185 var drawer = _react.default.createElement(_Paper.default, (0, _extends2.default)({
186 elevation: variant === 'temporary' ? elevation : 0,
187 square: true,
188 className: (0, _clsx.default)(classes.paper, classes["paperAnchor".concat((0, _capitalize.default)(anchor))], PaperProps.className, variant !== 'temporary' && classes["paperAnchorDocked".concat((0, _capitalize.default)(anchor))])
189 }, PaperProps), children);
190
191 if (variant === 'permanent') {
192 return _react.default.createElement("div", (0, _extends2.default)({
193 className: (0, _clsx.default)(classes.root, classes.docked, className),
194 ref: ref
195 }, other), drawer);
196 }
197
198 var slidingDrawer = _react.default.createElement(_Slide.default, (0, _extends2.default)({
199 in: open,
200 direction: oppositeDirection[anchor],
201 timeout: transitionDuration,
202 appear: mounted.current
203 }, SlideProps), drawer);
204
205 if (variant === 'persistent') {
206 return _react.default.createElement("div", (0, _extends2.default)({
207 className: (0, _clsx.default)(classes.root, classes.docked, className),
208 ref: ref
209 }, other), slidingDrawer);
210 } // variant === temporary
211
212
213 return _react.default.createElement(_Modal.default, (0, _extends2.default)({
214 BackdropProps: (0, _extends2.default)({}, BackdropProps, {}, BackdropPropsProp, {
215 transitionDuration: transitionDuration
216 }),
217 BackdropComponent: _Backdrop.default,
218 className: (0, _clsx.default)(classes.root, classes.modal, className),
219 open: open,
220 onClose: onClose,
221 ref: ref
222 }, other, ModalProps), slidingDrawer);
223});
224
225process.env.NODE_ENV !== "production" ? Drawer.propTypes = {
226 /**
227 * Side from which the drawer will appear.
228 */
229 anchor: _propTypes.default.oneOf(['left', 'top', 'right', 'bottom']),
230
231 /**
232 * @ignore
233 */
234 BackdropProps: _propTypes.default.object,
235
236 /**
237 * The contents of the drawer.
238 */
239 children: _propTypes.default.node,
240
241 /**
242 * Override or extend the styles applied to the component.
243 * See [CSS API](#css) below for more details.
244 */
245 classes: _propTypes.default.object.isRequired,
246
247 /**
248 * @ignore
249 */
250 className: _propTypes.default.string,
251
252 /**
253 * The elevation of the drawer.
254 */
255 elevation: _propTypes.default.number,
256
257 /**
258 * Props applied to the [`Modal`](/api/modal/) element.
259 */
260 ModalProps: _propTypes.default.object,
261
262 /**
263 * Callback fired when the component requests to be closed.
264 *
265 * @param {object} event The event source of the callback.
266 */
267 onClose: _propTypes.default.func,
268
269 /**
270 * If `true`, the drawer is open.
271 */
272 open: _propTypes.default.bool,
273
274 /**
275 * Props applied to the [`Paper`](/api/paper/) element.
276 */
277 PaperProps: _propTypes.default.object,
278
279 /**
280 * Props applied to the [`Slide`](/api/slide/) element.
281 */
282 SlideProps: _propTypes.default.object,
283
284 /**
285 * The duration for the transition, in milliseconds.
286 * You may specify a single timeout for all transitions, or individually with an object.
287 */
288 transitionDuration: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
289 enter: _propTypes.default.number,
290 exit: _propTypes.default.number
291 })]),
292
293 /**
294 * The variant to use.
295 */
296 variant: _propTypes.default.oneOf(['permanent', 'persistent', 'temporary'])
297} : void 0;
298
299var _default = (0, _withStyles.default)(styles, {
300 name: 'MuiDrawer',
301 flip: false
302})(Drawer);
303
304exports.default = _default;
\No newline at end of file