Welcome to Saaslu - A complete React.js SaaS Admin Dashboard Template documentation
Saaslu is a modern, responsive admin dashboard template built with React 19, Tailwind CSS v4, Vite, shadcn/ui, and Radix UI. This template is specifically designed for SaaS Analytics, Metrics Tracking, Revenue Management, and Business Intelligence.
| Technology | Version | Description |
|---|---|---|
| React | ^19.2.0 | Frontend Framework |
| Tailwind CSS | ^4.1.17 | Utility-First CSS Framework |
| Vite | ^7.2.2 | Lightning Fast Build Tool |
| shadcn/ui | Latest | Beautiful UI Components |
| Radix UI | ^1.1.x - ^2.2.x | Headless Accessible Components |
| React Router DOM | ^7.9.6 | Client-Side Routing |
| ApexCharts | ^5.3.6 | Interactive Charts Library |
| React ApexCharts | ^1.8.0 | React Wrapper for ApexCharts |
| TanStack Table | ^8.21.3 | Headless Data Tables |
| motion | ^12.23.26 | Production-Ready Animations (import from motion/react) |
| FullCalendar | ^6.1.19 | Full-Featured Calendar |
| Lucide React | ^0.554.0 | Beautiful Icon Library |
| next-themes | ^0.4.6 | Theme Management |
| Emoji Picker React | ^4.16.1 | Emoji Picker Component |
| Embla Carousel | ^8.6.0 | Modern Touch Carousel |
| React Day Picker | ^9.11.2 | Date Picker Component |
| Sonner | ^2.0.7 | Toast Notifications |
| Class Variance Authority | ^0.7.1 | Component Variants |
| Date-fns | ^4.1.0 | Date Utility Library |
ThemeForest Marketplace license types and their usage limitations:
se this for a single end product that users are not charged for. You can use this for your personal project or for one client.
Use this for a single end product that users can be charged for (e.g., a SaaS platform or a product for sale). This is required for any commercial project where the end-user pays to use the service.
Each license is valid for a single project only. For more details on Envato license terms, please visit the Official License Page
The project follows React/Vite standards for easy customization.
saaslu/
├── public/
│ ├── documentation/
│ ├── favicon.ico
│ └── vite.svg
├── src/
│ ├── App.jsx
│ ├── index.css
│ ├── main.jsx
│ ├── assets/
│ ├── components/
│ │ └── ui/
│ ├── context/
│ ├── data/
│ ├── hooks/
│ ├── layout/
│ ├── lib/
│ │ └── utils.js
│ ├── pages/
│ │ ├── apps/
│ │ ├── auth/
│ │ ├── charts/
│ │ ├── error/
│ │ ├── forms/
│ │ ├── icons/
│ │ ├── page/
│ │ ├── plans/
│ │ ├── settings/
│ │ ├── support/
│ │ ├── tables/
│ │ ├── ui-element/
│ │ ├── analytics.jsx
│ │ ├── crm.jsx
│ │ ├── dashboard.jsx
│ │ ├── finance.jsx
│ │ └── project-management.jsx
│ └── router/
│ └── routes-path.jsx
├── .gitignore
├── components.json
├── eslint.config.js
├── index.html
├── jsconfig.json
├── package.json
├── vite.config.js
└── README.md
To run the template, you need Node.js (v18+) and npm/yarn installed.
Download the Zip file from ThemeForest and extract it to your local system.
Open terminal and navigate to the project root directory:
cd saaslu
Run this command to install all required libraries:
npm install
# or
yarn install
Run this command to start the project in development mode:
npm run dev
# or
yarn dev
The project will typically start at
http://localhost:5173
To create an optimized build for production, run the following command:
npm run build
# or
yarn build
This command will create a dist/ folder containing all optimized HTML, CSS, and JavaScript files. You can upload the contents of the
dist/ folder to your hosting server.
vercel --prodAll colors in Saaslu are set in the src/index.css file. You can easily change Primary, Secondary, and other colors here.
:root {
/* Change your Primary Color here */
--primary: #6657C3; /* Main Primary Color */
--primary-foreground: oklch(0.984 0.003 247.858);
--primary-50: #f1f0fa;
--primary-100: #dddbf3;
--primary-200: #c0bce9;
--primary-300: #a7a0e1;
--primary-400: #9087d8;
--primary-500: #7a6ece;
--primary-600: #6657c3;
--primary-700: #5240b3;
--primary-800: #392c81;
--primary-900: #1e164b;
--primary-950: #100b2f;
}
After making changes, restart the development server.
The template uses 'Mulish' font, which is imported via Google Fonts in
src/index.css.
src/index.css file and replace the old Font Link with the new one/* src/index.css */
@import url('https://fonts.googleapis.com/css2?family=Your+Font+Name&display=swap');
@theme inline {
--font-mulish: "Your Font Name", sans-serif;
}
Saaslu uses React Context API for global state management. All layout settings are controlled via Context providers located in src/context/.
Purpose: Controls Dark/Light mode theme switching with animations
Location:
src/context/theme-provider.jsx
Features:
// Usage in components
import { useTheme } from '@/context/theme-provider';
const MyComponent = () => {
const { theme, toggleTheme } = useTheme();
return (
<button onClick={() => toggleTheme('circle-center-blur', 'center')}>
Current Theme: {theme}
</button>
);
};
Purpose: Manages sidebar layout variants and mobile menu state
Location:
src/context/sidebar-provider.jsx
Features:
// Usage in components
import { useAppSidebar } from '@/context/sidebar-provider';
const Header = () => {
const { sidebarVariant, mobileMenuOpen, toggleMobileMenu } = useAppSidebar();
return (
<button onClick={toggleMobileMenu}>
{mobileMenuOpen ? 'Close' : 'Open'} Menu
</button>
);
};
Purpose: Controls global app settings and customization options
Location:
src/context/settings-provider.jsx
Features:
// Usage in components
import { useSettings } from '@/context/settings-provider';
const Customizer = () => {
const { settings, updateSetting } = useSettings();
return (
<select onChange={(e) => updateSetting('primaryColor', e.target.value)}>
<option value="#6657C3">Purple</option>
<option value="#3B82F6">Blue</option>
</select>
);
};
Purpose: Enables Right-to-Left (RTL) language support
Location:
src/context/RTLContext.jsx
Features:
// Usage in components
import { useRTL } from '../context/RTLContext';
const LanguageSwitch = () => {
const { isRTL, toggleRTL } = useRTL();
return (
<button onClick={toggleRTL}>
Direction: {isRTL ? 'RTL' : 'LTR'}
</button>
);
};
Purpose: Enables Right-to-Left (RTL) language support
Location:
src/context/rtl-provider.jsx
Features:
// Usage in components
import { useRTL } from '@/context/rtl-provider';
const LanguageSwitch = () => {
const { isRTL, toggleRTL } = useRTL();
return (
<button onClick={toggleRTL}>
Direction: {isRTL ? 'RTL' : 'LTR'}
</button>
);
};
Purpose: Manages multi-language support and sidebar data
Location:
src/context/language-provider.jsx
Features:
// Usage in components
import { useLanguage } from '@/context/language-provider';
const LanguageSelector = () => {
const { currentLanguage, changeLanguage, getSidebarData } = useLanguage();
return (
<select onChange={(e) => changeLanguage(e.target.value)}>
<option value="english">English</option>
<option value="french">Français</option>
</select>
);
};
All context providers are wrapped in src/App.jsx. To modify default settings, edit the respective context file and change the initial state values.
Saaslu includes pre-built layout components that structure your application. All layout files are located in src/layout/.
| Component | File | Description |
|---|---|---|
| Layout | layout.jsx |
Main layout wrapper with vertical/horizontal sidebar support |
| Header | header.jsx |
Top navigation with search, notifications, messages, and user menu |
| LeftSidebar | left-sidebar.jsx |
Collapsible sidebar with menu items from language data |
| HorizontalSidebar | horizontal-sidebar.jsx |
Horizontal navigation bar for horizontal layout |
| Footer | footer.jsx |
Footer component with copyright and developer credits |
| SettingsSheet | settings-sheet.jsx |
Slide-out panel for theme and layout customization |
Note: Icons use Lucide React library. Menu items are dynamically loaded from language JSON files in src/data/languages/.
Saaslu uses React Router DOM. To add a new route, you need to make changes in two places:
Create your new component in the src/pages/ folder:
// src/pages/reports/NewReport.jsx
import React from 'react';
const NewReport = () => {
return (
<div>
<h1>New Report Page</h1>
<p>Your content here</p>
</div>
);
};
export default NewReport;
Open src/router/routes-path.jsx file and add your new route:
import NewReport from '../pages/reports/NewReport';
// Inside your Routes component
<Route path="/new-report" element={<NewReport />} />
If you want your new page to appear in the sidebar menu, add it to the
appropriate section (e.g. dashboards, apps, or pages) inside
src/data/languages/english.json:
{
"id": "new-report",
"label": "New Report",
"icon": "FileText",
"path": "/new-report"
}
All small, reusable Components are available in the
src/components/ui/ folder. Built with shadcn/ui and Radix UI.
import { Button } from '@/components/ui/button';
import { Dialog } from '@/components/ui/dialog';
import { Card } from '@/components/ui/card';
function MyPage() {
return (
<Card>
<h2>My Page</h2>
<Button variant="default" size="lg">
Click Me
</Button>
</Card>
);
}
All components are built with shadcn/ui and Radix UI, located in src/components/ui/ and can be easily imported and customized with Tailwind CSS.
Saaslu uses ApexCharts for data visualization.
import ReactApexChart from 'react-apexcharts';
const series = [{
name: "Revenue",
data: [100, 40, 28, 51, 42, 109, 100] // Change this data
}];
const options = {
chart: {
type: 'line',
toolbar: { show: false }
},
colors: ['#6657C3'],
stroke: { curve: 'smooth', width: 3 },
xaxis: {
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul']
},
theme: {
mode: 'dark' // or 'light'
}
};
<ReactApexChart
options={options}
series={series}
type="line"
height={350}
/>
Data Source: Most chart data is set in the
src/data/ folder or directly in the Component file. You need to update the series and options props of the chart.
Note: All charts automatically adapt to dark/light theme changes and use your primary color (#6657C3) by default.
TanStack Table is used for data tables throughout the application, which is very powerful and highly customizable for SaaS dashboards.
import { useReactTable, getCoreRowModel, flexRender } from '@tanstack/react-table';
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table';
// Sample data
const data = [
{ id: 1, name: 'John Doe', email: '[email protected]', plan: 'Pro', status: 'Active' },
{ id: 2, name: 'Jane Smith', email: '[email protected]', plan: 'Basic', status: 'Active' },
{ id: 3, name: 'Bob Johnson', email: '[email protected]', plan: 'Enterprise', status: 'Inactive' }
];
// Define columns
const columns = [
{ accessorKey: 'id', header: 'ID' },
{ accessorKey: 'name', header: 'User Name' },
{ accessorKey: 'email', header: 'Email' },
{ accessorKey: 'plan', header: 'Subscription Plan' },
{ accessorKey: 'status', header: 'Status' }
];
// Initialize table
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel()
});
// Render table
<Table>
<TableHeader>
{table.getHeaderGroups().map(headerGroup => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map(header => (
<TableHead key={header.id}>
{flexRender(header.column.columnDef.header, header.getContext())}
</TableHead>
))}
</TableRow>
))}
</TableHeader>
<TableBody>
{table.getRowModel().rows.map(row => (
<TableRow key={row.id}>
{row.getVisibleCells().map(cell => (
<TableCell key={cell.id}>
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</TableCell>
))}
</TableRow>
))}
</TableBody>
</Table>
Data Source: Table data is typically imported from JSON files in the src/data/ folder. Changing data in these files will update the Table.
Columns: Table Columns are set in the Component file. You can Add/Remove new Columns from here.
Note: The Table component includes SimpleBar for custom scrolling and is fully styled with Tailwind CSS classes for responsive design.
public/ folder path is correct. Also ensure all
dependencies are installed with npm install. Check that
image paths start with / for public folder assets.
src/assets/ folder and update the path in src/layout/left-sidebar.jsx and src/layout/header.jsx. Make sure to use the same file format or update the import statement.src/layout/header.jsx. To set a default theme, modify the initial state in src/context/theme-provider.jsx.
node_modules folder
and package-lock.json, then run
npm install again.npm cache clean --forcesrc/pages/src/router/routes-path.jsxsrc/data/languages/english.json with id, label, icon, and path
fetch or axios for API calls. Create
an API service file in src/services/ to centralize your
API calls. Use React hooks like useEffect to fetch data
on component mount. Consider using React Query or SWR for better
data fetching and caching.
src/index.css and modify the
--primary variable in the :root section.
Change --primary: #6657C3; for the main primary color.
The dev server will auto-reload with your changes.
useState.
Update the state with new data from API calls or user interactions.
The chart will automatically re-render with the new data. See the
Charts section for code examples.
List of all External Resources used in this template:
| Resource | Description | Link |
|---|---|---|
| React.js | Frontend Framework | react.dev |
| Tailwind CSS | Styling Framework | tailwindcss.com |
| Vite | Build Tool | vitejs.dev |
| shadcn/ui | UI Components | ui.shadcn.com |
| Radix UI | Headless UI Components | radix-ui.com |
| ApexCharts | Charts Library | apexcharts.com |
| TanStack Table | Data Tables | tanstack.com/table |
| Lucide React | Icon Library | lucide.dev |
| FullCalendar | Calendar Component | fullcalendar.io |
| motion | Animation Library (motion/react) |
motion.dev |
| next-themes | Theme Management | next-themes |
| Unsplash | Images (Demo Purpose) | unsplash.com |
| Freepik | Graphics (Demo Purpose) | freepik.com |
Important: All Images are for Demo Purpose only. You must use your own images in Production.
We provide Dedicated Support for 6 months from the date of purchase.
Date:13 June 2026