Skip to content

feat: add split-screen layout with sticky sidebar#44

Closed
andimrob wants to merge 165 commits intomainfrom
feat/split-screen-layout
Closed

feat: add split-screen layout with sticky sidebar#44
andimrob wants to merge 165 commits intomainfrom
feat/split-screen-layout

Conversation

@andimrob
Copy link
Owner

@andimrob andimrob commented Feb 14, 2026

Summary

Redesigns the site with a Brittany Chiang-inspired split-screen layout featuring:

  • Sticky sidebar (left, desktop) with name tag, typed name, title, social links, and navigation
  • Colorful animated gradient underline on navigation links
  • Scrollable content area (right) with About, Experience, and Projects sections
  • Responsive mobile header for smaller screens

Changes

  • ✅ Created new Sidebar component with all profile info and navigation
  • ✅ Created MobileHeader for responsive mobile view
  • ✅ Restructured App.tsx to use two-column flex layout
  • ✅ Added colorful gradient underline animation to nav links
  • ✅ Added scroll margin to sections for better anchor navigation
  • ✅ Removed Header and Hero components (functionality moved to Sidebar)

Visual Preview

  • Desktop: Side-by-side layout with sticky left sidebar
  • Mobile: Stacked layout with fixed header at top

Test Plan

  • Build passes (pnpm run build)
  • Test desktop layout at various screen sizes
  • Test mobile layout and header
  • Verify navigation links scroll to correct sections
  • Check colorful underline animation on active section
  • Verify theme toggle works in both desktop and mobile
  • Test social links open correctly

Summary by cubic

Adds a split-screen layout with a sticky sidebar and rebuilds the Experience and Projects sections with rich content and tech badges. Improves navigation, accessibility, and visual polish across the site.

  • New Features

    • Experience timeline with roles, company links, descriptions, and color-coded tech badges; added “View Full Résumé”.
    • Projects list with interactive cards, descriptions, links, and tech badges; added “View Full Project Archive”.
    • “Skip to Content” link and mobile sticky section titles for About, Experience, and Projects.
    • Typed name prism in the sidebar with magnetic tilt and subtle glow; mobile theme toggle.
  • Refactors

    • Replaced RevealSection/SectionHeading with semantic sections and scroll-margins; moved and expanded Footer with build stack credits.
    • Removed Header and MobileHeader, and the Header Storybook story.
    • CSS updates: increased prism height, side/front glow via magnetic-strength, animated gradient underline, smaller tagline.

Written for commit 55a2352. Summary will update on new commits.

