+
Reactive
Resume
diff --git a/apps/web/src/features/homepage/landing.css b/apps/web/src/features/homepage/landing.css
index 659234f2e..9b7c5c152 100644
--- a/apps/web/src/features/homepage/landing.css
+++ b/apps/web/src/features/homepage/landing.css
@@ -3,15 +3,13 @@
* section's progress as --p (0 to 1) and every motion below is derived from it with calc(), so React only re-renders
* on coarse steps. Imported by index.css, not the route, so a server-prerendered page is styled at first paint.
*/
-@import "@fontsource-variable/anybody/wdth.css";
-@import "@fontsource-variable/martian-mono/wdth.css";
-
/* Short viewports hide the secondary captions of the pinned scenes so nothing overlaps. */
@custom-variant short (@media (height < 720px));
@theme {
- --font-anybody: "Anybody Variable", "Noto Sans", system-ui, sans-serif;
- --font-martian: "Martian Mono Variable", ui-monospace, monospace;
+ /* Existing landing classes share the app's display and UI families. */
+ --font-anybody: var(--font-display);
+ --font-martian: var(--font-ui);
--animate-breathe: landing-breathe 16s ease-in-out infinite alternate;
--animate-drift: landing-drift 90s ease-in-out infinite alternate;
diff --git a/apps/web/src/features/homepage/page.tsx b/apps/web/src/features/homepage/page.tsx
index d410a5a3d..68a997722 100644
--- a/apps/web/src/features/homepage/page.tsx
+++ b/apps/web/src/features/homepage/page.tsx
@@ -24,7 +24,7 @@ export function Homepage() {
useScrollScenes(root);
return (
-
+
diff --git a/packages/ui/package.json b/packages/ui/package.json
index d0fa7d700..12f31ba69 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -20,7 +20,6 @@
"dependencies": {
"@base-ui/react": "^1.8.0",
"@fontsource-variable/hanken-grotesk": "^5.3.0",
- "@fontsource-variable/jetbrains-mono": "^5.3.0",
"@fontsource-variable/newsreader": "^5.3.0",
"@phosphor-icons/web": "^2.1.2",
"@reactive-resume/utils": "workspace:*",
diff --git a/packages/ui/src/styles/globals.css b/packages/ui/src/styles/globals.css
index 6414ff8ef..b697304c5 100644
--- a/packages/ui/src/styles/globals.css
+++ b/packages/ui/src/styles/globals.css
@@ -1,10 +1,10 @@
@import "tailwindcss" source(none);
@import "tw-animate-css";
@import "shadcn/tailwind.css";
+@import "@fontsource-variable/hanken-grotesk";
+@import "@fontsource-variable/hanken-grotesk/wght-italic.css";
@import "@fontsource-variable/newsreader/opsz.css";
@import "@fontsource-variable/newsreader/opsz-italic.css";
-@import "@fontsource-variable/hanken-grotesk";
-@import "@fontsource-variable/jetbrains-mono";
/* Phosphor stays for icons inside resumes (their names are stored in resume data). */
@import "@phosphor-icons/web/regular/style.css";
@@ -134,8 +134,8 @@
@theme {
--font-display: "Newsreader Variable", Georgia, serif;
--font-ui: "Hanken Grotesk Variable", system-ui, sans-serif;
- --font-sans: "Hanken Grotesk Variable", system-ui, sans-serif;
- --font-mono: "JetBrains Mono Variable", ui-monospace, monospace;
+ --font-sans: var(--font-ui);
+ --font-mono: ui-monospace, monospace;
/* 6 chips and small buttons · 8 controls · 10 list items · 12 cards and menus · 16 dialogs · 18 mobile sheets */
--radius-sm: 6px;
@@ -217,6 +217,10 @@
@apply bg-bg text-ink text-sm proportional-nums antialiased selection:bg-accent-soft selection:text-ink;
}
+ h1 {
+ @apply font-display;
+ }
+
/* A 2px accent ring with a 2px gap on every interactive element; never removed. */
:focus-visible {
outline: 2px solid var(--accent);
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 00ae101e8..53e90f50b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -528,12 +528,6 @@ importers:
'@dnd-kit/utilities':
specifier: ^3.2.2
version: 3.2.2(react@19.3.0)
- '@fontsource-variable/anybody':
- specifier: ^5.3.0
- version: 5.3.0
- '@fontsource-variable/martian-mono':
- specifier: ^5.3.0
- version: 5.3.0
'@lezer/highlight':
specifier: ^1.2.5
version: 1.2.5
@@ -1366,9 +1360,6 @@ importers:
'@fontsource-variable/hanken-grotesk':
specifier: ^5.3.0
version: 5.3.0
- '@fontsource-variable/jetbrains-mono':
- specifier: ^5.3.0
- version: 5.3.0
'@fontsource-variable/newsreader':
specifier: ^5.3.0
version: 5.3.0
@@ -2752,18 +2743,9 @@ packages:
'@floating-ui/utils@0.2.12':
resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
- '@fontsource-variable/anybody@5.3.0':
- resolution: {integrity: sha512-3u/FSV3mGv9xW3x+CdK9lAZYT1Y3NaRA1bexeoIuk9s5QE8sD8OOTcofvpPx0Z6M0Fq1WAJ06ZAw8hivdRQWHQ==}
-
'@fontsource-variable/hanken-grotesk@5.3.0':
resolution: {integrity: sha512-DOd0FqL+3cH2dfNy0JtSq9tUfxBz5mLmHMjTU0DOr3E9Zo6wxuatCl53DIPNrSPgCsnuKyM739BTIG5glCLirw==}
- '@fontsource-variable/jetbrains-mono@5.3.0':
- resolution: {integrity: sha512-F32xpS2NsGYoQi2ADSkKTgpJj7ozajsGgDJ8woTnqjmIB+dxDIqImjl4pXZVEExu8UFZ2ndhmX18EBS/hdz3Lw==}
-
- '@fontsource-variable/martian-mono@5.3.0':
- resolution: {integrity: sha512-0wVODx9ILwNnaYC4XCuSaFRYtj1Prd89MRVaSuv2ng6zLiQkS4SepaWEPefs7vqCZS8sbEOA8jb/4F5KNMnGdg==}
-
'@fontsource-variable/newsreader@5.3.0':
resolution: {integrity: sha512-rrzYi43qMpbzwuFtf9OkWH8sxAPVPcQQQEwXpPtwaKYeJ8yVg5aLs5kawmo1f2Q1t1M38TLmEKCkGVDsYwgdFw==}
@@ -10129,14 +10111,8 @@ snapshots:
'@floating-ui/utils@0.2.12': {}
- '@fontsource-variable/anybody@5.3.0': {}
-
'@fontsource-variable/hanken-grotesk@5.3.0': {}
- '@fontsource-variable/jetbrains-mono@5.3.0': {}
-
- '@fontsource-variable/martian-mono@5.3.0': {}
-
'@fontsource-variable/newsreader@5.3.0': {}
'@formepdf/core@0.25.0(react@19.3.0)':