Create a new route following project conventions. Use when adding pages, routes, or navigation endpoints.
In FSD with React Router v7:
src/routes.ts — Route configuration (connects paths to page files)src/pages/ — Page composition layer (features assembly)default exportsrc/pages/{page-name}/
├── ui/
│ └── {page-name}-page.tsx # RR7 route module (default export)
├── {page-name}.css.ts # Page styles (optional)
└── index.ts # Public API
// pages/dashboard/ui/dashboard-page.tsx
import { StatsOverview } from "@/features/stats";
import { TopArtistsList } from "@/features/artist";
export default function DashboardPage() {
return (
<>
<StatsOverview />
<TopArtistsList />
</>
);
}
// pages/dashboard/index.ts
export { default as DashboardPage } from "./ui/dashboard-page";
// src/routes.ts
import { index, type RouteConfig, route } from "@react-router/dev/routes";
export default [
index("pages/home/ui/home-page.tsx"),
route("dashboard", "pages/dashboard/ui/dashboard-page.tsx"),
] satisfies RouteConfig;
// pages/dashboard/ui/dashboard-page.tsx
import type { Route } from "./+types.dashboard-page";
export async function loader({ request, context }: Route.LoaderArgs) {
// SSR data loading
return { stats: await fetchStats() };
}
export default function DashboardPage({ loaderData }: Route.ComponentProps) {
return <div>{loaderData.stats}</div>;
}
// pages/dashboard/ui/dashboard-page.tsx
import type { Route } from "./+types.dashboard-page";
export function meta({}: Route.MetaArgs) {
return [
{ title: "Dashboard - unwrap.fm" },
{ name: "description", content: "Your music listening analytics" },
];
}
export default function DashboardPage() {
return <div>Dashboard</div>;
}
// src/routes.ts
import { index, type RouteConfig, route } from "@react-router/dev/routes";
export default [
index("pages/home/ui/home-page.tsx"),
route("settings", "pages/settings/ui/settings-page.tsx", [
index("pages/settings-general/ui/settings-general-page.tsx"),
route("profile", "pages/settings-profile/ui/settings-profile-page.tsx"),
]),
] satisfies RouteConfig;
export default (RR7 route module convention)meta() for SEO per routeindex.ts re-exports as named export: export { default as PageName } from "./ui/page-file"