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.8 | Frontend Framework |
| Tailwind CSS | ^4.3.3 | 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 |
Wrapmarket Marketplace license types and their usage limitations:
Use this item in one end product for personal or business projects and client work.
Allows use of this item in an unlimited number of end products and client projects.
Allows the end products to be sold or offered with subscription or paid access.
Each Standard License is valid for a single project only. For more details on WrapMarket license terms, please visit the Official License Page.
Track the continuous evolution, enhancements, and feature updates of Saaslu.
Date:03 Sep 2026
Date:28 July 2026
Date:13 June 2026
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 WrapMarket 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.