Replace raw anchor tags with Link component across views

Use Link component in Chat, CommitHistory, Stamps, Demoman, and fix Navbar to use span instead of nested anchors. Also updates Navbar inHome check for /stp route.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-25 02:43:32 +00:00
parent 69e158b871
commit 6dddcd4d7a
5 changed files with 29 additions and 17 deletions

View File

@@ -16,7 +16,7 @@ const parentPath = computed(() => {
}); });
const inHome = computed(() => { const inHome = computed(() => {
return route.path == "/"; return route.path == "/" || route.path == "/stp";
}); });
const faces = [ const faces = [
@@ -47,10 +47,10 @@ const faces_string = faces.join(" ");
<template> <template>
<nav class="flex flex-row w-full h-fit border border-primary bg-bg_primary"> <nav class="flex flex-row w-full h-fit border border-primary bg-bg_primary">
<RouterLink class="bdr-2 bg-bg_primary" to="/" v-if="!inHome"> <RouterLink class="bdr-2 bg-bg_primary" to="/" v-if="!inHome">
<a>HOME</a> <span>HOME</span>
</RouterLink> </RouterLink>
<RouterLink class="bdr-2 bg-bg_primary" v-if="parentPath" :to="parentPath"> <RouterLink class="bdr-2 bg-bg_primary" v-if="parentPath" :to="parentPath">
<a>UP</a> <span>UP</span>
</RouterLink> </RouterLink>
<Headline class="border flex-1 max-w-full"> <Headline class="border flex-1 max-w-full">
<code class="whitespace-pre">{{ faces_string }}</code> <code class="whitespace-pre">{{ faces_string }}</code>

View File

@@ -4,6 +4,7 @@ import Button from "@/components/input/Button.vue";
import { useMessagesStore } from "@/stores/messages"; import { useMessagesStore } from "@/stores/messages";
import { useAuthStore } from "@/stores/auth"; import { useAuthStore } from "@/stores/auth";
import Header from "@/components/text/Header.vue"; import Header from "@/components/text/Header.vue";
import Link from "@/components/text/Link.vue";
const messagesStore = useMessagesStore(); const messagesStore = useMessagesStore();
const authStore = useAuthStore(); const authStore = useAuthStore();
@@ -79,7 +80,7 @@ onUnmounted(() => {
</script> </script>
<template> <template>
<div class="flex-col flex min-h-0"> <div class="chat-root flex-col flex min-h-0">
<Header>Chat</Header> <Header>Chat</Header>
<div ref="messagesContainer" class="flex flex-col flex-1 min-h-0 overflow-y-auto overflow-x-hidden p-2 min-w-0"> <div ref="messagesContainer" class="flex flex-col flex-1 min-h-0 overflow-y-auto overflow-x-hidden p-2 min-w-0">
<p v-for="message in messages" :key="message.id" class="break-words min-w-0 w-full"> <p v-for="message in messages" :key="message.id" class="break-words min-w-0 w-full">
@@ -88,13 +89,13 @@ onUnmounted(() => {
v-for="(part, i) in parseMessageParts(message.text || '')" v-for="(part, i) in parseMessageParts(message.text || '')"
:key="i" :key="i"
> >
<a <Link
v-if="part.type === 'link'" v-if="part.type === 'link'"
bare
:href="part.value" :href="part.value"
target="_blank" target="_blank"
rel="noopener noreferrer"
class="text-primary underline break-all" class="text-primary underline break-all"
>{{ part.value }}</a >{{ part.value }}</Link
> >
<span v-else>{{ part.value }}</span> <span v-else>{{ part.value }}</span>
</template> </template>
@@ -112,9 +113,9 @@ onUnmounted(() => {
class="w-full max-w-full max-h-48 rounded block" class="w-full max-w-full max-h-48 rounded block"
@loadedmetadata="scrollToBottom" @loadedmetadata="scrollToBottom"
/> />
<a v-else :href="message.fileUrl" target="_blank" class="underline break-all">{{ <Link v-else bare :href="message.fileUrl" target="_blank" class="underline break-all">{{
message.fileUrl.split("/").pop() message.fileUrl.split("/").pop()
}}</a> }}</Link>
</template> </template>
</p> </p>
</div> </div>
@@ -139,3 +140,11 @@ onUnmounted(() => {
</div> </div>
</div> </div>
</template> </template>
<style scoped>
@media (max-width: 850px) {
.chat-root {
max-height: 400px;
}
}
</style>

View File

@@ -2,6 +2,7 @@
import { useHomeDataStore } from "@/stores/homeData"; import { useHomeDataStore } from "@/stores/homeData";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import Header from "@/components/text/Header.vue"; import Header from "@/components/text/Header.vue";
import Link from "@/components/text/Link.vue";
const homeData = useHomeDataStore(); const homeData = useHomeDataStore();
const { gitFeed: feed, loaded } = storeToRefs(homeData); const { gitFeed: feed, loaded } = storeToRefs(homeData);
@@ -18,9 +19,9 @@ const { gitFeed: feed, loaded } = storeToRefs(homeData);
<div v-else-if="feed" class="flex-1 flex flex-col overflow-y-auto"> <div v-else-if="feed" class="flex-1 flex flex-col overflow-y-auto">
<h3>Last git activity</h3> <h3>Last git activity</h3>
<img :src="feed.avatarUrl" alt="User avatar" class="avatar" /> <img :src="feed.avatarUrl" alt="User avatar" class="avatar" />
<a :href="feed.repoUrl"> <Link :href="feed.repoUrl">
<h3>repo: {{ feed.repoName }}</h3> <h3>repo: {{ feed.repoName }}</h3>
</a> </Link>
<p>Action: {{ feed.opType }}</p> <p>Action: {{ feed.opType }}</p>
<p>Message: {{ feed.commitMessage }}</p> <p>Message: {{ feed.commitMessage }}</p>
<small> {{ new Date(feed.createdAt).toLocaleString() }}</small> <small> {{ new Date(feed.createdAt).toLocaleString() }}</small>

View File

@@ -2,6 +2,7 @@
import { ref } from "vue"; import { ref } from "vue";
import Touchscreen from "@/components/util/Touchscreen.vue"; import Touchscreen from "@/components/util/Touchscreen.vue";
import Link from "@/components/text/Link.vue";
import { shuffleArray } from "@/js/utils.js"; import { shuffleArray } from "@/js/utils.js";
let srcs = [ let srcs = [
@@ -23,15 +24,15 @@ shuffleArray(srcs);
<template> <template>
<Touchscreen> <Touchscreen>
<div class="flex flex-wrap tst"> <div class="flex flex-wrap tst">
<a href="https://www.adam-french.co.uk"> <Link bare href="https://www.adam-french.co.uk">
<img src="https://www.adam-french.co.uk/img/stamps/mine.gif" /> <img src="https://www.adam-french.co.uk/img/stamps/mine.gif" />
</a> </Link>
<a href="https://jacobbarron.xyz"> <Link bare href="https://jacobbarron.xyz">
<img <img
src="https://jacobbarron.xyz/Banneh.gif" src="https://jacobbarron.xyz/Banneh.gif"
alt="jacobbarron.xyz" alt="jacobbarron.xyz"
/> />
</a> </Link>
<img v-for="src in srcs" :src="src" /> <img v-for="src in srcs" :src="src" />
</div> </div>
</Touchscreen> </Touchscreen>

View File

@@ -1,5 +1,6 @@
<script setup> <script setup>
import VideoTable from "@/components/util/VideoTable.vue"; import VideoTable from "@/components/util/VideoTable.vue";
import Link from "@/components/text/Link.vue";
const videoSources = [ const videoSources = [
{ name: "demoman", link: "/img/demoman/1760582395316219.webm" }, { name: "demoman", link: "/img/demoman/1760582395316219.webm" },
@@ -16,8 +17,8 @@ const videoSources = [
class="a4page-portrait bdr-1 flex flex-row relative overflow-scroll items-center" class="a4page-portrait bdr-1 flex flex-row relative overflow-scroll items-center"
> >
<p> <p>
<a href="https://wiki.teamfortress.com/wiki/Demoman" <Link href="https://wiki.teamfortress.com/wiki/Demoman"
>The goat</a >The goat</Link
> >
</p> </p>
<div> <div>