mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-04 03:27:09 -05:00 
			
		
		
		
	feat(web): add skip link to sidebar (#12330)
Co-authored-by: Alex <alex.tran1502@gmail.com>
This commit is contained in:
		
							parent
							
								
									ce2349d496
								
							
						
					
					
						commit
						c5848112bb
					
				@ -1,10 +1,12 @@
 | 
				
			|||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					  import { t } from 'svelte-i18n';
 | 
				
			||||||
  import Button from './button.svelte';
 | 
					  import Button from './button.svelte';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Target for the skip link to move focus to.
 | 
					   * Target for the skip link to move focus to.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  export let target: string = 'main';
 | 
					  export let target: string = 'main';
 | 
				
			||||||
 | 
					  export let text: string = $t('skip_to_content');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let isFocused = false;
 | 
					  let isFocused = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -22,6 +24,6 @@
 | 
				
			|||||||
    on:focus={() => (isFocused = true)}
 | 
					    on:focus={() => (isFocused = true)}
 | 
				
			||||||
    on:blur={() => (isFocused = false)}
 | 
					    on:blur={() => (isFocused = false)}
 | 
				
			||||||
  >
 | 
					  >
 | 
				
			||||||
    <slot />
 | 
					    {text}
 | 
				
			||||||
  </Button>
 | 
					  </Button>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,7 @@
 | 
				
			|||||||
 | 
					<script lang="ts" context="module">
 | 
				
			||||||
 | 
					  export const headerId = 'user-page-header';
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
  import { openFileUploadDialog } from '$lib/utils/file-uploader';
 | 
					  import { openFileUploadDialog } from '$lib/utils/file-uploader';
 | 
				
			||||||
  import NavigationBar from '../shared-components/navigation-bar/navigation-bar.svelte';
 | 
					  import NavigationBar from '../shared-components/navigation-bar/navigation-bar.svelte';
 | 
				
			||||||
@ -35,16 +39,14 @@
 | 
				
			|||||||
  </slot>
 | 
					  </slot>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <section class="relative">
 | 
					  <section class="relative">
 | 
				
			||||||
    {#if title || $$slots.title || $$slots.buttons}
 | 
					    {#if title || $$slots.buttons}
 | 
				
			||||||
      <div
 | 
					      <div
 | 
				
			||||||
        class="absolute flex h-16 w-full place-items-center justify-between border-b p-4 dark:border-immich-dark-gray dark:text-immich-dark-fg"
 | 
					        class="absolute flex h-16 w-full place-items-center justify-between border-b p-4 dark:border-immich-dark-gray dark:text-immich-dark-fg"
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        <div class="flex gap-2 items-center">
 | 
					        <div class="flex gap-2 items-center">
 | 
				
			||||||
          <slot name="title">
 | 
					          {#if title}
 | 
				
			||||||
            {#if title}
 | 
					            <div class="font-medium" tabindex="-1" id={headerId}>{title}</div>
 | 
				
			||||||
              <div class="font-medium">{title}</div>
 | 
					          {/if}
 | 
				
			||||||
            {/if}
 | 
					 | 
				
			||||||
          </slot>
 | 
					 | 
				
			||||||
          {#if description}
 | 
					          {#if description}
 | 
				
			||||||
            <p class="text-sm text-gray-400 dark:text-gray-600">{description}</p>
 | 
					            <p class="text-sm text-gray-400 dark:text-gray-600">{description}</p>
 | 
				
			||||||
          {/if}
 | 
					          {/if}
 | 
				
			||||||
 | 
				
			|||||||
@ -46,7 +46,7 @@
 | 
				
			|||||||
<svelte:window bind:innerWidth />
 | 
					<svelte:window bind:innerWidth />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<section id="dashboard-navbar" class="fixed z-[900] h-[var(--navbar-height)] w-screen text-sm">
 | 
					<section id="dashboard-navbar" class="fixed z-[900] h-[var(--navbar-height)] w-screen text-sm">
 | 
				
			||||||
  <SkipLink>{$t('skip_to_content')}</SkipLink>
 | 
					  <SkipLink text={$t('skip_to_content')} />
 | 
				
			||||||
  <div
 | 
					  <div
 | 
				
			||||||
    class="grid h-full grid-cols-[theme(spacing.18)_auto] items-center border-b bg-immich-bg py-2 dark:border-b-immich-dark-gray dark:bg-immich-dark-bg md:grid-cols-[theme(spacing.64)_auto]"
 | 
					    class="grid h-full grid-cols-[theme(spacing.18)_auto] items-center border-b bg-immich-bg py-2 dark:border-b-immich-dark-gray dark:bg-immich-dark-bg md:grid-cols-[theme(spacing.64)_auto]"
 | 
				
			||||||
  >
 | 
					  >
 | 
				
			||||||
 | 
				
			|||||||
@ -1144,6 +1144,8 @@
 | 
				
			|||||||
  "sign_up": "Sign up",
 | 
					  "sign_up": "Sign up",
 | 
				
			||||||
  "size": "Size",
 | 
					  "size": "Size",
 | 
				
			||||||
  "skip_to_content": "Skip to content",
 | 
					  "skip_to_content": "Skip to content",
 | 
				
			||||||
 | 
					  "skip_to_folders": "Skip to folders",
 | 
				
			||||||
 | 
					  "skip_to_tags": "Skip to tags",
 | 
				
			||||||
  "slideshow": "Slideshow",
 | 
					  "slideshow": "Slideshow",
 | 
				
			||||||
  "slideshow_settings": "Slideshow settings",
 | 
					  "slideshow_settings": "Slideshow settings",
 | 
				
			||||||
  "sort_albums_by": "Sort albums by...",
 | 
					  "sort_albums_by": "Sort albums by...",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
  import { goto } from '$app/navigation';
 | 
					  import { goto } from '$app/navigation';
 | 
				
			||||||
  import { page } from '$app/stores';
 | 
					  import { page } from '$app/stores';
 | 
				
			||||||
  import UserPageLayout from '$lib/components/layouts/user-page-layout.svelte';
 | 
					  import UserPageLayout, { headerId } from '$lib/components/layouts/user-page-layout.svelte';
 | 
				
			||||||
  import GalleryViewer from '$lib/components/shared-components/gallery-viewer/gallery-viewer.svelte';
 | 
					  import GalleryViewer from '$lib/components/shared-components/gallery-viewer/gallery-viewer.svelte';
 | 
				
			||||||
  import SideBarSection from '$lib/components/shared-components/side-bar/side-bar-section.svelte';
 | 
					  import SideBarSection from '$lib/components/shared-components/side-bar/side-bar-section.svelte';
 | 
				
			||||||
  import TreeItemThumbnails from '$lib/components/shared-components/tree/tree-item-thumbnails.svelte';
 | 
					  import TreeItemThumbnails from '$lib/components/shared-components/tree/tree-item-thumbnails.svelte';
 | 
				
			||||||
@ -16,6 +16,7 @@
 | 
				
			|||||||
  import { t } from 'svelte-i18n';
 | 
					  import { t } from 'svelte-i18n';
 | 
				
			||||||
  import type { PageData } from './$types';
 | 
					  import type { PageData } from './$types';
 | 
				
			||||||
  import Breadcrumbs from '$lib/components/shared-components/tree/breadcrumbs.svelte';
 | 
					  import Breadcrumbs from '$lib/components/shared-components/tree/breadcrumbs.svelte';
 | 
				
			||||||
 | 
					  import SkipLink from '$lib/components/elements/buttons/skip-link.svelte';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  export let data: PageData;
 | 
					  export let data: PageData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -48,6 +49,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<UserPageLayout title={data.meta.title}>
 | 
					<UserPageLayout title={data.meta.title}>
 | 
				
			||||||
  <SideBarSection slot="sidebar">
 | 
					  <SideBarSection slot="sidebar">
 | 
				
			||||||
 | 
					    <SkipLink target={`#${headerId}`} text={$t('skip_to_folders')} />
 | 
				
			||||||
    <section>
 | 
					    <section>
 | 
				
			||||||
      <div class="text-xs pl-4 mb-2 dark:text-white">{$t('explorer').toUpperCase()}</div>
 | 
					      <div class="text-xs pl-4 mb-2 dark:text-white">{$t('explorer').toUpperCase()}</div>
 | 
				
			||||||
      <div class="h-full">
 | 
					      <div class="h-full">
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@
 | 
				
			|||||||
  import Button from '$lib/components/elements/buttons/button.svelte';
 | 
					  import Button from '$lib/components/elements/buttons/button.svelte';
 | 
				
			||||||
  import LinkButton from '$lib/components/elements/buttons/link-button.svelte';
 | 
					  import LinkButton from '$lib/components/elements/buttons/link-button.svelte';
 | 
				
			||||||
  import Icon from '$lib/components/elements/icon.svelte';
 | 
					  import Icon from '$lib/components/elements/icon.svelte';
 | 
				
			||||||
  import UserPageLayout from '$lib/components/layouts/user-page-layout.svelte';
 | 
					  import UserPageLayout, { headerId } from '$lib/components/layouts/user-page-layout.svelte';
 | 
				
			||||||
  import AssetGrid from '$lib/components/photos-page/asset-grid.svelte';
 | 
					  import AssetGrid from '$lib/components/photos-page/asset-grid.svelte';
 | 
				
			||||||
  import FullScreenModal from '$lib/components/shared-components/full-screen-modal.svelte';
 | 
					  import FullScreenModal from '$lib/components/shared-components/full-screen-modal.svelte';
 | 
				
			||||||
  import {
 | 
					  import {
 | 
				
			||||||
@ -27,6 +27,7 @@
 | 
				
			|||||||
  import type { PageData } from './$types';
 | 
					  import type { PageData } from './$types';
 | 
				
			||||||
  import { dialogController } from '$lib/components/shared-components/dialog/dialog';
 | 
					  import { dialogController } from '$lib/components/shared-components/dialog/dialog';
 | 
				
			||||||
  import Breadcrumbs from '$lib/components/shared-components/tree/breadcrumbs.svelte';
 | 
					  import Breadcrumbs from '$lib/components/shared-components/tree/breadcrumbs.svelte';
 | 
				
			||||||
 | 
					  import SkipLink from '$lib/components/elements/buttons/skip-link.svelte';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  export let data: PageData;
 | 
					  export let data: PageData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -132,6 +133,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<UserPageLayout title={data.meta.title} scrollbar={false}>
 | 
					<UserPageLayout title={data.meta.title} scrollbar={false}>
 | 
				
			||||||
  <SideBarSection slot="sidebar">
 | 
					  <SideBarSection slot="sidebar">
 | 
				
			||||||
 | 
					    <SkipLink target={`#${headerId}`} text={$t('skip_to_tags')} />
 | 
				
			||||||
    <section>
 | 
					    <section>
 | 
				
			||||||
      <div class="text-xs pl-4 mb-2 dark:text-white">{$t('explorer').toUpperCase()}</div>
 | 
					      <div class="text-xs pl-4 mb-2 dark:text-white">{$t('explorer').toUpperCase()}</div>
 | 
				
			||||||
      <div class="h-full">
 | 
					      <div class="h-full">
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user