auto intendation
This commit is contained in:
116
app/page.tsx
116
app/page.tsx
@@ -14,28 +14,40 @@ const BLUR_FADE_DELAY = 0.01;
|
|||||||
export default function Page() {
|
export default function Page() {
|
||||||
const posts = getSortedPostsData().slice(0, 6);
|
const posts = getSortedPostsData().slice(0, 6);
|
||||||
return (
|
return (
|
||||||
<main className="flex flex-col min-h-[100dvh] space-y-10">
|
<main className="flex flex-col min-h-[100dvh] space-y-12">
|
||||||
<section id="hero">
|
<section id="hero">
|
||||||
<div className="mx-auto w-full max-w-2xl space-y-8">
|
<div className="mx-auto w-full max-w-2xl">
|
||||||
<div className="flex flex-col sm:flex-row items-center sm:items-start sm:justify-between gap-4">
|
<div className="flex flex-col sm:flex-row items-center sm:items-start sm:justify-between">
|
||||||
<div className="flex-col flex flex-1 space-y-1.5 items-center sm:items-start">
|
<div className="flex-col flex flex-1 space-y-1.5 items-center sm:items-start">
|
||||||
<TextAnimate delay={BLUR_FADE_DELAY} className="text-3xl font-bold tracking-tighter sm:text-5xl xl:text-6xl/none text-center sm:text-left">
|
<TextAnimate
|
||||||
|
delay={BLUR_FADE_DELAY}
|
||||||
|
className="text-3xl font-bold tracking-tighter sm:text-5xl xl:text-6xl/none text-center sm:text-left">
|
||||||
{`Hi, I'm ${DATA.name.split(" ")[0]}`}
|
{`Hi, I'm ${DATA.name.split(" ")[0]}`}
|
||||||
</TextAnimate>
|
</TextAnimate>
|
||||||
<TextAnimate className="max-w-[400px] md:text-xl text-center sm:text-left" delay={BLUR_FADE_DELAY}>
|
<TextAnimate
|
||||||
|
className="max-w-[400px] md:text-xl text-center sm:text-left"
|
||||||
|
delay={BLUR_FADE_DELAY}>
|
||||||
AI Consultant & Researcher with a PhD in Computer Science.
|
AI Consultant & Researcher with a PhD in Computer Science.
|
||||||
</TextAnimate>
|
</TextAnimate>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col items-center gap-y-2">
|
<div className="flex flex-col items-center gap-y-4">
|
||||||
<BlurFade delay={BLUR_FADE_DELAY}>
|
<BlurFade delay={BLUR_FADE_DELAY}>
|
||||||
<Avatar className="size-28 border">
|
<Avatar className="size-28 border">
|
||||||
<AvatarImage alt={DATA.name} src={DATA.avatarUrl} fetchPriority="high" />
|
<AvatarImage
|
||||||
|
alt={DATA.name}
|
||||||
|
src={DATA.avatarUrl}
|
||||||
|
fetchPriority="high"
|
||||||
|
/>
|
||||||
<AvatarFallback>{DATA.initials}</AvatarFallback>
|
<AvatarFallback>{DATA.initials}</AvatarFallback>
|
||||||
</Avatar>
|
</Avatar>
|
||||||
</BlurFade>
|
</BlurFade>
|
||||||
<BlurFade delay={BLUR_FADE_DELAY * 2}>
|
<BlurFade delay={BLUR_FADE_DELAY * 2}>
|
||||||
<TrackedLink href="/illium_cv_censored.pdf" eventName="cv-download" className="w-full" download>
|
<TrackedLink
|
||||||
<Badge className="flex gap-2 px-3 py-1 text-sm shadow-sm transition-all duration-300 ease-out hover:shadow-lg dark:shadow-[var(--shadow-glow)] dark:hover:shadow-[var(--shadow-glow-hover)]">
|
href="/illium_cv_censored.pdf"
|
||||||
|
eventName="cv-download"
|
||||||
|
className="w-full"
|
||||||
|
download>
|
||||||
|
<Badge className="flex px-3 py-1 text-sm shadow-sm transition-all duration-300 ease-out hover:shadow-lg dark:shadow-[var(--shadow-glow)] dark:hover:shadow-[var(--shadow-glow-hover)]">
|
||||||
Download CV
|
Download CV
|
||||||
</Badge>
|
</Badge>
|
||||||
</TrackedLink>
|
</TrackedLink>
|
||||||
@@ -48,10 +60,10 @@ export default function Page() {
|
|||||||
<BlurFade delay={BLUR_FADE_DELAY * 3}>
|
<BlurFade delay={BLUR_FADE_DELAY * 3}>
|
||||||
<h2 className="text-xl font-bold">About</h2>
|
<h2 className="text-xl font-bold">About</h2>
|
||||||
</BlurFade>
|
</BlurFade>
|
||||||
<BlurFade delay={BLUR_FADE_DELAY * 4} className="prose max-w-full text-pretty font-sans text-sm text-muted-foreground dark:prose-invert">
|
<BlurFade
|
||||||
<Markdown >
|
delay={BLUR_FADE_DELAY * 4}
|
||||||
{DATA.summary}
|
className="prose max-w-full text-pretty font-sans text-sm text-muted-foreground dark:prose-invert">
|
||||||
</Markdown>
|
<Markdown>{DATA.summary}</Markdown>
|
||||||
</BlurFade>
|
</BlurFade>
|
||||||
</section>
|
</section>
|
||||||
<section id="projects">
|
<section id="projects">
|
||||||
@@ -66,7 +78,8 @@ export default function Page() {
|
|||||||
Check out my latest work
|
Check out my latest work
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-muted-foreground md:text-xl/relaxed lg:text-base/relaxed xl:text-xl/relaxed">
|
<p className="text-muted-foreground md:text-xl/relaxed lg:text-base/relaxed xl:text-xl/relaxed">
|
||||||
I've worked on a variety of projects, from scientific research to managing projects. Here are a few of my latest.
|
I've worked on a variety of projects, from scientific
|
||||||
|
research to managing projects. Here are a few of my latest.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -75,23 +88,22 @@ export default function Page() {
|
|||||||
{posts
|
{posts
|
||||||
.filter((post) => post.title)
|
.filter((post) => post.title)
|
||||||
.map((post, id) => (
|
.map((post, id) => (
|
||||||
<BlurFade
|
<BlurFade
|
||||||
key={post.title}
|
|
||||||
delay={BLUR_FADE_DELAY * 12 + id * 0.05}
|
|
||||||
>
|
|
||||||
<ProjectCard
|
|
||||||
href={post.href}
|
|
||||||
key={post.title}
|
key={post.title}
|
||||||
title={post.title!}
|
delay={BLUR_FADE_DELAY * 12 + id * 0.05}>
|
||||||
description={post.excerpt || ""}
|
<ProjectCard
|
||||||
dates={post.date}
|
href={post.href}
|
||||||
tags={post.tags}
|
key={post.title}
|
||||||
image={post.image || ""}
|
title={post.title!}
|
||||||
video={post.video}
|
description={post.excerpt || ""}
|
||||||
links={[]}
|
dates={post.date}
|
||||||
/>
|
tags={post.tags}
|
||||||
</BlurFade>
|
image={post.image || ""}
|
||||||
))}
|
video={post.video}
|
||||||
|
links={[]}
|
||||||
|
/>
|
||||||
|
</BlurFade>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -108,7 +120,9 @@ export default function Page() {
|
|||||||
</BlurFade>
|
</BlurFade>
|
||||||
<div className="flex flex-wrap gap-1">
|
<div className="flex flex-wrap gap-1">
|
||||||
{skills.map((skill, id) => (
|
{skills.map((skill, id) => (
|
||||||
<BlurFade key={skill} delay={BLUR_FADE_DELAY * 10 + id * 0.05}>
|
<BlurFade
|
||||||
|
key={skill}
|
||||||
|
delay={BLUR_FADE_DELAY * 10 + id * 0.05}>
|
||||||
<Badge key={skill}>{skill}</Badge>
|
<Badge key={skill}>{skill}</Badge>
|
||||||
</BlurFade>
|
</BlurFade>
|
||||||
))}
|
))}
|
||||||
@@ -126,8 +140,7 @@ export default function Page() {
|
|||||||
{DATA.work.map((work, id) => (
|
{DATA.work.map((work, id) => (
|
||||||
<BlurFade
|
<BlurFade
|
||||||
key={work.company}
|
key={work.company}
|
||||||
delay={BLUR_FADE_DELAY * 8 + id * 0.05}
|
delay={BLUR_FADE_DELAY * 8 + id * 0.05}>
|
||||||
>
|
|
||||||
<ResumeCard
|
<ResumeCard
|
||||||
key={work.company}
|
key={work.company}
|
||||||
href={work.href}
|
href={work.href}
|
||||||
@@ -149,8 +162,7 @@ export default function Page() {
|
|||||||
{DATA.education.map((education, id) => (
|
{DATA.education.map((education, id) => (
|
||||||
<BlurFade
|
<BlurFade
|
||||||
key={education.school}
|
key={education.school}
|
||||||
delay={BLUR_FADE_DELAY * 8 + id * 0.05}
|
delay={BLUR_FADE_DELAY * 8 + id * 0.05}>
|
||||||
>
|
|
||||||
<ResumeCard
|
<ResumeCard
|
||||||
key={education.school}
|
key={education.school}
|
||||||
href={education.href}
|
href={education.href}
|
||||||
@@ -166,23 +178,31 @@ export default function Page() {
|
|||||||
</section>
|
</section>
|
||||||
<section id="contact">
|
<section id="contact">
|
||||||
<div className="grid items-center justify-center gap-4 px-4 text-center md:px-6 w-full py-12">
|
<div className="grid items-center justify-center gap-4 px-4 text-center md:px-6 w-full py-12">
|
||||||
<BlurFade delay={BLUR_FADE_DELAY * 16}>
|
<BlurFade delay={BLUR_FADE_DELAY * 16}>
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<div className="inline-block rounded-lg bg-foreground text-background px-3 py-1 text-sm">
|
<div className="inline-block rounded-lg bg-foreground text-background px-3 py-1 text-sm">
|
||||||
Contact
|
Contact
|
||||||
</div>
|
</div>
|
||||||
<h2 className="text-3xl font-bold tracking-tighter sm:text-5xl">Get in Touch</h2>
|
<h2 className="text-3xl font-bold tracking-tighter sm:text-5xl">
|
||||||
<p className="mx-auto max-w-[800px] text-muted-foreground md:text-xl/relaxed lg:text-base/relaxed xl:text-xl/relaxed">
|
Get in Touch
|
||||||
Want to collaborate or have a question?<br/>I'd love to hear from you.
|
</h2>
|
||||||
</p>
|
<p className="mx-auto max-w-[800px] text-muted-foreground md:text-xl/relaxed lg:text-base/relaxed xl:text-xl/relaxed">
|
||||||
</div>
|
Want to collaborate or have a question?
|
||||||
</BlurFade>
|
<br />
|
||||||
|
I'd love to hear from you.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</BlurFade>
|
||||||
<BlurFade delay={BLUR_FADE_DELAY * 18}>
|
<BlurFade delay={BLUR_FADE_DELAY * 18}>
|
||||||
<div className="flex flex-wrap gap-2 justify-center">
|
<div className="flex flex-wrap gap-2 justify-center">
|
||||||
{Object.entries(DATA.contact.social)
|
{Object.entries(DATA.contact.social)
|
||||||
//.filter(([_, social]) => !social.pub)
|
//.filter(([_, social]) => !social.pub)
|
||||||
.map(([name, social]) => (
|
.map(([name, social]) => (
|
||||||
<TrackedLink href={social.url} key={name} className="group" eventName={`${name}-social`}>
|
<TrackedLink
|
||||||
|
href={social.url}
|
||||||
|
key={name}
|
||||||
|
className="group"
|
||||||
|
eventName={`${name}-social`}>
|
||||||
<Badge className="cards flex gap-2 px-3 py-1 text-sm">
|
<Badge className="cards flex gap-2 px-3 py-1 text-sm">
|
||||||
<social.icon className="size-4" />
|
<social.icon className="size-4" />
|
||||||
{name}
|
{name}
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import {
|
import { Card, CardHeader, CardTitle } from "@/components/ui/card";
|
||||||
Card,
|
|
||||||
CardHeader,
|
|
||||||
CardTitle,
|
|
||||||
} from "@/components/ui/card";
|
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { ChevronRightIcon } from "lucide-react";
|
import { ChevronRightIcon } from "lucide-react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
@@ -35,7 +31,9 @@ export function ResearchCard({
|
|||||||
className,
|
className,
|
||||||
}: Props) {
|
}: Props) {
|
||||||
return (
|
return (
|
||||||
<Link href={href} className={cn("block rounded-xl h-full cards", className)}>
|
<Link
|
||||||
|
href={href}
|
||||||
|
className={cn("block rounded-xl h-full cards", className)}>
|
||||||
<Card className="py-2 px-0 group flex h-full flex-col overflow-hidden border transition-shadow duration-300 ease-out hover:shadow-lg">
|
<Card className="py-2 px-0 group flex h-full flex-col overflow-hidden border transition-shadow duration-300 ease-out hover:shadow-lg">
|
||||||
{video && (
|
{video && (
|
||||||
<video
|
<video
|
||||||
@@ -66,18 +64,18 @@ export function ResearchCard({
|
|||||||
<ChevronRightIcon className="size-4 shrink-0 translate-x-0 transform opacity-0 transition-all duration-300 ease-out group-hover:translate-x-1 group-hover:opacity-100" />
|
<ChevronRightIcon className="size-4 shrink-0 translate-x-0 transform opacity-0 transition-all duration-300 ease-out group-hover:translate-x-1 group-hover:opacity-100" />
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
<div className="flex items-center gap-x-2 text-xs text-muted-foreground mt-1">
|
<div className="flex items-center gap-x-2 text-xs text-muted-foreground mt-1">
|
||||||
{venue && <span className="font-semibold text-primary">{venue}</span>}
|
{venue && (
|
||||||
|
<span className="font-semibold text-primary">{venue}</span>
|
||||||
|
)}
|
||||||
{venue && <span>•</span>}
|
{venue && <span>•</span>}
|
||||||
<time>{dates}</time>
|
<time>{dates}</time>
|
||||||
</div>
|
</div>
|
||||||
<div className="prose max-w-full text-pretty font-sans text-xs text-muted-foreground dark:prose-invert">
|
<div className="prose max-w-full text-pretty font-sans text-xs text-muted-foreground dark:prose-invert">
|
||||||
<Markdown>
|
<Markdown>{description}</Markdown>
|
||||||
{description}
|
|
||||||
</Markdown>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
</Card>
|
</Card>
|
||||||
</Link>
|
</Link>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,9 @@ import { TooltipProvider } from "@/components/ui/tooltip";
|
|||||||
export function Providers({ children }: { children: React.ReactNode }) {
|
export function Providers({ children }: { children: React.ReactNode }) {
|
||||||
return (
|
return (
|
||||||
<ThemeProvider attribute="class" defaultTheme="light">
|
<ThemeProvider attribute="class" defaultTheme="light">
|
||||||
{/* MotionConfig is the key fix for the animation issues */}
|
|
||||||
<MotionConfig reducedMotion="user">
|
<MotionConfig reducedMotion="user">
|
||||||
<TooltipProvider delayDuration={0}>
|
<TooltipProvider delayDuration={0}>{children}</TooltipProvider>
|
||||||
{children}
|
|
||||||
</TooltipProvider>
|
|
||||||
</MotionConfig>
|
</MotionConfig>
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user