From d82fb3b552d20a279efdd9408042183cfa02fb48 Mon Sep 17 00:00:00 2001 From: schererleander Date: Thu, 25 Dec 2025 23:33:25 +0000 Subject: initial commit --- components/footer.tsx | 20 ++++++++++ components/header.tsx | 42 ++++++++++++++++++++ components/map-wrapper.tsx | 10 +++++ components/map.tsx | 70 ++++++++++++++++++++++++++++++++ components/mdx-content.tsx | 12 ++++++ components/noise.tsx | 8 ++++ components/panda.tsx | 9 +++++ components/post-card.tsx | 20 ++++++++++ components/projects-grid.tsx | 51 ++++++++++++++++++++++++ components/theme-provider.tsx | 11 ++++++ components/tools-grid.tsx | 56 ++++++++++++++++++++++++++ components/ui/button.tsx | 58 +++++++++++++++++++++++++++ components/ui/card.tsx | 92 +++++++++++++++++++++++++++++++++++++++++++ 13 files changed, 459 insertions(+) create mode 100644 components/footer.tsx create mode 100644 components/header.tsx create mode 100644 components/map-wrapper.tsx create mode 100644 components/map.tsx create mode 100644 components/mdx-content.tsx create mode 100644 components/noise.tsx create mode 100644 components/panda.tsx create mode 100644 components/post-card.tsx create mode 100644 components/projects-grid.tsx create mode 100644 components/theme-provider.tsx create mode 100644 components/tools-grid.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx (limited to 'components') diff --git a/components/footer.tsx b/components/footer.tsx new file mode 100644 index 0000000..b78b8b3 --- /dev/null +++ b/components/footer.tsx @@ -0,0 +1,20 @@ +import Link from 'next/link' +import { Panda } from './panda' + +export function Footer() { + return ( + + ) +} diff --git a/components/header.tsx b/components/header.tsx new file mode 100644 index 0000000..79cb0c0 --- /dev/null +++ b/components/header.tsx @@ -0,0 +1,42 @@ +import Link from "next/link" +import { PawPrint, Github, Mail } from "lucide-react" +import { Button } from "@/components/ui/button" + +export function Header() { + return ( +
+
+ + + + +
+ +
+ + +
+
+ ) +} diff --git a/components/map-wrapper.tsx b/components/map-wrapper.tsx new file mode 100644 index 0000000..2407702 --- /dev/null +++ b/components/map-wrapper.tsx @@ -0,0 +1,10 @@ + +"use client" + +import dynamic from 'next/dynamic' + +const Map = dynamic(() => import('./map')) + +export default function MapWrapper() { + return +} diff --git a/components/map.tsx b/components/map.tsx new file mode 100644 index 0000000..8584c76 --- /dev/null +++ b/components/map.tsx @@ -0,0 +1,70 @@ + +"use client" + +import { useRef } from 'react'; +import MapGL, { Marker, MapRef } from 'react-map-gl/maplibre'; +import maplibregl from 'maplibre-gl'; +import 'maplibre-gl/dist/maplibre-gl.css'; + +const KARLSRUHE: { longitude: number, latitude: number } = { longitude: 8.4037, latitude: 49.0069 }; + +export default function Map() { + const mapRef = useRef(null); + + const onMapLoad = () => { + mapRef.current?.flyTo({ + center: [KARLSRUHE.longitude, KARLSRUHE.latitude], + zoom: 10, + speed: 0.5, + curve: 1, + essential: true + }); + }; + + return ( +
+ OpenStreetMap, © CARTO', + }, + }, + layers: [ + { + id: "carto-dark-layer", + type: "raster", + source: "carto-dark", + minzoom: 0, + maxzoom: 22, + }, + ], + }} + attributionControl={false} + > + +
+ + +
+ ); +} diff --git a/components/mdx-content.tsx b/components/mdx-content.tsx new file mode 100644 index 0000000..d93ba3d --- /dev/null +++ b/components/mdx-content.tsx @@ -0,0 +1,12 @@ +'use client' + +import { useMDXComponent } from 'next-contentlayer2/hooks' + +interface MDXContentProps { + code: string +} + +export function MDXContent({ code }: MDXContentProps) { + const Component = useMDXComponent(code) + return +} diff --git a/components/noise.tsx b/components/noise.tsx new file mode 100644 index 0000000..3e29b66 --- /dev/null +++ b/components/noise.tsx @@ -0,0 +1,8 @@ + +export function Noise() { + return ( +
+ ); +} diff --git a/components/panda.tsx b/components/panda.tsx new file mode 100644 index 0000000..ee9328c --- /dev/null +++ b/components/panda.tsx @@ -0,0 +1,9 @@ +export function Panda() { + return ( + + ) +} diff --git a/components/post-card.tsx b/components/post-card.tsx new file mode 100644 index 0000000..4990188 --- /dev/null +++ b/components/post-card.tsx @@ -0,0 +1,20 @@ +import { type Post } from "contentlayer/generated" +import { format, parseISO } from "date-fns" +import Link from "next/link" + +export function PostCard(post: Post) { + return ( +
+ +

+ {post.title} +

+ +
+ +
+
+ ) +} diff --git a/components/projects-grid.tsx b/components/projects-grid.tsx new file mode 100644 index 0000000..9ccb0fb --- /dev/null +++ b/components/projects-grid.tsx @@ -0,0 +1,51 @@ +import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import Link from "next/link"; + +interface Project { + title: string; + description: string; + githubUrl: string; +} + +const projects: Project[] = [ + { + title: "Boilerplate", + description: "A comprehensive starter template for modern web development projects.", + githubUrl: "https://github.com/schererleander/boilerplate", + }, + { + title: "Quiz Website", + description: "An interactive quiz platform built to test your knowledge.", + githubUrl: "https://github.com/schererleander/quiz", + }, + { + title: "Space Invaders", + description: "A classic arcade game clone recreated with modern web technologies.", + githubUrl: "https://github.com/schererleander/spaceinvaders", + }, + { + title: "Specula", + description: "A mirror project or reflection tool (Description inferred from name).", + githubUrl: "https://github.com/schererleander/specula", + }, +]; + +export function ProjectsGrid() { + return ( +
+
+ {projects.map((project) => ( + + +
+ + {project.title} + {project.description} + + + + ))} +
+
+ ); +} diff --git a/components/theme-provider.tsx b/components/theme-provider.tsx new file mode 100644 index 0000000..6a1ffe4 --- /dev/null +++ b/components/theme-provider.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as React from "react" +import { ThemeProvider as NextThemesProvider } from "next-themes" + +export function ThemeProvider({ + children, + ...props +}: React.ComponentProps) { + return {children} +} diff --git a/components/tools-grid.tsx b/components/tools-grid.tsx new file mode 100644 index 0000000..b0cdfa6 --- /dev/null +++ b/components/tools-grid.tsx @@ -0,0 +1,56 @@ +import { Card } from "@/components/ui/card"; +import { GitGraph, Coffee, Terminal, Box, Snowflake, Code } from 'lucide-react'; + +const tools = [ + { + name: 'Git', + icon: GitGraph, + color: 'group-hover:text-[#F05032]' + }, + { + name: 'Java', + icon: Coffee, + color: 'group-hover:text-[#5382a1]' + }, + { + name: 'Python', + icon: Code, + color: 'group-hover:text-[#FFE873]' + }, + { + name: 'Nix', + icon: Snowflake, + color: 'group-hover:text-[#5277C3]' + }, + { + name: 'Docker', + icon: Box, + color: 'group-hover:text-[#2496ED]' + }, + { + name: 'Linux', + icon: Terminal, + color: 'group-hover:text-[#FCC624]' + }, +]; + +export function ToolsGrid() { + return ( +
+ {tools.map((tool) => ( + + + + {tool.name} + + + ))} +
+ ); +} diff --git a/components/ui/button.tsx b/components/ui/button.tsx new file mode 100644 index 0000000..3ffbfed --- /dev/null +++ b/components/ui/button.tsx @@ -0,0 +1,58 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/components/ui/card.tsx b/components/ui/card.tsx new file mode 100644 index 0000000..681ad98 --- /dev/null +++ b/components/ui/card.tsx @@ -0,0 +1,92 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Card({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardDescription({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardAction({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardAction, + CardDescription, + CardContent, +} -- cgit v1.3.1