React Router
A guide for installing and using Yamada UI with React Router projects.
Installation
- 1
Create application
Create React Router application.
pnpm create react-router my-app
npx create-react-router my-app
yarn create react-router my-app
bun create react-router my-app
- 2
Setup
Running the command will create the necessary files and folders in your project.
pnpm dlx @yamada-ui/cli init
npx @yamada-ui/cli init
yarn dlx @yamada-ui/cli init
bunx @yamada-ui/cli init
- 3
Install the package
Install
@workspaces/ui
to your application.pnpm add "@workspaces/ui@workspace:*"
npm install "@workspaces/ui@workspace:*"
yarn add "@workspaces/ui@workspace:*"
bun add "@workspaces/ui@workspace:*"
- 4
Add provider
After installing, add
UIProvider
to the root of your application. To suppress hydration errors, addsuppressHydrationWarning
to thehtml
andbody
tags.root.tsx
import { Meta, Outlet, Scripts, ScrollRestoration } from "react-router" import { UIProvider } from "@workspaces/ui" export function Layout({ children }: { children: React.ReactNode }) { return ( <html lang="en" suppressHydrationWarning> <head> <meta charSet="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <Meta /> </head> <body suppressHydrationWarning> <UIProvider>{children}</UIProvider> <ScrollRestoration /> <Scripts /> </body> </html> ) } export default function App() { return <Outlet /> }
- 5
Use components
After adding
UIProvider
, you can use the components in your application.home.tsx
import { Button } from "@workspaces/ui" export default function Home() { return <Button>Click me!</Button> }
That's it! You've successfully set up Yamada UI.
スクリプト
ColorModeScript
To use Color Mode, you need to add ColorModeScript
to the body
to ensure it works correctly.
This is because color mode is implemented using localStorage
or cookies
, and adding the script ensures proper synchronization when the page loads.
root.tsx
import {
data,
Meta,
Outlet,
Scripts,
ScrollRestoration,
useRouteLoaderData,
} from "react-router"
import { ColorModeScript, UIProvider } from "@workspaces/ui"
import type { Route } from "./+types/root"
export async function loader({ request }: Route.LoaderArgs) {
const cookie = request.headers.get("cookie") ?? ""
return data({ cookie })
}
export function Layout({ children }: { children: React.ReactNode }) {
const { cookie } = useRouteLoaderData("root")
return (
<html lang="en" suppressHydrationWarning>
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<Meta />
</head>
<body suppressHydrationWarning>
<ColorModeScript type="cookie" />
<UIProvider cookie={cookie}>{children}</UIProvider>
<ScrollRestoration />
<Scripts />
</body>
</html>
)
}
export default function App() {
return <Outlet />
}
If you change the defaultColorMode
in your config, set the defaultValue
prop on ColorModeScript
.
root.tsx
import {
data,
Meta,
Outlet,
Scripts,
ScrollRestoration,
useRouteLoaderData,
} from "react-router"
import { ColorModeScript, UIProvider } from "@workspaces/ui"
import type { Route } from "./+types/root"
import { config } from "@workspace/theme"
export async function loader({ request }: Route.LoaderArgs) {
const cookie = request.headers.get("cookie") ?? ""
return data({ cookie })
}
export function Layout({ children }: { children: React.ReactNode }) {
const { cookie } = useRouteLoaderData("root")
return (
<html lang="en" suppressHydrationWarning>
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<Meta />
</head>
<body suppressHydrationWarning>
<ColorModeScript type="cookie" defaultValue={config.defaultColorMode} />
<UIProvider config={config} cookie={cookie}>
{children}
</UIProvider>
<ScrollRestoration />
<Scripts />
</body>
</html>
)
}
export default function App() {
return <Outlet />
}
ThemeSchemeScript
To use theme switching, you need to add ThemeSchemeScript
to the body
to ensure it works correctly.
This is because theme switching is implemented using localStorage
or cookies
, and adding the script ensures proper synchronization when the page loads.
root.tsx
import {
data,
Meta,
Outlet,
Scripts,
ScrollRestoration,
useRouteLoaderData,
} from "react-router"
import { ThemeSchemeScript, UIProvider } from "@workspaces/ui"
import type { Route } from "./+types/root"
export async function loader({ request }: Route.LoaderArgs) {
const cookie = request.headers.get("cookie") ?? ""
return data({ cookie })
}
export function Layout({ children }: { children: React.ReactNode }) {
const { cookie } = useRouteLoaderData("root")
return (
<html lang="en" suppressHydrationWarning>
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<Meta />
</head>
<body suppressHydrationWarning>
<ThemeSchemeScript type="cookie" />
<UIProvider cookie={cookie}>{children}</UIProvider>
<ScrollRestoration />
<Scripts />
</body>
</html>
)
}
export default function App() {
return <Outlet />
}
If you change the defaultThemeScheme
in your config, set the defaultValue
prop on ThemeSchemeScript
.
root.tsx
import {
data,
Meta,
Outlet,
Scripts,
ScrollRestoration,
useRouteLoaderData,
} from "react-router"
import { ThemeSchemeScript, UIProvider } from "@workspaces/ui"
import type { Route } from "./+types/root"
import { config } from "@workspace/theme"
export async function loader({ request }: Route.LoaderArgs) {
const cookie = request.headers.get("cookie") ?? ""
return data({ cookie })
}
export function Layout({ children }: { children: React.ReactNode }) {
const { cookie } = useRouteLoaderData("root")
return (
<html lang="en" suppressHydrationWarning>
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<Meta />
</head>
<body suppressHydrationWarning>
<ThemeSchemeScript
type="cookie"
defaultValue={config.defaultThemeScheme}
/>
<UIProvider config={config} cookie={cookie}>
{children}
</UIProvider>
<ScrollRestoration />
<Scripts />
</body>
</html>
)
}
export default function App() {
return <Outlet />
}