- {Object.entries(project.urls).map(([key, value]) => {
+ {Object.entries(project.urls).map(([key, value]) => {
// Determine the correct icon to render based on the key
const Icon = key === "ghUrl" ? GitHubIcon : GlobeIcon;
@@ -39,7 +42,7 @@ const ProjectCard = ({ project }) => {
rel="noopener noreferrer"
href={value}
>
-
+
);
})}
diff --git a/src/components/subComponents/Projects/ProjectsMain.jsx b/src/components/subComponents/Projects/ProjectsMain.jsx
index 84cfb10..16ca394 100644
--- a/src/components/subComponents/Projects/ProjectsMain.jsx
+++ b/src/components/subComponents/Projects/ProjectsMain.jsx
@@ -2,6 +2,8 @@ import React from "react";
import "../../../css/ProjectsMain.css";
import { useState } from "react";
import ProjectCard from "./ProjectCard";
+import { useTheme } from "../../../Context/ThemeContext";
+import { useLang } from "../../../Context/LangContext";
const ProjectsMain = ({
initialAnimation,
@@ -11,17 +13,24 @@ const ProjectsMain = ({
}) => {
const [animation, setAnimation] = useState(initialAnimation);
+ const { colormode } = useTheme();
+ const { language } = useLang();
+
return (
onMouseEnter(setAnimation)} */
onAnimationEnd={() => onAnimationEnd(setAnimation)}
>
-
Some of my latest projects:
+
{`${
+ language === "en-GB"
+ ? "Some of my latest projects:"
+ : "Ein paar meiner letzten Projekte:"
+ }`}
- {projects.map((project) => (
-
- ))}
+ {projects.map((project) => (
+
+ ))}
);
diff --git a/src/components/subComponents/Toggle.jsx b/src/components/subComponents/Toggle.jsx
index c984112..26c4b6f 100644
--- a/src/components/subComponents/Toggle.jsx
+++ b/src/components/subComponents/Toggle.jsx
@@ -1,12 +1,11 @@
-import React, { useState } from "react";
+import React from "react";
import "../../css/Toggle.css";
-const Toggle = () => {
- const [toggled, setToggled] = useState(false);
+const Toggle = ({ toggled, onToggle }) => {
return (
diff --git a/src/css/GridContainer.css b/src/css/GridContainer.css
index be2b9e8..ef8caef 100644
--- a/src/css/GridContainer.css
+++ b/src/css/GridContainer.css
@@ -4,6 +4,7 @@
grid-template-rows: repeat(9, 1fr);
gap: 10px;
width: 50%;
+ min-width: 960px;
height: 80%;
}
@@ -13,6 +14,13 @@
border-radius: 0.5rem;
border: 0.5px solid rgb(73, 73, 73);
box-shadow: 0 0 10px -5px rgba(184, 184, 184, 0.2);
+ transition: all 0.3s ease;
+}
+
+.container.light {
+ background-color: white;
+ border: 0.5px solid black;
+ box-shadow: 0 0 10px -5px rgba(78, 78, 78, 0.4);
}
.container:hover {
diff --git a/src/css/Hero.css b/src/css/Hero.css
index c4ea066..3c7ea8a 100644
--- a/src/css/Hero.css
+++ b/src/css/Hero.css
@@ -1,6 +1,7 @@
.hero {
grid-area: 1 / 1 / 4 / 5;
animation-duration: 1.5s;
+ transition: all 0.3s ease;
}
.hero p span {
@@ -10,5 +11,9 @@
.hero p {
font-size: 2rem;
- color: rgb(151, 151, 151);
+ color: rgb(90, 90, 90);
+}
+
+.hero.light p span {
+ color: rgb(40, 40, 40);
}
diff --git a/src/css/Location.css b/src/css/Location.css
index dc30378..33a307d 100644
--- a/src/css/Location.css
+++ b/src/css/Location.css
@@ -6,3 +6,11 @@
color: white;
font-size: 1rem;
}
+
+.location.light {
+ color: #333;
+}
+
+.location.light .navIcon {
+ fill: #333;
+}
diff --git a/src/css/Mail.css b/src/css/Mail.css
index 1f7c4b5..59db867 100644
--- a/src/css/Mail.css
+++ b/src/css/Mail.css
@@ -17,3 +17,12 @@
color: rgb(151, 151, 151);
font-size: 0.8rem;
}
+
+
+.eMail.light .emailAnchor {
+ color: #333;
+}
+
+.eMail.light .copyright {
+ color: rgb(102, 102, 102);
+}
\ No newline at end of file
diff --git a/src/css/Navigation.css b/src/css/Navigation.css
index 5ed5fcf..aede446 100644
--- a/src/css/Navigation.css
+++ b/src/css/Navigation.css
@@ -40,3 +40,15 @@
font-weight: bold;
transition: font-weight 0.3s ease, border-bottom 0.3s ease;
}
+
+.navigation.light .navLink {
+ color: #333;
+}
+
+.navigation.light .navLink.active span {
+ border-color: #333;
+}
+
+.navigation.light .navIcon {
+ fill: #333;
+}
diff --git a/src/css/ProjectCard.css b/src/css/ProjectCard.css
index 20af850..f7dfb0b 100644
--- a/src/css/ProjectCard.css
+++ b/src/css/ProjectCard.css
@@ -39,10 +39,6 @@
margin-bottom: 0.245rem;
}
-.projectInfo h3 {
- color: white;
-}
-
.projectInfo h3 span {
color: rgb(151, 151, 151);
font-size: 1rem;
@@ -70,3 +66,15 @@
justify-content: flex-start;
gap: 0.5rem;
}
+
+.projectCard.light .projectInfo h3 span, .projectCard.light .projectJob{
+ color: rgb(90, 90, 90);
+}
+
+.projectCard.light .socialIcon {
+ fill: #333;
+}
+
+.projectCard.light .socialIcon:hover {
+ fill: #6e6e6e;
+}
\ No newline at end of file
diff --git a/src/css/Specialties.css b/src/css/Specialties.css
index 0477612..5b74f10 100644
--- a/src/css/Specialties.css
+++ b/src/css/Specialties.css
@@ -7,3 +7,7 @@
font-size: 1.2rem;
text-align: justify;
}
+
+.specialties.light .specialtyText {
+ color: #333;
+}
diff --git a/src/css/Switch.css b/src/css/Switch.css
index ebf05e4..5dc81ea 100644
--- a/src/css/Switch.css
+++ b/src/css/Switch.css
@@ -59,7 +59,7 @@
.moon2 {
bottom: 25px;
left: 50%;
- transform: translateX(-50%);
+ transform: translateX(-50%) rotate(180deg);
}
/* Left corner */
diff --git a/src/css/TallContentAbout.css b/src/css/TallContentAbout.css
index 6bb4bf8..e8cf0ae 100644
--- a/src/css/TallContentAbout.css
+++ b/src/css/TallContentAbout.css
@@ -35,3 +35,7 @@
color: white;
font-size: 1.1rem;
}
+
+.tallContentAbout.light .funFactList li p {
+ color: #333;
+}
diff --git a/src/css/TechStack.css b/src/css/TechStack.css
index 4a811ef..2c0463f 100644
--- a/src/css/TechStack.css
+++ b/src/css/TechStack.css
@@ -1,66 +1,74 @@
.techStackContainer {
- grid-area: 4 / 1 / 8 / 5;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- animation-duration: 1s;
+ grid-area: 4 / 1 / 8 / 5;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ animation-duration: 1s;
+}
+
+.techStackContainer.expanded {
+ grid-area: 4 / 1 / 10 / 5;
+ min-width: 356.43px;
+}
+
+.techStackContainer h2 {
+ margin-bottom: 10px;
+ align-self: flex-start;
+}
+
+.techIcon {
+ width: 4rem;
+ height: 4rem;
+ filter: grayscale(0.7);
+ transition: transform 0.3s ease, filter 0.3s ease;
+}
+
+.techStackContainer.light .techIcon {
+ filter: none;
+}
+
+.techIcon:hover {
+ filter: none;
+ animation: tada 1s;
+ cursor: pointer;
+}
+
+.techStack {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-wrap: wrap;
+ gap: 10px;
+ margin-bottom: 1rem;
+}
+
+.techStackShowMore {
+ font-size: 1.2rem;
+ color: rgb(151, 151, 151);
+ text-decoration: none;
+ border-bottom: 1px solid rgb(151, 151, 151);
+ /* align-self: flex-start; */
+}
+
+.techStackContainer.light .techStackShowMore {
+ color: rgb(61, 61, 61);
+ border-color: rgb(61, 61, 61);
+}
+
+@keyframes techIconHover {
+ 10% {
+ transform: scale();
}
-
- .techStackContainer.expanded {
- grid-area: 4 / 1 / 10 / 5;
- min-width: 356.43px;
- }
-
- .techStackContainer h2 {
- margin-bottom: 10px;
- align-self: flex-start;
- }
-
- .techIcon {
- width: 4rem;
- height: 4rem;
- filter: grayscale(0.7);
- transition: transform 0.3s ease, filter 0.3s ease;
- }
-
- .techIcon:hover {
- filter: none;
- animation: tada 1s;
- cursor: pointer;
- }
-
- .techStack {
- display: flex;
- align-items: center;
- justify-content: center;
- flex-wrap: wrap;
- gap: 10px;
- margin-bottom: 1rem;
- }
-
- .techStackShowMore {
- font-size: 1.2rem;
- color: rgb(151, 151, 151);
- text-decoration: none;
- border-bottom: 1px solid rgb(151, 151, 151);
- /* align-self: flex-start; */
- }
-
- @keyframes techIconHover {
- 10% {
- transform: scale();
- }
- }
-
- /* Smooth expand/collapse animations */
- .techStackContainer {
- max-height: 320px; /* Initial max-height */
- overflow: hidden;
- transition: max-height 1s ease-in-out;
- }
-
- .techStackContainer.expanded {
- max-height: 600px; /* Expanded max-height */
- }
-
\ No newline at end of file
+}
+
+/* Smooth expand/collapse animations */
+.techStackContainer {
+ max-height: 320px; /* Initial max-height */
+ overflow: hidden;
+ transition: max-height 1s ease-in-out;
+}
+
+.techStackContainer.expanded {
+ max-height: 600px; /* Expanded max-height */
+}
diff --git a/src/index.css b/src/index.css
index b5ec9c2..ed1abc4 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,3 +1,4 @@
+/* Reset and defaults */
* {
margin: 0;
padding: 0;
@@ -6,12 +7,40 @@
body {
font-family: "SF Pro Display", sans-serif;
+ transition: background-color 0.5s ease;
+}
+
+[data-theme="dark"] body {
background-color: #000000;
- background-color: #000000;
+ background-image: linear-gradient(43deg, #000000 29%, #454545 75%, #000 100%);
+}
+
+[data-theme="light"] body {
+ background-color: #ffffff;
background-image: linear-gradient(
43deg,
- #000000 29%,
- #454545 75%,
- #000 100%
+ #ffffff 29%,
+ #d7d7d7 75%,
+ #ffffff 100%
);
}
+
+/* Dark theme */
+[data-theme="dark"] h1,
+[data-theme="dark"] h2,
+[data-theme="dark"] h3,
+[data-theme="dark"] h4,
+[data-theme="dark"] h5,
+[data-theme="dark"] h6 {
+ color: white;
+}
+
+/* Light theme */
+[data-theme="light"] h1,
+[data-theme="light"] h2,
+[data-theme="light"] h3,
+[data-theme="light"] h4,
+[data-theme="light"] h5,
+[data-theme="light"] h6 {
+ color: #333;
+}
diff --git a/src/main.jsx b/src/main.jsx
index 4c7dc41..708ab62 100644
--- a/src/main.jsx
+++ b/src/main.jsx
@@ -3,9 +3,15 @@ import "./index.css";
import App from "./App.jsx";
import { BrowserRouter } from "react-router-dom";
import "./css/fonts.css";
+import ThemeProvider from "./Context/ThemeContext.jsx";
+import LangProvider from "./Context/LangContext.jsx";
createRoot(document.getElementById("root")).render(
-
+
+
+
+
+
);