Compare commits

..
5 Commits
Author SHA1 Message Date
douwe d745be248d Add mobile responsiveness for phone and landscape mode
- Reduced base font size on mobile (18px vs 25px)
- Made navigation bar responsive: smaller icons, wrapped layout
- Fixed header position on mobile (sticky at top)
- Adjusted scroll_container margin top to account for fixed header
- Disabled scroll-snap on mobile for better UX
- Made home section responsive: smaller title, tagline, images
- Project cards grid: smaller cards and text on mobile
- Apps carousel: responsive icon sizes and spacing
- Games grid: smaller cards and proper spacing
- Footer: centered layout on mobile
- All interactive elements maintain touch targets
2026-09-25 11:38:15 +02:00
douwe 5c20a6b747 Revert "Improve navigation scrolling to show full content"
This reverts commit a7ea82ff19.
2026-09-25 11:31:39 +02:00
douwe a7ea82ff19 Improve navigation scrolling to show full content
- Adjusted IntersectionObserver threshold to 0.7 for better section detection
- Added scroll-padding-top to scroll_container to account for header
- Added scroll-margin-top to scroll_section for better snap alignment
- Updated navigation click handler to scroll with header height offset
- Ensures sections are fully visible when navigating
2026-09-25 11:28:37 +02:00
douwe f9036a2644 Add placeholder screenshot images for apps section
- Added 5 service screenshots (Gitea, Nextcloud, Penpot, Beszel, Wattif)
- Created apps/ directory for organization
2026-09-25 11:26:15 +02:00
douwe c5dca7bb54 Implement games section with expandable cards
- Added responsive grid of game cards with dark-teal background
- Each card has: rounded gray image placeholder, white title, gray description, orange year badge
- Click to expand: shows full description + centered play button
- Play button opens game in new window
- Flat minimal design consistent with portfolio style
- Created placeholder images for 6 games
2026-09-25 11:25:58 +02:00
20 changed files with 1468 additions and 56 deletions
+4
View File
@@ -23,6 +23,10 @@
--blue-clr: #47bcdf;
--green-clr: #6ede9a;
--white-clr: #ffffff;
--card-border-radius: 25px;
--dark-green: #1a3d2e;
--dark-teal: #2c5f5f;
--orange-clr: #f39c12;
}
body {
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

+218
View File
@@ -2,6 +2,9 @@ document.addEventListener('DOMContentLoaded', () => {
setupNavigationHighlight();
setupNavigationClicks();
setupCopyright();
setupProjectCards();
setupAppsCarousel();
setupGameCards();
});
function setupNavigationHighlight() {
@@ -43,3 +46,218 @@ function setupNavigationClicks() {
function setupCopyright() {
document.getElementById('copyright').textContent = `© ${new Date().getFullYear()} - douwco.be`;
}
function setupProjectCards() {
const projectCards = document.querySelectorAll('.project-card-new');
projectCards.forEach(card => {
const shortDesc = card.querySelector('.project-card-short-desc');
const fullContent = card.querySelector('.project-card-content');
const toggleIcon = card.querySelector('.toggle-icon');
if (!shortDesc || !fullContent || !toggleIcon) return;
const toggleCard = (event) => {
if (event.target.tagName === 'A') {
return;
}
const isExpanded = card.classList.contains('expanded');
if (isExpanded) {
card.classList.remove('expanded');
toggleIcon.textContent = '+';
} else {
card.classList.add('expanded');
toggleIcon.textContent = '−';
}
event.stopPropagation();
};
card.addEventListener('click', toggleCard);
toggleIcon.addEventListener('click', toggleCard);
});
}
function setupAppsCarousel() {
const carousel = document.getElementById('apps-carousel');
const carouselContainer = carousel ? carousel.closest('.carousel-container-full') : null;
const items = document.querySelectorAll('#apps-carousel .carousel-item-full');
const prevBtn = carouselContainer ? carouselContainer.querySelector('.carousel-nav-full.prev') : null;
const nextBtn = carouselContainer ? carouselContainer.querySelector('.carousel-nav-full.next') : null;
const screenshotImg = document.getElementById('apps-screenshot-img');
const description = document.getElementById('apps-description');
const title = document.getElementById('apps-title');
const goToAppBtn = document.getElementById('apps-link');
if (!carousel || items.length === 0) return;
const services = [
{
name: 'Gitea',
screenshot: '/assets/img/gitea_screenshot.png',
description: 'Self-hosted Git service with a simple and lightweight interface.',
url: 'https://gitea.douwco.be'
},
{
name: 'Nextcloud',
screenshot: '/assets/img/nextcloud_screenshot.png',
description: 'Private file hosting and collaboration platform with powerful features.',
url: 'https://nextcloud.douwco.be'
},
{
name: 'Penpot',
screenshot: '/assets/img/penpot_screenshot.png',
description: 'Open-source design and prototyping platform for teams.',
url: 'https://penpot.douwco.be'
},
{
name: 'Beszel',
screenshot: '/assets/img/beszel_screenshot.png',
description: 'Custom service management and monitoring dashboard.',
url: 'https://beszel.douwco.be'
},
{
name: 'Wattif',
screenshot: '/assets/img/wattif_screenshot.png',
description: 'Energy monitoring and analysis tool for smart homes.',
url: 'https://wattif.douwco.be'
}
];
let currentIndex = 0;
let isAnimating = false;
function updateCarousel() {
if (isAnimating) return;
isAnimating = true;
items.forEach((item, index) => {
const isSelected = index === currentIndex;
item.setAttribute('data-selected', isSelected.toString());
});
const service = services[currentIndex];
if (description) description.classList.remove('active');
if (screenshotImg) screenshotImg.classList.remove('active');
if (title) title.classList.remove('active');
if (goToAppBtn) goToAppBtn.classList.remove('active');
setTimeout(() => {
if (screenshotImg) {
screenshotImg.src = service.screenshot;
}
if (title) {
title.textContent = service.name;
}
if (description) {
description.innerHTML = `<p>${service.description}</p>`;
}
if (goToAppBtn) {
goToAppBtn.href = service.url;
}
setTimeout(() => {
if (description) description.classList.add('active');
if (screenshotImg) screenshotImg.classList.add('active');
if (title) title.classList.add('active');
if (goToAppBtn) goToAppBtn.classList.add('active');
isAnimating = false;
}, 50);
}, 300);
}
function rotateCarousel(direction) {
if (isAnimating) return;
currentIndex = (currentIndex + direction + items.length) % items.length;
updateCarousel();
}
if (prevBtn) {
prevBtn.addEventListener('click', () => rotateCarousel(-1));
}
if (nextBtn) {
nextBtn.addEventListener('click', () => rotateCarousel(1));
}
items.forEach((item, index) => {
item.addEventListener('click', () => {
if (isAnimating) return;
currentIndex = index;
updateCarousel();
});
});
let touchStartX = 0;
let touchEndX = 0;
if (carousel) {
carousel.addEventListener('touchstart', (e) => {
touchStartX = e.changedTouches[0].screenX;
}, { passive: true });
carousel.addEventListener('touchend', (e) => {
touchEndX = e.changedTouches[0].screenX;
handleSwipe();
}, { passive: true });
}
function handleSwipe() {
if (isAnimating) return;
const swipeThreshold = 50;
const diff = touchStartX - touchEndX;
if (Math.abs(diff) > swipeThreshold) {
if (diff > 0) {
rotateCarousel(1);
} else {
rotateCarousel(-1);
}
}
}
if (carousel) {
carousel.addEventListener('wheel', (e) => {
if (isAnimating) return;
e.preventDefault();
if (e.deltaY > 0) {
rotateCarousel(1);
} else {
rotateCarousel(-1);
}
}, { passive: false });
}
updateCarousel();
}
function setupGameCards() {
const gameCards = document.querySelectorAll('.game-card');
gameCards.forEach(card => {
card.addEventListener('click', (event) => {
const isExpanded = card.classList.contains('expanded');
if (isExpanded) {
card.classList.remove('expanded');
} else {
gameCards.forEach(c => c.classList.remove('expanded'));
card.classList.add('expanded');
}
event.stopPropagation();
});
const playButton = card.querySelector('.play-button');
if (playButton) {
playButton.addEventListener('click', (event) => {
event.stopPropagation();
});
}
});
}
+287 -56
View File
@@ -10,6 +10,24 @@
<link rel="stylesheet" href="/assets/css/style.css"/>
<script src="/assets/js/project-card.js" defer></script>
<script src="/assets/js/index.js" defer></script>
<script>
// Parse [[text|url]] links in project card content
document.addEventListener('DOMContentLoaded', () => {
const projectCards = document.querySelectorAll('.project-card-content p');
projectCards.forEach(p => {
const linkPattern = /\[\[([^|\]]+)\|([^\]]+)\]\]/g;
let html = p.innerHTML;
html = html.replace(linkPattern, (match, text, url) => {
if (url.startsWith('http')) {
return `<a href="${url}" target="_blank" rel="noopener">${text}</a>`;
} else {
return `<a href="${url}">${text}</a>`;
}
});
p.innerHTML = html;
});
});
</script>
</head>
<body>
<header>
@@ -68,74 +86,287 @@
<h1>Hi, I'm Douwe</h1>
<p>
A <span class="green-text">PhD student</span> at KU Leuven with a passion for game development and software independence.
<br><br>
Currently I'm working on:
</p>
<project-card image="/assets/img/rollability.png" image-alt="RollAbility"
title="RollAbility"
description="For my PhD research at KU Leuven, I'm developing RollAbility, a therapeutic exergame that bridges player autonomy with clinical guidelines to enhance wheelchair training.
Developed in collaboration with therapists, RollAbility is a game built onto a clinical protocol and controlled by an actual powered wheelchair. The game connects to the RollAbility App which allows therapists to control the training session in real-time.
[[Read the paper|https://dl.acm.org/doi/abs/10.1145/3748621]] or [[watch the video|https://www.youtube.com/watch?v=8y9XFdSN_04]].">
</project-card>
<project-card image="/assets/img/alcove.png" image-alt="Alcove"
title="Alcove"
description="Alcove is an interreg project between Flemish, Walloon and French universities and hospitals that aims to build a device that detects lung cancer through a breath test.
My role is to create a user interface for the device. This UI has to work both on android phones and on embedded linux devices.
[[Read more about Alcove|https://alcove.crosss3.eu/nl/]].">
</project-card>
<p><span class="green-text">However</span> in the past I also worked on:</p>
<project-card image="/assets/img/godot_addons.png" image-alt="Godot tools"
title="Godot Addons"
description="I published two small addons to the godot asset library.
One addon called [[Godot Visual Studio Debugger|https://godotengine.org/asset-library/asset/3505]] which allows you to dynamically run the current scene open in the Godot editor directly in Visual Studio Debugger.
The second addon called [[Godot Test Scenes|https://godotengine.org/asset-library/asset/3420]] extends the Godot editor with an additional run mode, this mode runs an associated test scene to the currently open one in the editor.
They are both open source:
[[Godot Test Scenes|https://github.com/DouweRavers/godot_test_scene]] and [[Godot Visual Studio Debugger|https://github.com/DouweRavers/godot_visualstudio_debugger/tree/main]].">
</project-card>
<project-card image="/assets/img/kingfisher.png" image-alt="Kingfisher"
title="Kingfisher"
description="The project [[Kingfisher|https://kingfisher-game.com/]] is a game built by PossilbyPixels that raises awareness about Autism. It is a story-based action / puzzle game for PC and mobile.
My role in the project was to build minigames that occur throughout the story and also to develop tools to help development.
One of the tools I made for this project was a suburban neighborhood generator. This tool allowed us to draw streets in the editor which then were automatically filled with procedurally generated houses and gardens. You can see a demo in [[this video|/assets/vid/procedural_streets.mp4]].
You can wishlist the game on [[Steam|https://store.steampowered.com/app/4197280/Kingfisher_An_Autism_Tale/]]!">
</project-card>
<project-card image="/assets/img/ludum_dare.png" image-alt="Ludum Dare"
title="Ludum Dare"
description="Between 2019 and 2024, I participated regularly in the Ludum Dare event. This event was all about creating games under tight deadlines of 48 hours and with no external resources such as audio or 3D art.
After each event I published my game on [[Itch.io|https://coffeeplanet.itch.io/]] where they are still available for play. In the future I want to migrate them to this website.
I want to especially highlight [[Cobor goes farming|https://coffeeplanet.itch.io/ludum-dare-51]] and [[Windy the Indie|https://coffeeplanet.itch.io/windy-the-indie]].">
</project-card>
<project-card image="/assets/img/thesis_tool.png" image-alt="Planet Tool"
title="Masterthesis: Planet Tool"
description="For my Masterthesis at Group T KU Leuven I made a tool for Unity that creates a procedural planet terrain.
The main challenge of this project was to optimize the algorithm to work as fast as possible. For this I leveraged GPU compute shaders to process large chunks of data at once.
You can find the tool and my thesis paper [[here|https://github.com/DouweRavers/ThesisProject-ThePlanetEngine/tree/main]].">
</project-card>
<project-card image="/assets/img/wizard_gloves.png" image-alt="Wizard Gloves"
title="Masterproject: Wizard Gloves"
description="In another project during my masters we explored gesture-based interactions in virtual environments.
For this project we developed a prototype using Unity and custom wearable hardware to enable magic-like hand gestures for interfacing with a story game.
See the game [[here|/assets/vid/wizard_gloves.mp4]] or you can find the game and paper [[here|https://github.com/DouweRavers/MasterProject-WizardsGlovesAdventure/tree/main]].">
</project-card>
<div class="about-me-section">
<h2>Currently I'm working on:</h2>
<div class="about-me-projects-grid" id="currently-working-grid">
<div class="project-card-new" data-full-desc="For my PhD research at KU Leuven, I'm developing RollAbility, a therapeutic exergame that bridges player autonomy with clinical guidelines to enhance wheelchair training. Developed in collaboration with therapists, RollAbility is a game built onto a clinical protocol and controlled by an actual powered wheelchair. The game connects to the RollAbility App which allows therapists to control the training session in real-time. [[Read the paper|https://dl.acm.org/doi/abs/10.1145/3748621]] or [[watch the video|https://www.youtube.com/watch?v=8y9XFdSN_04]].">
<div class="toggle-icon">+</div>
<div class="project-card-image-container">
<img class="project-card-image" src="/assets/img/rollability.png" alt="RollAbility">
</div>
<div class="project-card-title-container">
<div class="project-card-title-background"></div>
<h3 class="project-card-title">RollAbility</h3>
</div>
<div class="project-card-short-desc">
<p>Therapeutic exergame for wheelchair training with clinical protocol integration.</p>
</div>
<div class="project-card-content">
<p>For my PhD research at KU Leuven, I'm developing RollAbility, a therapeutic exergame that bridges player autonomy with clinical guidelines to enhance wheelchair training. Developed in collaboration with therapists, RollAbility is a game built onto a clinical protocol and controlled by an actual powered wheelchair. The game connects to the RollAbility App which allows therapists to control the training session in real-time. [[Read the paper|https://dl.acm.org/doi/abs/10.1145/3748621]] or [[watch the video|https://www.youtube.com/watch?v=8y9XFdSN_04]].</p>
</div>
</div>
<div class="project-card-new" data-full-desc="Alcove is an interreg project between Flemish, Walloon and French universities and hospitals that aims to build a device that detects lung cancer through a breath test. My role is to create a user interface for the device. This UI has to work both on android phones and on embedded linux devices. [[Read more about Alcove|https://alcove.crosss3.eu/nl/]].">
<div class="toggle-icon">+</div>
<div class="project-card-image-container">
<img class="project-card-image" src="/assets/img/alcove.png" alt="Alcove">
</div>
<div class="project-card-title-container">
<div class="project-card-title-background"></div>
<h3 class="project-card-title">Alcove</h3>
</div>
<div class="project-card-short-desc">
<p>Interreg project building a lung cancer detection device with cross-platform UI.</p>
</div>
<div class="project-card-content">
<p>Alcove is an interreg project between Flemish, Walloon and French universities and hospitals that aims to build a device that detects lung cancer through a breath test. My role is to create a user interface for the device. This UI has to work both on android phones and on embedded linux devices. [[Read more about Alcove|https://alcove.crosss3.eu/nl/]].</p>
</div>
</div>
</div>
</div>
<div class="about-me-section">
<h2><span class="green-text">However</span> in the past I also worked on:</h2>
<div class="about-me-projects-grid" id="past-projects-grid">
<div class="project-card-new" data-full-desc="I published two small addons to the godot asset library. One addon called [[Godot Visual Studio Debugger|https://godotengine.org/asset-library/asset/3505]] which allows you to dynamically run the current scene open in the Godot editor directly in Visual Studio Debugger. The second addon called [[Godot Test Scenes|https://godotengine.org/asset-library/asset/3420]] extends the Godot editor with an additional run mode, this mode runs an associated test scene to the currently open one in the editor. They are both open source: [[Godot Test Scenes|https://github.com/DouweRavers/godot_test_scene]] and [[Godot Visual Studio Debugger|https://github.com/DouweRavers/godot_visualstudio_debugger/tree/main]].">
<div class="toggle-icon">+</div>
<div class="project-card-image-container">
<img class="project-card-image" src="/assets/img/godot_addons.png" alt="Godot tools">
</div>
<div class="project-card-title-container">
<div class="project-card-title-background"></div>
<h3 class="project-card-title">Godot Addons</h3>
</div>
<div class="project-card-short-desc">
<p>Visual Studio Debugger and Test Scenes addons for the Godot engine.</p>
</div>
<div class="project-card-content">
<p>I published two small addons to the godot asset library. One addon called [[Godot Visual Studio Debugger|https://godotengine.org/asset-library/asset/3505]] which allows you to dynamically run the current scene open in the Godot editor directly in Visual Studio Debugger. The second addon called [[Godot Test Scenes|https://godotengine.org/asset-library/asset/3420]] extends the Godot editor with an additional run mode, this mode runs an associated test scene to the currently open one in the editor. They are both open source: [[Godot Test Scenes|https://github.com/DouweRavers/godot_test_scene]] and [[Godot Visual Studio Debugger|https://github.com/DouweRavers/godot_visualstudio_debugger/tree/main]].</p>
</div>
</div>
<div class="project-card-new" data-full-desc="The project [[Kingfisher|https://kingfisher-game.com/]] is a game built by PossilbyPixels that raises awareness about Autism. It is a story-based action / puzzle game for PC and mobile. My role in the project was to build minigames that occur throughout the story and also to develop tools to help development. One of the tools I made for this project was a suburban neighborhood generator. This tool allowed us to draw streets in the editor which then were automatically filled with procedurally generated houses and gardens. You can see a demo in [[this video|/assets/vid/procedural_streets.mp4]]. You can wishlist the game on [[Steam|https://store.steampowered.com/app/4197280/Kingfisher_An_Autism_Tale/]]!">
<div class="toggle-icon">+</div>
<div class="project-card-image-container">
<img class="project-card-image" src="/assets/img/kingfisher.png" alt="Kingfisher">
</div>
<div class="project-card-title-container">
<div class="project-card-title-background"></div>
<h3 class="project-card-title">Kingfisher</h3>
</div>
<div class="project-card-short-desc">
<p>Story-based action/puzzle game raising awareness about Autism.</p>
</div>
<div class="project-card-content">
<p>The project [[Kingfisher|https://kingfisher-game.com/]] is a game built by PossilbyPixels that raises awareness about Autism. It is a story-based action / puzzle game for PC and mobile. My role in the project was to build minigames that occur throughout the story and also to develop tools to help development. One of the tools I made for this project was a suburban neighborhood generator. This tool allowed us to draw streets in the editor which then were automatically filled with procedurally generated houses and gardens. You can see a demo in [[this video|/assets/vid/procedural_streets.mp4]]. You can wishlist the game on [[Steam|https://store.steampowered.com/app/4197280/Kingfisher_An_Autism_Tale/]]!</p>
</div>
</div>
<div class="project-card-new" data-full-desc="Between 2019 and 2024, I participated regularly in the Ludum Dare event. This event was all about creating games under tight deadlines of 48 hours and with no external resources such as audio or 3D art. After each event I published my game on [[Itch.io|https://coffeeplanet.itch.io/]] where they are still available for play. In the future I want to migrate them to this website. I want to especially highlight [[Cobor goes farming|https://coffeeplanet.itch.io/ludum-dare-51]] and [[Windy the Indie|https://coffeeplanet.itch.io/windy-the-indie]].">
<div class="toggle-icon">+</div>
<div class="project-card-image-container">
<img class="project-card-image" src="/assets/img/ludum_dare.png" alt="Ludum Dare">
</div>
<div class="project-card-title-container">
<div class="project-card-title-background"></div>
<h3 class="project-card-title">Ludum Dare</h3>
</div>
<div class="project-card-short-desc">
<p>Game jam participation with 48-hour deadlines and no external resources.</p>
</div>
<div class="project-card-content">
<p>Between 2019 and 2024, I participated regularly in the Ludum Dare event. This event was all about creating games under tight deadlines of 48 hours and with no external resources such as audio or 3D art. After each event I published my game on [[Itch.io|https://coffeeplanet.itch.io/]] where they are still available for play. In the future I want to migrate them to this website. I want to especially highlight [[Cobor goes farming|https://coffeeplanet.itch.io/ludum-dare-51]] and [[Windy the Indie|https://coffeeplanet.itch.io/windy-the-indie]].</p>
</div>
</div>
<div class="project-card-new" data-full-desc="For my Masterthesis at Group T KU Leuven I made a tool for Unity that creates a procedural planet terrain. The main challenge of this project was to optimize the algorithm to work as fast as possible. For this I leveraged GPU compute shaders to process large chunks of data at once. You can find the tool and my thesis paper [[here|https://github.com/DouweRavers/ThesisProject-ThePlanetEngine/tree/main]].">
<div class="toggle-icon">+</div>
<div class="project-card-image-container">
<img class="project-card-image" src="/assets/img/thesis_tool.png" alt="Planet Tool">
</div>
<div class="project-card-title-container">
<div class="project-card-title-background"></div>
<h3 class="project-card-title">Masterthesis: Planet Tool</h3>
</div>
<div class="project-card-short-desc">
<p>Procedural planet terrain generation with GPU compute shaders.</p>
</div>
<div class="project-card-content">
<p>For my Masterthesis at Group T KU Leuven I made a tool for Unity that creates a procedural planet terrain. The main challenge of this project was to optimize the algorithm to work as fast as possible. For this I leveraged GPU compute shaders to process large chunks of data at once. You can find the tool and my thesis paper [[here|https://github.com/DouweRavers/ThesisProject-ThePlanetEngine/tree/main]].</p>
</div>
</div>
<div class="project-card-new" data-full-desc="In another project during my masters we explored gesture-based interactions in virtual environments. For this project we developed a prototype using Unity and custom wearable hardware to enable magic-like hand gestures for interfacing with a story game. See the game [[here|/assets/vid/wizard_gloves.mp4]] or you can find the game and paper [[here|https://github.com/DouweRavers/MasterProject-WizardsGlovesAdventure/tree/main]].">
<div class="toggle-icon">+</div>
<div class="project-card-image-container">
<img class="project-card-image" src="/assets/img/wizard_gloves.png" alt="Wizard Gloves">
</div>
<div class="project-card-title-container">
<div class="project-card-title-background"></div>
<h3 class="project-card-title">Masterproject: Wizard Gloves</h3>
</div>
<div class="project-card-short-desc">
<p>Gesture-based interaction with wearable hardware for virtual environments.</p>
</div>
<div class="project-card-content">
<p>In another project during my masters we explored gesture-based interactions in virtual environments. For this project we developed a prototype using Unity and custom wearable hardware to enable magic-like hand gestures for interfacing with a story game. See the game [[here|/assets/vid/wizard_gloves.mp4]] or you can find the game and paper [[here|https://github.com/DouweRavers/MasterProject-WizardsGlovesAdventure/tree/main]].</p>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="apps" class="scroll_section">
<h1>Douwco Apps</h1>
<div class="content-box">
<p>
Under construction...
</p>
<div class="apps-container">
<div class="carousel-container-full">
<div class="carousel-track-full" id="apps-carousel">
<div class="carousel-item-full" data-index="0" data-selected="true">
<div class="service-icon-large" style="--icon-bg: #e94e36;">
<span class="icon-placeholder-large">G</span>
</div>
<span class="service-label-large">Gitea</span>
</div>
<div class="carousel-item-full" data-index="1">
<div class="service-icon-large" style="--icon-bg: #0082c9;">
<span class="icon-placeholder-large">N</span>
</div>
<span class="service-label-large">Nextcloud</span>
</div>
<div class="carousel-item-full" data-index="2">
<div class="service-icon-large" style="--icon-bg: #f16521;">
<span class="icon-placeholder-large">P</span>
</div>
<span class="service-label-large">Penpot</span>
</div>
<div class="carousel-item-full" data-index="3">
<div class="service-icon-large" style="--icon-bg: #4a90d9;">
<span class="icon-placeholder-large">B</span>
</div>
<span class="service-label-large">Beszel</span>
</div>
<div class="carousel-item-full" data-index="4">
<div class="service-icon-large" style="--icon-bg: #7d3c98;">
<span class="icon-placeholder-large">W</span>
</div>
<span class="service-label-large">Wattif</span>
</div>
</div>
<button class="carousel-nav-full prev" aria-label="Previous">&#10094;</button>
<button class="carousel-nav-full next" aria-label="Next">&#10095;</button>
</div>
<div class="service-detail-full" id="apps-detail">
<div class="service-screenshot-full">
<img src="/assets/img/gitea_screenshot.png" alt="Gitea screenshot" id="apps-screenshot-img">
</div>
<div class="service-info-full">
<h2 class="service-title" id="apps-title">Gitea</h2>
<div class="service-description-full" id="apps-description">
<p>Self-hosted Git service with a simple and lightweight interface.</p>
</div>
<a href="https://gitea.douwco.be" target="_blank" rel="noopener" class="go-to-app-button" id="apps-link">Go to App</a>
</div>
</div>
</div>
</section>
<section id="games" class="scroll_section">
<h1>My Games</h1>
<div class="content-box">
<p>
Under construction...
</p>
<div class="games-container">
<div class="games-grid" id="games-grid">
<div class="game-card" data-title="Ludum Dare 51: Cobor goes farming" data-year="2022" data-description="A farming game made in 48 hours for Ludum Dare 51." data-url="https://coffeeplanet.itch.io/ludum-dare-51">
<div class="game-card-image">
<img src="/assets/img/games/ludum51_placeholder.png" alt="Cobor goes farming">
</div>
<div class="game-card-content">
<h3 class="game-card-title">Cobor goes farming</h3>
<p class="game-card-description">A farming game made in 48 hours.</p>
<span class="game-year-badge">2022</span>
</div>
<div class="game-card-expanded">
<p class="game-card-full-description">A farming game made in 48 hours for Ludum Dare 51. Features crop planting, animal husbandry, and resource management.</p>
<a href="https://coffeeplanet.itch.io/ludum-dare-51" target="_blank" rel="noopener" class="play-button">Play Game</a>
</div>
</div>
<div class="game-card" data-title="Ludum Dare 50" data-year="2022" data-description="A puzzle platformer with a unique mechanic." data-url="https://coffeeplanet.itch.io/">
<div class="game-card-image">
<img src="/assets/img/games/ludum50_placeholder.png" alt="Ludum Dare 50">
</div>
<div class="game-card-content">
<h3 class="game-card-title">Platform Puzzler</h3>
<p class="game-card-description">A puzzle platformer game.</p>
<span class="game-year-badge">2022</span>
</div>
<div class="game-card-expanded">
<p class="game-card-full-description">A puzzle platformer with a unique mechanic. Solve puzzles by manipulating the environment and your character.</p>
<a href="https://coffeeplanet.itch.io/" target="_blank" rel="noopener" class="play-button">Play Game</a>
</div>
</div>
<div class="game-card" data-title="Ludum Dare 49" data-year="2021" data-description="A top-down adventure with exploration." data-url="https://coffeeplanet.itch.io/">
<div class="game-card-image">
<img src="/assets/img/games/ludum49_placeholder.png" alt="Ludum Dare 49">
</div>
<div class="game-card-content">
<h3 class="game-card-title">Adventure Quest</h3>
<p class="game-card-description">A top-down adventure game.</p>
<span class="game-year-badge">2021</span>
</div>
<div class="game-card-expanded">
<p class="game-card-full-description">A top-down adventure with exploration, enemies, and treasure collection. Made in 48 hours for Ludum Dare 49.</p>
<a href="https://coffeeplanet.itch.io/" target="_blank" rel="noopener" class="play-button">Play Game</a>
</div>
</div>
<div class="game-card" data-title="Ludum Dare 48" data-year="2021" data-description="A minimalist arcade game." data-url="https://coffeeplanet.itch.io/">
<div class="game-card-image">
<img src="/assets/img/games/ludum48_placeholder.png" alt="Ludum Dare 48">
</div>
<div class="game-card-content">
<h3 class="game-card-title">Arcade Shooter</h3>
<p class="game-card-description">A minimalist arcade shooter.</p>
<span class="game-year-badge">2021</span>
</div>
<div class="game-card-expanded">
<p class="game-card-full-description">A minimalist arcade shooter with wave-based gameplay and power-ups. Created for Ludum Dare 48.</p>
<a href="https://coffeeplanet.itch.io/" target="_blank" rel="noopener" class="play-button">Play Game</a>
</div>
</div>
<div class="game-card" data-title="Ludum Dare 47" data-year="2020" data-description="A story-driven puzzle game." data-url="https://coffeeplanet.itch.io/">
<div class="game-card-image">
<img src="/assets/img/games/ludum47_placeholder.png" alt="Ludum Dare 47">
</div>
<div class="game-card-content">
<h3 class="game-card-title">Story Puzzles</h3>
<p class="game-card-description">A story-driven puzzle game.</p>
<span class="game-year-badge">2020</span>
</div>
<div class="game-card-expanded">
<p class="game-card-full-description">A story-driven puzzle game where each level reveals part of the narrative. Made in 48 hours for Ludum Dare 47.</p>
<a href="https://coffeeplanet.itch.io/" target="_blank" rel="noopener" class="play-button">Play Game</a>
</div>
</div>
<div class="game-card" data-title="Windy the Indie" data-year="2024" data-description="A platformer about indie game development." data-url="https://coffeeplanet.itch.io/windy-the-indie">
<div class="game-card-image">
<img src="/assets/img/games/windy_placeholder.png" alt="Windy the Indie">
</div>
<div class="game-card-content">
<h3 class="game-card-title">Windy the Indie</h3>
<p class="game-card-description">A platformer about indie development.</p>
<span class="game-year-badge">2024</span>
</div>
<div class="game-card-expanded">
<p class="game-card-full-description">A platformer game about the journey of indie game development. Features challenging levels and a touching story.</p>
<a href="https://coffeeplanet.itch.io/windy-the-indie" target="_blank" rel="noopener" class="play-button">Play Game</a>
</div>
</div>
</div>
</div>
</section>
</main>