Skip to content

Merge dev into main: redesign, projects, timeline, contact, and fixes#28

Merged
jakebodea merged 58 commits intomainfrom
dev-merge-main
Feb 12, 2026
Merged

Merge dev into main: redesign, projects, timeline, contact, and fixes#28
jakebodea merged 58 commits intomainfrom
dev-merge-main

Conversation

@jakebodea
Copy link
Owner

Summary

PR to merge all dev changes into main. This PR includes the merge commit resolving conflicts with main.

Features

  • Frontend redesign: New theme, top nav, minimal layout
  • Projects page: Project cards, GitHub contributions calendar, embedded tweets
  • Timeline page: Career/education timeline (including Concordia tutor)
  • Contact page: Styling and animations
  • Theme dropdown: Animated icon morphing, Radix DropdownMenu
  • Mobile: Hamburger menu, sticky titles, swipe animations (disabled on mobile), unfurl exit animation
  • Page transitions: Directional swipe animations, circular reveal for theme changes
  • Sticky page title on desktop with gradient fade below nav

Infrastructure & content

  • Notion blog support with notion.ts, caching and background prefetch
  • Next.js 15/16 updates, Vercel Analytics, DEV banner for dev deployments
  • CI workflow (lint, typecheck, build), Vercel deployment config
  • Refactor: PageWrapper, variant props on PageTitle, quotes page dynamic

Fixes

  • Nav indicator animation when navigating from scrolled page
  • Theme dropdown tooltip, nav transition direction and shared config
  • Blog animations and scrollbar shimmer
  • Hydration mismatch (defer GitHub calendar to client)
  • Contact comment spacing, dev tag position
  • Keyboard shortcut tooltips on desktop
  • TypeScript/readonly compatibility

Merge conflicts resolved

  • Kept dev's Next.js 16.1.6 and lint/tsc scripts
  • Removed check-quotes script (no longer needed with direct Notion API + ISR)

Docs

  • CLAUDE.md, config and docs for Vercel

Note: This replaces PR #27. The original PR couldn't be updated directly because dev is a protected branch.

Made with Cursor

jakebodea and others added 30 commits February 4, 2026 23:59
- Replace turquoise/blue palette with warm earth tones + orange accent
- Remove sidebar, add centered top navigation with keyboard shortcuts
- Simplify home page to minimal intro with links
- Consolidate components into components/common/ folder
- Rename all files to kebab-case
- Add page transitions with framer-motion
- Add ShortcutTooltip component with sliding nav indicator
- Add shadcn kbd component for keyboard hints
- Update ESLint: enforce 2-space indent, kebab-case filenames
- Enable system theme preference

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add 1-hour revalidate to Notion fetch calls for server-side caching
- Warm quotes cache in background on every page load so /quotes loads instantly

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace horizontal scroll nav on mobile with hamburger menu
- Add animated two-line hamburger icon that morphs to X
- Create slide-in mobile menu with smooth fade animation
- Add sticky page titles on mobile that stay in header while scrolling
- Disable keyboard shortcut tooltips on touch devices
- Add useIsTouchDevice hook for centralized touch detection
- Update all pages to use new PageTitle component

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use screen width instead of touch detection to determine when to show
tooltips, fixing false positives on Macs with multi-touch trackpads.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Switching to Vercel for builds - no longer need scheduled
GitHub Actions for Notion content syncing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove GitHub Actions/Pages references from CLAUDE.md and README.md
- Remove quotes-hash.txt from .gitignore (no longer used)
- Remove redundant cache warming from layout.tsx (ISR handles this)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Delete unused Radix toast system (toast.tsx, toaster.tsx, use-toast.ts)
- Remove unused useIsTouchDevice hook
- Clean up unused Sonner variant styles
- Add GPTSlopToast to layout

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create PageWrapper component with title, subtitle, and children props
- Update quotes, blogs, timeline, and projects pages to use PageWrapper
- Remove redundant timeline-header.tsx and project-header.tsx
- Fix timeline sticky header issue with overflow-hidden on mobile wrapper
- Make timeline colors more soothing (use foreground instead of primary)
- Include linter formatting fixes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Links animate out in reverse order on close
- Faster exit timing (0.1s vs 0.15s)
- Container waits for links to animate before fading

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Pages now slide in from the direction you're navigating (carousel style).
Uses spring physics with subtle scale for a natural feel.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Mobile now just fades in. Desktop uses origin-top to prevent
upward drift from scale animation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add GitHub Actions workflow for PRs to main/dev
- Add tsc script to package.json
- Add "page" variant to PageTitle for PageWrapper

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Refactor: UI improvements, CI setup, and Vercel migration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove redundant CI trigger on push
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
jakebodea and others added 25 commits February 7, 2026 19:43
Resolve conflict: keep indicator fix, accept ThemeToggle extraction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix nav indicator animation when scrolled
* Hide shortcut tooltip when theme dropdown is open and use direct React imports

