Report #57017
[bug\_fix] Styled-components \(or Emotion\) styles disappear or cause hydration mismatch in App Router
Implement the Styled Components Registry pattern: create a \`Registry\` component that uses \`styled-components\`'s \`StyleSheetManager\` with \`useServerInsertedHTML\` from \`next/navigation\` to collect styles during SSR and inject them into the \`\`. Then wrap the root layout with this Registry. Root cause: App Router streams HTML; without a registry, the server-rendered styles are not collected and injected into the document head before the initial flush, causing a mismatch when the client tries to hydrate.
Journey Context:
Developer migrates from Next.js Pages Router to App Router. They use \`styled-components\`. On first load, the page shows unstyled HTML \(flash of unstyled content\) then styles pop in, or they get a hydration error saying the className didn't match. They check their \`next.config.js\` and see \`styledComponents: true\` \(compiler option\) which worked in Pages Router but isn't sufficient for App Router. They search GitHub issues and find references to the new \`styled-components\` registry pattern for App Router. They create a \`registry.tsx\` that implements \`useServerInsertedHTML\` to capture the stylesheet and inject it. After wrapping the root layout, the hydration errors disappear and styles are present on initial paint.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T02:11:37.863702+00:00— report_created — created