feat: extract player controls timeline keyboard

This commit is contained in:
2026-05-10 18:34:21 +02:00
parent 99874974ad
commit ff1579345b
3 changed files with 324 additions and 0 deletions

58
static/player/keyboard.ts Normal file
View File

@@ -0,0 +1,58 @@
import { state } from './state'
import { displayTimeFromAbsolute, absoluteTimeFromDisplay, absoluteTimeFromRatio, getBounds } from './timeline'
import { showControls, toggleMute, togglePlayPause, toggleFullscreen, seekBy, setVolume, formatTime } from './controls'
export const setupKeyboard = (): void => {
document.addEventListener('keydown', (e) => {
const target = e.target as HTMLElement
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) return
switch (e.code) {
case 'Space':
case 'KeyK':
e.preventDefault()
togglePlayPause()
showControls()
break
case 'ArrowLeft':
case 'KeyJ':
e.preventDefault()
seekBy(-10)
break
case 'ArrowRight':
case 'KeyL':
e.preventDefault()
seekBy(10)
break
case 'ArrowUp':
e.preventDefault()
setVolume(state.video.volume + 0.05)
showControls()
break
case 'ArrowDown':
e.preventDefault()
setVolume(state.video.volume - 0.05)
showControls()
break
case 'KeyM':
e.preventDefault()
toggleMute()
showControls()
break
case 'KeyF':
e.preventDefault()
toggleFullscreen()
showControls()
break
default:
if (/^\d$/.test(e.key)) {
const b = getBounds()
if (b.duration > 0) {
e.preventDefault()
state.video.currentTime = absoluteTimeFromRatio(parseInt(e.key, 10) / 10)
showControls()
}
}
}
})
}