diff --git a/src/app/(dashboard)/page.tsx b/src/app/(dashboard)/page.tsx
index 68a9052..024b40a 100644
--- a/src/app/(dashboard)/page.tsx
+++ b/src/app/(dashboard)/page.tsx
@@ -267,7 +267,10 @@ const ProjectDropdown = ({
{project.title}
-
@@ -463,11 +466,7 @@ const ProjectContainer = ({
) : (
-
-
- {projectComponent}
-
-
+ projectComponent
);
};
diff --git a/src/app/globals.css b/src/app/globals.css
index a8697bd..9b8105d 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -73,12 +73,6 @@ main {
height: 100%;
}
-.no-scroll {
- overflow: hidden;
- height: 100%; /* Optional, but often recommended for full-page scroll prevention */
- touch-action: none;
-}
-
.dark body {
background-color: var(--color-background);
}
diff --git a/src/components/swipe-to-delete/SwipeToDelete.tsx b/src/components/swipe-to-delete/SwipeToDelete.tsx
index 9b2717c..8b2673e 100644
--- a/src/components/swipe-to-delete/SwipeToDelete.tsx
+++ b/src/components/swipe-to-delete/SwipeToDelete.tsx
@@ -20,7 +20,7 @@ const SwipeToDelete: FC = ({
deleteText = 'Delete',
fadeOnDeletion = true,
useBoldDeleteFont = true,
- threshold = 70
+ threshold = 75
}) => {
const container = useRef(null);
const content = useRef(null);
@@ -82,17 +82,21 @@ const SwipeToDelete: FC = ({
lastXRef.current = pageX;
lastYRef.current = pageY;
-
const raw = pageX - startX;
let x = dragX < 0 ? rubber(raw) : rubber(raw, width * 0.1);
- if ((Math.abs(dragX) === 0 ? Math.abs(vY) < window.innerHeight * 0.05 : true)) {
+ if ((Math.abs(dragX) === 0 ? Math.abs(vY) < window.innerHeight * 0.05 && Math.abs(vX) > Math.abs(vY) : true)) {
if (x < 0) setAllowOverscroll(true);
- if (x <= 0 || (allowOverscroll && x >= 0)) setDragX(x);
+ if (x <= 0 || (allowOverscroll && x >= 0)) {
+ setDragX(x);
+ document.body.classList.add('no-scroll');
+ }
+
} else {
setDragX(0);
setAllowOverscroll(false);
+ document.body.classList.remove('no-scroll');
}
- if (Math.abs(vY) < 20) document.body.classList.add('no-scroll');
+
};
const handleDelete = () => {
@@ -110,19 +114,16 @@ const SwipeToDelete: FC = ({
if (!dragging) return;
setDragging(false);
- const shouldDelete =
- isSticky ||
- velocity < -1000;
+ const shouldDelete = isSticky || velocity < -1000;
setAllowOverscroll(false);
document.body.classList.remove('no-scroll');
- if (Math.abs(velocityY) > window.innerHeight * 0.05) {
- setDragX(0);
+ if (Math.abs(velocityY) > window.innerHeight * 0.05 && Math.abs(dragX) < 20) {
setDragX(0);
if (transparencyTimeout) {
clearTimeout(transparencyTimeout);
}
setForceTransparentBackground(true);
- transparencyTimeout = setTimeout(() => setForceTransparentBackground(false), 150);
+ transparencyTimeout = setTimeout(() => setForceTransparentBackground(false), 200);
return;
}
if (!shouldDelete) {
@@ -130,14 +131,18 @@ const SwipeToDelete: FC = ({
text.current?.classList.add('ios-ease');
const textWidth = text.current ? text.current.getBoundingClientRect().width : 0;
if (((velocity < 0 && Math.abs(velocity) > 10) || dragX < -textWidth * 1.5 && velocity > 0) && text.current) {
- setDragX(-textWidth * 1.5);
- } else if (allowOverscroll && dragX > 0) {
+ if (velocity < 0) {
+ setDragX(-textWidth * 1.5);
+ } else {
+ setDragX(0);
+ }
+ } else if (allowOverscroll && dragX > 0 && velocity > 0) {
setDragX(0);
if (transparencyTimeout) {
clearTimeout(transparencyTimeout);
}
setForceTransparentBackground(true);
- transparencyTimeout = setTimeout(() => setForceTransparentBackground(false), 150);
+ transparencyTimeout = setTimeout(() => setForceTransparentBackground(false), 200);
} else setDragX(0);
return;
}
@@ -217,7 +222,7 @@ const SwipeToDelete: FC = ({
const deleteTransform = isCollapsing
? `translateX(calc(${dragX}px + 5rem))`
- : (isSticky ? `translateX(calc(${dragX}px + 5rem))` : `translateX(max(0rem, calc(${dragX}px + 5rem)))`);
+ : (isSticky ? `translateX(calc(${dragX}px + 5rem))` : `translateX(max(0rem + ${dragX * 0.07}px, calc(${dragX}px + 5rem)))`);
const opacityTransparent = fadeOnDeletion ? 0 : 1;
const backgroundTransparent = opacityTransparent == 0 ? 'transparent' : backgroundClass;
@@ -255,7 +260,8 @@ const SwipeToDelete: FC = ({
marginTop: '1px',
marginBottom: '1px',
paddingRight: '1rem',
- transition: dragX > 1 ? '' : 'background 300ms'
+ transition: dragX > 1 ? '' : 'background 300ms',
+ willChange: 'background'
}}
>
= ({
color: 'white',
fontWeight: useBoldDeleteFont ? 600 : '',
height: '100%',
- opacity: isCollapsing ? opacityTransparent : 1
+ opacity: isCollapsing ? opacityTransparent : 1,
+ willChange: `transform, opacity`
}} onClick={handleDelete} ref={text}>
{deleteText}
diff --git a/src/components/swipe-to-delete/styles.css b/src/components/swipe-to-delete/styles.css
index 00832f7..948822a 100644
--- a/src/components/swipe-to-delete/styles.css
+++ b/src/components/swipe-to-delete/styles.css
@@ -8,7 +8,10 @@
touch-action: none;
}
-.font-sharpen {
--webkit-transform: translateZ(0);
-transform: translateZ(0);
+.no-scroll {
+ overflow: hidden;
+ height: 100%;
+ /* Optional, but often recommended for full-page scroll prevention */
+ touch-action: none;
+ overscroll-behavior: none;
}
\ No newline at end of file