andimrob and others added 25 commits February 11, 2026 23:22
Caveat was loaded but never referenced — removes an unnecessary
network request on every page load.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vite serves static/ as root, so the runtime path should be
/fonts/SimpleCakes.ttf, not /static/fonts/SimpleCakes.ttf.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Install and configure ESLint 9 (flat config) with typescript-eslint,
react-hooks, react-refresh, and eslint-config-prettier. Add Prettier
with project-matching style. Install Storybook 10 with react-vite
framework and addon suite. Add typecheck, lint, format, and storybook
scripts. Remove package-lock.json to standardize on pnpm (resolves #27).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move ref assignment in useActiveSection into useEffect to satisfy
react-hooks/refs rule. Remove unnecessary regex escape in xray.ts.
Apply Prettier formatting to Hero.tsx, confetti.ts, and main.tsx.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace npm ci with pnpm install --frozen-lockfile using
pnpm/action-setup@v4. Add format:check, lint, and typecheck
steps before the build step.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Configure Storybook with @tailwindcss/vite plugin via viteFinal so
Tailwind classes render in stories. Add dark mode toolbar toggle via
decorator that toggles .dark class on <html>. Create Header stories:
Default, WithScrollSections (mock scroll targets), and DarkMode.
Include vitest addon integration for story-based testing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The component was a 9-line wrapper around a single <span>. Inline
the element directly and delete CursiveRob.tsx.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace 9 standalone gradient classes and keyframes (~207 lines) with
a shared base rule and CSS custom properties (~68 lines). Each variant
now only sets --prism-stops, --prism-size, --prism-speed, and
--prism-timing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The identical heading className (~130 chars) was copy-pasted across
About, Experience, and Projects. Extract into a shared SectionHeading
component that takes children.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Every RevealSection consumer wrapped children in an identical
<div className="mx-auto max-w-4xl px-6">. Move this container
into RevealSection itself and remove the wrapper from About,
Experience, and Projects.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The identical social link className (~200 chars) was repeated 3 times
in Hero.tsx. Extract into a local SocialLink component that takes
href, label, and SVG children as props.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…Linux, TDD, A/B Testing

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

Replace the monolithic xray.ts (imperative DOM creation, manual pub/sub,
module globals) with idiomatic React: hooks for state (useXRay, useMousePosition)
and a component (XRayOverlay) that mounts/unmounts via conditional rendering.
60fps animations stay imperative via refs. CursorGlow now receives props
instead of subscribing to a custom event system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Document the current state of testing (1 Storybook story, no unit/integration/e2e tests,
CI not running tests) and propose a phased plan covering pure function tests, hook tests,
component stories, and E2E smoke tests.

https://claude.ai/code/session_01R1f3Cb55HfJHSwXi6hck6U
Phase 1 — Foundation:
- Add `test`, `test:watch`, and `test:coverage` scripts to package.json
- Add Vitest unit test project (jsdom) alongside existing Storybook project
- Add `pnpm run test` step to CI workflow
- Install @testing-library/react, @testing-library/jest-dom, jsdom

Phase 2 — Pure function tests (26 tests):
- src/xray/highlight.test.ts: esc(), highlight(), color constants, JS_RULES

Phase 3 — Hook tests (44 tests):
- src/hooks/useTypewriter.test.ts: typing animation, cursor lifecycle, cleanup
- src/hooks/useTheme.test.ts: localStorage, system preference, toggle
- src/hooks/useActiveSection.test.ts: scroll-based section detection
- src/hooks/usePrismFlip.test.tsx: flip count, quip cycling, confetti/coin triggers
- src/hooks/useRevealOnScroll.test.tsx: IntersectionObserver integration
- src/hooks/useMagneticTilt.test.ts: tilt math, attract range, disabled state
- src/xray/useXRay.test.ts: keyboard toggle, modifier/input filtering

Phase 4 — Component Storybook stories:
- Hero, About, Experience, Projects, Footer, SectionHeading (Default + DarkMode)

https://claude.ai/code/session_01R1f3Cb55HfJHSwXi6hck6U
- highlight.test.ts: verify escaping with empty rules, add string/keyword
  precedence test
- useXRay.test.ts: add SELECT element, sourceHTML loading, ensureFont,
  and non-x key tests
- useActiveSection.test.ts: add "last section wins" test, threshold
  boundary test
- usePrismFlip.test.tsx: add auto-rotate timer and faceBg assertions
- useMagneticTilt.test.ts: validate transform format with regex instead
  of loose string contains
- useRevealOnScroll.test.tsx: replace `as any` casts with typed MockIO
  interface
- useTypewriter.test.ts: assert cursor stays visible during typing

77 tests, all passing.

https://claude.ai/code/session_01R1f3Cb55HfJHSwXi6hck6U
pnpm/action-setup@v4 requires an explicit pnpm version. Add
`packageManager` to package.json so the action picks it up
automatically.

https://claude.ai/code/session_01R1f3Cb55HfJHSwXi6hck6U
`vitest run` without --project runs all projects including the
storybook browser project, which requires Playwright's Chromium to
be installed. CI doesn't have that. Scope test/test:watch/test:coverage
to --project unit and add a separate test:storybook script.

https://claude.ai/code/session_01R1f3Cb55HfJHSwXi6hck6U
- Add sticky sidebar on desktop with name tag, typed name, social links, and navigation
- Add colorful gradient underline effect to nav links
- Create responsive mobile header
- Restructure app into two-column layout
- Move content sections to scrollable right panel
@netlify
Copy link

netlify bot commented Feb 14, 2026

Deploy Preview for symphonious-blancmange-7aafce ready!

Name Link
🔨 Latest commit 55a2352
🔍 Latest deploy log https://app.netlify.com/projects/symphonious-blancmange-7aafce/deploys/699f56033c15910008107c36
😎 Deploy Preview https://deploy-preview-44--symphonious-blancmange-7aafce.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Copy link

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 7 files

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/index.css">

<violation number="1" location="src/index.css:41">
P2: Setting `--prism-h` to `auto` makes the `calc()` in the prism transforms invalid (auto can’t be divided), so the 3D faces won’t translate. Use a length value for `--prism-h` and override it where needed instead of `auto`.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

@andimrob andimrob closed this Feb 25, 2026
@andimrob andimrob force-pushed the feat/split-screen-layout branch from b8d49c3 to 55a2352 Compare February 25, 2026 20:05
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