~repos /website
git clone https://pyrossh.dev/repos/website.git
木 Personal website of pyrossh. Built with astrojs, shiki, vite.
1c7ecfb5
—
pyrossh 7 months ago
improve repos and add dark theme
- bun.lock +7 -0
- package.json +1 -0
- src/assets/icons/moon.svg +4 -0
- src/assets/icons/sun.svg +1 -0
- src/assets/logos/ghostty.png +0 -0
- src/components/Header.astro +45 -26
- src/components/Slide.astro +0 -37
- src/consts.ts +58 -3
- src/layouts/Base.astro +3 -2
- src/layouts/Base.css +28 -10
- src/pages/index.astro +171 -193
- src/pages/posts/[...slug].astro +3 -3
- src/pages/posts/index.astro +15 -8
bun.lock
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"@effective/css-reset": "^3.2.0",
|
|
11
11
|
"@tailwindcss/vite": "^4.1.4",
|
|
12
12
|
"astro": "^5.7.5",
|
|
13
|
+
"simple-git": "^3.27.0",
|
|
13
14
|
"tailwindcss": "^4.1.4",
|
|
14
15
|
},
|
|
15
16
|
"devDependencies": {
|
|
@@ -139,6 +140,10 @@
|
|
|
139
140
|
|
|
140
141
|
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
|
|
141
142
|
|
|
143
|
+
"@kwsites/file-exists": ["@kwsites/file-exists@1.1.1", "", { "dependencies": { "debug": "^4.1.1" } }, "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw=="],
|
|
144
|
+
|
|
145
|
+
"@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="],
|
|
146
|
+
|
|
142
147
|
"@mdx-js/mdx": ["@mdx-js/mdx@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw=="],
|
|
143
148
|
|
|
144
149
|
"@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
|
|
@@ -745,6 +750,8 @@
|
|
|
745
750
|
|
|
746
751
|
"shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="],
|
|
747
752
|
|
|
753
|
+
"simple-git": ["simple-git@3.27.0", "", { "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", "debug": "^4.3.5" } }, "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA=="],
|
|
754
|
+
|
|
748
755
|
"simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
|
|
749
756
|
|
|
750
757
|
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
|
package.json
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"@effective/css-reset": "^3.2.0",
|
|
15
15
|
"@tailwindcss/vite": "^4.1.4",
|
|
16
16
|
"astro": "^5.7.5",
|
|
17
|
+
"simple-git": "^3.27.0",
|
|
17
18
|
"tailwindcss": "^4.1.4"
|
|
18
19
|
},
|
|
19
20
|
"devDependencies": {
|
src/assets/icons/moon.svg
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
|
2
|
+
<svg width="24px" height="24px" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<path d="M12 22C17.5228 22 22 17.5228 22 12C22 11.5373 21.3065 11.4608 21.0672 11.8568C19.9289 13.7406 17.8615 15 15.5 15C11.9101 15 9 12.0899 9 8.5C9 6.13845 10.2594 4.07105 12.1432 2.93276C12.5392 2.69347 12.4627 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z" />
|
|
4
|
+
</svg>
|
src/assets/icons/sun.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <path d="M17 12C17 14.7614 14.7614 17 12 17C9.23858 17 7 14.7614 7 12C7 9.23858 9.23858 7 12 7C14.7614 7 17 9.23858 17 12Z" fill="#f1fa8c"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 1.25C12.4142 1.25 12.75 1.58579 12.75 2V4C12.75 4.41421 12.4142 4.75 12 4.75C11.5858 4.75 11.25 4.41421 11.25 4V2C11.25 1.58579 11.5858 1.25 12 1.25ZM3.66865 3.71609C3.94815 3.41039 4.42255 3.38915 4.72825 3.66865L6.95026 5.70024C7.25596 5.97974 7.2772 6.45413 6.9977 6.75983C6.7182 7.06553 6.2438 7.08677 5.9381 6.80727L3.71609 4.77569C3.41039 4.49619 3.38915 4.02179 3.66865 3.71609ZM20.3314 3.71609C20.6109 4.02179 20.5896 4.49619 20.2839 4.77569L18.0619 6.80727C17.7562 7.08677 17.2818 7.06553 17.0023 6.75983C16.7228 6.45413 16.744 5.97974 17.0497 5.70024L19.2718 3.66865C19.5775 3.38915 20.0518 3.41039 20.3314 3.71609ZM1.25 12C1.25 11.5858 1.58579 11.25 2 11.25H4C4.41421 11.25 4.75 11.5858 4.75 12C4.75 12.4142 4.41421 12.75 4 12.75H2C1.58579 12.75 1.25 12.4142 1.25 12ZM19.25 12C19.25 11.5858 19.5858 11.25 20 11.25H22C22.4142 11.25 22.75 11.5858 22.75 12C22.75 12.4142 22.4142 12.75 22 12.75H20C19.5858 12.75 19.25 12.4142 19.25 12ZM17.0255 17.0252C17.3184 16.7323 17.7933 16.7323 18.0862 17.0252L20.3082 19.2475C20.6011 19.5404 20.601 20.0153 20.3081 20.3082C20.0152 20.6011 19.5403 20.601 19.2475 20.3081L17.0255 18.0858C16.7326 17.7929 16.7326 17.3181 17.0255 17.0252ZM6.97467 17.0253C7.26756 17.3182 7.26756 17.7931 6.97467 18.086L4.75244 20.3082C4.45955 20.6011 3.98468 20.6011 3.69178 20.3082C3.39889 20.0153 3.39889 19.5404 3.69178 19.2476L5.91401 17.0253C6.2069 16.7324 6.68177 16.7324 6.97467 17.0253ZM12 19.25C12.4142 19.25 12.75 19.5858 12.75 20V22C12.75 22.4142 12.4142 22.75 12 22.75C11.5858 22.75 11.25 22.4142 11.25 22V20C11.25 19.5858 11.5858 19.25 12 19.25Z" fill="#f1fa8c"></path> </g></svg>
|
src/assets/logos/ghostty.png
ADDED
|
Binary file
|
src/components/Header.astro
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
import HeaderLink from "./HeaderLink.astro";
|
|
3
3
|
import Wrapper from "./Wrapper.astro";
|
|
4
|
+
import Moon from "@/assets/icons/moon.svg";
|
|
5
|
+
import Sun from "@/assets/icons/sun.svg";
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
<header>
|
|
@@ -8,29 +10,37 @@ import Wrapper from "./Wrapper.astro";
|
|
|
8
10
|
<nav>
|
|
9
11
|
<HeaderLink class="logo" href="/"> 木 pyrossh </HeaderLink>
|
|
10
12
|
<div class="links">
|
|
13
|
+
<button id="theme-change">
|
|
14
|
+
<Moon id="dark" style="display: none;" width={"1em"} height={"1em"} />
|
|
15
|
+
<Sun id="light" width={"1em"} height={"1em"} />
|
|
16
|
+
</button>
|
|
17
|
+
<script>
|
|
18
|
+
const button = document.getElementById("theme-change")!;
|
|
19
|
+
document.getElementById("dark")!.style.display = "none";
|
|
20
|
+
button.addEventListener("click", () => {
|
|
21
|
+
const currentTheme =
|
|
22
|
+
document.documentElement.getAttribute("theme") || "dark";
|
|
23
|
+
const newTheme = currentTheme === "dark" ? "light" : "dark";
|
|
24
|
+
document.documentElement.setAttribute("theme", newTheme);
|
|
25
|
+
document.getElementById(currentTheme)!.style.display = "block";
|
|
26
|
+
document.getElementById(newTheme)!.style.display = "none";
|
|
27
|
+
});
|
|
28
|
+
</script>
|
|
29
|
+
<div>|</div>
|
|
11
30
|
<HeaderLink href="/cv">cv</HeaderLink>
|
|
12
31
|
<div>|</div>
|
|
13
32
|
<HeaderLink href="/posts">posts</HeaderLink>
|
|
14
|
-
<div>|</div>
|
|
15
|
-
<HeaderLink href="https://git.sr.ht/~pyrossh/">code</HeaderLink>
|
|
16
33
|
</div>
|
|
17
34
|
</nav>
|
|
18
35
|
</Wrapper>
|
|
19
36
|
</header>
|
|
20
37
|
<style>
|
|
21
38
|
header {
|
|
22
|
-
background
|
|
39
|
+
background: #131618;
|
|
23
|
-
border-top: 5px solid #444;
|
|
24
|
-
border-bottom: 1px solid #444;
|
|
25
40
|
min-height: 56px;
|
|
26
41
|
position: relative;
|
|
27
42
|
}
|
|
28
43
|
|
|
29
|
-
nav {
|
|
30
|
-
/* padding-left: 0px; */
|
|
31
|
-
/* padding-right: 0px; */
|
|
32
|
-
}
|
|
33
|
-
|
|
34
44
|
.logo {
|
|
35
45
|
display: flex;
|
|
36
46
|
font-size: 22px;
|
|
@@ -57,24 +67,33 @@ import Wrapper from "./Wrapper.astro";
|
|
|
57
67
|
font-size: 22px;
|
|
58
68
|
line-height: 56px;
|
|
59
69
|
color: white;
|
|
60
|
-
}
|
|
61
70
|
|
|
62
|
-
|
|
71
|
+
button {
|
|
63
|
-
display: inline-block;
|
|
64
|
-
text-decoration: none;
|
|
65
|
-
font-size: 22px;
|
|
66
|
-
line-height: 56px;
|
|
67
|
-
color: white;
|
|
68
|
-
font-weight: 400;
|
|
69
|
-
padding-left: 12px;
|
|
70
|
-
|
|
72
|
+
padding-right: 12px;
|
|
73
|
+
cursor: pointer;
|
|
74
|
+
}
|
|
71
75
|
|
|
76
|
+
a {
|
|
77
|
+
display: inline-block;
|
|
78
|
+
text-decoration: none;
|
|
79
|
+
font-size: 22px;
|
|
80
|
+
line-height: 56px;
|
|
81
|
+
color: white;
|
|
82
|
+
font-weight: 400;
|
|
83
|
+
padding-left: 12px;
|
|
84
|
+
padding-right: 12px;
|
|
85
|
+
|
|
86
|
+
&:last-child {
|
|
87
|
+
padding-right: 0px;
|
|
88
|
+
}
|
|
89
|
+
|
|
72
|
-
|
|
90
|
+
&.active,
|
|
73
|
-
|
|
91
|
+
&:hover {
|
|
74
|
-
|
|
92
|
+
color: var(--color-gray-200);
|
|
75
|
-
|
|
93
|
+
text-decoration: underline;
|
|
76
|
-
|
|
94
|
+
text-decoration-color: var(--color-accent);
|
|
77
|
-
|
|
95
|
+
text-underline-offset: 8px;
|
|
96
|
+
}
|
|
78
97
|
}
|
|
79
98
|
}
|
|
80
99
|
</style>
|
src/components/Slide.astro
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { title, link, isExternal = true } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<div class="card bg-[#f0ede2] rounded-xs">
|
|
6
|
-
<div class="card-body p-4">
|
|
7
|
-
<div class="card-title">
|
|
8
|
-
<slot name="icon" />
|
|
9
|
-
<a
|
|
10
|
-
class="link"
|
|
11
|
-
href={link}
|
|
12
|
-
target={isExternal ? "_blank" : "_self"}
|
|
13
|
-
rel={isExternal ? "noopener noreferrer" : ""}
|
|
14
|
-
>
|
|
15
|
-
{title}
|
|
16
|
-
</a>
|
|
17
|
-
</div>
|
|
18
|
-
<slot />
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
|
|
22
|
-
<style>
|
|
23
|
-
.card {
|
|
24
|
-
display: flex;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.card-title {
|
|
28
|
-
display: flex;
|
|
29
|
-
flex-direction: row;
|
|
30
|
-
align-items: center;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.link {
|
|
34
|
-
font-weight: 500;
|
|
35
|
-
text-decoration: underline;
|
|
36
|
-
}
|
|
37
|
-
</style>
|
src/consts.ts
CHANGED
|
@@ -1,5 +1,60 @@
|
|
|
1
|
-
// Place any global data in this file.
|
|
2
|
-
// You can import this data from anywhere in your site by using the `import` keyword.
|
|
3
|
-
|
|
4
1
|
export const SITE_TITLE = 'pyrossh';
|
|
5
2
|
export const SITE_DESCRIPTION = 'Welcome to my website!';
|
|
3
|
+
export const REPOS = [
|
|
4
|
+
{
|
|
5
|
+
title: "rust-embed",
|
|
6
|
+
description: "rust macro which loads files into the rust binary at compile time during release and loads the file from the fs during dev."
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
title: "website",
|
|
10
|
+
description: "木 Personal website of pyrossh. Built with astrojs, shiki, vite."
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
title: "plum",
|
|
14
|
+
description: "A statically typed, imperative programming language inspired by rust, python"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
title: "edge-city",
|
|
18
|
+
description: "edge-city is a next level meta-framework for react that runs only on edge runtimes"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
title: "gromer",
|
|
22
|
+
description: "gromer is a framework and cli to build multipage web apps in golang using htmx and alpinejs."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
title: "atoms-element",
|
|
26
|
+
description: "A simple web component library for defining your custom elements. It works on both client and server."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
title: "atoms-state",
|
|
30
|
+
description: "Simple State management for react"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
title: "remote-monitor",
|
|
34
|
+
description: "Remote Monitoring and Control using GSM-SMS"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
title: "only-bible-app",
|
|
38
|
+
description: "The only bible app you will ever need. No ads. No in-app purchases. No distractions."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
title: "gdx-studio",
|
|
42
|
+
description: "An IDE for creating Games using libgdx and Java supported on all platforms Android, iOS, Desktop"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
title: "rp2350",
|
|
46
|
+
description: "code to drive rp2350"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: "config",
|
|
50
|
+
description: "Common configuration"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
title: "sabel-ide",
|
|
54
|
+
description: "sabel-ide"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
title: "tide-jsx",
|
|
58
|
+
description: "Tide + JSX"
|
|
59
|
+
},
|
|
60
|
+
]
|
src/layouts/Base.astro
CHANGED
|
@@ -9,10 +9,11 @@ import "./Base.css";
|
|
|
9
9
|
interface Props {
|
|
10
10
|
title: string;
|
|
11
11
|
description: string;
|
|
12
|
+
class?: string;
|
|
12
13
|
image?: string;
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
const { title, description } = Astro.props;
|
|
16
|
+
const { title, description, class: classname } = Astro.props;
|
|
16
17
|
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
|
|
17
18
|
const image = "/favicon.png";
|
|
18
19
|
---
|
|
@@ -57,7 +58,7 @@ const image = "/favicon.png";
|
|
|
57
58
|
<body>
|
|
58
59
|
<Header />
|
|
59
60
|
<Wrapper>
|
|
60
|
-
<main>
|
|
61
|
+
<main class:list={classname}>
|
|
61
62
|
<slot />
|
|
62
63
|
</main>
|
|
63
64
|
</Wrapper>
|
src/layouts/Base.css
CHANGED
|
@@ -2,15 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
:root {
|
|
4
4
|
--color-accent: #f1fa8c;
|
|
5
|
-
--color-accent-dark: #000d8a;
|
|
6
5
|
--color-black: #000000;
|
|
7
6
|
--color-white: #ffffff;
|
|
8
|
-
--
|
|
7
|
+
--color-body-bg: #212529;
|
|
9
|
-
--
|
|
8
|
+
--color-text: #f8f9fa;
|
|
10
|
-
--
|
|
9
|
+
--color-card-link: #3395ff;
|
|
10
|
+
--color-box-bg: #131618;
|
|
11
|
+
--color-link: #3395ff;
|
|
12
|
+
--color-post-link: #3395ff;
|
|
11
|
-
--
|
|
13
|
+
--color-highlight-bg: #703be1;
|
|
12
|
-
--
|
|
14
|
+
--color-code-fg: rgb(244, 176, 176);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
[theme='light'] {
|
|
18
|
+
--color-accent: #f1fa8c;
|
|
19
|
+
--color-body-bg: #ffffff;
|
|
20
|
+
--color-text: #222;
|
|
21
|
+
--color-card-link: #000000;
|
|
22
|
+
--color-box-bg: #f1f5f9;
|
|
23
|
+
--color-link: #1c398e;
|
|
24
|
+
--color-post-link: #000000;
|
|
13
|
-
|
|
25
|
+
--color-highlight-bg: #9befee;
|
|
26
|
+
--color-code-fg: #d14;
|
|
14
27
|
}
|
|
15
28
|
|
|
16
29
|
html {
|
|
@@ -31,14 +44,19 @@ body {
|
|
|
31
44
|
display: flex;
|
|
32
45
|
flex-direction: column;
|
|
33
46
|
flex: 1;
|
|
34
|
-
background-color: var(--color-
|
|
47
|
+
background-color: var(--color-body-bg);
|
|
48
|
+
color: var(--color-text);
|
|
35
49
|
font-family: var(--font-roboto);
|
|
36
50
|
text-rendering: optimizeLegibility;
|
|
37
51
|
font-variant-ligatures: common-ligatures;
|
|
38
52
|
font-kerning: normal;
|
|
39
53
|
font-size: 14pt;
|
|
40
54
|
line-height: 1.6;
|
|
55
|
+
/* min-height: 100vh; */
|
|
56
|
+
/* min-width: 992px !important; */
|
|
57
|
+
/* font-family: sans-serif; */
|
|
41
|
-
|
|
58
|
+
/* font-size: 1rem; */
|
|
59
|
+
/* text-align: initial; */
|
|
42
60
|
|
|
43
61
|
@media (max-width: 720px) {
|
|
44
62
|
font-size: 13pt;
|
|
@@ -46,7 +64,7 @@ body {
|
|
|
46
64
|
}
|
|
47
65
|
|
|
48
66
|
main {
|
|
49
|
-
|
|
67
|
+
margin-bottom: 1rem;
|
|
50
68
|
padding-top: 1em;
|
|
51
69
|
padding-bottom: 1em;
|
|
52
70
|
}
|
src/pages/index.astro
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
import { Image } from "astro:assets";
|
|
3
3
|
import Layout from "@/layouts/Base.astro";
|
|
4
|
-
import Slide from "@/components/Slide.astro";
|
|
5
|
-
import onlyBiblePng from "@/assets/images/app_icon.png";
|
|
6
|
-
import rustPng from "@/assets/logos/rust.png";
|
|
7
|
-
import pyrosshPng from "@/assets/logos/pyrossh.png";
|
|
8
4
|
import stats from "@/assets/logos/stats.png";
|
|
9
5
|
import code from "@/assets/logos/code.png";
|
|
10
6
|
import helix from "@/assets/logos/helix.png";
|
|
11
7
|
import nu from "@/assets/logos/nu.png";
|
|
12
|
-
import iterm from "@/assets/logos/iterm.png";
|
|
13
8
|
import zellij from "@/assets/logos/zellij.png";
|
|
14
9
|
import inkscape from "@/assets/logos/inkscape.png";
|
|
10
|
+
import ghostty from "@/assets/logos/ghostty.png";
|
|
11
|
+
import { REPOS } from "@/consts";
|
|
15
12
|
---
|
|
16
13
|
|
|
17
14
|
<Layout
|
|
@@ -39,188 +36,151 @@ import inkscape from "@/assets/logos/inkscape.png";
|
|
|
39
36
|
I enjoy working on open-source projects, and during the last decade,
|
|
40
37
|
I've created a number of projects that are widely used.
|
|
41
38
|
</p>
|
|
42
|
-
<div>
|
|
39
|
+
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-8">
|
|
43
|
-
<section class="
|
|
40
|
+
<section class="interests">
|
|
44
|
-
<h2>
|
|
41
|
+
<h2>Interests</h2>
|
|
42
|
+
<ul>
|
|
43
|
+
<li>HTML</li>
|
|
44
|
+
<li>CSS</li>
|
|
45
|
+
<li>Javascript</li>
|
|
46
|
+
<li>SQL</li>
|
|
47
|
+
<li>Bun</li>
|
|
48
|
+
<li>Zig</li>
|
|
49
|
+
<li>React</li>
|
|
50
|
+
<li>Expo</li>
|
|
51
|
+
<li>MicroZig</li>
|
|
52
|
+
<li>K8s</li>
|
|
53
|
+
<li>S3</li>
|
|
54
|
+
<li>Iceberg</li>
|
|
55
|
+
</ul>
|
|
56
|
+
</section>
|
|
45
|
-
|
|
57
|
+
<section class="contact">
|
|
58
|
+
<h2>Contact</h2>
|
|
46
|
-
|
|
59
|
+
<ul>
|
|
60
|
+
<li>
|
|
47
|
-
|
|
61
|
+
<strong>Email:</strong>
|
|
62
|
+
<span>pyros2097@gmail.com</span>
|
|
63
|
+
</li>
|
|
64
|
+
<li>
|
|
65
|
+
<strong>Sourcehut:</strong>
|
|
48
|
-
|
|
66
|
+
<a href="https://git.sr.ht/~pyrossh/">
|
|
67
|
+
https://git.sr.ht/~pyrossh/
|
|
68
|
+
</a>
|
|
69
|
+
</li>
|
|
70
|
+
<li>
|
|
71
|
+
<strong>Crates:</strong>
|
|
72
|
+
<a href="https://crates.io/users/pyrossh">
|
|
73
|
+
https://crates.io/users/pyrossh
|
|
74
|
+
</a>
|
|
75
|
+
</li>
|
|
76
|
+
<li>
|
|
77
|
+
<strong>LinkedIn:</strong>
|
|
78
|
+
<a href="https://www.linkedin.com/in/peter-john-in">
|
|
79
|
+
https://www.linkedin.com/in/pyrossh
|
|
80
|
+
</a>
|
|
81
|
+
</li>
|
|
82
|
+
</ul>
|
|
83
|
+
</section>
|
|
84
|
+
</div>
|
|
85
|
+
<section class="tools">
|
|
86
|
+
<h2>Tools</h2>
|
|
87
|
+
<ul>
|
|
88
|
+
<li>
|
|
89
|
+
<a
|
|
90
|
+
href="https://github.com/exelban/stats"
|
|
91
|
+
target="_blank"
|
|
92
|
+
rel="noopener noreferrer"
|
|
93
|
+
>
|
|
94
|
+
<div>Stats</div>
|
|
95
|
+
<Image src={stats} alt="Stats" />
|
|
96
|
+
</a>
|
|
97
|
+
</li>
|
|
98
|
+
<li>
|
|
99
|
+
<a
|
|
100
|
+
href="https://github.com/microsoft/vscode"
|
|
101
|
+
target="_blank"
|
|
102
|
+
rel="noopener noreferrer"
|
|
103
|
+
>
|
|
104
|
+
<div>VS Code</div>
|
|
105
|
+
<Image src={code} alt="VS Code" />
|
|
106
|
+
</a>
|
|
107
|
+
</li>
|
|
108
|
+
<li>
|
|
109
|
+
<a
|
|
110
|
+
href="https://github.com/helix-editor/helix"
|
|
111
|
+
target="_blank"
|
|
112
|
+
rel="noopener noreferrer"
|
|
113
|
+
>
|
|
114
|
+
<div>Helix</div>
|
|
115
|
+
<Image src={helix} alt="Helix" />
|
|
116
|
+
</a>
|
|
117
|
+
</li>
|
|
118
|
+
<li>
|
|
119
|
+
<a
|
|
120
|
+
href="https://github.com/nushell/nushell"
|
|
121
|
+
target="_blank"
|
|
122
|
+
rel="noopener noreferrer"
|
|
49
123
|
>
|
|
124
|
+
<div>Nushell</div>
|
|
50
|
-
<Image
|
|
125
|
+
<Image class="p-0.5 rounded-md" src={nu} alt="nu-shell" />
|
|
51
|
-
<p>
|
|
52
|
-
A rust proc-macro which loads files into the rust binary at
|
|
53
|
-
compile time during release and loads the file from the fs
|
|
54
|
-
during dev
|
|
55
|
-
|
|
126
|
+
</a>
|
|
56
|
-
|
|
127
|
+
</li>
|
|
57
|
-
|
|
128
|
+
<li>
|
|
58
|
-
|
|
129
|
+
<a
|
|
59
|
-
|
|
130
|
+
href="https://github.com/ghostty-org/ghostty"
|
|
131
|
+
target="_blank"
|
|
132
|
+
rel="noopener noreferrer"
|
|
60
133
|
>
|
|
134
|
+
<div>Ghostty</div>
|
|
61
|
-
<Image
|
|
135
|
+
<Image src={ghostty} alt="ghostty" />
|
|
136
|
+
</a>
|
|
137
|
+
</li>
|
|
62
|
-
|
|
138
|
+
<li>
|
|
63
|
-
木 Personal website of pyrossh. Built with
|
|
64
|
-
<span class="*:underline">
|
|
65
|
-
|
|
139
|
+
<a
|
|
66
|
-
|
|
140
|
+
href="https://zellij.dev/"
|
|
67
|
-
|
|
141
|
+
target="_blank"
|
|
68
|
-
rel="noopener noreferrer">astrojs</a
|
|
69
|
-
>,
|
|
70
|
-
<a
|
|
71
|
-
href="https://shiki.matsu.io/"
|
|
72
|
-
target="_blank"
|
|
73
|
-
rel="noopener noreferrer">shiki</a
|
|
74
|
-
>,
|
|
75
|
-
<a
|
|
76
|
-
href="https://vitejs.dev/"
|
|
77
|
-
target="_blank"
|
|
78
|
-
|
|
142
|
+
rel="noopener noreferrer"
|
|
79
|
-
>.
|
|
80
|
-
</span>
|
|
81
|
-
</p>
|
|
82
|
-
</Slide>
|
|
83
|
-
<Slide title="pacman" link="https://git.sr.ht/~pyrossh/plum">
|
|
84
|
-
<span slot="icon" class="text-4xl mr-2">👾</span>
|
|
85
|
-
<p>
|
|
86
|
-
A statically typed, imperative programming language with ADT's
|
|
87
|
-
inspired by rust, haskell.
|
|
88
|
-
</p>
|
|
89
|
-
</Slide>
|
|
90
|
-
<Slide
|
|
91
|
-
title="Only Bible App"
|
|
92
|
-
link="/only-bible-app"
|
|
93
|
-
isExternal={false}
|
|
94
143
|
>
|
|
144
|
+
<div>Zellij</div>
|
|
95
|
-
<Image
|
|
145
|
+
<Image class="w-7 p-0.5" src={zellij} alt="zellij" />
|
|
96
|
-
<p>
|
|
97
|
-
The only bible app you will ever need. No ads, No in-app
|
|
98
|
-
purchases, No distractions. Works completely offline.
|
|
99
|
-
|
|
146
|
+
</a>
|
|
100
|
-
</Slide>
|
|
101
|
-
</
|
|
147
|
+
</li>
|
|
102
148
|
|
|
103
|
-
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-8">
|
|
104
|
-
<section class="interests">
|
|
105
|
-
<h2>Interests</h2>
|
|
106
|
-
|
|
149
|
+
<li>
|
|
150
|
+
<a
|
|
107
|
-
|
|
151
|
+
href="https://inkscape.org/"
|
|
108
|
-
|
|
152
|
+
target="_blank"
|
|
153
|
+
rel="noopener noreferrer"
|
|
154
|
+
>
|
|
109
|
-
|
|
155
|
+
<div>Inkscape</div>
|
|
156
|
+
<Image src={inkscape} alt="inkscape" />
|
|
110
|
-
|
|
157
|
+
</a>
|
|
111
|
-
<li>Bun</li>
|
|
112
|
-
<li>Zig</li>
|
|
113
|
-
<li>React</li>
|
|
114
|
-
<li>Expo</li>
|
|
115
|
-
<li>MicroZig</li>
|
|
116
|
-
<li>K8s</li>
|
|
117
|
-
|
|
158
|
+
</li>
|
|
118
|
-
<li>Iceberg</li>
|
|
119
|
-
|
|
159
|
+
</ul>
|
|
120
|
-
|
|
160
|
+
</section>
|
|
121
|
-
|
|
161
|
+
<section class="projects">
|
|
122
|
-
|
|
162
|
+
<h2>Repos</h2>
|
|
163
|
+
<div class="repos">
|
|
164
|
+
{
|
|
165
|
+
REPOS.map((repo) => (
|
|
166
|
+
<div class="event">
|
|
123
|
-
|
|
167
|
+
<h4>
|
|
124
|
-
<li>
|
|
125
|
-
<strong>Email:</strong>
|
|
126
|
-
<span>pyros2097@gmail.com</span>
|
|
127
|
-
</li>
|
|
128
|
-
<li>
|
|
129
|
-
<strong>Sourcehut:</strong>
|
|
130
|
-
<a href=
|
|
168
|
+
<a href={`https://git.sr.ht/~pyrossh/${repo.title}`}>
|
|
131
|
-
https://git.sr.ht/~pyrossh/
|
|
132
|
-
</a>
|
|
133
|
-
</li>
|
|
134
|
-
|
|
169
|
+
{" "}
|
|
135
|
-
|
|
170
|
+
{repo.title}{" "}
|
|
136
|
-
<a href="https://www.linkedin.com/in/peter-john-in">
|
|
137
|
-
https://www.linkedin.com/in/pyrossh
|
|
138
171
|
</a>
|
|
139
|
-
</
|
|
172
|
+
</h4>
|
|
140
|
-
</ul>
|
|
141
|
-
</section>
|
|
142
|
-
</div>
|
|
143
|
-
<section class="tools">
|
|
144
|
-
<h2>Tools</h2>
|
|
145
|
-
<ul>
|
|
146
|
-
<li>
|
|
147
|
-
<a
|
|
148
|
-
href="https://github.com/exelban/stats"
|
|
149
|
-
target="_blank"
|
|
150
|
-
rel="noopener noreferrer"
|
|
151
|
-
>
|
|
152
|
-
<div>Stats</div>
|
|
153
|
-
<Image src={stats} alt="Stats" />
|
|
154
|
-
</a>
|
|
155
|
-
</li>
|
|
156
|
-
<li>
|
|
157
|
-
<a
|
|
158
|
-
href="https://github.com/microsoft/vscode"
|
|
159
|
-
target="_blank"
|
|
160
|
-
rel="noopener noreferrer"
|
|
161
|
-
>
|
|
162
|
-
<div>VS Code</div>
|
|
163
|
-
<Image src={code} alt="VS Code" />
|
|
164
|
-
</a>
|
|
165
|
-
</li>
|
|
166
|
-
<li>
|
|
167
|
-
<a
|
|
168
|
-
href="https://github.com/helix-editor/helix"
|
|
169
|
-
target="_blank"
|
|
170
|
-
rel="noopener noreferrer"
|
|
171
|
-
>
|
|
172
|
-
<div>Helix</div>
|
|
173
|
-
<Image src={helix} alt="Helix" />
|
|
174
|
-
</a>
|
|
175
|
-
</li>
|
|
176
|
-
<li>
|
|
177
|
-
<a
|
|
178
|
-
href="https://github.com/nushell/nushell"
|
|
179
|
-
target="_blank"
|
|
180
|
-
rel="noopener noreferrer"
|
|
181
|
-
>
|
|
182
|
-
<div>Nushell</div>
|
|
183
|
-
<Image class="p-0.5 rounded-md" src={nu} alt="nu-shell" />
|
|
184
|
-
</a>
|
|
185
|
-
</li>
|
|
186
|
-
<li>
|
|
187
|
-
<a
|
|
188
|
-
href="https://github.com/gnachman/iTerm2"
|
|
189
|
-
target="_blank"
|
|
190
|
-
rel="noopener noreferrer"
|
|
191
|
-
>
|
|
192
|
-
<div>iTerm2</div>
|
|
193
|
-
<Image src={iterm} alt="iterm2" />
|
|
194
|
-
</a>
|
|
195
|
-
</li>
|
|
196
|
-
<li>
|
|
197
|
-
<a
|
|
198
|
-
href="https://zellij.dev/"
|
|
199
|
-
target="_blank"
|
|
200
|
-
rel="noopener noreferrer"
|
|
201
|
-
>
|
|
202
|
-
<div>Zellij</div>
|
|
203
|
-
<Image class="w-7 p-0.5" src={zellij} alt="zellij" />
|
|
204
|
-
</a>
|
|
205
|
-
</li>
|
|
206
173
|
|
|
207
|
-
<li>
|
|
208
|
-
<a
|
|
209
|
-
href="https://inkscape.org/"
|
|
210
|
-
target="_blank"
|
|
211
|
-
rel="noopener noreferrer"
|
|
212
|
-
>
|
|
213
|
-
|
|
174
|
+
<p>{repo.description}</p>
|
|
214
|
-
<Image src={inkscape} alt="inkscape" />
|
|
215
|
-
</a>
|
|
216
|
-
</
|
|
175
|
+
</div>
|
|
176
|
+
))
|
|
177
|
+
}
|
|
217
|
-
|
|
178
|
+
</div>
|
|
218
|
-
|
|
179
|
+
</section>
|
|
219
|
-
</section>
|
|
220
|
-
</div>
|
|
221
180
|
</div>
|
|
222
181
|
</div>
|
|
223
182
|
</Layout>
|
|
183
|
+
|
|
224
184
|
<style>
|
|
225
185
|
h2 {
|
|
226
186
|
font-size: 1.5rem;
|
|
@@ -234,20 +194,16 @@ import inkscape from "@/assets/logos/inkscape.png";
|
|
|
234
194
|
margin-bottom: 1rem;
|
|
235
195
|
}
|
|
236
196
|
|
|
237
|
-
.p-0\.5 {
|
|
238
|
-
/* padding: 0.125rem; */
|
|
239
|
-
}
|
|
240
|
-
|
|
241
197
|
.rounded-md {
|
|
242
198
|
border-radius: 0.375rem;
|
|
243
199
|
}
|
|
244
200
|
|
|
245
201
|
.projects {
|
|
246
|
-
.
|
|
202
|
+
.repos {
|
|
247
203
|
display: grid;
|
|
248
204
|
grid-template-columns: auto auto;
|
|
249
|
-
gap:
|
|
205
|
+
gap: 1rem;
|
|
250
|
-
margin-top:
|
|
206
|
+
margin-top: 0.5rem;
|
|
251
207
|
|
|
252
208
|
@media (max-width: 720px) {
|
|
253
209
|
gap: 1rem;
|
|
@@ -255,10 +211,29 @@ import inkscape from "@/assets/logos/inkscape.png";
|
|
|
255
211
|
}
|
|
256
212
|
}
|
|
257
213
|
|
|
258
|
-
|
|
214
|
+
.event {
|
|
215
|
+
text-overflow: ellipsis;
|
|
259
|
-
|
|
216
|
+
overflow: hidden;
|
|
260
|
-
|
|
217
|
+
padding: 0.5rem;
|
|
218
|
+
background: var(--color-box-bg);
|
|
219
|
+
color: var(--color-text);
|
|
220
|
+
font-size: 0.95em;
|
|
221
|
+
|
|
222
|
+
a {
|
|
223
|
+
color: var(--color-card-link);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
h4 {
|
|
227
|
+
font-size: 1.1rem;
|
|
228
|
+
font-weight: 500;
|
|
261
|
-
|
|
229
|
+
line-height: 1.2;
|
|
230
|
+
border-bottom: 1px solid #495057;
|
|
231
|
+
text-overflow: ellipsis;
|
|
232
|
+
white-space: nowrap;
|
|
233
|
+
overflow: hidden;
|
|
234
|
+
margin-bottom: 0;
|
|
235
|
+
padding: 0;
|
|
236
|
+
}
|
|
262
237
|
}
|
|
263
238
|
}
|
|
264
239
|
|
|
@@ -270,7 +245,7 @@ import inkscape from "@/assets/logos/inkscape.png";
|
|
|
270
245
|
text-align: center;
|
|
271
246
|
margin-top: 1rem;
|
|
272
247
|
li {
|
|
273
|
-
background-color:
|
|
248
|
+
background-color: var(--color-box-bg);
|
|
274
249
|
padding: 0.25rem;
|
|
275
250
|
}
|
|
276
251
|
}
|
|
@@ -288,7 +263,7 @@ import inkscape from "@/assets/logos/inkscape.png";
|
|
|
288
263
|
flex-direction: row;
|
|
289
264
|
align-items: baseline;
|
|
290
265
|
padding: 0.25rem;
|
|
291
|
-
background-color:
|
|
266
|
+
background-color: var(--color-box-bg);
|
|
292
267
|
|
|
293
268
|
@media (max-width: 720px) {
|
|
294
269
|
flex-direction: column;
|
|
@@ -296,7 +271,7 @@ import inkscape from "@/assets/logos/inkscape.png";
|
|
|
296
271
|
}
|
|
297
272
|
|
|
298
273
|
a {
|
|
299
|
-
color:
|
|
274
|
+
color: var(--color-link);
|
|
300
275
|
}
|
|
301
276
|
|
|
302
277
|
strong {
|
|
@@ -321,7 +296,7 @@ import inkscape from "@/assets/logos/inkscape.png";
|
|
|
321
296
|
grid-template-columns: auto auto auto;
|
|
322
297
|
}
|
|
323
298
|
li {
|
|
324
|
-
background-color:
|
|
299
|
+
background-color: var(--color-box-bg);
|
|
325
300
|
padding: 0.25rem;
|
|
326
301
|
|
|
327
302
|
a {
|
|
@@ -329,6 +304,9 @@ import inkscape from "@/assets/logos/inkscape.png";
|
|
|
329
304
|
flex-direction: row;
|
|
330
305
|
align-items: center;
|
|
331
306
|
text-align: left;
|
|
307
|
+
margin-left: 0.25rem;
|
|
308
|
+
margin-right: 0.25rem;
|
|
309
|
+
font-size: 0.9em;
|
|
332
310
|
|
|
333
311
|
div {
|
|
334
312
|
flex: 1;
|
src/pages/posts/[...slug].astro
CHANGED
|
@@ -66,8 +66,8 @@ const { Content } = await render(Astro.props);
|
|
|
66
66
|
p,
|
|
67
67
|
li {
|
|
68
68
|
code {
|
|
69
|
-
color:
|
|
69
|
+
color: var(--color-code-fg);
|
|
70
|
-
background-color: var(--color-
|
|
70
|
+
background-color: var(--color-box-bg);
|
|
71
71
|
word-wrap: break-word;
|
|
72
72
|
box-decoration-break: clone;
|
|
73
73
|
padding: 2px 4px;
|
|
@@ -80,7 +80,7 @@ const { Content } = await render(Astro.props);
|
|
|
80
80
|
blockquote {
|
|
81
81
|
font-size: 1.2rem;
|
|
82
82
|
font-weight: 600;
|
|
83
|
-
background: var(--color-
|
|
83
|
+
background: var(--color-highlight-bg);
|
|
84
84
|
padding: 0.4rem;
|
|
85
85
|
margin: 16px 0px;
|
|
86
86
|
|
src/pages/posts/index.astro
CHANGED
|
@@ -14,17 +14,12 @@ const posts = (await getCollection("content")).sort(
|
|
|
14
14
|
<ul class="flex flex-col">
|
|
15
15
|
{
|
|
16
16
|
posts.map((post) => (
|
|
17
|
-
<li class="grid grid-cols-1 sm:grid-cols-2 gap-3 justify-start items-end mt-5 leading-6">
|
|
17
|
+
<li class="item grid grid-cols-1 sm:grid-cols-2 gap-3 justify-start items-end mt-5 leading-6">
|
|
18
18
|
<div class="flex flex-col">
|
|
19
|
-
<a
|
|
20
|
-
class="text-black underline underline-offset-4"
|
|
21
|
-
|
|
19
|
+
<a href={`/posts/${post.id}`}>{post.data.title}</a>
|
|
22
|
-
>
|
|
23
|
-
{post.data.title}
|
|
24
|
-
</a>
|
|
25
20
|
<span class="hover:cursor-default">{post.data.description}</span>
|
|
26
21
|
</div>
|
|
27
|
-
<span class="flex flex-1 justify-end sm:ml-4 text-md
|
|
22
|
+
<span class="flex flex-1 justify-end sm:ml-4 text-md ">
|
|
28
23
|
<FormattedDate date={post.data.pubDate} />
|
|
29
24
|
</span>
|
|
30
25
|
</li>
|
|
@@ -39,6 +34,18 @@ const posts = (await getCollection("content")).sort(
|
|
|
39
34
|
display: flex;
|
|
40
35
|
float: left;
|
|
41
36
|
}
|
|
37
|
+
.item {
|
|
38
|
+
a {
|
|
39
|
+
color: var(--color-post-link);
|
|
40
|
+
text-decoration-line: underline;
|
|
41
|
+
text-underline-offset: 4px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
span {
|
|
45
|
+
font-size: 13pt;
|
|
46
|
+
/* text-gray-900 */
|
|
47
|
+
}
|
|
48
|
+
}
|
|
42
49
|
hr {
|
|
43
50
|
padding-bottom: 75%;
|
|
44
51
|
}
|