diff --git a/src/lib/components/Carousel/UICarousel.svelte b/src/lib/components/Carousel/UICarousel.svelte index 062d88e..f9b5f8c 100644 --- a/src/lib/components/Carousel/UICarousel.svelte +++ b/src/lib/components/Carousel/UICarousel.svelte @@ -28,12 +28,13 @@ direction="horizontal" class={classNames( $$restProps.class, - 'overflow-x-auto scrollbar-hide relative p-1 overflow-y-visible' + 'overflow-x-auto scrollbar-hide relative overflow-y-visible' )} style={`mask-image: linear-gradient(to right, transparent 0%, ${ fadeLeft ? '' : 'black 0%, ' }black 5%, black 95%, ${fadeRight ? '' : 'black 100%, '}transparent 100%);`} on:scroll={updateScrollPosition} + on:enter bind:this={element} let:focusIndex > diff --git a/src/lib/components/DetachedPage/DetachedPage.svelte b/src/lib/components/DetachedPage/DetachedPage.svelte index 7a2933e..14e5d37 100644 --- a/src/lib/components/DetachedPage/DetachedPage.svelte +++ b/src/lib/components/DetachedPage/DetachedPage.svelte @@ -36,9 +36,10 @@ diff --git a/src/lib/components/ScrollHelper.svelte b/src/lib/components/ScrollHelper.svelte index c4ff87f..2414f62 100644 --- a/src/lib/components/ScrollHelper.svelte +++ b/src/lib/components/ScrollHelper.svelte @@ -11,6 +11,8 @@ const verticalScrollParent = getScrollParent(div, 'vertical'); const horizontalScrollParent = getScrollParent(div, 'horizontal'); + console.log('verticalScrollParent', verticalScrollParent); + function handler() { scrollTop = verticalScrollParent ? verticalScrollParent.scrollTop : scrollTop; scrollLeft = horizontalScrollParent ? horizontalScrollParent.scrollLeft : scrollLeft; diff --git a/src/lib/components/SeriesPage/EpisodeGrid.svelte b/src/lib/components/SeriesPage/EpisodeGrid.svelte index b3c2fc6..1167b3e 100644 --- a/src/lib/components/SeriesPage/EpisodeGrid.svelte +++ b/src/lib/components/SeriesPage/EpisodeGrid.svelte @@ -75,14 +75,15 @@ {#each $tmdbSeasons || [] as season, i} handleMountCard(e.detail, episode)} - on:enter={scrollIntoView({ vertical: 64 })} + on:enter={scrollIntoView({ top: 92, bottom: 128 })} {episode} handlePlay={jellyfinEpisodeId ? () => playerState.streamJellyfinId(jellyfinEpisodeId) @@ -137,7 +138,7 @@ openSeasonMediaManager(id, seasonIndex + 1)} - on:enter={scrollIntoView({ vertical: 64 })} + on:enter={scrollIntoView({ top: 92, bottom: 128 })} /> {/if} diff --git a/src/lib/components/SeriesPage/SeriesPage.svelte b/src/lib/components/SeriesPage/SeriesPage.svelte index a0a5098..5fa8083 100644 --- a/src/lib/components/SeriesPage/SeriesPage.svelte +++ b/src/lib/components/SeriesPage/SeriesPage.svelte @@ -59,7 +59,7 @@
{ if (detail.direction === 'down' && detail.willLeaveContainer) { @@ -112,7 +112,9 @@ >

-
+
{series.overview}
{/if} @@ -170,7 +172,7 @@ })} > {#await $tmdbSeries then series} - +
Show Cast
{#each series?.aggregate_credits?.cast?.slice(0, 15) || [] as credit} {/await} {#await $recommendations then recommendations} - +
Recommendations
{#each recommendations || [] as recommendation} @@ -199,7 +201,7 @@ {/await}
{#await $tmdbSeries then series} - +

More Information

diff --git a/src/lib/components/VideoPlayer/ProgressBar.svelte b/src/lib/components/VideoPlayer/ProgressBar.svelte index 573834d..d654998 100644 --- a/src/lib/components/VideoPlayer/ProgressBar.svelte +++ b/src/lib/components/VideoPlayer/ProgressBar.svelte @@ -97,7 +97,7 @@ on:touchend={handleStopSeeking} /> -
+
{formatSecondsToTime(progressTime)} -{formatSecondsToTime(totalTime - progressTime)}
diff --git a/src/lib/components/VideoPlayer/VideoPlayer.svelte b/src/lib/components/VideoPlayer/VideoPlayer.svelte index 49782cf..20ceb0c 100644 --- a/src/lib/components/VideoPlayer/VideoPlayer.svelte +++ b/src/lib/components/VideoPlayer/VideoPlayer.svelte @@ -163,7 +163,9 @@ class="flex justify-between px-2 py-4 items-end" >
-
{subtitle}
+
+ {subtitle} +

{title}

@@ -176,7 +178,7 @@ }); }} > - + { @@ -189,7 +191,7 @@ }); }} > - +
diff --git a/src/lib/selectable.ts b/src/lib/selectable.ts index b9e4eda..2a3e6b4 100644 --- a/src/lib/selectable.ts +++ b/src/lib/selectable.ts @@ -250,7 +250,10 @@ export class Selectable { // Cycle siblings if (indexAddition !== 0) { - let index = focusIndex + indexAddition; + let index = + focusIndex === selectable.children.length - 1 + ? focusIndex + indexAddition + : Math.min(focusIndex + indexAddition, selectable.children.length - 1); while (index >= 0 && index < selectable.children.length) { const child = selectable.children[index]; if (child && child.isFocusable()) { @@ -890,18 +893,36 @@ export const scrollElementIntoView = (htmlElement: HTMLElement, offsets: Offsets let top = -1; if (offsets.top !== undefined && offsets.bottom !== undefined) { - top = - boundingRect.y - parentBoundingRect.y < offsets.top - ? boundingRect.y - parentBoundingRect.y + verticalParent.scrollTop - offsets.top - : boundingRect.y - parentBoundingRect.y + htmlElement.clientHeight > - verticalParent.clientHeight - offsets.bottom - ? boundingRect.y - - parentBoundingRect.y + - htmlElement.clientHeight + - verticalParent.scrollTop + - offsets.bottom - - verticalParent.clientHeight - : -1; + const topClipsAbove = boundingRect.y - parentBoundingRect.y < offsets.top; + const bottomClipsBelow = + boundingRect.y + boundingRect.height > + parentBoundingRect.y + parentBoundingRect.height - offsets.bottom; + + const distanceToParentTop = verticalParent.scrollTop + boundingRect.y - parentBoundingRect.y; + const distanceToParentBottom = + verticalParent.scrollHeight - + verticalParent.scrollTop - + (boundingRect.y - parentBoundingRect.y) - + boundingRect.height; + + const reverse = + boundingRect.height > verticalParent.clientHeight - offsets.top - offsets.bottom; + + if ( + (topClipsAbove && !bottomClipsBelow && !reverse) || + (!topClipsAbove && bottomClipsBelow && reverse) + ) { + top = distanceToParentTop - offsets.top; + } else if ( + (!topClipsAbove && bottomClipsBelow && !reverse) || + (topClipsAbove && !bottomClipsBelow && reverse) + ) { + top = + verticalParent.scrollHeight - + verticalParent.clientHeight - + distanceToParentBottom + + offsets.bottom; + } } else if (offsets.top !== undefined) { top = boundingRect.y - parentBoundingRect.y + verticalParent.scrollTop - offsets.top; } else if (offsets.bottom !== undefined) { diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 736c838..879dc4b 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,4 +1,5 @@ import { type Readable, writable } from 'svelte/store'; +import type { Selectable } from './selectable'; export function formatSecondsToTime(seconds: number) { const days = Math.floor(seconds / 60 / 60 / 24); @@ -110,11 +111,15 @@ export function getScrollParent( const parent = node.parentElement; if (parent) { + const { overflow } = window.getComputedStyle(parent); + if ( (direction === 'vertical' && parent.scrollHeight > parent.clientHeight) || (direction === 'horizontal' && parent.scrollWidth > parent.clientWidth) ) { return parent; + } else if (overflow.split(' ').every((o) => o === 'auto' || o === 'scroll')) { + return parent; } else { return getScrollParent(parent, direction); }