~repos /website

#astro#js#html#css

git clone https://pyrossh.dev/repos/website.git

木 Personal website of pyrossh. Built with astrojs, shiki, vite.



src/layouts/FileLayout.astro



---
import { Icon } from "astro-icon/components";
import { type CollectionEntry } from "astro:content";
import allIcons from "@iconify-json/vscode-icons/icons.json" assert { type: "json" };
import RepoLayout from "@/layouts/RepoLayout.astro";
import { resolveFileIcon, type FileNode } from "@/utils/files";
type Props = {
repo: CollectionEntry<"repos">;
file: FileNode;
};
const { repo, file } = Astro.props;
const { pathname } = Astro.url;
const iconName = resolveFileIcon(file.name, file.ext);
const fileType = allIcons.icons[`file-type-${iconName}`]
? `file-type-${iconName}`
: "default-file";
---
<RepoLayout repo={repo}>
{
(
<div>
<hr />
<div class="title">
<Icon
name={`vscode-icons:${fileType}`}
size="24px"
color="hsl(0deg 75% 75%)"
/>
<h3>{file.name}</h3>
</div>
<hr />
<div class="nav">
<div>
<a
aria-current={
pathname == `/repos/${repo.id}/files/${file.name}`
? "true"
: "false"
}
href={`/repos/${repo.id}/files/${file.name}`}
>
Contents
</a>
</div>
<div>|</div>
<div>
<a
aria-current={
pathname == `/repos/${repo.id}/files/${file.name}/history`
? "true"
: "false"
}
href={`/repos/${repo.id}/files/${file.name}/history`}
>
History
</a>
</div>
<div>|</div>
<div>
<a
aria-current={
pathname == `/repos/${repo.id}/files/${file.name}/blame`
? "true"
: "false"
}
href={`/repos/${repo.id}/files/${file.name}/blame`}
>
Blame
</a>
</div>
</div>
<hr />
<slot />
</div>
)
}
</RepoLayout>
<style>
.nav {
display: flex;
align-items: center;
margin-bottom: 0.5rem;
@media (max-width: 720px) {
margin-top: 0.5rem;
}
div {
padding-right: 0.5rem;
}
a {
font-size: 1rem;
font-weight: 500;
padding-right: 0.5rem;
cursor: pointer;
color: var(--color-link);
&[aria-current="true"] {
text-underline-offset: 4px;
text-decoration: underline;
}
}
}
.title {
display: flex;
align-items: center;
margin-top: 0.75rem;
margin-bottom: 0.5rem;
font-size: 1.1rem;
font-weight: 500;
}
svg[data-icon] {
font-weight: 600;
margin-right: 4px;
}
</style>