Fix hover to preview once and for all
This commit is contained in:
@@ -1,56 +1,52 @@
|
|||||||
const sleep = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms));
|
function initGalleryPreviews() {
|
||||||
var old_timestamp = document.getElementById('ts_reference').value;
|
const previews = document.querySelectorAll('.preview-gallery');
|
||||||
|
|
||||||
function initPreviews() {
|
previews.forEach((img) => {
|
||||||
var thumbs = document.querySelectorAll('div[data-thumbs]');
|
// Prevent double initialization
|
||||||
thumbs.forEach(function (thumb) {
|
if (img.dataset.previewInitialized) return;
|
||||||
var thumbsJSON = JSON.parse(thumb.dataset.thumbs);
|
|
||||||
var originalImage = thumb.children[0].children[1].src;
|
|
||||||
var interval;
|
|
||||||
var i = 1;
|
|
||||||
|
|
||||||
function clear() {
|
img.dataset.previewInitialized = 'true';
|
||||||
thumb.children[0].children[1].src = originalImage;
|
|
||||||
i = 1;
|
let images = [];
|
||||||
clearTimeout(interval);
|
|
||||||
|
try {
|
||||||
|
images = JSON.parse(img.dataset.gallery);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Invalid gallery JSON', e);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggle() {
|
if (images.length <= 1) return;
|
||||||
if (i == 0) {
|
|
||||||
clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
thumb.children[0].children[1].src = thumbsJSON[i];
|
const original = img.src;
|
||||||
i = (i + 1) % thumbsJSON.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
function interval() {
|
let index = 0;
|
||||||
// Start Preview
|
let interval = null;
|
||||||
interval = setInterval(toggle, 700);
|
|
||||||
}
|
|
||||||
|
|
||||||
thumb.addEventListener('mouseenter', interval);
|
const startPreview = () => {
|
||||||
thumb.addEventListener('mouseleave', clear);
|
console.log("startPreview");
|
||||||
|
interval = setInterval(() => {
|
||||||
|
index = (index + 1) % images.length;
|
||||||
|
img.src = images[index];
|
||||||
|
}, 700);
|
||||||
|
};
|
||||||
|
|
||||||
|
const stopPreview = () => {
|
||||||
|
console.log("stopPreview");
|
||||||
|
clearInterval(interval);
|
||||||
|
interval = null;
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
img.src = original;
|
||||||
|
};
|
||||||
|
|
||||||
|
img.addEventListener('mouseenter', startPreview);
|
||||||
|
img.addEventListener('mouseleave', stopPreview);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function init() {
|
// Initial page load
|
||||||
for (let i = 0; i < 9; i++) {
|
document.addEventListener('DOMContentLoaded', initGalleryPreviews);
|
||||||
var new_timestamp = document.getElementById('ts_reference').value;
|
|
||||||
if (new_timestamp != old_timestamp) {
|
|
||||||
console.log('== Changed ==');
|
|
||||||
initPreviews();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
console.log('== Didnt Change ==');
|
|
||||||
await sleep(1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('contentChanged', event => {
|
// Livewire v3 navigation/update
|
||||||
console.log('== Received contentChanged Event ==');
|
document.addEventListener('contentChanged', initGalleryPreviews);
|
||||||
init();
|
|
||||||
});
|
|
||||||
|
|
||||||
initPreviews();
|
|
||||||
@@ -38,12 +38,19 @@
|
|||||||
class="aspect-[11/16] w-full object-cover object-center transform-gpu transition-transform duration-500 group-hover:scale-[1.02]"
|
class="aspect-[11/16] w-full object-cover object-center transform-gpu transition-transform duration-500 group-hover:scale-[1.02]"
|
||||||
>
|
>
|
||||||
@elseif ($view === 'thumbnail')
|
@elseif ($view === 'thumbnail')
|
||||||
|
@php
|
||||||
|
$galleryImages = $episode->gallery
|
||||||
|
->pluck('thumbnail_url')
|
||||||
|
->filter()
|
||||||
|
->values();
|
||||||
|
@endphp
|
||||||
<img
|
<img
|
||||||
src="{{ $episode->gallery->first()?->thumbnail_url }}"
|
src="{{ $galleryImages->first() }}"
|
||||||
alt="{{ $episode->title }} - {{ $episode->episode }}"
|
alt="{{ $episode->title }} - {{ $episode->episode }}"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
width="1000"
|
width="1000"
|
||||||
class="w-full object-cover object-center transform-gpu transition-transform duration-500 group-hover:scale-[1.02]"
|
data-gallery='@json($galleryImages)'
|
||||||
|
class="preview-gallery aspect-video w-full object-cover object-center transform-gpu transition-transform duration-500 group-hover:scale-[1.02]"
|
||||||
>
|
>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
|||||||
@@ -94,3 +94,6 @@
|
|||||||
|
|
||||||
<!-- Modals -->
|
<!-- Modals -->
|
||||||
@include('modals.language-selector')
|
@include('modals.language-selector')
|
||||||
|
|
||||||
|
<!-- Thumbnail hover -->
|
||||||
|
@vite(['resources/js/preview.js'])
|
||||||
@@ -24,5 +24,4 @@
|
|||||||
</div>
|
</div>
|
||||||
{{ $episodes->appends(['tags' => $selectedtags])->links('pagination::tailwind') }}
|
{{ $episodes->appends(['tags' => $selectedtags])->links('pagination::tailwind') }}
|
||||||
</div>
|
</div>
|
||||||
@vite(['resources/js/preview.js'])
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -24,5 +24,4 @@
|
|||||||
</div>
|
</div>
|
||||||
{{ $episodes->appends(['tags' => $selectedtags])->links('pagination::tailwind') }}
|
{{ $episodes->appends(['tags' => $selectedtags])->links('pagination::tailwind') }}
|
||||||
</div>
|
</div>
|
||||||
@vite(['resources/js/preview.js'])
|
|
||||||
</div
|
</div
|
||||||
|
|||||||
Reference in New Issue
Block a user