mirror of
https://github.com/versia-pub/frontend.git
synced 2025-12-06 08:28:20 +01:00
feat: ✨ Add breadcrumb navigation to every page
This commit is contained in:
parent
6934a5758e
commit
232abac215
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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
12
index.d.ts
vendored
Normal 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 {};
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -26,6 +26,12 @@ import {
|
||||||
|
|
||||||
definePageMeta({
|
definePageMeta({
|
||||||
layout: "app",
|
layout: "app",
|
||||||
|
breadcrumbs: [
|
||||||
|
{
|
||||||
|
text: "Preferences",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
requiresAuth: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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>
|
|
||||||
Loading…
Reference in a new issue