Начало работы: React Router 7
Framework mode с SSR: стили и ThemeProvider подключаются в app/root.tsx
1. Создайте приложение
Remix v2 продолжился как React Router 7. Для проекта на Remix сначала пройдите официальную миграцию на React Router 7 (импорты из @remix-run/* меняются на react-router), дальше всё как в этом гайде.
npx create-react-router@7 my-app
cd my-app
2. Установите пакет
Подходят react и react-dom 17, 18 и 19 (на React 17 id из useId появляются сразу после монтирования). Пакет — ES-модули (плюс CommonJS-копия для require()), без runtime-зависимостей, по файлу на модуль: в бандл попадают только импортированные компоненты, а как грузить и CSS только их — в разделе «Только нужный CSS» ниже. Шрифты — отдельные файлы: тема vercel (по умолчанию в ThemeProvider) использует Geist, поэтому рядом со стилями импортируйте valyro-ui/fonts/geist.css и valyro-ui/fonts/geist-mono.css, иначе текст будет системным шрифтом; glass использует системные шрифты, ей файлы не нужны. Пока пакет не опубликован, соберите и упакуйте его в репозитории (npm run build:core && npm pack ./dist/core) и установите tarball из корня репозитория: npm install /path/to/ValyroUI/valyro-ui-0.1.0.tgz.
npm install valyro-ui
3. Подключите стили и тему в root
Добавьте импорты рядом с import "./app.css", атрибуты темы — на <html> в Layout, а ThemeProvider — вокруг children. При SSR задайте locale в ThemeProvider: иначе числа и даты форматируются по локали сервера, а в браузере — по локали пользователя, и гидрация падает на несовпадении текста («1,200» против «1 200»).
import "./app.css";
import "valyro-ui/styles.css";
import { ThemeProvider } from "valyro-ui";
export function Layout({ children }: { children: React.ReactNode }) {
return (
<html lang="en" data-theme="glass" data-mode="light">
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<Meta />
<Links />
</head>
<body>
<ThemeProvider theme="glass" mode="light" locale="en-US">
{children}
</ThemeProvider>
<ScrollRestoration />
<Scripts />
</body>
</html>
);
}
4. Уберите фон из шаблона
Шаблон красит html, body классами bg-white dark:bg-gray-950 и перекрывает фон темы. Удалите этот блок, оставив @import "tailwindcss" и @theme, если используете Tailwind.
@import "tailwindcss";
@theme {
--font-sans: "Inter", ui-sans-serif, system-ui, sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
5. Маршрут
Showcase — компонент из гайда по Next.js, без изменений.
import { Showcase } from "../Showcase";
export function meta() {
return [{ title: "ValyroUI on React Router" }];
}
export default function Home() {
return <Showcase />;
}
6. Соберите и запустите
npm run typecheck
npm run build
npm run start