16. Стилизация
Remix поддерживает множество подходов к стилизации. Выбор зависит от предпочтений команды и требований проекта.
CSS файлы
Заголовок раздела «CSS файлы»Самый простой способ — обычные CSS файлы через links:
import type { LinksFunction } from "@remix-run/node";import styles from "~/styles/page.css?url";
export const links: LinksFunction = () => [ { rel: "stylesheet", href: styles },];Важно: стили подключаются и удаляются по мере навигации между маршрутами!
CSS Modules
Заголовок раздела «CSS Modules»// app/components/Button.module.css.button { padding: 8px 16px; background: #3992ff; border-radius: 6px;}
.button:hover { background: #2563eb;}
// app/components/Button.tsximport styles from "./Button.module.css";
export function Button({ children, onClick }) { return ( <button className={styles.button} onClick={onClick}> {children} </button> );}Tailwind CSS
Заголовок раздела «Tailwind CSS»npm install -D tailwindcssnpx tailwindcss init --tsexport default { content: ["./app/**/*.{js,jsx,ts,tsx}"], theme: { extend: {}, },};@tailwind base;@tailwind components;@tailwind utilities;
// app/root.tsximport tailwind from "~/tailwind.css?url";
export const links: LinksFunction = () => [ { rel: "stylesheet", href: tailwind },];Vanilla Extract
Заголовок раздела «Vanilla Extract»npm install @vanilla-extract/css @vanilla-extract/vite-pluginimport { style } from "@vanilla-extract/css";
export const button = style({ padding: "8px 16px", background: "#3992ff", borderRadius: "6px", ":hover": { background: "#2563eb", },});Styled Components / Emotion
Заголовок раздела «Styled Components / Emotion»import { ServerStyleSheet } from "styled-components";
// entry.server.tsx — нужна настройка для SSRexport default function handleRequest( request, responseStatusCode, responseHeaders, remixContext) { const sheet = new ServerStyleSheet(); // ...}Глобальные стили в root.tsx
Заголовок раздела «Глобальные стили в root.tsx»export const links: LinksFunction = () => [ { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap" }, { rel: "stylesheet", href: globalStyles },];