Skip to content

fix: defer theme initialization to prevent SSR hydration mismatch#1063

Open
Pranav-IIITM wants to merge 2 commits into
magic-peach:mainfrom
Pranav-IIITM:fix/theme-hydration-mismatch
Open

fix: defer theme initialization to prevent SSR hydration mismatch#1063
Pranav-IIITM wants to merge 2 commits into
magic-peach:mainfrom
Pranav-IIITM:fix/theme-hydration-mismatch

Conversation

@Pranav-IIITM
Copy link
Copy Markdown
Contributor

Description

Fixes a React hydration mismatch caused by theme state being initialized
using browser-only DOM checks (document.documentElement.classList.contains("dark"))
during SSR. The server rendered a different theme than the client, causing
hydration warnings on every page load.

Changes made:

  • ThemeProvider.tsx — theme state now starts as undefined; real theme
    is detected and applied inside useEffect (client-only, no SSR reads)
  • ThemeToggle.tsx — returns null while theme === undefined to prevent
    flicker and hydration warnings
  • layout.tsx — already had suppressHydrationWarning on <html>, no
    changes needed

Verified: Zero hydration warnings in clean incognito Chrome window.
The hydration warning visible in normal Chrome is caused by a browser
extension injecting into the DOM before React loads — not by application code.


Related Issue

Closes #1020


Type of Contribution

  • Bug fix
  • New feature
  • Documentation update
  • Refactor
  • GSSoC contribution

Participant Info

  • GitHub username: @Pranav-IIITM
  • Contribution level (Beginner/Intermediate/Advanced): Intermediate

Screen Recording

Recorded in clean incognito window — zero hydration warnings on hard
refresh, theme toggle works correctly, theme persists after refresh.

No.hydration.Warning.1.mp4

Checklist

  • I have read the contribution guidelines
  • My changes follow the project structure
  • I have tested my changes in Chrome, Firefox, and Safari
  • bun run lint passes (no ESLint errors)
  • bunx tsc --noEmit passes (no TypeScript errors)
  • New interactive elements have aria-label / accessible names
  • No console.log statements left in
  • This PR is related to a valid issue
  • Screen recording attached above

@vercel
Copy link
Copy Markdown

vercel Bot commented May 24, 2026

@Pranav-IIITM is attempting to deploy a commit to the magic-peach1's projects Team on Vercel.

A member of the Team first needs to authorize it.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 24, 2026

✅ PR Format Check Passed — @Pranav-IIITM

Basic format checks passed. A maintainer will review your code changes.

This does not mean the PR is approved — it just means the format is correct.

@github-actions github-actions Bot added level:intermediate Intermediate level - 35 pts type:bug Bug fix type:design UI/UX design type:docs Documentation type:feature New feature type:refactor Code refactor labels May 24, 2026
@github-actions
Copy link
Copy Markdown
Contributor

👋 Thanks for your PR, @Pranav-IIITM!

Welcome to Reframe — a browser-based video editor built for everyone 🎬

🟠 GSSoC'26 PR detected — thanks for contributing under GirlScript Summer of Code 2026!

What happens next

  1. 🤖 Automated checks — build & TypeScript typecheck will run automatically
  2. Vercel preview — a preview deployment will be created (requires maintainer authorization for fork PRs)
  3. 👀 Code review — a maintainer will review your changes
  4. 🚀 Merge — once approved, your PR will be merged!

Quick checklist

  • PR title follows Conventional Commits (e.g. feat: add dark mode)
  • Linked the issue this PR closes (e.g. Closes #123)
  • Tested the changes locally (bun run dev)
  • Build passes (bun run build)

Useful links

Happy coding! 🎉

@github-actions github-actions Bot added the gssoc'26 GirlScript Summer of Code 2026 label May 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gssoc'26 GirlScript Summer of Code 2026 level:intermediate Intermediate level - 35 pts type:bug Bug fix type:design UI/UX design type:docs Documentation type:feature New feature type:refactor Code refactor

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] [GSSoC'26] : Hydration mismatch caused by theme initialization during SSR

1 participant