Styling with Emotion
Let's take a look at how to style our application using Emotion.
While it may not be the best choice for an App Router app, if you're an Emotion fan it's important to understand how it works and the trade-offs involved. Keep in mind that you can't use Emotion directly with React Server Components, but let's dive in and see how to style our app with Emotion.
Installing Emotion Libraries
First, let's install the Emotion libraries by running the following command:
pnpm add @emotion/cache @emotion/react @emotion/styled
Next, add the required Babel extension as a development dependency:
pnpm add -D @emotion/babel-plugin
Setting Up the Emotion Registry
Emotion captures all of the CSS classes into a registry. To set this up, we need to create a Registry component that we'll add to our application.
Create a new file called Registry.tsx inside the src/app directory and add the following code that is mostly from the Emotion documentation:
"use client";
import React, { useState } from "react";
import { useServerInsertedHTML } from "next/navigation";
import { CacheProvider } from "@emotion/react";
import createCache from "@emotion/cache";
const EmotionRegistry = ({ children }: { children: React.ReactNode }) => {
const [emotionCache] = useState(() => {
const emotionCache = createCache({ key: "css", prepend: true });
emotionCache.compat = true;
return emotionCache;
});
useServerInsertedHTML(() => {
return (
<style
data-emotion={`${emotionCache.key} ${Object.keys(
emotionCache.inserted
).join(" ")}`}
dangerouslySetInnerHTML={{
__html: Object.values(emotionCache.inserted).join(" "),
}}
/>
);
});
if (typeof window !== "undefined") return <>{children}</>;
return <CacheProvider value={emotionCache}>{children}</CacheProvider>;
};
export default EmotionRegistry;
Next, we'll bring the Registry component into our layout.tsx file and wrap our children with it:
import EmotionRegistry from "./Registry";
import "./globals.css";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html>
<head />
<body>
<EmotionRegistry>{children}</EmotionRegistry>
</body>
</html>
);
}
Now we can start the development server and check that there are no errors:
Styling with Emotion
Now, let's start styling our app using Emotion.
Open the page.tsx file and import the styled function from @emotion/styled:
import styled from "@emotion/styled";
Your task now is to use styled to create styled components for main and card, then replace the main tag and the interior div tag respectively.
Give it a try, then check out the next video for the solution.