This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<NuxtRouteAnnouncer />
|
<NuxtRouteAnnouncer />
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<NuxtPage></NuxtPage>
|
<NuxtPage />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -28,5 +28,4 @@ onMounted(() => {
|
|||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
padding-right: 20px;
|
padding-right: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
@@ -1,55 +1,49 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const localePath = useLocalePath()
|
const localePath = useLocalePath()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
|
||||||
|
|
||||||
const scrollTargets: Record<string, string> = {
|
const scrollTargets: Record<string, string> = {
|
||||||
'index': 'top',
|
'index': '#top',
|
||||||
'blog': '#scroll-blog',
|
'blog': '#scroll-blog',
|
||||||
'contact': '#scroll-contact',
|
'contact': '#scroll-contact',
|
||||||
'art': '#scroll-art'
|
'art': '#scroll-art'
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentPath = computed(() => route.path)
|
const isHome = computed(() => route.path === localePath('index'))
|
||||||
|
|
||||||
function handleClick(targetKey: string, e: MouseEvent) {
|
function isActive(targetKey: string): boolean {
|
||||||
if (e.ctrlKey || e.metaKey || e.altKey || e.button !== 0) return
|
if (targetKey === 'index') return isHome.value
|
||||||
const isHome = currentPath.value === localePath('index')
|
const targetPath = localePath(targetKey)
|
||||||
if (!isHome) return
|
return route.path === targetPath
|
||||||
e.preventDefault()
|
}
|
||||||
|
|
||||||
|
function getToPath(targetKey: string): string {
|
||||||
|
if (isHome.value) {
|
||||||
const targetId = scrollTargets[targetKey] || 'top'
|
const targetId = scrollTargets[targetKey] || 'top'
|
||||||
if (targetId === 'top') {
|
return targetId.substring(1) !== '' ? '#' + targetId.substring(1) : '/'
|
||||||
window.scrollTo({ top: 0, behavior: 'smooth' })
|
|
||||||
} else {
|
|
||||||
const el = document.querySelector(targetId)
|
|
||||||
if (el) {
|
|
||||||
el.scrollIntoView({ behavior: 'smooth', block: 'start' })
|
|
||||||
} else {
|
|
||||||
const hash = targetId.substring(1)
|
|
||||||
router.replace({ hash })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return localePath(targetKey === 'index' ? 'index' : targetKey)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="tui-tabs">
|
<div class="tui-tabs">
|
||||||
<a :href="localePath('index')" class="tui-tab" @click="handleClick('index', $event)">
|
<NuxtLink :to="getToPath('index')" class="tui-tab" :class="{ 'tui-tab-active': isActive('index') }">
|
||||||
<span class="tab-sep" v-if="false">│</span>
|
<span class="tab-sep" v-if="false">│</span>
|
||||||
<span class="tab-label">/</span>
|
<span class="tab-label">/</span>
|
||||||
</a>
|
</NuxtLink>
|
||||||
<a :href="localePath('blog')" class="tui-tab" @click="handleClick('blog', $event)">
|
<NuxtLink :to="getToPath('blog')" class="tui-tab" :class="{ 'tui-tab-active': isActive('blog') }">
|
||||||
<span class="tab-sep">│</span>
|
<span class="tab-sep">│</span>
|
||||||
<span class="tab-label">/{{ $t('header.links.blog') }}</span>
|
<span class="tab-label">/{{ $t('header.links.blog') }}</span>
|
||||||
</a>
|
</NuxtLink>
|
||||||
<a :href="localePath('contact')" class="tui-tab" @click="handleClick('contact', $event)">
|
<NuxtLink :to="getToPath('contact')" class="tui-tab" :class="{ 'tui-tab-active': isActive('contact') }">
|
||||||
<span class="tab-sep">│</span>
|
<span class="tab-sep">│</span>
|
||||||
<span class="tab-label">/{{ $t('header.links.contact') }}</span>
|
<span class="tab-label">/{{ $t('header.links.contact') }}</span>
|
||||||
</a>
|
</NuxtLink>
|
||||||
<a :href="localePath('art')" class="tui-tab" @click="handleClick('art', $event)">
|
<NuxtLink :to="getToPath('art')" class="tui-tab" :class="{ 'tui-tab-active': isActive('art') }">
|
||||||
<span class="tab-sep">│</span>
|
<span class="tab-sep">│</span>
|
||||||
<span class="tab-label">/{{ $t('header.links.art') }}</span>
|
<span class="tab-label">/{{ $t('header.links.art') }}</span>
|
||||||
</a>
|
</NuxtLink>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -91,7 +85,7 @@ function handleClick(targetKey: string, e: MouseEvent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tui-tab.router-link-exact-active {
|
.tui-tab-active {
|
||||||
color: var(--color-background-fore);
|
color: var(--color-background-fore);
|
||||||
background-color: var(--color-link);
|
background-color: var(--color-link);
|
||||||
text-shadow: 0 0 8px rgba(255,255,255,0.3);
|
text-shadow: 0 0 8px rgba(255,255,255,0.3);
|
||||||
|
|||||||
@@ -271,9 +271,9 @@ const sectionTargets = {
|
|||||||
<h2 class="section-title">{{ t('pages.blog_heading') }}</h2>
|
<h2 class="section-title">{{ t('pages.blog_heading') }}</h2>
|
||||||
<ul class="tui-list">
|
<ul class="tui-list">
|
||||||
<li v-for="post in displayedBlogPosts" :key="post.slug" class="blog-entry">
|
<li v-for="post in displayedBlogPosts" :key="post.slug" class="blog-entry">
|
||||||
<a class="entry-link" :href="localePath({ name: 'blog-slug', params: { slug: post.slug } })">
|
<NuxtLink :to="localePath({ name: 'blog-slug', params: { slug: post.slug } })" class="entry-link">
|
||||||
<span class="entry-title">{{ post.title }}</span>
|
<span class="entry-title">{{ post.title }}</span>
|
||||||
</a>
|
</NuxtLink>
|
||||||
<span class="entry-meta">[{{ post.date }}] {{ post.description }}</span>
|
<span class="entry-meta">[{{ post.date }}] {{ post.description }}</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -294,9 +294,9 @@ const sectionTargets = {
|
|||||||
<Container>
|
<Container>
|
||||||
<h2 class="section-title">{{ t('pages.art_heading') }}</h2>
|
<h2 class="section-title">{{ t('pages.art_heading') }}</h2>
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<a v-for="art in displayedArtPosts" :key="art.slug"
|
<NuxtLink v-for="art in displayedArtPosts" :key="art.slug"
|
||||||
class="selector"
|
class="selector"
|
||||||
:href="isArtFallback(art) ? localePath(`/art/${art.slug}`) : localePath(`/art/${art.slug}`)">
|
:to="localePath(`/art/${art.slug}`)">
|
||||||
<span class="selector-border-top" aria-hidden="true">────────</span>
|
<span class="selector-border-top" aria-hidden="true">────────</span>
|
||||||
<img
|
<img
|
||||||
:src="art.thumb"
|
:src="art.thumb"
|
||||||
@@ -305,7 +305,7 @@ const sectionTargets = {
|
|||||||
/>
|
/>
|
||||||
<span class="selector-border-bottom" aria-hidden="true">────────</span>
|
<span class="selector-border-bottom" aria-hidden="true">────────</span>
|
||||||
<div class="overlay-label">{{ art.title }}</div>
|
<div class="overlay-label">{{ art.title }}</div>
|
||||||
</a>
|
</NuxtLink>
|
||||||
</div>
|
</div>
|
||||||
<p v-if="artPosts && artPosts.length > 0" class="show-more-link">
|
<p v-if="artPosts && artPosts.length > 0" class="show-more-link">
|
||||||
<NuxtLink :to="localePath('/art')" class="tui-link">{{ t('pages.show_more') }}</NuxtLink>
|
<NuxtLink :to="localePath('/art')" class="tui-link">{{ t('pages.show_more') }}</NuxtLink>
|
||||||
|
|||||||
Reference in New Issue
Block a user