feat: add lightbox for viewing forest and reward images fullscreen
- Click any forest element or reward image to see it large - Smooth zoom-in animation, click anywhere to close - Hover effect on clickable images - Works on both forest grid and reward screen Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -195,6 +195,11 @@
|
|||||||
<span class="mute-btn__icon" id="mute-icon">🔊</span>
|
<span class="mute-btn__icon" id="mute-icon">🔊</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
<!-- Lightbox for forest element images -->
|
||||||
|
<div id="image-lightbox" class="lightbox" style="display:none">
|
||||||
|
<img id="lightbox-img" class="lightbox__img" src="" alt="">
|
||||||
|
</div>
|
||||||
|
|
||||||
<script type="module" src="/src/main.ts"></script>
|
<script type="module" src="/src/main.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+23
@@ -64,4 +64,27 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|||||||
};
|
};
|
||||||
document.addEventListener("click", initAudioOnce);
|
document.addEventListener("click", initAudioOnce);
|
||||||
document.addEventListener("keydown", initAudioOnce);
|
document.addEventListener("keydown", initAudioOnce);
|
||||||
|
|
||||||
|
// Lightbox: click on forest/reward images to view fullscreen
|
||||||
|
const lightbox = document.getElementById("image-lightbox")!;
|
||||||
|
const lightboxImg = document.getElementById("lightbox-img") as HTMLImageElement;
|
||||||
|
|
||||||
|
document.addEventListener("click", (e) => {
|
||||||
|
const target = e.target as HTMLElement;
|
||||||
|
// Open lightbox when clicking forest element or reward image
|
||||||
|
if (
|
||||||
|
(target.tagName === "IMG" && target.closest(".forest__element")) ||
|
||||||
|
(target.tagName === "IMG" && target.closest(".reward__image-area"))
|
||||||
|
) {
|
||||||
|
lightboxImg.src = (target as HTMLImageElement).src;
|
||||||
|
lightboxImg.alt = (target as HTMLImageElement).alt;
|
||||||
|
lightbox.style.display = "flex";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close lightbox on click
|
||||||
|
lightbox.addEventListener("click", () => {
|
||||||
|
lightbox.style.display = "none";
|
||||||
|
lightboxImg.src = "";
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -484,9 +484,15 @@ h3 {
|
|||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
|
cursor: pointer;
|
||||||
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.15));
|
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.15));
|
||||||
mask-image: radial-gradient(ellipse 70% 70% at center, black 50%, transparent 100%);
|
mask-image: radial-gradient(ellipse 70% 70% at center, black 50%, transparent 100%);
|
||||||
-webkit-mask-image: radial-gradient(ellipse 70% 70% at center, black 50%, transparent 100%);
|
-webkit-mask-image: radial-gradient(ellipse 70% 70% at center, black 50%, transparent 100%);
|
||||||
|
transition: transform 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.forest__element img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.forest__element--new {
|
.forest__element--new {
|
||||||
@@ -542,7 +548,13 @@ h3 {
|
|||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
|
cursor: pointer;
|
||||||
animation: reward-image-appear 0.8s ease-out;
|
animation: reward-image-appear 0.8s ease-out;
|
||||||
|
transition: transform 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reward__image-area img:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes reward-image-appear {
|
@keyframes reward-image-appear {
|
||||||
@@ -995,6 +1007,38 @@ h3 {
|
|||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Lightbox for viewing forest images fullscreen */
|
||||||
|
.lightbox {
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
background: rgba(61, 50, 37, 0.85);
|
||||||
|
z-index: 500;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
cursor: pointer;
|
||||||
|
animation: lightbox-fade-in 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lightbox__img {
|
||||||
|
max-width: 90vw;
|
||||||
|
max-height: 85vh;
|
||||||
|
object-fit: contain;
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
|
||||||
|
animation: lightbox-zoom-in 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes lightbox-fade-in {
|
||||||
|
from { opacity: 0; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes lightbox-zoom-in {
|
||||||
|
from { transform: scale(0.7); opacity: 0; }
|
||||||
|
to { transform: scale(1); opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
/* Error overlay — kindgerechte Fehlermeldung */
|
/* Error overlay — kindgerechte Fehlermeldung */
|
||||||
.error-overlay {
|
.error-overlay {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
|||||||
Reference in New Issue
Block a user