diff --git a/components/Menu.jsx b/components/Menu.jsx
index 184ab92..4ce89a0 100644
--- a/components/Menu.jsx
+++ b/components/Menu.jsx
@@ -1,29 +1,62 @@
import classNames from 'classnames';
+import { useEffect, useLayoutEffect, useRef, useState } from 'react';
-const Menu = ({ open, onClose }) => (
-
{
+ const ref = useRef();
+ const [x, setX] = useState(-100000);
+ const [rect, setRect] = useState(null);
+
+ useLayoutEffect(() => {
+ const rect = ref.current?.getBoundingClientRect();
+ setRect(rect);
+ setX(-rect.width);
+ }, []);
+
+ useLayoutEffect(() => {
+ if (open) {
+ setX(0);
+ } else if (rect) {
+ setX(-rect.width);
+ }
+ }, [rect, open]);
+
+ const bind = useDrag(({ down, movement: [mx, my] }) => {
+ setX(mx > 0 ? 0 : mx);
+
+ // If the drag ended, snap the menu back
+ if (!down) {
+ const mid = -rect.width;
+ if (x < mid / 2) {
+ // Close
+ setX(-rect.width);
+ onClose();
+ } else {
+ // Re-open
+ setX(0);
}
- )}
- >
-
-
Menu
+ }
+ });
+
+ return (
+
+ {children}
-
-
-);
+ );
+};
export default Menu;
diff --git a/package-lock.json b/package-lock.json
index 3530f74..fecdda1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4322,6 +4322,12 @@
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz",
"integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg=="
},
+ "react-use-gesture": {
+ "version": "9.0.0-beta.11",
+ "resolved": "https://registry.npmjs.org/react-use-gesture/-/react-use-gesture-9.0.0-beta.11.tgz",
+ "integrity": "sha512-lpn39vmrDu/zB2bNx7rjaL0+Gjm17a9mzn53bX9IP4TIjMUxXlsB0IkiFj/B23F0vq1A9ozDLGHl2OaXkKJcBg==",
+ "dev": true
+ },
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
diff --git a/package.json b/package.json
index 803175a..08869f7 100644
--- a/package.json
+++ b/package.json
@@ -21,6 +21,7 @@
"tailwindcss": "^2.0.2"
},
"devDependencies": {
- "prettier": "^2.2.1"
+ "prettier": "^2.2.1",
+ "react-use-gesture": "^9.0.0-beta.11"
}
}
diff --git a/pages/index.js b/pages/index.js
index 2968c17..529de27 100644
--- a/pages/index.js
+++ b/pages/index.js
@@ -39,6 +39,24 @@ const CurrentPage = ({ page }) => {
);
};
+const MenuContent = () => (
+ <>
+
+
Menu
+
+
+ >
+);
+
export default function Index() {
const [page, setPage] = useState(pages[0]);
@@ -50,7 +68,9 @@ export default function Index() {
return (
-