)}
diff --git a/web/src/app/about/components/Footer.tsx b/web/src/app/about/components/Footer.tsx
index 405886a..615eb09 100644
--- a/web/src/app/about/components/Footer.tsx
+++ b/web/src/app/about/components/Footer.tsx
@@ -44,7 +44,7 @@ export function Footer() {
Ready to collaborate?
- I'm currently available for freelance projects and exciting new
+ I'm currently available for freelance projects and exciting new
opportunities.
diff --git a/web/src/app/about/components/JourneyTimeline.tsx b/web/src/app/about/components/JourneyTimeline.tsx
index 226e4e8..9204edd 100644
--- a/web/src/app/about/components/JourneyTimeline.tsx
+++ b/web/src/app/about/components/JourneyTimeline.tsx
@@ -57,7 +57,6 @@ export function JourneyTimeline() {
- {/* Timeline Item 1 */}
{
timelineNodesRef.current[0] = el;
@@ -70,21 +69,18 @@ export function JourneyTimeline() {
2024 — PRESENT
•
-
- Senior Frontend Engineer
-
+ Lorem Ipsum Title
- Tech Innovations Inc.
+ Lorem Company Name
- Leading the frontend architecture for next-generation web
- applications. Spearheading the migration to Next.js 14 and
- implementing complex WebGL features for immersive user experiences.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
+ ad minim veniam.
- 2021 — 2024
+ 2022 — 2024
•
- Full Stack Developer
+ Lorem Ipsum Position
-
- Creative Digital Agency
-
+
Ipsum Studio
- Developed and maintained multiple high-traffic e-commerce platforms.
- Specialized in creating fluid animations using GSAP and building
- robust scalable backends with Node.js.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Duis
+ aute irure dolor in reprehenderit.
- 2019 — 2021
+ 2020 — 2022
•
- Junior Web Developer
+ Dolor Sit Amet
-
Startup Studio
+
+ Placeholder Organization
+
- Began professional journey building responsive landing pages,
- optimizing web performance, and learning the fundamentals of UI/UX
- design.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Excepteur
+ sint occaecat cupidatat non proident, sunt in culpa qui officia
+ deserunt.
diff --git a/web/src/app/about/components/ScrollMarquee.tsx b/web/src/app/about/components/ScrollMarquee.tsx
index 3e6e841..6078be3 100644
--- a/web/src/app/about/components/ScrollMarquee.tsx
+++ b/web/src/app/about/components/ScrollMarquee.tsx
@@ -4,9 +4,9 @@ import { useEffect, useRef } from 'react';
interface ScrollMarqueeProps {
text: string;
- direction?: -1 | 1; // Base direction: -1 for left, 1 for right
- baseSpeed?: number; // Speed of continuous movement
- scrollSpeed?: number; // Additional speed multiplier when scrolling
+ direction?: -1 | 1;
+ baseSpeed?: number;
+ scrollSpeed?: number;
className?: string;
textClassName?: string;
}
@@ -26,11 +26,11 @@ export function ScrollMarquee({
let animationFrameId: number;
let lastScrollY = window.scrollY;
let currentX = 0;
- let currentDirection = direction;
+ let currentDirection: -1 | 1 = direction;
- // Delay initialization slightly to ensure fonts load and widths are accurate
const initId = setTimeout(() => {
let singleBlockWidth = 0;
+
if (textRef.current && textRef.current.children.length > 0) {
singleBlockWidth = (textRef.current.children[0] as HTMLElement)
.offsetWidth;
@@ -42,20 +42,17 @@ export function ScrollMarquee({
const currentScrollY = window.scrollY;
const scrollDelta = currentScrollY - lastScrollY;
- // Change continuous direction based on scroll direction
if (scrollDelta > 0) {
- currentDirection = direction; // Scroll down uses base direction
+ currentDirection = direction;
} else if (scrollDelta < 0) {
- currentDirection = -direction; // Scroll up uses opposite direction
+ currentDirection = -direction as -1 | 1;
}
lastScrollY = currentScrollY;
- // Move by base speed + extra speed from scroll delta
currentX +=
(baseSpeed + Math.abs(scrollDelta) * scrollSpeed) * currentDirection;
- // Seamless infinite loop logic
if (singleBlockWidth > 0) {
if (currentX <= -singleBlockWidth) {
currentX += singleBlockWidth;
@@ -64,7 +61,7 @@ export function ScrollMarquee({
}
}
- textRef.current.style.transform = `translate3d(${currentX}px, 0, 0)`;
+ textRef.current.style.transform = `translate3d(${currentX}px,0,0)`;
animationFrameId = requestAnimationFrame(loop);
};
@@ -73,11 +70,13 @@ export function ScrollMarquee({
return () => {
clearTimeout(initId);
- if (animationFrameId) cancelAnimationFrame(animationFrameId);
+
+ if (animationFrameId) {
+ cancelAnimationFrame(animationFrameId);
+ }
};
}, [direction, baseSpeed, scrollSpeed]);
- // Create enough text to fill the screen once
const repeatedText = Array(15).fill(text);
return (
@@ -89,14 +88,12 @@ export function ScrollMarquee({
ref={textRef}
className={`flex whitespace-nowrap will-change-transform ${textClassName}`}
>
- {/* Block 1 */}
{repeatedText.map((t, i) => (
{t}
))}
- {/* Block 2 (identical clone for seamless looping) */}