From 27e732940a6b86c20af0208e168ca40bad61ae9f Mon Sep 17 00:00:00 2001 From: TZGyn Date: Thu, 14 Mar 2024 00:45:54 +0800 Subject: [PATCH] added breadcrumbs and update layouts --- frontend/bun.lockb | Bin 148481 -> 148507 bytes frontend/package.json | 2 +- frontend/src/lib/components/sidebar.svelte | 13 -- .../ui/breadcrumb/breadcrumb-ellipsis.svelte | 23 +++ .../ui/breadcrumb/breadcrumb-item.svelte | 16 +++ .../ui/breadcrumb/breadcrumb-link.svelte | 34 +++++ .../ui/breadcrumb/breadcrumb-list.svelte | 23 +++ .../ui/breadcrumb/breadcrumb-page.svelte | 26 ++++ .../ui/breadcrumb/breadcrumb-separator.svelte | 24 ++++ .../ui/breadcrumb/breadcrumb.svelte | 15 ++ .../src/lib/components/ui/breadcrumb/index.ts | 25 ++++ frontend/src/routes/(app)/+layout.server.ts | 3 + frontend/src/routes/(app)/+layout.svelte | 136 ++++++++++++------ .../src/routes/(app)/links/+layout.server.ts | 10 ++ .../routes/(app)/projects/+layout.server.ts | 10 ++ .../routes/(app)/settings/+layout.server.ts | 10 ++ 16 files changed, 310 insertions(+), 60 deletions(-) create mode 100644 frontend/src/lib/components/ui/breadcrumb/breadcrumb-ellipsis.svelte create mode 100644 frontend/src/lib/components/ui/breadcrumb/breadcrumb-item.svelte create mode 100644 frontend/src/lib/components/ui/breadcrumb/breadcrumb-link.svelte create mode 100644 frontend/src/lib/components/ui/breadcrumb/breadcrumb-list.svelte create mode 100644 frontend/src/lib/components/ui/breadcrumb/breadcrumb-page.svelte create mode 100644 frontend/src/lib/components/ui/breadcrumb/breadcrumb-separator.svelte create mode 100644 frontend/src/lib/components/ui/breadcrumb/breadcrumb.svelte create mode 100644 frontend/src/lib/components/ui/breadcrumb/index.ts create mode 100644 frontend/src/routes/(app)/links/+layout.server.ts create mode 100644 frontend/src/routes/(app)/projects/+layout.server.ts create mode 100644 frontend/src/routes/(app)/settings/+layout.server.ts diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 1a0f593f5e01088fb4b7d116e8367d27e77d5dbc..fca65613cb2ad7282d191605b061021b82b9636d 100755 GIT binary patch delta 13457 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 bsbTT$N;(uP!!A)B`E?~VDlUsPwe|WR8|N6z delta 13429 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 bv9j import { page } from '$app/stores' - import UserIcon from './UserIcon.svelte' - - import { Separator } from '$lib/components/ui/separator' - import ThemeToggle from './theme-toggle.svelte' import { Button } from '$lib/components/ui/button' import { cn } from '$lib/utils' - export let email: string = '' let className: string | undefined = undefined export { className as class } @@ -25,14 +20,6 @@ className, )}>
-
-
- - {email} -
- -
-
{#each routes as route} - - - - Shortener - -
- - - -
-
-
-
- -
- + class="flex h-20 w-full items-center justify-between gap-6 p-4"> + + +
+ + + {#if $page.data.breadcrumbs} + {#each $page.data.breadcrumbs as breadcrumb, index} + {#if index == $page.data.breadcrumbs.length - 1} + + + {breadcrumb.name} + + + {:else} + + + {breadcrumb.name} + + + {/if} + {#if index != $page.data.breadcrumbs.length - 1} + + {/if} + {/each} + {:else} + + Home + + {/if} + + +
+ +
+
+ +
+
diff --git a/frontend/src/routes/(app)/links/+layout.server.ts b/frontend/src/routes/(app)/links/+layout.server.ts new file mode 100644 index 0000000..73ffb5c --- /dev/null +++ b/frontend/src/routes/(app)/links/+layout.server.ts @@ -0,0 +1,10 @@ +import type { LayoutServerLoad } from './$types' + +export const load = (async (event) => { + const { breadcrumbs: parentBreadcrumbs } = await event.parent() + const breadcrumbs = [ + ...parentBreadcrumbs, + { name: 'Links', path: '/links' }, + ] + return { breadcrumbs } +}) satisfies LayoutServerLoad diff --git a/frontend/src/routes/(app)/projects/+layout.server.ts b/frontend/src/routes/(app)/projects/+layout.server.ts new file mode 100644 index 0000000..9557ecb --- /dev/null +++ b/frontend/src/routes/(app)/projects/+layout.server.ts @@ -0,0 +1,10 @@ +import type { LayoutServerLoad } from './$types' + +export const load = (async (event) => { + const { breadcrumbs: parentBreadcrumbs } = await event.parent() + const breadcrumbs = [ + ...parentBreadcrumbs, + { name: 'Projects', path: '/projects' }, + ] + return { breadcrumbs } +}) satisfies LayoutServerLoad diff --git a/frontend/src/routes/(app)/settings/+layout.server.ts b/frontend/src/routes/(app)/settings/+layout.server.ts new file mode 100644 index 0000000..63d98cf --- /dev/null +++ b/frontend/src/routes/(app)/settings/+layout.server.ts @@ -0,0 +1,10 @@ +import type { LayoutServerLoad } from './$types' + +export const load = (async (event) => { + const { breadcrumbs: parentBreadcrumbs } = await event.parent() + const breadcrumbs = [ + ...parentBreadcrumbs, + { name: 'Settings', path: '/settings' }, + ] + return { breadcrumbs } +}) satisfies LayoutServerLoad