From cbea71d9ae2a6642f06c618b095dad6f9bbefbd8 Mon Sep 17 00:00:00 2001 From: w33b Date: Sun, 24 May 2026 12:06:44 +0200 Subject: [PATCH] Make home more responsive depending on screen width --- resources/js/responsive.js | 68 +++++++++++++++++++ resources/views/home/index.blade.php | 2 + .../home/partials/tab/template.blade.php | 18 +++-- vite.config.js | 1 + 4 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 resources/js/responsive.js diff --git a/resources/js/responsive.js b/resources/js/responsive.js new file mode 100644 index 0000000..bb56035 --- /dev/null +++ b/resources/js/responsive.js @@ -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); diff --git a/resources/views/home/index.blade.php b/resources/views/home/index.blade.php index 4dcb7e8..cc0c718 100644 --- a/resources/views/home/index.blade.php +++ b/resources/views/home/index.blade.php @@ -28,4 +28,6 @@
@include('home.partials.comments')
+ + @vite(['resources/js/responsive.js']) \ No newline at end of file diff --git a/resources/views/home/partials/tab/template.blade.php b/resources/views/home/partials/tab/template.blade.php index 4707141..b2d51fb 100644 --- a/resources/views/home/partials/tab/template.blade.php +++ b/resources/views/home/partials/tab/template.blade.php @@ -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-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'; @endphp -
+
@foreach ($episodes->take($limit) as $ep) @php $episode = isset($popularView) @@ -18,9 +22,11 @@ : $ep; @endphp - +
+ +
@endforeach
\ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 80f511a..acf5e54 100644 --- a/vite.config.js +++ b/vite.config.js @@ -21,6 +21,7 @@ export default defineConfig({ 'resources/js/admin-edit.js', 'resources/js/admin-subtitles.js', 'resources/js/preview.js', + 'resources/js/responsive.js', 'resources/js/stats.js' ], refresh: true,