├── src
├── index.css
├── vite-env.d.ts
├── dashboard
│ ├── Title.tsx.preview
│ ├── theme
│ │ └── customizations
│ │ │ ├── index.ts
│ │ │ ├── treeView.ts
│ │ │ └── charts.ts
│ ├── README.md
│ ├── components
│ │ ├── MenuButton.jsx
│ │ ├── MenuButton.tsx
│ │ ├── Search.jsx
│ │ ├── Search.tsx
│ │ ├── CardAlert.jsx
│ │ ├── CardAlert.tsx
│ │ ├── NavbarBreadcrumbs.jsx
│ │ ├── NavbarBreadcrumbs.tsx
│ │ ├── Header.jsx
│ │ ├── Header.tsx
│ │ ├── CustomizedDataGrid.jsx
│ │ ├── CustomizedDataGrid.tsx
│ │ ├── HighlightedCard.jsx
│ │ ├── HighlightedCard.tsx
│ │ ├── CustomDatePicker.jsx
│ │ ├── CustomDatePicker.tsx
│ │ ├── MenuContent.jsx
│ │ ├── MenuContent.tsx
│ │ ├── SideMenuMobile.tsx
│ │ ├── SideMenuMobile.jsx
│ │ ├── SideMenu.jsx
│ │ ├── SideMenu.tsx
│ │ ├── OptionsMenu.jsx
│ │ ├── OptionsMenu.tsx
│ │ ├── PageViewsBarChart.tsx
│ │ ├── PageViewsBarChart.jsx
│ │ ├── MainGrid.jsx
│ │ ├── MainGrid.tsx
│ │ ├── AppNavbar.jsx
│ │ ├── AppNavbar.tsx
│ │ ├── SelectContent.jsx
│ │ ├── SelectContent.tsx
│ │ ├── StatCard.tsx
│ │ └── StatCard.jsx
│ ├── internals
│ │ └── components
│ │ │ ├── Copyright.jsx
│ │ │ └── Copyright.tsx
│ └── Dashboard.tsx
├── main.tsx
├── checkout
│ ├── README.md
│ └── components
│ │ ├── Info.tsx
│ │ ├── InfoMobile.tsx
│ │ ├── Info.jsx
│ │ ├── InfoMobile.jsx
│ │ ├── Review.jsx
│ │ ├── Review.tsx
│ │ ├── AddressForm.jsx
│ │ └── AddressForm.tsx
├── blog
│ ├── README.md
│ └── Blog.tsx
├── sign-in
│ ├── README.md
│ └── components
│ │ ├── ForgotPassword.tsx
│ │ └── ForgotPassword.jsx
├── sign-up
│ └── README.md
├── crm
│ ├── pages
│ │ ├── Deals.tsx
│ │ ├── Tasks.tsx
│ │ ├── Customers.tsx
│ │ ├── Reports.tsx
│ │ ├── Contacts.tsx
│ │ └── Settings.tsx
│ ├── components
│ │ ├── CrmHeader.tsx
│ │ ├── CrmSelectCompany.tsx
│ │ ├── CrmNavbarBreadcrumbs.tsx
│ │ ├── CrmSearch.tsx
│ │ ├── CrmLeadsBySourceChart.tsx
│ │ ├── CrmOptionsMenu.tsx
│ │ ├── CrmSideMenu.tsx
│ │ ├── CrmCustomerDistributionMap.tsx
│ │ ├── CrmDateRangePicker.tsx
│ │ ├── CrmAppNavbar.tsx
│ │ ├── CrmMenuContent.tsx
│ │ ├── CrmActivitiesTimeline.tsx
│ │ ├── CrmMainDashboard.tsx
│ │ └── CrmSideMenuMobile.tsx
│ └── CrmDashboard.tsx
├── sign-in-side
│ ├── README.md
│ ├── components
│ │ ├── ForgotPassword.tsx
│ │ ├── ForgotPassword.jsx
│ │ ├── Content.jsx
│ │ └── Content.tsx
│ └── SignInSide.tsx
├── marketing-page
│ ├── README.md
│ ├── MarketingPage.tsx
│ └── components
│ │ ├── LogoCollection.jsx
│ │ ├── LogoCollection.tsx
│ │ ├── Highlights.jsx
│ │ └── Highlights.tsx
├── shared-theme
│ ├── ColorModeSelect.tsx
│ ├── customizations
│ │ ├── feedback.tsx
│ │ └── surfaces.ts
│ ├── AppTheme.tsx
│ └── ColorModeIconDropdown.tsx
├── ProTip.tsx
├── App.tsx
├── PopOverMenu.tsx
└── assets
│ └── react.svg
├── tsconfig.json
├── vite.config.ts
├── .gitignore
├── tsconfig.node.json
├── tsconfig.app.json
├── index.html
├── README.md
├── package.json
└── public
└── vite.svg
/src/index.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/src/dashboard/Title.tsx.preview:
--------------------------------------------------------------------------------
1 |
2 | {props.children}
3 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | { "path": "./tsconfig.app.json" },
5 | { "path": "./tsconfig.node.json" }
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/src/dashboard/theme/customizations/index.ts:
--------------------------------------------------------------------------------
1 | export { chartsCustomizations } from "./charts";
2 | export { dataGridCustomizations } from "./dataGrid";
3 | export { datePickersCustomizations } from "./datePickers";
4 | export { treeViewCustomizations } from "./treeView";
5 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import react from "@vitejs/plugin-react";
3 | import tailwindcss from "@tailwindcss/vite";
4 |
5 | // https://vite.dev/config/
6 | export default defineConfig({
7 | plugins: [react(), tailwindcss()],
8 | });
9 |
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import * as ReactDOM from "react-dom/client";
3 | import "./index.css";
4 | import App from "./App.tsx";
5 |
6 | ReactDOM.createRoot(document.getElementById("root")!).render(
7 |
8 |
9 | ,
10 | );
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/src/checkout/README.md:
--------------------------------------------------------------------------------
1 | # Checkout template
2 |
3 | ## Usage
4 |
5 |
6 |
7 | 1. Copy these folders (`checkout` and `shared-theme`) into your project, or one of the [example projects](https://github.com/mui/material-ui/tree/master/examples).
8 | 2. Make sure your project has the required dependencies: @mui/material, @emotion/styled, @emotion/react.
9 | 3. Import and use the `Checkout` component.
10 |
11 | ## Demo
12 |
13 |
14 |
15 | View the demo at https://mui.com/material-ui/getting-started/templates/checkout/.
16 |
--------------------------------------------------------------------------------
/src/blog/README.md:
--------------------------------------------------------------------------------
1 | # Blog template
2 |
3 | ## Usage
4 |
5 |
6 |
7 | 1. Copy these folders (`blog` and `shared-theme`) into your project, or one of the [example projects](https://github.com/mui/material-ui/tree/master/examples).
8 | 2. Make sure your project has the required dependencies: @mui/material, @mui/icons-material, @emotion/styled, @emotion/react, markdown-to-jsx.
9 | 3. Import and use the `Blog` component.
10 |
11 | ## Demo
12 |
13 |
14 |
15 | View the demo at https://mui.com/material-ui/getting-started/templates/blog/.
16 |
--------------------------------------------------------------------------------
/src/sign-in/README.md:
--------------------------------------------------------------------------------
1 | # Sign-in template
2 |
3 | ## Usage
4 |
5 |
6 |
7 | 1. Copy these folders (`sign-in` and `shared-theme`) into your project, or one of the [example projects](https://github.com/mui/material-ui/tree/master/examples).
8 | 2. Make sure your project has the required dependencies: @mui/material, @mui/icons-material, @emotion/styled, @emotion/react.
9 | 3. Import and use the `SignIn` component.
10 |
11 | ## Demo
12 |
13 |
14 |
15 | View the demo at https://mui.com/material-ui/getting-started/templates/sign-in/.
16 |
--------------------------------------------------------------------------------
/src/sign-up/README.md:
--------------------------------------------------------------------------------
1 | # Sign-up template
2 |
3 | ## Usage
4 |
5 |
6 |
7 | 1. Copy these folders (`sign-up` and `shared-theme`) into your project, or one of the [example projects](https://github.com/mui/material-ui/tree/master/examples).
8 | 2. Make sure your project has the required dependencies: @mui/material, @mui/icons-material, @emotion/styled, @emotion/react.
9 | 3. Import and use the `SignUp` component.
10 |
11 | ## Demo
12 |
13 |
14 |
15 | View the demo at https://mui.com/material-ui/getting-started/templates/sign-up/.
16 |
--------------------------------------------------------------------------------
/src/crm/pages/Deals.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Typography from "@mui/material/Typography";
4 |
5 | export default function Deals() {
6 | return (
7 |
8 |
9 | Deals Page
10 |
11 |
12 | This is the deals management page where you can track and manage your
13 | sales pipeline.
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/src/crm/pages/Tasks.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Typography from "@mui/material/Typography";
4 |
5 | export default function Tasks() {
6 | return (
7 |
8 |
9 | Tasks Page
10 |
11 |
12 | This is the tasks management page where you can track all your
13 | activities and follow-ups.
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/src/crm/pages/Customers.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Typography from "@mui/material/Typography";
4 |
5 | export default function Customers() {
6 | return (
7 |
8 |
9 | Customers Page
10 |
11 |
12 | This is the customers management page where you can view and manage your
13 | customer data.
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/src/crm/pages/Reports.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Typography from "@mui/material/Typography";
4 |
5 | export default function Reports() {
6 | return (
7 |
8 |
9 | Reports Page
10 |
11 |
12 | This is the reports page where you can access and generate various
13 | analytics and insights.
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/src/crm/pages/Contacts.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Typography from "@mui/material/Typography";
4 |
5 | export default function Contacts() {
6 | return (
7 |
8 |
9 | Contacts Page
10 |
11 |
12 | This is the contacts management page where you can organize and manage
13 | your business contacts.
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/src/crm/pages/Settings.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Typography from "@mui/material/Typography";
4 |
5 | export default function Settings() {
6 | return (
7 |
8 |
9 | Settings Page
10 |
11 |
12 | This is the settings page where you can configure your CRM preferences
13 | and manage your account.
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/src/sign-in-side/README.md:
--------------------------------------------------------------------------------
1 | # Sign-in side template
2 |
3 | ## Usage
4 |
5 |
6 |
7 | 1. Copy these folders (`sign-in-side` and `shared-theme`) into your project, or one of the [example projects](https://github.com/mui/material-ui/tree/master/examples).
8 | 2. Make sure your project has the required dependencies: @mui/material, @mui/icons-material, @emotion/styled, @emotion/react.
9 | 3. Import and use the `SignInSide` component.
10 |
11 | ## Demo
12 |
13 |
14 |
15 | View the demo at https://mui.com/material-ui/getting-started/templates/sign-in-side/.
16 |
--------------------------------------------------------------------------------
/src/marketing-page/README.md:
--------------------------------------------------------------------------------
1 | # Marketing page template
2 |
3 | ## Usage
4 |
5 |
6 |
7 | 1. Copy these folders (`marketing-page` and `shared-theme`) into your project, or one of the [example projects](https://github.com/mui/material-ui/tree/master/examples).
8 | 2. Make sure your project has the required dependencies: @mui/material, @mui/icons-material, @emotion/styled, @emotion/react.
9 | 3. Import and use the `MarketingPage` component.
10 |
11 | ## Demo
12 |
13 |
14 |
15 | View the demo at https://mui.com/material-ui/getting-started/templates/marketing-page/.
16 |
--------------------------------------------------------------------------------
/src/dashboard/README.md:
--------------------------------------------------------------------------------
1 | # Dashboard template
2 |
3 | ## Usage
4 |
5 |
6 |
7 | 1. Copy these folders (`dashboard` and `shared-theme`) into your project, or one of the [example projects](https://github.com/mui/material-ui/tree/master/examples).
8 | 2. Make sure your project has the required dependencies: @mui/material, @mui/icons-material, @emotion/styled, @emotion/react, @mui/x-charts, @mui/x-date-pickers, @mui/x-data-grid, @mui/x-tree-view, dayjs
9 | 3. Import and use the `Dashboard` component.
10 |
11 | ## Demo
12 |
13 |
14 |
15 | View the demo at https://mui.com/material-ui/getting-started/templates/dashboard/.
16 |
--------------------------------------------------------------------------------
/src/dashboard/components/MenuButton.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import PropTypes from "prop-types";
3 | import Badge, { badgeClasses } from "@mui/material/Badge";
4 | import IconButton from "@mui/material/IconButton";
5 |
6 | function MenuButton({ showBadge = false, ...props }) {
7 | return (
8 |
14 |
15 |
16 | );
17 | }
18 |
19 | MenuButton.propTypes = {
20 | showBadge: PropTypes.bool,
21 | };
22 |
23 | export default MenuButton;
24 |
--------------------------------------------------------------------------------
/src/dashboard/components/MenuButton.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Badge, { badgeClasses } from "@mui/material/Badge";
3 | import IconButton, { IconButtonProps } from "@mui/material/IconButton";
4 |
5 | export interface MenuButtonProps extends IconButtonProps {
6 | showBadge?: boolean;
7 | }
8 |
9 | export default function MenuButton({
10 | showBadge = false,
11 | ...props
12 | }: MenuButtonProps) {
13 | return (
14 |
20 |
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4 | "target": "ES2022",
5 | "lib": ["ES2023"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "isolatedModules": true,
13 | "moduleDetection": "force",
14 | "noEmit": true,
15 |
16 | /* Linting */
17 | "strict": true,
18 | "noUnusedLocals": true,
19 | "noUnusedParameters": true,
20 | "noFallthroughCasesInSwitch": true,
21 | "noUncheckedSideEffectImports": true
22 | },
23 | "include": ["vite.config.ts"]
24 | }
25 |
--------------------------------------------------------------------------------
/src/dashboard/internals/components/Copyright.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Link from "@mui/material/Link";
3 | import Typography from "@mui/material/Typography";
4 |
5 | export default function Copyright(props) {
6 | return (
7 |
18 | {"Copyright © "}
19 |
20 | Sitemark
21 | {" "}
22 | {new Date().getFullYear()}
23 | {"."}
24 |
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/src/dashboard/internals/components/Copyright.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Link from "@mui/material/Link";
3 | import Typography from "@mui/material/Typography";
4 |
5 | export default function Copyright(props: any) {
6 | return (
7 |
18 | {"Copyright © "}
19 |
20 | Sitemark
21 | {" "}
22 | {new Date().getFullYear()}
23 | {"."}
24 |
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4 | "target": "ES2020",
5 | "useDefineForClassFields": true,
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "module": "ESNext",
8 | "skipLibCheck": true,
9 |
10 | /* Bundler mode */
11 | "moduleResolution": "bundler",
12 | "allowImportingTsExtensions": true,
13 | "isolatedModules": true,
14 | "moduleDetection": "force",
15 | "noEmit": true,
16 | "jsx": "react-jsx",
17 |
18 | /* Linting */
19 | "strict": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "noFallthroughCasesInSwitch": true,
23 | "noUncheckedSideEffectImports": true
24 | },
25 | "include": ["src"]
26 | }
27 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + Material UI + TS + Tailwind CSS
8 |
9 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/blog/Blog.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import CssBaseline from "@mui/material/CssBaseline";
3 | import Container from "@mui/material/Container";
4 | import AppTheme from "../shared-theme/AppTheme";
5 | import AppAppBar from "./components/AppAppBar";
6 | import MainContent from "./components/MainContent";
7 | import Latest from "./components/Latest";
8 | import Footer from "./components/Footer";
9 |
10 | export default function Blog(props: { disableCustomTheme?: boolean }) {
11 | return (
12 |
13 |
14 |
15 |
16 |
21 |
22 |
23 |
24 |
25 |
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/src/shared-theme/ColorModeSelect.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { useColorScheme } from "@mui/material/styles";
3 | import MenuItem from "@mui/material/MenuItem";
4 | import Select, { SelectProps } from "@mui/material/Select";
5 |
6 | export default function ColorModeSelect(props: SelectProps) {
7 | const { mode, setMode } = useColorScheme();
8 | if (!mode) {
9 | return null;
10 | }
11 | return (
12 |
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/src/dashboard/components/Search.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import FormControl from "@mui/material/FormControl";
3 | import InputAdornment from "@mui/material/InputAdornment";
4 | import OutlinedInput from "@mui/material/OutlinedInput";
5 | import SearchRoundedIcon from "@mui/icons-material/SearchRounded";
6 |
7 | export default function Search() {
8 | return (
9 |
10 |
17 |
18 |
19 | }
20 | inputProps={{
21 | "aria-label": "search",
22 | }}
23 | />
24 |
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/src/dashboard/components/Search.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import FormControl from "@mui/material/FormControl";
3 | import InputAdornment from "@mui/material/InputAdornment";
4 | import OutlinedInput from "@mui/material/OutlinedInput";
5 | import SearchRoundedIcon from "@mui/icons-material/SearchRounded";
6 |
7 | export default function Search() {
8 | return (
9 |
10 |
17 |
18 |
19 | }
20 | inputProps={{
21 | "aria-label": "search",
22 | }}
23 | />
24 |
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/src/dashboard/components/CardAlert.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Card from "@mui/material/Card";
3 | import CardContent from "@mui/material/CardContent";
4 | import Button from "@mui/material/Button";
5 | import Typography from "@mui/material/Typography";
6 | import AutoAwesomeRoundedIcon from "@mui/icons-material/AutoAwesomeRounded";
7 |
8 | export default function CardAlert() {
9 | return (
10 |
11 |
12 |
13 |
14 | Plan about to expire
15 |
16 |
17 | Enjoy 10% off when renewing your plan today.
18 |
19 |
22 |
23 |
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/src/dashboard/components/CardAlert.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Card from "@mui/material/Card";
3 | import CardContent from "@mui/material/CardContent";
4 | import Button from "@mui/material/Button";
5 | import Typography from "@mui/material/Typography";
6 | import AutoAwesomeRoundedIcon from "@mui/icons-material/AutoAwesomeRounded";
7 |
8 | export default function CardAlert() {
9 | return (
10 |
11 |
12 |
13 |
14 | Plan about to expire
15 |
16 |
17 | Enjoy 10% off when renewing your plan today.
18 |
19 |
22 |
23 |
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Material UI - Vite example with Tailwind CSS in TypeScript
2 |
3 | ## How to use
4 |
5 | Download the example [or clone the repo](https://github.com/steve8708/mui-vite):
6 |
7 |
8 |
9 | ```bash
10 | git clone https://github.com/steve8708/mui-vite.git
11 | cd mui-vite
12 | ```
13 |
14 | Install it and run:
15 |
16 | ```bash
17 | npm install
18 | npm run dev
19 | ```
20 |
21 | This example demonstrates how you can use [Tailwind CSS](https://tailwindcss.com/) and [Vite](https://github.com/vitejs/vite) together with Material UI.
22 | It includes `@mui/material` and its peer dependencies, including [Emotion](https://emotion.sh/docs/introduction), the default style engine in Material UI, as well as several examples of using MUI components.
23 |
24 | ## What's next?
25 |
26 |
27 |
28 | You now have a working example project.
29 | You can head back to the documentation and continue by browsing the [templates](https://mui.com/material-ui/getting-started/templates/) section.
30 |
--------------------------------------------------------------------------------
/src/ProTip.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Link from "@mui/material/Link";
3 | import Typography from "@mui/material/Typography";
4 | import SvgIcon, { SvgIconProps } from "@mui/material/SvgIcon";
5 |
6 | function LightBulbIcon(props: SvgIconProps) {
7 | return (
8 |
9 |
10 |
11 | );
12 | }
13 |
14 | export default function ProTip() {
15 | return (
16 |
17 |
18 | {"Pro tip: See more "}
19 |
20 | templates
21 |
22 | {" in the Material UI documentation."}
23 |
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "material-ui-vite-ts",
3 | "private": true,
4 | "version": "7.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc -b && vite build",
9 | "lint": "eslint .",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@emotion/react": "^11.14.0",
14 | "@emotion/styled": "^11.14.0",
15 | "@mui/icons-material": "^7.1.0",
16 | "@mui/material": "^7.1.0",
17 | "@mui/x-charts": "^8.3.1",
18 | "@mui/x-data-grid": "^8.3.1",
19 | "@mui/x-data-grid-pro": "^8.3.1",
20 | "@mui/x-date-pickers": "^8.3.1",
21 | "@mui/x-tree-view": "^8.3.1",
22 | "@react-spring/web": "^10.0.0",
23 | "@tailwindcss/vite": "latest",
24 | "dayjs": "^1.11.13",
25 | "react": "latest",
26 | "react-dom": "latest",
27 | "react-router-dom": "^7.6.0",
28 | "tailwindcss": "latest"
29 | },
30 | "devDependencies": {
31 | "@types/react": "latest",
32 | "@types/react-dom": "latest",
33 | "@vitejs/plugin-react": "latest",
34 | "prettier": "3.5.3",
35 | "typescript": "latest",
36 | "vite": "latest"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/dashboard/components/NavbarBreadcrumbs.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import Typography from "@mui/material/Typography";
4 | import Breadcrumbs, { breadcrumbsClasses } from "@mui/material/Breadcrumbs";
5 | import NavigateNextRoundedIcon from "@mui/icons-material/NavigateNextRounded";
6 |
7 | const StyledBreadcrumbs = styled(Breadcrumbs)(({ theme }) => ({
8 | margin: theme.spacing(1, 0),
9 | [`& .${breadcrumbsClasses.separator}`]: {
10 | color: (theme.vars || theme).palette.action.disabled,
11 | margin: 1,
12 | },
13 | [`& .${breadcrumbsClasses.ol}`]: {
14 | alignItems: "center",
15 | },
16 | }));
17 |
18 | export default function NavbarBreadcrumbs() {
19 | return (
20 | }
23 | >
24 | Dashboard
25 |
29 | Home
30 |
31 |
32 | );
33 | }
34 |
--------------------------------------------------------------------------------
/src/dashboard/components/NavbarBreadcrumbs.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import Typography from "@mui/material/Typography";
4 | import Breadcrumbs, { breadcrumbsClasses } from "@mui/material/Breadcrumbs";
5 | import NavigateNextRoundedIcon from "@mui/icons-material/NavigateNextRounded";
6 |
7 | const StyledBreadcrumbs = styled(Breadcrumbs)(({ theme }) => ({
8 | margin: theme.spacing(1, 0),
9 | [`& .${breadcrumbsClasses.separator}`]: {
10 | color: (theme.vars || theme).palette.action.disabled,
11 | margin: 1,
12 | },
13 | [`& .${breadcrumbsClasses.ol}`]: {
14 | alignItems: "center",
15 | },
16 | }));
17 |
18 | export default function NavbarBreadcrumbs() {
19 | return (
20 | }
23 | >
24 | Dashboard
25 |
29 | Home
30 |
31 |
32 | );
33 | }
34 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { BrowserRouter, Routes, Route } from "react-router-dom";
3 | import CssBaseline from "@mui/material/CssBaseline";
4 | import Typography from "@mui/material/Typography";
5 | import Box from "@mui/material/Box";
6 | import CrmDashboard from "./crm/CrmDashboard";
7 | // change just for testing diff
8 |
9 | function NotFound() {
10 | return (
11 |
20 |
21 | 404: Page Not Found
22 |
23 |
24 | The page you're looking for doesn't exist or has been moved.
25 |
26 |
27 | );
28 | }
29 |
30 | export default function App() {
31 | return (
32 |
33 |
34 |
35 | } />
36 | } />
37 |
38 |
39 | );
40 | }
41 |
--------------------------------------------------------------------------------
/src/dashboard/components/Header.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Stack from "@mui/material/Stack";
3 | import NotificationsRoundedIcon from "@mui/icons-material/NotificationsRounded";
4 | import CustomDatePicker from "./CustomDatePicker";
5 | import NavbarBreadcrumbs from "./NavbarBreadcrumbs";
6 | import MenuButton from "./MenuButton";
7 | import ColorModeIconDropdown from "../../shared-theme/ColorModeIconDropdown";
8 |
9 | import Search from "./Search";
10 |
11 | export default function Header() {
12 | return (
13 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | );
36 | }
37 |
--------------------------------------------------------------------------------
/src/dashboard/components/Header.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Stack from "@mui/material/Stack";
3 | import NotificationsRoundedIcon from "@mui/icons-material/NotificationsRounded";
4 | import CustomDatePicker from "./CustomDatePicker";
5 | import NavbarBreadcrumbs from "./NavbarBreadcrumbs";
6 | import MenuButton from "./MenuButton";
7 | import ColorModeIconDropdown from "../../shared-theme/ColorModeIconDropdown";
8 |
9 | import Search from "./Search";
10 |
11 | export default function Header() {
12 | return (
13 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | );
36 | }
37 |
--------------------------------------------------------------------------------
/src/marketing-page/MarketingPage.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import CssBaseline from "@mui/material/CssBaseline";
3 | import Divider from "@mui/material/Divider";
4 | import AppTheme from "../shared-theme/AppTheme";
5 | import AppAppBar from "./components/AppAppBar";
6 | import Hero from "./components/Hero";
7 | import LogoCollection from "./components/LogoCollection";
8 | import Highlights from "./components/Highlights";
9 | import Pricing from "./components/Pricing";
10 | import Features from "./components/Features";
11 | import Testimonials from "./components/Testimonials";
12 | import FAQ from "./components/FAQ";
13 | import Footer from "./components/Footer";
14 |
15 | export default function MarketingPage(props: { disableCustomTheme?: boolean }) {
16 | return (
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | );
38 | }
39 |
--------------------------------------------------------------------------------
/src/PopOverMenu.tsx:
--------------------------------------------------------------------------------
1 | import { Button, Menu, MenuItem } from "@mui/material";
2 | import * as React from "react";
3 |
4 | export default function PopoverMenu() {
5 | const [anchorEl, setAnchorEl] = React.useState(null);
6 | const open = Boolean(anchorEl);
7 | const handleClick = (event: React.MouseEvent) => {
8 | setAnchorEl(event.currentTarget);
9 | };
10 | const handleClose = () => {
11 | setAnchorEl(null);
12 | };
13 |
14 | return (
15 |
16 |
25 |
41 |
42 | );
43 | }
44 |
--------------------------------------------------------------------------------
/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/shared-theme/customizations/feedback.tsx:
--------------------------------------------------------------------------------
1 | import { Theme, alpha, Components } from "@mui/material/styles";
2 | import { gray, orange } from "../themePrimitives";
3 |
4 | /* eslint-disable import/prefer-default-export */
5 | export const feedbackCustomizations: Components = {
6 | MuiAlert: {
7 | styleOverrides: {
8 | root: ({ theme }) => ({
9 | borderRadius: 10,
10 | backgroundColor: orange[100],
11 | color: (theme.vars || theme).palette.text.primary,
12 | border: `1px solid ${alpha(orange[300], 0.5)}`,
13 | "& .MuiAlert-icon": {
14 | color: orange[500],
15 | },
16 | ...theme.applyStyles("dark", {
17 | backgroundColor: `${alpha(orange[900], 0.5)}`,
18 | border: `1px solid ${alpha(orange[800], 0.5)}`,
19 | }),
20 | }),
21 | },
22 | },
23 | MuiDialog: {
24 | styleOverrides: {
25 | root: ({ theme }) => ({
26 | "& .MuiDialog-paper": {
27 | borderRadius: "10px",
28 | border: "1px solid",
29 | borderColor: (theme.vars || theme).palette.divider,
30 | },
31 | }),
32 | },
33 | },
34 | MuiLinearProgress: {
35 | styleOverrides: {
36 | root: ({ theme }) => ({
37 | height: 8,
38 | borderRadius: 8,
39 | backgroundColor: gray[200],
40 | ...theme.applyStyles("dark", {
41 | backgroundColor: gray[800],
42 | }),
43 | }),
44 | },
45 | },
46 | };
47 |
--------------------------------------------------------------------------------
/src/dashboard/components/CustomizedDataGrid.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { DataGrid } from "@mui/x-data-grid";
3 | import { columns, rows } from "../internals/data/gridData";
4 |
5 | export default function CustomizedDataGrid() {
6 | return (
7 |
12 | params.indexRelativeToCurrentPage % 2 === 0 ? "even" : "odd"
13 | }
14 | initialState={{
15 | pagination: { paginationModel: { pageSize: 20 } },
16 | }}
17 | pageSizeOptions={[10, 20, 50]}
18 | disableColumnResize
19 | density="compact"
20 | slotProps={{
21 | filterPanel: {
22 | filterFormProps: {
23 | logicOperatorInputProps: {
24 | variant: "outlined",
25 | size: "small",
26 | },
27 | columnInputProps: {
28 | variant: "outlined",
29 | size: "small",
30 | sx: { mt: "auto" },
31 | },
32 | operatorInputProps: {
33 | variant: "outlined",
34 | size: "small",
35 | sx: { mt: "auto" },
36 | },
37 | valueInputProps: {
38 | InputComponentProps: {
39 | variant: "outlined",
40 | size: "small",
41 | },
42 | },
43 | },
44 | },
45 | }}
46 | />
47 | );
48 | }
49 |
--------------------------------------------------------------------------------
/src/dashboard/components/CustomizedDataGrid.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { DataGrid } from "@mui/x-data-grid";
3 | import { columns, rows } from "../internals/data/gridData";
4 |
5 | export default function CustomizedDataGrid() {
6 | return (
7 |
12 | params.indexRelativeToCurrentPage % 2 === 0 ? "even" : "odd"
13 | }
14 | initialState={{
15 | pagination: { paginationModel: { pageSize: 20 } },
16 | }}
17 | pageSizeOptions={[10, 20, 50]}
18 | disableColumnResize
19 | density="compact"
20 | slotProps={{
21 | filterPanel: {
22 | filterFormProps: {
23 | logicOperatorInputProps: {
24 | variant: "outlined",
25 | size: "small",
26 | },
27 | columnInputProps: {
28 | variant: "outlined",
29 | size: "small",
30 | sx: { mt: "auto" },
31 | },
32 | operatorInputProps: {
33 | variant: "outlined",
34 | size: "small",
35 | sx: { mt: "auto" },
36 | },
37 | valueInputProps: {
38 | InputComponentProps: {
39 | variant: "outlined",
40 | size: "small",
41 | },
42 | },
43 | },
44 | },
45 | }}
46 | />
47 | );
48 | }
49 |
--------------------------------------------------------------------------------
/src/dashboard/components/HighlightedCard.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Card from "@mui/material/Card";
3 | import CardContent from "@mui/material/CardContent";
4 | import Button from "@mui/material/Button";
5 | import Typography from "@mui/material/Typography";
6 | import ChevronRightRoundedIcon from "@mui/icons-material/ChevronRightRounded";
7 | import InsightsRoundedIcon from "@mui/icons-material/InsightsRounded";
8 | import useMediaQuery from "@mui/material/useMediaQuery";
9 | import { useTheme } from "@mui/material/styles";
10 |
11 | export default function HighlightedCard() {
12 | const theme = useTheme();
13 | const isSmallScreen = useMediaQuery(theme.breakpoints.down("sm"));
14 |
15 | return (
16 |
17 |
18 |
19 |
25 | Explore your data
26 |
27 |
28 | Uncover performance and visitor insights with our data wizardry.
29 |
30 | }
35 | fullWidth={isSmallScreen}
36 | >
37 | Get insights
38 |
39 |
40 |
41 | );
42 | }
43 |
--------------------------------------------------------------------------------
/src/dashboard/components/HighlightedCard.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Card from "@mui/material/Card";
3 | import CardContent from "@mui/material/CardContent";
4 | import Button from "@mui/material/Button";
5 | import Typography from "@mui/material/Typography";
6 | import ChevronRightRoundedIcon from "@mui/icons-material/ChevronRightRounded";
7 | import InsightsRoundedIcon from "@mui/icons-material/InsightsRounded";
8 | import useMediaQuery from "@mui/material/useMediaQuery";
9 | import { useTheme } from "@mui/material/styles";
10 |
11 | export default function HighlightedCard() {
12 | const theme = useTheme();
13 | const isSmallScreen = useMediaQuery(theme.breakpoints.down("sm"));
14 |
15 | return (
16 |
17 |
18 |
19 |
25 | Explore your data
26 |
27 |
28 | Uncover performance and visitor insights with our data wizardry.
29 |
30 | }
35 | fullWidth={isSmallScreen}
36 | >
37 | Get insights
38 |
39 |
40 |
41 | );
42 | }
43 |
--------------------------------------------------------------------------------
/src/checkout/components/Info.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import List from "@mui/material/List";
3 | import ListItem from "@mui/material/ListItem";
4 | import ListItemText from "@mui/material/ListItemText";
5 | import Typography from "@mui/material/Typography";
6 |
7 | const products = [
8 | {
9 | name: "Professional plan",
10 | desc: "Monthly subscription",
11 | price: "$15.00",
12 | },
13 | {
14 | name: "Dedicated support",
15 | desc: "Included in the Professional plan",
16 | price: "Free",
17 | },
18 | {
19 | name: "Hardware",
20 | desc: "Devices needed for development",
21 | price: "$69.99",
22 | },
23 | {
24 | name: "Landing page template",
25 | desc: "License",
26 | price: "$49.99",
27 | },
28 | ];
29 |
30 | interface InfoProps {
31 | totalPrice: string;
32 | }
33 |
34 | export default function Info({ totalPrice }: InfoProps) {
35 | return (
36 |
37 |
38 | Total
39 |
40 |
41 | {totalPrice}
42 |
43 |
44 | {products.map((product) => (
45 |
46 |
51 |
52 | {product.price}
53 |
54 |
55 | ))}
56 |
57 |
58 | );
59 | }
60 |
--------------------------------------------------------------------------------
/src/checkout/components/InfoMobile.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Button from "@mui/material/Button";
4 | import Drawer from "@mui/material/Drawer";
5 | import IconButton from "@mui/material/IconButton";
6 | import CloseIcon from "@mui/icons-material/Close";
7 | import ExpandMoreRoundedIcon from "@mui/icons-material/ExpandMoreRounded";
8 | import Info from "./Info";
9 |
10 | interface InfoProps {
11 | totalPrice: string;
12 | }
13 |
14 | export default function InfoMobile({ totalPrice }: InfoProps) {
15 | const [open, setOpen] = React.useState(false);
16 |
17 | const toggleDrawer = (newOpen: boolean) => () => {
18 | setOpen(newOpen);
19 | };
20 |
21 | const DrawerList = (
22 |
23 |
27 |
28 |
29 |
30 |
31 | );
32 |
33 | return (
34 |
35 | }
38 | onClick={toggleDrawer(true)}
39 | >
40 | View details
41 |
42 |
54 | {DrawerList}
55 |
56 |
57 | );
58 | }
59 |
--------------------------------------------------------------------------------
/src/checkout/components/Info.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import PropTypes from "prop-types";
3 | import List from "@mui/material/List";
4 | import ListItem from "@mui/material/ListItem";
5 | import ListItemText from "@mui/material/ListItemText";
6 | import Typography from "@mui/material/Typography";
7 |
8 | const products = [
9 | {
10 | name: "Professional plan",
11 | desc: "Monthly subscription",
12 | price: "$15.00",
13 | },
14 | {
15 | name: "Dedicated support",
16 | desc: "Included in the Professional plan",
17 | price: "Free",
18 | },
19 | {
20 | name: "Hardware",
21 | desc: "Devices needed for development",
22 | price: "$69.99",
23 | },
24 | {
25 | name: "Landing page template",
26 | desc: "License",
27 | price: "$49.99",
28 | },
29 | ];
30 |
31 | function Info({ totalPrice }) {
32 | return (
33 |
34 |
35 | Total
36 |
37 |
38 | {totalPrice}
39 |
40 |
41 | {products.map((product) => (
42 |
43 |
48 |
49 | {product.price}
50 |
51 |
52 | ))}
53 |
54 |
55 | );
56 | }
57 |
58 | Info.propTypes = {
59 | totalPrice: PropTypes.string.isRequired,
60 | };
61 |
62 | export default Info;
63 |
--------------------------------------------------------------------------------
/src/crm/components/CrmHeader.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Stack from "@mui/material/Stack";
3 | import Typography from "@mui/material/Typography";
4 | import NotificationsRoundedIcon from "@mui/icons-material/NotificationsRounded";
5 | import MenuButton from "../../dashboard/components/MenuButton";
6 | import ColorModeIconDropdown from "../../shared-theme/ColorModeIconDropdown";
7 | import CrmSearch from "./CrmSearch";
8 | import CrmNavbarBreadcrumbs from "./CrmNavbarBreadcrumbs";
9 | import Button from "@mui/material/Button";
10 | import CalendarTodayRoundedIcon from "@mui/icons-material/CalendarTodayRounded";
11 |
12 | export default function CrmHeader() {
13 | return (
14 |
26 |
27 |
28 |
29 | CRM Dashboard
30 |
31 |
32 |
33 |
34 | }
38 | >
39 | This Month
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | );
48 | }
49 |
--------------------------------------------------------------------------------
/src/checkout/components/InfoMobile.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import PropTypes from "prop-types";
3 | import Box from "@mui/material/Box";
4 | import Button from "@mui/material/Button";
5 | import Drawer from "@mui/material/Drawer";
6 | import IconButton from "@mui/material/IconButton";
7 | import CloseIcon from "@mui/icons-material/Close";
8 | import ExpandMoreRoundedIcon from "@mui/icons-material/ExpandMoreRounded";
9 | import Info from "./Info";
10 |
11 | function InfoMobile({ totalPrice }) {
12 | const [open, setOpen] = React.useState(false);
13 |
14 | const toggleDrawer = (newOpen) => () => {
15 | setOpen(newOpen);
16 | };
17 |
18 | const DrawerList = (
19 |
20 |
24 |
25 |
26 |
27 |
28 | );
29 |
30 | return (
31 |
32 | }
35 | onClick={toggleDrawer(true)}
36 | >
37 | View details
38 |
39 |
51 | {DrawerList}
52 |
53 |
54 | );
55 | }
56 |
57 | InfoMobile.propTypes = {
58 | totalPrice: PropTypes.string.isRequired,
59 | };
60 |
61 | export default InfoMobile;
62 |
--------------------------------------------------------------------------------
/src/crm/components/CrmSelectCompany.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import MenuItem from "@mui/material/MenuItem";
4 | import FormControl from "@mui/material/FormControl";
5 | import Select, { SelectChangeEvent } from "@mui/material/Select";
6 | import BusinessRoundedIcon from "@mui/icons-material/BusinessRounded";
7 |
8 | export default function CrmSelectCompany() {
9 | const [company, setCompany] = React.useState("acme");
10 |
11 | const handleChange = (event: SelectChangeEvent) => {
12 | setCompany(event.target.value as string);
13 | };
14 |
15 | return (
16 |
17 |
18 |
53 |
54 |
55 | );
56 | }
57 |
--------------------------------------------------------------------------------
/src/crm/components/CrmNavbarBreadcrumbs.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { useLocation, Link as RouterLink } from "react-router-dom";
3 | import Breadcrumbs from "@mui/material/Breadcrumbs";
4 | import Link from "@mui/material/Link";
5 | import Typography from "@mui/material/Typography";
6 | import HomeRoundedIcon from "@mui/icons-material/HomeRounded";
7 | import NavigateNextRoundedIcon from "@mui/icons-material/NavigateNextRounded";
8 |
9 | function capitalizeFirstLetter(string: string) {
10 | return string.charAt(0).toUpperCase() + string.slice(1);
11 | }
12 |
13 | export default function CrmNavbarBreadcrumbs() {
14 | const location = useLocation();
15 | const pathnames = location.pathname.split("/").filter((x) => x);
16 |
17 | return (
18 | }
20 | aria-label="breadcrumb"
21 | sx={{ mb: 1 }}
22 | >
23 |
30 |
31 | Home
32 |
33 | {pathnames.map((value, index) => {
34 | const last = index === pathnames.length - 1;
35 | const to = `/${pathnames.slice(0, index + 1).join("/")}`;
36 |
37 | return last ? (
38 |
39 | {capitalizeFirstLetter(value)}
40 |
41 | ) : (
42 |
49 | {capitalizeFirstLetter(value)}
50 |
51 | );
52 | })}
53 |
54 | );
55 | }
56 |
--------------------------------------------------------------------------------
/src/crm/components/CrmSearch.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import InputBase from "@mui/material/InputBase";
3 | import SearchRoundedIcon from "@mui/icons-material/SearchRounded";
4 | import { alpha, styled } from "@mui/material/styles";
5 |
6 | const SearchWrapper = styled("div")(({ theme }) => ({
7 | position: "relative",
8 | borderRadius: theme.shape.borderRadius,
9 | backgroundColor: alpha(theme.palette.common.black, 0.04),
10 | "&:hover": {
11 | backgroundColor: alpha(theme.palette.common.black, 0.06),
12 | },
13 | marginLeft: 0,
14 | width: "100%",
15 | [theme.breakpoints.up("sm")]: {
16 | width: "auto",
17 | marginLeft: theme.spacing(1),
18 | },
19 | ...theme.applyStyles("dark", {
20 | backgroundColor: alpha(theme.palette.common.white, 0.06),
21 | "&:hover": {
22 | backgroundColor: alpha(theme.palette.common.white, 0.1),
23 | },
24 | }),
25 | }));
26 |
27 | const SearchIconWrapper = styled("div")(({ theme }) => ({
28 | padding: theme.spacing(0, 2),
29 | height: "100%",
30 | position: "absolute",
31 | pointerEvents: "none",
32 | display: "flex",
33 | alignItems: "center",
34 | justifyContent: "center",
35 | }));
36 |
37 | const StyledInputBase = styled(InputBase)(({ theme }) => ({
38 | color: "inherit",
39 | "& .MuiInputBase-input": {
40 | padding: theme.spacing(1, 1, 1, 0),
41 | paddingLeft: `calc(1em + ${theme.spacing(4)})`,
42 | transition: theme.transitions.create("width"),
43 | width: "100%",
44 | [theme.breakpoints.up("sm")]: {
45 | width: "12ch",
46 | "&:focus": {
47 | width: "20ch",
48 | },
49 | },
50 | },
51 | }));
52 |
53 | export default function CrmSearch() {
54 | return (
55 |
56 |
57 |
58 |
59 |
63 |
64 | );
65 | }
66 |
--------------------------------------------------------------------------------
/src/sign-in/components/ForgotPassword.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Button from "@mui/material/Button";
3 | import Dialog from "@mui/material/Dialog";
4 | import DialogActions from "@mui/material/DialogActions";
5 | import DialogContent from "@mui/material/DialogContent";
6 | import DialogContentText from "@mui/material/DialogContentText";
7 | import DialogTitle from "@mui/material/DialogTitle";
8 | import OutlinedInput from "@mui/material/OutlinedInput";
9 |
10 | interface ForgotPasswordProps {
11 | open: boolean;
12 | handleClose: () => void;
13 | }
14 |
15 | export default function ForgotPassword({
16 | open,
17 | handleClose,
18 | }: ForgotPasswordProps) {
19 | return (
20 |
61 | );
62 | }
63 |
--------------------------------------------------------------------------------
/src/sign-in-side/components/ForgotPassword.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Button from "@mui/material/Button";
3 | import Dialog from "@mui/material/Dialog";
4 | import DialogActions from "@mui/material/DialogActions";
5 | import DialogContent from "@mui/material/DialogContent";
6 | import DialogContentText from "@mui/material/DialogContentText";
7 | import DialogTitle from "@mui/material/DialogTitle";
8 | import OutlinedInput from "@mui/material/OutlinedInput";
9 |
10 | interface ForgotPasswordProps {
11 | open: boolean;
12 | handleClose: () => void;
13 | }
14 |
15 | export default function ForgotPassword({
16 | open,
17 | handleClose,
18 | }: ForgotPasswordProps) {
19 | return (
20 |
61 | );
62 | }
63 |
--------------------------------------------------------------------------------
/src/sign-in/components/ForgotPassword.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import PropTypes from "prop-types";
3 | import Button from "@mui/material/Button";
4 | import Dialog from "@mui/material/Dialog";
5 | import DialogActions from "@mui/material/DialogActions";
6 | import DialogContent from "@mui/material/DialogContent";
7 | import DialogContentText from "@mui/material/DialogContentText";
8 | import DialogTitle from "@mui/material/DialogTitle";
9 | import OutlinedInput from "@mui/material/OutlinedInput";
10 |
11 | function ForgotPassword({ open, handleClose }) {
12 | return (
13 |
54 | );
55 | }
56 |
57 | ForgotPassword.propTypes = {
58 | handleClose: PropTypes.func.isRequired,
59 | open: PropTypes.bool.isRequired,
60 | };
61 |
62 | export default ForgotPassword;
63 |
--------------------------------------------------------------------------------
/src/sign-in-side/components/ForgotPassword.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import PropTypes from "prop-types";
3 | import Button from "@mui/material/Button";
4 | import Dialog from "@mui/material/Dialog";
5 | import DialogActions from "@mui/material/DialogActions";
6 | import DialogContent from "@mui/material/DialogContent";
7 | import DialogContentText from "@mui/material/DialogContentText";
8 | import DialogTitle from "@mui/material/DialogTitle";
9 | import OutlinedInput from "@mui/material/OutlinedInput";
10 |
11 | function ForgotPassword({ open, handleClose }) {
12 | return (
13 |
54 | );
55 | }
56 |
57 | ForgotPassword.propTypes = {
58 | handleClose: PropTypes.func.isRequired,
59 | open: PropTypes.bool.isRequired,
60 | };
61 |
62 | export default ForgotPassword;
63 |
--------------------------------------------------------------------------------
/src/dashboard/components/CustomDatePicker.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import dayjs from "dayjs";
3 | import { useForkRef } from "@mui/material/utils";
4 | import Button from "@mui/material/Button";
5 | import CalendarTodayRoundedIcon from "@mui/icons-material/CalendarTodayRounded";
6 | import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
7 | import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
8 | import { DatePicker } from "@mui/x-date-pickers/DatePicker";
9 | import {
10 | useParsedFormat,
11 | usePickerContext,
12 | useSplitFieldProps,
13 | } from "@mui/x-date-pickers";
14 |
15 | function ButtonField(props) {
16 | const { forwardedProps } = useSplitFieldProps(props, "date");
17 | const pickerContext = usePickerContext();
18 | const handleRef = useForkRef(pickerContext.triggerRef, pickerContext.rootRef);
19 | const parsedFormat = useParsedFormat();
20 | const valueStr =
21 | pickerContext.value == null
22 | ? parsedFormat
23 | : pickerContext.value.format(pickerContext.fieldFormat);
24 |
25 | return (
26 | }
32 | sx={{ minWidth: "fit-content" }}
33 | onClick={() => pickerContext.setOpen((prev) => !prev)}
34 | >
35 | {pickerContext.label ?? valueStr}
36 |
37 | );
38 | }
39 |
40 | export default function CustomDatePicker() {
41 | const [value, setValue] = React.useState(dayjs("2023-04-17"));
42 |
43 | return (
44 |
45 | setValue(newValue)}
49 | slots={{ field: ButtonField }}
50 | slotProps={{
51 | nextIconButton: { size: "small" },
52 | previousIconButton: { size: "small" },
53 | }}
54 | views={["day", "month", "year"]}
55 | />
56 |
57 | );
58 | }
59 |
--------------------------------------------------------------------------------
/src/dashboard/Dashboard.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import type {} from "@mui/x-date-pickers/themeAugmentation";
3 | import type {} from "@mui/x-charts/themeAugmentation";
4 | import type {} from "@mui/x-data-grid-pro/themeAugmentation";
5 | import type {} from "@mui/x-tree-view/themeAugmentation";
6 | import { alpha } from "@mui/material/styles";
7 | import CssBaseline from "@mui/material/CssBaseline";
8 | import Box from "@mui/material/Box";
9 | import Stack from "@mui/material/Stack";
10 | import AppNavbar from "./components/AppNavbar";
11 | import Header from "./components/Header";
12 | import MainGrid from "./components/MainGrid";
13 | import SideMenu from "./components/SideMenu";
14 | import AppTheme from "../shared-theme/AppTheme";
15 | import {
16 | chartsCustomizations,
17 | dataGridCustomizations,
18 | datePickersCustomizations,
19 | treeViewCustomizations,
20 | } from "./theme/customizations";
21 |
22 | const xThemeComponents = {
23 | ...chartsCustomizations,
24 | ...dataGridCustomizations,
25 | ...datePickersCustomizations,
26 | ...treeViewCustomizations,
27 | };
28 |
29 | export default function Dashboard(props: { disableCustomTheme?: boolean }) {
30 | return (
31 |
32 |
33 |
34 |
35 |
36 | {/* Main content */}
37 | ({
40 | flexGrow: 1,
41 | backgroundColor: theme.vars
42 | ? `rgba(${theme.vars.palette.background.defaultChannel} / 1)`
43 | : alpha(theme.palette.background.default, 1),
44 | overflow: "auto",
45 | })}
46 | >
47 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | );
63 | }
64 |
--------------------------------------------------------------------------------
/src/dashboard/theme/customizations/treeView.ts:
--------------------------------------------------------------------------------
1 | import { alpha, Theme } from "@mui/material/styles";
2 | import type { TreeViewComponents } from "@mui/x-tree-view/themeAugmentation";
3 | import { gray, brand } from "../../../shared-theme/themePrimitives";
4 |
5 | /* eslint-disable import/prefer-default-export */
6 | export const treeViewCustomizations: TreeViewComponents = {
7 | MuiTreeItem: {
8 | styleOverrides: {
9 | root: ({ theme }) => ({
10 | position: "relative",
11 | boxSizing: "border-box",
12 | padding: theme.spacing(0, 1),
13 | "& .groupTransition": {
14 | marginLeft: theme.spacing(2),
15 | padding: theme.spacing(0),
16 | borderLeft: "1px solid",
17 | borderColor: (theme.vars || theme).palette.divider,
18 | },
19 | "&:focus-visible .focused": {
20 | outline: `3px solid ${alpha(brand[500], 0.5)}`,
21 | outlineOffset: "2px",
22 | "&:hover": {
23 | backgroundColor: alpha(gray[300], 0.2),
24 | outline: `3px solid ${alpha(brand[500], 0.5)}`,
25 | outlineOffset: "2px",
26 | },
27 | },
28 | }),
29 | content: ({ theme }) => ({
30 | marginTop: theme.spacing(1),
31 | padding: theme.spacing(0.5, 1),
32 | overflow: "clip",
33 | "&:hover": {
34 | backgroundColor: alpha(gray[300], 0.2),
35 | },
36 |
37 | "&.selected": {
38 | backgroundColor: alpha(gray[300], 0.4),
39 | "&:hover": {
40 | backgroundColor: alpha(gray[300], 0.6),
41 | },
42 | },
43 | ...theme.applyStyles("dark", {
44 | "&:hover": {
45 | backgroundColor: alpha(gray[500], 0.2),
46 | },
47 | "&:focus-visible": {
48 | "&:hover": {
49 | backgroundColor: alpha(gray[500], 0.2),
50 | },
51 | },
52 | "&.selected": {
53 | backgroundColor: alpha(gray[500], 0.4),
54 | "&:hover": {
55 | backgroundColor: alpha(gray[500], 0.6),
56 | },
57 | },
58 | }),
59 | }),
60 | },
61 | },
62 | };
63 |
--------------------------------------------------------------------------------
/src/dashboard/components/CustomDatePicker.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import dayjs, { Dayjs } from "dayjs";
3 | import { useForkRef } from "@mui/material/utils";
4 | import Button from "@mui/material/Button";
5 | import CalendarTodayRoundedIcon from "@mui/icons-material/CalendarTodayRounded";
6 | import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
7 | import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
8 | import {
9 | DatePicker,
10 | DatePickerFieldProps,
11 | } from "@mui/x-date-pickers/DatePicker";
12 | import {
13 | useParsedFormat,
14 | usePickerContext,
15 | useSplitFieldProps,
16 | } from "@mui/x-date-pickers";
17 |
18 | interface ButtonFieldProps extends DatePickerFieldProps {}
19 |
20 | function ButtonField(props: ButtonFieldProps) {
21 | const { forwardedProps } = useSplitFieldProps(props, "date");
22 | const pickerContext = usePickerContext();
23 | const handleRef = useForkRef(pickerContext.triggerRef, pickerContext.rootRef);
24 | const parsedFormat = useParsedFormat();
25 | const valueStr =
26 | pickerContext.value == null
27 | ? parsedFormat
28 | : pickerContext.value.format(pickerContext.fieldFormat);
29 |
30 | return (
31 | }
37 | sx={{ minWidth: "fit-content" }}
38 | onClick={() => pickerContext.setOpen((prev) => !prev)}
39 | >
40 | {pickerContext.label ?? valueStr}
41 |
42 | );
43 | }
44 |
45 | export default function CustomDatePicker() {
46 | const [value, setValue] = React.useState(dayjs("2023-04-17"));
47 |
48 | return (
49 |
50 | setValue(newValue)}
54 | slots={{ field: ButtonField }}
55 | slotProps={{
56 | nextIconButton: { size: "small" },
57 | previousIconButton: { size: "small" },
58 | }}
59 | views={["day", "month", "year"]}
60 | />
61 |
62 | );
63 | }
64 |
--------------------------------------------------------------------------------
/src/dashboard/components/MenuContent.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import List from "@mui/material/List";
3 | import ListItem from "@mui/material/ListItem";
4 | import ListItemButton from "@mui/material/ListItemButton";
5 | import ListItemIcon from "@mui/material/ListItemIcon";
6 | import ListItemText from "@mui/material/ListItemText";
7 | import Stack from "@mui/material/Stack";
8 | import HomeRoundedIcon from "@mui/icons-material/HomeRounded";
9 | import AnalyticsRoundedIcon from "@mui/icons-material/AnalyticsRounded";
10 | import PeopleRoundedIcon from "@mui/icons-material/PeopleRounded";
11 | import AssignmentRoundedIcon from "@mui/icons-material/AssignmentRounded";
12 | import SettingsRoundedIcon from "@mui/icons-material/SettingsRounded";
13 | import InfoRoundedIcon from "@mui/icons-material/InfoRounded";
14 | import HelpRoundedIcon from "@mui/icons-material/HelpRounded";
15 |
16 | const mainListItems = [
17 | { text: "Home", icon: },
18 | { text: "Analytics", icon: },
19 | { text: "Clients", icon: },
20 | { text: "Tasks", icon: },
21 | ];
22 |
23 | const secondaryListItems = [
24 | { text: "Settings", icon: },
25 | { text: "About", icon: },
26 | { text: "Feedback", icon: },
27 | ];
28 |
29 | export default function MenuContent() {
30 | return (
31 |
32 |
33 | {mainListItems.map((item, index) => (
34 |
35 |
36 | {item.icon}
37 |
38 |
39 |
40 | ))}
41 |
42 |
43 | {secondaryListItems.map((item, index) => (
44 |
45 |
46 | {item.icon}
47 |
48 |
49 |
50 | ))}
51 |
52 |
53 | );
54 | }
55 |
--------------------------------------------------------------------------------
/src/dashboard/components/MenuContent.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import List from "@mui/material/List";
3 | import ListItem from "@mui/material/ListItem";
4 | import ListItemButton from "@mui/material/ListItemButton";
5 | import ListItemIcon from "@mui/material/ListItemIcon";
6 | import ListItemText from "@mui/material/ListItemText";
7 | import Stack from "@mui/material/Stack";
8 | import HomeRoundedIcon from "@mui/icons-material/HomeRounded";
9 | import AnalyticsRoundedIcon from "@mui/icons-material/AnalyticsRounded";
10 | import PeopleRoundedIcon from "@mui/icons-material/PeopleRounded";
11 | import AssignmentRoundedIcon from "@mui/icons-material/AssignmentRounded";
12 | import SettingsRoundedIcon from "@mui/icons-material/SettingsRounded";
13 | import InfoRoundedIcon from "@mui/icons-material/InfoRounded";
14 | import HelpRoundedIcon from "@mui/icons-material/HelpRounded";
15 |
16 | const mainListItems = [
17 | { text: "Home", icon: },
18 | { text: "Analytics", icon: },
19 | { text: "Clients", icon: },
20 | { text: "Tasks", icon: },
21 | ];
22 |
23 | const secondaryListItems = [
24 | { text: "Settings", icon: },
25 | { text: "About", icon: },
26 | { text: "Feedback", icon: },
27 | ];
28 |
29 | export default function MenuContent() {
30 | return (
31 |
32 |
33 | {mainListItems.map((item, index) => (
34 |
35 |
36 | {item.icon}
37 |
38 |
39 |
40 | ))}
41 |
42 |
43 | {secondaryListItems.map((item, index) => (
44 |
45 |
46 | {item.icon}
47 |
48 |
49 |
50 | ))}
51 |
52 |
53 | );
54 | }
55 |
--------------------------------------------------------------------------------
/src/shared-theme/AppTheme.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { ThemeProvider, createTheme } from "@mui/material/styles";
3 | import type { ThemeOptions } from "@mui/material/styles";
4 | import { inputsCustomizations } from "./customizations/inputs";
5 | import { dataDisplayCustomizations } from "./customizations/dataDisplay";
6 | import { feedbackCustomizations } from "./customizations/feedback";
7 | import { navigationCustomizations } from "./customizations/navigation";
8 | import { surfacesCustomizations } from "./customizations/surfaces";
9 | import { colorSchemes, typography, shadows, shape } from "./themePrimitives";
10 |
11 | interface AppThemeProps {
12 | children: React.ReactNode;
13 | /**
14 | * This is for the docs site. You can ignore it or remove it.
15 | */
16 | disableCustomTheme?: boolean;
17 | themeComponents?: ThemeOptions["components"];
18 | }
19 |
20 | export default function AppTheme(props: AppThemeProps) {
21 | const { children, disableCustomTheme, themeComponents } = props;
22 | const theme = React.useMemo(() => {
23 | return disableCustomTheme
24 | ? {}
25 | : createTheme({
26 | // For more details about CSS variables configuration, see https://mui.com/material-ui/customization/css-theme-variables/configuration/
27 | cssVariables: {
28 | colorSchemeSelector: "data-mui-color-scheme",
29 | cssVarPrefix: "template",
30 | },
31 | defaultColorScheme: "light", // Set light mode as default instead of using system preference
32 | colorSchemes, // Recently added in v6 for building light & dark mode app, see https://mui.com/material-ui/customization/palette/#color-schemes
33 | typography,
34 | shadows,
35 | shape,
36 | components: {
37 | ...inputsCustomizations,
38 | ...dataDisplayCustomizations,
39 | ...feedbackCustomizations,
40 | ...navigationCustomizations,
41 | ...surfacesCustomizations,
42 | ...themeComponents,
43 | },
44 | });
45 | }, [disableCustomTheme, themeComponents]);
46 | if (disableCustomTheme) {
47 | return {children};
48 | }
49 | return (
50 |
51 | {children}
52 |
53 | );
54 | }
55 |
--------------------------------------------------------------------------------
/src/sign-in-side/SignInSide.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import CssBaseline from "@mui/material/CssBaseline";
3 | import Stack from "@mui/material/Stack";
4 | import AppTheme from "../shared-theme/AppTheme";
5 | import ColorModeSelect from "../shared-theme/ColorModeSelect";
6 | import SignInCard from "./components/SignInCard";
7 | import Content from "./components/Content";
8 |
9 | export default function SignInSide(props: { disableCustomTheme?: boolean }) {
10 | return (
11 |
12 |
13 |
14 | ({
25 | "&::before": {
26 | content: '""',
27 | display: "block",
28 | position: "absolute",
29 | zIndex: -1,
30 | inset: 0,
31 | backgroundImage:
32 | "radial-gradient(ellipse at 50% 50%, hsl(210, 100%, 97%), hsl(0, 0%, 100%))",
33 | backgroundRepeat: "no-repeat",
34 | ...theme.applyStyles("dark", {
35 | backgroundImage:
36 | "radial-gradient(at 50% 50%, hsla(210, 100%, 16%, 0.5), hsl(220, 30%, 5%))",
37 | }),
38 | },
39 | }),
40 | ]}
41 | >
42 |
51 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | );
67 | }
68 |
--------------------------------------------------------------------------------
/src/dashboard/theme/customizations/charts.ts:
--------------------------------------------------------------------------------
1 | import { Theme } from "@mui/material/styles";
2 | import { axisClasses, legendClasses, chartsGridClasses } from "@mui/x-charts";
3 | import type { ChartsComponents } from "@mui/x-charts/themeAugmentation";
4 | import { gray } from "../../../shared-theme/themePrimitives";
5 |
6 | /* eslint-disable import/prefer-default-export */
7 | export const chartsCustomizations: ChartsComponents = {
8 | MuiChartsAxis: {
9 | styleOverrides: {
10 | root: ({ theme }) => ({
11 | [`& .${axisClasses.line}`]: {
12 | stroke: gray[300],
13 | },
14 | [`& .${axisClasses.tick}`]: { stroke: gray[300] },
15 | [`& .${axisClasses.tickLabel}`]: {
16 | fill: gray[500],
17 | fontWeight: 500,
18 | },
19 | ...theme.applyStyles("dark", {
20 | [`& .${axisClasses.line}`]: {
21 | stroke: gray[700],
22 | },
23 | [`& .${axisClasses.tick}`]: { stroke: gray[700] },
24 | [`& .${axisClasses.tickLabel}`]: {
25 | fill: gray[300],
26 | fontWeight: 500,
27 | },
28 | }),
29 | }),
30 | },
31 | },
32 | MuiChartsTooltip: {
33 | styleOverrides: {
34 | mark: ({ theme }) => ({
35 | ry: 6,
36 | boxShadow: "none",
37 | border: `1px solid ${(theme.vars || theme).palette.divider}`,
38 | }),
39 | table: ({ theme }) => ({
40 | border: `1px solid ${(theme.vars || theme).palette.divider}`,
41 | borderRadius: theme.shape.borderRadius,
42 | background: "hsl(0, 0%, 100%)",
43 | ...theme.applyStyles("dark", {
44 | background: gray[900],
45 | }),
46 | }),
47 | },
48 | },
49 | MuiChartsLegend: {
50 | styleOverrides: {
51 | root: {
52 | [`& .${legendClasses.mark}`]: {
53 | ry: 6,
54 | },
55 | },
56 | },
57 | },
58 | MuiChartsGrid: {
59 | styleOverrides: {
60 | root: ({ theme }) => ({
61 | [`& .${chartsGridClasses.line}`]: {
62 | stroke: gray[200],
63 | strokeDasharray: "4 2",
64 | strokeWidth: 0.8,
65 | },
66 | ...theme.applyStyles("dark", {
67 | [`& .${chartsGridClasses.line}`]: {
68 | stroke: gray[700],
69 | strokeDasharray: "4 2",
70 | strokeWidth: 0.8,
71 | },
72 | }),
73 | }),
74 | },
75 | },
76 | };
77 |
--------------------------------------------------------------------------------
/src/sign-in-side/components/Content.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Stack from "@mui/material/Stack";
4 | import Typography from "@mui/material/Typography";
5 | import AutoFixHighRoundedIcon from "@mui/icons-material/AutoFixHighRounded";
6 | import ConstructionRoundedIcon from "@mui/icons-material/ConstructionRounded";
7 | import SettingsSuggestRoundedIcon from "@mui/icons-material/SettingsSuggestRounded";
8 | import ThumbUpAltRoundedIcon from "@mui/icons-material/ThumbUpAltRounded";
9 | import { SitemarkIcon } from "./CustomIcons";
10 |
11 | const items = [
12 | {
13 | icon: ,
14 | title: "Adaptable performance",
15 | description:
16 | "Our product effortlessly adjusts to your needs, boosting efficiency and simplifying your tasks.",
17 | },
18 | {
19 | icon: ,
20 | title: "Built to last",
21 | description:
22 | "Experience unmatched durability that goes above and beyond with lasting investment.",
23 | },
24 | {
25 | icon: ,
26 | title: "Great user experience",
27 | description:
28 | "Integrate our product into your routine with an intuitive and easy-to-use interface.",
29 | },
30 | {
31 | icon: ,
32 | title: "Innovative functionality",
33 | description:
34 | "Stay ahead with features that set new standards, addressing your evolving needs better than the rest.",
35 | },
36 | ];
37 |
38 | export default function Content() {
39 | return (
40 |
48 |
49 |
50 |
51 | {items.map((item, index) => (
52 |
53 | {item.icon}
54 |
55 |
56 | {item.title}
57 |
58 |
59 | {item.description}
60 |
61 |
62 |
63 | ))}
64 |
65 | );
66 | }
67 |
--------------------------------------------------------------------------------
/src/sign-in-side/components/Content.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Stack from "@mui/material/Stack";
4 | import Typography from "@mui/material/Typography";
5 | import AutoFixHighRoundedIcon from "@mui/icons-material/AutoFixHighRounded";
6 | import ConstructionRoundedIcon from "@mui/icons-material/ConstructionRounded";
7 | import SettingsSuggestRoundedIcon from "@mui/icons-material/SettingsSuggestRounded";
8 | import ThumbUpAltRoundedIcon from "@mui/icons-material/ThumbUpAltRounded";
9 | import { SitemarkIcon } from "./CustomIcons";
10 |
11 | const items = [
12 | {
13 | icon: ,
14 | title: "Adaptable performance",
15 | description:
16 | "Our product effortlessly adjusts to your needs, boosting efficiency and simplifying your tasks.",
17 | },
18 | {
19 | icon: ,
20 | title: "Built to last",
21 | description:
22 | "Experience unmatched durability that goes above and beyond with lasting investment.",
23 | },
24 | {
25 | icon: ,
26 | title: "Great user experience",
27 | description:
28 | "Integrate our product into your routine with an intuitive and easy-to-use interface.",
29 | },
30 | {
31 | icon: ,
32 | title: "Innovative functionality",
33 | description:
34 | "Stay ahead with features that set new standards, addressing your evolving needs better than the rest.",
35 | },
36 | ];
37 |
38 | export default function Content() {
39 | return (
40 |
48 |
49 |
50 |
51 | {items.map((item, index) => (
52 |
53 | {item.icon}
54 |
55 |
56 | {item.title}
57 |
58 |
59 | {item.description}
60 |
61 |
62 |
63 | ))}
64 |
65 | );
66 | }
67 |
--------------------------------------------------------------------------------
/src/crm/components/CrmLeadsBySourceChart.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { useTheme } from "@mui/material/styles";
3 | import Box from "@mui/material/Box";
4 | import Card from "@mui/material/Card";
5 | import CardContent from "@mui/material/CardContent";
6 | import Typography from "@mui/material/Typography";
7 | import { PieChart } from "@mui/x-charts/PieChart";
8 |
9 | // Sample lead source data
10 | const leadSources = [
11 | { id: 0, value: 35, label: "Website", color: "#3f51b5" },
12 | { id: 1, value: 25, label: "Referrals", color: "#2196f3" },
13 | { id: 2, value: 20, label: "Social Media", color: "#4caf50" },
14 | { id: 3, value: 15, label: "Email Campaigns", color: "#ff9800" },
15 | { id: 4, value: 5, label: "Other", color: "#9e9e9e" },
16 | ];
17 |
18 | export default function CrmLeadsBySourceChart() {
19 | const theme = useTheme();
20 |
21 | return (
22 |
30 |
33 |
34 | Leads by Source
35 |
36 |
37 |
47 | `${item.value}%`,
52 | arcLabelMinAngle: 20,
53 | innerRadius: 60,
54 | paddingAngle: 2,
55 | cornerRadius: 4,
56 | valueFormatter: (value) => `${value}%`,
57 | },
58 | ]}
59 | height={280}
60 | slotProps={{
61 | legend: {
62 | position: { vertical: "middle", horizontal: "right" },
63 | direction: "column",
64 | itemMarkWidth: 10,
65 | itemMarkHeight: 10,
66 | markGap: 5,
67 | itemGap: 8,
68 | },
69 | }}
70 | margin={{ right: 120 }}
71 | />
72 |
73 |
74 |
75 | );
76 | }
77 |
--------------------------------------------------------------------------------
/src/crm/components/CrmOptionsMenu.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import IconButton from "@mui/material/IconButton";
4 | import Menu from "@mui/material/Menu";
5 | import MenuItem from "@mui/material/MenuItem";
6 | import ListItemIcon from "@mui/material/ListItemIcon";
7 | import ListItemText from "@mui/material/ListItemText";
8 | import Divider from "@mui/material/Divider";
9 | import MoreVertRoundedIcon from "@mui/icons-material/MoreVertRounded";
10 | import PersonRoundedIcon from "@mui/icons-material/PersonRounded";
11 | import ExitToAppRoundedIcon from "@mui/icons-material/ExitToAppRounded";
12 | import SettingsRoundedIcon from "@mui/icons-material/SettingsRounded";
13 |
14 | export default function CrmOptionsMenu() {
15 | const [anchorEl, setAnchorEl] = React.useState(null);
16 | const open = Boolean(anchorEl);
17 |
18 | const handleClick = (event: React.MouseEvent) => {
19 | setAnchorEl(event.currentTarget);
20 | };
21 |
22 | const handleClose = () => {
23 | setAnchorEl(null);
24 | };
25 |
26 | return (
27 |
28 |
36 |
37 |
38 |
66 |
67 | );
68 | }
69 |
--------------------------------------------------------------------------------
/src/dashboard/components/SideMenuMobile.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Avatar from "@mui/material/Avatar";
3 | import Button from "@mui/material/Button";
4 | import Divider from "@mui/material/Divider";
5 | import Drawer, { drawerClasses } from "@mui/material/Drawer";
6 | import Stack from "@mui/material/Stack";
7 | import Typography from "@mui/material/Typography";
8 | import LogoutRoundedIcon from "@mui/icons-material/LogoutRounded";
9 | import NotificationsRoundedIcon from "@mui/icons-material/NotificationsRounded";
10 | import MenuButton from "./MenuButton";
11 | import MenuContent from "./MenuContent";
12 | import CardAlert from "./CardAlert";
13 |
14 | interface SideMenuMobileProps {
15 | open: boolean | undefined;
16 | toggleDrawer: (newOpen: boolean) => () => void;
17 | }
18 |
19 | export default function SideMenuMobile({
20 | open,
21 | toggleDrawer,
22 | }: SideMenuMobileProps) {
23 | return (
24 | theme.zIndex.drawer + 1,
30 | [`& .${drawerClasses.paper}`]: {
31 | backgroundImage: "none",
32 | backgroundColor: "background.paper",
33 | },
34 | }}
35 | >
36 |
42 |
43 |
47 |
53 |
54 | Riley Carter
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | }
72 | >
73 | Logout
74 |
75 |
76 |
77 |
78 | );
79 | }
80 |
--------------------------------------------------------------------------------
/src/dashboard/components/SideMenuMobile.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import PropTypes from "prop-types";
3 | import Avatar from "@mui/material/Avatar";
4 | import Button from "@mui/material/Button";
5 | import Divider from "@mui/material/Divider";
6 | import Drawer, { drawerClasses } from "@mui/material/Drawer";
7 | import Stack from "@mui/material/Stack";
8 | import Typography from "@mui/material/Typography";
9 | import LogoutRoundedIcon from "@mui/icons-material/LogoutRounded";
10 | import NotificationsRoundedIcon from "@mui/icons-material/NotificationsRounded";
11 | import MenuButton from "./MenuButton";
12 | import MenuContent from "./MenuContent";
13 | import CardAlert from "./CardAlert";
14 |
15 | function SideMenuMobile({ open, toggleDrawer }) {
16 | return (
17 | theme.zIndex.drawer + 1,
23 | [`& .${drawerClasses.paper}`]: {
24 | backgroundImage: "none",
25 | backgroundColor: "background.paper",
26 | },
27 | }}
28 | >
29 |
35 |
36 |
40 |
46 |
47 | Riley Carter
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | }
65 | >
66 | Logout
67 |
68 |
69 |
70 |
71 | );
72 | }
73 |
74 | SideMenuMobile.propTypes = {
75 | open: PropTypes.bool,
76 | toggleDrawer: PropTypes.func.isRequired,
77 | };
78 |
79 | export default SideMenuMobile;
80 |
--------------------------------------------------------------------------------
/src/dashboard/components/SideMenu.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import Avatar from "@mui/material/Avatar";
4 | import MuiDrawer, { drawerClasses } from "@mui/material/Drawer";
5 | import Box from "@mui/material/Box";
6 | import Divider from "@mui/material/Divider";
7 | import Stack from "@mui/material/Stack";
8 | import Typography from "@mui/material/Typography";
9 | import SelectContent from "./SelectContent";
10 | import MenuContent from "./MenuContent";
11 | import CardAlert from "./CardAlert";
12 | import OptionsMenu from "./OptionsMenu";
13 |
14 | const drawerWidth = 240;
15 |
16 | const Drawer = styled(MuiDrawer)({
17 | width: drawerWidth,
18 | flexShrink: 0,
19 | boxSizing: "border-box",
20 | mt: 10,
21 | [`& .${drawerClasses.paper}`]: {
22 | width: drawerWidth,
23 | boxSizing: "border-box",
24 | },
25 | });
26 |
27 | export default function SideMenu() {
28 | return (
29 |
38 |
45 |
46 |
47 |
48 |
56 |
57 |
58 |
59 |
69 |
75 |
76 |
80 | Riley Carter
81 |
82 |
83 | riley@email.com
84 |
85 |
86 |
87 |
88 |
89 | );
90 | }
91 |
--------------------------------------------------------------------------------
/src/dashboard/components/SideMenu.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import Avatar from "@mui/material/Avatar";
4 | import MuiDrawer, { drawerClasses } from "@mui/material/Drawer";
5 | import Box from "@mui/material/Box";
6 | import Divider from "@mui/material/Divider";
7 | import Stack from "@mui/material/Stack";
8 | import Typography from "@mui/material/Typography";
9 | import SelectContent from "./SelectContent";
10 | import MenuContent from "./MenuContent";
11 | import CardAlert from "./CardAlert";
12 | import OptionsMenu from "./OptionsMenu";
13 |
14 | const drawerWidth = 240;
15 |
16 | const Drawer = styled(MuiDrawer)({
17 | width: drawerWidth,
18 | flexShrink: 0,
19 | boxSizing: "border-box",
20 | mt: 10,
21 | [`& .${drawerClasses.paper}`]: {
22 | width: drawerWidth,
23 | boxSizing: "border-box",
24 | },
25 | });
26 |
27 | export default function SideMenu() {
28 | return (
29 |
38 |
45 |
46 |
47 |
48 |
56 |
57 |
58 |
59 |
69 |
75 |
76 |
80 | Riley Carter
81 |
82 |
83 | riley@email.com
84 |
85 |
86 |
87 |
88 |
89 | );
90 | }
91 |
--------------------------------------------------------------------------------
/src/marketing-page/components/LogoCollection.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Typography from "@mui/material/Typography";
4 | import Grid from "@mui/material/Grid";
5 | import { useTheme } from "@mui/system";
6 |
7 | const whiteLogos = [
8 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560628e8573c43893fe0ace_Sydney-white.svg",
9 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f4d520d0517ae8e8ddf13_Bern-white.svg",
10 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f46794c159024c1af6d44_Montreal-white.svg",
11 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/61f12e891fa22f89efd7477a_TerraLight.svg",
12 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560a09d1f6337b1dfed14ab_colorado-white.svg",
13 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f5caa77bf7d69fb78792e_Ankara-white.svg",
14 | ];
15 |
16 | const darkLogos = [
17 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560628889c3bdf1129952dc_Sydney-black.svg",
18 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f4d4d8b829a89976a419c_Bern-black.svg",
19 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f467502f091ccb929529d_Montreal-black.svg",
20 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/61f12e911fa22f2203d7514c_TerraDark.svg",
21 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560a0990f3717787fd49245_colorado-black.svg",
22 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f5ca4e548b0deb1041c33_Ankara-black.svg",
23 | ];
24 |
25 | const logoStyle = {
26 | width: "100px",
27 | height: "80px",
28 | margin: "0 32px",
29 | opacity: 0.7,
30 | };
31 |
32 | export default function LogoCollection() {
33 | const theme = useTheme();
34 | const logos = theme.palette.mode === "light" ? darkLogos : whiteLogos;
35 |
36 | return (
37 |
38 |
44 | Trusted by the best companies
45 |
46 |
47 | {logos.map((logo, index) => (
48 |
49 |
54 |
55 | ))}
56 |
57 |
58 | );
59 | }
60 |
--------------------------------------------------------------------------------
/src/marketing-page/components/LogoCollection.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Typography from "@mui/material/Typography";
4 | import Grid from "@mui/material/Grid";
5 | import { useTheme } from "@mui/system";
6 |
7 | const whiteLogos = [
8 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560628e8573c43893fe0ace_Sydney-white.svg",
9 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f4d520d0517ae8e8ddf13_Bern-white.svg",
10 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f46794c159024c1af6d44_Montreal-white.svg",
11 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/61f12e891fa22f89efd7477a_TerraLight.svg",
12 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560a09d1f6337b1dfed14ab_colorado-white.svg",
13 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f5caa77bf7d69fb78792e_Ankara-white.svg",
14 | ];
15 |
16 | const darkLogos = [
17 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560628889c3bdf1129952dc_Sydney-black.svg",
18 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f4d4d8b829a89976a419c_Bern-black.svg",
19 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f467502f091ccb929529d_Montreal-black.svg",
20 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/61f12e911fa22f2203d7514c_TerraDark.svg",
21 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/6560a0990f3717787fd49245_colorado-black.svg",
22 | "https://assets-global.website-files.com/61ed56ae9da9fd7e0ef0a967/655f5ca4e548b0deb1041c33_Ankara-black.svg",
23 | ];
24 |
25 | const logoStyle = {
26 | width: "100px",
27 | height: "80px",
28 | margin: "0 32px",
29 | opacity: 0.7,
30 | };
31 |
32 | export default function LogoCollection() {
33 | const theme = useTheme();
34 | const logos = theme.palette.mode === "light" ? darkLogos : whiteLogos;
35 |
36 | return (
37 |
38 |
44 | Trusted by the best companies
45 |
46 |
47 | {logos.map((logo, index) => (
48 |
49 |
54 |
55 | ))}
56 |
57 |
58 | );
59 | }
60 |
--------------------------------------------------------------------------------
/src/crm/components/CrmSideMenu.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import { useNavigate, useLocation } from "react-router-dom";
4 | import Avatar from "@mui/material/Avatar";
5 | import MuiDrawer, { drawerClasses } from "@mui/material/Drawer";
6 | import Box from "@mui/material/Box";
7 | import Divider from "@mui/material/Divider";
8 | import Stack from "@mui/material/Stack";
9 | import Typography from "@mui/material/Typography";
10 | import CrmSelectCompany from "./CrmSelectCompany";
11 | import CrmMenuContent from "./CrmMenuContent";
12 | import CrmOptionsMenu from "./CrmOptionsMenu";
13 |
14 | const drawerWidth = 240;
15 |
16 | const Drawer = styled(MuiDrawer)({
17 | width: drawerWidth,
18 | flexShrink: 0,
19 | boxSizing: "border-box",
20 | mt: 10,
21 | [`& .${drawerClasses.paper}`]: {
22 | width: drawerWidth,
23 | boxSizing: "border-box",
24 | },
25 | });
26 |
27 | export default function CrmSideMenu() {
28 | return (
29 |
38 |
45 |
46 |
47 |
48 |
56 |
57 |
58 |
68 |
74 | AT
75 |
76 |
77 |
81 | Alex Thompson
82 |
83 |
84 | alex@acmecrm.com
85 |
86 |
87 |
88 |
89 |
90 | );
91 | }
92 |
--------------------------------------------------------------------------------
/src/dashboard/components/OptionsMenu.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import Divider, { dividerClasses } from "@mui/material/Divider";
4 | import Menu from "@mui/material/Menu";
5 | import MuiMenuItem from "@mui/material/MenuItem";
6 | import { paperClasses } from "@mui/material/Paper";
7 | import { listClasses } from "@mui/material/List";
8 | import ListItemText from "@mui/material/ListItemText";
9 | import ListItemIcon, { listItemIconClasses } from "@mui/material/ListItemIcon";
10 | import LogoutRoundedIcon from "@mui/icons-material/LogoutRounded";
11 | import MoreVertRoundedIcon from "@mui/icons-material/MoreVertRounded";
12 | import MenuButton from "./MenuButton";
13 |
14 | const MenuItem = styled(MuiMenuItem)({
15 | margin: "2px 0",
16 | });
17 |
18 | export default function OptionsMenu() {
19 | const [anchorEl, setAnchorEl] = React.useState(null);
20 | const open = Boolean(anchorEl);
21 | const handleClick = (event) => {
22 | setAnchorEl(event.currentTarget);
23 | };
24 | const handleClose = () => {
25 | setAnchorEl(null);
26 | };
27 | return (
28 |
29 |
34 |
35 |
36 |
77 |
78 | );
79 | }
80 |
--------------------------------------------------------------------------------
/src/dashboard/components/OptionsMenu.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import Divider, { dividerClasses } from "@mui/material/Divider";
4 | import Menu from "@mui/material/Menu";
5 | import MuiMenuItem from "@mui/material/MenuItem";
6 | import { paperClasses } from "@mui/material/Paper";
7 | import { listClasses } from "@mui/material/List";
8 | import ListItemText from "@mui/material/ListItemText";
9 | import ListItemIcon, { listItemIconClasses } from "@mui/material/ListItemIcon";
10 | import LogoutRoundedIcon from "@mui/icons-material/LogoutRounded";
11 | import MoreVertRoundedIcon from "@mui/icons-material/MoreVertRounded";
12 | import MenuButton from "./MenuButton";
13 |
14 | const MenuItem = styled(MuiMenuItem)({
15 | margin: "2px 0",
16 | });
17 |
18 | export default function OptionsMenu() {
19 | const [anchorEl, setAnchorEl] = React.useState(null);
20 | const open = Boolean(anchorEl);
21 | const handleClick = (event: React.MouseEvent) => {
22 | setAnchorEl(event.currentTarget);
23 | };
24 | const handleClose = () => {
25 | setAnchorEl(null);
26 | };
27 | return (
28 |
29 |
34 |
35 |
36 |
77 |
78 | );
79 | }
80 |
--------------------------------------------------------------------------------
/src/crm/components/CrmCustomerDistributionMap.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { useTheme } from "@mui/material/styles";
3 | import Box from "@mui/material/Box";
4 | import Card from "@mui/material/Card";
5 | import CardContent from "@mui/material/CardContent";
6 | import Typography from "@mui/material/Typography";
7 | import Stack from "@mui/material/Stack";
8 | import Tabs from "@mui/material/Tabs";
9 | import Tab from "@mui/material/Tab";
10 |
11 | export default function CrmCustomerDistributionMap() {
12 | const theme = useTheme();
13 | const [mapView, setMapView] = React.useState("customers");
14 |
15 | const handleChange = (event: React.SyntheticEvent, newValue: string) => {
16 | setMapView(newValue);
17 | };
18 |
19 | return (
20 |
28 |
29 |
36 |
37 | Customer Distribution
38 |
39 |
45 |
51 |
57 |
63 |
64 |
65 |
66 |
80 |
81 | Map visualization would appear here
82 |
83 |
84 |
85 |
86 | );
87 | }
88 |
--------------------------------------------------------------------------------
/src/dashboard/components/PageViewsBarChart.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Card from "@mui/material/Card";
3 | import CardContent from "@mui/material/CardContent";
4 | import Chip from "@mui/material/Chip";
5 | import Typography from "@mui/material/Typography";
6 | import Stack from "@mui/material/Stack";
7 | import { BarChart } from "@mui/x-charts/BarChart";
8 | import { useTheme } from "@mui/material/styles";
9 |
10 | export default function PageViewsBarChart() {
11 | const theme = useTheme();
12 | const colorPalette = [
13 | (theme.vars || theme).palette.primary.dark,
14 | (theme.vars || theme).palette.primary.main,
15 | (theme.vars || theme).palette.primary.light,
16 | ];
17 | return (
18 |
19 |
20 |
21 | Page views and downloads
22 |
23 |
24 |
32 |
33 | 1.3M
34 |
35 |
36 |
37 |
38 | Page views and downloads for the last 6 months
39 |
40 |
41 |
78 |
79 |
80 | );
81 | }
82 |
--------------------------------------------------------------------------------
/src/dashboard/components/PageViewsBarChart.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Card from "@mui/material/Card";
3 | import CardContent from "@mui/material/CardContent";
4 | import Chip from "@mui/material/Chip";
5 | import Typography from "@mui/material/Typography";
6 | import Stack from "@mui/material/Stack";
7 | import { BarChart } from "@mui/x-charts/BarChart";
8 | import { useTheme } from "@mui/material/styles";
9 |
10 | export default function PageViewsBarChart() {
11 | const theme = useTheme();
12 | const colorPalette = [
13 | (theme.vars || theme).palette.primary.dark,
14 | (theme.vars || theme).palette.primary.main,
15 | (theme.vars || theme).palette.primary.light,
16 | ];
17 |
18 | return (
19 |
20 |
21 |
22 | Page views and downloads
23 |
24 |
25 |
33 |
34 | 1.3M
35 |
36 |
37 |
38 |
39 | Page views and downloads for the last 6 months
40 |
41 |
42 |
79 |
80 |
81 | );
82 | }
83 |
--------------------------------------------------------------------------------
/src/checkout/components/Review.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Divider from "@mui/material/Divider";
3 | import Grid from "@mui/material/Grid";
4 | import List from "@mui/material/List";
5 | import ListItem from "@mui/material/ListItem";
6 | import ListItemText from "@mui/material/ListItemText";
7 | import Stack from "@mui/material/Stack";
8 | import Typography from "@mui/material/Typography";
9 |
10 | const addresses = ["1 MUI Drive", "Reactville", "Anytown", "99999", "USA"];
11 | const payments = [
12 | { name: "Card type:", detail: "Visa" },
13 | { name: "Card holder:", detail: "Mr. John Smith" },
14 | { name: "Card number:", detail: "xxxx-xxxx-xxxx-1234" },
15 | { name: "Expiry date:", detail: "04/2024" },
16 | ];
17 |
18 | export default function Review() {
19 | return (
20 |
21 |
22 |
23 |
24 | $134.98
25 |
26 |
27 |
28 | $9.99
29 |
30 |
31 |
32 |
33 | $144.97
34 |
35 |
36 |
37 |
38 | }
41 | spacing={2}
42 | sx={{ my: 2 }}
43 | >
44 |
45 |
46 | Shipment details
47 |
48 | John Smith
49 |
50 | {addresses.join(", ")}
51 |
52 |
53 |
54 |
55 | Payment details
56 |
57 |
58 | {payments.map((payment) => (
59 |
60 |
66 |
67 | {payment.name}
68 |
69 | {payment.detail}
70 |
71 |
72 | ))}
73 |
74 |
75 |
76 |
77 | );
78 | }
79 |
--------------------------------------------------------------------------------
/src/checkout/components/Review.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Divider from "@mui/material/Divider";
3 | import Grid from "@mui/material/Grid";
4 | import List from "@mui/material/List";
5 | import ListItem from "@mui/material/ListItem";
6 | import ListItemText from "@mui/material/ListItemText";
7 | import Stack from "@mui/material/Stack";
8 | import Typography from "@mui/material/Typography";
9 |
10 | const addresses = ["1 MUI Drive", "Reactville", "Anytown", "99999", "USA"];
11 | const payments = [
12 | { name: "Card type:", detail: "Visa" },
13 | { name: "Card holder:", detail: "Mr. John Smith" },
14 | { name: "Card number:", detail: "xxxx-xxxx-xxxx-1234" },
15 | { name: "Expiry date:", detail: "04/2024" },
16 | ];
17 |
18 | export default function Review() {
19 | return (
20 |
21 |
22 |
23 |
24 | $134.98
25 |
26 |
27 |
28 | $9.99
29 |
30 |
31 |
32 |
33 | $144.97
34 |
35 |
36 |
37 |
38 | }
41 | spacing={2}
42 | sx={{ my: 2 }}
43 | >
44 |
45 |
46 | Shipment details
47 |
48 | John Smith
49 |
50 | {addresses.join(", ")}
51 |
52 |
53 |
54 |
55 | Payment details
56 |
57 |
58 | {payments.map((payment) => (
59 |
60 |
66 |
67 | {payment.name}
68 |
69 | {payment.detail}
70 |
71 |
72 | ))}
73 |
74 |
75 |
76 |
77 | );
78 | }
79 |
--------------------------------------------------------------------------------
/src/crm/CrmDashboard.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { Outlet, Routes, Route } from "react-router-dom";
3 | import type {} from "@mui/x-date-pickers/themeAugmentation";
4 | import type {} from "@mui/x-charts/themeAugmentation";
5 | import type {} from "@mui/x-data-grid-pro/themeAugmentation";
6 | import type {} from "@mui/x-tree-view/themeAugmentation";
7 | import { alpha } from "@mui/material/styles";
8 | import CssBaseline from "@mui/material/CssBaseline";
9 | import Box from "@mui/material/Box";
10 | import Stack from "@mui/material/Stack";
11 | import CrmAppNavbar from "./components/CrmAppNavbar";
12 | import CrmHeader from "./components/CrmHeader";
13 | import CrmSideMenu from "./components/CrmSideMenu";
14 | import CrmMainDashboard from "./components/CrmMainDashboard";
15 | import Customers from "./pages/Customers";
16 | import Deals from "./pages/Deals";
17 | import Contacts from "./pages/Contacts";
18 | import Tasks from "./pages/Tasks";
19 | import Reports from "./pages/Reports";
20 | import Settings from "./pages/Settings";
21 | import AppTheme from "../shared-theme/AppTheme";
22 | import {
23 | chartsCustomizations,
24 | dataGridCustomizations,
25 | datePickersCustomizations,
26 | treeViewCustomizations,
27 | } from "../dashboard/theme/customizations";
28 |
29 | const xThemeComponents = {
30 | ...chartsCustomizations,
31 | ...dataGridCustomizations,
32 | ...datePickersCustomizations,
33 | ...treeViewCustomizations,
34 | };
35 |
36 | export default function CrmDashboard() {
37 | return (
38 |
39 |
40 |
41 |
42 |
43 | {/* Main content */}
44 | ({
47 | flexGrow: 1,
48 | backgroundColor: theme.vars
49 | ? `rgba(${theme.vars.palette.background.defaultChannel} / 1)`
50 | : alpha(theme.palette.background.default, 1),
51 | overflow: "auto",
52 | })}
53 | >
54 |
63 |
64 |
65 | } />
66 | } />
67 | } />
68 | } />
69 | } />
70 | } />
71 | } />
72 |
73 |
74 |
75 |
76 |
77 |
78 | );
79 | }
80 |
--------------------------------------------------------------------------------
/src/crm/components/CrmDateRangePicker.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import Button from "@mui/material/Button";
4 | import Menu from "@mui/material/Menu";
5 | import MenuItem from "@mui/material/MenuItem";
6 | import CalendarTodayRoundedIcon from "@mui/icons-material/CalendarTodayRounded";
7 | import ArrowDropDownRoundedIcon from "@mui/icons-material/ArrowDropDownRounded";
8 |
9 | const StyledButton = styled(Button)(({ theme }) => ({
10 | textTransform: "none",
11 | backgroundColor: theme.palette.background.paper,
12 | border: `1px solid ${theme.palette.divider}`,
13 | "&:hover": {
14 | backgroundColor: theme.palette.action.hover,
15 | },
16 | ...theme.applyStyles("dark", {
17 | backgroundColor: "transparent",
18 | border: `1px solid ${theme.palette.divider}`,
19 | }),
20 | }));
21 |
22 | const dateRanges = [
23 | { label: "Today", value: "today" },
24 | { label: "Yesterday", value: "yesterday" },
25 | { label: "This Week", value: "thisWeek" },
26 | { label: "Last Week", value: "lastWeek" },
27 | { label: "This Month", value: "thisMonth" },
28 | { label: "Last Month", value: "lastMonth" },
29 | { label: "This Quarter", value: "thisQuarter" },
30 | { label: "Last Quarter", value: "lastQuarter" },
31 | { label: "This Year", value: "thisYear" },
32 | { label: "Custom Range", value: "custom" },
33 | ];
34 |
35 | export default function CrmDateRangePicker() {
36 | const [anchorEl, setAnchorEl] = React.useState(null);
37 | const [selectedRange, setSelectedRange] = React.useState(dateRanges[4]); // Default to "This Month"
38 | const open = Boolean(anchorEl);
39 |
40 | const handleClick = (event: React.MouseEvent) => {
41 | setAnchorEl(event.currentTarget);
42 | };
43 |
44 | const handleClose = () => {
45 | setAnchorEl(null);
46 | };
47 |
48 | const handleRangeSelect = (range: (typeof dateRanges)[0]) => {
49 | setSelectedRange(range);
50 | handleClose();
51 | };
52 |
53 | return (
54 |
55 | }
62 | startIcon={}
63 | size="small"
64 | >
65 | {selectedRange.label}
66 |
67 |
86 |
87 | );
88 | }
89 |
--------------------------------------------------------------------------------
/src/shared-theme/ColorModeIconDropdown.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import DarkModeIcon from "@mui/icons-material/DarkModeRounded";
3 | import LightModeIcon from "@mui/icons-material/LightModeRounded";
4 | import Box from "@mui/material/Box";
5 | import IconButton, { IconButtonOwnProps } from "@mui/material/IconButton";
6 | import Menu from "@mui/material/Menu";
7 | import MenuItem from "@mui/material/MenuItem";
8 | import { useColorScheme } from "@mui/material/styles";
9 |
10 | export default function ColorModeIconDropdown(props: IconButtonOwnProps) {
11 | const { mode, systemMode, setMode } = useColorScheme();
12 | const [anchorEl, setAnchorEl] = React.useState(null);
13 | const open = Boolean(anchorEl);
14 | const handleClick = (event: React.MouseEvent) => {
15 | setAnchorEl(event.currentTarget);
16 | };
17 | const handleClose = () => {
18 | setAnchorEl(null);
19 | };
20 | const handleMode = (targetMode: "system" | "light" | "dark") => () => {
21 | setMode(targetMode);
22 | handleClose();
23 | };
24 | if (!mode) {
25 | return (
26 | ({
29 | verticalAlign: "bottom",
30 | display: "inline-flex",
31 | width: "2.25rem",
32 | height: "2.25rem",
33 | borderRadius: (theme.vars || theme).shape.borderRadius,
34 | border: "1px solid",
35 | borderColor: (theme.vars || theme).palette.divider,
36 | })}
37 | />
38 | );
39 | }
40 | const resolvedMode = (systemMode || mode) as "light" | "dark";
41 | const icon = {
42 | light: ,
43 | dark: ,
44 | }[resolvedMode];
45 | return (
46 |
47 |
57 | {icon}
58 |
59 |
87 |
88 | );
89 | }
90 |
--------------------------------------------------------------------------------
/src/dashboard/components/MainGrid.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Grid from "@mui/material/Grid";
3 | import Box from "@mui/material/Box";
4 | import Stack from "@mui/material/Stack";
5 | import Typography from "@mui/material/Typography";
6 | import Copyright from "../internals/components/Copyright";
7 | import ChartUserByCountry from "./ChartUserByCountry";
8 | import CustomizedTreeView from "./CustomizedTreeView";
9 | import CustomizedDataGrid from "./CustomizedDataGrid";
10 | import HighlightedCard from "./HighlightedCard";
11 | import PageViewsBarChart from "./PageViewsBarChart";
12 | import SessionsChart from "./SessionsChart";
13 | import StatCard from "./StatCard";
14 |
15 | const data = [
16 | {
17 | title: "Users",
18 | value: "14k",
19 | interval: "Last 30 days",
20 | trend: "up",
21 | data: [
22 | 200, 24, 220, 260, 240, 380, 100, 240, 280, 240, 300, 340, 320, 360, 340,
23 | 380, 360, 400, 380, 420, 400, 640, 340, 460, 440, 480, 460, 600, 880, 920,
24 | ],
25 | },
26 | {
27 | title: "Conversions",
28 | value: "325",
29 | interval: "Last 30 days",
30 | trend: "down",
31 | data: [
32 | 1640, 1250, 970, 1130, 1050, 900, 720, 1080, 900, 450, 920, 820, 840, 600,
33 | 820, 780, 800, 760, 380, 740, 660, 620, 840, 500, 520, 480, 400, 360, 300,
34 | 220,
35 | ],
36 | },
37 | {
38 | title: "Event count",
39 | value: "200k",
40 | interval: "Last 30 days",
41 | trend: "neutral",
42 | data: [
43 | 500, 400, 510, 530, 520, 600, 530, 520, 510, 730, 520, 510, 530, 620, 510,
44 | 530, 520, 410, 530, 520, 610, 530, 520, 610, 530, 420, 510, 430, 520, 510,
45 | ],
46 | },
47 | ];
48 |
49 | export default function MainGrid() {
50 | return (
51 |
52 | {/* cards */}
53 |
54 | Overview
55 |
56 | theme.spacing(2) }}
61 | >
62 | {data.map((card, index) => (
63 |
64 |
65 |
66 | ))}
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | Details
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 | );
94 | }
95 |
--------------------------------------------------------------------------------
/src/dashboard/components/MainGrid.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Grid from "@mui/material/Grid";
3 | import Box from "@mui/material/Box";
4 | import Stack from "@mui/material/Stack";
5 | import Typography from "@mui/material/Typography";
6 | import Copyright from "../internals/components/Copyright";
7 | import ChartUserByCountry from "./ChartUserByCountry";
8 | import CustomizedTreeView from "./CustomizedTreeView";
9 | import CustomizedDataGrid from "./CustomizedDataGrid";
10 | import HighlightedCard from "./HighlightedCard";
11 | import PageViewsBarChart from "./PageViewsBarChart";
12 | import SessionsChart from "./SessionsChart";
13 | import StatCard, { StatCardProps } from "./StatCard";
14 |
15 | const data: StatCardProps[] = [
16 | {
17 | title: "Users",
18 | value: "14k",
19 | interval: "Last 30 days",
20 | trend: "up",
21 | data: [
22 | 200, 24, 220, 260, 240, 380, 100, 240, 280, 240, 300, 340, 320, 360, 340,
23 | 380, 360, 400, 380, 420, 400, 640, 340, 460, 440, 480, 460, 600, 880, 920,
24 | ],
25 | },
26 | {
27 | title: "Conversions",
28 | value: "325",
29 | interval: "Last 30 days",
30 | trend: "down",
31 | data: [
32 | 1640, 1250, 970, 1130, 1050, 900, 720, 1080, 900, 450, 920, 820, 840, 600,
33 | 820, 780, 800, 760, 380, 740, 660, 620, 840, 500, 520, 480, 400, 360, 300,
34 | 220,
35 | ],
36 | },
37 | {
38 | title: "Event count",
39 | value: "200k",
40 | interval: "Last 30 days",
41 | trend: "neutral",
42 | data: [
43 | 500, 400, 510, 530, 520, 600, 530, 520, 510, 730, 520, 510, 530, 620, 510,
44 | 530, 520, 410, 530, 520, 610, 530, 520, 610, 530, 420, 510, 430, 520, 510,
45 | ],
46 | },
47 | ];
48 |
49 | export default function MainGrid() {
50 | return (
51 |
52 | {/* cards */}
53 |
54 | Overview
55 |
56 | theme.spacing(2) }}
61 | >
62 | {data.map((card, index) => (
63 |
64 |
65 |
66 | ))}
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | Details
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 | );
94 | }
95 |
--------------------------------------------------------------------------------
/src/crm/components/CrmAppNavbar.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import AppBar from "@mui/material/AppBar";
4 | import Box from "@mui/material/Box";
5 | import Stack from "@mui/material/Stack";
6 | import MuiToolbar from "@mui/material/Toolbar";
7 | import { tabsClasses } from "@mui/material/Tabs";
8 | import Typography from "@mui/material/Typography";
9 | import MenuRoundedIcon from "@mui/icons-material/MenuRounded";
10 | import BusinessRoundedIcon from "@mui/icons-material/BusinessRounded";
11 | import CrmSideMenuMobile from "./CrmSideMenuMobile";
12 | import MenuButton from "../../dashboard/components/MenuButton";
13 | import ColorModeIconDropdown from "../../shared-theme/ColorModeIconDropdown";
14 |
15 | const Toolbar = styled(MuiToolbar)({
16 | width: "100%",
17 | padding: "12px",
18 | display: "flex",
19 | flexDirection: "column",
20 | alignItems: "start",
21 | justifyContent: "center",
22 | gap: "12px",
23 | flexShrink: 0,
24 | [`& ${tabsClasses.flexContainer}`]: {
25 | gap: "8px",
26 | p: "8px",
27 | pb: 0,
28 | },
29 | });
30 |
31 | export default function CrmAppNavbar() {
32 | const [open, setOpen] = React.useState(false);
33 |
34 | const toggleDrawer = (newOpen: boolean) => () => {
35 | setOpen(newOpen);
36 | };
37 |
38 | return (
39 |
51 |
52 |
61 |
66 |
67 |
72 | Acme CRM
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 | );
84 | }
85 |
86 | export function CrmLogo() {
87 | return (
88 |
101 |
102 |
103 | );
104 | }
105 |
--------------------------------------------------------------------------------
/src/crm/components/CrmMenuContent.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { useNavigate, useLocation } from "react-router-dom";
3 | import Box from "@mui/material/Box"; // Added the missing import
4 | import List from "@mui/material/List";
5 | import ListItem from "@mui/material/ListItem";
6 | import ListItemButton from "@mui/material/ListItemButton";
7 | import ListItemIcon from "@mui/material/ListItemIcon";
8 | import ListItemText from "@mui/material/ListItemText";
9 | import Stack from "@mui/material/Stack";
10 | import Divider from "@mui/material/Divider";
11 | import DashboardRoundedIcon from "@mui/icons-material/DashboardRounded";
12 | import PeopleRoundedIcon from "@mui/icons-material/PeopleRounded";
13 | import BusinessCenterRoundedIcon from "@mui/icons-material/BusinessCenterRounded";
14 | import ContactsRoundedIcon from "@mui/icons-material/ContactsRounded";
15 | import AssignmentRoundedIcon from "@mui/icons-material/AssignmentRounded";
16 | import AssessmentRoundedIcon from "@mui/icons-material/AssessmentRounded";
17 | import SettingsRoundedIcon from "@mui/icons-material/SettingsRounded";
18 | import HelpOutlineRoundedIcon from "@mui/icons-material/HelpOutlineRounded";
19 |
20 | const mainListItems = [
21 | { text: "Dashboard", icon: , path: "/" },
22 | { text: "Customers", icon: , path: "/customers" },
23 | { text: "Deals", icon: , path: "/deals" },
24 | { text: "Contacts", icon: , path: "/contacts" },
25 | { text: "Tasks", icon: , path: "/tasks" },
26 | { text: "Reports", icon: , path: "/reports" },
27 | ];
28 |
29 | const secondaryListItems = [
30 | { text: "Settings", icon: , path: "/settings" },
31 | { text: "Help & Support", icon: , path: "/help" },
32 | ];
33 |
34 | export default function CrmMenuContent() {
35 | const navigate = useNavigate();
36 | const location = useLocation();
37 |
38 | const handleNavigation = (path: string) => {
39 | navigate(path);
40 | };
41 |
42 | return (
43 |
44 |
45 | {mainListItems.map((item, index) => (
46 |
47 | handleNavigation(item.path)}
50 | >
51 | {item.icon}
52 |
53 |
54 |
55 | ))}
56 |
57 |
58 |
59 |
60 | {secondaryListItems.map((item, index) => (
61 |
62 | handleNavigation(item.path)}
65 | >
66 | {item.icon}
67 |
68 |
69 |
70 | ))}
71 |
72 |
73 |
74 | );
75 | }
76 |
--------------------------------------------------------------------------------
/src/shared-theme/customizations/surfaces.ts:
--------------------------------------------------------------------------------
1 | import { alpha, Theme, Components } from "@mui/material/styles";
2 | import { gray } from "../themePrimitives";
3 |
4 | /* eslint-disable import/prefer-default-export */
5 | export const surfacesCustomizations: Components = {
6 | MuiAccordion: {
7 | defaultProps: {
8 | elevation: 0,
9 | disableGutters: true,
10 | },
11 | styleOverrides: {
12 | root: ({ theme }) => ({
13 | padding: 4,
14 | overflow: "clip",
15 | backgroundColor: (theme.vars || theme).palette.background.default,
16 | border: "1px solid",
17 | borderColor: (theme.vars || theme).palette.divider,
18 | ":before": {
19 | backgroundColor: "transparent",
20 | },
21 | "&:not(:last-of-type)": {
22 | borderBottom: "none",
23 | },
24 | "&:first-of-type": {
25 | borderTopLeftRadius: (theme.vars || theme).shape.borderRadius,
26 | borderTopRightRadius: (theme.vars || theme).shape.borderRadius,
27 | },
28 | "&:last-of-type": {
29 | borderBottomLeftRadius: (theme.vars || theme).shape.borderRadius,
30 | borderBottomRightRadius: (theme.vars || theme).shape.borderRadius,
31 | },
32 | }),
33 | },
34 | },
35 | MuiAccordionSummary: {
36 | styleOverrides: {
37 | root: ({ theme }) => ({
38 | border: "none",
39 | borderRadius: 8,
40 | "&:hover": { backgroundColor: gray[50] },
41 | "&:focus-visible": { backgroundColor: "transparent" },
42 | ...theme.applyStyles("dark", {
43 | "&:hover": { backgroundColor: gray[800] },
44 | }),
45 | }),
46 | },
47 | },
48 | MuiAccordionDetails: {
49 | styleOverrides: {
50 | root: { mb: 20, border: "none" },
51 | },
52 | },
53 | MuiPaper: {
54 | defaultProps: {
55 | elevation: 0,
56 | },
57 | },
58 | MuiCard: {
59 | styleOverrides: {
60 | root: ({ theme }) => {
61 | return {
62 | padding: 16,
63 | gap: 16,
64 | transition: "all 100ms ease",
65 | backgroundColor: gray[50],
66 | borderRadius: (theme.vars || theme).shape.borderRadius,
67 | border: `1px solid ${(theme.vars || theme).palette.divider}`,
68 | boxShadow: "none",
69 | ...theme.applyStyles("dark", {
70 | backgroundColor: gray[800],
71 | }),
72 | variants: [
73 | {
74 | props: {
75 | variant: "outlined",
76 | },
77 | style: {
78 | border: `1px solid ${(theme.vars || theme).palette.divider}`,
79 | boxShadow: "none",
80 | background: "hsl(0, 0%, 100%)",
81 | ...theme.applyStyles("dark", {
82 | background: alpha(gray[900], 0.4),
83 | }),
84 | },
85 | },
86 | ],
87 | };
88 | },
89 | },
90 | },
91 | MuiCardContent: {
92 | styleOverrides: {
93 | root: {
94 | padding: 0,
95 | "&:last-child": { paddingBottom: 0 },
96 | },
97 | },
98 | },
99 | MuiCardHeader: {
100 | styleOverrides: {
101 | root: {
102 | padding: 0,
103 | },
104 | },
105 | },
106 | MuiCardActions: {
107 | styleOverrides: {
108 | root: {
109 | padding: 0,
110 | },
111 | },
112 | },
113 | };
114 |
--------------------------------------------------------------------------------
/src/dashboard/components/AppNavbar.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import AppBar from "@mui/material/AppBar";
4 | import Box from "@mui/material/Box";
5 | import Stack from "@mui/material/Stack";
6 | import MuiToolbar from "@mui/material/Toolbar";
7 | import { tabsClasses } from "@mui/material/Tabs";
8 | import Typography from "@mui/material/Typography";
9 | import MenuRoundedIcon from "@mui/icons-material/MenuRounded";
10 | import DashboardRoundedIcon from "@mui/icons-material/DashboardRounded";
11 | import SideMenuMobile from "./SideMenuMobile";
12 | import MenuButton from "./MenuButton";
13 | import ColorModeIconDropdown from "../../shared-theme/ColorModeIconDropdown";
14 |
15 | const Toolbar = styled(MuiToolbar)({
16 | width: "100%",
17 | padding: "12px",
18 | display: "flex",
19 | flexDirection: "column",
20 | alignItems: "start",
21 | justifyContent: "center",
22 | gap: "12px",
23 | flexShrink: 0,
24 | [`& ${tabsClasses.flexContainer}`]: {
25 | gap: "8px",
26 | p: "8px",
27 | pb: 0,
28 | },
29 | });
30 |
31 | export default function AppNavbar() {
32 | const [open, setOpen] = React.useState(false);
33 |
34 | const toggleDrawer = (newOpen) => () => {
35 | setOpen(newOpen);
36 | };
37 |
38 | return (
39 |
51 |
52 |
61 |
66 |
67 |
72 | Dashboard
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 | );
84 | }
85 |
86 | export function CustomIcon() {
87 | return (
88 |
106 |
107 |
108 | );
109 | }
110 |
--------------------------------------------------------------------------------
/src/dashboard/components/AppNavbar.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { styled } from "@mui/material/styles";
3 | import AppBar from "@mui/material/AppBar";
4 | import Box from "@mui/material/Box";
5 | import Stack from "@mui/material/Stack";
6 | import MuiToolbar from "@mui/material/Toolbar";
7 | import { tabsClasses } from "@mui/material/Tabs";
8 | import Typography from "@mui/material/Typography";
9 | import MenuRoundedIcon from "@mui/icons-material/MenuRounded";
10 | import DashboardRoundedIcon from "@mui/icons-material/DashboardRounded";
11 | import SideMenuMobile from "./SideMenuMobile";
12 | import MenuButton from "./MenuButton";
13 | import ColorModeIconDropdown from "../../shared-theme/ColorModeIconDropdown";
14 |
15 | const Toolbar = styled(MuiToolbar)({
16 | width: "100%",
17 | padding: "12px",
18 | display: "flex",
19 | flexDirection: "column",
20 | alignItems: "start",
21 | justifyContent: "center",
22 | gap: "12px",
23 | flexShrink: 0,
24 | [`& ${tabsClasses.flexContainer}`]: {
25 | gap: "8px",
26 | p: "8px",
27 | pb: 0,
28 | },
29 | });
30 |
31 | export default function AppNavbar() {
32 | const [open, setOpen] = React.useState(false);
33 |
34 | const toggleDrawer = (newOpen: boolean) => () => {
35 | setOpen(newOpen);
36 | };
37 |
38 | return (
39 |
51 |
52 |
61 |
66 |
67 |
72 | Dashboard
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 | );
84 | }
85 |
86 | export function CustomIcon() {
87 | return (
88 |
106 |
107 |
108 | );
109 | }
110 |
--------------------------------------------------------------------------------
/src/dashboard/components/SelectContent.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import MuiAvatar from "@mui/material/Avatar";
3 | import MuiListItemAvatar from "@mui/material/ListItemAvatar";
4 | import MenuItem from "@mui/material/MenuItem";
5 | import ListItemText from "@mui/material/ListItemText";
6 | import ListItemIcon from "@mui/material/ListItemIcon";
7 | import ListSubheader from "@mui/material/ListSubheader";
8 | import Select, { selectClasses } from "@mui/material/Select";
9 | import Divider from "@mui/material/Divider";
10 | import { styled } from "@mui/material/styles";
11 | import AddRoundedIcon from "@mui/icons-material/AddRounded";
12 | import DevicesRoundedIcon from "@mui/icons-material/DevicesRounded";
13 | import SmartphoneRoundedIcon from "@mui/icons-material/SmartphoneRounded";
14 | import ConstructionRoundedIcon from "@mui/icons-material/ConstructionRounded";
15 |
16 | const Avatar = styled(MuiAvatar)(({ theme }) => ({
17 | width: 28,
18 | height: 28,
19 | backgroundColor: (theme.vars || theme).palette.background.paper,
20 | color: (theme.vars || theme).palette.text.secondary,
21 | border: `1px solid ${(theme.vars || theme).palette.divider}`,
22 | }));
23 |
24 | const ListItemAvatar = styled(MuiListItemAvatar)({
25 | minWidth: 0,
26 | marginRight: 12,
27 | });
28 |
29 | export default function SelectContent() {
30 | const [company, setCompany] = React.useState("");
31 |
32 | const handleChange = (event) => {
33 | setCompany(event.target.value);
34 | };
35 |
36 | return (
37 |
101 | );
102 | }
103 |
--------------------------------------------------------------------------------
/src/dashboard/components/SelectContent.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import MuiAvatar from "@mui/material/Avatar";
3 | import MuiListItemAvatar from "@mui/material/ListItemAvatar";
4 | import MenuItem from "@mui/material/MenuItem";
5 | import ListItemText from "@mui/material/ListItemText";
6 | import ListItemIcon from "@mui/material/ListItemIcon";
7 | import ListSubheader from "@mui/material/ListSubheader";
8 | import Select, { SelectChangeEvent, selectClasses } from "@mui/material/Select";
9 | import Divider from "@mui/material/Divider";
10 | import { styled } from "@mui/material/styles";
11 | import AddRoundedIcon from "@mui/icons-material/AddRounded";
12 | import DevicesRoundedIcon from "@mui/icons-material/DevicesRounded";
13 | import SmartphoneRoundedIcon from "@mui/icons-material/SmartphoneRounded";
14 | import ConstructionRoundedIcon from "@mui/icons-material/ConstructionRounded";
15 |
16 | const Avatar = styled(MuiAvatar)(({ theme }) => ({
17 | width: 28,
18 | height: 28,
19 | backgroundColor: (theme.vars || theme).palette.background.paper,
20 | color: (theme.vars || theme).palette.text.secondary,
21 | border: `1px solid ${(theme.vars || theme).palette.divider}`,
22 | }));
23 |
24 | const ListItemAvatar = styled(MuiListItemAvatar)({
25 | minWidth: 0,
26 | marginRight: 12,
27 | });
28 |
29 | export default function SelectContent() {
30 | const [company, setCompany] = React.useState("");
31 |
32 | const handleChange = (event: SelectChangeEvent) => {
33 | setCompany(event.target.value as string);
34 | };
35 |
36 | return (
37 |
101 | );
102 | }
103 |
--------------------------------------------------------------------------------
/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/crm/components/CrmActivitiesTimeline.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Card from "@mui/material/Card";
4 | import CardContent from "@mui/material/CardContent";
5 | import Typography from "@mui/material/Typography";
6 | import Stack from "@mui/material/Stack";
7 | import Button from "@mui/material/Button";
8 | import ArrowForwardRoundedIcon from "@mui/icons-material/ArrowForwardRounded";
9 | import EmailRoundedIcon from "@mui/icons-material/EmailRounded";
10 | import PhoneRoundedIcon from "@mui/icons-material/PhoneRounded";
11 | import MeetingRoomRoundedIcon from "@mui/icons-material/MeetingRoomRounded";
12 | import EditNoteRoundedIcon from "@mui/icons-material/EditNoteRounded";
13 |
14 | // Sample activities data
15 | const activities = [
16 | {
17 | id: 1,
18 | type: "email",
19 | title: "Email sent to Acme Corp",
20 | description: "Proposal follow-up email sent",
21 | time: "11:30 AM",
22 | icon: ,
23 | color: "primary",
24 | },
25 | {
26 | id: 2,
27 | type: "call",
28 | title: "Call with TechSolutions Inc",
29 | description: "Discussed implementation timeline",
30 | time: "10:15 AM",
31 | icon: ,
32 | color: "success",
33 | },
34 | {
35 | id: 3,
36 | type: "meeting",
37 | title: "Meeting scheduled",
38 | description: "Demo for Global Media next Monday",
39 | time: "Yesterday",
40 | icon: ,
41 | color: "warning",
42 | },
43 | {
44 | id: 4,
45 | type: "note",
46 | title: "Note added",
47 | description: "Added details about RetailGiant requirements",
48 | time: "Yesterday",
49 | icon: ,
50 | color: "info",
51 | },
52 | ];
53 |
54 | export default function CrmActivitiesTimeline() {
55 | return (
56 |
64 |
65 |
72 |
73 | Recent Activities
74 |
75 | } size="small">
76 | View All
77 |
78 |
79 |
80 |
81 | {activities.map((activity) => (
82 |
91 |
100 | {activity.icon}
101 |
102 |
103 |
104 |
105 | {activity.title}
106 |
107 |
108 | {activity.time}
109 |
110 |
111 |
112 | {activity.description}
113 |
114 |
115 |
116 | ))}
117 |
118 |
119 |
120 | );
121 | }
122 |
--------------------------------------------------------------------------------
/src/checkout/components/AddressForm.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Checkbox from "@mui/material/Checkbox";
3 | import FormControlLabel from "@mui/material/FormControlLabel";
4 | import FormLabel from "@mui/material/FormLabel";
5 | import Grid from "@mui/material/Grid";
6 | import OutlinedInput from "@mui/material/OutlinedInput";
7 | import { styled } from "@mui/material/styles";
8 |
9 | const FormGrid = styled(Grid)(() => ({
10 | display: "flex",
11 | flexDirection: "column",
12 | }));
13 |
14 | export default function AddressForm() {
15 | return (
16 |
17 |
18 |
19 | First name
20 |
21 |
30 |
31 |
32 |
33 | Last name
34 |
35 |
44 |
45 |
46 |
47 | Address line 1
48 |
49 |
58 |
59 |
60 | Address line 2
61 |
70 |
71 |
72 |
73 | City
74 |
75 |
84 |
85 |
86 |
87 | State
88 |
89 |
98 |
99 |
100 |
101 | Zip / Postal code
102 |
103 |
112 |
113 |
114 |
115 | Country
116 |
117 |
126 |
127 |
128 | }
130 | label="Use this address for payment details"
131 | />
132 |
133 |
134 | );
135 | }
136 |
--------------------------------------------------------------------------------
/src/checkout/components/AddressForm.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Checkbox from "@mui/material/Checkbox";
3 | import FormControlLabel from "@mui/material/FormControlLabel";
4 | import FormLabel from "@mui/material/FormLabel";
5 | import Grid from "@mui/material/Grid";
6 | import OutlinedInput from "@mui/material/OutlinedInput";
7 | import { styled } from "@mui/material/styles";
8 |
9 | const FormGrid = styled(Grid)(() => ({
10 | display: "flex",
11 | flexDirection: "column",
12 | }));
13 |
14 | export default function AddressForm() {
15 | return (
16 |
17 |
18 |
19 | First name
20 |
21 |
30 |
31 |
32 |
33 | Last name
34 |
35 |
44 |
45 |
46 |
47 | Address line 1
48 |
49 |
58 |
59 |
60 | Address line 2
61 |
70 |
71 |
72 |
73 | City
74 |
75 |
84 |
85 |
86 |
87 | State
88 |
89 |
98 |
99 |
100 |
101 | Zip / Postal code
102 |
103 |
112 |
113 |
114 |
115 | Country
116 |
117 |
126 |
127 |
128 | }
130 | label="Use this address for payment details"
131 | />
132 |
133 |
134 | );
135 | }
136 |
--------------------------------------------------------------------------------
/src/dashboard/components/StatCard.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { useTheme } from "@mui/material/styles";
3 | import Box from "@mui/material/Box";
4 | import Card from "@mui/material/Card";
5 | import CardContent from "@mui/material/CardContent";
6 | import Chip from "@mui/material/Chip";
7 | import Stack from "@mui/material/Stack";
8 | import Typography from "@mui/material/Typography";
9 | import { SparkLineChart } from "@mui/x-charts/SparkLineChart";
10 | import { areaElementClasses } from "@mui/x-charts/LineChart";
11 |
12 | export type StatCardProps = {
13 | title: string;
14 | value: string;
15 | interval: string;
16 | trend: "up" | "down" | "neutral";
17 | data: number[];
18 | };
19 |
20 | function getDaysInMonth(month: number, year: number) {
21 | const date = new Date(year, month, 0);
22 | const monthName = date.toLocaleDateString("en-US", {
23 | month: "short",
24 | });
25 | const daysInMonth = date.getDate();
26 | const days = [];
27 | let i = 1;
28 | while (days.length < daysInMonth) {
29 | days.push(`${monthName} ${i}`);
30 | i += 1;
31 | }
32 | return days;
33 | }
34 |
35 | function AreaGradient({ color, id }: { color: string; id: string }) {
36 | return (
37 |
38 |
39 |
40 |
41 |
42 |
43 | );
44 | }
45 |
46 | export default function StatCard({
47 | title,
48 | value,
49 | interval,
50 | trend,
51 | data,
52 | }: StatCardProps) {
53 | const theme = useTheme();
54 | const daysInWeek = getDaysInMonth(4, 2024);
55 |
56 | const trendColors = {
57 | up:
58 | theme.palette.mode === "light"
59 | ? theme.palette.success.main
60 | : theme.palette.success.dark,
61 | down:
62 | theme.palette.mode === "light"
63 | ? theme.palette.error.main
64 | : theme.palette.error.dark,
65 | neutral:
66 | theme.palette.mode === "light"
67 | ? theme.palette.grey[400]
68 | : theme.palette.grey[700],
69 | };
70 |
71 | const labelColors = {
72 | up: "success" as const,
73 | down: "error" as const,
74 | neutral: "default" as const,
75 | };
76 |
77 | const color = labelColors[trend];
78 | const chartColor = trendColors[trend];
79 | const trendValues = { up: "+25%", down: "-25%", neutral: "+5%" };
80 |
81 | return (
82 |
83 |
84 |
85 | {title}
86 |
87 |
91 |
92 |
96 |
97 | {value}
98 |
99 |
100 |
101 |
102 | {interval}
103 |
104 |
105 |
106 |
122 |
123 |
124 |
125 |
126 |
127 |
128 | );
129 | }
130 |
--------------------------------------------------------------------------------
/src/crm/components/CrmMainDashboard.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Grid from "@mui/material/Grid";
3 | import Box from "@mui/material/Box";
4 | import Stack from "@mui/material/Stack";
5 | import Typography from "@mui/material/Typography";
6 | import Button from "@mui/material/Button";
7 | import AddRoundedIcon from "@mui/icons-material/AddRounded";
8 | import Copyright from "../../dashboard/internals/components/Copyright";
9 | import CrmStatCard from "./CrmStatCard";
10 | import CrmRecentDealsTable from "./CrmRecentDealsTable";
11 | import CrmUpcomingTasks from "./CrmUpcomingTasks";
12 | import CrmSalesChart from "./CrmSalesChart";
13 | import CrmLeadsBySourceChart from "./CrmLeadsBySourceChart";
14 |
15 | // Sample data for stat cards
16 | const statCardsData = [
17 | {
18 | title: "Total Customers",
19 | value: "2,543",
20 | interval: "Last 30 days",
21 | trend: "up",
22 | trendValue: "+15%",
23 | data: [
24 | 200, 240, 260, 280, 300, 320, 340, 360, 380, 400, 420, 440, 460, 480, 500,
25 | 520, 540, 560, 580, 600, 620, 640, 660, 680, 700, 720, 740, 760, 780, 800,
26 | ],
27 | },
28 | {
29 | title: "Deals Won",
30 | value: "$542K",
31 | interval: "Last 30 days",
32 | trend: "up",
33 | trendValue: "+23%",
34 | data: [
35 | 400, 420, 440, 460, 480, 500, 520, 540, 560, 580, 600, 620, 640, 660, 680,
36 | 700, 720, 740, 760, 780, 800, 820, 840, 860, 880, 900, 920, 940, 960, 980,
37 | ],
38 | },
39 | {
40 | title: "New Leads",
41 | value: "456",
42 | interval: "Last 30 days",
43 | trend: "up",
44 | trendValue: "+12%",
45 | data: [
46 | 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440,
47 | 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590,
48 | ],
49 | },
50 | {
51 | title: "Conversion Rate",
52 | value: "28%",
53 | interval: "Last 30 days",
54 | trend: "down",
55 | trendValue: "-5%",
56 | data: [
57 | 35, 33, 32, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 22, 23, 24, 25, 26,
58 | 27, 28, 29, 30, 29, 28, 27, 26, 25, 24, 23, 22,
59 | ],
60 | },
61 | ];
62 |
63 | export default function CrmMainDashboard() {
64 | return (
65 |
66 | {/* Header with action buttons */}
67 |
73 |
74 | Dashboard Overview
75 |
76 |
77 | }
80 | sx={{ mr: 1 }}
81 | >
82 | New Lead
83 |
84 | }>
85 | New Deal
86 |
87 |
88 |
89 |
90 | {/* Stats Cards row */}
91 |
92 | {statCardsData.map((card, index) => (
93 |
94 |
102 |
103 | ))}
104 |
105 |
106 | {/* Charts row */}
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 | {/* Tables & Other content */}
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 | );
131 | }
132 |
--------------------------------------------------------------------------------
/src/dashboard/components/StatCard.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import PropTypes from "prop-types";
3 | import { useTheme } from "@mui/material/styles";
4 | import Box from "@mui/material/Box";
5 | import Card from "@mui/material/Card";
6 | import CardContent from "@mui/material/CardContent";
7 | import Chip from "@mui/material/Chip";
8 | import Stack from "@mui/material/Stack";
9 | import Typography from "@mui/material/Typography";
10 | import { SparkLineChart } from "@mui/x-charts/SparkLineChart";
11 | import { areaElementClasses } from "@mui/x-charts/LineChart";
12 |
13 | function getDaysInMonth(month, year) {
14 | const date = new Date(year, month, 0);
15 | const monthName = date.toLocaleDateString("en-US", {
16 | month: "short",
17 | });
18 | const daysInMonth = date.getDate();
19 | const days = [];
20 | let i = 1;
21 | while (days.length < daysInMonth) {
22 | days.push(`${monthName} ${i}`);
23 | i += 1;
24 | }
25 | return days;
26 | }
27 |
28 | function AreaGradient({ color, id }) {
29 | return (
30 |
31 |
32 |
33 |
34 |
35 |
36 | );
37 | }
38 |
39 | AreaGradient.propTypes = {
40 | color: PropTypes.string.isRequired,
41 | id: PropTypes.string.isRequired,
42 | };
43 |
44 | function StatCard({ title, value, interval, trend, data }) {
45 | const theme = useTheme();
46 | const daysInWeek = getDaysInMonth(4, 2024);
47 |
48 | const trendColors = {
49 | up:
50 | theme.palette.mode === "light"
51 | ? theme.palette.success.main
52 | : theme.palette.success.dark,
53 | down:
54 | theme.palette.mode === "light"
55 | ? theme.palette.error.main
56 | : theme.palette.error.dark,
57 | neutral:
58 | theme.palette.mode === "light"
59 | ? theme.palette.grey[400]
60 | : theme.palette.grey[700],
61 | };
62 |
63 | const labelColors = {
64 | up: "success",
65 | down: "error",
66 | neutral: "default",
67 | };
68 |
69 | const color = labelColors[trend];
70 | const chartColor = trendColors[trend];
71 | const trendValues = { up: "+25%", down: "-25%", neutral: "+5%" };
72 |
73 | return (
74 |
75 |
76 |
77 | {title}
78 |
79 |
83 |
84 |
88 |
89 | {value}
90 |
91 |
92 |
93 |
94 | {interval}
95 |
96 |
97 |
98 |
114 |
115 |
116 |
117 |
118 |
119 |
120 | );
121 | }
122 |
123 | StatCard.propTypes = {
124 | data: PropTypes.arrayOf(PropTypes.number).isRequired,
125 | interval: PropTypes.string.isRequired,
126 | title: PropTypes.string.isRequired,
127 | trend: PropTypes.oneOf(["down", "neutral", "up"]).isRequired,
128 | value: PropTypes.string.isRequired,
129 | };
130 |
131 | export default StatCard;
132 |
--------------------------------------------------------------------------------
/src/crm/components/CrmSideMenuMobile.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { useNavigate, useLocation } from "react-router-dom";
3 | import Box from "@mui/material/Box";
4 | import Drawer from "@mui/material/Drawer";
5 | import Divider from "@mui/material/Divider";
6 | import List from "@mui/material/List";
7 | import ListItem from "@mui/material/ListItem";
8 | import ListItemButton from "@mui/material/ListItemButton";
9 | import ListItemIcon from "@mui/material/ListItemIcon";
10 | import ListItemText from "@mui/material/ListItemText";
11 | import Typography from "@mui/material/Typography";
12 | import DashboardRoundedIcon from "@mui/icons-material/DashboardRounded";
13 | import PeopleRoundedIcon from "@mui/icons-material/PeopleRounded";
14 | import BusinessCenterRoundedIcon from "@mui/icons-material/BusinessCenterRounded";
15 | import ContactsRoundedIcon from "@mui/icons-material/ContactsRounded";
16 | import AssignmentRoundedIcon from "@mui/icons-material/AssignmentRounded";
17 | import AssessmentRoundedIcon from "@mui/icons-material/AssessmentRounded";
18 | import SettingsRoundedIcon from "@mui/icons-material/SettingsRounded";
19 | import HelpOutlineRoundedIcon from "@mui/icons-material/HelpOutlineRounded";
20 | import { CrmLogo } from "./CrmAppNavbar";
21 |
22 | const mainListItems = [
23 | { text: "Dashboard", icon: , path: "/" },
24 | { text: "Customers", icon: , path: "/customers" },
25 | { text: "Deals", icon: , path: "/deals" },
26 | { text: "Contacts", icon: , path: "/contacts" },
27 | { text: "Tasks", icon: , path: "/tasks" },
28 | { text: "Reports", icon: , path: "/reports" },
29 | ];
30 |
31 | const secondaryListItems = [
32 | { text: "Settings", icon: , path: "/settings" },
33 | { text: "Help & Support", icon: , path: "/help" },
34 | ];
35 |
36 | interface CrmSideMenuMobileProps {
37 | open: boolean;
38 | toggleDrawer: (open: boolean) => () => void;
39 | }
40 |
41 | export default function CrmSideMenuMobile({
42 | open,
43 | toggleDrawer,
44 | }: CrmSideMenuMobileProps) {
45 | const navigate = useNavigate();
46 | const location = useLocation();
47 |
48 | const handleNavigation = (path: string) => {
49 | navigate(path);
50 | toggleDrawer(false)();
51 | };
52 |
53 | return (
54 |
69 |
78 |
86 |
87 |
88 | Acme CRM
89 |
90 |
91 |
92 |
93 | {mainListItems.map((item, index) => (
94 |
95 | handleNavigation(item.path)}
98 | >
99 | {item.icon}
100 |
101 |
102 |
103 | ))}
104 |
105 |
106 |
107 |
108 |
109 | {secondaryListItems.map((item, index) => (
110 |
111 | handleNavigation(item.path)}
114 | >
115 | {item.icon}
116 |
117 |
118 |
119 | ))}
120 |
121 |
122 |
123 | );
124 | }
125 |
--------------------------------------------------------------------------------
/src/marketing-page/components/Highlights.jsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Card from "@mui/material/Card";
4 | import Container from "@mui/material/Container";
5 | import Grid from "@mui/material/Grid";
6 | import Stack from "@mui/material/Stack";
7 | import Typography from "@mui/material/Typography";
8 | import AutoFixHighRoundedIcon from "@mui/icons-material/AutoFixHighRounded";
9 | import ConstructionRoundedIcon from "@mui/icons-material/ConstructionRounded";
10 | import QueryStatsRoundedIcon from "@mui/icons-material/QueryStatsRounded";
11 | import SettingsSuggestRoundedIcon from "@mui/icons-material/SettingsSuggestRounded";
12 | import SupportAgentRoundedIcon from "@mui/icons-material/SupportAgentRounded";
13 | import ThumbUpAltRoundedIcon from "@mui/icons-material/ThumbUpAltRounded";
14 |
15 | const items = [
16 | {
17 | icon: ,
18 | title: "Adaptable performance",
19 | description:
20 | "Our product effortlessly adjusts to your needs, boosting efficiency and simplifying your tasks.",
21 | },
22 | {
23 | icon: ,
24 | title: "Built to last",
25 | description:
26 | "Experience unmatched durability that goes above and beyond with lasting investment.",
27 | },
28 | {
29 | icon: ,
30 | title: "Great user experience",
31 | description:
32 | "Integrate our product into your routine with an intuitive and easy-to-use interface.",
33 | },
34 | {
35 | icon: ,
36 | title: "Innovative functionality",
37 | description:
38 | "Stay ahead with features that set new standards, addressing your evolving needs better than the rest.",
39 | },
40 | {
41 | icon: ,
42 | title: "Reliable support",
43 | description:
44 | "Count on our responsive customer support, offering assistance that goes beyond the purchase.",
45 | },
46 | {
47 | icon: ,
48 | title: "Precision in every detail",
49 | description:
50 | "Enjoy a meticulously crafted product where small touches make a significant impact on your overall experience.",
51 | },
52 | ];
53 |
54 | export default function Highlights() {
55 | return (
56 |
65 |
74 |
80 |
81 | Highlights
82 |
83 |
84 | Explore why our product stands out: adaptability, durability,
85 | user-friendly design, and innovation. Enjoy reliable customer
86 | support and precision in every detail.
87 |
88 |
89 |
90 | {items.map((item, index) => (
91 |
92 |
105 | {item.icon}
106 |
107 |
108 | {item.title}
109 |
110 |
111 | {item.description}
112 |
113 |
114 |
115 |
116 | ))}
117 |
118 |
119 |
120 | );
121 | }
122 |
--------------------------------------------------------------------------------
/src/marketing-page/components/Highlights.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Box from "@mui/material/Box";
3 | import Card from "@mui/material/Card";
4 | import Container from "@mui/material/Container";
5 | import Grid from "@mui/material/Grid";
6 | import Stack from "@mui/material/Stack";
7 | import Typography from "@mui/material/Typography";
8 | import AutoFixHighRoundedIcon from "@mui/icons-material/AutoFixHighRounded";
9 | import ConstructionRoundedIcon from "@mui/icons-material/ConstructionRounded";
10 | import QueryStatsRoundedIcon from "@mui/icons-material/QueryStatsRounded";
11 | import SettingsSuggestRoundedIcon from "@mui/icons-material/SettingsSuggestRounded";
12 | import SupportAgentRoundedIcon from "@mui/icons-material/SupportAgentRounded";
13 | import ThumbUpAltRoundedIcon from "@mui/icons-material/ThumbUpAltRounded";
14 |
15 | const items = [
16 | {
17 | icon: ,
18 | title: "Adaptable performance",
19 | description:
20 | "Our product effortlessly adjusts to your needs, boosting efficiency and simplifying your tasks.",
21 | },
22 | {
23 | icon: ,
24 | title: "Built to last",
25 | description:
26 | "Experience unmatched durability that goes above and beyond with lasting investment.",
27 | },
28 | {
29 | icon: ,
30 | title: "Great user experience",
31 | description:
32 | "Integrate our product into your routine with an intuitive and easy-to-use interface.",
33 | },
34 | {
35 | icon: ,
36 | title: "Innovative functionality",
37 | description:
38 | "Stay ahead with features that set new standards, addressing your evolving needs better than the rest.",
39 | },
40 | {
41 | icon: ,
42 | title: "Reliable support",
43 | description:
44 | "Count on our responsive customer support, offering assistance that goes beyond the purchase.",
45 | },
46 | {
47 | icon: ,
48 | title: "Precision in every detail",
49 | description:
50 | "Enjoy a meticulously crafted product where small touches make a significant impact on your overall experience.",
51 | },
52 | ];
53 |
54 | export default function Highlights() {
55 | return (
56 |
65 |
74 |
80 |
81 | Highlights
82 |
83 |
84 | Explore why our product stands out: adaptability, durability,
85 | user-friendly design, and innovation. Enjoy reliable customer
86 | support and precision in every detail.
87 |
88 |
89 |
90 | {items.map((item, index) => (
91 |
92 |
105 | {item.icon}
106 |
107 |
108 | {item.title}
109 |
110 |
111 | {item.description}
112 |
113 |
114 |
115 |
116 | ))}
117 |
118 |
119 |
120 | );
121 | }
122 |
--------------------------------------------------------------------------------