├── .gitignore
├── LICENSE
├── README.md
├── index.html
├── package.json
├── postcss.config.mjs
├── public
└── images
│ ├── authentication
│ ├── create-account.jpg
│ ├── login.jpg
│ └── reset-password.jpg
│ ├── logo.svg
│ ├── products
│ ├── apple-imac-1.png
│ ├── apple-imac-2.png
│ └── apple-imac-3.png
│ └── users
│ ├── bonnie-green-2x.png
│ ├── bonnie-green.png
│ ├── helene-engels.png
│ ├── jese-leos-2x.png
│ ├── jese-leos.png
│ ├── joseph-mcfall.png
│ ├── lana-byrd.png
│ ├── leslie-livingston.png
│ ├── michael-gough.png
│ ├── neil-sims.png
│ ├── robert-brown.png
│ ├── roberta-casas-2x.png
│ ├── roberta-casas.png
│ └── thomas-lean.png
├── src
├── components
│ ├── navbar.tsx
│ └── sidebar.tsx
├── flowbite-theme.ts
├── index.css
├── index.tsx
├── layouts
│ └── navbar-sidebar.tsx
├── pages
│ ├── authentication
│ │ ├── sign-in.tsx
│ │ └── sign-up.tsx
│ ├── e-commerce
│ │ └── products.tsx
│ ├── index.tsx
│ └── users
│ │ └── list.tsx
└── svgmap.d.ts
├── tailwind.config.cjs
├── tsconfig.json
├── vite.config.ts
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | dist
2 | node_modules
3 | tsconfig.tsbuildinfo
4 | yarn-error.log
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Themesberg
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
flowbite-react-admin-dashboard
3 |
4 | Get started with a premium admin dashboard layout built with React, Tailwind CSS and Flowbite featuring 21 example pages including charts, kanban board, mailing system, and more.
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
18 |
19 |
20 | **You can [copy/paste code you want from this project](#how-to-use-in-your-own-project), or [use the whole thing for your website](#how-to-install).**
21 |
22 | ## Table of Contents
23 |
24 | - [How to use in your own project](#how-to-use-in-your-own-project)
25 | - [How to install](#how-to-install)
26 | - [Assumptions](#assumptions)
27 | - [How to develop locally](#how-to-develop-locally)
28 | - [How to build for production](#how-to-build-for-production)
29 | - [How to deploy](#how-to-deploy)
30 |
31 | ## How to use in your own project
32 |
33 | In this case, we assume you already have a `nodejs` project with a `package.json`.
34 |
35 | You can copy any of the code from the `.tsx` files in `src/pages` to your own `nodejs` project. Some pages contain optional dependencies discussed further below. Pages might also use some of the static files found in `public`.
36 |
37 | Your project will need to have [`flowbite-react`](https://github.com/bacali95/flowbite-react) installed. That's it! If you're unfamiliar, see [the open-source guide on how to install `flowbite-react`](https://github.com/themesberg/flowbite-react#getting-started).
38 |
39 | Optional dependencies include:
40 |
41 | - [`react-icons`](https://react-icons.github.io/react-icons/) for most of the many icons used
42 | - [`react-apexcharts`](https://github.com/apexcharts/react-apexcharts) for charts/graphs found on [Dashboard page](https://github.com/themesberg/flowbite-react-admin-dashboard/blob/main/src/pages/index.tsx)
43 | - [`react-sortablejs`](https://github.com/SortableJS/react-sortablejs) for Kanban-style boards found on [Kanban page](https://github.com/themesberg/flowbite-react-admin-dashboard/blob/main/src/pages/kanban.tsx)
44 | - [`svgmap`](https://github.com/StephanWagner/svgMap) for maps found on [Dashboard page](https://github.com/themesberg/flowbite-react-admin-dashboard/blob/main/src/pages/kanban.tsx)
45 |
46 | ## How to install
47 |
48 | ### Assumptions
49 |
50 | - You can open a shell/terminal/command prompt
51 | - You have `git` instaslled and can run `git` in the shell
52 | - You have `nodejs` installed and can run `node`, `npm` in the shell
53 |
54 | Install [`yarn`](https://yarnpkg.com/)
55 |
56 | ```sh
57 | npm i -g yarn
58 | ```
59 |
60 | Clone this repository
61 |
62 | ```sh
63 | git clone https://github.com/themesberg/flowbite-react-admin-dashboard.git
64 | cd flowbite-react-admin-dashboard
65 | ```
66 |
67 | Install dependencies for this project
68 |
69 | ```sh
70 | yarn install
71 | ```
72 |
73 | ## How to develop locally
74 |
75 | Once run, this command will display a link to the local server.
76 |
77 | ```sh
78 | yarn dev
79 | ```
80 |
81 | ## How to build for production
82 |
83 | Your code won't build if you have TypeScript errors. Otherwise, the command will report how large the output files are, which should go to `dist` folder.
84 |
85 | We use [vite](https://vitejs.dev) to build and its default behavior is to emit an `index.html`, `app.js`, and `app.css`.
86 |
87 | ```sh
88 | yarn build
89 | ```
90 |
91 | ## How to deploy
92 |
93 | You can deploy this repository to any hosting service from Cloudflare Pages, Vercel, or Github Pages to Heroku to AWS to your own Nginx server.
94 |
95 | However, `react-router` needs your server to send all requests to `/`. This is commonly referred to as a [Single Page Application (SPA)](https://developer.mozilla.org/en-US/docs/Glossary/SPA). You will have to add a rewrite to accomplish that. To host on Vercel, for example, you just need to add a `vercel.json` with:
96 |
97 | ```json
98 | {
99 | "routes": [
100 | {
101 | "src": "/[^.]+",
102 | "dest": "/",
103 | "status": 200
104 | }
105 | ]
106 | }
107 | ```
108 |
109 | Most, but not all, providers have a mechanism to do this, but we can't cover them all here.
110 |
111 | Alternatively, you can change this app to server-side render. `vite` isn't designed to do that, so you'll need to use a plugin to create an HTML file for each page. `vite` [has a section in their docs](https://github.com/vitejs/awesome-vite#ssr) about SSR plugins and they seem great.
112 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | React Tailwind CSS Dashboard - Flowbite
5 |
6 |
7 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "module",
3 | "name": "flowbite-react-admin-dashboard",
4 | "version": "1.0.0",
5 | "descrption": "flowbite-react admin dashboard",
6 | "homepage": "https://github.com/themesberg/flowbite-react-admin-dashboard",
7 | "bugs": "https://github.com/themesberg/flowbite-react-admin-dashboard/issues",
8 | "license": "UNLICENSED",
9 | "author": "Conner Davis ",
10 | "repository": {
11 | "type": "git",
12 | "url": "https://github.com/themesberg/flowbite-react-admin-dashboard.git"
13 | },
14 | "scripts": {
15 | "build": "yarn typecheck && vite build",
16 | "dev": "vite --host",
17 | "format": "prettier --check --ignore-path .gitignore --write .",
18 | "lint": "eslint --ignore-path .gitignore .",
19 | "preview": "vite preview --host",
20 | "typecheck": "tsc"
21 | },
22 | "engines": {
23 | "node": ">= 16",
24 | "npm": ">= 8",
25 | "yarn": ">= 1"
26 | },
27 | "dependencies": {
28 | "apexcharts": "^3.36.3",
29 | "classnames": "^2.3.2",
30 | "flowbite": "^1.5.5",
31 | "flowbite-react": "^0.3.7",
32 | "react-apexcharts": "^1.4.0",
33 | "react-icons": "^4.7.1"
34 | },
35 | "devDependencies": {
36 | "@types/react": "^18.0.26",
37 | "@types/react-dom": "^18.0.9",
38 | "@types/sortablejs": "^1.15.0",
39 | "@typescript-eslint/eslint-plugin": "^5.46.0",
40 | "@typescript-eslint/parser": "^5.46.0",
41 | "@vitejs/plugin-react": "^2.2.0",
42 | "autoprefixer": "^10.4.13",
43 | "cz-conventional-changelog": "^3.3.0",
44 | "eslint": "^8.29.0",
45 | "eslint-config-prettier": "^8.5.0",
46 | "eslint-plugin-jsx-a11y": "^6.6.1",
47 | "eslint-plugin-prettier": "^4.2.1",
48 | "eslint-plugin-react": "^7.31.11",
49 | "eslint-plugin-react-hooks": "^4.6.0",
50 | "eslint-plugin-tailwindcss": "^3.7.1",
51 | "postcss": "^8.4.19",
52 | "prettier": "^2.8.1",
53 | "react": "^18.2.0",
54 | "react-dom": "^18.2.0",
55 | "react-router": "^6.4.5",
56 | "react-router-dom": "^6.4.5",
57 | "tailwindcss": "^3.2.4",
58 | "typescript": "^4.9.4",
59 | "vite": "^3.2.5",
60 | "vitest": "^0.25.6"
61 | },
62 | "private": true,
63 | "config": {
64 | "commitizen": {
65 | "path": "cz-conventional-changelog"
66 | }
67 | },
68 | "eslintConfig": {
69 | "extends": [
70 | "eslint:recommended",
71 | "plugin:@typescript-eslint/strict",
72 | "plugin:jsx-a11y/recommended",
73 | "plugin:prettier/recommended",
74 | "plugin:react/recommended",
75 | "plugin:react-hooks/recommended",
76 | "plugin:tailwindcss/recommended"
77 | ],
78 | "parser": "@typescript-eslint/parser",
79 | "parserOptions": {
80 | "ecmaFeatures": {
81 | "jsx": true
82 | },
83 | "project": "./tsconfig.json"
84 | },
85 | "root": true,
86 | "rules": {
87 | "@typescript-eslint/consistent-type-imports": "error",
88 | "react/react-in-jsx-scope": "off",
89 | "react/no-unescaped-entities": "off",
90 | "tailwindcss/classnames-order": [
91 | "error",
92 | {
93 | "callees": [
94 | "classnames"
95 | ],
96 | "config": "tailwind.config.cjs"
97 | }
98 | ],
99 | "tailwindcss/no-custom-classname": [
100 | "error",
101 | {
102 | "config": "tailwind.config.cjs"
103 | }
104 | ]
105 | },
106 | "settings": {
107 | "react": {
108 | "version": "detect"
109 | }
110 | }
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | };
7 |
--------------------------------------------------------------------------------
/public/images/authentication/create-account.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/authentication/create-account.jpg
--------------------------------------------------------------------------------
/public/images/authentication/login.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/authentication/login.jpg
--------------------------------------------------------------------------------
/public/images/authentication/reset-password.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/authentication/reset-password.jpg
--------------------------------------------------------------------------------
/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/public/images/products/apple-imac-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/products/apple-imac-1.png
--------------------------------------------------------------------------------
/public/images/products/apple-imac-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/products/apple-imac-2.png
--------------------------------------------------------------------------------
/public/images/products/apple-imac-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/products/apple-imac-3.png
--------------------------------------------------------------------------------
/public/images/users/bonnie-green-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/bonnie-green-2x.png
--------------------------------------------------------------------------------
/public/images/users/bonnie-green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/bonnie-green.png
--------------------------------------------------------------------------------
/public/images/users/helene-engels.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/helene-engels.png
--------------------------------------------------------------------------------
/public/images/users/jese-leos-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/jese-leos-2x.png
--------------------------------------------------------------------------------
/public/images/users/jese-leos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/jese-leos.png
--------------------------------------------------------------------------------
/public/images/users/joseph-mcfall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/joseph-mcfall.png
--------------------------------------------------------------------------------
/public/images/users/lana-byrd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/lana-byrd.png
--------------------------------------------------------------------------------
/public/images/users/leslie-livingston.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/leslie-livingston.png
--------------------------------------------------------------------------------
/public/images/users/michael-gough.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/michael-gough.png
--------------------------------------------------------------------------------
/public/images/users/neil-sims.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/neil-sims.png
--------------------------------------------------------------------------------
/public/images/users/robert-brown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/robert-brown.png
--------------------------------------------------------------------------------
/public/images/users/roberta-casas-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/roberta-casas-2x.png
--------------------------------------------------------------------------------
/public/images/users/roberta-casas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/roberta-casas.png
--------------------------------------------------------------------------------
/public/images/users/thomas-lean.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/themesberg/flowbite-react-admin-dashboard/ce3afeb2149ad5a91e59c8e98c85e9220224c744/public/images/users/thomas-lean.png
--------------------------------------------------------------------------------
/src/components/navbar.tsx:
--------------------------------------------------------------------------------
1 | import type { FC } from "react";
2 | import { Button, DarkThemeToggle, Navbar } from "flowbite-react";
3 |
4 | const ExampleNavbar: FC = function () {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Flowbite
14 |
15 |
16 |
17 |
18 |
25 |
26 | Upgrade to Pro
27 |
28 |
29 |
30 |
31 |
32 |
33 | );
34 | };
35 |
36 | export default ExampleNavbar;
37 |
--------------------------------------------------------------------------------
/src/components/sidebar.tsx:
--------------------------------------------------------------------------------
1 | import { Sidebar, TextInput } from "flowbite-react";
2 | import type { FC } from "react";
3 | import { useEffect, useState } from "react";
4 | import {
5 | HiChartPie,
6 | HiClipboard,
7 | HiCollection,
8 | HiInformationCircle,
9 | HiLogin,
10 | HiPencil,
11 | HiSearch,
12 | HiShoppingBag,
13 | HiUsers,
14 | } from "react-icons/hi";
15 |
16 | const ExampleSidebar: FC = function () {
17 | const [currentPage, setCurrentPage] = useState("");
18 |
19 | useEffect(() => {
20 | const newPage = window.location.pathname;
21 |
22 | setCurrentPage(newPage);
23 | }, [setCurrentPage]);
24 |
25 | return (
26 |
27 |
28 |
29 |
38 |
39 |
40 |
47 | Dashboard
48 |
49 |
58 | Products
59 |
60 |
69 | Users list
70 |
71 |
72 | Sign in
73 |
74 |
75 | Sign up
76 |
77 |
78 |
79 |
83 | Docs
84 |
85 |
89 | Components
90 |
91 |
95 | Help
96 |
97 |
98 |
99 |
100 |
101 |
102 | );
103 | };
104 |
105 | export default ExampleSidebar;
106 |
--------------------------------------------------------------------------------
/src/flowbite-theme.ts:
--------------------------------------------------------------------------------
1 | import type { CustomFlowbiteTheme } from "flowbite-react";
2 |
3 | const flowbiteTheme: CustomFlowbiteTheme = {
4 | badge: {
5 | color: {
6 | primary:
7 | "bg-primary-100 text-primary-800 dark:bg-primary-200 dark:text-primary-800 group-hover:bg-primary-200 dark:group-hover:bg-primary-300",
8 | },
9 | icon: {
10 | off: "rounded-full px-2 py-1",
11 | },
12 | size: {
13 | xl: "px-3 py-2 text-base rounded-md",
14 | },
15 | },
16 | button: {
17 | color: {
18 | primary:
19 | "text-white bg-primary-700 hover:bg-primary-800 focus:ring-primary-300 dark:bg-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800",
20 | },
21 | outline: {
22 | on: "transition-all duration-75 ease-in group-hover:bg-opacity-0 group-hover:text-inherit",
23 | },
24 | size: {
25 | md: "text-sm px-3 py-2",
26 | },
27 | },
28 | dropdown: {
29 | floating: {
30 | base: "z-10 w-fit rounded-xl divide-y divide-gray-100 shadow",
31 | content: "rounded-xl text-sm text-gray-700 dark:text-gray-200",
32 | target: "w-fit dark:text-white",
33 | },
34 | content: "",
35 | },
36 | modal: {
37 | content: {
38 | inner: "relative rounded-lg bg-white shadow dark:bg-gray-800",
39 | },
40 | header: {
41 | base: "flex items-start justify-between rounded-t px-5 pt-5",
42 | },
43 | },
44 | navbar: {
45 | base: "fixed z-30 w-full bg-white border-b border-gray-200 dark:bg-gray-800 dark:border-gray-700",
46 | },
47 | sidebar: {
48 | base: "flex fixed top-0 left-0 z-20 flex-col flex-shrink-0 pt-16 h-full duration-75 border-r border-gray-200 lg:flex transition-width dark:border-gray-700",
49 | },
50 | textarea: {
51 | base: "block w-full text-sm p-4 rounded-lg border disabled:cursor-not-allowed disabled:opacity-50",
52 | },
53 | toggleSwitch: {
54 | toggle: {
55 | checked: {
56 | off: "!border-gray-200 !bg-gray-200 dark:!border-gray-600 dark:!bg-gray-700",
57 | },
58 | },
59 | },
60 | };
61 |
62 | export default flowbiteTheme;
63 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | /* see https://github.com/themesberg/flowbite-admin-dashboard/blob/main/src/css/input.css */
2 |
3 | @tailwind base;
4 | @tailwind components;
5 | @tailwind utilities;
6 |
7 | /* chart styles */
8 | .apexcharts-tooltip {
9 | @apply bg-white dark:bg-gray-700 text-gray-500 dark:text-gray-400 border-0 rounded-lg shadow-lg !important;
10 | }
11 |
12 | .apexcharts-tooltip .apexcharts-tooltip-title {
13 | @apply py-2 px-4 bg-gray-100 dark:bg-gray-600 border-b border-gray-200 dark:border-gray-500 !important;
14 | }
15 |
16 | .apexcharts-xaxistooltip {
17 | @apply text-gray-500 border-0 bg-white dark:bg-gray-700 dark:text-gray-300 rounded-lg shadow-lg !important;
18 | }
19 |
20 | .apexcharts-tooltip .apexcharts-tooltip-text-y-value {
21 | @apply dark:text-white;
22 | }
23 |
24 | .apexcharts-xaxistooltip-text {
25 | @apply font-medium text-sm !important;
26 | }
27 |
28 | .apexcharts-xaxistooltip:before,
29 | .apexcharts-xaxistooltip:after {
30 | @apply border-0 !important;
31 | }
32 |
33 | /* SVG map styles */
34 | .svgMap-map-wrapper {
35 | @apply bg-white !important;
36 | }
37 |
38 | .svgMap-map-image {
39 | @apply dark:bg-gray-800;
40 | }
41 |
42 | .svgMap-map-controls-wrapper {
43 | @apply shadow-none left-0 bottom-0 dark:bg-gray-800 !important;
44 | }
45 |
46 | .svgMap-map-controls-zoom {
47 | @apply dark:bg-gray-800 !important;
48 | }
49 |
50 | .svgMap-map-wrapper .svgMap-control-button {
51 | @apply rounded-lg border-solid border border-gray-300 hover:bg-gray-100 dark:border-gray-600 dark:hover:bg-gray-600 !important;
52 | }
53 |
54 | .svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:after,
55 | .svgMap-map-wrapper .svgMap-control-button.svgMap-zoom-button:before {
56 | @apply dark:bg-gray-600 dark:hover:bg-gray-500;
57 | }
58 |
59 | .svgMap-map-wrapper .svgMap-control-button:first-child {
60 | @apply mr-2 !important;
61 | }
62 |
63 | .svgMap-tooltip {
64 | @apply bg-white dark:bg-gray-700 shadow-lg rounded-lg border-0 text-left !important;
65 | }
66 |
67 | .svgMap-tooltip
68 | .svgMap-tooltip-content-container
69 | .svgMap-tooltip-flag-container {
70 | @apply inline-block mr-2 text-left border-0 p-0 !important;
71 | }
72 |
73 | .svgMap-tooltip
74 | .svgMap-tooltip-content-container
75 | .svgMap-tooltip-flag-container
76 | .svgMap-tooltip-flag {
77 | @apply inline-block border-0 h-4 p-0 !important;
78 | }
79 |
80 | .svgMap-tooltip .svgMap-tooltip-title {
81 | @apply inline-block pt-2 text-gray-900 dark:text-white font-semibold text-sm !important;
82 | }
83 |
84 | .svgMap-tooltip .svgMap-tooltip-content {
85 | @apply mt-0 !important;
86 | }
87 |
88 | .svgMap-tooltip .svgMap-tooltip-content table td {
89 | @apply text-sm text-left text-gray-500 dark:text-gray-400 font-normal !important;
90 | }
91 |
92 | .svgMap-tooltip .svgMap-tooltip-content table td span {
93 | @apply text-sm text-left text-gray-900 dark:text-white font-semibold !important;
94 | }
95 |
96 | .svgMap-tooltip .svgMap-tooltip-pointer {
97 | @apply hidden !important;
98 | }
99 |
100 | .svgMap-map-wrapper .svgMap-country {
101 | @apply dark:stroke-gray-800;
102 | }
103 |
104 | .svgMap-map-wrapper .svgMap-country {
105 | @apply dark:stroke-gray-800 !important;
106 | }
107 |
108 | .svgMap-country[fill="#4B5563"] {
109 | @apply fill-[#4B5563] !important;
110 | }
111 |
112 | /* kanban styles */
113 |
114 | .drag-card {
115 | @apply opacity-100 !important;
116 | @apply rotate-6;
117 | }
118 |
119 | .ghost-card {
120 | @apply bg-gray-100/40 dark:bg-gray-600/40 !important;
121 | }
122 |
123 | /* calendar styles */
124 |
125 | .fc .fc-toolbar {
126 | @apply flex-row-reverse justify-end px-4 !important;
127 | }
128 |
129 | .fc .fc-toolbar.fc-header-toolbar {
130 | @apply mb-5 !important;
131 | }
132 |
133 | .fc .fc-toolbar-title {
134 | @apply text-lg text-gray-900 font-semibold !important;
135 | }
136 |
137 | .fc .fc-today-button {
138 | @apply rounded-lg border border-gray-200 bg-white text-sm font-medium px-4 py-2 text-gray-900 hover:bg-gray-100 hover:text-primary-700 focus:z-10 focus:ring-2 focus:ring-primary-700 focus:text-primary-700 !important;
139 | }
140 |
141 | .fc-direction-ltr .fc-toolbar > * > :not(:first-child) {
142 | @apply mx-2 !important;
143 | }
144 |
145 | .fc .fc-button-group .fc-prev-button,
146 | .fc .fc-button-group .fc-next-button {
147 | @apply bg-white border-0 text-gray-500 hover:text-gray-900 cursor-pointer p-2 hover:bg-gray-100 rounded inline-flex focus:bg-gray-100 focus:ring-1 focus:ring-gray-100 justify-center !important;
148 | }
149 |
150 | .fc .fc-scrollgrid {
151 | @apply border-l-0 border-gray-200 !important;
152 | }
153 |
154 | .fc .fc-daygrid-day-frame {
155 | @apply border-gray-200 !important;
156 | }
157 |
158 | .fc .fc-col-header-cell-cushion {
159 | @apply py-3 text-base text-gray-900 font-semibold !important;
160 | }
161 |
162 | .fc-theme-standard th {
163 | @apply border-0 border-b border-gray-200 !important;
164 | }
165 |
166 | .fc-direction-ltr .fc-daygrid-event.fc-event-end {
167 | @apply mr-2 !important;
168 | }
169 |
170 | .fc-direction-ltr .fc-daygrid-event.fc-event-start {
171 | @apply ml-2 !important;
172 | }
173 |
174 | .fc .fc-event .fc-event-main {
175 | @apply p-2 bg-primary-700 hover:bg-primary-800 !important;
176 | }
177 |
178 | .fc .fc-h-event .fc-event-main-frame {
179 | @apply text-xs font-semibold !important;
180 | }
181 |
182 | .fc .fc-daygrid-day-frame {
183 | @apply hover:bg-gray-50 cursor-pointer !important;
184 | }
185 |
--------------------------------------------------------------------------------
/src/index.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from "react";
2 | import { createRoot } from "react-dom/client";
3 |
4 | import "./index.css";
5 | import theme from "./flowbite-theme";
6 | import { Flowbite } from "flowbite-react";
7 | import { Routes, Route } from "react-router";
8 | import { BrowserRouter } from "react-router-dom";
9 | import DashboardPage from "./pages";
10 | import SignInPage from "./pages/authentication/sign-in";
11 | import SignUpPage from "./pages/authentication/sign-up";
12 | import EcommerceProductsPage from "./pages/e-commerce/products";
13 | import UserListPage from "./pages/users/list";
14 |
15 | const container = document.getElementById("root");
16 |
17 | if (!container) {
18 | throw new Error("React root element doesn't exist!");
19 | }
20 |
21 | const root = createRoot(container);
22 |
23 | root.render(
24 |
25 |
26 |
27 |
28 | } index />
29 | } />
30 | } />
31 | }
34 | />
35 | } />
36 |
37 |
38 |
39 |
40 | );
41 |
--------------------------------------------------------------------------------
/src/layouts/navbar-sidebar.tsx:
--------------------------------------------------------------------------------
1 | import { Footer } from "flowbite-react";
2 | import type { FC, PropsWithChildren } from "react";
3 | import Navbar from "../components/navbar";
4 | import Sidebar from "../components/sidebar";
5 | import { MdFacebook } from "react-icons/md";
6 | import { FaDribbble, FaGithub, FaInstagram, FaTwitter } from "react-icons/fa";
7 |
8 | interface NavbarSidebarLayoutProps {
9 | isFooter?: boolean;
10 | }
11 |
12 | const NavbarSidebarLayout: FC> =
13 | function ({ children, isFooter = true }) {
14 | return (
15 | <>
16 |
17 |
18 |
19 | {children}
20 |
21 | >
22 | );
23 | };
24 |
25 | const MainContent: FC> = function ({
26 | children,
27 | isFooter,
28 | }) {
29 | return (
30 |
31 | {children}
32 | {isFooter && (
33 |
34 |
35 |
36 | )}
37 |
38 | );
39 | };
40 |
41 | const MainContentFooter: FC = function () {
42 | return (
43 | <>
44 |
45 |
46 |
47 |
48 | Terms and conditions
49 |
50 |
51 | Privacy Policy
52 |
53 |
54 | Licensing
55 |
56 |
57 | Cookie Policy
58 |
59 | Contact
60 |
61 |
62 |
63 |
67 |
68 |
69 |
73 |
74 |
75 |
79 |
80 |
81 |
85 |
86 |
87 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 | © 2019-2022 Flowbite.com. All rights reserved.
99 |
100 | >
101 | );
102 | };
103 |
104 | export default NavbarSidebarLayout;
105 |
--------------------------------------------------------------------------------
/src/pages/authentication/sign-in.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable jsx-a11y/anchor-is-valid */
2 | import { Button, Card, Checkbox, Label, TextInput } from "flowbite-react";
3 | import type { FC } from "react";
4 |
5 | const SignInPage: FC = function () {
6 | return (
7 |
8 |
9 |
14 |
15 | Flowbite
16 |
17 |
18 |
24 |
25 | Sign in to platform
26 |
27 |
70 |
71 |
72 | );
73 | };
74 |
75 | export default SignInPage;
76 |
--------------------------------------------------------------------------------
/src/pages/authentication/sign-up.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable jsx-a11y/anchor-is-valid */
2 | import { Button, Card, Checkbox, Label, TextInput } from "flowbite-react";
3 | import type { FC } from "react";
4 |
5 | const SignUpPage: FC = function () {
6 | return (
7 |
8 |
9 |
14 |
15 | Flowbite
16 |
17 |
18 |
24 |
25 | Create a Free Account
26 |
27 |
76 |
77 |
78 | );
79 | };
80 |
81 | export default SignUpPage;
82 |
--------------------------------------------------------------------------------
/src/pages/e-commerce/products.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable jsx-a11y/anchor-is-valid */
2 | import {
3 | Breadcrumb,
4 | Button,
5 | Checkbox,
6 | Label,
7 | Modal,
8 | Table,
9 | Textarea,
10 | TextInput,
11 | } from "flowbite-react";
12 | import type { FC } from "react";
13 | import { useState } from "react";
14 | import { FaPlus } from "react-icons/fa";
15 | import {
16 | HiCog,
17 | HiDotsVertical,
18 | HiExclamationCircle,
19 | HiHome,
20 | HiOutlineExclamationCircle,
21 | HiPencilAlt,
22 | HiTrash,
23 | HiUpload,
24 | } from "react-icons/hi";
25 | import NavbarSidebarLayout from "../../layouts/navbar-sidebar";
26 | import { Pagination } from "../users/list";
27 |
28 | const EcommerceProductsPage: FC = function () {
29 | return (
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | Home
39 |
40 |
41 |
42 | E-commerce
43 |
44 | Products
45 |
46 |
47 | All products
48 |
49 |
50 |
86 |
87 |
88 |
97 |
98 |
99 | );
100 | };
101 |
102 | const SearchForProducts: FC = function () {
103 | return (
104 |
116 | );
117 | };
118 |
119 | const AddProductModal: FC = function () {
120 | const [isOpen, setOpen] = useState(false);
121 |
122 | return (
123 | <>
124 | setOpen(!isOpen)}>
125 |
126 | Add product
127 |
128 | setOpen(false)} show={isOpen}>
129 |
130 | Add product
131 |
132 |
133 |
200 |
201 |
202 | setOpen(false)}>
203 | Add product
204 |
205 |
206 |
207 | >
208 | );
209 | };
210 |
211 | const EditProductModal: FC = function () {
212 | const [isOpen, setOpen] = useState(false);
213 |
214 | return (
215 | <>
216 | setOpen(!isOpen)}>
217 |
218 | Edit item
219 |
220 | setOpen(false)} show={isOpen}>
221 |
222 | Edit product
223 |
224 |
225 |
226 |
227 |
228 | Product name
229 |
235 |
236 |
237 | Category
238 |
244 |
245 |
246 | Brand
247 |
253 |
254 |
255 | Price
256 |
263 |
264 |
265 | Product details
266 |
273 |
274 |
309 |
310 |
311 |
312 |
313 |
314 |
315 | Upload a file or drag and drop
316 |
317 |
318 | PNG, JPG, GIF up to 10MB
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 | setOpen(false)}>
330 | Save all
331 |
332 |
333 |
334 | >
335 | );
336 | };
337 |
338 | const DeleteProductModal: FC = function () {
339 | const [isOpen, setOpen] = useState(false);
340 |
341 | return (
342 | <>
343 | setOpen(!isOpen)}>
344 |
345 | Delete item
346 |
347 | setOpen(false)} show={isOpen} size="md">
348 |
349 | Delete product
350 |
351 |
352 |
353 |
354 |
355 | Are you sure you want to delete this product?
356 |
357 |
358 | setOpen(false)}>
359 | Yes, I'm sure
360 |
361 | setOpen(false)}>
362 | No, cancel
363 |
364 |
365 |
366 |
367 |
368 | >
369 | );
370 | };
371 |
372 | const ProductsTable: FC = function () {
373 | return (
374 |
375 |
376 |
377 | Toggle selected
378 |
379 |
380 | Product Name
381 | Technology
382 | ID
383 | Price
384 | Actions
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 | Education Dashboard
394 |
395 |
396 | Html templates
397 |
398 |
399 |
400 | Angular
401 |
402 |
403 | #194556
404 |
405 |
406 | $149
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 | React UI Kit
422 |
423 |
424 | Html templates
425 |
426 |
427 |
428 | React JS
429 |
430 |
431 | #623232
432 |
433 |
434 | $129
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 | Education Dashboard
450 |
451 |
452 | Html templates
453 |
454 |
455 |
456 | Angular
457 |
458 |
459 | #194356
460 |
461 |
462 | $149
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 | React UI Kit
478 |
479 |
480 | Html templates
481 |
482 |
483 |
484 | React JS
485 |
486 |
487 | #323323
488 |
489 |
490 | $129
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 | Education Dashboard
506 |
507 |
508 | Html templates
509 |
510 |
511 |
512 | Angular
513 |
514 |
515 | #994856
516 |
517 |
518 | $149
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 | Education Dashboard
534 |
535 |
536 | Html templates
537 |
538 |
539 |
540 | Angular
541 |
542 |
543 | #194256
544 |
545 |
546 | $149
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 | React UI Kit
562 |
563 |
564 | Html templates
565 |
566 |
567 |
568 | React JS
569 |
570 |
571 | #623378
572 |
573 |
574 | $129
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 | Education Dashboard
590 |
591 |
592 | Html templates
593 |
594 |
595 |
596 | Angular
597 |
598 |
599 | #192856
600 |
601 |
602 | $149
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 | React UI Kit
618 |
619 |
620 | Html templates
621 |
622 |
623 |
624 | React JS
625 |
626 |
627 | #523323
628 |
629 |
630 | $129
631 |
632 |
633 |
634 |
635 |
636 |
637 |
638 |
639 |
640 |
641 |
642 |
643 |
644 |
645 | Education Dashboard
646 |
647 |
648 | Html templates
649 |
650 |
651 |
652 | Angular
653 |
654 |
655 | #191857
656 |
657 |
658 | $149
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 | Education Dashboard
674 |
675 |
676 | Html templates
677 |
678 |
679 |
680 | Angular
681 |
682 |
683 | #914856
684 |
685 |
686 | $149
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 | React UI Kit
702 |
703 |
704 | Html templates
705 |
706 |
707 |
708 | React JS
709 |
710 |
711 | #633293
712 |
713 |
714 | $129
715 |
716 |
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 | Education Dashboard
730 |
731 |
732 | Html templates
733 |
734 |
735 |
736 | Angular
737 |
738 |
739 | #924856
740 |
741 |
742 | $149
743 |
744 |
745 |
746 |
747 |
748 |
749 |
750 |
751 |
752 |
753 |
754 |
755 |
756 |
757 | React UI Kit
758 |
759 |
760 | Html templates
761 |
762 |
763 |
764 | React JS
765 |
766 |
767 | #123323
768 |
769 |
770 | $129
771 |
772 |
773 |
774 |
775 |
776 |
777 |
778 |
779 |
780 |
781 |
782 |
783 |
784 |
785 | Education Dashboard
786 |
787 |
788 | Html templates
789 |
790 |
791 |
792 | Angular
793 |
794 |
795 | #198856
796 |
797 |
798 | $149
799 |
800 |
801 |
802 |
803 |
804 |
805 |
806 |
807 |
808 |
809 |
810 |
811 |
812 |
813 | Education Dashboard
814 |
815 |
816 | Html templates
817 |
818 |
819 |
820 | Angular
821 |
822 |
823 | #132856
824 |
825 |
826 | $149
827 |
828 |
829 |
830 |
831 |
832 |
833 |
834 |
835 |
836 |
837 |
838 |
839 |
840 |
841 | React UI Kit
842 |
843 |
844 | Html templates
845 |
846 |
847 |
848 | React JS
849 |
850 |
851 | #613223
852 |
853 |
854 | $129
855 |
856 |
857 |
858 |
859 |
860 |
861 |
862 |
863 |
864 |
865 |
866 |
867 |
868 |
869 | Education Dashboard
870 |
871 |
872 | Html templates
873 |
874 |
875 |
876 | Angular
877 |
878 |
879 | #484856
880 |
881 |
882 | $149
883 |
884 |
885 |
886 |
887 |
888 |
889 |
890 |
891 |
892 |
893 |
894 |
895 |
896 |
897 | React UI Kit
898 |
899 |
900 | Html templates
901 |
902 |
903 |
904 | React JS
905 |
906 |
907 | #103324
908 |
909 |
910 | $129
911 |
912 |
913 |
914 |
915 |
916 |
917 |
918 |
919 |
920 |
921 |
922 |
923 |
924 |
925 | Education Dashboard
926 |
927 |
928 | Html templates
929 |
930 |
931 |
932 | Angular
933 |
934 |
935 | #124859
936 |
937 |
938 | $149
939 |
940 |
941 |
942 |
943 |
944 |
945 |
946 |
947 |
948 |
949 | );
950 | };
951 |
952 | export default EcommerceProductsPage;
953 |
--------------------------------------------------------------------------------
/src/pages/index.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable jsx-a11y/anchor-is-valid */
2 | import { Badge, Dropdown, Table, useTheme } from "flowbite-react";
3 | import type { FC } from "react";
4 | import Chart from "react-apexcharts";
5 | import NavbarSidebarLayout from "../layouts/navbar-sidebar";
6 |
7 | const DashboardPage: FC = function () {
8 | return (
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
19 |
20 |
21 | );
22 | };
23 |
24 | const SalesThisWeek: FC = function () {
25 | return (
26 |
27 |
28 |
29 |
30 | $45,385
31 |
32 |
33 | Sales this week
34 |
35 |
36 |
37 | 12.5%
38 |
44 |
49 |
50 |
51 |
52 |
53 |
78 |
79 | );
80 | };
81 |
82 | const SalesChart: FC = function () {
83 | const { mode } = useTheme();
84 | const isDarkTheme = mode === "dark";
85 |
86 | const borderColor = isDarkTheme ? "#374151" : "#F3F4F6";
87 | const labelColor = isDarkTheme ? "#93ACAF" : "#6B7280";
88 | const opacityFrom = isDarkTheme ? 0 : 1;
89 | const opacityTo = isDarkTheme ? 0 : 1;
90 |
91 | const options: ApexCharts.ApexOptions = {
92 | stroke: {
93 | curve: "smooth",
94 | },
95 | chart: {
96 | type: "area",
97 | fontFamily: "Inter, sans-serif",
98 | foreColor: labelColor,
99 | toolbar: {
100 | show: false,
101 | },
102 | },
103 | fill: {
104 | type: "gradient",
105 | gradient: {
106 | opacityFrom,
107 | opacityTo,
108 | type: "vertical",
109 | },
110 | },
111 | dataLabels: {
112 | enabled: false,
113 | },
114 | tooltip: {
115 | style: {
116 | fontSize: "14px",
117 | fontFamily: "Inter, sans-serif",
118 | },
119 | },
120 | grid: {
121 | show: true,
122 | borderColor: borderColor,
123 | strokeDashArray: 1,
124 | padding: {
125 | left: 35,
126 | bottom: 15,
127 | },
128 | },
129 | markers: {
130 | size: 5,
131 | strokeColors: "#ffffff",
132 | hover: {
133 | size: undefined,
134 | sizeOffset: 3,
135 | },
136 | },
137 | xaxis: {
138 | categories: [
139 | "01 Feb",
140 | "02 Feb",
141 | "03 Feb",
142 | "04 Feb",
143 | "05 Feb",
144 | "06 Feb",
145 | "07 Feb",
146 | ],
147 | labels: {
148 | style: {
149 | colors: [labelColor],
150 | fontSize: "14px",
151 | fontWeight: 500,
152 | },
153 | },
154 | axisBorder: {
155 | color: borderColor,
156 | },
157 | axisTicks: {
158 | color: borderColor,
159 | },
160 | crosshairs: {
161 | show: true,
162 | position: "back",
163 | stroke: {
164 | color: borderColor,
165 | width: 1,
166 | dashArray: 10,
167 | },
168 | },
169 | },
170 | yaxis: {
171 | labels: {
172 | style: {
173 | colors: [labelColor],
174 | fontSize: "14px",
175 | fontWeight: 500,
176 | },
177 | formatter: function (value) {
178 | return "$" + value;
179 | },
180 | },
181 | },
182 | legend: {
183 | fontSize: "14px",
184 | fontWeight: 500,
185 | fontFamily: "Inter, sans-serif",
186 | labels: {
187 | colors: [labelColor],
188 | },
189 | itemMargin: {
190 | horizontal: 10,
191 | },
192 | },
193 | responsive: [
194 | {
195 | breakpoint: 1024,
196 | options: {
197 | xaxis: {
198 | labels: {
199 | show: false,
200 | },
201 | },
202 | },
203 | },
204 | ],
205 | };
206 | const series = [
207 | {
208 | name: "Revenue",
209 | data: [6356, 6218, 6156, 6526, 6356, 6256, 6056],
210 | color: "#1A56DB",
211 | },
212 | ];
213 |
214 | return ;
215 | };
216 |
217 | const Datepicker: FC = function () {
218 | return (
219 |
220 |
221 |
222 | Sep 16, 2021 - Sep 22, 2021
223 |
224 |
225 | Yesterday
226 | Today
227 | Last 7 days
228 | Last 30 days
229 | Last 90 days
230 |
231 | Custom...
232 |
233 |
234 | );
235 | };
236 |
237 | const LatestCustomers: FC = function () {
238 | return (
239 |
240 |
251 |
252 |
253 |
254 |
255 |
256 |
261 |
262 |
263 |
264 | Neil Sims
265 |
266 |
267 | email@flowbite.com
268 |
269 |
270 |
271 | $320
272 |
273 |
274 |
275 |
276 |
277 |
278 |
283 |
284 |
285 |
286 | Bonnie Green
287 |
288 |
289 | email@flowbite.com
290 |
291 |
292 |
293 | $3467
294 |
295 |
296 |
297 |
298 |
299 |
300 |
305 |
306 |
307 |
308 | Michael Gough
309 |
310 |
311 | email@flowbite.com
312 |
313 |
314 |
315 | $67
316 |
317 |
318 |
319 |
320 |
321 |
322 |
327 |
328 |
329 |
330 | Thomes Lean
331 |
332 |
333 | email@flowbite.com
334 |
335 |
336 |
337 | $2367
338 |
339 |
340 |
341 |
342 |
343 |
344 |
349 |
350 |
351 |
352 | Lana Byrd
353 |
354 |
355 | email@flowbite.com
356 |
357 |
358 |
359 | $367
360 |
361 |
362 |
363 |
364 |
365 |
390 |
391 | );
392 | };
393 |
394 | const AcquisitionOverview: FC = function () {
395 | return (
396 |
397 |
398 | Acquisition Overview
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 | Top Channels
408 |
409 |
410 | Users
411 |
412 |
413 | Acquisition
414 |
415 |
416 |
417 |
418 |
419 | Organic Search
420 |
421 |
422 | 5,649
423 |
424 |
425 |
436 |
437 |
438 |
439 |
440 | Referral
441 |
442 |
443 | 4,025
444 |
445 |
446 |
457 |
458 |
459 |
460 |
461 | Direct
462 |
463 |
464 | 3,105
465 |
466 |
467 |
478 |
479 |
480 |
481 |
482 | Social
483 |
484 |
485 | 1251
486 |
487 |
488 |
499 |
500 |
501 |
502 |
503 | Other
504 |
505 |
506 | 734
507 |
508 |
509 |
520 |
521 |
522 |
523 |
524 | Email
525 |
526 |
527 | 456
528 |
529 |
530 |
541 |
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 |
574 |
575 | );
576 | };
577 |
578 | const LatestTransactions: FC = function () {
579 | return (
580 |
581 |
582 |
583 |
584 | Latest Transactions
585 |
586 |
587 | This is a list of latest transactions
588 |
589 |
590 |
598 |
599 |
600 |
601 |
602 |
603 |
607 |
608 | Transaction
609 | Date & Time
610 | Amount
611 | Status
612 |
613 |
614 |
615 |
616 | Payment from{" "}
617 | Bonnie Green
618 |
619 |
620 | Apr 23, 2021
621 |
622 |
623 | $2300
624 |
625 |
626 | Completed
627 |
628 |
629 |
630 |
631 | Payment refund to{" "}
632 | #00910
633 |
634 |
635 | Apr 23, 2021
636 |
637 |
638 | -$670
639 |
640 |
641 | Completed
642 |
643 |
644 |
645 |
646 | Payment failed from{" "}
647 | #087651
648 |
649 |
650 | Apr 18, 2021
651 |
652 |
653 | $234
654 |
655 |
656 | Cancelled
657 |
658 |
659 |
660 |
661 | Payment from{" "}
662 | Lana Byrd
663 |
664 |
665 | Apr 15, 2021
666 |
667 |
668 | $5000
669 |
670 |
671 |
672 | In progress
673 |
674 |
675 |
676 |
677 |
678 | Payment from{" "}
679 | Jese Leos
680 |
681 |
682 | Apr 15, 2021
683 |
684 |
685 | $2300
686 |
687 |
688 | Completed
689 |
690 |
691 |
692 |
693 | Payment from{" "}
694 | THEMESBERG LLC
695 |
696 |
697 | Apr 11, 2021
698 |
699 |
700 | $560
701 |
702 |
703 | Completed
704 |
705 |
706 |
707 |
708 | Payment from{" "}
709 | Lana Lysle
710 |
711 |
712 | Apr 6, 2021
713 |
714 |
715 | $1437
716 |
717 |
718 | Completed
719 |
720 |
721 |
722 |
723 | Payment to{" "}
724 | Joseph Mcfall
725 |
726 |
727 | Apr 1, 2021
728 |
729 |
730 | $980
731 |
732 |
733 | Completed
734 |
735 |
736 |
737 |
738 | Payment from{" "}
739 | Alphabet LLC
740 |
741 |
742 | Mar 23, 2021
743 |
744 |
745 | $11,436
746 |
747 |
748 |
749 | In progress
750 |
751 |
752 |
753 |
754 |
755 | Payment from{" "}
756 | Bonnie Green
757 |
758 |
759 | Mar 23, 2021
760 |
761 |
762 | $560
763 |
764 |
765 | Completed
766 |
767 |
768 |
769 |
770 |
771 |
772 |
773 |
774 |
799 |
800 | );
801 | };
802 |
803 | export default DashboardPage;
804 |
--------------------------------------------------------------------------------
/src/pages/users/list.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable jsx-a11y/anchor-is-valid */
2 | import {
3 | Breadcrumb,
4 | Button,
5 | Checkbox,
6 | Label,
7 | Modal,
8 | Table,
9 | TextInput,
10 | } from "flowbite-react";
11 | import type { FC } from "react";
12 | import { useState } from "react";
13 | import {
14 | HiChevronLeft,
15 | HiChevronRight,
16 | HiCog,
17 | HiDocumentDownload,
18 | HiDotsVertical,
19 | HiExclamationCircle,
20 | HiHome,
21 | HiOutlineExclamationCircle,
22 | HiOutlinePencilAlt,
23 | HiPlus,
24 | HiTrash,
25 | } from "react-icons/hi";
26 | import NavbarSidebarLayout from "../../layouts/navbar-sidebar";
27 |
28 | const UserListPage: FC = function () {
29 | return (
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | Home
39 |
40 |
41 | Users
42 | List
43 |
44 |
45 | All users
46 |
47 |
48 |
49 |
50 |
51 |
52 | Search
53 |
54 |
55 |
60 |
61 |
62 |
92 |
93 |
94 |
95 |
96 |
97 |
98 | Export
99 |
100 |
101 |
102 |
103 |
104 |
105 |
114 |
115 |
116 | );
117 | };
118 |
119 | const AddUserModal: FC = function () {
120 | const [isOpen, setOpen] = useState(false);
121 |
122 | return (
123 | <>
124 | setOpen(true)}>
125 |
126 |
127 | Add user
128 |
129 |
130 | setOpen(false)} show={isOpen}>
131 |
132 | Add new user
133 |
134 |
135 |
136 |
137 |
First name
138 |
139 |
144 |
145 |
146 |
147 |
Last name
148 |
149 |
150 |
151 |
152 |
153 |
Email
154 |
155 |
161 |
162 |
163 |
164 |
Phone number
165 |
166 |
172 |
173 |
174 |
175 |
Department
176 |
177 |
182 |
183 |
184 |
185 |
Company
186 |
187 |
192 |
193 |
194 |
195 |
196 |
197 | setOpen(false)}>
198 | Add user
199 |
200 |
201 |
202 | >
203 | );
204 | };
205 |
206 | const AllUsersTable: FC = function () {
207 | return (
208 |
209 |
210 |
211 |
212 | Select all
213 |
214 |
215 |
216 | Name
217 | Position
218 | Country
219 | Status
220 | Actions
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 | checkbox
229 |
230 |
231 |
232 |
233 |
238 |
239 |
240 | Neil Sims
241 |
242 |
243 | neil.sims@flowbite.com
244 |
245 |
246 |
247 |
248 | Front-end developer
249 |
250 |
251 | United States
252 |
253 |
254 |
255 |
{" "}
256 | Active
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
275 |
276 | checkbox
277 |
278 |
279 |
280 |
281 |
286 |
287 |
288 | Roberta Casas
289 |
290 |
291 | roberta.casas@flowbite.com
292 |
293 |
294 |
295 |
296 | Designer
297 |
298 |
299 | Spain
300 |
301 |
302 |
303 |
{" "}
304 | Active
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
323 |
324 | checkbox
325 |
326 |
327 |
328 |
329 |
334 |
335 |
336 | Michael Gough
337 |
338 |
339 | michael.gough@flowbite.com
340 |
341 |
342 |
343 |
344 | React developer
345 |
346 |
347 | United Kingdom
348 |
349 |
350 |
351 |
{" "}
352 | Active
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
371 |
372 | checkbox
373 |
374 |
375 |
376 |
377 |
382 |
383 |
384 | Jese Leos
385 |
386 |
387 | jese.leos@flowbite.com
388 |
389 |
390 |
391 |
392 | Marketing
393 |
394 |
395 | United States
396 |
397 |
398 |
399 |
{" "}
400 | Active
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
419 |
420 | checkbox
421 |
422 |
423 |
424 |
425 |
430 |
431 |
432 | Bonnie Green
433 |
434 |
435 | bonnie.green@flowbite.com
436 |
437 |
438 |
439 |
440 | UI/UX Engineer
441 |
442 |
443 | AusTable.Rowalia
444 |
445 |
446 |
447 |
{" "}
448 | Offline
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
467 |
468 | checkbox
469 |
470 |
471 |
472 |
473 |
478 |
479 |
480 | Thomas Lean
481 |
482 |
483 | thomas.lean@flowbite.com
484 |
485 |
486 |
487 |
488 | Vue developer
489 |
490 |
491 | Germany
492 |
493 |
494 |
495 |
{" "}
496 | Active
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
515 |
516 | checkbox
517 |
518 |
519 |
520 |
521 |
526 |
527 |
528 | Helene Engels
529 |
530 |
531 | helene.engels@flowbite.com
532 |
533 |
534 |
535 |
536 | Product owner
537 |
538 |
539 | Canada
540 |
541 |
542 |
543 |
{" "}
544 | Active
545 |
546 |
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
563 |
564 | checkbox
565 |
566 |
567 |
568 |
569 |
574 |
575 |
576 | Lana Byrd
577 |
578 |
579 | lana.byrd@flowbite.com
580 |
581 |
582 |
583 |
584 | Designer
585 |
586 |
587 | United States
588 |
589 |
590 |
591 |
{" "}
592 | Active
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
611 |
612 | checkbox
613 |
614 |
615 |
616 |
617 |
622 |
623 |
624 | Leslie Livingston
625 |
626 |
627 | leslie.livingston@flowbite.com
628 |
629 |
630 |
631 |
632 | Web developer
633 |
634 |
635 | France
636 |
637 |
638 |
639 |
{" "}
640 | Offline
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
659 |
660 | checkbox
661 |
662 |
663 |
664 |
665 |
670 |
671 |
672 | Robert Brown
673 |
674 |
675 | robert.brown@flowbite.com
676 |
677 |
678 |
679 |
680 | Laravel developer
681 |
682 |
683 | Russia
684 |
685 |
686 |
687 |
{" "}
688 | Active
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
707 |
708 | checkbox
709 |
710 |
711 |
712 |
713 |
718 |
719 |
720 | Neil Sims
721 |
722 |
723 | neil.sims@flowbite.com
724 |
725 |
726 |
727 |
728 | Front-end developer
729 |
730 |
731 | United States
732 |
733 |
734 |
735 |
{" "}
736 | Active
737 |
738 |
739 |
740 |
741 |
742 |
743 |
744 |
745 |
746 |
747 |
748 |
749 |
755 |
756 | checkbox
757 |
758 |
759 |
760 |
761 |
766 |
767 |
768 | Roberta Casas
769 |
770 |
771 | roberta.casas@flowbite.com
772 |
773 |
774 |
775 |
776 | Designer
777 |
778 |
779 | Spain
780 |
781 |
782 |
783 |
{" "}
784 | Active
785 |
786 |
787 |
788 |
789 |
790 |
791 |
792 |
793 |
794 |
795 |
796 |
797 |
803 |
804 | checkbox
805 |
806 |
807 |
808 |
809 |
814 |
815 |
816 | Michael Gough
817 |
818 |
819 | michael.gough@flowbite.com
820 |
821 |
822 |
823 |
824 | React developer
825 |
826 |
827 | United Kingdom
828 |
829 |
830 |
831 |
{" "}
832 | Active
833 |
834 |
835 |
836 |
837 |
838 |
839 |
840 |
841 |
842 |
843 |
844 |
845 |
851 |
852 | checkbox
853 |
854 |
855 |
856 |
857 |
862 |
863 |
864 | Jese Leos
865 |
866 |
867 | jese.leos@flowbite.com
868 |
869 |
870 |
871 |
872 | Marketing
873 |
874 |
875 | United States
876 |
877 |
878 |
879 |
{" "}
880 | Active
881 |
882 |
883 |
884 |
885 |
886 |
887 |
888 |
889 |
890 |
891 |
892 |
893 |
899 |
900 | checkbox
901 |
902 |
903 |
904 |
905 |
910 |
911 |
912 | Bonnie Green
913 |
914 |
915 | bonnie.green@flowbite.com
916 |
917 |
918 |
919 |
920 | UI/UX Engineer
921 |
922 |
923 | AusTable.Rowalia
924 |
925 |
926 |
927 |
{" "}
928 | Offline
929 |
930 |
931 |
932 |
933 |
934 |
935 |
936 |
937 |
938 |
939 |
940 |
941 |
942 |
948 |
949 | checkbox
950 |
951 |
952 |
953 |
954 |
959 |
960 |
961 | Thomas Lean
962 |
963 |
964 | thomas.lean@flowbite.com
965 |
966 |
967 |
968 |
969 | Vue developer
970 |
971 |
972 | Germany
973 |
974 |
975 |
976 |
{" "}
977 | Active
978 |
979 |
980 |
981 |
982 |
983 |
984 |
985 |
986 |
987 |
988 |
989 |
990 |
991 |
997 |
998 | checkbox
999 |
1000 |
1001 |
1002 |
1003 |
1008 |
1009 |
1010 | Helene Engels
1011 |
1012 |
1013 | helene.engels@flowbite.com
1014 |
1015 |
1016 |
1017 |
1018 | Product owner
1019 |
1020 |
1021 | Canada
1022 |
1023 |
1024 |
1025 |
{" "}
1026 | Active
1027 |
1028 |
1029 |
1030 |
1031 |
1032 |
1033 |
1034 |
1035 |
1036 |
1037 |
1038 |
1039 |
1045 |
1046 | checkbox
1047 |
1048 |
1049 |
1050 |
1051 |
1056 |
1057 |
1058 | Lana Byrd
1059 |
1060 |
1061 | lana.byrd@flowbite.com
1062 |
1063 |
1064 |
1065 |
1066 | Designer
1067 |
1068 |
1069 | United States
1070 |
1071 |
1072 |
1073 |
{" "}
1074 | Active
1075 |
1076 |
1077 |
1078 |
1079 |
1080 |
1081 |
1082 |
1083 |
1084 |
1085 |
1086 |
1087 |
1093 |
1094 | checkbox
1095 |
1096 |
1097 |
1098 |
1099 |
1104 |
1105 |
1106 | Leslie Livingston
1107 |
1108 |
1109 | leslie.livingston@flowbite.com
1110 |
1111 |
1112 |
1113 |
1114 | Web developer
1115 |
1116 |
1117 | France
1118 |
1119 |
1120 |
1121 |
{" "}
1122 | Offline
1123 |
1124 |
1125 |
1126 |
1127 |
1128 |
1129 |
1130 |
1131 |
1132 |
1133 |
1134 |
1135 |
1141 |
1142 | checkbox
1143 |
1144 |
1145 |
1146 |
1147 |
1152 |
1153 |
1154 | Robert Brown
1155 |
1156 |
1157 | robert.brown@flowbite.com
1158 |
1159 |
1160 |
1161 |
1162 | Laravel developer
1163 |
1164 |
1165 | Russia
1166 |
1167 |
1168 |
1169 |
{" "}
1170 | Active
1171 |
1172 |
1173 |
1174 |
1175 |
1176 |
1177 |
1178 |
1179 |
1180 |
1181 |
1182 | );
1183 | };
1184 |
1185 | const EditUserModal: FC = function () {
1186 | const [isOpen, setOpen] = useState(false);
1187 |
1188 | return (
1189 | <>
1190 | setOpen(true)}>
1191 |
1192 |
1193 | Edit user
1194 |
1195 |
1196 | setOpen(false)} show={isOpen}>
1197 |
1198 | Edit user
1199 |
1200 |
1201 |
1202 |
1203 |
First name
1204 |
1205 |
1210 |
1211 |
1212 |
1213 |
Last name
1214 |
1215 |
1216 |
1217 |
1218 |
1219 |
Email
1220 |
1221 |
1227 |
1228 |
1229 |
1230 |
Phone number
1231 |
1232 |
1238 |
1239 |
1240 |
1241 |
Department
1242 |
1243 |
1248 |
1249 |
1250 |
1251 |
Company
1252 |
1253 |
1258 |
1259 |
1260 |
1261 |
Current password
1262 |
1263 |
1269 |
1270 |
1271 |
1272 |
New password
1273 |
1274 |
1280 |
1281 |
1282 |
1283 |
1284 |
1285 | setOpen(false)}>
1286 | Save all
1287 |
1288 |
1289 |
1290 | >
1291 | );
1292 | };
1293 |
1294 | const DeleteUserModal: FC = function () {
1295 | const [isOpen, setOpen] = useState(false);
1296 |
1297 | return (
1298 | <>
1299 | setOpen(true)}>
1300 |
1301 |
1302 | Delete user
1303 |
1304 |
1305 | setOpen(false)} show={isOpen} size="md">
1306 |
1307 | Delete user
1308 |
1309 |
1310 |
1311 |
1312 |
1313 | Are you sure you want to delete this user?
1314 |
1315 |
1316 | setOpen(false)}>
1317 | Yes, I'm sure
1318 |
1319 | setOpen(false)}>
1320 | No, cancel
1321 |
1322 |
1323 |
1324 |
1325 |
1326 | >
1327 | );
1328 | };
1329 |
1330 | export const Pagination: FC = function () {
1331 | return (
1332 |
1376 | );
1377 | };
1378 |
1379 | export default UserListPage;
1380 |
--------------------------------------------------------------------------------
/src/svgmap.d.ts:
--------------------------------------------------------------------------------
1 | declare module "svgmap";
2 |
--------------------------------------------------------------------------------
/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-undef */
2 | /** @type {import('tailwindcss').Config} */
3 | module.exports = {
4 | content: [
5 | "./index.html",
6 | "./node_modules/flowbite-react/lib/**/*.{js,ts}",
7 | "./src/**/*.{ts,tsx}",
8 | ],
9 | theme: {
10 | colors: {
11 | primary: {
12 | 50: "#eff6ff",
13 | 100: "#dbeafe",
14 | 200: "#bfdbfe",
15 | 300: "#93c5fd",
16 | 400: "#60a5fa",
17 | 500: "#3b82f6",
18 | 600: "#2563eb",
19 | 700: "#1d4ed8",
20 | 800: "#1e40af",
21 | 900: "#1e3a8a",
22 | },
23 | },
24 | fontFamily: {
25 | sans: [
26 | "Inter",
27 | "ui-sans-serif",
28 | "system-ui",
29 | "-apple-system",
30 | "system-ui",
31 | "Segoe UI",
32 | "Roboto",
33 | "Helvetica Neue",
34 | "Arial",
35 | "Noto Sans",
36 | "sans-serif",
37 | "Apple Color Emoji",
38 | "Segoe UI Emoji",
39 | "Segoe UI Symbol",
40 | "Noto Color Emoji",
41 | ],
42 | body: [
43 | "Inter",
44 | "ui-sans-serif",
45 | "system-ui",
46 | "-apple-system",
47 | "system-ui",
48 | "Segoe UI",
49 | "Roboto",
50 | "Helvetica Neue",
51 | "Arial",
52 | "Noto Sans",
53 | "sans-serif",
54 | "Apple Color Emoji",
55 | "Segoe UI Emoji",
56 | "Segoe UI Symbol",
57 | "Noto Color Emoji",
58 | ],
59 | mono: [
60 | "ui-monospace",
61 | "SFMono-Regular",
62 | "Menlo",
63 | "Monaco",
64 | "Consolas",
65 | "Liberation Mono",
66 | "Courier New",
67 | "monospace",
68 | ],
69 | },
70 | extend: {},
71 | },
72 | plugins: [require("flowbite/plugin")],
73 | };
74 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "display": "Default",
4 | "compilerOptions": {
5 | "allowJs": true,
6 | "declaration": true,
7 | "declarationMap": true,
8 | "esModuleInterop": true,
9 | "forceConsistentCasingInFileNames": true,
10 | "incremental": true,
11 | "isolatedModules": true,
12 | "jsx": "react-jsx",
13 | "lib": ["DOM", "DOM.Iterable", "ESNext"],
14 | "moduleResolution": "node",
15 | "noEmit": true,
16 | "noFallthroughCasesInSwitch": true,
17 | "noImplicitReturns": true,
18 | "noPropertyAccessFromIndexSignature": true,
19 | "noUncheckedIndexedAccess": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "resolveJsonModule": true,
23 | "skipLibCheck": true,
24 | "sourceMap": true,
25 | "strict": true,
26 | "target": "ESNext",
27 | "types": ["vite/client"]
28 | },
29 | "exclude": ["node_modules"],
30 | "include": ["**/*.cjs", "**/*.mjs", "**/*.ts", "**/*.tsx"]
31 | }
32 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import react from "@vitejs/plugin-react";
3 |
4 | export default defineConfig({
5 | plugins: [react()],
6 | });
7 |
--------------------------------------------------------------------------------