UNPKG

22.8 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
7Object.defineProperty(exports, "__esModule", {
8 value: true
9});
10exports.reset = reset;
11exports.default = void 0;
12
13var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
14
15var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
16
17var React = _interopRequireWildcard(require("react"));
18
19var _propTypes = _interopRequireDefault(require("prop-types"));
20
21var ReactDOM = _interopRequireWildcard(require("react-dom"));
22
23var _utils = require("@material-ui/utils");
24
25var _styles = require("@material-ui/styles");
26
27var _Drawer = _interopRequireWildcard(require("../Drawer/Drawer"));
28
29var _ownerDocument = _interopRequireDefault(require("../utils/ownerDocument"));
30
31var _useEventCallback = _interopRequireDefault(require("../utils/useEventCallback"));
32
33var _transitions = require("../styles/transitions");
34
35var _useTheme = _interopRequireDefault(require("../styles/useTheme"));
36
37var _utils2 = require("../transitions/utils");
38
39var _NoSsr = _interopRequireDefault(require("../NoSsr"));
40
41var _SwipeArea = _interopRequireDefault(require("./SwipeArea"));
42
43// This value is closed to what browsers are using internally to
44// trigger a native scroll.
45var UNCERTAINTY_THRESHOLD = 3; // px
46// We can only have one node at the time claiming ownership for handling the swipe.
47// Otherwise, the UX would be confusing.
48// That's why we use a singleton here.
49
50var nodeThatClaimedTheSwipe = null; // Exported for test purposes.
51
52function reset() {
53 nodeThatClaimedTheSwipe = null;
54}
55
56function calculateCurrentX(anchor, touches) {
57 return anchor === 'right' ? document.body.offsetWidth - touches[0].pageX : touches[0].pageX;
58}
59
60function calculateCurrentY(anchor, touches) {
61 return anchor === 'bottom' ? window.innerHeight - touches[0].clientY : touches[0].clientY;
62}
63
64function getMaxTranslate(horizontalSwipe, paperInstance) {
65 return horizontalSwipe ? paperInstance.clientWidth : paperInstance.clientHeight;
66}
67
68function getTranslate(currentTranslate, startLocation, open, maxTranslate) {
69 return Math.min(Math.max(open ? startLocation - currentTranslate : maxTranslate + startLocation - currentTranslate, 0), maxTranslate);
70}
71
72function getDomTreeShapes(element, rootNode) {
73 // Adapted from https://github.com/oliviertassinari/react-swipeable-views/blob/7666de1dba253b896911adf2790ce51467670856/packages/react-swipeable-views/src/SwipeableViews.js#L129
74 var domTreeShapes = [];
75
76 while (element && element !== rootNode) {
77 var style = window.getComputedStyle(element);
78
79 if ( // Ignore the scroll children if the element is absolute positioned.
80 style.getPropertyValue('position') === 'absolute' || // Ignore the scroll children if the element has an overflowX hidden
81 style.getPropertyValue('overflow-x') === 'hidden') {
82 domTreeShapes = [];
83 } else if (element.clientWidth > 0 && element.scrollWidth > element.clientWidth || element.clientHeight > 0 && element.scrollHeight > element.clientHeight) {
84 // Ignore the nodes that have no width.
85 // Keep elements with a scroll
86 domTreeShapes.push(element);
87 }
88
89 element = element.parentElement;
90 }
91
92 return domTreeShapes;
93}
94
95function findNativeHandler(_ref) {
96 var domTreeShapes = _ref.domTreeShapes,
97 start = _ref.start,
98 current = _ref.current,
99 anchor = _ref.anchor;
100 // Adapted from https://github.com/oliviertassinari/react-swipeable-views/blob/7666de1dba253b896911adf2790ce51467670856/packages/react-swipeable-views/src/SwipeableViews.js#L175
101 var axisProperties = {
102 scrollPosition: {
103 x: 'scrollLeft',
104 y: 'scrollTop'
105 },
106 scrollLength: {
107 x: 'scrollWidth',
108 y: 'scrollHeight'
109 },
110 clientLength: {
111 x: 'clientWidth',
112 y: 'clientHeight'
113 }
114 };
115 return domTreeShapes.some(function (shape) {
116 // Determine if we are going backward or forward.
117 var goingForward = current >= start;
118
119 if (anchor === 'top' || anchor === 'left') {
120 goingForward = !goingForward;
121 }
122
123 var axis = anchor === 'left' || anchor === 'right' ? 'x' : 'y';
124 var scrollPosition = shape[axisProperties.scrollPosition[axis]];
125 var areNotAtStart = scrollPosition > 0;
126 var areNotAtEnd = scrollPosition + shape[axisProperties.clientLength[axis]] < shape[axisProperties.scrollLength[axis]];
127
128 if (goingForward && areNotAtEnd || !goingForward && areNotAtStart) {
129 return shape;
130 }
131
132 return null;
133 });
134}
135
136var iOS = typeof navigator !== 'undefined' && /iPad|iPhone|iPod/.test(navigator.userAgent);
137var transitionDurationDefault = {
138 enter: _transitions.duration.enteringScreen,
139 exit: _transitions.duration.leavingScreen
140};
141var useEnhancedEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
142var SwipeableDrawer = /*#__PURE__*/React.forwardRef(function SwipeableDrawer(inProps, ref) {
143 var theme = (0, _useTheme.default)();
144 var props = (0, _styles.getThemeProps)({
145 name: 'MuiSwipeableDrawer',
146 props: (0, _extends2.default)({}, inProps),
147 theme: theme
148 });
149 var _props$anchor = props.anchor,
150 anchor = _props$anchor === void 0 ? 'left' : _props$anchor,
151 _props$disableBackdro = props.disableBackdropTransition,
152 disableBackdropTransition = _props$disableBackdro === void 0 ? false : _props$disableBackdro,
153 _props$disableDiscove = props.disableDiscovery,
154 disableDiscovery = _props$disableDiscove === void 0 ? false : _props$disableDiscove,
155 _props$disableSwipeTo = props.disableSwipeToOpen,
156 disableSwipeToOpen = _props$disableSwipeTo === void 0 ? iOS : _props$disableSwipeTo,
157 hideBackdrop = props.hideBackdrop,
158 _props$hysteresis = props.hysteresis,
159 hysteresis = _props$hysteresis === void 0 ? 0.52 : _props$hysteresis,
160 _props$minFlingVeloci = props.minFlingVelocity,
161 minFlingVelocity = _props$minFlingVeloci === void 0 ? 450 : _props$minFlingVeloci,
162 _props$ModalProps = props.ModalProps;
163 _props$ModalProps = _props$ModalProps === void 0 ? {} : _props$ModalProps;
164 var BackdropProps = _props$ModalProps.BackdropProps,
165 ModalPropsProp = (0, _objectWithoutProperties2.default)(_props$ModalProps, ["BackdropProps"]),
166 onClose = props.onClose,
167 onOpen = props.onOpen,
168 open = props.open,
169 _props$PaperProps = props.PaperProps,
170 PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,
171 SwipeAreaProps = props.SwipeAreaProps,
172 _props$swipeAreaWidth = props.swipeAreaWidth,
173 swipeAreaWidth = _props$swipeAreaWidth === void 0 ? 20 : _props$swipeAreaWidth,
174 _props$transitionDura = props.transitionDuration,
175 transitionDuration = _props$transitionDura === void 0 ? transitionDurationDefault : _props$transitionDura,
176 _props$variant = props.variant,
177 variant = _props$variant === void 0 ? 'temporary' : _props$variant,
178 other = (0, _objectWithoutProperties2.default)(props, ["anchor", "disableBackdropTransition", "disableDiscovery", "disableSwipeToOpen", "hideBackdrop", "hysteresis", "minFlingVelocity", "ModalProps", "onClose", "onOpen", "open", "PaperProps", "SwipeAreaProps", "swipeAreaWidth", "transitionDuration", "variant"]);
179
180 var _React$useState = React.useState(false),
181 maybeSwiping = _React$useState[0],
182 setMaybeSwiping = _React$useState[1];
183
184 var swipeInstance = React.useRef({
185 isSwiping: null
186 });
187 var swipeAreaRef = React.useRef();
188 var backdropRef = React.useRef();
189 var paperRef = React.useRef();
190 var touchDetected = React.useRef(false); // Ref for transition duration based on / to match swipe speed
191
192 var calculatedDurationRef = React.useRef(); // Use a ref so the open value used is always up to date inside useCallback.
193
194 useEnhancedEffect(function () {
195 calculatedDurationRef.current = null;
196 }, [open]);
197 var setPosition = React.useCallback(function (translate) {
198 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
199 var _options$mode = options.mode,
200 mode = _options$mode === void 0 ? null : _options$mode,
201 _options$changeTransi = options.changeTransition,
202 changeTransition = _options$changeTransi === void 0 ? true : _options$changeTransi;
203 var anchorRtl = (0, _Drawer.getAnchor)(theme, anchor);
204 var rtlTranslateMultiplier = ['right', 'bottom'].indexOf(anchorRtl) !== -1 ? 1 : -1;
205 var horizontalSwipe = (0, _Drawer.isHorizontal)(anchor);
206 var transform = horizontalSwipe ? "translate(".concat(rtlTranslateMultiplier * translate, "px, 0)") : "translate(0, ".concat(rtlTranslateMultiplier * translate, "px)");
207 var drawerStyle = paperRef.current.style;
208 drawerStyle.webkitTransform = transform;
209 drawerStyle.transform = transform;
210 var transition = '';
211
212 if (mode) {
213 transition = theme.transitions.create('all', (0, _utils2.getTransitionProps)({
214 timeout: transitionDuration
215 }, {
216 mode: mode
217 }));
218 }
219
220 if (changeTransition) {
221 drawerStyle.webkitTransition = transition;
222 drawerStyle.transition = transition;
223 }
224
225 if (!disableBackdropTransition && !hideBackdrop) {
226 var backdropStyle = backdropRef.current.style;
227 backdropStyle.opacity = 1 - translate / getMaxTranslate(horizontalSwipe, paperRef.current);
228
229 if (changeTransition) {
230 backdropStyle.webkitTransition = transition;
231 backdropStyle.transition = transition;
232 }
233 }
234 }, [anchor, disableBackdropTransition, hideBackdrop, theme, transitionDuration]);
235 var handleBodyTouchEnd = (0, _useEventCallback.default)(function (event) {
236 if (!touchDetected.current) {
237 return;
238 }
239
240 nodeThatClaimedTheSwipe = null;
241 touchDetected.current = false;
242 setMaybeSwiping(false); // The swipe wasn't started.
243
244 if (!swipeInstance.current.isSwiping) {
245 swipeInstance.current.isSwiping = null;
246 return;
247 }
248
249 swipeInstance.current.isSwiping = null;
250 var anchorRtl = (0, _Drawer.getAnchor)(theme, anchor);
251 var horizontal = (0, _Drawer.isHorizontal)(anchor);
252 var current;
253
254 if (horizontal) {
255 current = calculateCurrentX(anchorRtl, event.changedTouches);
256 } else {
257 current = calculateCurrentY(anchorRtl, event.changedTouches);
258 }
259
260 var startLocation = horizontal ? swipeInstance.current.startX : swipeInstance.current.startY;
261 var maxTranslate = getMaxTranslate(horizontal, paperRef.current);
262 var currentTranslate = getTranslate(current, startLocation, open, maxTranslate);
263 var translateRatio = currentTranslate / maxTranslate;
264
265 if (Math.abs(swipeInstance.current.velocity) > minFlingVelocity) {
266 // Calculate transition duration to match swipe speed
267 calculatedDurationRef.current = Math.abs((maxTranslate - currentTranslate) / swipeInstance.current.velocity) * 1000;
268 }
269
270 if (open) {
271 if (swipeInstance.current.velocity > minFlingVelocity || translateRatio > hysteresis) {
272 onClose();
273 } else {
274 // Reset the position, the swipe was aborted.
275 setPosition(0, {
276 mode: 'exit'
277 });
278 }
279
280 return;
281 }
282
283 if (swipeInstance.current.velocity < -minFlingVelocity || 1 - translateRatio > hysteresis) {
284 onOpen();
285 } else {
286 // Reset the position, the swipe was aborted.
287 setPosition(getMaxTranslate(horizontal, paperRef.current), {
288 mode: 'enter'
289 });
290 }
291 });
292 var handleBodyTouchMove = (0, _useEventCallback.default)(function (event) {
293 // the ref may be null when a parent component updates while swiping
294 if (!paperRef.current || !touchDetected.current) {
295 return;
296 } // We are not supposed to handle this touch move because the swipe was started in a scrollable container in the drawer
297
298
299 if (nodeThatClaimedTheSwipe != null && nodeThatClaimedTheSwipe !== swipeInstance.current) {
300 return;
301 }
302
303 var anchorRtl = (0, _Drawer.getAnchor)(theme, anchor);
304 var horizontalSwipe = (0, _Drawer.isHorizontal)(anchor);
305 var currentX = calculateCurrentX(anchorRtl, event.touches);
306 var currentY = calculateCurrentY(anchorRtl, event.touches);
307
308 if (open && paperRef.current.contains(event.target) && nodeThatClaimedTheSwipe == null) {
309 var domTreeShapes = getDomTreeShapes(event.target, paperRef.current);
310 var nativeHandler = findNativeHandler({
311 domTreeShapes: domTreeShapes,
312 start: horizontalSwipe ? swipeInstance.current.startX : swipeInstance.current.startY,
313 current: horizontalSwipe ? currentX : currentY,
314 anchor: anchor
315 });
316
317 if (nativeHandler) {
318 nodeThatClaimedTheSwipe = nativeHandler;
319 return;
320 }
321
322 nodeThatClaimedTheSwipe = swipeInstance.current;
323 } // We don't know yet.
324
325
326 if (swipeInstance.current.isSwiping == null) {
327 var dx = Math.abs(currentX - swipeInstance.current.startX);
328 var dy = Math.abs(currentY - swipeInstance.current.startY); // We are likely to be swiping, let's prevent the scroll event on iOS.
329
330 if (dx > dy) {
331 if (event.cancelable) {
332 event.preventDefault();
333 }
334 }
335
336 var definitelySwiping = horizontalSwipe ? dx > dy && dx > UNCERTAINTY_THRESHOLD : dy > dx && dy > UNCERTAINTY_THRESHOLD;
337
338 if (definitelySwiping === true || (horizontalSwipe ? dy > UNCERTAINTY_THRESHOLD : dx > UNCERTAINTY_THRESHOLD)) {
339 swipeInstance.current.isSwiping = definitelySwiping;
340
341 if (!definitelySwiping) {
342 handleBodyTouchEnd(event);
343 return;
344 } // Shift the starting point.
345
346
347 swipeInstance.current.startX = currentX;
348 swipeInstance.current.startY = currentY; // Compensate for the part of the drawer displayed on touch start.
349
350 if (!disableDiscovery && !open) {
351 if (horizontalSwipe) {
352 swipeInstance.current.startX -= swipeAreaWidth;
353 } else {
354 swipeInstance.current.startY -= swipeAreaWidth;
355 }
356 }
357 }
358 }
359
360 if (!swipeInstance.current.isSwiping) {
361 return;
362 }
363
364 var maxTranslate = getMaxTranslate(horizontalSwipe, paperRef.current);
365 var startLocation = horizontalSwipe ? swipeInstance.current.startX : swipeInstance.current.startY;
366
367 if (open && !swipeInstance.current.paperHit) {
368 startLocation = Math.min(startLocation, maxTranslate);
369 }
370
371 var translate = getTranslate(horizontalSwipe ? currentX : currentY, startLocation, open, maxTranslate);
372
373 if (open) {
374 if (!swipeInstance.current.paperHit) {
375 var paperHit = horizontalSwipe ? currentX < maxTranslate : currentY < maxTranslate;
376
377 if (paperHit) {
378 swipeInstance.current.paperHit = true;
379 swipeInstance.current.startX = currentX;
380 swipeInstance.current.startY = currentY;
381 } else {
382 return;
383 }
384 } else if (translate === 0) {
385 swipeInstance.current.startX = currentX;
386 swipeInstance.current.startY = currentY;
387 }
388 }
389
390 if (swipeInstance.current.lastTranslate === null) {
391 swipeInstance.current.lastTranslate = translate;
392 swipeInstance.current.lastTime = performance.now() + 1;
393 }
394
395 var velocity = (translate - swipeInstance.current.lastTranslate) / (performance.now() - swipeInstance.current.lastTime) * 1e3; // Low Pass filter.
396
397 swipeInstance.current.velocity = swipeInstance.current.velocity * 0.4 + velocity * 0.6;
398 swipeInstance.current.lastTranslate = translate;
399 swipeInstance.current.lastTime = performance.now(); // We are swiping, let's prevent the scroll event on iOS.
400
401 if (event.cancelable) {
402 event.preventDefault();
403 }
404
405 setPosition(translate);
406 });
407 var handleBodyTouchStart = (0, _useEventCallback.default)(function (event) {
408 // We are not supposed to handle this touch move.
409 // Example of use case: ignore the event if there is a Slider.
410 if (event.defaultPrevented) {
411 return;
412 } // We can only have one node at the time claiming ownership for handling the swipe.
413
414
415 if (event.muiHandled) {
416 return;
417 } // At least one element clogs the drawer interaction zone.
418
419
420 if (open && !backdropRef.current.contains(event.target) && !paperRef.current.contains(event.target)) {
421 return;
422 }
423
424 var anchorRtl = (0, _Drawer.getAnchor)(theme, anchor);
425 var horizontalSwipe = (0, _Drawer.isHorizontal)(anchor);
426 var currentX = calculateCurrentX(anchorRtl, event.touches);
427 var currentY = calculateCurrentY(anchorRtl, event.touches);
428
429 if (!open) {
430 if (disableSwipeToOpen || event.target !== swipeAreaRef.current) {
431 return;
432 }
433
434 if (horizontalSwipe) {
435 if (currentX > swipeAreaWidth) {
436 return;
437 }
438 } else if (currentY > swipeAreaWidth) {
439 return;
440 }
441 }
442
443 event.muiHandled = true;
444 nodeThatClaimedTheSwipe = null;
445 swipeInstance.current.startX = currentX;
446 swipeInstance.current.startY = currentY;
447 setMaybeSwiping(true);
448
449 if (!open && paperRef.current) {
450 // The ref may be null when a parent component updates while swiping.
451 setPosition(getMaxTranslate(horizontalSwipe, paperRef.current) + (disableDiscovery ? 20 : -swipeAreaWidth), {
452 changeTransition: false
453 });
454 }
455
456 swipeInstance.current.velocity = 0;
457 swipeInstance.current.lastTime = null;
458 swipeInstance.current.lastTranslate = null;
459 swipeInstance.current.paperHit = false;
460 touchDetected.current = true;
461 });
462 React.useEffect(function () {
463 if (variant === 'temporary') {
464 var doc = (0, _ownerDocument.default)(paperRef.current);
465 doc.addEventListener('touchstart', handleBodyTouchStart);
466 doc.addEventListener('touchmove', handleBodyTouchMove, {
467 passive: false
468 });
469 doc.addEventListener('touchend', handleBodyTouchEnd);
470 return function () {
471 doc.removeEventListener('touchstart', handleBodyTouchStart);
472 doc.removeEventListener('touchmove', handleBodyTouchMove, {
473 passive: false
474 });
475 doc.removeEventListener('touchend', handleBodyTouchEnd);
476 };
477 }
478
479 return undefined;
480 }, [variant, handleBodyTouchStart, handleBodyTouchMove, handleBodyTouchEnd]);
481 React.useEffect(function () {
482 return function () {
483 // We need to release the lock.
484 if (nodeThatClaimedTheSwipe === swipeInstance.current) {
485 nodeThatClaimedTheSwipe = null;
486 }
487 };
488 }, []);
489 React.useEffect(function () {
490 if (!open) {
491 setMaybeSwiping(false);
492 }
493 }, [open]);
494 var handleBackdropRef = React.useCallback(function (instance) {
495 // #StrictMode ready
496 backdropRef.current = ReactDOM.findDOMNode(instance);
497 }, []);
498 return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_Drawer.default, (0, _extends2.default)({
499 open: variant === 'temporary' && maybeSwiping ? true : open,
500 variant: variant,
501 ModalProps: (0, _extends2.default)({
502 BackdropProps: (0, _extends2.default)({}, BackdropProps, {
503 ref: handleBackdropRef
504 })
505 }, ModalPropsProp),
506 PaperProps: (0, _extends2.default)({}, PaperProps, {
507 style: (0, _extends2.default)({
508 pointerEvents: variant === 'temporary' && !open ? 'none' : ''
509 }, PaperProps.style),
510 ref: paperRef
511 }),
512 anchor: anchor,
513 transitionDuration: calculatedDurationRef.current || transitionDuration,
514 onClose: onClose,
515 ref: ref
516 }, other)), !disableSwipeToOpen && variant === 'temporary' && /*#__PURE__*/React.createElement(_NoSsr.default, null, /*#__PURE__*/React.createElement(_SwipeArea.default, (0, _extends2.default)({
517 anchor: anchor,
518 ref: swipeAreaRef,
519 width: swipeAreaWidth
520 }, SwipeAreaProps))));
521});
522process.env.NODE_ENV !== "production" ? SwipeableDrawer.propTypes = {
523 /**
524 * @ignore
525 */
526 anchor: _propTypes.default.oneOf(['left', 'top', 'right', 'bottom']),
527
528 /**
529 * The content of the component.
530 */
531 children: _propTypes.default.node,
532
533 /**
534 * Disable the backdrop transition.
535 * This can improve the FPS on low-end devices.
536 */
537 disableBackdropTransition: _propTypes.default.bool,
538
539 /**
540 * If `true`, touching the screen near the edge of the drawer will not slide in the drawer a bit
541 * to promote accidental discovery of the swipe gesture.
542 */
543 disableDiscovery: _propTypes.default.bool,
544
545 /**
546 * If `true`, swipe to open is disabled. This is useful in browsers where swiping triggers
547 * navigation actions. Swipe to open is disabled on iOS browsers by default.
548 */
549 disableSwipeToOpen: _propTypes.default.bool,
550
551 /**
552 * @ignore
553 */
554 hideBackdrop: _propTypes.default.bool,
555
556 /**
557 * Affects how far the drawer must be opened/closed to change his state.
558 * Specified as percent (0-1) of the width of the drawer
559 */
560 hysteresis: _propTypes.default.number,
561
562 /**
563 * Defines, from which (average) velocity on, the swipe is
564 * defined as complete although hysteresis isn't reached.
565 * Good threshold is between 250 - 1000 px/s
566 */
567 minFlingVelocity: _propTypes.default.number,
568
569 /**
570 * @ignore
571 */
572 ModalProps: _propTypes.default.shape({
573 BackdropProps: _propTypes.default.shape({
574 component: _utils.elementTypeAcceptingRef
575 })
576 }),
577
578 /**
579 * Callback fired when the component requests to be closed.
580 *
581 * @param {object} event The event source of the callback.
582 */
583 onClose: _propTypes.default.func.isRequired,
584
585 /**
586 * Callback fired when the component requests to be opened.
587 *
588 * @param {object} event The event source of the callback.
589 */
590 onOpen: _propTypes.default.func.isRequired,
591
592 /**
593 * If `true`, the drawer is open.
594 */
595 open: _propTypes.default.bool.isRequired,
596
597 /**
598 * @ignore
599 */
600 PaperProps: _propTypes.default.shape({
601 component: _utils.elementTypeAcceptingRef,
602 style: _propTypes.default.object
603 }),
604
605 /**
606 * The element is used to intercept the touch events on the edge.
607 */
608 SwipeAreaProps: _propTypes.default.object,
609
610 /**
611 * The width of the left most (or right most) area in pixels where the
612 * drawer can be swiped open from.
613 */
614 swipeAreaWidth: _propTypes.default.number,
615
616 /**
617 * The duration for the transition, in milliseconds.
618 * You may specify a single timeout for all transitions, or individually with an object.
619 */
620 transitionDuration: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
621 enter: _propTypes.default.number,
622 exit: _propTypes.default.number
623 })]),
624
625 /**
626 * @ignore
627 */
628 variant: _propTypes.default.oneOf(['permanent', 'persistent', 'temporary'])
629} : void 0;
630var _default = SwipeableDrawer;
631exports.default = _default;
\No newline at end of file