Fix the "press t" tooltip showing behind the theme dropdown by passing
dropdown open state to ShortcutTooltip's new disabled prop. Also replace
all `import * as React from "react"` with direct named imports across
the codebase.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Auto-close theme dropdown on mouse leave with 100ms buffer

Also fix tooltip disabled behavior to keep Tooltip mounted (using
open={false}) instead of unmounting it, which was causing the dropdown
to reset its state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Refactor theme toggle to use Radix DropdownMenu

Replace custom dropdown implementation with Radix DropdownMenu, which
natively handles click-outside, escape key, focus management, and
keyboard navigation. ThemeToggle now owns its tooltip internally via a
shortcut prop, eliminating state lifting through TopNav.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix dropdown z-index, hover style, and alignment

Bump dropdown z-index above nav, use subtle muted hover instead of
saturated accent, align dropdown to start (left) of trigger, and
disable modal overlay for proper pointer events.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Extend sticky page title catch effect to desktop

The mobile sticky title (scrolls with page, catches in the nav bar)
now works on all screen sizes. Removed the dual mobile/desktop
rendering split in PageTitle — one sticky element for all viewports.

Made the nav background transparent on desktop so the title bar
shows through when caught. Also fixed the nav indicator not
following the active tab by adding pathname to the useLayoutEffect
dependency array.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Sticky page title on desktop + fix theme dropdown on mobile

Move sticky positioning from PageTitle into PageWrapper so PageTitle
stays a pure typography component and home page is unaffected. Make
TopNav transparent on desktop so the page title slides into the nav row.

