Capítulo 35 de 456
Use uma lib de CSS-in-JS suportada em Client Components no App Router; libs que dependem de extração de estilo em runtime (styled-jsx, styled-components) precisam de um style registry + useServerInsertedHTML pra injetar as regras antes do conteúdo que as usa.
useServerInsertedHTML: hook (de next/navigation) que injeta as regras coletadas antes de qualquer conteúdo que possa usá-las.emotion estava em progresso de suporte.compiler.styledComponents: true: flag no next.config.js que habilita styled-components v6+.'use client'
import { useState } from 'react'
import { useServerInsertedHTML } from 'next/navigation'
import { StyleRegistry, createStyleRegistry } from 'styled-jsx'
export default function StyledJsxRegistry({ children }: { children: React.ReactNode }) {
const [jsxStyleRegistry] = useState(() => createStyleRegistry())
useServerInsertedHTML(() => {
const styles = jsxStyleRegistry.styles()
jsxStyleRegistry.flush()
return <>{styles}</>
})
return <StyleRegistry registry={jsxStyleRegistry}>{children}</StyleRegistry>
}
'use client'
import { useState } from 'react'
import { useServerInsertedHTML } from 'next/navigation'
import { ServerStyleSheet, StyleSheetManager } from 'styled-components'
export default function StyledComponentsRegistry({ children }: { children: React.ReactNode }) {
const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet())
useServerInsertedHTML(() => {
const styles = styledComponentsStyleSheet.getStyleElement()
styledComponentsStyleSheet.instance.clearTag()
return <>{styles}</>
})
if (typeof window !== 'undefined') return <>{children}</>
return <StyleSheetManager sheet={styledComponentsStyleSheet.instance}>{children}</StyleSheetManager>
}
typeof window !== 'undefined') pula o StyleSheetManager e deixa styled-components assumir normalmente.import StyledComponentsRegistry from './lib/registry'
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>
<StyledComponentsRegistry>{children}</StyledComponentsRegistry>
</body>
</html>
)
}
children do root layout, não o <html>/<body>.styled-jsx sem v5.1.0+: versão mínima exigida para funcionar em Client Components.useServerInsertedHTML, Client Component envolvendo o app no SSR inicial.styled-components requer compiler.styledComponents: true no next.config.js além do registry.useServerInsertedHTML: hook central de todo o padrão.