diff --git a/README.md b/README.md
index b8fb690..3510bf4 100644
Binary files a/README.md and b/README.md differ
diff --git a/darkmode.js b/darkmode.js
index 5f94293..66ac0f6 100644
--- a/darkmode.js
+++ b/darkmode.js
@@ -1,26 +1,31 @@
-const darkModeToggle = document.getElementById('dark-mode-toggle');
-localStorage.setItem('darkMode', 'disabled');
-if (localStorage.getItem('darkMode') === 'enabled') {
- document.body.classList.add('dark-mode');
-}
-darkModeToggle.addEventListener('click', () => {
- document.body.classList.toggle('dark-mode');
- darkModeToggle.classList.toggle('dark-mode');
- if (document.body.classList.contains('dark-mode')) {
- localStorage.setItem('darkMode', 'enabled');
- darkModeToggle.style.color = "black";
- darkModeToggle.innerHTML = "☀️
Toggle Light Mode";
- } else {
- localStorage.setItem('darkMode', 'disabled');
- darkModeToggle.style.color = "white";
- darkModeToggle.innerHTML = "🌙
Toggle Dark Mode";
- }
-});
-
-enterButton.addEventListener('click', () => {
- if (document.body.classList.contains('dark-mode')) {
- document.body.style.backgroundColor = "black";
- } else {
- document.body.style.backgroundColor = "white";
- }
-});
\ No newline at end of file
+const darkModeToggle = document.getElementById('dark-mode-toggle');
+const themeIcon = darkModeToggle.querySelector('.theme-icon');
+const themeLabel = darkModeToggle.querySelector('.theme-label');
+
+function applyTheme(isDark) {
+ document.body.classList.toggle('dark-mode', isDark);
+ darkModeToggle.setAttribute('aria-pressed', String(isDark));
+ themeIcon.textContent = isDark ? '☀' : '☾';
+ themeLabel.textContent = isDark ? 'Light mode' : 'Dark mode';
+ document.querySelector('meta[name="theme-color"]').content = isDark ? '#0d1828' : '#e9f3fb';
+ window.dispatchEvent(new Event('themechange'));
+}
+
+let savedTheme;
+try {
+ savedTheme = localStorage.getItem('darkMode');
+} catch {
+ savedTheme = null;
+}
+
+applyTheme(savedTheme === 'enabled' || (savedTheme === null && window.matchMedia('(prefers-color-scheme: dark)').matches));
+
+darkModeToggle.addEventListener('click', () => {
+ const isDark = !document.body.classList.contains('dark-mode');
+ applyTheme(isDark);
+ try {
+ localStorage.setItem('darkMode', isDark ? 'enabled' : 'disabled');
+ } catch {
+ // The chosen theme remains active for this visit when storage is unavailable.
+ }
+});
diff --git a/img/house-interior-v2.png b/img/house-interior-v2.png
new file mode 100644
index 0000000..1f17f37
Binary files /dev/null and b/img/house-interior-v2.png differ
diff --git a/index.html b/index.html
index 1be9c87..789accf 100644
--- a/index.html
+++ b/index.html
@@ -1,111 +1,200 @@
-
-
-
-
-
- Welcome to my portfolio! Here, you'll discover the projects I've worked on, along with insights about my skills and background. If you're curious about my work or have any questions, feel free to reach out! Enjoy exploring!
-An interactive JavaScript and Python application designed to calculate damage statistics for the popular Roblox game 'The Red Lake'.
-
- TRLStats was my first project, a damage calculator for the Roblox game 'The Red Lake'. This project combines Python, Flask for backend processing, and JavaScript to dynamically display data extracted from JSON files.
- Link to the Website - - - - - -A Website about the creation of the SBB (Swiss Train Corporation) with an - interactable map!
-
- For a School Project, me and 2 friends had to create a page about the economic history of a part of the swiss, which we chose to do about the "SBB", the Swiss Train Coorporation, founded in 1902. It is a simple Website, using HTML, CSS, and JavaScript, alongside the "Maptiler" API for the interactive map.
- Link to the Website - - - -A minecraft forge mod for 1.20.1 that revamps dying!
-
- For a long time, I had wanted a mod that really changed how dying worked in PVP, to make it more tactical. However, there was none. So, I looked into the possibility of making my own minecraft mod, initially with neoforge, but after multiple setbacks, I decided to go with normal forge, as it was easier.
- Link to the Mod - -Hello, I'm Frederik Spirgi (aka Fretux), the creator of this website! Feel free to ask me anything—I'm here to share my journey and the technologies behind this interactive experience!
- -Fretux
+← → / A D to move · ↑ / W to jump · Enter to interact
+Welcome to my portfolio! Here, you'll discover the projects I've worked on, along with insights about my skills and background. If you're curious about my work or have any questions, feel free to reach out! Enjoy exploring!
+A simple tower defense game made in Unity.
+A Unity tower defense game where enemies attack a tower. The C# project includes enemy spawning, bullets, cannon effects, and upgrade cards.
+ Source code + +An interactive portfolio built as a snowy 2D game.
+This website is a small canvas platform game. Walk through the snowy world to discover projects and enter the house to learn about its creator.
+ Source code + +A web calculator for Anomaly Front stats and weapons.
+A Flask website for calculating Anomaly Front stats, browsing and filtering weapon data, and sending suggestions. It follows the earlier TRL Stats project.
+ Source code + +A Minecraft mod that makes hostile mobs adapt to world progression.
+A server-side Minecraft Forge mod that scales vanilla hostile mobs as the world advances. Mobs can gain stronger attributes, better equipment, extra spawn pressure, and tactical behavior.
+ Source code + +A Next.js portfolio with project, about, and contact pages.
+A separate portfolio website built with Next.js. It presents Frederik's work through dedicated project, about, and contact pages.
+ Source code + +A mobile shopping assistant for checking products in the store.
+An Expo and React Native app concept for scanning product barcodes and judging them against personal goals such as allergies, nutrition, budget, and sustainability.
+ Source code + +The pre-registration site and backend for Linux Distro Roguelite.
+A Quarkus backend and static pre-registration page for a free game. Players sign up, choose platforms, and unlock rewards through community milestones.
+ Source code + +A Linux distribution themed roguelite made in Unity.
+The Unity game project for Linux Distro Roguelite. Its scenes and scripts cover combat, game runs, progression, and a gambling scene.
+ Source code + +A Minecraft mod adding Sanity, Insanity, and Tempo systems.
+A configurable Minecraft gameplay mod inspired by Deepwoken. Sanity, Insanity, and Tempo respond to the player's surroundings and actions, adding decisions to exploration and combat.
+ Source code + +A Forge library for combat effects such as Bleed and Fear.
+A Minecraft Forge library mod that provides reusable effects including Soul Rot, Bleed, Fracture, Fear, Charm, Taunt, Overcharm, and Winded for other mods.
+ Source code + +A Minecraft mod that turns lethal hits into knockdowns.
+A Minecraft Forge mod that replaces many instant deaths with a temporary knocked-out state. Teammates can rescue and carry a downed player, while opponents can execute them.
+ Source code + Download mod + +A soulslike Minecraft RPG progression mod.
+A Minecraft mod inspired by Deepwoken. Players earn Ascend levels, invest skill points in attributes, and gain Knowledge through play.
+ Source code + +A framework for adding custom skill trees to Forge mods.
+A modular Minecraft Forge framework for other mods to define skill nodes, requirements, icons, and unlocks. It also handles the skill tree interface and server synchronization.
+ Source code + +Elsewhere, an AI chat app with personas and roleplay sessions.
+Elsewhere is an Express and SQLite chat app with user accounts, custom personas, roleplay conversations, and a persona market. Conversations can branch and be compared.
+ Source code + Live website + +A Discord bot with moderation, roles, and virtual currency.
+A Discord.js bot for community servers. Its commands cover moderation, role management, utility features, and a virtual currency system.
+ Source code + +Another repo of the Next.js portfolio website.
+A second repository for the Next.js portfolio site, with the same home page as WebsitePortfolio2 and dedicated project, about, and contact pages.
+ Source code + +A desktop autoclicker with a configurable hotkey.
+A Python desktop autoclicker built with Tkinter and pynput. Configure a hotkey, then start or stop clicking from the app or the keyboard.
+ Source code + +A multiplayer virtual-chip poker game for the web.
+A browser-based multiplayer poker game with Express, WebSockets, and SQLite. Players register accounts, join lobbies, and play with virtual chips.
+ Source code + +A Discord bot for a private server's moderation and utilities.
+A Python Discord bot with moderation tools, reports, reminders, server utilities, fun commands, and a perk shop for server boosters.
+ Source code + +Hello, I'm Frederik Spirgi (aka Fretux), the creator of this website! Feel free to ask me anything—I'm here to share my journey and the technologies behind this interactive experience!
+ + + +Press Escape to close the conversation.
+