/* * PROJECTS SECTION — selimaj.dev * Design: Glassmorphic Terminal * Masonry-style grid with glass cards, language badges, and star counts */ import { useEffect, useRef } from "react"; import { ExternalLink, Star, GitFork } from "lucide-react"; function useReveal(threshold = 0.1) { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { el.classList.add("visible"); observer.disconnect(); } }, { threshold }, ); observer.observe(el); return () => observer.disconnect(); }, [threshold]); return ref; } const LANG_COLORS: Record = { TypeScript: "#3178c6", Rust: "#ce422b", Java: "#b07219", JavaScript: "#f1e05a", Python: "#3572A5", Shell: "#89e051", "C#": "#178600", }; interface Project { name: string; org?: string; description: string; language: string; stars: number; forks?: number; href: string; featured?: boolean; tag?: string; } const projects: Project[] = [ { name: "osui", org: "osui-rs", description: "A TUI library written in Rust — build terminal UIs with a component-based approach.", language: "Rust", stars: 7, href: "https://github.com/osui-rs/osui", featured: true, tag: "Library", }, { name: "saturnclient", org: "saturnclientmc", description: "Saturn Client — a Minecraft client full of customizability and free cosmetics.", language: "Java", stars: 7, forks: 2, href: "https://github.com/saturnclientmc/saturnclient", featured: true, tag: "Game Client", }, { name: "dev-run", org: "orus-dev", description: "DevRun — a community-driven competitive programming platform inspired by speedrunning.", language: "TypeScript", stars: 3, href: "https://github.com/orus-dev/dev-run", featured: true, tag: "Platform", }, { name: "nexa-trade", org: "nexa-sol", description: "The Solana trading terminal supercharged by AI — trade smarter.", language: "TypeScript", stars: 1, href: "https://github.com/nexa-sol/nexa-trade", featured: true, tag: "FinTech", }, { name: "dockship", org: "orus-dev", description: "A powerful self-hosted deployment platform for managing your applications.", language: "TypeScript", stars: 1, href: "https://github.com/orus-dev/dockship", tag: "DevOps", }, { name: "axiom", org: "AxiomChat", description: "A modern real-time chat application built with TypeScript.", language: "TypeScript", stars: 1, href: "https://github.com/AxiomChat/axiom", tag: "App", }, { name: "linear-linux", description: "Linux support for linear.app — bringing the popular project management tool to Linux.", language: "JavaScript", stars: 27, forks: 5, href: "https://github.com/selimaj-dev/linear-linux", tag: "Tool", }, { name: "osmium", description: "A TUI component-based game engine built on top of OSUI.", language: "Rust", stars: 1, href: "https://github.com/selimaj-dev/osmium", tag: "Engine", }, { name: "spark", description: "AI documentation generator that takes context from your repository's source code.", language: "Python", stars: 2, href: "https://github.com/selimaj-dev/spark", tag: "AI Tool", }, { name: "flux", description: "A tool and library for using multiple languages in one codebase seamlessly.", language: "Rust", stars: 1, href: "https://github.com/selimaj-dev/flux", tag: "Tool", }, { name: "session-rs", description: "A lightweight async WebSocket protocol library for Rust.", language: "Rust", stars: 1, href: "https://github.com/selimaj-dev/session-rs", tag: "Library", }, { name: "tailwind-motlib", description: "A motion and stagger animation library for Tailwind CSS.", language: "TypeScript", stars: 0, href: "https://github.com/selimaj-dev/tailwind-motlib", tag: "Library", }, ]; function ProjectCard({ project, delay }: { project: Project; delay: number }) { const langColor = LANG_COLORS[project.language] || "#888"; return ( {/* Header */}
{project.tag && ( {project.tag} )}

{project.org ? ( {project.org}/ ) : null} {project.name}

{/* Description */}

{project.description}

{/* Footer */}
{project.language} {project.stars} {project.forks !== undefined && ( {project.forks} )}
); } export default function ProjectsSection() { const headerRef = useReveal(); const gridRef = useReveal(0.05); const featured = projects.filter((p) => p.featured); const rest = projects.filter((p) => !p.featured); return (
{/* Header */}
> ls projects/

Things I've Built

View all 35+ repos →
{/* Featured projects (larger cards) */}
// featured
{featured.map((project, i) => ( ))}
{/* Rest of projects (smaller grid) */}
// more projects
{rest.map((project, i) => ( ))}
); }