Repository navigation
feat(ui): polish visuals, motion and support across devices - #9
Merged
Merged
Conversation
Typography and layout
- Load Inter through next/font: the CSS asked for it but never loaded it,
so every OS fell back to its own system font.
- Hero: CTAs before the long bio so they sit above the fold on 1366x768
and 1024x768 laptops; the bio is left-aligned on phones; balanced headings.
- Section headers share the max-w-6xl content column (no 32px offset at
>=1600px); featured project media aligns to the top of its card.
- Skill cards: "View group" pinned to the bottom, container-query header so
narrow cards keep their titles on one or two lines.
- Journey: the "today" label no longer covers the next year's label.
- Sidebar fits 1366x768 screens (smaller portrait and rows when short).
Motion
- MotionConfig reducedMotion="user" app-wide and no more
`animate ? fadeInUp() : {}` spreads, which left elements stuck at
opacity 0 for reduced-motion visitors after hydration.
- Hero entrance is pure CSS, so the first screen paints before hydration;
the preload now targets the portrait actually rendered (hero-320).
- Softer, longer scroll-in entrances; real staggers instead of dead
staggerChildren blocks; no duplicate entrance on secondary projects.
- Journey timeline draws in when it scrolls into view; infinite pulses are
gated (in view, horizontal layout, reduced motion); the ongoing node
breathes instead of blinking.
- No `transition-all` on framer-animated elements; non-clickable cards no
longer lift on hover.
Performance
- Hero featured rotation drives its progress bar with a MotionValue and
pauses off-screen (it re-rendered the Hero every frame, forever).
- Silk background: dpr 1, no MSAA, low-power GPU, ~30fps on-demand loop,
reactive reduced-motion check, transparent fallback (no gradient pop-in).
- Drop the stale hand-written @react-three/fiber type shims.
Devices
- Notch-aware page gutter (px-gutter) for viewport-fit=cover, safe-area
insets on header, drawer and floating menu button.
- Footer clears the floating menu button below xl; 44px touch targets on
footer links, DOI chip and tablet header nav; tech tags at 11px.
- Base CSS moved to @layer base: one focus ring per element instead of
outline + ring with 2px corners; ~150 lines of dead utilities removed.
- Manifest theme/background colour matches the site (#040304).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aMonteSl
added a commit
that referenced
this pull request
Oct 5, 2026
Typography and layout
- Load Inter through next/font: the CSS asked for it but never loaded it,
so every OS fell back to its own system font.
- Hero: CTAs before the long bio so they sit above the fold on 1366x768
and 1024x768 laptops; the bio is left-aligned on phones; balanced headings.
- Section headers share the max-w-6xl content column (no 32px offset at
>=1600px); featured project media aligns to the top of its card.
- Skill cards: "View group" pinned to the bottom, container-query header so
narrow cards keep their titles on one or two lines.
- Journey: the "today" label no longer covers the next year's label.
- Sidebar fits 1366x768 screens (smaller portrait and rows when short).
Motion
- MotionConfig reducedMotion="user" app-wide and no more
`animate ? fadeInUp() : {}` spreads, which left elements stuck at
opacity 0 for reduced-motion visitors after hydration.
- Hero entrance is pure CSS, so the first screen paints before hydration;
the preload now targets the portrait actually rendered (hero-320).
- Softer, longer scroll-in entrances; real staggers instead of dead
staggerChildren blocks; no duplicate entrance on secondary projects.
- Journey timeline draws in when it scrolls into view; infinite pulses are
gated (in view, horizontal layout, reduced motion); the ongoing node
breathes instead of blinking.
- No `transition-all` on framer-animated elements; non-clickable cards no
longer lift on hover.
Performance
- Hero featured rotation drives its progress bar with a MotionValue and
pauses off-screen (it re-rendered the Hero every frame, forever).
- Silk background: dpr 1, no MSAA, low-power GPU, ~30fps on-demand loop,
reactive reduced-motion check, transparent fallback (no gradient pop-in).
- Drop the stale hand-written @react-three/fiber type shims.
Devices
- Notch-aware page gutter (px-gutter) for viewport-fit=cover, safe-area
insets on header, drawer and floating menu button.
- Footer clears the floating menu button below xl; 44px touch targets on
footer links, DOI chip and tablet header nav; tech tags at 11px.
- Base CSS moved to @layer base: one focus ring per element instead of
outline + ring with 2px corners; ~150 lines of dead utilities removed.
- Manifest theme/background colour matches the site (#040304).
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #8. Merge #8 first; when its branch is deleted, GitHub retargets this PR to
main.Summary
An audit of every section at 390, 768, 1024, 1366, 1440 and 1920px, plus a code review of the design system and animations, led to the fixes below. The look stays the same: no redesign, only polish and bug fixes.
Typography and layout
next/font.text-balance.max-w-6xlcontent column. At ≥1600px they no longer sit 32px left of their cards.Motion
opacity:0, and components spreadanimate ? fadeInUp() : {}. Reduced-motion visitors could hydrate with no animation props, leaving elements stuck invisible. The fix is a global<MotionConfig reducedMotion="user">with the motion props always passed.hero-320, nothero-196).staggerChildrenblocks that did nothing are gone.layoutanimation is gone.transition-allon framer-animated elements.Performance
MotionValue, and the rotation pauses off-screen and in hidden tabs.dpr={1}, without MSAA, on the low-power GPU, at about 30fps (on-demand frameloop), with the same visual speed.@react-three/fibershims (src/types/fiber.d.ts,three-fiber.d.ts) that shadowed R3F 9's own types.Devices
px-gutterutility: a 16/24/32px gutter that also clears landscape notches, needed because the viewport usesviewport-fit=cover.xlthe home footer leaves room for it, so it no longer covers the end of the page.xl(iPad Pro landscape).@layer base, so utilities win. This fixes the double focus indicator (outline + ring) and the 2px corners on every focused pill and card.theme_color/background_colornow match the site (#040304instead of#403e3e).Test plan
npm run checkpasses: lint, typecheck, translations, journey timeline.npm run buildpasses.<h1>no longer ships inlineopacity:0.hero-320preload is present.🤖 Generated with Claude Code