feat: Add breadcrumb navigation to every page

This commit is contained in:
Jesse Wierzbinski 2024-12-04 15:17:47 +01:00
parent 6934a5758e
commit 232abac215
No known key found for this signature in database
15 changed files with 119 additions and 44 deletions

View file

@ -18,6 +18,8 @@ import LeftSidebar from "./left-sidebar.vue";
import RightSidebar from "./right-sidebar.vue"; import RightSidebar from "./right-sidebar.vue";
const showRightSidebar = useSetting(SettingIds.NotificationsSidebar); const showRightSidebar = useSetting(SettingIds.NotificationsSidebar);
const route = useRoute();
</script> </script>
<template> <template>
@ -29,17 +31,17 @@ const showRightSidebar = useSetting(SettingIds.NotificationsSidebar);
<div class="flex items-center gap-2 px-4"> <div class="flex items-center gap-2 px-4">
<SidebarTrigger class="-ml-1" /> <SidebarTrigger class="-ml-1" />
<Separator orientation="vertical" class="mr-2 h-4" /> <Separator orientation="vertical" class="mr-2 h-4" />
<Breadcrumb> <Breadcrumb v-if="route.meta.breadcrumbs">
<BreadcrumbList> <BreadcrumbList>
<template v-for="(breadcrumb, index) of route.meta.breadcrumbs">
<BreadcrumbItem class="hidden md:block"> <BreadcrumbItem class="hidden md:block">
<BreadcrumbLink href="#"> <component :is="breadcrumb.href ? BreadcrumbLink : BreadcrumbPage" :href="breadcrumb.href">
Timelines {{ breadcrumb.text }}
</BreadcrumbLink> </component>
</BreadcrumbItem>
<BreadcrumbSeparator class="hidden md:block" />
<BreadcrumbItem>
<BreadcrumbPage>Home</BreadcrumbPage>
</BreadcrumbItem> </BreadcrumbItem>
<BreadcrumbSeparator v-if="index !== (route.meta.breadcrumbs.length - 1)"
class="hidden md:block" />
</template>
</BreadcrumbList> </BreadcrumbList>
</Breadcrumb> </Breadcrumb>
</div> </div>

View file

@ -2,11 +2,12 @@
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { Primitive, type PrimitiveProps } from "radix-vue"; import { Primitive, type PrimitiveProps } from "radix-vue";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { NuxtLink } from "#components";
const props = withDefaults( const props = withDefaults(
defineProps<PrimitiveProps & { class?: HTMLAttributes["class"] }>(), defineProps<PrimitiveProps & { class?: HTMLAttributes["class"] }>(),
{ {
as: "a", as: NuxtLink,
}, },
); );
</script> </script>

12
index.d.ts vendored Normal file
View file

@ -0,0 +1,12 @@
declare module "#app" {
interface PageMeta {
breadcrumbs?: {
text: string;
href?: string;
}[];
requiresAuth?: boolean;
}
}
// It is always important to import/export something when augmenting a type
export {};

View file

@ -16,6 +16,11 @@ import Note from "~/components/notes/note.vue";
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Note",
},
],
}); });
const element = ref<HTMLElement | null>(null); const element = ref<HTMLElement | null>(null);

View file

@ -24,15 +24,20 @@ import AccountProfile from "~/components/profiles/profile.vue";
import AccountTimeline from "~/components/timelines/account.vue"; import AccountTimeline from "~/components/timelines/account.vue";
import TimelineScroller from "~/components/timelines/timeline-scroller.vue"; import TimelineScroller from "~/components/timelines/timeline-scroller.vue";
definePageMeta({
layout: "app",
});
const route = useRoute(); const route = useRoute();
const username = (route.params.username as string).startsWith("@") const username = (route.params.username as string).startsWith("@")
? (route.params.username as string).substring(1) ? (route.params.username as string).substring(1)
: (route.params.username as string); : (route.params.username as string);
definePageMeta({
layout: "app",
breadcrumbs: [
{
text: "Profile",
},
],
});
const { account, isLoading } = useAccountFromAcct(client, username); const { account, isLoading } = useAccountFromAcct(client, username);
const accountId = computed(() => account.value?.id ?? undefined); const accountId = computed(() => account.value?.id ?? undefined);

View file

@ -12,5 +12,14 @@ import TimelineScroller from "~/components/timelines/timeline-scroller.vue";
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Timelines",
},
{
text: "Global",
href: "/global",
},
],
}); });
</script> </script>

View file

@ -12,5 +12,15 @@ import TimelineScroller from "~/components/timelines/timeline-scroller.vue";
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Timelines",
},
{
text: "Home",
href: "/home",
},
],
requiresAuth: true,
}); });
</script> </script>

View file

@ -1,17 +1,33 @@
<template> <template>
<div class="mx-auto max-w-2xl w-full"> <div class="mx-auto max-w-2xl w-full">
<TimelineScroller> <TimelineScroller>
<Public /> <Home v-if="identity" />
<Public v-else />
</TimelineScroller> </TimelineScroller>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import Home from "~/components/timelines/home.vue";
import Public from "~/components/timelines/public.vue"; import Public from "~/components/timelines/public.vue";
import TimelineScroller from "~/components/timelines/timeline-scroller.vue"; import TimelineScroller from "~/components/timelines/timeline-scroller.vue";
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Timelines",
},
identity.value
? {
text: "Home",
href: "/home",
}
: {
text: "Public",
href: "/public",
},
],
}); });
</script> </script>

View file

@ -13,5 +13,14 @@ import TimelineScroller from "~/components/timelines/timeline-scroller.vue";
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Timelines",
},
{
text: "Local",
href: "/local",
},
],
}); });
</script> </script>

View file

@ -25,5 +25,12 @@ import TimelineScroller from "~/components/timelines/timeline-scroller.vue";
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Notifications",
href: "/notifications",
},
],
requiresAuth: true,
}); });
</script> </script>

View file

@ -26,6 +26,12 @@ import {
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Preferences",
},
],
requiresAuth: true,
}); });
const route = useRoute(); const route = useRoute();

View file

@ -28,6 +28,12 @@ import { Input } from "~/components/ui/input";
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Preferences",
},
],
requiresAuth: true,
}); });
const emojis = computed( const emojis = computed(

View file

@ -7,5 +7,11 @@
<script lang="ts" setup> <script lang="ts" setup>
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Preferences",
},
],
requiresAuth: true,
}); });
</script> </script>

View file

@ -12,5 +12,14 @@ import TimelineScroller from "~/components/timelines/timeline-scroller.vue";
definePageMeta({ definePageMeta({
layout: "app", layout: "app",
breadcrumbs: [
{
text: "Timelines",
},
{
text: "Public",
href: "/public",
},
],
}); });
</script> </script>

View file

@ -1,28 +0,0 @@
<template>
<!-- <SettingsSidebar>
<template #behaviour>
<SettingPage :page="SettingPages.Behaviour" />
</template>
<template #appearance>
<SettingPage :page="SettingPages.Appearance" />
</template>
<template #account>
<ProfileEditor />
</template>
<template #emojis>
<EmojiEditor />
</template>
</SettingsSidebar> -->
</template>
<script setup lang="ts">
/* import EmojiEditor from "~/components/settings/emojis/emojis.vue";
import SettingPage from "~/components/settings/page.vue";
import ProfileEditor from "~/components/settings/profile-editor.vue";
import SettingsSidebar from "~/components/sidebars/settings-sidebar.vue";
import { SettingPages } from "~/settings";
definePageMeta({
layout: "app",
}); */
</script>