-
-
Notifications
You must be signed in to change notification settings - Fork 95
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: “SrisharanVS” <“[email protected]”>
- Loading branch information
1 parent
da0905a
commit 24d06d2
Showing
7 changed files
with
356 additions
and
313 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
"use client"; | ||
|
||
import { useSelector } from "react-redux"; | ||
import { useEffect, useRef } from "react"; | ||
import { RootState } from "@/redux/store"; | ||
|
||
const CursorTrail = () => { | ||
const trailPositions = useSelector((state: RootState) => state.cursor.trailPositions); | ||
const restPosition = useSelector((state: RootState) => state.cursor.position); // Last cursor position | ||
const trailRef = useRef<HTMLDivElement[]>([]); // Refs for trail elements | ||
const animationFrameRef = useRef<number | null>(null); | ||
|
||
useEffect(() => { | ||
const lerp = (start: number, end: number, factor: number) => { | ||
return start + (end - start) * factor; | ||
}; | ||
|
||
const animateTrail = () => { | ||
if (trailRef.current) { | ||
trailRef.current.forEach((el, index) => { | ||
if (el) { | ||
// Current element position | ||
const currentX = parseFloat(el.style.left || "0"); | ||
const currentY = parseFloat(el.style.top || "0"); | ||
|
||
// Target position: Interpolate toward trail position or rest position | ||
const targetX = index < trailPositions.length ? trailPositions[index].x : restPosition.x; | ||
const targetY = index < trailPositions.length ? trailPositions[index].y : restPosition.y; | ||
|
||
// Smoothly move toward the target position | ||
const newX = lerp(currentX, targetX, 0.2); // Adjust 0.2 for faster catch-up | ||
const newY = lerp(currentY, targetY, 0.2); | ||
|
||
// Update element position | ||
el.style.left = `${newX}px`; | ||
el.style.top = `${newY}px`; | ||
} | ||
}); | ||
} | ||
|
||
animationFrameRef.current = requestAnimationFrame(animateTrail); | ||
}; | ||
|
||
animationFrameRef.current = requestAnimationFrame(animateTrail); | ||
|
||
return () => { | ||
if (animationFrameRef.current) { | ||
cancelAnimationFrame(animationFrameRef.current); | ||
} | ||
}; | ||
}, [trailPositions, restPosition]); | ||
|
||
return ( | ||
<> | ||
{Array(10) | ||
.fill(0) | ||
.map((_, index) => ( | ||
<div | ||
key={index} | ||
ref={(el) => { | ||
if (el) trailRef.current[index] = el; | ||
}} | ||
style={{ | ||
position: "fixed", | ||
left: `0px`, // Initial position | ||
top: `0px`, | ||
width: `${15 - index}px`, // Increase size here | ||
height: `${15 - index}px`, // Increase size here | ||
backgroundColor: `rgba(255, 0, 0, ${0.5 - index * 0.05})`, // Fade with index | ||
borderRadius: "50%", | ||
pointerEvents: "none", | ||
transform: "translate(-50%, -50%)", | ||
}} | ||
/> | ||
))} | ||
</> | ||
); | ||
}; | ||
|
||
export default CursorTrail; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
"use client"; | ||
|
||
import { useEffect } from "react"; | ||
import { useDispatch } from "react-redux"; | ||
import { AppDispatch } from "@/redux/store"; | ||
import { updateCursorPosition } from "@/redux/reducers/cursorReducer"; | ||
|
||
const CursorTrailHandler = () => { | ||
const dispatch = useDispatch<AppDispatch>(); | ||
|
||
useEffect(() => { | ||
const handleMouseMove = (event: MouseEvent) => { | ||
dispatch(updateCursorPosition({ x: event.clientX, y: event.clientY })); | ||
}; | ||
|
||
window.addEventListener("mousemove", handleMouseMove); | ||
|
||
return () => { | ||
window.removeEventListener("mousemove", handleMouseMove); | ||
}; | ||
}, [dispatch]); | ||
|
||
return null; | ||
}; | ||
|
||
export default CursorTrailHandler; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; | ||
import PageLoader from "next/dist/client/page-loader"; | ||
|
||
interface Position { | ||
x: number; | ||
y: number; | ||
} | ||
|
||
interface CursorState { | ||
position: Position; | ||
trailPositions: Position[]; | ||
trailLength: number; | ||
} | ||
|
||
const initialState: CursorState = { | ||
position: {x:0, y:0}, | ||
trailPositions: [], | ||
trailLength:20, | ||
} | ||
|
||
const cursorSlice = createSlice({ | ||
name: "cursor", | ||
initialState, | ||
reducers: { | ||
updateCursorPosition(state, action: PayloadAction<Position>) { | ||
state.position = action.payload; | ||
state.trailPositions.push(action.payload); | ||
if(state.trailPositions.length > state.trailLength) | ||
{ | ||
state.trailPositions.shift(); | ||
} | ||
}, | ||
setTrailLength(state, action:PayloadAction<number>) | ||
{ | ||
state.trailLength = action.payload; | ||
}, | ||
}, | ||
}); | ||
|
||
export const { updateCursorPosition, setTrailLength } = cursorSlice.actions; | ||
export default cursorSlice.reducer; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.