~repos /website

#astro#js#html#css

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 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-color: var(--color-black);
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
- .links a {
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
- padding-right: 12px;
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
- &.active,
90
+ &.active,
73
- &:hover {
91
+ &:hover {
74
- color: var(--color-gray-200);
92
+ color: var(--color-gray-200);
75
- text-decoration: underline;
93
+ text-decoration: underline;
76
- text-decoration-color: var(--color-accent);
94
+ text-decoration-color: var(--color-accent);
77
- text-underline-offset: 8px;
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
- --gray: 96, 115, 159;
7
+ --color-body-bg: #212529;
9
- --gray-light: 229, 233, 240;
8
+ --color-text: #f8f9fa;
10
- --gray-dark: 34, 41, 57;
9
+ --color-card-link: #3395ff;
10
+ --color-box-bg: #131618;
11
+ --color-link: #3395ff;
12
+ --color-post-link: #3395ff;
11
- --gray-gradient: rgba(var(--gray-light), 50%), #fff;
13
+ --color-highlight-bg: #703be1;
12
- --box-shadow: 0 2px 6px rgba(var(--gray), 25%),
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
- 0 8px 24px rgba(var(--gray), 33%), 0 16px 32px rgba(var(--gray), 33%);
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-white);
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
- color: #222;
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
- background-color: var(--color-white);
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="projects">
40
+ <section class="interests">
44
- <h2>Projects</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
- <div class="slides">
57
+ <section class="contact">
58
+ <h2>Contact</h2>
46
- <Slide
59
+ <ul>
60
+ <li>
47
- title="rust-embed"
61
+ <strong>Email:</strong>
62
+ <span>pyros2097@gmail.com</span>
63
+ </li>
64
+ <li>
65
+ <strong>Sourcehut:</strong>
48
- link="https://git.sr.ht/~pyrossh/rust-embed"
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 slot="icon" src={rustPng} alt="rust embed" />
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
- </p>
126
+ </a>
56
- </Slide>
127
+ </li>
57
- <Slide
128
+ <li>
58
- title="pyrossh.dev"
129
+ <a
59
- link="https://git.sr.ht/~pyrossh/website"
130
+ href="https://github.com/ghostty-org/ghostty"
131
+ target="_blank"
132
+ rel="noopener noreferrer"
60
133
  >
134
+ <div>Ghostty</div>
61
- <Image slot="icon" src={pyrosshPng} alt="pyrossh website" />
135
+ <Image src={ghostty} alt="ghostty" />
136
+ </a>
137
+ </li>
62
- <p>
138
+ <li>
63
- 木 Personal website of pyrossh. Built with
64
- <span class="*:underline">
65
- <a
139
+ <a
66
- href="https://astro.build/"
140
+ href="https://zellij.dev/"
67
- target="_blank"
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
- rel="noopener noreferrer">vite</a
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 slot="icon" src={onlyBiblePng} alt="Only Bible App" />
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
- </p>
146
+ </a>
100
- </Slide>
101
- </div>
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
- <ul>
149
+ <li>
150
+ <a
107
- <li>HTML</li>
151
+ href="https://inkscape.org/"
108
- <li>CSS</li>
152
+ target="_blank"
153
+ rel="noopener noreferrer"
154
+ >
109
- <li>Javascript</li>
155
+ <div>Inkscape</div>
156
+ <Image src={inkscape} alt="inkscape" />
110
- <li>SQL</li>
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
- <li>S3</li>
158
+ </li>
118
- <li>Iceberg</li>
119
- </ul>
159
+ </ul>
120
- </section>
160
+ </section>
121
- <section class="contact">
161
+ <section class="projects">
122
- <h2>Contact</h2>
162
+ <h2>Repos</h2>
163
+ <div class="repos">
164
+ {
165
+ REPOS.map((repo) => (
166
+ <div class="event">
123
- <ul>
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="https://git.sr.ht/~pyrossh/">
168
+ <a href={`https://git.sr.ht/~pyrossh/${repo.title}`}>
131
- https://git.sr.ht/~pyrossh/
132
- </a>
133
- </li>
134
- <li>
169
+ {" "}
135
- <strong>LinkedIn:</strong>
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
- </li>
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
- <div>Inkscape</div>
174
+ <p>{repo.description}</p>
214
- <Image src={inkscape} alt="inkscape" />
215
- </a>
216
- </li>
175
+ </div>
176
+ ))
177
+ }
217
- </ul>
178
+ </div>
218
- </section>
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
- .slides {
202
+ .repos {
247
203
  display: grid;
248
204
  grid-template-columns: auto auto;
249
- gap: 2rem;
205
+ gap: 1rem;
250
- margin-top: 1rem;
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
- img {
214
+ .event {
215
+ text-overflow: ellipsis;
259
- width: 36px;
216
+ overflow: hidden;
260
- margin-right: 0.5rem;
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
- border-radius: 12px;
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: #f1f5f9;
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: #f1f5f9;
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: #1c398e;
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: #f1f5f9;
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: #d14;
69
+ color: var(--color-code-fg);
70
- background-color: var(--color-gray-100);
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-accent);
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
- href={`/posts/${post.id}`}
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 text-gray-900">
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
  }