UNPKG

22.9 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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
14
15var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
16
17var _react = _interopRequireDefault(require("react"));
18
19var _propTypes = _interopRequireDefault(require("prop-types"));
20
21var _reactDom = _interopRequireDefault(require("react-dom"));
22
23var _utils = require("@material-ui/utils");
24
25var _Drawer = _interopRequireWildcard(require("../Drawer/Drawer"));
26
27var _useEventCallback = _interopRequireDefault(require("../utils/useEventCallback"));
28
29var _transitions = require("../styles/transitions");
30
31var _useTheme = _interopRequireDefault(require("../styles/useTheme"));
32
33var _utils2 = require("../transitions/utils");
34
35var _NoSsr = _interopRequireDefault(require("../NoSsr"));
36
37var _SwipeArea = _interopRequireDefault(require("./SwipeArea"));
38
39// This value is closed to what browsers are using internally to
40// trigger a native scroll.
41var UNCERTAINTY_THRESHOLD = 3; // px
42// We can only have one node at the time claiming ownership for handling the swipe.
43// Otherwise, the UX would be confusing.
44// That's why we use a singleton here.
45
46var nodeThatClaimedTheSwipe = null; // Exported for test purposes.
47
48function reset() {
49 nodeThatClaimedTheSwipe = null;
50}
51
52function calculateCurrentX(anchor, touches) {
53 return anchor === 'right' ? document.body.offsetWidth - touches[0].pageX : touches[0].pageX;
54}
55
56function calculateCurrentY(anchor, touches) {
57 return anchor === 'bottom' ? window.innerHeight - touches[0].clientY : touches[0].clientY;
58}
59
60function getMaxTranslate(horizontalSwipe, paperInstance) {
61 return horizontalSwipe ? paperInstance.clientWidth : paperInstance.clientHeight;
62}
63
64function getTranslate(currentTranslate, startLocation, open, maxTranslate) {
65 return Math.min(Math.max(open ? startLocation - currentTranslate : maxTranslate + startLocation - currentTranslate, 0), maxTranslate);
66}
67
68function getDomTreeShapes(element, rootNode) {
69 // Adapted from https://github.com/oliviertassinari/react-swipeable-views/blob/7666de1dba253b896911adf2790ce51467670856/packages/react-swipeable-views/src/SwipeableViews.js#L129
70 var domTreeShapes = [];
71
72 while (element && element !== rootNode) {
73 var style = window.getComputedStyle(element);
74
75 if ( // Ignore the scroll children if the element is absolute positioned.
76 style.getPropertyValue('position') === 'absolute' || // Ignore the scroll children if the element has an overflowX hidden
77 style.getPropertyValue('overflow-x') === 'hidden') {
78 domTreeShapes = [];
79 } else if (element.clientWidth > 0 && element.scrollWidth > element.clientWidth || element.clientHeight > 0 && element.scrollHeight > element.clientHeight) {
80 // Ignore the nodes that have no width.
81 // Keep elements with a scroll
82 domTreeShapes.push(element);
83 }
84
85 element = element.parentElement;
86 }
87
88 return domTreeShapes;
89}
90
91function findNativeHandler(_ref) {
92 var domTreeShapes = _ref.domTreeShapes,
93 start = _ref.start,
94 current = _ref.current,
95 anchor = _ref.anchor;
96 // Adapted from https://github.com/oliviertassinari/react-swipeable-views/blob/7666de1dba253b896911adf2790ce51467670856/packages/react-swipeable-views/src/SwipeableViews.js#L175
97 var axisProperties = {
98 scrollPosition: {
99 x: 'scrollLeft',
100 y: 'scrollTop'
101 },
102 scrollLength: {
103 x: 'scrollWidth',
104 y: 'scrollHeight'
105 },
106 clientLength: {
107 x: 'clientWidth',
108 y: 'clientHeight'
109 }
110 };
111 return domTreeShapes.some(function (shape) {
112 // Determine if we are going backward or forward.
113 var goingForward = current >= start;
114
115 if (anchor === 'top' || anchor === 'left') {
116 goingForward = !goingForward;
117 }
118
119 var axis = anchor === 'left' || anchor === 'right' ? 'x' : 'y';
120 var scrollPosition = shape[axisProperties.scrollPosition[axis]];
121 var areNotAtStart = scrollPosition > 0;
122 var areNotAtEnd = scrollPosition + shape[axisProperties.clientLength[axis]] < shape[axisProperties.scrollLength[axis]];
123
124 if (goingForward && areNotAtEnd || !goingForward && areNotAtStart) {
125 return shape;
126 }
127
128 return null;
129 });
130}
131
132var disableSwipeToOpenDefault = typeof navigator !== 'undefined' && /iPad|iPhone|iPod/.test(navigator.userAgent);
133var transitionDurationDefault = {
134 enter: _transitions.duration.enteringScreen,
135 exit: _transitions.duration.leavingScreen
136};
137var useEnhancedEffect = typeof window !== 'undefined' ? _react.default.useLayoutEffect : _react.default.useEffect;
138
139var SwipeableDrawer = _react.default.forwardRef(function SwipeableDrawer(props, ref) {
140 var _props$anchor = props.anchor,
141 anchor = _props$anchor === void 0 ? 'left' : _props$anchor,
142 _props$disableBackdro = props.disableBackdropTransition,
143 disableBackdropTransition = _props$disableBackdro === void 0 ? false : _props$disableBackdro,
144 _props$disableDiscove = props.disableDiscovery,
145 disableDiscovery = _props$disableDiscove === void 0 ? false : _props$disableDiscove,
146 _props$disableSwipeTo = props.disableSwipeToOpen,
147 disableSwipeToOpen = _props$disableSwipeTo === void 0 ? disableSwipeToOpenDefault : _props$disableSwipeTo,
148 hideBackdrop = props.hideBackdrop,
149 _props$hysteresis = props.hysteresis,
150 hysteresis = _props$hysteresis === void 0 ? 0.52 : _props$hysteresis,
151 _props$minFlingVeloci = props.minFlingVelocity,
152 minFlingVelocity = _props$minFlingVeloci === void 0 ? 450 : _props$minFlingVeloci,
153 _props$ModalProps = props.ModalProps;
154 _props$ModalProps = _props$ModalProps === void 0 ? {} : _props$ModalProps;
155 var BackdropProps = _props$ModalProps.BackdropProps,
156 ModalPropsProp = (0, _objectWithoutProperties2.default)(_props$ModalProps, ["BackdropProps"]),
157 onClose = props.onClose,
158 onOpen = props.onOpen,
159 open = props.open,
160 _props$PaperProps = props.PaperProps,
161 PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,
162 SwipeAreaProps = props.SwipeAreaProps,
163 _props$swipeAreaWidth = props.swipeAreaWidth,
164 swipeAreaWidth = _props$swipeAreaWidth === void 0 ? 20 : _props$swipeAreaWidth,
165 _props$transitionDura = props.transitionDuration,
166 transitionDuration = _props$transitionDura === void 0 ? transitionDurationDefault : _props$transitionDura,
167 _props$variant = props.variant,
168 variant = _props$variant === void 0 ? 'temporary' : _props$variant,
169 other = (0, _objectWithoutProperties2.default)(props, ["anchor", "disableBackdropTransition", "disableDiscovery", "disableSwipeToOpen", "hideBackdrop", "hysteresis", "minFlingVelocity", "ModalProps", "onClose", "onOpen", "open", "PaperProps", "SwipeAreaProps", "swipeAreaWidth", "transitionDuration", "variant"]);
170 var theme = (0, _useTheme.default)();
171
172 var _React$useState = _react.default.useState(false),
173 maybeSwiping = _React$useState[0],
174 setMaybeSwiping = _React$useState[1];
175
176 var swipeInstance = _react.default.useRef({
177 isSwiping: null
178 });
179
180 var swipeAreaRef = _react.default.useRef();
181
182 var backdropRef = _react.default.useRef();
183
184 var paperRef = _react.default.useRef();
185
186 var touchDetected = _react.default.useRef(false); // Ref for transition duration based on / to match swipe speed
187
188
189 var calculatedDurationRef = _react.default.useRef(); // Use a ref so the open value used is always up to date inside useCallback.
190
191
192 useEnhancedEffect(function () {
193 calculatedDurationRef.current = null;
194 }, [open]);
195
196 var setPosition = _react.default.useCallback(function (translate) {
197 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
198 var _options$mode = options.mode,
199 mode = _options$mode === void 0 ? null : _options$mode,
200 _options$changeTransi = options.changeTransition,
201 changeTransition = _options$changeTransi === void 0 ? true : _options$changeTransi;
202 var anchorRtl = (0, _Drawer.getAnchor)(theme, anchor);
203 var rtlTranslateMultiplier = ['right', 'bottom'].indexOf(anchorRtl) !== -1 ? 1 : -1;
204 var horizontalSwipe = (0, _Drawer.isHorizontal)(anchor);
205 var transform = horizontalSwipe ? "translate(".concat(rtlTranslateMultiplier * translate, "px, 0)") : "translate(0, ".concat(rtlTranslateMultiplier * translate, "px)");
206 var drawerStyle = paperRef.current.style;
207 drawerStyle.webkitTransform = transform;
208 drawerStyle.transform = transform;
209 var transition = '';
210
211 if (mode) {
212 transition = theme.transitions.create('all', (0, _utils2.getTransitionProps)({
213 timeout: transitionDuration
214 }, {
215 mode: mode
216 }));
217 }
218
219 if (changeTransition) {
220 drawerStyle.webkitTransition = transition;
221 drawerStyle.transition = transition;
222 }
223
224 if (!disableBackdropTransition && !hideBackdrop) {
225 var backdropStyle = backdropRef.current.style;
226 backdropStyle.opacity = 1 - translate / getMaxTranslate(horizontalSwipe, paperRef.current);
227
228 if (changeTransition) {
229 backdropStyle.webkitTransition = transition;
230 backdropStyle.transition = transition;
231 }
232 }
233 }, [anchor, disableBackdropTransition, hideBackdrop, theme, transitionDuration]);
234
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
463 _react.default.useEffect(function () {
464 if (variant === 'temporary') {
465 document.body.addEventListener('touchstart', handleBodyTouchStart);
466 document.body.addEventListener('touchmove', handleBodyTouchMove, {
467 passive: false
468 });
469 document.body.addEventListener('touchend', handleBodyTouchEnd);
470 return function () {
471 document.body.removeEventListener('touchstart', handleBodyTouchStart);
472 document.body.removeEventListener('touchmove', handleBodyTouchMove, {
473 passive: false
474 });
475 document.body.removeEventListener('touchend', handleBodyTouchEnd);
476 };
477 }
478
479 return undefined;
480 }, [variant, handleBodyTouchStart, handleBodyTouchMove, handleBodyTouchEnd]);
481
482 _react.default.useEffect(function () {
483 return function () {
484 // We need to release the lock.
485 if (nodeThatClaimedTheSwipe === swipeInstance.current) {
486 nodeThatClaimedTheSwipe = null;
487 }
488 };
489 }, []);
490
491 _react.default.useEffect(function () {
492 if (!open) {
493 setMaybeSwiping(false);
494 }
495 }, [open]);
496
497 var handleBackdropRef = _react.default.useCallback(function (instance) {
498 // #StrictMode ready
499 backdropRef.current = _reactDom.default.findDOMNode(instance);
500 }, []);
501
502 var handlePaperRef = _react.default.useCallback(function (instance) {
503 // #StrictMode ready
504 paperRef.current = _reactDom.default.findDOMNode(instance);
505 }, []);
506
507 return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_Drawer.default, (0, _extends2.default)({
508 open: variant === 'temporary' && maybeSwiping ? true : open,
509 variant: variant,
510 ModalProps: (0, _extends2.default)({
511 BackdropProps: (0, _extends2.default)({}, BackdropProps, {
512 ref: handleBackdropRef
513 })
514 }, ModalPropsProp),
515 PaperProps: (0, _extends2.default)({}, PaperProps, {
516 style: (0, _extends2.default)({
517 pointerEvents: variant === 'temporary' && !open ? 'none' : ''
518 }, PaperProps.style),
519 ref: handlePaperRef
520 }),
521 anchor: anchor,
522 transitionDuration: calculatedDurationRef.current || transitionDuration,
523 onClose: onClose,
524 ref: ref
525 }, other)), !disableSwipeToOpen && variant === 'temporary' && _react.default.createElement(_NoSsr.default, null, _react.default.createElement(_SwipeArea.default, (0, _extends2.default)({
526 anchor: anchor,
527 ref: swipeAreaRef,
528 width: swipeAreaWidth
529 }, SwipeAreaProps))));
530});
531
532process.env.NODE_ENV !== "production" ? SwipeableDrawer.propTypes = {
533 /**
534 * @ignore
535 */
536 anchor: _propTypes.default.oneOf(['left', 'top', 'right', 'bottom']),
537
538 /**
539 * The content of the component.
540 */
541 children: _propTypes.default.node,
542
543 /**
544 * Disable the backdrop transition.
545 * This can improve the FPS on low-end devices.
546 */
547 disableBackdropTransition: _propTypes.default.bool,
548
549 /**
550 * If `true`, touching the screen near the edge of the drawer will not slide in the drawer a bit
551 * to promote accidental discovery of the swipe gesture.
552 */
553 disableDiscovery: _propTypes.default.bool,
554
555 /**
556 * If `true`, swipe to open is disabled. This is useful in browsers where swiping triggers
557 * navigation actions. Swipe to open is disabled on iOS browsers by default.
558 */
559 disableSwipeToOpen: _propTypes.default.bool,
560
561 /**
562 * @ignore
563 */
564 hideBackdrop: _propTypes.default.bool,
565
566 /**
567 * Affects how far the drawer must be opened/closed to change his state.
568 * Specified as percent (0-1) of the width of the drawer
569 */
570 hysteresis: _propTypes.default.number,
571
572 /**
573 * Defines, from which (average) velocity on, the swipe is
574 * defined as complete although hysteresis isn't reached.
575 * Good threshold is between 250 - 1000 px/s
576 */
577 minFlingVelocity: _propTypes.default.number,
578
579 /**
580 * @ignore
581 */
582 ModalProps: _propTypes.default.shape({
583 BackdropProps: _propTypes.default.shape({
584 component: _utils.elementTypeAcceptingRef
585 })
586 }),
587
588 /**
589 * Callback fired when the component requests to be closed.
590 *
591 * @param {object} event The event source of the callback.
592 */
593 onClose: _propTypes.default.func.isRequired,
594
595 /**
596 * Callback fired when the component requests to be opened.
597 *
598 * @param {object} event The event source of the callback.
599 */
600 onOpen: _propTypes.default.func.isRequired,
601
602 /**
603 * If `true`, the drawer is open.
604 */
605 open: _propTypes.default.bool.isRequired,
606
607 /**
608 * @ignore
609 */
610 PaperProps: _propTypes.default.shape({
611 component: _utils.elementTypeAcceptingRef,
612 style: _propTypes.default.object
613 }),
614
615 /**
616 * Props applied to the swipe area element.
617 */
618 SwipeAreaProps: _propTypes.default.object,
619
620 /**
621 * The width of the left most (or right most) area in pixels where the
622 * drawer can be swiped open from.
623 */
624 swipeAreaWidth: _propTypes.default.number,
625
626 /**
627 * The duration for the transition, in milliseconds.
628 * You may specify a single timeout for all transitions, or individually with an object.
629 */
630 transitionDuration: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
631 enter: _propTypes.default.number,
632 exit: _propTypes.default.number
633 })]),
634
635 /**
636 * @ignore
637 */
638 variant: _propTypes.default.oneOf(['permanent', 'persistent', 'temporary'])
639} : void 0;
640var _default = SwipeableDrawer;
641exports.default = _default;
\No newline at end of file