From 954723045242879ae2096a194d8452edcfe3d38b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 26 Mar 2026 15:04:10 +0000 Subject: [PATCH 01/13] fix(web): wire ToggleFullScreen keybind in media dialog Co-authored-by: andykais-claude --- packages/web/src/lib/keybinds.ts | 6 ++++ .../routes/browse/components/MediaView.svelte | 30 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/web/src/lib/keybinds.ts b/packages/web/src/lib/keybinds.ts index 2ac2670c..5b1b6f08 100644 --- a/packages/web/src/lib/keybinds.ts +++ b/packages/web/src/lib/keybinds.ts @@ -3,13 +3,19 @@ import type { Config } from '$lib/server/config.ts' type KeybindAction = + | 'OpenMedia' | 'Escape' | 'Search' + | 'AddTag' | 'PrevMedia' | 'NextMedia' | 'PrevTagSuggestion' | 'NextTagSuggestion' + | 'CopyMedia' + | 'ToggleFitMedia' + | 'ToggleFullScreen' | 'PlayPauseMedia' + | 'ToggleVideoMute' | 'ToggleMediaControls' | 'ToggleSidebar' | 'Star0' diff --git a/packages/web/src/routes/browse/components/MediaView.svelte b/packages/web/src/routes/browse/components/MediaView.svelte index 9f6ac754..ab06d212 100644 --- a/packages/web/src/routes/browse/components/MediaView.svelte +++ b/packages/web/src/routes/browse/components/MediaView.svelte @@ -7,9 +7,18 @@ // TODO wire this into settings let show_controls = $state(false); + let is_fullscreen = $state(false) + + const refresh_fullscreen_state = () => { + is_fullscreen = document.fullscreenElement === dialog + } controller.keybinds.component_listen({ Escape: e => { + if (document.fullscreenElement === dialog) { + document.exitFullscreen() + return + } dialog.close() controller.runes.media_selections.close_media() }, @@ -25,6 +34,16 @@ ToggleMediaControls: async e => { show_controls = !show_controls }, + ToggleFullScreen: async e => { + if (!dialog.open || !media_selections.current_selection.show) return + e.detail.data.keyboard_event.preventDefault() + + if (document.fullscreenElement === dialog) { + await document.exitFullscreen() + } else { + await dialog.requestFullscreen() + } + }, CopyMedia: async e => { if (media_selections.current_selection.media_response) { if (media_selections.current_selection.media_response.media_type === 'media_file') { @@ -77,11 +96,14 @@ + onclose={() => { + refresh_fullscreen_state() + controller.runes.media_selections.close_media() + }}>
{#if media_selections.current_selection.show && media_selections.current_selection.media_response} {#if media_selections.current_selection.media_response.media_type === 'media_file'} @@ -133,6 +155,8 @@
+ +