diff --git a/app/layout.tsx b/app/layout.tsx index eb01bfd..e2f6b03 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,4 +1,4 @@ -import { Geist, Geist_Mono } from 'next/font/google'; +import { Geist_Mono, IBM_Plex_Sans } from 'next/font/google'; import '../styles/globals.css'; import { config } from '@fortawesome/fontawesome-svg-core'; @@ -13,9 +13,10 @@ import { SITE_NAME, SITE_URL } from '@/lib/site'; // Prevent FontAwesome from adding its CSS dynamically on the server (causes SSR errors) config.autoAddCss = false; -const geistSans = Geist({ +const sans = IBM_Plex_Sans({ subsets: ['latin'], - variable: '--font-geist-sans', + weight: ['400', '500', '600', '700'], + variable: '--font-sans', display: 'swap', }); @@ -91,7 +92,7 @@ export default function RootLayout({ return ( diff --git a/app/me/page.tsx b/app/me/page.tsx index 2abd1e6..2f38118 100644 --- a/app/me/page.tsx +++ b/app/me/page.tsx @@ -3,24 +3,33 @@ import Link from 'next/link'; import type { CSSProperties } from 'react'; import { PageWrapper } from '../components/PageWrapper'; +import type { IconDefinition } from '@fortawesome/fontawesome-svg-core'; import { + faBriefcase, faCakeCandles, + faCheck, faCode, + faFaceFrown, + faFaceSmile, faGraduationCap, faHandshake, - faHeadphones, faIdCard, + faPenNib, faUser, + faXmark, } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import type { Metadata } from 'next'; +import { + CARD_HOVER_LARGE, + CARD_INNER_RING, + hoverRotation, +} from '@/base/card-animation'; import { Card } from '@/base/components/Card'; import { PageTitle } from '@/base/components/PageTitle'; import { SectionHeader } from '@/base/components/SectionHeader'; -import { TagList } from '@/features/about/components'; -import { getGithubLanguages, getGithubUsername } from '@/lib/github'; -import { getLastfmTopTags } from '@/lib/lastfm'; +import { getGithubUsername } from '@/lib/github'; import { SITE_NAME, SITE_URL } from '@/lib/site'; const ABOUT_TITLE = 'Sobre mim'; @@ -28,8 +37,6 @@ const ABOUT_DESCRIPTION = 'Sobre John Enderson'; const ABOUT_URL = `${SITE_URL}/me`; const ABOUT_OG_IMAGE = `${SITE_URL}/og/site/me`; -export const revalidate = 3600; - export const metadata: Metadata = { title: ABOUT_TITLE, description: ABOUT_DESCRIPTION, @@ -84,13 +91,79 @@ const tldrCards = [ }, ]; -const musicTagColors = ['#ec4899', '#f0a66d', '#5bd3c7', '#8b5cf6', '#facc15']; +// Seed fixa: sempre a mesma foto, mesma rotação de hover em toda renderização. +const PHOTO_HOVER_SEED = 2; + +const likes = [ + 'Pizza', + 'Música eletrônica', + 'Instrumentos musicais', + 'Piano e teclado', + 'Tecnologia', + 'Assuntos sobrenaturais', + 'Conversas aleatórias que duram horas', +]; + +const dislikes = ['Incoerência', 'Frio', 'Falta de propósito']; + +const PreferenceCard = ({ + id, + title, + icon, + marker, + tone, + items, +}: { + id: string; + title: string; + icon: IconDefinition; + marker: IconDefinition; + tone: 'positive' | 'negative'; + items: string[]; +}) => ( +
+ + +
+); + +const Prose = ({ children }: { children: React.ReactNode }) => ( +
+ {children} +
+); + +const InlineLink = ({ href, children }: { href: string; children: string }) => ( + + {children} + +); -export default async function Page() { - const [languages, musicTags] = await Promise.all([ - getGithubLanguages().catch(() => []), - getLastfmTopTags({ period: '12month' }).catch(() => []), - ]); +export default function Page() { const username = getGithubUsername(); return ( @@ -130,7 +203,7 @@ export default async function Page() { title="Em poucas palavras" /> -