add:dotfiles page
This commit is contained in:
@@ -12,3 +12,19 @@ templ ArrowUpRight(className string) {
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m4.5 19.5 15-15m0 0H8.25m11.25 0v11.25"></path>
|
||||
</svg>
|
||||
}
|
||||
|
||||
templ Github(className string) {
|
||||
<svg class={ className } viewBox="0 0 24 24" fill="currentColor">
|
||||
<path
|
||||
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
|
||||
></path>
|
||||
</svg>
|
||||
}
|
||||
|
||||
templ Gitea(className string) {
|
||||
<svg class={ className } viewBox="0 0 32 32" fill="currentColor">
|
||||
<path
|
||||
d="M16 0C7.163 0 0 7.163 0 16c0 8.836 7.163 16 16 16 8.836 0 16-7.163 16-16C32 7.163 24.837 0 16 0zm7.68 21.155a1.06 1.06 0 01-1.458.387l-4.514-2.607a1.842 1.842 0 01-.638.223v4.017a1.06 1.06 0 01-2.12 0v-4.017a1.842 1.842 0 01-1.3-1.787 1.843 1.843 0 011.842-1.842c.347 0 .671.097.948.264l4.418-2.551a1.06 1.06 0 011.457.387 1.06 1.06 0 01-.387 1.457l-4.418 2.551c.01.09.016.181.016.274 0 .093-.006.184-.016.274l4.514 2.607a1.06 1.06 0 01.387 1.457l-.731-.695zm-13.512-8.24a1.06 1.06 0 011.457-.387l4.418 2.551c.277-.167.601-.264.948-.264.347 0 .671.097.948.264l4.418-2.551a1.06 1.06 0 011.457.387 1.06 1.06 0 01-.387 1.457l-4.418 2.551c.01.09.016.181.016.274a1.843 1.843 0 01-1.842 1.842 1.843 1.843 0 01-1.842-1.842c0-.093.006-.184.016-.274l-4.418-2.551a1.06 1.06 0 01-.387-1.457h.616z"
|
||||
></path>
|
||||
</svg>
|
||||
}
|
||||
|
||||
16
components/image.templ
Normal file
16
components/image.templ
Normal file
@@ -0,0 +1,16 @@
|
||||
package components
|
||||
|
||||
templ Image(src, alt, caption string) {
|
||||
<figure class="w-full">
|
||||
<img
|
||||
src={ src }
|
||||
alt={ alt }
|
||||
class="w-full h-auto rounded-lg object-cover"
|
||||
/>
|
||||
if caption != "" {
|
||||
<figcaption class="mt-2 text-center font-mono text-[0.6875rem] text-fg-300">
|
||||
{ caption }
|
||||
</figcaption>
|
||||
}
|
||||
</figure>
|
||||
}
|
||||
@@ -4,43 +4,38 @@ import (
|
||||
"fmt"
|
||||
"personal-site/constants"
|
||||
"time"
|
||||
"personal-site/components/icons"
|
||||
)
|
||||
|
||||
templ navbar(params *constants.LayoutParams) {
|
||||
<header class="sticky top-0 z-50 w-full border-b border-zinc-800 bg-bg-100/80 backdrop-blur-sm">
|
||||
<div class="max-w-3xl mx-auto h-12 flex items-center justify-between">
|
||||
<div class="max-w-3xl mx-auto px-4 h-12 flex items-center justify-between">
|
||||
<a
|
||||
href="/"
|
||||
class="font-mono text-xs text-fg-200 tracking-widest uppercase hover:text-fg-100 transition-colors duration-150"
|
||||
class="font-mono text-xs text-fg-200 tracking-widest uppercase hover:text-fg-100 transition-colors duration-150 shrink-0"
|
||||
>
|
||||
{ params.NavTitle }
|
||||
</a>
|
||||
<nav class="flex items-center gap-5">
|
||||
<nav class="flex items-center gap-4">
|
||||
<a
|
||||
href="/projects"
|
||||
class="text-xs text-fg-300 hover:text-fg-100 transition-colors duration-150"
|
||||
>projects</a>
|
||||
<a
|
||||
href="https://git.kokopi.dev/kokopi/personal-site"
|
||||
class="text-xs text-fg-300 hover:text-fg-100 transition-colors duration-150 flex items-center gap-1.5"
|
||||
class="text-xs text-fg-300 hover:text-fg-100 transition-colors duration-150 flex items-center gap-1.5 sm:p-0 p-0.5"
|
||||
aria-label="Gitea"
|
||||
>
|
||||
<svg width="12" height="12" viewBox="0 0 32 32" fill="currentColor">
|
||||
<path
|
||||
d="M16 0C7.163 0 0 7.163 0 16c0 8.836 7.163 16 16 16 8.836 0 16-7.163 16-16C32 7.163 24.837 0 16 0zm7.68 21.155a1.06 1.06 0 01-1.458.387l-4.514-2.607a1.842 1.842 0 01-.638.223v4.017a1.06 1.06 0 01-2.12 0v-4.017a1.842 1.842 0 01-1.3-1.787 1.843 1.843 0 011.842-1.842c.347 0 .671.097.948.264l4.418-2.551a1.06 1.06 0 011.457.387 1.06 1.06 0 01-.387 1.457l-4.418 2.551c.01.09.016.181.016.274 0 .093-.006.184-.016.274l4.514 2.607a1.06 1.06 0 01.387 1.457l-.731-.695zm-13.512-8.24a1.06 1.06 0 011.457-.387l4.418 2.551c.277-.167.601-.264.948-.264.347 0 .671.097.948.264l4.418-2.551a1.06 1.06 0 011.457.387 1.06 1.06 0 01-.387 1.457l-4.418 2.551c.01.09.016.181.016.274a1.843 1.843 0 01-1.842 1.842 1.843 1.843 0 01-1.842-1.842c0-.093.006-.184.016-.274l-4.418-2.551a1.06 1.06 0 01-.387-1.457h.616z"
|
||||
></path>
|
||||
</svg>
|
||||
gitea
|
||||
@icons.Gitea("size-4 shrink-0")
|
||||
<span class="hidden sm:inline">gitea</span>
|
||||
</a>
|
||||
<a
|
||||
href="https://github.com/kokopi-dev/personal-site"
|
||||
class="text-xs text-fg-300 hover:text-fg-100 transition-colors duration-150 flex items-center gap-1.5"
|
||||
class="text-xs text-fg-300 hover:text-fg-100 transition-colors duration-150 flex items-center gap-1.5 sm:p-0 p-0.5"
|
||||
aria-label="GitHub"
|
||||
>
|
||||
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
|
||||
<path
|
||||
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
|
||||
></path>
|
||||
</svg>
|
||||
github
|
||||
@icons.Github("size-4 shrink-0")
|
||||
<span class="hidden sm:inline">github</span>
|
||||
</a>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
@@ -5,4 +5,7 @@ type Project struct {
|
||||
Name string
|
||||
Description string
|
||||
TechTags []string
|
||||
LinkGitea string
|
||||
LinkGithub string
|
||||
HostedOn string
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ echo "Pulling latest code..."
|
||||
git pull
|
||||
|
||||
echo "Building and restarting containers..."
|
||||
docker compose up -d --build
|
||||
docker compose up -d --build --remove-orphans
|
||||
|
||||
echo "Cleaning up old images..."
|
||||
docker image prune -f
|
||||
|
||||
16
main.go
16
main.go
@@ -27,13 +27,19 @@ func setupRoutesAndMiddleware() *gin.Engine {
|
||||
{
|
||||
Url: "https://derrickgee.dev/projects/support-ticket-demo",
|
||||
Name: "Support Ticket System",
|
||||
Description: "",
|
||||
Description: "A sample of a robust support ticket system with the option to OAuth for database access. Authenticated users will be able to see other user created tickets. Guest mode will store tickets locally in your browser.",
|
||||
HostedOn: "Home Server",
|
||||
LinkGitea: "https://git.kokopi.dev/kokopi/personal-support-ticket-system",
|
||||
LinkGithub: "https://github.com/kokopi-dev/personal-support-ticket-system",
|
||||
TechTags: []string{"typescript", "react", "fastify", "tailwindcss", "sqlite", "vite", "bun"},
|
||||
},
|
||||
{
|
||||
Url: "/projects/dotfiles",
|
||||
Name: "Linux Dotfiles",
|
||||
Description: "Configurations for Linux",
|
||||
HostedOn: "",
|
||||
LinkGitea: "https://git.kokopi.dev/kokopi/dotfiles",
|
||||
LinkGithub: "https://github.com/kokopi-dev/dotfiles",
|
||||
TechTags: []string{"Linux", "Lua", "Bash", "Python"},
|
||||
},
|
||||
}
|
||||
@@ -41,10 +47,10 @@ func setupRoutesAndMiddleware() *gin.Engine {
|
||||
page := pages.ProjectPage(projects)
|
||||
page.Render(c.Request.Context(), c.Writer)
|
||||
})
|
||||
// r.GET("/projects/dotfiles", func(c *gin.Context) {
|
||||
// page := pages.Dotfiles()
|
||||
// page.Render(c.Request.Context(), c.Writer)
|
||||
// })
|
||||
r.GET("/projects/dotfiles", func(c *gin.Context) {
|
||||
page := pages.Dotfiles()
|
||||
page.Render(c.Request.Context(), c.Writer)
|
||||
})
|
||||
r.NoRoute(handlers.NotFoundHandler)
|
||||
return r
|
||||
}
|
||||
|
||||
47
pages/dotfiles.templ
Normal file
47
pages/dotfiles.templ
Normal file
@@ -0,0 +1,47 @@
|
||||
package pages
|
||||
|
||||
import (
|
||||
"personal-site/components"
|
||||
"personal-site/components/icons"
|
||||
"personal-site/constants"
|
||||
)
|
||||
|
||||
templ Dotfiles() {
|
||||
{{ params := constants.NewLayoutParams("Dotfiles") }}
|
||||
@components.MainLayout(params) {
|
||||
<div class="flex flex-col gap-6">
|
||||
<div class="fade-up flex flex-col gap-3" style="animation-delay:0ms">
|
||||
<h1 class="text-3xl font-semibold tracking-tight">Dotfiles</h1>
|
||||
<div class="flex items-center gap-4">
|
||||
<a
|
||||
href="https://git.kokopi.dev/kokopi/dotfiles"
|
||||
target="_blank"
|
||||
class="pointer-events-auto inline-flex items-center gap-1.5 px-3.5 py-2 rounded-md text-sm font-medium bg-zinc-800 text-fg-200 border border-zinc-700 hover:border-zinc-500 hover:text-fg-100 transition-all duration-150"
|
||||
>
|
||||
@icons.Gitea("size-5")
|
||||
Gitea
|
||||
@icons.ArrowUpRight("size-4")
|
||||
</a>
|
||||
<a
|
||||
href="https://github.com/kokopi-dev/dotfiles"
|
||||
target="_blank"
|
||||
class="pointer-events-auto inline-flex items-center gap-1.5 px-3.5 py-2 rounded-md text-sm font-medium bg-zinc-800 text-fg-200 border border-zinc-700 hover:border-zinc-500 hover:text-fg-100 transition-all duration-150"
|
||||
>
|
||||
@icons.Github("size-5")
|
||||
GitHub
|
||||
@icons.ArrowUpRight("size-4")
|
||||
</a>
|
||||
</div>
|
||||
<p class="text-fg-200 text-sm leading-relaxed">
|
||||
I have been using Linux since 2017, and have gone through several distros. Pretty early on, I have only used window managers (wm) and Arch Linux. Over time, I have gone through bspwm on x11, hyprland on wayland, and mangowc on wayland. Since getting into programming, I have also strictly used only vim + neovim for hobby projects.
|
||||
</p>
|
||||
</div>
|
||||
<hr class="border-fg-300 fade-up" style="animation-delay:80ms"/>
|
||||
@components.Image("/static/assets/images/dotfiles-1-1.webp", "dotfiles-1-1", "Arch Linux with mangowc, showing fastfetch")
|
||||
@components.Image("/static/assets/images/dotfiles-1-2.webp", "dotfiles-1-2", "Arch Linux with mangowc, showing neovim and a custom rofi launcher")
|
||||
@components.Image("/static/assets/images/dotfiles-2.webp", "dotfiles-2", "Arch Linux with hyprland")
|
||||
@components.Image("/static/assets/images/dotfiles-3.webp", "dotfiles-3", "Arch Linux with bspwm")
|
||||
</div>
|
||||
<div></div>
|
||||
}
|
||||
}
|
||||
@@ -7,60 +7,50 @@ import "personal-site/components/icons"
|
||||
templ heroSection() {
|
||||
<section id="hero" class="pb-5">
|
||||
<p
|
||||
class="hero-eyebrow fade-up font-mono text-xs font-medium text-fg-200 tracking-[0.08em] uppercase flex items-center gap-2 mb-5"
|
||||
>
|
||||
class="hero-eyebrow fade-up font-mono text-xs font-medium text-fg-200 tracking-[0.08em] uppercase flex items-center gap-2 mb-5">
|
||||
available for work
|
||||
</p>
|
||||
<h1 class="fade-up delay-1 text-[clamp(2.25rem,6vw,3.25rem)] font-bold tracking-[-0.04em] leading-[1.05] mb-3">
|
||||
<h1 class="fade-up delay-100 text-[clamp(2.25rem,6vw,3.25rem)] font-bold tracking-[-0.04em] leading-[1.05] mb-3">
|
||||
Derrick Gee
|
||||
</h1>
|
||||
<p class="fade-up delay-2 text-base font-normal text-fg-200 mb-2">Full Stack Software Engineer</p>
|
||||
<p class="fade-up delay-2 font-mono text-xs text-fg-300 flex items-center gap-1.5 mb-8">
|
||||
<p class="fade-up delay-200 text-base font-normal text-fg-200 mb-2">Full Stack Software Engineer</p>
|
||||
<p class="fade-up delay-200 font-mono text-xs text-fg-300 flex items-center gap-1.5 mb-8">
|
||||
<svg width="12" height="12" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
||||
<path d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path>
|
||||
<path d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
</svg>
|
||||
Japan · US Citizen
|
||||
</p>
|
||||
<p class="fade-up delay-3 text-[0.9375rem] text-fg-200 max-w-120 leading-[1.7] mb-9">
|
||||
Full-stack software engineer who ships — from backend APIs to polished frontends. Aligned with US timezones and based in Japan, building things that
|
||||
<p class="fade-up delay-300 text-[0.9375rem] text-fg-200 max-w-120 leading-[1.7] mb-9">
|
||||
Full-stack software engineer who ships — from backend APIs to polished frontends. Aligned with US timezones and
|
||||
based in Japan, building things that
|
||||
matter.
|
||||
</p>
|
||||
<div class="fade-up delay-4 flex items-center gap-3 flex-wrap">
|
||||
<a
|
||||
href="/projects"
|
||||
class="inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium bg-fg-100 text-bg-100 border border-transparent no-underline transition-opacity duration-150 hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-100"
|
||||
>
|
||||
<a href="/projects"
|
||||
class="inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium bg-fg-100 text-bg-100 border border-transparent no-underline transition-opacity duration-150 hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-100">
|
||||
View Projects
|
||||
</a>
|
||||
<a
|
||||
href="#experience"
|
||||
class="inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium bg-transparent text-fg-100 border border-border-100 no-underline transition-all duration-150 hover:bg-bg-300 hover:border-border-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-100"
|
||||
>
|
||||
<a href="#experience"
|
||||
class="inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium bg-transparent text-fg-100 border border-border-100 no-underline transition-all duration-150 hover:bg-bg-300 hover:border-border-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-100">
|
||||
Experience
|
||||
</a>
|
||||
<a
|
||||
href="https://git.kokopi.dev/kokopi"
|
||||
target="_blank"
|
||||
class="inline-flex items-center gap-2 p-1.5 rounded-lg text-[0.8125rem] font-medium bg-transparent text-fg-200 no-underline transition-all duration-150 hover:text-fg-100 hover:bg-bg-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-100"
|
||||
>
|
||||
<a href="https://git.kokopi.dev/kokopi" target="_blank"
|
||||
class="inline-flex items-center gap-2 p-1.5 rounded-lg text-[0.8125rem] font-medium bg-transparent text-fg-200 no-underline transition-all duration-150 hover:text-fg-100 hover:bg-bg-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-100">
|
||||
<svg width="15" height="15" viewBox="0 0 32 32" fill="currentColor">
|
||||
<path
|
||||
d="M16 0C7.163 0 0 7.163 0 16c0 8.836 7.163 16 16 16 8.836 0 16-7.163 16-16C32 7.163 24.837 0 16 0zm7.68 21.155a1.06 1.06 0 01-1.458.387l-4.514-2.607a1.842 1.842 0 01-.638.223v4.017a1.06 1.06 0 01-2.12 0v-4.017a1.842 1.842 0 01-1.3-1.787 1.843 1.843 0 011.842-1.842c.347 0 .671.097.948.264l4.418-2.551a1.06 1.06 0 011.457.387 1.06 1.06 0 01-.387 1.457l-4.418 2.551c.01.09.016.181.016.274 0 .093-.006.184-.016.274l4.514 2.607a1.06 1.06 0 01.387 1.457l-.731-.695zm-13.512-8.24a1.06 1.06 0 011.457-.387l4.418 2.551c.277-.167.601-.264.948-.264.347 0 .671.097.948.264l4.418-2.551a1.06 1.06 0 011.457.387 1.06 1.06 0 01-.387 1.457l-4.418 2.551c.01.09.016.181.016.274a1.843 1.843 0 01-1.842 1.842 1.843 1.843 0 01-1.842-1.842c0-.093.006-.184.016-.274l-4.418-2.551a1.06 1.06 0 01-.387-1.457h.616z"
|
||||
></path>
|
||||
d="M16 0C7.163 0 0 7.163 0 16c0 8.836 7.163 16 16 16 8.836 0 16-7.163 16-16C32 7.163 24.837 0 16 0zm7.68 21.155a1.06 1.06 0 01-1.458.387l-4.514-2.607a1.842 1.842 0 01-.638.223v4.017a1.06 1.06 0 01-2.12 0v-4.017a1.842 1.842 0 01-1.3-1.787 1.843 1.843 0 011.842-1.842c.347 0 .671.097.948.264l4.418-2.551a1.06 1.06 0 011.457.387 1.06 1.06 0 01-.387 1.457l-4.418 2.551c.01.09.016.181.016.274 0 .093-.006.184-.016.274l4.514 2.607a1.06 1.06 0 01.387 1.457l-.731-.695zm-13.512-8.24a1.06 1.06 0 011.457-.387l4.418 2.551c.277-.167.601-.264.948-.264.347 0 .671.097.948.264l4.418-2.551a1.06 1.06 0 011.457.387 1.06 1.06 0 01-.387 1.457l-4.418 2.551c.01.09.016.181.016.274a1.843 1.843 0 01-1.842 1.842 1.843 1.843 0 01-1.842-1.842c0-.093.006-.184.016-.274l-4.418-2.551a1.06 1.06 0 01-.387-1.457h.616z">
|
||||
</path>
|
||||
</svg>
|
||||
Gitea
|
||||
@icons.ArrowUpRight("size-3")
|
||||
</a>
|
||||
<a
|
||||
href="https://github.com/kokopi-dev"
|
||||
target="_blank"
|
||||
class="inline-flex items-center gap-2 p-1.5 rounded-lg text-[0.8125rem] font-medium bg-transparent text-fg-200 no-underline transition-all duration-150 hover:text-fg-100 hover:bg-bg-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-100"
|
||||
>
|
||||
<a href="https://github.com/kokopi-dev" target="_blank"
|
||||
class="inline-flex items-center gap-2 p-1.5 rounded-lg text-[0.8125rem] font-medium bg-transparent text-fg-200 no-underline transition-all duration-150 hover:text-fg-100 hover:bg-bg-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-100">
|
||||
<svg width="15" height="15" fill="currentColor" viewBox="0 0 24 24">
|
||||
<path
|
||||
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
|
||||
></path>
|
||||
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z">
|
||||
</path>
|
||||
</svg>
|
||||
GitHub
|
||||
@icons.ArrowUpRight("size-3")
|
||||
@@ -72,51 +62,41 @@ templ heroSection() {
|
||||
templ aboutSection() {
|
||||
<section id="about" class="py-5">
|
||||
<p
|
||||
class="section-label font-mono text-[0.6875rem] font-semibold tracking-widest uppercase text-fg-300 mb-5 flex items-center gap-3"
|
||||
>
|
||||
class="section-label font-mono text-[0.6875rem] font-semibold tracking-widest uppercase text-fg-300 mb-5 flex items-center gap-3">
|
||||
about
|
||||
</p>
|
||||
<div
|
||||
class="fade-up bg-bg-200 border border-border-100 rounded-lg p-5 transition-all duration-200 hover:border-border-200 hover:bg-bg-300"
|
||||
>
|
||||
class="fade-up bg-bg-200 border border-border-100 rounded-lg p-5 transition-all duration-200 hover:border-border-200 hover:bg-bg-300">
|
||||
<p class="text-[0.9375rem] text-fg-200 leading-[1.75] mb-5">
|
||||
I'm a full-stack software engineer specializing in Python and C# Blazor — I work across the whole stack,
|
||||
from backend APIs to server-side rendering to the UI.
|
||||
</p>
|
||||
<p class="text-[0.9375rem] text-fg-200 leading-[1.75] mb-6">
|
||||
I'm also a Linux and Neovim enthusiast, which means I care just as much about the craft of writing code as I do about shipping it.
|
||||
I'm also a Linux and Neovim enthusiast, which means I care just as much about the craft of writing code as I
|
||||
do about shipping it.
|
||||
</p>
|
||||
<div class="flex flex-wrap gap-1.5">
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>Python</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">Python</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">
|
||||
C#
|
||||
/ Blazor
|
||||
</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>Golang</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">Golang</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>FastAPI</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">FastAPI</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>Tailwindcss</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">Tailwindcss</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>Javascript</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">Javascript</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>Lua</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">Lua</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>Neovim</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">Neovim</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap"
|
||||
>Linux</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100 whitespace-nowrap">Linux</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -125,21 +105,18 @@ templ aboutSection() {
|
||||
templ expSection() {
|
||||
<section id="experience" class="py-5">
|
||||
<p
|
||||
class="section-label font-mono text-[0.6875rem] font-semibold tracking-widest uppercase text-fg-300 mb-5 flex items-center gap-3"
|
||||
>
|
||||
class="section-label font-mono text-[0.6875rem] font-semibold tracking-widest uppercase text-fg-300 mb-5 flex items-center gap-3">
|
||||
experience
|
||||
</p>
|
||||
<div class="flex flex-col gap-3">
|
||||
// westbold
|
||||
<div
|
||||
class="fade-up bg-bg-200 border border-border-100 rounded-lg p-5 transition-colors duration-200 hover:border-border-200"
|
||||
>
|
||||
class="fade-up bg-bg-200 border border-border-100 rounded-lg p-5 transition-colors duration-200 hover:border-border-200">
|
||||
<div class="flex justify-between items-start gap-4 flex-wrap mb-1.5">
|
||||
<div>
|
||||
<p class="text-xs font-medium text-fg-200 mb-1 flex items-center gap-2">
|
||||
<span
|
||||
class="status-live inline-block w-1.5 h-1.5 rounded-full bg-[oklch(0.72_0.15_145)] mr-1"
|
||||
></span>
|
||||
class="status-live inline-block w-1.5 h-1.5 rounded-full bg-[oklch(0.72_0.15_145)] mr-1"></span>
|
||||
Westbold · Remote
|
||||
</p>
|
||||
<p class="text-[0.9375rem] font-semibold mb-2">Full Stack Software Engineer</p>
|
||||
@@ -153,29 +130,22 @@ templ expSection() {
|
||||
</p>
|
||||
<div class="flex flex-wrap gap-1.5">
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>C#</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">C#</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Blazor</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Blazor</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Tailwindcss</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Tailwindcss</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Golang</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Golang</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Javascript</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Javascript</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Python</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Python</span>
|
||||
</div>
|
||||
</div>
|
||||
// tenchijin
|
||||
<div
|
||||
class="fade-up delay-1 bg-bg-200 border border-border-100 rounded-lg p-5 transition-colors duration-200 hover:border-border-200"
|
||||
>
|
||||
class="fade-up delay-100 bg-bg-200 border border-border-100 rounded-lg p-5 transition-colors duration-200 hover:border-border-200">
|
||||
<div class="flex justify-between items-start gap-4 flex-wrap mb-1.5">
|
||||
<div>
|
||||
<p class="text-xs font-medium text-fg-200 mb-1 flex items-center gap-2">
|
||||
@@ -193,20 +163,16 @@ templ expSection() {
|
||||
</p>
|
||||
<div class="flex flex-wrap gap-1.5">
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Python</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Python</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Django</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Django</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>VueJS</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">VueJS</span>
|
||||
</div>
|
||||
</div>
|
||||
// hennge
|
||||
<div
|
||||
class="fade-up delay-2 bg-bg-200 border border-border-100 rounded-lg p-5 transition-colors duration-200 hover:border-border-200"
|
||||
>
|
||||
class="fade-up delay-200 bg-bg-200 border border-border-100 rounded-lg p-5 transition-colors duration-200 hover:border-border-200">
|
||||
<div class="flex justify-between items-start gap-4 flex-wrap mb-1.5">
|
||||
<div>
|
||||
<p class="text-xs font-medium text-fg-200 mb-1 flex items-center gap-2">
|
||||
@@ -223,17 +189,13 @@ templ expSection() {
|
||||
</p>
|
||||
<div class="flex flex-wrap gap-1.5">
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Python</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Python</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>VueJS</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">VueJS</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>Terraform</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">Terraform</span>
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100"
|
||||
>AWS</span>
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[0.6875rem] font-medium bg-bg-300 text-fg-200 border border-border-100">AWS</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,46 +3,80 @@ package pages
|
||||
import "personal-site/constants"
|
||||
import "fmt"
|
||||
import "personal-site/components"
|
||||
import "personal-site/components/icons"
|
||||
|
||||
templ projectCard(idx int, project constants.Project) {
|
||||
<a href={ project.Url } target="_blank"
|
||||
class="group rounded-lg px-5 py-4 flex items-start justify-between gap-4 fade-up bg-[#111113] border border-zinc-800 transition-all duration-150 ease-in-out hover:border-zinc-600 hover:bg-[#18181b] hover:-translate-y-0.5"
|
||||
style={ fmt.Sprintf("animation-delay: %dms", idx*30) }>
|
||||
<div class="flex-1 min-w-0">
|
||||
<div
|
||||
class="group relative rounded-lg px-5 py-4 flex items-start justify-between gap-4 fade-up bg-[#111113] border border-zinc-800 transition-all duration-150 ease-in-out hover:border-zinc-600 hover:bg-[#18181b] hover:-translate-y-0.5"
|
||||
style={ fmt.Sprintf("animation-delay: %dms", idx*30) }
|
||||
>
|
||||
<a href={ project.Url } target="_blank" class="absolute inset-0 rounded-lg" aria-label={ project.Name }></a>
|
||||
<div class="pointer-events-none relative z-10 flex-1 min-w-0">
|
||||
<div class="flex items-center gap-2.5 mb-1.5">
|
||||
<span class="text-sm font-medium">{ project.Name }</span>
|
||||
</div>
|
||||
<p class="text-zinc-500 text-xs leading-relaxed mb-3">{ project.Description }</p>
|
||||
<div class="flex flex-wrap gap-1.5">
|
||||
<div class="flex flex-wrap gap-1.5 mb-3">
|
||||
for _, tag := range project.TechTags {
|
||||
<span class="font-mono text-xs px-2 py-0.5 rounded-sm bg-zinc-800 text-fg-200">{ tag }</span>
|
||||
}
|
||||
</div>
|
||||
if project.HostedOn != "" {
|
||||
<p class="text-zinc-600 text-[0.6875rem] font-mono mb-3">
|
||||
<span class="text-zinc-500">hosted on</span> { project.HostedOn }
|
||||
</p>
|
||||
}
|
||||
if project.LinkGitea != "" || project.LinkGithub != "" {
|
||||
<div class="flex items-center gap-2">
|
||||
if project.LinkGitea != "" {
|
||||
<a
|
||||
href={ templ.URL(project.LinkGitea) }
|
||||
target="_blank"
|
||||
class="pointer-events-auto inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md text-[0.6875rem] font-medium bg-zinc-800 text-fg-200 border border-zinc-700 hover:border-zinc-500 hover:text-fg-100 transition-all duration-150"
|
||||
>
|
||||
@icons.Gitea("size-4")
|
||||
Gitea
|
||||
@icons.ArrowUpRight("size-3")
|
||||
</a>
|
||||
}
|
||||
if project.LinkGithub != "" {
|
||||
<a
|
||||
href={ templ.URL(project.LinkGithub) }
|
||||
target="_blank"
|
||||
class="pointer-events-auto inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md text-[0.6875rem] font-medium bg-zinc-800 text-fg-200 border border-zinc-700 hover:border-zinc-500 hover:text-fg-100 transition-all duration-150"
|
||||
>
|
||||
@icons.Github("size-4")
|
||||
GitHub
|
||||
@icons.ArrowUpRight("size-3")
|
||||
</a>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<div
|
||||
class="arrow text-fg-200 mt-0.5 shrink-0 opacity-0 group-hover:opacity-100 transition-all duration-150 ease-in-out">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none">
|
||||
<path d="M2 12L12 2M12 2H5M12 2V9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
|
||||
stroke-linejoin="round"></path>
|
||||
</svg>
|
||||
class="arrow relative z-10 text-fg-200 mt-0.5 shrink-0 opacity-0 group-hover:opacity-100 transition-all duration-150 ease-in-out"
|
||||
>
|
||||
@icons.ArrowUpRight("size-4")
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
}
|
||||
|
||||
templ ProjectPage(projects []constants.Project) {
|
||||
{{ params := constants.NewLayoutParams("Home") }}
|
||||
@components.MainLayout(params) {
|
||||
<div class="max-w-xl flex flex-col gap-4">
|
||||
<div class="fade-up flex flex-col gap-3" style="animation-delay:0ms">
|
||||
<p class="mono text-xs text-fg-200 tracking-widest uppercase">derrickgee.dev/projects</p>
|
||||
<h1 class="text-3xl font-semibold tracking-tight">Projects Directory</h1>
|
||||
<p class="text-fg-200 text-sm leading-relaxed max-w-md">
|
||||
<p class="text-fg-200 text-sm leading-relaxed">
|
||||
A collection of projects built across different languages and frameworks.
|
||||
Each runs as an independent service.
|
||||
</p>
|
||||
</div>
|
||||
<hr class="border-base-100 fade-up" style="animation-delay:80ms" />
|
||||
<hr class="border-fg-300 fade-up" style="animation-delay:80ms"/>
|
||||
for idx, p := range projects {
|
||||
@projectCard(idx, p)
|
||||
}
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
BIN
static/assets/images/dotfiles-1-1.webp
Normal file
BIN
static/assets/images/dotfiles-1-1.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 102 KiB |
BIN
static/assets/images/dotfiles-1-2.webp
Normal file
BIN
static/assets/images/dotfiles-1-2.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
BIN
static/assets/images/dotfiles-2.webp
Normal file
BIN
static/assets/images/dotfiles-2.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 104 KiB |
BIN
static/assets/images/dotfiles-3.webp
Normal file
BIN
static/assets/images/dotfiles-3.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 103 KiB |
Reference in New Issue
Block a user