feat(web): скрытие боковых панелей в альбоме и хоткеи размера миниатюр

В режиме просмотра альбома добавлена кнопка скрытия левой и правой боковых
панелей (рядом с регулятором размера миниатюр) и хоткей Tab. В скрытом режиме
панели не занимают место в раскладке, а появляются по наведению на левую или
правую кромку окна и прячутся после ухода указателя.

Клавиши + и - меняют размер миниатюр на шаг, как кнопки регулятора; хоткей
работает на всех экранах приложения и не срабатывает при вводе текста, в
открытых диалогах и меню.

Спека ui-workspace дополнена требованиями о скрытии панелей и клавишах
изменения размера миниатюр.
This commit is contained in:
iu
2026-10-20 21:30:06 +03:00
parent 3a44844ff9
commit 45a953f8bb
7 changed files with 214 additions and 28 deletions
+2 -1
View File
@@ -11,6 +11,7 @@
let { children } = $props();
const showPanel = $derived($page.url.pathname !== '/');
const albumView = $derived($page.url.pathname.startsWith('/albums/'));
// Personal stream: one subscription for the whole session, kept alive across
// navigation inside the (app) group. The stream updates the album list
@@ -23,7 +24,7 @@
});
</script>
<AppShell panelVisible={showPanel}>
<AppShell panelVisible={showPanel} panelsToggle={albumView}>
{#snippet rail()}
<AlbumRail />
{/snippet}
@@ -18,6 +18,7 @@
import { viewerReturn } from '$lib/stores/viewer-return';
import { transfer } from '$lib/stores/transfer.svelte';
import { contextMenu, type ContextMenuItem } from '$lib/stores/context-menu.svelte';
import { panels } from '$lib/stores/panels.svelte';
import { SSEClient, type SSEEvent } from '$lib/sse';
import type { Album, Photo } from '$lib/types';
@@ -496,6 +497,18 @@
</div>
<div class="flex items-center gap-3">
<DensityControl />
<span class="bg-border hidden h-5 w-px shrink-0 lg:block" aria-hidden="true"></span>
<button
type="button"
class="text-text-muted hover:bg-bg-muted hover:text-text hidden items-center justify-center rounded-md p-1.5 lg:inline-flex"
aria-label={panels.hidden ? 'Показать боковые панели (Tab)' : 'Скрыть боковые панели (Tab)'}
title={panels.hidden ? 'Показать боковые панели (Tab)' : 'Скрыть боковые панели (Tab)'}
aria-keyshortcuts="Tab"
aria-pressed={panels.hidden}
onclick={() => panels.toggle()}
>
<Icon name={panels.hidden ? 'left_panel_open' : 'left_panel_close'} />
</button>
{#if canUpload}
<span class="bg-border h-5 w-px shrink-0" aria-hidden="true"></span>
<button