diff --git a/src/App.tsx b/src/App.tsx index 923d3cb..f3bcd53 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -18,6 +18,9 @@ interface Experience { type: "language" | "service" | "platform" | "real life experience" | "roles"; description: string; image?: string; + learned_at?: string; + learned_from?: string; + learned_because?: string; } function MiniProjectModal({ @@ -138,6 +141,117 @@ function MiniProjectModal({ ); } +function ExperienceModal({ + experience, + onClose, +}: { + experience: Experience; + onClose: () => void; +}) { + return ( +
+
e.stopPropagation()} + > + {/* Close Button */} + + + {/* Content */} +
+
+
+ {experience.image ? ( + {experience.name} + ) : ( + getTypeIcon(experience.type) + )} +
+
+

+ {experience.name} +

+

+ {getTypeIcon(experience.type)} {experience.type.charAt(0).toUpperCase() + experience.type.slice(1)} +

+
+
+ +
+ {experience.description && ( +
+

+ Description +

+

+ {experience.description} +

+
+ )} + + {experience.learned_at && ( +
+

+ 📅 When I Learned It +

+

+ {experience.learned_at} +

+
+ )} + + {experience.learned_from && ( +
+

+ 👨‍🏫 How I Learned It +

+

+ {experience.learned_from} +

+
+ )} + + {experience.learned_because && ( +
+

+ 💡 Why I Learned It +

+

+ {experience.learned_because} +

+
+ )} +
+
+
+
+ ); +} + function getTypeIcon(type: Experience["type"]) { switch (type) { case "language": @@ -221,6 +335,73 @@ function MiniProjectCard({ ); } +function ExperienceCard({ + experience, + onClick, +}: { + experience: Experience; + onClick?: () => void; +}) { + const isClickable = !!(experience.learned_at || experience.learned_from || experience.learned_because); + + return ( +
+
+ {experience.image ? ( + {experience.name} + ) : ( + getTypeIcon(experience.type) + )} + {isClickable && ( +
+ )} +
+
+

+ {experience.name} +

+ {experience.description && ( +

+ {experience.description} +

+ )} +
+ {isClickable && ( +
+ + + +
+ )} +
+ ); +} + function ProjectCard({ project }: { project: Project }) { return (
@@ -292,12 +473,12 @@ function App() { const [isScrambling, setIsScrambling] = useState(false); const [showOldNames, setShowOldNames] = useState(false); const [selectedMiniProject, setSelectedMiniProject] = useState(null); + const [selectedExperience, setSelectedExperience] = useState(null); const oldUsernames = [ "getspaced (ingame)", "Space² (alternative)", "Space-Banane (2022-2024)", - "banana[redacted]_ (2019-2022)", ]; const rotatingMessages = [ @@ -519,7 +700,7 @@ function App() { About Me

- A bit about who I am and what I do + What i do and who i am.

@@ -527,60 +708,13 @@ function App() {

- I'm a Software Developer from Germany, located near Frankfurt. + I'm a Developer from Germany. I love doing full-stack web + development, tinkering with hardware, and 3D printing cool + stuff.

- My passion lies in coding, exploring limits, and occasionally - reinventing the wheel just for the fun of it. While I love - open-source, I'm not afraid to build custom solutions when - existing ones don't fit. + I focus on building projects that i need, and that don't already exist.

-

- I actively contribute to open-source projects, fixing the little - things that make a big difference. -

-
-
-
- - - {/* AI-Assisted Coding Section */} -
-
-

- AI-Assisted Coding -

-

- How i use AI. -

-
- -
-
-
-

- I write most of my code myself, especially when it comes to logic, backend architecture, - authentication systems, database communication, and project setup. These core aspects are - where I believe hands-on coding is essential for quality and understanding. -

-

- However, for UI development, I love using{" "} - Claude Sonnet 4.5 to - help speed up the process and explore different design approaches. It's particularly helpful for - styling, layout, and creating polished user interfaces. -

-

- I also embrace tools like{" "} - GitHub Copilot's autocompletion, - which enhances my productivity by suggesting code snippets and reducing repetitive typing. - It's like having a coding assistant that understands context. -

-
-

- "Ai wont replace shit, it'll either help us or kill us" -

-
-
@@ -593,7 +727,7 @@ function App() { Hardware Stuff

- The lion is concerned with a LED connected to 12V + The lion is concerned with a 5v rated LED connected to 12V

@@ -601,18 +735,14 @@ function App() {

- When I'm not breaking my code, you'll find me breaking{" "} + When im not breaking Typescript im usually playing with{" "} Arduinos and{" "} ESP32s. I love interacting via Software with self-made hardware.

- I've built my fair share of little sensor gadgets and placed them around my house. All are managed using{" "} - ESPHome via{" "} - Home Assistant. Which means, no cloud dependencies and full control over my smart home setup. -

+ I've built some Smarthome sensors myself, including a few little bluetooth proxys that also serve as temperature sensors.

- I love using Arduinos because they're stupidly easy to build with & the bar to entry is extremely low with a stupid amount of tutorials, - but the possibilities are endless. First it was the blinking LEDs, now it's servo control via bluetooth across the room. + I love using ESP32s because they're stupidly easy to build with & the bar to entry is stupidly low with a stupid amount of tutorials.

@@ -626,7 +756,7 @@ function App() { 3D Printing

- I turn Plastic on a Spool into Plastic in a Shape. + Plastic on a Spool -{">"} Plasic in a Shape

@@ -636,17 +766,11 @@ function App() {

I run a modded Creality Ender 3 V1 with a{" "} BLTouch for auto bed leveling, - all managed remotely through OctoPrint. - I slice my prints using OrcaSlicer because Cura misses a few options. + all managed through OctoPrint. + I slice my stuff using OrcaSlicer because Cura's UI gives me a flashbang everytime i open it.

- I mostly print replacement parts for stuff around the house and cool shit I find on{" "} - Printables. For custom designs, I use{" "} - Fusion 360 to model my own parts when I need something specific. -

-

- I'm not a fan of Bamboo Lab. Their choices, pricing, and quality just don't.
- One day, I'd love to own a Creality K2 Pro. + I would lie if i said i print useful stuff. Most of the stuff i print is for organising stuff and a few fun prints here and there.

@@ -660,7 +784,7 @@ function App() { My Goals

- This is the stuff i want to learn. + future things

@@ -778,6 +902,13 @@ function App() { /> )} + {selectedExperience && ( + setSelectedExperience(null)} + /> + )} + {/* Experience Section */}
@@ -809,32 +940,11 @@ function App() {
{items.map((exp, index) => ( -
-
- {exp.image ? ( - {exp.name} - ) : ( - getTypeIcon(exp.type) - )} -
-
-

- {exp.name} -

- {exp.description && ( -

- {exp.description} -

- )} -
-
+ experience={exp} + onClick={() => setSelectedExperience(exp)} + /> ))}
@@ -1119,18 +1229,20 @@ const experiences: Experience[] = [ name: "Immich", type: "platform", description: "Self-hosted photo and video management solution.", - image: "https://avatars.githubusercontent.com/u/109746326?v=4" + image: "https://avatars.githubusercontent.com/u/109746326?v=4", + learned_because: "I hate OneDrive" }, { name: "Pangolin", type: "platform", description: "Proxy solution for network management.", image: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/pangolin.svg", + learned_because: "My old proxy did NOT work super well with authentication." }, { name: "Nginx", type: "platform", - description: "Proxy solution for network management.", + description: "Proxy solution for network management. (old proxy)", image: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/nginx/nginx-original.svg", }, {