fix: dont scroll to end of episode list when completed, unimmerse on pointermove

This commit is contained in:
ThaUnknown 2025-05-24 21:18:34 +02:00
parent 12a08f9bb7
commit c5ff2a0104
No known key found for this signature in database
5 changed files with 24 additions and 8 deletions

View file

@ -1,6 +1,6 @@
{ {
"name": "ui", "name": "ui",
"version": "6.3.24", "version": "6.3.25",
"license": "BUSL-1.1", "license": "BUSL-1.1",
"private": true, "private": true,
"packageManager": "pnpm@9.14.4", "packageManager": "pnpm@9.14.4",

11
src/app.d.ts vendored
View file

@ -5,6 +5,7 @@ import { SvelteComponentTyped } from 'svelte'
import type { SessionMetadata } from '$lib/components/ui/player/util' import type { SessionMetadata } from '$lib/components/ui/player/util'
import type { Search } from '$lib/modules/anilist/queries' import type { Search } from '$lib/modules/anilist/queries'
import type { VariablesOf } from 'gql.tada' import type { VariablesOf } from 'gql.tada'
import type { CompositionEventHandler } from 'svelte/elements'
// for information about these interfaces // for information about these interfaces
export interface AuthResponse { export interface AuthResponse {
@ -137,13 +138,15 @@ declare global {
} }
} }
declare namespace svelteHTML {
interface HTMLAttributes<T> {
'on:navigate'?: CompositionEventHandler<T>
}
}
// declare module '*.svelte' { // declare module '*.svelte' {
// export default SvelteComponentTyped // export default SvelteComponentTyped
// } // }
} }
declare module '*.svelte' {
export default SvelteComponentTyped
}
export {} export {}

View file

@ -65,7 +65,7 @@
$: _progress = progress(media) ?? 0 $: _progress = progress(media) ?? 0
$: completed = list(media) === 'COMPLETED' $: completed = list(media) === 'COMPLETED'
let currentPage = Math.floor((progress(media) ?? 0) / perPage) + 1 $: currentPage = Math.floor((!completed ? _progress : 0) / perPage) + 1
function play (episode: number) { function play (episode: number) {
searchStore.set({ media, episode }) searchStore.set({ media, episode })

View file

@ -107,14 +107,24 @@
let seeking = false let seeking = false
let ended = false let ended = false
let paused = true let paused = true
let pointerMoving = false
const cast = false const cast = false
$: $isPlaying = !paused $: $isPlaying = !paused
$: buffering = readyState < 3 $: buffering = readyState < 3
$: immersed = !buffering && !seeking && !paused && !ended && !pictureInPictureElement $: immersed = !buffering && !paused && !ended && !pictureInPictureElement && !pointerMoving
$: isMiniplayer = $page.route.id !== '/app/player' $: isMiniplayer = $page.route.id !== '/app/player'
let pointerMoveTimeout = 0
function resetMove () {
clearTimeout(pointerMoveTimeout)
pointerMoving = true
pointerMoveTimeout = setTimeout(() => {
pointerMoving = false
}, 300)
}
// functions // functions
function playPause () { function playPause () {
playAnimation(paused ? 'play' : 'pause') playAnimation(paused ? 'play' : 'pause')
@ -663,7 +673,7 @@
<svelte:document bind:fullscreenElement bind:visibilityState use:holdToFF={'key'} /> <svelte:document bind:fullscreenElement bind:visibilityState use:holdToFF={'key'} />
<div class='w-full h-full relative content-center bg-black overflow-clip text-left' class:fitWidth class:seeking bind:this={wrapper}> <div class='w-full h-full relative content-center bg-black overflow-clip text-left' class:fitWidth class:seeking bind:this={wrapper} on:navigate={resetMove}>
<video class='w-full h-full' preload='auto' class:cursor-none={immersed} class:cursor-pointer={isMiniplayer} class:object-cover={fitWidth} class:opacity-0={$settings.playerDeband || seeking} class:absolute={$settings.playerDeband} class:top-0={$settings.playerDeband} <video class='w-full h-full' preload='auto' class:cursor-none={immersed} class:cursor-pointer={isMiniplayer} class:object-cover={fitWidth} class:opacity-0={$settings.playerDeband || seeking} class:absolute={$settings.playerDeband} class:top-0={$settings.playerDeband}
use:createSubtitles use:createSubtitles
use:createDeband={$settings.playerDeband} use:createDeband={$settings.playerDeband}
@ -688,6 +698,7 @@
on:timeupdate={checkSkippableChapters} on:timeupdate={checkSkippableChapters}
on:timeupdate={checkCompletion} on:timeupdate={checkCompletion}
on:loadedmetadata={autoPlay} on:loadedmetadata={autoPlay}
on:pointermove={resetMove}
/> />
<div class='absolute w-full h-full flex items-center justify-center top-0 pointer-events-none' class:hidden={isMiniplayer}> <div class='absolute w-full h-full flex items-center justify-center top-0 pointer-events-none' class:hidden={isMiniplayer}>
<div class='absolute top-0 flex w-full pointer-events-none justify-center gap-4 pt-3 items-center font-bold text-lg transition-opacity' class:opacity-0={immersed}> <div class='absolute top-0 flex w-full pointer-events-none justify-center gap-4 pt-3 items-center font-bold text-lg transition-opacity' class:opacity-0={immersed}>

View file

@ -266,6 +266,8 @@ function focusElement (element?: HTMLElement | null) {
if (isInput) setTimeout(() => { (element as HTMLInputElement).readOnly = false }) if (isInput) setTimeout(() => { (element as HTMLInputElement).readOnly = false })
element.scrollIntoView({ block: 'center', inline: 'center', behavior: 'smooth' }) element.scrollIntoView({ block: 'center', inline: 'center', behavior: 'smooth' })
element.dispatchEvent(new CustomEvent('navigate', { bubbles: true, composed: true, detail: { target: element.id, value: element.dataset.value } }))
return true return true
} }