aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package-lock.json124
-rw-r--r--package.json5
-rw-r--r--src/App.tsx16
-rw-r--r--src/components/Card.tsx (renamed from src/components/CardLink.tsx)0
-rw-r--r--src/components/Gallery.tsx (renamed from src/components/ImageGalleryGrid.tsx)2
-rw-r--r--src/index.css13
-rw-r--r--src/pages/404.tsx (renamed from src/pages/404Page.tsx)2
-rw-r--r--src/pages/Blog.tsx19
-rw-r--r--src/pages/Gear.tsx8
-rw-r--r--src/pages/Home.tsx8
-rw-r--r--src/pages/Post.tsx8
-rw-r--r--src/pages/Projects.tsx8
-rw-r--r--vite.config.ts2
13 files changed, 48 insertions, 167 deletions
diff --git a/package-lock.json b/package-lock.json
index 5e5a842..47107a3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,12 +11,9 @@
"@tailwindcss/vite": "^4.1.7",
"react": "^19.1.0",
"react-dom": "^19.1.0",
- "react-router-dom": "^7.6.1",
- "tailwindcss": "^4.1.7"
+ "react-router-dom": "^7.6.1"
},
"devDependencies": {
- "@babel/core": "^7.27.4",
- "@babel/preset-react": "^7.27.1",
"@eslint/js": "^9.25.0",
"@types/react": "^19.1.2",
"@types/react-dom": "^19.1.2",
@@ -118,19 +115,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
- "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.27.3"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/helper-compilation-targets": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
@@ -250,74 +234,6 @@
"node": ">=6.0.0"
}
},
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
- "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-display-name": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz",
- "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz",
- "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/plugin-syntax-jsx": "^7.27.1",
- "@babel/types": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz",
- "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-transform-react-jsx-self": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
@@ -350,44 +266,6 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz",
- "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-react": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz",
- "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-validator-option": "^7.27.1",
- "@babel/plugin-transform-react-display-name": "^7.27.1",
- "@babel/plugin-transform-react-jsx": "^7.27.1",
- "@babel/plugin-transform-react-jsx-development": "^7.27.1",
- "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/template": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
diff --git a/package.json b/package.json
index e1e5255..6029d9e 100644
--- a/package.json
+++ b/package.json
@@ -13,12 +13,9 @@
"@tailwindcss/vite": "^4.1.7",
"react": "^19.1.0",
"react-dom": "^19.1.0",
- "react-router-dom": "^7.6.1",
- "tailwindcss": "^4.1.7"
+ "react-router-dom": "^7.6.1"
},
"devDependencies": {
- "@babel/core": "^7.27.4",
- "@babel/preset-react": "^7.27.1",
"@eslint/js": "^9.25.0",
"@types/react": "^19.1.2",
"@types/react-dom": "^19.1.2",
diff --git a/src/App.tsx b/src/App.tsx
index dba1c7c..ca7bcb4 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,10 +1,10 @@
import { Routes, Route } from 'react-router-dom';
import Navbar from './components/Navbar';
-import GearPage from './pages/Gear';
-import HomePage from './pages/Home';
-import ProjectsPage from './pages/Projects';
+import Gear from './pages/Gear';
+import Home from './pages/Home';
+import Projects from './pages/Projects';
import Footer from './components/Footer';
-import NotFoundPage from './pages/404Page';
+import NotFound from './pages/404';
import Blog from './pages/Blog';
import Post from './pages/Post';
@@ -15,12 +15,12 @@ function App() {
<Navbar />
<section className="max-w-xl mx-auto py-5 px-4">
<Routes>
- <Route path="/" element={<HomePage />} />
- <Route path="/gear" element={<GearPage />} />
- <Route path='/projects' element={<ProjectsPage />} />
+ <Route path="/" element={<Home />} />
+ <Route path="/gear" element={<Gear />} />
+ <Route path='/projects' element={<Projects />} />
<Route path='/blog' element={<Blog />} />
<Route path='/blog/:slug' element={<Post />} />
- <Route path='*' element={<NotFoundPage />} />
+ <Route path='*' element={<NotFound />} />
</Routes>
</section>
<Footer />
diff --git a/src/components/CardLink.tsx b/src/components/Card.tsx
index e71cf33..e71cf33 100644
--- a/src/components/CardLink.tsx
+++ b/src/components/Card.tsx
diff --git a/src/components/ImageGalleryGrid.tsx b/src/components/Gallery.tsx
index 0b657cf..ffcf0e1 100644
--- a/src/components/ImageGalleryGrid.tsx
+++ b/src/components/Gallery.tsx
@@ -8,7 +8,7 @@ interface ImageItems {
}>;
}
-export default function ImageGalleryGrid({ images }: ImageItems) {
+export default function Gallery({ images }: ImageItems) {
const [selectedIndex, setSelectedIndex] = useState<number | null>(null);
const closeModal = () => setSelectedIndex(null);
const prev = (e?: React.MouseEvent) => {
diff --git a/src/index.css b/src/index.css
index fcfe02a..4e1f7d9 100644
--- a/src/index.css
+++ b/src/index.css
@@ -3,7 +3,10 @@
@custom-variant dark (&:where(.dark, .dark *));
@layer base {
- body {
+
+ html,
+ body,
+ #root {
@apply bg-white dark:bg-black/95;
}
@@ -31,15 +34,15 @@
@apply text-xl font-semibold dark:text-gray-200;
}
- article>*>p {
+ .post p {
@apply mb-4 leading-relaxed;
}
- article>*>ul {
+ .post ul {
@apply list-disc pl-6 space-y-1;
}
- article>*>*>img {
+ .post img {
@apply mx-auto mb-4 w-64 rounded-lg shadow;
}
@@ -51,7 +54,7 @@
@apply underline text-purple-500;
}
- pre {
+ .post pre {
@apply whitespace-pre overflow-x-auto max-w-full max-h-80 rounded-lg border p-2 my-2 border-neutral-300 dark:border-neutral-800 bg-neutral-100 dark:bg-neutral-900;
}
diff --git a/src/pages/404Page.tsx b/src/pages/404.tsx
index d7bfa10..d9eed89 100644
--- a/src/pages/404Page.tsx
+++ b/src/pages/404.tsx
@@ -1,7 +1,7 @@
import { useNavigate } from "react-router-dom";
import { useEffect } from "react";
-export default function NotFoundPage() {
+export default function NotFound() {
const navigate = useNavigate();
useEffect(() => {
diff --git a/src/pages/Blog.tsx b/src/pages/Blog.tsx
index 47b44d6..fb07fb1 100644
--- a/src/pages/Blog.tsx
+++ b/src/pages/Blog.tsx
@@ -1,6 +1,6 @@
-import CardLink from "../components/CardLink";
+import Card from "../components/Card";
-interface PostMeta {
+interface Meta {
slug: string;
title: string;
date: string;
@@ -10,13 +10,13 @@ interface PostMeta {
const postFiles = import.meta.glob("../blog/*.md", { eager: true }) as Record<
string,
- { attributes: Omit<PostMeta, "slug"> }
+ { attributes: Omit<Meta, "slug"> }
>;
-const posts: PostMeta[] = Object.entries(postFiles)
+const posts: Meta[] = Object.entries(postFiles)
.map(([path, mod]) => ({
slug: path.split("/").pop()!.replace(".md", ""),
- ...(mod.attributes as Omit<PostMeta, "slug">),
+ ...(mod.attributes as Omit<Meta, "slug">),
}))
.sort(
(a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()
@@ -24,18 +24,19 @@ const posts: PostMeta[] = Object.entries(postFiles)
export default function Blog() {
return (
- <section className="container mx-auto px-4 py-10">
- <h1 className="text-4xl font-bold mb-8">Blog</h1>
+ <>
+ <title>߸ projects</title>
+ <h1>Blog</h1>
{posts.map((post) => (
<a key={post.slug} href={`/blog/${post.slug}`} className="block py-1">
- <CardLink
+ <Card
title={post.title}
body={post.excerpt}
imgSrc={post.cover}
/>
</a>
))}
- </section>
+ </>
);
}
diff --git a/src/pages/Gear.tsx b/src/pages/Gear.tsx
index dbbcdfb..a1984ee 100644
--- a/src/pages/Gear.tsx
+++ b/src/pages/Gear.tsx
@@ -1,4 +1,4 @@
-import CardLink from '../components/CardLink';
+import Card from '../components/Card';
import {
dailyDrivers,
@@ -14,7 +14,7 @@ function PartsGroup({ title, parts }: { title?: string; parts: Part[] }) {
<ul className="space-y-2">
{parts.map((p) => (
<li key={p.name}>
- <CardLink
+ <Card
title={p.name}
body={p.description}
href={p.url}
@@ -27,7 +27,7 @@ function PartsGroup({ title, parts }: { title?: string; parts: Part[] }) {
);
}
-export default function GearPage() {
+export default function Gear() {
return (
<>
<title>߸ gear</title>
@@ -40,4 +40,4 @@ export default function GearPage() {
<PartsGroup title="NAS" parts={nasParts} />
</>
);
-} \ No newline at end of file
+}
diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx
index 2048122..9b73c05 100644
--- a/src/pages/Home.tsx
+++ b/src/pages/Home.tsx
@@ -1,6 +1,6 @@
-import ImageGalleryGrid from "../components/ImageGalleryGrid";
+import Gallery from "../components/Gallery";
-export default function HomePage() {
+export default function Home() {
return (
<>
<title>߸ hi</title>
@@ -10,7 +10,7 @@ export default function HomePage() {
I have a passion for hardware and software, studying computer science. Currently building own 3d printing projects and learning nix.
</p>
- <ImageGalleryGrid
+ <Gallery
images={[
{ src: "/images/3ds.webp", alt: "Nintendo 3DS", id: 1 },
{ src: "/images/esp32.webp", alt: "ESP 32", id: 2 },
@@ -33,4 +33,4 @@ export default function HomePage() {
</ul>
</>
);
-} \ No newline at end of file
+}
diff --git a/src/pages/Post.tsx b/src/pages/Post.tsx
index b2b1d5b..76396ae 100644
--- a/src/pages/Post.tsx
+++ b/src/pages/Post.tsx
@@ -26,7 +26,7 @@ export default function Post() {
const { attributes: meta, ReactComponent: Content } = post;
return (
- <article>
+ <>
<a href="/blog" className="no-underline hover:underline">
← Back
</a>
@@ -41,7 +41,9 @@ export default function Post() {
<h1>{meta.title}</h1>
<p className="text-sm text-zinc-500 mb-8">{formDate.format(new Date(meta.date))}</p>
- <Content />
- </article>
+ <div className="post">
+ <Content />
+ </div>
+ </>
);
}
diff --git a/src/pages/Projects.tsx b/src/pages/Projects.tsx
index d49a3d2..973eaa0 100644
--- a/src/pages/Projects.tsx
+++ b/src/pages/Projects.tsx
@@ -1,7 +1,7 @@
-import CardLink from '../components/CardLink';
+import Card from '../components/Card';
import { projects, type Project } from '../data/projects';
-export default function ProjectsPage() {
+export default function Projects() {
return (
<>
<title>߸ projects</title>
@@ -10,7 +10,7 @@ export default function ProjectsPage() {
<ul className="space-y-2">
{projects.map((p: Project) => (
<li key={p.name}>
- <CardLink
+ <Card
title={p.name}
body={p.description}
href={p.url}
@@ -21,4 +21,4 @@ export default function ProjectsPage() {
</ul>
</>
);
-} \ No newline at end of file
+}
diff --git a/vite.config.ts b/vite.config.ts
index 90ad9c0..2ca7883 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -10,7 +10,7 @@ export default defineConfig({
tailwindcss(),
Sitemap({
hostname: "https://schererleander.de",
- dynamicRoutes: [ "/", "/gear", "/projects", "/homelab", "/blog" ]
+ dynamicRoutes: [ "/", "/gear", "/projects", "/blog" ]
}),
mdPlugin({mode: [Mode.REACT, Mode.MARKDOWN],}),
],