159 lines
4.3 KiB
Plaintext
159 lines
4.3 KiB
Plaintext
---
|
|
import { getCollection, getEntry } from "astro:content";
|
|
import type { CollectionEntry } from "astro:content";
|
|
|
|
interface Props {
|
|
collectionName: CollectionEntry<"diaryMainPages">["slug"];
|
|
isOnTop?: boolean;
|
|
}
|
|
|
|
const { collectionName, isOnTop } = Astro.props;
|
|
const collectionTitle = (await getEntry("diaryMainPages", collectionName)).data.title;
|
|
|
|
const collection = (await getCollection(collectionName)).sort((a, b) => a.data.sorting - b.data.sorting);
|
|
|
|
const collectionBasePath = `/blog/${collectionName}`;
|
|
|
|
const currentIndex = collection.findIndex(entry => `${collectionBasePath}/${entry.slug}` === Astro.url.pathname);
|
|
const previousEntry = collection[currentIndex - 1];
|
|
const nextEntry = collection[currentIndex + 1];
|
|
|
|
const previousEntryLink = previousEntry ?
|
|
{show: true, href: `${collectionBasePath}/${previousEntry.slug}`, title: previousEntry.data.title} :
|
|
{show: currentIndex !== -1, href: collectionBasePath, title: collectionTitle};
|
|
const nextEntryLink = nextEntry ?
|
|
{href: `${collectionBasePath}/${nextEntry.slug}`, title: nextEntry.data.title} :
|
|
null ;
|
|
---
|
|
|
|
<nav class={isOnTop ? "top" : "bottom"}>
|
|
<span></span>
|
|
<span class="leftSelectSpace">
|
|
{ previousEntryLink.show ?
|
|
<a href={previousEntryLink.href}><<span class="longLink"> {previousEntryLink.title}</span><span class="shortLink"><</span></a> :
|
|
null
|
|
}
|
|
</span>
|
|
<span class="leftSelectSpaceSync">
|
|
{ nextEntryLink ?
|
|
<><<span class="longLink"> {nextEntryLink.title}</span><span class="shortLink"><</span></>
|
|
: null}
|
|
</span>
|
|
<span style={{ visibility: previousEntryLink.show ? "visible" : "hidden" }}> | </span>
|
|
<select class="selectField">
|
|
<option value={ collectionBasePath }>{ collectionTitle }</option>
|
|
{ collection.map(entry => <option value={`${collectionBasePath}/${entry.slug}`} selected={`${collectionBasePath}/${entry.slug}` === Astro.url.pathname}>{ entry.data.title }</option> ) }
|
|
</select>
|
|
<span style={{ visibility: nextEntryLink ? "visible" : "hidden" }}> | </span>
|
|
<span class="rightSelectSpace">
|
|
{ nextEntryLink ?
|
|
<a href={nextEntryLink.href}><span class="longLink">{nextEntryLink.title} </span><span class="shortLink">></span>></a> :
|
|
null
|
|
}
|
|
</span>
|
|
<span class="rightSelectSpaceSync">
|
|
{ previousEntryLink.show ?
|
|
<><span class="longLink">{previousEntryLink.title} </span><span class="shortLink">></span>></> :
|
|
null
|
|
}
|
|
</span>
|
|
<span></span>
|
|
</nav>
|
|
|
|
<script>
|
|
const selectElements = document.querySelectorAll(".selectField");
|
|
|
|
selectElements.forEach((el) => {
|
|
el.addEventListener("change", (event) => {
|
|
window.location.pathname = (event.target as HTMLSelectElement)?.value;
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
nav {
|
|
display: grid;
|
|
grid-template-columns: 1fr max-content max-content max-content max-content max-content 1fr;
|
|
align-items: center;
|
|
background: transparent;
|
|
padding: 10px;
|
|
|
|
&.top {
|
|
display: none;
|
|
margin: -50px -50px 20px;
|
|
border-bottom: 1px solid var(--blog_content-border);
|
|
|
|
@media screen and (max-width: 889px) {
|
|
& {
|
|
display: grid;
|
|
margin-top: -20px;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*&.bottom {
|
|
margin: 40px -50px -50px;
|
|
border-top: 1px solid var(--blog_content-border);
|
|
}*/
|
|
}
|
|
|
|
select {
|
|
padding: 5px;
|
|
border-radius: 1em;
|
|
border: 1px solid var(--blog_content-border);
|
|
background: var(--blog_background-main);
|
|
}
|
|
|
|
|
|
|
|
a:link, a:visited, a:active {
|
|
color: inherit;
|
|
text-decoration: none;
|
|
font-weight: bold;
|
|
text-overflow: clip;
|
|
}
|
|
|
|
a:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.longLink {
|
|
display: inline;
|
|
}
|
|
|
|
.shortLink {
|
|
display: none;
|
|
}
|
|
|
|
@media screen and (max-width: 599px) {
|
|
.longLink {
|
|
display: none;
|
|
}
|
|
.shortLink {
|
|
display: inline;
|
|
}
|
|
}
|
|
|
|
.leftSelectSpace {
|
|
grid-area: 1/2;
|
|
text-align: right;
|
|
}
|
|
|
|
.leftSelectSpaceSync {
|
|
grid-area: 1/2;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.rightSelectSpace {
|
|
grid-area: 1/6;
|
|
}
|
|
|
|
.rightSelectSpaceSync {
|
|
grid-area: 1/6;
|
|
visibility: hidden;
|
|
}
|
|
|
|
</style>
|