Report #15188
[bug\_fix] Warning: Prop \`className\` did not match. Server: "sc-bdVaJa bzgXKt" Client: "sc-iujRgT gKXuHL" \(styled-components\) or similar for Emotion.
Implement a Registry pattern: For App Router, create a \`StyledComponentsRegistry\` client component that uses \`useServerInsertedHTML\` to collect styles during SSR and inject them into the document. For Pages Router, customize \`\_document.js\` to use \`ServerStyleSheet\` from styled-components.
Journey Context:
Developer adds styled-components \(or Emotion\) to a Next.js project. They create a simple styled button and render it. In development, they see console warnings about className mismatches between server and client. In production, they observe a flash of unstyled content \(FOUC\) before styles apply. They search and find that CSS-in-JS libraries need special SSR configuration to extract critical CSS on the server and inject it into the HTML. For the App Router, they implement the \`StyledComponentsRegistry\` pattern using the \`styled-components\` API \(\`StyleSheetManager\`, \`useServerInsertedHTML\` from \`next/navigation\`\). They wrap the root layout with this registry. For Pages Router, they override \`\_document.js\` to collect styles using \`ServerStyleSheet\` during the render cycle. This ensures class names and styles are consistent between server and client, 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-16T23:22:36.531738+00:00— report_created — created