mirror of
https://github.com/immich-app/immich.git
synced 2026-05-21 07:06:31 -04:00
92b6778d2d
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
52 lines
1.6 KiB
Svelte
52 lines
1.6 KiB
Svelte
<script lang="ts">
|
|
import { clickOutside } from '$lib/actions/click-outside';
|
|
import { focusTrap } from '$lib/actions/focus-trap';
|
|
import { menuButtonId } from '$lib/components/shared-components/navigation-bar/NavigationBar.svelte';
|
|
import { mediaQueryManager } from '$lib/stores/media-query-manager.svelte';
|
|
import { sidebarStore } from '$lib/stores/sidebar.svelte';
|
|
import { onMount, type Snippet } from 'svelte';
|
|
|
|
interface Props {
|
|
ariaLabel?: string;
|
|
children?: Snippet;
|
|
}
|
|
|
|
let { ariaLabel, children }: Props = $props();
|
|
|
|
const isHidden = $derived(!sidebarStore.isOpen && !mediaQueryManager.isFullSidebar);
|
|
const isExpanded = $derived(sidebarStore.isOpen && !mediaQueryManager.isFullSidebar);
|
|
|
|
onMount(() => {
|
|
closeSidebar();
|
|
});
|
|
|
|
const closeSidebar = () => {
|
|
if (!isExpanded) {
|
|
return;
|
|
}
|
|
sidebarStore.reset();
|
|
if (isHidden) {
|
|
document.querySelector<HTMLButtonElement>(`#${menuButtonId}`)?.focus();
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<nav
|
|
id="sidebar"
|
|
aria-label={ariaLabel}
|
|
tabindex="-1"
|
|
class="relative z-1 w-0 immich-scrollbar overflow-x-hidden overflow-y-auto bg-light pt-8 transition-all duration-200 sidebar:w-64"
|
|
class:shadow-2xl={isExpanded}
|
|
class:dark:border-e-immich-dark-gray={isExpanded}
|
|
class:border-r={isExpanded}
|
|
class:w-[min(100vw,16rem)]={sidebarStore.isOpen}
|
|
data-testid="sidebar-parent"
|
|
inert={isHidden}
|
|
use:clickOutside={{ onOutclick: closeSidebar, onEscape: closeSidebar }}
|
|
use:focusTrap={{ active: isExpanded }}
|
|
>
|
|
<div class="flex h-max min-h-full flex-col gap-1 pe-6">
|
|
{@render children?.()}
|
|
</div>
|
|
</nav>
|