Fix theme dropdown not opening on mobile by guarding hover handlers
with pointerType check, and align dropdown to end on mobile.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Fix blog page animations to slide in from right, back to left (#15)

Detect navigation direction based on path depth for routes within the same section. When navigating deeper into routes (list → detail), use right direction. When navigating back (detail → list), use left direction. This creates a more natural page swipe animation for blog navigation.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix scrollbar shimmer when navigating between blogs

Add scrollbar-gutter: stable to reserve space for scrollbars even when not visible, preventing layout shift when scrollbars appear/disappear during page transitions.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
* Add contact page with minimalist URL-based design

- Create new /contact page with email and social links
- Add contact navigation item to top nav (keyboard shortcut: 6)
- Display full URLs in monospace font with arrow prefix
- Includes email, LinkedIn, GitHub, and X (Twitter) links

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Redesign contact page with shell command aesthetic

- Display contact links as terminal commands: \`$ open <url>\`
- Add subtle container with muted border and background
- Style command prompt \`$\` in accent color
- Color-code 'open' command keyword
- Underline URLs on hover for better interactivity
- More developer-oriented feel matching terminal/CLI aesthetic

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add intro text back to contact page

- Restore the introduction paragraph above the terminal-style commands
- Maintains context while keeping the shell command aesthetic

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add LinkedIn easter egg to contact page

- Show humorous comment below LinkedIn link on hover
- "unfortunately i still need this platform" appears with smooth animation
- Styled as a code comment matching the terminal aesthetic
- Uses Framer Motion for height/opacity animation

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix LinkedIn easter egg hover jitter

- Move onMouseEnter/onMouseLeave to parent wrapper
- Hover area now includes both the link row and the comment
- Prevents jitter when comment appears/disappears

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Align easter egg comment indentation with $ prompts

- Use same flex layout for comment as commands
- \`#\` now aligns with \`$\` at the start
- Consistent visual indentation across all lines

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add GitHub easter egg to contact page

- Show comment below GitHub link on hover
- "idek if this has dms so don't reach out here but check out my commit history maps"
- Same smooth animation and styling as LinkedIn easter egg

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Extract ContactLink component to reuse easter egg logic

- Create ContactLink component to handle individual link rendering
- Accept optional easterEgg prop for comments
- Simplify page.tsx by removing duplicated state and animation logic
- Makes it easy to add more easter eggs in the future

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Shorten GitHub easter egg message

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Make easter egg comments clickable

- Wrap comment in Link to same URL as parent link
- Add hover color transition for feedback
- Comments are now fully interactive

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Style comments like active terminal text with blinking cursor

- Add blinking cursor at end of easter egg comments
- Add hover background highlight for better interactivity
- Style looks like text being actively typed in terminal
- Cursor animates to feel more dynamic and "live"

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add character-by-character typing animation with block cursor

- Text reveals character by character like live typing (1.5s animation)
- Cursor is now a terminal-style block character
- Cursor blinks in sync with typing animation
- Uses CSS steps() for smooth character reveal effect
- Monospace font for authentic terminal feel

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Make typing animation more char-by-char and snappy

- Reduce animation duration from 1.5s to 0.8s
- Reduce steps from 100 to 45 for jerkier appearance
- Each character now appears more distinctly
- Faster, choppier typing effect

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Make easter egg comments quiet links

- Remove hover background highlight
- Remove rounded styling
- Comment stays subtle and blends in
- Still clickable but doesn't feel pressable

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix typing animation initial render and add randomized character timing

- Fix flash bug where text showed fully then disappeared
- Use Framer Motion for initial hidden state
- Add randomized CSS keyframes for natural typing feel
- Char reveal intervals vary (2.5%-6%) instead of uniform
- Feels more human-like and less mechanical

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Implement truly randomized typing animation

- Generate random keyframes each time easter egg is revealed
- Each step reveals 1-5% of text width (truly random, not predetermined)
- Keyframes are injected dynamically into DOM
- Every hover gets unique, unpredictable typing pattern
- Feels more natural and different each time

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix randomization - ensure truly unique animations each hover

- Use Date.now() + random ID for guaranteed unique animation names
- Remove and recreate style element each time (not just update)
- Add cleanup to prevent memory leaks
- Add console logging to verify animations are regenerating
- Each hover now guaranteed to have different typing pattern

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Implement truly variable typing animations

- Randomize number of steps (15-29) for each animation
- Each step fills 1-5% of width (independently random)
- Different animations reach 100% with different intervals and fills
- Some animations fast (fewer big steps), others slower (more smaller steps)
- Each hover now has noticeably different typing pattern

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix animation width scaling - normalize increments to reach 100%

- Generate random increments (1-5%) for each step
- Normalize all increments so they sum to exactly 100%
- Create keyframes with cumulative widths
- Now properly scales: low increment % animations reach 100% in more steps
- High increment % animations reach 100% quickly
- Each animation visibly different with correct pacing

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Remove debug console logs

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Refactor keyframe generation to use Array.from and reduce

* Swap X and LinkedIn order, add 'no spam pls' easter egg to email

* Bump nav desktop/mobile breakpoint from md to lg to prevent title overlap

With 6 nav items, the page title overlaps the leftmost tabs on
medium screens. Switching to the mobile hamburger layout at <1024px
gives the nav enough breathing room.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix unescaped apostrophes in contact page text

Escape apostrophes in JSX text content to satisfy react/no-unescaped-entities lint rule.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
* Add contact page with minimalist URL-based design

- Create new /contact page with email and social links
- Add contact navigation item to top nav (keyboard shortcut: 6)
- Display full URLs in monospace font with arrow prefix
- Includes email, LinkedIn, GitHub, and X (Twitter) links

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Redesign contact page with shell command aesthetic

- Display contact links as terminal commands: \`$ open <url>\`
- Add subtle container with muted border and background
- Style command prompt \`$\` in accent color
- Color-code 'open' command keyword
- Underline URLs on hover for better interactivity
- More developer-oriented feel matching terminal/CLI aesthetic

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add intro text back to contact page

- Restore the introduction paragraph above the terminal-style commands
- Maintains context while keeping the shell command aesthetic

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add LinkedIn easter egg to contact page

- Show humorous comment below LinkedIn link on hover
- "unfortunately i still need this platform" appears with smooth animation
- Styled as a code comment matching the terminal aesthetic
- Uses Framer Motion for height/opacity animation

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix LinkedIn easter egg hover jitter

- Move onMouseEnter/onMouseLeave to parent wrapper
- Hover area now includes both the link row and the comment
- Prevents jitter when comment appears/disappears

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Align easter egg comment indentation with $ prompts

- Use same flex layout for comment as commands
- \`#\` now aligns with \`$\` at the start
- Consistent visual indentation across all lines

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add GitHub easter egg to contact page

- Show comment below GitHub link on hover
- "idek if this has dms so don't reach out here but check out my commit history maps"
- Same smooth animation and styling as LinkedIn easter egg

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Extract ContactLink component to reuse easter egg logic

- Create ContactLink component to handle individual link rendering
- Accept optional easterEgg prop for comments
- Simplify page.tsx by removing duplicated state and animation logic
- Makes it easy to add more easter eggs in the future

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Shorten GitHub easter egg message

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Make easter egg comments clickable

- Wrap comment in Link to same URL as parent link
- Add hover color transition for feedback
- Comments are now fully interactive

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Style comments like active terminal text with blinking cursor

- Add blinking cursor at end of easter egg comments
- Add hover background highlight for better interactivity
- Style looks like text being actively typed in terminal
- Cursor animates to feel more dynamic and "live"

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add character-by-character typing animation with block cursor

- Text reveals character by character like live typing (1.5s animation)
- Cursor is now a terminal-style block character
- Cursor blinks in sync with typing animation
- Uses CSS steps() for smooth character reveal effect
- Monospace font for authentic terminal feel

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Make typing animation more char-by-char and snappy

- Reduce animation duration from 1.5s to 0.8s
- Reduce steps from 100 to 45 for jerkier appearance
- Each character now appears more distinctly
- Faster, choppier typing effect

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Make easter egg comments quiet links

- Remove hover background highlight
- Remove rounded styling
- Comment stays subtle and blends in
- Still clickable but doesn't feel pressable

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix typing animation initial render and add randomized character timing

- Fix flash bug where text showed fully then disappeared
- Use Framer Motion for initial hidden state
- Add randomized CSS keyframes for natural typing feel
- Char reveal intervals vary (2.5%-6%) instead of uniform
- Feels more human-like and less mechanical

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Implement truly randomized typing animation

- Generate random keyframes each time easter egg is revealed
- Each step reveals 1-5% of text width (truly random, not predetermined)
- Keyframes are injected dynamically into DOM
- Every hover gets unique, unpredictable typing pattern
- Feels more natural and different each time

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix randomization - ensure truly unique animations each hover

- Use Date.now() + random ID for guaranteed unique animation names
- Remove and recreate style element each time (not just update)
- Add cleanup to prevent memory leaks
- Add console logging to verify animations are regenerating
- Each hover now guaranteed to have different typing pattern

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Implement truly variable typing animations

- Randomize number of steps (15-29) for each animation
- Each step fills 1-5% of width (independently random)
- Different animations reach 100% with different intervals and fills
- Some animations fast (fewer big steps), others slower (more smaller steps)
- Each hover now has noticeably different typing pattern

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix animation width scaling - normalize increments to reach 100%

- Generate random increments (1-5%) for each step
- Normalize all increments so they sum to exactly 100%
- Create keyframes with cumulative widths
- Now properly scales: low increment % animations reach 100% in more steps
- High increment % animations reach 100% quickly
- Each animation visibly different with correct pacing

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Remove debug console logs

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Refactor keyframe generation to use Array.from and reduce

* Swap X and LinkedIn order, add 'no spam pls' easter egg to email

* Bump nav desktop/mobile breakpoint from md to lg to prevent title overlap

With 6 nav items, the page title overlaps the leftmost tabs on
medium screens. Switching to the mobile hamburger layout at <1024px
gives the nav enough breathing room.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix unescaped apostrophes in contact page text

Escape apostrophes in JSX text content to satisfy react/no-unescaped-entities lint rule.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add circular reveal animation for theme transitions

Use the View Transitions API with a radial-gradient mask to animate
theme changes as an expanding circle from the toggle button. Gracefully
falls back to instant swap in unsupported browsers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
Replace ComingSoon placeholder with a real projects showcase using
stacked cards, tech stack badges, and native tweet embeds via
react-tweet. Theme overrides ensure the tweet embed matches the
site's warm light/dark palette.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ticky title

Increases nav height to h-20 on desktop (h-14 on mobile). Adds StickyTitleProvider
context so TopNav renders bg-background on pages without a sticky page title (e.g.
blog posts), preventing content from clashing through the transparent nav.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pages with sticky titles show gradient only when title is stuck (detected
via IntersectionObserver). Pages without sticky titles always show gradient
below the nav. Uses child div instead of pseudo-element on nav to avoid
position:relative overriding position:sticky.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace pseudo-element gradient in PageWrapper with child div to match
TopNav's approach. Remove lg:h-20 desktop override now that gradient
fades make the extra breathing room unnecessary.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows contribution activity with a note about NDA'd company work,
linked to GitHub profile. Separated from project list with dividers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add projects page with GitHub calendar
…postrophe (#24)

Co-authored-by: Cursor <cursoragent@cursor.com>
- Fix projects/timeline transition sliding from wrong side (nav order mismatch)
- Extract nav items to shared lib/nav-config.ts for single source of truth
- TopNav and NavigationProvider now both import from nav-config

Co-authored-by: Cursor <cursoragent@cursor.com>
…ibility

Co-authored-by: Cursor <cursoragent@cursor.com>
fix: correct page transition direction and centralize nav config
- Keep comment inline in terminal with fixed-height slot
- Reserve same space for all links (with or without easter egg)
- No layout shift when comment appears on hover

Co-authored-by: Cursor <cursoragent@cursor.com>
fix(contact): prevent open line shift, even spacing between links
- Keep dev's Next.js 16.1.6 and lint/tsc scripts
- Remove check-quotes script (no longer needed with direct Notion API + ISR)

Co-authored-by: Cursor <cursoragent@cursor.com>
@vercel
Copy link
Contributor

vercel bot commented Feb 12, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
personal-website Ready Ready Preview, Comment Feb 12, 2026 6:11am

@jakebodea jakebodea merged commit 46b716b into main Feb 12, 2026
3 checks passed
@jakebodea jakebodea deleted the dev-merge-main branch February 12, 2026 06:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant