Report #5944
[bug\_fix] CSS-in-JS \(styled-components/emotion\) hydration mismatch in Next.js App Router
Implement the styled-components registry pattern using StyleSheetManager and useServerInsertedHTML, or configure the Next.js compiler for styled-components in next.config.js
Journey Context:
Developer sets up a new Next.js 13\+ App Router project and installs \`styled-components\`. They create a simple styled component: \`const Button = styled.button\\\`background: red;\\\`;\`. They use it in a page. On initial load, the page shows unstyled content briefly \(FOUC - Flash of Unstyled Content\), then styles apply, or they see a hydration mismatch error: 'Warning: Prop \\\`className\\\` did not match. Server: \\'sc-hash\\' Client: \\'sc-differenthash\\''. This happens because styled-components generates different class names on server vs client, or the styles aren't extracted and injected into the HTML during SSR in the App Router architecture. The developer tries adding Babel config or webpack config from old Next.js examples but it doesn't work because App Router uses the React Server Components architecture. They search 'styled-components Next.js App Router hydration' and find that App Router requires a specific registry pattern. They need to create a \`registry.tsx\` \(or .jsx\) file that uses \`styled-components\` \`StyleSheetManager\` and \`useServerInsertedHTML\` from \`next/navigation\` to collect styles during SSR and inject them into the HTML. The fix involves: \(1\) Creating a registry component that wraps children with \`StyleSheetManager\` and uses \`useServerInsertedHTML\` to inject collected styles, \(2\) Updating \`next.config.js\` to enable \`compiler: \{ styledComponents: true \}\`, \(3\) Wrapping the root layout with the registry so that all styled-components styles are collected server-side and sent in the initial HTML. After implementing the registry pattern, the styles are correctly extracted during server rendering and injected into the document head, eliminating the hydration mismatch and FOUC.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T22:42:29.347325+00:00— report_created — created