@ttoss/layouts
Professional layout components for React applications with responsive design and accessibility built-in.
Installation
pnpm add @ttoss/layouts @ttoss/ui @emotion/react
Available Layouts
StackedLayout - Simple Vertical Layout
Perfect for traditional websites with header, main content, and footer.
import { Layout, StackedLayout } from '@ttoss/layouts';
const App = () => (
<StackedLayout>
<Layout.Header>Navigation & Branding</Layout.Header>
<Layout.Main>Page Content</Layout.Main>
<Layout.Footer>Copyright & Links</Layout.Footer>
</StackedLayout>
);
SidebarCollapseLayout - Dashboard & Admin Interfaces
Responsive sidebar that collapses on mobile, perfect for dashboards and admin panels.
import { Layout, SidebarCollapseLayout } from '@ttoss/layouts';
const Dashboard = () => (
<SidebarCollapseLayout>
<Layout.Header showSidebarButton>App Header with Menu Toggle</Layout.Header>
<Layout.Sidebar>Navigation Menu</Layout.Sidebar>
<Layout.Main>
<Layout.Main.Header>Page Title & Actions</Layout.Main.Header>
<Layout.Main.Body>Dashboard Content</Layout.Main.Body>
<Layout.Main.Footer>Status Bar</Layout.Main.Footer>
</Layout.Main>
</SidebarCollapseLayout>
);
Core Components
Layout.Main Sub-Components
The Main component provides a structured content area with three distinct sections:
<Layout.Main>
<Layout.Main.Header>
<h1>Page Title</h1>
<button>Action Button</button>
</Layout.Main.Header>
<Layout.Main.Body>
Main content with consistent padding and scroll handling
</Layout.Main.Body>
<Layout.Main.Footer>
<span>Last updated: Today</span>
</Layout.Main.Footer>
</Layout.Main>
Key Features:
- Main.Header: Page-level header with title and actions
- Main.Body: Scrollable content area with auto overflow handling
- Main.Footer: Status bar or secondary actions
Benefits of This Structure:
- Clear Content Hierarchy: Separates page header, content, and footer concerns
- Automatic Scroll Management: Body handles overflow while keeping header/footer fixed
- Consistent Spacing: Each section has optimized padding and layout
- Accessibility: Proper semantic HTML elements (
<header>,<main>,<footer>)
Automatic Layout Composition
Key Concept: Layout components automatically detect and organize their child components by displayName, even when components are distributed across different files or routing structures.
React Router Integration
Perfect for apps where layout components come from different routes:
// App.tsx - Layout wrapper
import { Layout, SidebarCollapseLayout } from '@ttoss/layouts';
import { Outlet } from 'react-router-dom';
const AppLayout = () => (
<SidebarCollapseLayout>
<AppHeader />
<AppSidebar />
<Outlet /> {/* Routes render here */}
</SidebarCollapseLayout>
);
// pages/Dashboard.tsx - Page-specific components
const Dashboard = () => (
<Layout.Main>
<Layout.Main.Header>
<h1>Dashboard</h1>
</Layout.Main.Header>
<Layout.Main.Body>
<DashboardCharts />
</Layout.Main.Body>
<Layout.Main.Footer>Last updated: {lastUpdate}</Layout.Main.Footer>
</Layout.Main>
);
The layout automatically composes itself by finding components with matching displayName properties, regardless of component hierarchy or file structure.
Component Detection System
// These components can be anywhere in your component tree:
<Layout.Header /> // → Detected as "Header"
<Layout.Sidebar /> // → Detected as "Sidebar"
<Layout.Main /> // → Detected as "Main"
<Layout.Footer /> // → Detected as "Footer"
// Main sub-components are contained within Main:
<Layout.Main>
<Layout.Main.Header /> // → Detected as "MainHeader"
<Layout.Main.Body /> // → Detected as "MainBody"
<Layout.Main.Footer /> // → Detected as "MainFooter"
</Layout.Main>
Component Properties
Responsive Behavior
- Desktop: Sidebar remains visible, toggleable via button
- Mobile: Sidebar becomes slide-out drawer, auto-closes on navigation
- Accessible: Full keyboard navigation and screen reader support
Styling Integration
All components integrate seamlessly with @ttoss/ui theme system via sx prop:
<Layout.Main>
<Layout.Main.Header
sx={{
backgroundColor: 'brand.primary',
borderBottom: '2px solid',
}}
>
Custom styled header
</Layout.Main.Header>
<Layout.Main.Body>Content</Layout.Main.Body>
</Layout.Main>
Advanced Usage
Custom Components with displayName
Create reusable layout components by preserving the required displayName:
const AppHeader = ({ children, ...props }) => (
<Layout.Header {...props}>
<Logo />
{children}
<UserMenu />
</Layout.Header>
);
AppHeader.displayName = Layout.Header.displayName; // Required for layout detection
Sidebar with Logo Slot
Add branding or controls to the sidebar area:
<Layout.Header sidebarSlot={<CompanyLogo />} showSidebarButton>
Main header content
</Layout.Header>
Examples
View complete examples in Storybook.