CORE CONCEPTS

Layouts

A layout is a component that provides a common structure for multiple pages, such as a header, sidebar, or footer. Instead of repeating these elements in every page, you can define them in a layout and apply it to multiple routes.

Rasengan.js allows you to define layouts using a simple component-based approach.

Defining a Layout

To define a layout, create a React component and use the <Outlet /> component from rasengan. The <Outlet /> component will render the current page based on the active route.

Here is an example of a main layout that applies to all pages:

src/app/app.layout.tsx
tsximport React from "react"; import { LayoutComponent, Outlet } from "rasengan"; const AppLayout: LayoutComponent = () => { return ( <div> <header>My Header</header> <Outlet /> {/* Renders the current page */} <footer>My Footer</footer> </div> ); }; AppLayout.path = "/"; // This layout applies to all pages export default AppLayout;

Applying a Layout

To apply a layout, define it inside a Router. All pages within that router will automatically use the specified layout.

src/app/app.router.ts
tsximport { RouterComponent, defineRouter } from "rasengan"; import Home from "./home.page"; import AppLayout from "./app.layout"; class AppRouter extends RouterComponent {} export default defineRouter({ layout: AppLayout, // Apply the layout here pages: [Home], // Pages using the layout })(AppRouter);

Nested Layouts Example

You can create multiple layouts to structure different sections of your application. Here’s how to define a dedicated Admin layout and apply it to specific pages.

1. Define the Admin Layout

src/app/admin.layout.tsx
tsximport React from "react"; import { LayoutComponent, Outlet } from "rasengan"; const AdminLayout: LayoutComponent = () => { return ( <div> <h1>Admin Section</h1> <Outlet /> {/* Renders admin pages */} </div> ); }; AdminLayout.path = "/admin"; // This layout applies to admin pages export default AdminLayout;

2. Define an Admin Page

src/app/dashboard.page.tsx
tsximport React from "react"; import { PageComponent } from "rasengan"; const Dashboard: PageComponent = () => { return <h2>Admin Dashboard</h2>; }; Dashboard.path = "/dashboard"; // Will be available at /admin/dashboard Dashboard.metadata = { title: "Dashboard", description: "Admin Dashboard", }; export default Dashboard;

3. Create an Admin Router

src/app/admin.router.ts
tsximport { RouterComponent, defineRouter } from "rasengan"; import Dashboard from "./dashboard.page"; import AdminLayout from "./admin.layout"; class AdminRouter extends RouterComponent {} export default defineRouter({ layout: AdminLayout, // Apply the Admin layout pages: [Dashboard], })(AdminRouter);

4. Include the Admin Router in the Main Router

src/app/app.router.ts
tsximport { RouterComponent, defineRouter } from "rasengan"; import Home from "./home.page"; import AppLayout from "./app.layout"; import AdminRouter from "./admin.router"; class AppRouter extends RouterComponent {} export default defineRouter({ imports: [AdminRouter], // Import the Admin router layout: AppLayout, pages: [Home], })(AppRouter);

Now, visiting /admin/dashboard will render the AdminLayout with the Dashboard page inside it.

Summary

  • Layouts provide a shared structure for pages (e.g., headers, sidebars, footers).
  • Use <Outlet /> inside a layout to render the active page.
  • Define the layout in a router, and all pages within that router will use it.
  • Nested layouts allow different sections of the app to have different structures.
Routes
Linking and Navigation

Subscribe to the Newsletter

Stay informed to the news about rasengan.js including new releases, events, etc...

© 2025 Rasengan Labs, All rights reserved.