Skip to content

Commit 8224e35

Browse files
committed
Add transitions
1 parent 8dead85 commit 8224e35

5 files changed

Lines changed: 78 additions & 15 deletions

File tree

src/App.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,25 @@
5151
margin: 20px;
5252
max-width: 500px;
5353
}
54+
55+
.container {
56+
transition: opacity 0.25s;
57+
}
58+
59+
.link {
60+
background-color: transparent;
61+
color: #7c88f7;
62+
text-decoration: none;
63+
margin: 0;
64+
padding: 0;
65+
outline: none;
66+
border: none;
67+
}
68+
69+
.link:hover {
70+
text-decoration: underline;
71+
}
72+
73+
*:focus {
74+
outline: 0 !important;
75+
}

src/App.tsx

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import "./App.css";
2-
import { Routes, Route } from "react-router-dom";
2+
import { Routes, Route, Outlet } from "react-router-dom";
33
import { useRef } from "react";
44
import Home from "./pages/Home";
55
import Projects from "./pages/Projects";
@@ -9,26 +9,44 @@ import NotFound from "./pages/404";
99
import SlideshowBg from "./pages/SlideshowBg";
1010
import Header from "./pages/Header";
1111
import Project from "./pages/Project";
12+
import { NavigationProvider } from "./utils/NavigationProvider";
1213

1314
function App() {
1415
const containerRef = useRef<HTMLSpanElement | null>(null);
16+
const containerRef2 = useRef<HTMLDivElement | null>(null);
1517

1618
return (
17-
<Header containerRef={containerRef}>
19+
<Header containerRef={containerRef} containerRef2={containerRef2}>
1820
<Routes>
1921
<Route path="/" element={<SlideshowBg containerRef={containerRef} />}>
2022
<Route index element={<Home />} />
2123
<Route path="about" element={<About />} />
2224
<Route path="contact" element={<Contact />} />
2325
</Route>
24-
<Route path="/projects" element={<Projects />} />
25-
<Route path="/projects/:projectId" element={<Project />} />
26-
<Route path="/mini-projects" element={<Projects />} />
27-
<Route path="/mini-projects/:projectId" element={<Project />} />
26+
<Route path="/" element={<Container containerRef={containerRef2} />}>
27+
<Route path="/projects" element={<Projects />} />
28+
<Route path="/projects/:projectId" element={<Project />} />
29+
<Route path="/mini-projects" element={<Projects key={"mini"} />} />
30+
<Route path="/mini-projects/:projectId" element={<Project />} />
31+
</Route>
2832
<Route path="*" element={<NotFound />} />
2933
</Routes>
3034
</Header>
3135
);
3236
}
3337

3438
export default App;
39+
40+
function Container({
41+
containerRef,
42+
}: {
43+
containerRef: React.RefObject<HTMLSpanElement | null>;
44+
}) {
45+
return (
46+
<span className="container" ref={containerRef}>
47+
<NavigationProvider containerRef={containerRef}>
48+
<Outlet />
49+
</NavigationProvider>
50+
</span>
51+
);
52+
}

src/pages/Header.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ import { useEffect, useState } from "react";
66
export default function Header({
77
children,
88
containerRef,
9+
containerRef2,
910
}: {
1011
children?: React.ReactNode;
1112
containerRef: React.RefObject<HTMLSpanElement | null>;
13+
containerRef2: React.RefObject<HTMLDivElement | null>;
1214
}) {
1315
const navigate = useNavigate();
1416
const location = useLocation();
17+
const isMain = ["/", "/about", "/contact"].includes(location.pathname);
18+
const realContainerRef = isMain ? containerRef : containerRef2;
1519

1620
const [modalOpen, setModalOpen] = useState(false);
1721

@@ -35,7 +39,13 @@ export default function Header({
3539
>
3640
<Logo
3741
className="logo-img"
38-
onClick={() => transition("/", containerRef, navigate, location)}
42+
onClick={() => {
43+
console.log(isMain, containerRef2, containerRef);
44+
(isMain ? containerRef2 : containerRef).current?.classList.add(
45+
"invisible"
46+
);
47+
transition("/", realContainerRef, navigate, location);
48+
}}
3949
/>
4050
</div>
4151
{modalOpen && (

src/pages/Project.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
import { Link, useLocation, useNavigate, useParams } from "react-router-dom";
1+
import { useLocation, useParams } from "react-router-dom";
22
import "./Project.css";
33
import { mainProjects, miniProjects } from "../utils/projects";
44
import { useEffect } from "react";
55
import Slideshow from "../components/Slideshow";
66
import TechIcon from "../components/TechIcon";
7+
import { useTransitionNav } from "../utils/NavigationProvider";
78

89
export default function Project() {
910
const location = useLocation();
1011
const params = useParams();
11-
const navigate = useNavigate();
12+
const { navigate, finishTransition } = useTransitionNav();
1213
const isMini = location.pathname.includes("mini-projects");
1314
const project = (isMini ? miniProjects : mainProjects).find(
1415
(p) => p.id === params.projectId
@@ -20,6 +21,10 @@ export default function Project() {
2021
}
2122
}, [project, navigate]);
2223

24+
useEffect(() => {
25+
finishTransition();
26+
}, [finishTransition]);
27+
2328
if (!project) {
2429
return null;
2530
}
@@ -28,9 +33,12 @@ export default function Project() {
2833
<div className="project-container">
2934
<div className="project-header">
3035
<h1>{project?.name}</h1>
31-
<Link to={isMini ? "/mini-projects" : "/projects"}>
36+
<button
37+
className="link"
38+
onClick={() => navigate(isMini ? "/mini-projects" : "/projects")}
39+
>
3240
<h3>{isMini ? "Mini" : "All"} Projects</h3>
33-
</Link>
41+
</button>
3442
</div>
3543
<div className="project-content">
3644
<div className="project-slides">

src/pages/Projects.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { mainProjects, miniProjects } from "../utils/projects";
22
import "./Projects.css";
3-
import { Link, useLocation, useNavigate } from "react-router-dom";
3+
import { useLocation } from "react-router-dom";
44
import { useEffect, useRef, useState } from "react";
5+
import { useTransitionNav } from "../utils/NavigationProvider";
56

67
export default function Projects() {
78
const location = useLocation();
@@ -18,7 +19,11 @@ export default function Projects() {
1819
: undefined;
1920
const fsRef = useRef<HTMLDivElement>(null);
2021
const cardRefs = useRef<(HTMLDivElement | null)[]>([]);
21-
const navigate = useNavigate();
22+
const { navigate, finishTransition } = useTransitionNav();
23+
24+
useEffect(() => {
25+
finishTransition();
26+
}, [finishTransition]);
2227

2328
useEffect(() => {
2429
if (transitionProject && !isMini) {
@@ -69,9 +74,9 @@ export default function Projects() {
6974
)}
7075
<div className="projects-header">
7176
<h1>{isMini ? "Mini" : "My"} Projects</h1>
72-
<Link to="/">
77+
<button className="link" onClick={() => navigate("/")}>
7378
<h3>Back to home</h3>
74-
</Link>
79+
</button>
7580
</div>
7681
<div className="projects-content">
7782
{projects.map((project, idx) => (

0 commit comments

Comments
 (0)