Make home more responsive depending on screen width
This commit is contained in:
68
resources/js/responsive.js
Normal file
68
resources/js/responsive.js
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
function updateGrid(grid) {
|
||||||
|
// Skip hidden grids
|
||||||
|
if (grid.offsetParent === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const items = [...grid.querySelectorAll('.episode-item')];
|
||||||
|
|
||||||
|
if (!items.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset visibility first
|
||||||
|
items.forEach(item => {
|
||||||
|
item.style.display = '';
|
||||||
|
});
|
||||||
|
|
||||||
|
// Determine actual column count
|
||||||
|
const firstTop = items[0].offsetTop;
|
||||||
|
|
||||||
|
let columns = 0;
|
||||||
|
|
||||||
|
for (const item of items) {
|
||||||
|
if (item.offsetTop !== firstTop) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
columns++;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = parseInt(grid.dataset.rows || '2', 10);
|
||||||
|
|
||||||
|
const visibleItems = columns * rows;
|
||||||
|
|
||||||
|
items.forEach((item, index) => {
|
||||||
|
item.style.display = index < visibleItems
|
||||||
|
? ''
|
||||||
|
: 'none';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateAllEpisodeGrids() {
|
||||||
|
document.querySelectorAll('.episode-grid').forEach(updateGrid);
|
||||||
|
}
|
||||||
|
|
||||||
|
const observer = new IntersectionObserver(entries => {
|
||||||
|
entries.forEach(entry => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
updateGrid(entry.target);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll('.episode-grid').forEach(grid => {
|
||||||
|
observer.observe(grid);
|
||||||
|
});
|
||||||
|
|
||||||
|
let resizeTimeout;
|
||||||
|
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
clearTimeout(resizeTimeout);
|
||||||
|
|
||||||
|
resizeTimeout = setTimeout(() => {
|
||||||
|
updateAllEpisodeGrids();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener('load', updateAllEpisodeGrids);
|
||||||
@@ -28,4 +28,6 @@
|
|||||||
<div class="mx-auto pt-6 sm:px-6 lg:px-8 space-y-6 max-w-[100%] xl:max-w-[95%] 2xl:max-w-[85%] pb-2">
|
<div class="mx-auto pt-6 sm:px-6 lg:px-8 space-y-6 max-w-[100%] xl:max-w-[95%] 2xl:max-w-[85%] pb-2">
|
||||||
@include('home.partials.comments')
|
@include('home.partials.comments')
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@vite(['resources/js/responsive.js'])
|
||||||
</x-app-layout>
|
</x-app-layout>
|
||||||
@@ -5,12 +5,16 @@
|
|||||||
? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-6'
|
? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-6'
|
||||||
: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-8';
|
: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-8';
|
||||||
|
|
||||||
$limit = $isThumbnail ? 12 : 16;
|
// Render enough items for largest possible layout
|
||||||
|
$limit = 24;
|
||||||
|
|
||||||
$view = $isThumbnail ? 'thumbnail' : 'poster';
|
$view = $isThumbnail ? 'thumbnail' : 'poster';
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
<div class="grid {{ $gridClasses }}">
|
<div
|
||||||
|
class="episode-grid grid {{ $gridClasses }}"
|
||||||
|
data-rows="2"
|
||||||
|
>
|
||||||
@foreach ($episodes->take($limit) as $ep)
|
@foreach ($episodes->take($limit) as $ep)
|
||||||
@php
|
@php
|
||||||
$episode = isset($popularView)
|
$episode = isset($popularView)
|
||||||
@@ -18,9 +22,11 @@
|
|||||||
: $ep;
|
: $ep;
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
|
<div class="episode-item">
|
||||||
<x-episode-cover
|
<x-episode-cover
|
||||||
:episode="$episode"
|
:episode="$episode"
|
||||||
:view="$view"
|
:view="$view"
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
@@ -21,6 +21,7 @@ export default defineConfig({
|
|||||||
'resources/js/admin-edit.js',
|
'resources/js/admin-edit.js',
|
||||||
'resources/js/admin-subtitles.js',
|
'resources/js/admin-subtitles.js',
|
||||||
'resources/js/preview.js',
|
'resources/js/preview.js',
|
||||||
|
'resources/js/responsive.js',
|
||||||
'resources/js/stats.js'
|
'resources/js/stats.js'
|
||||||
],
|
],
|
||||||
refresh: true,
|
refresh: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user