diff --git a/app/components/avatar-motion.tsx b/app/components/avatar-motion.tsx new file mode 100644 index 0000000..942687a --- /dev/null +++ b/app/components/avatar-motion.tsx @@ -0,0 +1,44 @@ +"use client"; + +import Image from "next/image"; +import { motion } from "motion/react"; +import { cn } from "@/lib/utils"; + +type AvatarMotionProps = { + src: string; + alt: string; + size?: number; // px + className?: string; +}; + +export function AvatarMotion({ + src, + alt, + size = 160, + className, +}: AvatarMotionProps) { + // tailwind classes for typical 160px size + const baseSizeClasses = size === 160 ? "h-40 w-40" : ""; + + return ( + + {alt} + + ); +} diff --git a/app/components/dotbackground.tsx b/app/components/dotbackground.tsx index 2f70476..3b91c12 100644 --- a/app/components/dotbackground.tsx +++ b/app/components/dotbackground.tsx @@ -9,13 +9,13 @@ export function DotBackground({ className }: { className?: string }) {
{/* Radial gradient for the container to give a faded look */} -
+
) -} \ No newline at end of file +} diff --git a/app/globals.css b/app/globals.css index 7ccf2df..dbbaab2 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,14 +1,21 @@ @import "tailwindcss"; :root { - --background: #ffffff; - --foreground: #171717; + /* Light mode tokens */ + --background: #fbfbfb; /* off-white to reduce glare */ + --surface: #ffffff33; /* card/background surface */ + --foreground: #0f1720; /* readable body text */ + --muted: rgba(15, 23, 32, 0.55); + --accent: #0f1720; /* link/accent (monochrome) */ + --dot-color: rgba(120, 120, 120, 0.576); + --card-shadow: 0 6px 20px rgba(16, 24, 40, 0.06); + --radius: 10px; } @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); - --font-sans: var(--font-cabin); + --font-sans: "Cabin", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --font-mono: var(--font-geist-mono); } @@ -16,11 +23,56 @@ :root { --background: #0a0a0a; --foreground: #ededed; + --accent: #ededed; /* keep links readable in dark mode */ + --surface: #69696900; /* dark surfaces for cards */ + } + + a { + border-bottom-color: rgba(237, 237, 237, 0.25); } } body { - background: var(--background); + background: linear-gradient(180deg, var(--background), color-mix(in srgb, var(--background) 85%, rgb(6, 6, 6) 15%) 60%); color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + font-family: "Cabin", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 16px; + line-height: 1.48; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + margin: 0; + padding: 0; +} + +/* Link styling */ +a { + color: var(--accent); + text-decoration: none; + border-bottom: 1px solid rgba(15, 23, 32, 0.18); + transition: color 0.18s ease, border-color 0.18s ease, transform 0.12s ease; +} +a:hover { + color: color-mix(in srgb, var(--accent) 80%, black 20%); + border-bottom-color: transparent; + text-decoration: underline; +} + +/* Visited links keep same color (no blue/purple) */ +a:visited { + color: var(--accent); +} + +/* Spotify card wrapper */ +.spotify-card { + display: inline-block; + background: var(--surface); + border-radius: var(--radius); + box-shadow: var(--card-shadow); + padding: 14px; +} + +/* Small, muted text */ +.footer-small { + color: var(--muted); + font-size: 12px; } diff --git a/app/layout.tsx b/app/layout.tsx index cb613e9..aa6cd86 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,6 +1,5 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; -import { Cabin } from "next/font/google"; import "./globals.css"; import { DotBackground } from "@/app/components/dotbackground"; @@ -14,11 +13,6 @@ const geistMono = Geist_Mono({ subsets: ["latin"], }); -const cabin = Cabin({ - variable: "--font-cabin", - subsets: ["latin"], - display: "swap", -}); export const metadata: Metadata = { title: { @@ -50,8 +44,16 @@ export default function RootLayout({ }>) { return ( + + + + + {children} diff --git a/app/page.tsx b/app/page.tsx index 3c57bc2..82b6fbd 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,6 +1,6 @@ -import Image from "next/image" import React from "react" import { FlipWords } from "@/components/ui/flip-words" +import { AvatarMotion } from "@/app/components/avatar-motion" export const metadata = { title: "Nicholai", @@ -20,16 +20,13 @@ export default function Home() { const year = new Date().getFullYear(); return ( -
+
- Hand drawn portrait of Nicholai
@@ -37,35 +34,35 @@ export default function Home() {

Nicholai

-

+

I wanted to justify the $6.39 I spent on the domain.

-
- +
+
-
-

- Listening -

-
-