diff --git a/template/.editorconfig b/template/.editorconfig
new file mode 100644
index 0000000..1a3af92
--- /dev/null
+++ b/template/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = space
+indent_size = 2
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/template/.eslintignore b/template/.eslintignore
new file mode 100644
index 0000000..5e43a56
--- /dev/null
+++ b/template/.eslintignore
@@ -0,0 +1,22 @@
+// .eslintignore
+build/*
+dist/*
+public/*
+**/out/*
+**/node_modules/*
+
+**/.next/*
+next.config.js
+
+vite.config.js
+vite.config.ts
+
+src/reportWebVitals.js
+src/service-worker.js
+src/serviceWorkerRegistration.js
+src/setupTests.js
+
+src/reportWebVitals.ts
+src/service-worker.ts
+src/serviceWorkerRegistration.ts
+src/setupTests.ts
diff --git a/template/.eslintrc b/template/.eslintrc
new file mode 100644
index 0000000..ca72eb7
--- /dev/null
+++ b/template/.eslintrc
@@ -0,0 +1,176 @@
+{
+ "root": true,
+ "env": {
+ "browser": true,
+ "es2021": true
+ },
+ "plugins": [
+ "perfectionist",
+ "unused-imports",
+ "prettier"
+ ],
+ "extends": [
+ "airbnb",
+ "airbnb/hooks",
+ "prettier"
+ ],
+ "parserOptions": {
+ "ecmaVersion": "latest",
+ "sourceType": "module",
+ "ecmaFeatures": {
+ "jsx": true
+ }
+ },
+ "settings": {
+ "react": {
+ "version": "detect"
+ },
+ "import/resolver": {
+ "alias": {
+ "map": [
+ [
+ "src",
+ "./src"
+ ]
+ ],
+ "extensions": [
+ ".js",
+ ".jsx",
+ ".json"
+ ]
+ }
+ }
+ },
+ "rules": {
+ "no-alert": 0,
+ "camelcase": 0,
+ "no-console": 0,
+ "no-param-reassign": 0,
+ "naming-convention": 0,
+ "default-param-last": 0,
+ "no-underscore-dangle": 0,
+ "no-use-before-define": 0,
+ "no-restricted-exports": 0,
+ "react/no-children-prop": 0,
+ "react/forbid-prop-types": 0,
+ "react/react-in-jsx-scope": 0,
+ "jsx-a11y/anchor-is-valid": 0,
+ "react/no-array-index-key": 0,
+ "no-promise-executor-return": 0,
+ "react/require-default-props": 0,
+ "react/jsx-filename-extension": 0,
+ "react/jsx-props-no-spreading": 0,
+ "import/prefer-default-export": 0,
+ "react/function-component-definition": 0,
+ "jsx-a11y/control-has-associated-label": 0,
+ "react/jsx-no-useless-fragment": [
+ 1,
+ {
+ "allowExpressions": true
+ }
+ ],
+ "prefer-destructuring": [
+ 1,
+ {
+ "object": true,
+ "array": false
+ }
+ ],
+ "react/no-unstable-nested-components": [
+ 1,
+ {
+ "allowAsProps": true
+ }
+ ],
+ "no-unused-vars": [
+ 1,
+ {
+ "args": "none"
+ }
+ ],
+ "react/jsx-no-duplicate-props": [
+ 1,
+ {
+ "ignoreCase": false
+ }
+ ],
+ // unused-imports
+ // https://www.npmjs.com/package/eslint-plugin-unused-imports
+ "unused-imports/no-unused-imports": 1,
+ "unused-imports/no-unused-vars": [
+ 0,
+ {
+ "vars": "all",
+ "varsIgnorePattern": "^_",
+ "args": "after-used",
+ "argsIgnorePattern": "^_"
+ }
+ ],
+ // perfectionist
+ // https://eslint-plugin-perfectionist.azat.io/
+ "perfectionist/sort-named-imports": [
+ 1,
+ {
+ "order": "asc",
+ "type": "line-length"
+ }
+ ],
+ "perfectionist/sort-named-exports": [
+ 1,
+ {
+ "order": "asc",
+ "type": "line-length"
+ }
+ ],
+ "perfectionist/sort-exports": [
+ 1,
+ {
+ "order": "asc",
+ "type": "line-length"
+ }
+ ],
+ "perfectionist/sort-imports": [
+ 1,
+ {
+ "order": "asc",
+ "type": "line-length",
+ "newlines-between": "always",
+ "groups": [
+ [
+ "builtin",
+ "external"
+ ],
+ "custom-mui",
+ "custom-routes",
+ "custom-hooks",
+ "custom-utils",
+ "internal",
+ "custom-components",
+ "custom-sections",
+ "custom-types",
+ [
+ "parent",
+ "sibling",
+ "index"
+ ],
+ "object",
+ "unknown"
+ ],
+ "custom-groups": {
+ "value": {
+ "custom-mui": "@mui/**",
+ "custom-routes": "src/routes/**",
+ "custom-hooks": "src/hooks/**",
+ "custom-utils": "src/utils/**",
+ "custom-components": "src/components/**",
+ "custom-sections": "src/sections/**",
+ "custom-types": "src/types/**"
+ }
+ },
+ "internal-pattern": [
+ "src/**"
+ ]
+ }
+ ]
+ }
+}
diff --git a/template/.gitignore b/template/.gitignore
new file mode 100644
index 0000000..44300dc
--- /dev/null
+++ b/template/.gitignore
@@ -0,0 +1,36 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+node_modules
+.pnp
+.pnp.js
+
+# testing
+coverage
+
+# production
+.next
+.swc
+_static
+out
+dist
+build
+
+# environment variables
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# misc
+.DS_Store
+.vercel
+.netlify
+.unimportedrc.json
+tsconfig.tsbuildinfo
+.vscode
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/template/.prettierignore b/template/.prettierignore
new file mode 100644
index 0000000..7ea9455
--- /dev/null
+++ b/template/.prettierignore
@@ -0,0 +1,9 @@
+build/*
+dist/*
+public/*
+**/out/*
+**/.next/*
+**/node_modules/*
+
+package-lock.json
+yarn.lock
diff --git a/template/.prettierrc b/template/.prettierrc
new file mode 100644
index 0000000..9ddd2fd
--- /dev/null
+++ b/template/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "printWidth": 100,
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "tabWidth": 2
+}
diff --git a/template/README.md b/template/README.md
new file mode 100644
index 0000000..0d3b4f0
--- /dev/null
+++ b/template/README.md
@@ -0,0 +1,13 @@
+## NODE.JS
+
+- Node 16.x || 18.x
+
+## USING YARN (Recommend)
+
+- yarn install
+- yarn start
+
+## USING NPM
+
+- npm i OR npm i --legacy-peer-deps
+- npm start
diff --git a/template/index.html b/template/index.html
new file mode 100644
index 0000000..e9e53e6
--- /dev/null
+++ b/template/index.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Zone UI Kit
+
+
+
+
+
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
+
diff --git a/template/jsconfig.json b/template/jsconfig.json
new file mode 100644
index 0000000..fb8ee3d
--- /dev/null
+++ b/template/jsconfig.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "baseUrl": "."
+ }
+}
diff --git a/template/package-lock.json b/template/package-lock.json
new file mode 100644
index 0000000..9053aef
--- /dev/null
+++ b/template/package-lock.json
@@ -0,0 +1,6555 @@
+{
+ "name": "@zone-kit/vite-js",
+ "version": "2.4.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@zone-kit/vite-js",
+ "version": "2.4.0",
+ "dependencies": {
+ "@emotion/cache": "^11.11.0",
+ "@emotion/react": "^11.11.1",
+ "@emotion/styled": "^11.11.0",
+ "@hookform/resolvers": "^3.3.2",
+ "@iconify/react": "^4.1.1",
+ "@mui/lab": "^5.0.0-alpha.155",
+ "@mui/material": "^5.14.20",
+ "@mui/system": "^5.14.20",
+ "@mui/x-date-pickers": "^6.18.4",
+ "date-fns": "^2.30.0",
+ "framer-motion": "^10.16.16",
+ "google-map-react": "^2.2.1",
+ "lodash.isequal": "^4.5.0",
+ "lodash.merge": "^4.6.2",
+ "mui-one-time-password-input": "^2.0.1",
+ "nprogress": "^0.2.0",
+ "prop-types": "^15.8.1",
+ "react": "^18.2.0",
+ "react-countup": "^6.5.0",
+ "react-dom": "^18.2.0",
+ "react-helmet-async": "^2.0.3",
+ "react-hook-form": "^7.48.2",
+ "react-lazy-load-image-component": "^1.6.0",
+ "react-player": "^2.13.0",
+ "react-router": "^6.20.1",
+ "react-router-dom": "^6.20.1",
+ "react-slick": "^0.29.0",
+ "simplebar-react": "^3.2.4",
+ "slick-carousel": "^1.8.1",
+ "stylis": "^4.3.0",
+ "stylis-plugin-rtl": "^2.1.1",
+ "yet-another-react-lightbox": "^3.15.6",
+ "yup": "^1.3.2"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "eslint": "^8.55.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-import-resolver-alias": "^1.1.2",
+ "eslint-plugin-import": "^2.29.0",
+ "eslint-plugin-jsx-a11y": "^6.8.0",
+ "eslint-plugin-perfectionist": "^2.5.0",
+ "eslint-plugin-prettier": "^5.0.1",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-unused-imports": "^3.0.0",
+ "prettier": "^3.1.1",
+ "typescript": "^5.3.3",
+ "vite": "^5.0.7",
+ "vite-plugin-checker": "^0.6.2"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "dependencies": {
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz",
+ "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz",
+ "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
+ "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/serialize": "^1.1.2",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ },
+ "node_modules/@emotion/cache": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
+ "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/sheet": "^1.2.2",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/cache/node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
+ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
+ "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
+ },
+ "node_modules/@emotion/react": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz",
+ "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/cache": "^11.11.0",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "hoist-non-react-statics": "^3.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/serialize": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz",
+ "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==",
+ "dependencies": {
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/unitless": "^0.8.1",
+ "@emotion/utils": "^1.2.1",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@emotion/sheet": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
+ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
+ },
+ "node_modules/@emotion/styled": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
+ "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/is-prop-valid": "^1.2.1",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0-rc.0",
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
+ "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@emotion/utils": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
+ "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
+ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz",
+ "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz",
+ "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz",
+ "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz",
+ "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz",
+ "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz",
+ "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz",
+ "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz",
+ "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz",
+ "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz",
+ "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz",
+ "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz",
+ "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz",
+ "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz",
+ "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz",
+ "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz",
+ "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz",
+ "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz",
+ "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz",
+ "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz",
+ "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz",
+ "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz",
+ "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+ "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz",
+ "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz",
+ "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz",
+ "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==",
+ "dependencies": {
+ "@floating-ui/core": "^1.4.2",
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz",
+ "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==",
+ "dependencies": {
+ "@floating-ui/dom": "^1.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
+ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
+ },
+ "node_modules/@googlemaps/js-api-loader": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.2.tgz",
+ "integrity": "sha512-psGw5u0QM6humao48Hn4lrChOM2/rA43ZCm3tKK9qQsEj1/VzqkCqnvGfEOshDbBQflydfaRovbKwZMF4AyqbA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "node_modules/@hookform/resolvers": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.2.tgz",
+ "integrity": "sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==",
+ "peerDependencies": {
+ "react-hook-form": "^7.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.13",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
+ "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
+ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+ "dev": true
+ },
+ "node_modules/@iconify/react": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@iconify/react/-/react-4.1.1.tgz",
+ "integrity": "sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==",
+ "dependencies": {
+ "@iconify/types": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/cyberalien"
+ },
+ "peerDependencies": {
+ "react": ">=16"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="
+ },
+ "node_modules/@mapbox/point-geometry": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
+ "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="
+ },
+ "node_modules/@mui/base": {
+ "version": "5.0.0-beta.26",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.26.tgz",
+ "integrity": "sha512-gPMRKC84VRw+tjqYoyBzyrBUqHQucMXdlBpYazHa5rCXrb91fYEQk5SqQ2U5kjxx9QxZxTBvWAmZ6DblIgaGhQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.4",
+ "@floating-ui/react-dom": "^2.0.4",
+ "@mui/types": "^7.2.10",
+ "@mui/utils": "^5.14.20",
+ "@popperjs/core": "^2.11.8",
+ "clsx": "^2.0.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/core-downloads-tracker": {
+ "version": "5.14.20",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.20.tgz",
+ "integrity": "sha512-fXoGe8VOrIYajqALysFuyal1q1YmBARqJ3tmnWYDVl0scu8f6h6tZQbS2K8BY28QwkWNGyv4WRfuUkzN5HR3Ow==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ }
+ },
+ "node_modules/@mui/lab": {
+ "version": "5.0.0-alpha.155",
+ "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.155.tgz",
+ "integrity": "sha512-9mE929QFToQnSghSwvcy3Yeg+Pkj2WnR6z9OP871JiqFDL80b6OaLg2qyUt4zTFhbiBwUyBTJQ9XFrkFIibLHw==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.4",
+ "@mui/base": "5.0.0-beta.26",
+ "@mui/system": "^5.14.20",
+ "@mui/types": "^7.2.10",
+ "@mui/utils": "^5.14.20",
+ "clsx": "^2.0.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@mui/material": ">=5.10.11",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/material": {
+ "version": "5.14.20",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.20.tgz",
+ "integrity": "sha512-SUcPZnN6e0h1AtrDktEl76Dsyo/7pyEUQ+SAVe9XhHg/iliA0b4Vo+Eg4HbNkELsMbpDsUF4WHp7rgflPG7qYQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.4",
+ "@mui/base": "5.0.0-beta.26",
+ "@mui/core-downloads-tracker": "^5.14.20",
+ "@mui/system": "^5.14.20",
+ "@mui/types": "^7.2.10",
+ "@mui/utils": "^5.14.20",
+ "@types/react-transition-group": "^4.4.9",
+ "clsx": "^2.0.0",
+ "csstype": "^3.1.2",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/private-theming": {
+ "version": "5.14.20",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.20.tgz",
+ "integrity": "sha512-WV560e1vhs2IHCh0pgUaWHznrcrVoW9+cDCahU1VTkuwPokWVvb71ccWQ1f8Y3tRBPPcNkU2dChkkRJChLmQlQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.4",
+ "@mui/utils": "^5.14.20",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/styled-engine": {
+ "version": "5.14.20",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.20.tgz",
+ "integrity": "sha512-Vs4nGptd9wRslo9zeRkuWcZeIEp+oYbODy+fiZKqqr4CH1Gfi9fdP0Q1tGYk8OiJ2EPB/tZSAyOy62Hyp/iP7g==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.4",
+ "@emotion/cache": "^11.11.0",
+ "csstype": "^3.1.2",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.4.1",
+ "@emotion/styled": "^11.3.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/system": {
+ "version": "5.14.20",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.20.tgz",
+ "integrity": "sha512-jKOGtK4VfYZG5kdaryUHss4X6hzcfh0AihT8gmnkfqRtWP7xjY+vPaUhhuSeibE5sqA5wCtdY75z6ep9pxFnIg==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.4",
+ "@mui/private-theming": "^5.14.20",
+ "@mui/styled-engine": "^5.14.19",
+ "@mui/types": "^7.2.10",
+ "@mui/utils": "^5.14.20",
+ "clsx": "^2.0.0",
+ "csstype": "^3.1.2",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/types": {
+ "version": "7.2.10",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.10.tgz",
+ "integrity": "sha512-wX1vbDC+lzF7FlhT6A3ffRZgEoKWPF8VqRoTu4lZwouFX2t90KyCMsgepMw5DxLak1BSp/KP86CmtZttikb/gQ==",
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils": {
+ "version": "5.14.20",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.20.tgz",
+ "integrity": "sha512-Y6yL5MoFmtQml20DZnaaK1znrCEwG6/vRSzW8PKOTrzhyqKIql0FazZRUR7sA5EPASgiyKZfq0FPwISRXm5NdA==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.4",
+ "@types/prop-types": "^15.7.11",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/x-date-pickers": {
+ "version": "6.18.4",
+ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.4.tgz",
+ "integrity": "sha512-YqJ6lxZHBIt344B3bvRAVbdYSQz4dcmJQXGcfvJTn26VdKjpgzjAqwhlbQhbAt55audJOWzGB99ImuQuljDROA==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2",
+ "@mui/base": "^5.0.0-beta.22",
+ "@mui/utils": "^5.14.16",
+ "@types/react-transition-group": "^4.4.8",
+ "clsx": "^2.0.0",
+ "prop-types": "^15.8.1",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.9.0",
+ "@emotion/styled": "^11.8.1",
+ "@mui/material": "^5.8.6",
+ "@mui/system": "^5.8.0",
+ "date-fns": "^2.25.0",
+ "date-fns-jalali": "^2.13.0-0",
+ "dayjs": "^1.10.7",
+ "luxon": "^3.0.2",
+ "moment": "^2.29.4",
+ "moment-hijri": "^2.1.2",
+ "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "date-fns": {
+ "optional": true
+ },
+ "date-fns-jalali": {
+ "optional": true
+ },
+ "dayjs": {
+ "optional": true
+ },
+ "luxon": {
+ "optional": true
+ },
+ "moment": {
+ "optional": true
+ },
+ "moment-hijri": {
+ "optional": true
+ },
+ "moment-jalaali": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgr/utils": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz",
+ "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "fast-glob": "^3.3.0",
+ "is-glob": "^4.0.3",
+ "open": "^9.1.0",
+ "picocolors": "^1.0.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz",
+ "integrity": "sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.7.0.tgz",
+ "integrity": "sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.7.0.tgz",
+ "integrity": "sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.7.0.tgz",
+ "integrity": "sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.7.0.tgz",
+ "integrity": "sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.7.0.tgz",
+ "integrity": "sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.7.0.tgz",
+ "integrity": "sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.7.0.tgz",
+ "integrity": "sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.7.0.tgz",
+ "integrity": "sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.7.0.tgz",
+ "integrity": "sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.7.0.tgz",
+ "integrity": "sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.7.0.tgz",
+ "integrity": "sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.7.0.tgz",
+ "integrity": "sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.7.0.tgz",
+ "integrity": "sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@swc/core": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.100.tgz",
+ "integrity": "sha512-7dKgTyxJjlrMwFZYb1auj3Xq0D8ZBe+5oeIgfMlRU05doXZypYJe0LAk0yjj3WdbwYzpF+T1PLxwTWizI0pckw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@swc/counter": "^0.1.1",
+ "@swc/types": "^0.1.5"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.3.100",
+ "@swc/core-darwin-x64": "1.3.100",
+ "@swc/core-linux-arm64-gnu": "1.3.100",
+ "@swc/core-linux-arm64-musl": "1.3.100",
+ "@swc/core-linux-x64-gnu": "1.3.100",
+ "@swc/core-linux-x64-musl": "1.3.100",
+ "@swc/core-win32-arm64-msvc": "1.3.100",
+ "@swc/core-win32-ia32-msvc": "1.3.100",
+ "@swc/core-win32-x64-msvc": "1.3.100"
+ },
+ "peerDependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.100.tgz",
+ "integrity": "sha512-XVWFsKe6ei+SsDbwmsuRkYck1SXRpO60Hioa4hoLwR8fxbA9eVp6enZtMxzVVMBi8ej5seZ4HZQeAWepbukiBw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.100.tgz",
+ "integrity": "sha512-KF/MXrnH1nakm1wbt4XV8FS7kvqD9TGmVxeJ0U4bbvxXMvzeYUurzg3AJUTXYmXDhH/VXOYJE5N5RkwZZPs5iA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.100.tgz",
+ "integrity": "sha512-p8hikNnAEJrw5vHCtKiFT4hdlQxk1V7vqPmvUDgL/qe2menQDK/i12tbz7/3BEQ4UqUPnvwpmVn2d19RdEMNxw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.100.tgz",
+ "integrity": "sha512-BWx/0EeY89WC4q3AaIaBSGfQxkYxIlS3mX19dwy2FWJs/O+fMvF9oLk/CyJPOZzbp+1DjGeeoGFuDYpiNO91JA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.100.tgz",
+ "integrity": "sha512-XUdGu3dxAkjsahLYnm8WijPfKebo+jHgHphDxaW0ovI6sTdmEGFDew7QzKZRlbYL2jRkUuuKuDGvD6lO5frmhA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.100.tgz",
+ "integrity": "sha512-PhoXKf+f0OaNW/GCuXjJ0/KfK9EJX7z2gko+7nVnEA0p3aaPtbP6cq1Ubbl6CMoPL+Ci3gZ7nYumDqXNc3CtLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.100.tgz",
+ "integrity": "sha512-PwLADZN6F9cXn4Jw52FeP/MCLVHm8vwouZZSOoOScDtihjY495SSjdPnlosMaRSR4wJQssGwiD/4MbpgQPqbAw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.100.tgz",
+ "integrity": "sha512-0f6nicKSLlDKlyPRl2JEmkpBV4aeDfRQg6n8mPqgL7bliZIcDahG0ej+HxgNjZfS3e0yjDxsNRa6sAqWU2Z60A==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.100.tgz",
+ "integrity": "sha512-b7J0rPoMkRTa3XyUGt8PwCaIBuYWsL2DqbirrQKRESzgCvif5iNpqaM6kjIjI/5y5q1Ycv564CB51YDpiS8EtQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz",
+ "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==",
+ "dev": true
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz",
+ "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.14.202",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
+ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ=="
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.12",
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.11",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
+ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.43",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.43.tgz",
+ "integrity": "sha512-nvOV01ZdBdd/KW6FahSbcNplt2jCJfyWdTos61RYHV+FVv5L/g9AOX1bmbVcWcLFL8+KHQfh1zVIQrud6ihyQA==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.10",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
+ "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A=="
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
+ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.13.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz",
+ "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.13.2",
+ "@typescript-eslint/visitor-keys": "6.13.2"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.13.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz",
+ "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.13.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz",
+ "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.13.2",
+ "@typescript-eslint/visitor-keys": "6.13.2",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.13.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz",
+ "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.13.2",
+ "@typescript-eslint/types": "6.13.2",
+ "@typescript-eslint/typescript-estree": "6.13.2",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.13.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz",
+ "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.13.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-react-swc": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.5.0.tgz",
+ "integrity": "sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==",
+ "dev": true,
+ "dependencies": {
+ "@swc/core": "^1.3.96"
+ },
+ "peerDependencies": {
+ "vite": "^4 || ^5"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
+ "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "dev": true,
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
+ "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
+ "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
+ "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
+ "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true
+ },
+ "node_modules/asynciterator.prototype": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
+ "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz",
+ "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz",
+ "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==",
+ "dev": true,
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bplist-parser": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
+ "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==",
+ "dev": true,
+ "dependencies": {
+ "big-integer": "^1.6.44"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bundle-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz",
+ "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==",
+ "dev": true,
+ "dependencies": {
+ "run-applescript": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/can-use-dom": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz",
+ "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ=="
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
+ "node_modules/clsx": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
+ "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/countup.js": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.8.0.tgz",
+ "integrity": "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ=="
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssjanus": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cssjanus/-/cssjanus-2.1.0.tgz",
+ "integrity": "sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true
+ },
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-browser": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz",
+ "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==",
+ "dev": true,
+ "dependencies": {
+ "bundle-name": "^3.0.0",
+ "default-browser-id": "^3.0.0",
+ "execa": "^7.1.1",
+ "titleize": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz",
+ "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==",
+ "dev": true,
+ "dependencies": {
+ "bplist-parser": "^0.2.0",
+ "untildify": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/enquire.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
+ "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw=="
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
+ "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.2",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.5",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.2",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.12",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "safe-array-concat": "^1.0.1",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.8",
+ "string.prototype.trimend": "^1.0.7",
+ "string.prototype.trimstart": "^1.0.7",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
+ "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
+ "dev": true,
+ "dependencies": {
+ "asynciterator.prototype": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.1",
+ "es-set-tostringtag": "^2.0.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.0.1"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
+ "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "has-tostringtag": "^1.0.0",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz",
+ "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.19.9",
+ "@esbuild/android-arm64": "0.19.9",
+ "@esbuild/android-x64": "0.19.9",
+ "@esbuild/darwin-arm64": "0.19.9",
+ "@esbuild/darwin-x64": "0.19.9",
+ "@esbuild/freebsd-arm64": "0.19.9",
+ "@esbuild/freebsd-x64": "0.19.9",
+ "@esbuild/linux-arm": "0.19.9",
+ "@esbuild/linux-arm64": "0.19.9",
+ "@esbuild/linux-ia32": "0.19.9",
+ "@esbuild/linux-loong64": "0.19.9",
+ "@esbuild/linux-mips64el": "0.19.9",
+ "@esbuild/linux-ppc64": "0.19.9",
+ "@esbuild/linux-riscv64": "0.19.9",
+ "@esbuild/linux-s390x": "0.19.9",
+ "@esbuild/linux-x64": "0.19.9",
+ "@esbuild/netbsd-x64": "0.19.9",
+ "@esbuild/openbsd-x64": "0.19.9",
+ "@esbuild/sunos-x64": "0.19.9",
+ "@esbuild/win32-arm64": "0.19.9",
+ "@esbuild/win32-ia32": "0.19.9",
+ "@esbuild/win32-x64": "0.19.9"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz",
+ "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.55.0",
+ "@humanwhocodes/config-array": "^0.11.13",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-airbnb": {
+ "version": "19.0.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
+ "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
+ "dev": true,
+ "dependencies": {
+ "eslint-config-airbnb-base": "^15.0.0",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5"
+ },
+ "engines": {
+ "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.28.0",
+ "eslint-plugin-react-hooks": "^4.3.0"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
+ "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "dev": true,
+ "dependencies": {
+ "confusing-browser-globals": "^1.0.10",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.2"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
+ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-alias": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz",
+ "integrity": "sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ },
+ "peerDependencies": {
+ "eslint-plugin-import": ">=1.4.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+ "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz",
+ "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.7",
+ "array.prototype.findlastindex": "^1.2.3",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.8.0",
+ "hasown": "^2.0.0",
+ "is-core-module": "^2.13.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.7",
+ "object.groupby": "^1.0.1",
+ "object.values": "^1.1.7",
+ "semver": "^6.3.1",
+ "tsconfig-paths": "^3.14.2"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz",
+ "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.23.2",
+ "aria-query": "^5.3.0",
+ "array-includes": "^3.1.7",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "=4.7.0",
+ "axobject-query": "^3.2.1",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "es-iterator-helpers": "^1.0.15",
+ "hasown": "^2.0.0",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.7",
+ "object.fromentries": "^2.0.7"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-perfectionist": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-2.5.0.tgz",
+ "integrity": "sha512-F6XXcq4mKKUe/SREoMGQqzgw6cgCgf3pFzkFfQVIGtqD1yXVpQjnhTepzhBeZfxZwgMzR9HO4yH4CUhIQ2WBcQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "^6.13.0",
+ "minimatch": "^9.0.3",
+ "natural-compare-lite": "^1.4.0"
+ },
+ "peerDependencies": {
+ "astro-eslint-parser": "^0.16.0",
+ "eslint": ">=8.0.0",
+ "svelte": ">=3.0.0",
+ "svelte-eslint-parser": "^0.33.0",
+ "vue-eslint-parser": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "astro-eslint-parser": {
+ "optional": true
+ },
+ "svelte": {
+ "optional": true
+ },
+ "svelte-eslint-parser": {
+ "optional": true
+ },
+ "vue-eslint-parser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-perfectionist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-perfectionist/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz",
+ "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0",
+ "synckit": "^0.8.5"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.33.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
+ "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.0.12",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-unused-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz",
+ "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==",
+ "dev": true,
+ "dependencies": {
+ "eslint-rule-composer": "^0.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
+ "eslint": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-rule-composer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
+ "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ },
+ "node_modules/execa": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
+ "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.1",
+ "human-signals": "^4.3.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^3.0.7",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "10.16.16",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.16.tgz",
+ "integrity": "sha512-je6j91rd7NmUX7L1XHouwJ4v3R+SO4umso2LUcgOct3rHZ0PajZ80ETYZTajzEXEl9DlKyzjyt4AvGQ+lrebOw==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "optionalDependencies": {
+ "@emotion/is-prop-valid": "^0.8.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "optional": true,
+ "dependencies": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "node_modules/framer-motion/node_modules/@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "optional": true
+ },
+ "node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.23.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
+ "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/google-map-react": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/google-map-react/-/google-map-react-2.2.1.tgz",
+ "integrity": "sha512-Dg8aexf5rNSmywj0XKQ5m4RNzVcWwKEM2BGDj5aPChD0um8ZRjB5Upcb/yg/i0oG1aES29asQ5+6BHVgrK5xGA==",
+ "dependencies": {
+ "@googlemaps/js-api-loader": "^1.13.8",
+ "@mapbox/point-geometry": "^0.1.0",
+ "eventemitter3": "^4.0.4",
+ "prop-types": "^15.7.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/human-signals": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
+ "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+ "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-wsl/node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
+ "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ }
+ },
+ "node_modules/jquery": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+ "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
+ "peer": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json2mq": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+ "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "dependencies": {
+ "string-convert": "^0.2.0"
+ }
+ },
+ "node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+ "dev": true
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/load-script": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
+ "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA=="
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
+ "node_modules/lodash.pick": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+ "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==",
+ "dev": true
+ },
+ "node_modules/lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/memoize-one": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/mui-one-time-password-input": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mui-one-time-password-input/-/mui-one-time-password-input-2.0.1.tgz",
+ "integrity": "sha512-VIp4bSHUpX2GK5VSzAoi8leRnZLcXUQ+T3mR+HHY8T/+31hfe3nR2OPPLHEB79Rp+91HWDaWkD6DQ7JMveX9gQ==",
+ "dependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@mui/material": "^5.0.0",
+ "@types/react": "^18.0.0",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@mui/material": "^5.0.0",
+ "@types/react": "^18.0.0",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+ "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
+ "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
+ "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
+ "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
+ "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
+ "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz",
+ "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==",
+ "dev": true,
+ "dependencies": {
+ "default-browser": "^4.0.0",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.32",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
+ "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz",
+ "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/property-expr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz",
+ "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-countup": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/react-countup/-/react-countup-6.5.0.tgz",
+ "integrity": "sha512-26JFHbUHsHxu8SetkJwWVIUEkaNnrj4P9msxNGC8tS4hGr1bngRzbwtJYOgXD2G/ItjaKJ3JfYKd85sw7qRVeA==",
+ "dependencies": {
+ "countup.js": "^2.8.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.3.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
+ },
+ "node_modules/react-helmet-async": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.3.tgz",
+ "integrity": "sha512-7/X3ehSCbjCaIljWa39Bb7F1Y2JWM23FN80kLozx2TdgzUmxKDSLN6qu06NG0Srzm8ljGOjgk7r7CXeEOx4MPw==",
+ "dependencies": {
+ "invariant": "^2.2.4",
+ "react-fast-compare": "^3.2.2",
+ "shallowequal": "^1.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.6.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-hook-form": {
+ "version": "7.48.2",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.48.2.tgz",
+ "integrity": "sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A==",
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-hook-form"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17 || ^18"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
+ "node_modules/react-lazy-load-image-component": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz",
+ "integrity": "sha512-8KFkDTgjh+0+PVbH+cx0AgxLGbdTsxWMnxXzU5HEUztqewk9ufQAu8cstjZhyvtMIPsdMcPZfA0WAa7HtjQbBQ==",
+ "dependencies": {
+ "lodash.debounce": "^4.0.8",
+ "lodash.throttle": "^4.1.1"
+ },
+ "peerDependencies": {
+ "react": "^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x",
+ "react-dom": "^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x"
+ }
+ },
+ "node_modules/react-player": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.13.0.tgz",
+ "integrity": "sha512-gkY7ZdbVFztlKFFhCPcnDrFQm+L399b8fhWsKatZ+b2wpKJwfUHBXQFMRxqYQGT0ic1/wQ7D7EZEWy7ZBqk2pw==",
+ "dependencies": {
+ "deepmerge": "^4.0.0",
+ "load-script": "^1.0.0",
+ "memoize-one": "^5.1.1",
+ "prop-types": "^15.7.2",
+ "react-fast-compare": "^3.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.20.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz",
+ "integrity": "sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==",
+ "dependencies": {
+ "@remix-run/router": "1.13.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.20.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz",
+ "integrity": "sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==",
+ "dependencies": {
+ "@remix-run/router": "1.13.1",
+ "react-router": "6.20.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-slick": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz",
+ "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==",
+ "dependencies": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ },
+ "peerDependencies": {
+ "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
+ "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
+ "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "set-function-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz",
+ "integrity": "sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.7.0",
+ "@rollup/rollup-android-arm64": "4.7.0",
+ "@rollup/rollup-darwin-arm64": "4.7.0",
+ "@rollup/rollup-darwin-x64": "4.7.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.7.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.7.0",
+ "@rollup/rollup-linux-arm64-musl": "4.7.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.7.0",
+ "@rollup/rollup-linux-x64-gnu": "4.7.0",
+ "@rollup/rollup-linux-x64-musl": "4.7.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.7.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.7.0",
+ "@rollup/rollup-win32-x64-msvc": "4.7.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-applescript": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz",
+ "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-applescript/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/run-applescript/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/run-applescript/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-applescript/node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/run-applescript/node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/run-applescript/node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-applescript/node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
+ "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+ "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+ "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/simplebar-core": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.2.4.tgz",
+ "integrity": "sha512-P+Sqshef4fq3++gQ82TgNYcgl3qZFSCP5jS2/8NMmw18oagXOijMzs1G+vm6RUY3oMvpwH3wGoqh9u6SyDjHfQ==",
+ "dependencies": {
+ "@types/lodash-es": "^4.17.6",
+ "can-use-dom": "^0.1.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/simplebar-react": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.4.tgz",
+ "integrity": "sha512-ogLN79e7JUm82wJChD7NSUB+4EHCFvDkjXpiu8hT1Alk7DnCekUWds61NXcsP9jC97KOgF5To/AVjYFbX0olgg==",
+ "dependencies": {
+ "simplebar-core": "^1.2.4"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slick-carousel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
+ "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
+ "peerDependencies": {
+ "jquery": ">=1.8.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-convert": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
+ "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "regexp.prototype.flags": "^1.5.0",
+ "set-function-name": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
+ "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
+ "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
+ "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz",
+ "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ=="
+ },
+ "node_modules/stylis-plugin-rtl": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz",
+ "integrity": "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==",
+ "dependencies": {
+ "cssjanus": "^2.0.1"
+ },
+ "peerDependencies": {
+ "stylis": "4.x"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.8.6",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz",
+ "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==",
+ "dev": true,
+ "dependencies": {
+ "@pkgr/utils": "^2.4.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/tiny-case": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
+ "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==",
+ "dev": true
+ },
+ "node_modules/titleize": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
+ "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+ "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+ "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+ "dev": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
+ "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz",
+ "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.19.3",
+ "postcss": "^8.4.32",
+ "rollup": "^4.2.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-checker": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.2.tgz",
+ "integrity": "sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "ansi-escapes": "^4.3.0",
+ "chalk": "^4.1.1",
+ "chokidar": "^3.5.1",
+ "commander": "^8.0.0",
+ "fast-glob": "^3.2.7",
+ "fs-extra": "^11.1.0",
+ "lodash.debounce": "^4.0.8",
+ "lodash.pick": "^4.4.0",
+ "npm-run-path": "^4.0.1",
+ "semver": "^7.5.0",
+ "strip-ansi": "^6.0.0",
+ "tiny-invariant": "^1.1.0",
+ "vscode-languageclient": "^7.0.0",
+ "vscode-languageserver": "^7.0.0",
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-uri": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "peerDependencies": {
+ "eslint": ">=7",
+ "meow": "^9.0.0",
+ "optionator": "^0.9.1",
+ "stylelint": ">=13",
+ "typescript": "*",
+ "vite": ">=2.0.0",
+ "vls": "*",
+ "vti": "*",
+ "vue-tsc": ">=1.3.9"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ },
+ "meow": {
+ "optional": true
+ },
+ "optionator": {
+ "optional": true
+ },
+ "stylelint": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vls": {
+ "optional": true
+ },
+ "vti": {
+ "optional": true
+ },
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-checker/node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/vite-plugin-checker/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/vscode-jsonrpc": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz",
+ "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0 || >=10.0.0"
+ }
+ },
+ "node_modules/vscode-languageclient": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz",
+ "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^3.0.4",
+ "semver": "^7.3.4",
+ "vscode-languageserver-protocol": "3.16.0"
+ },
+ "engines": {
+ "vscode": "^1.52.0"
+ }
+ },
+ "node_modules/vscode-languageclient/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/vscode-languageserver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz",
+ "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==",
+ "dev": true,
+ "dependencies": {
+ "vscode-languageserver-protocol": "3.16.0"
+ },
+ "bin": {
+ "installServerIntoExtension": "bin/installServerIntoExtension"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol": {
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz",
+ "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==",
+ "dev": true,
+ "dependencies": {
+ "vscode-jsonrpc": "6.0.0",
+ "vscode-languageserver-types": "3.16.0"
+ }
+ },
+ "node_modules/vscode-languageserver-textdocument": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz",
+ "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==",
+ "dev": true
+ },
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz",
+ "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==",
+ "dev": true
+ },
+ "node_modules/vscode-uri": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
+ "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
+ "dev": true
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
+ "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
+ "dev": true,
+ "dependencies": {
+ "function.prototype.name": "^1.1.5",
+ "has-tostringtag": "^1.0.0",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.0.5",
+ "is-finalizationregistry": "^1.0.2",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.1.4",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "dev": true,
+ "dependencies": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.4",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yet-another-react-lightbox": {
+ "version": "3.15.6",
+ "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.15.6.tgz",
+ "integrity": "sha512-he+WqKL5ZPk393oZQyadD347QqEPPr4fjqUVZKjIOeaIpbe9PHtwV4m8PjUzkbx3BISXasOqv0C/+cE1gBboXg==",
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yup": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-1.3.2.tgz",
+ "integrity": "sha512-6KCM971iQtJ+/KUaHdrhVr2LDkfhBtFPRnsG1P8F4q3uUVQ2RfEM9xekpha9aA4GXWJevjM10eDcPQ1FfWlmaQ==",
+ "dependencies": {
+ "property-expr": "^2.0.5",
+ "tiny-case": "^1.0.3",
+ "toposort": "^2.0.2",
+ "type-fest": "^2.19.0"
+ }
+ },
+ "node_modules/yup/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/template/package.json b/template/package.json
new file mode 100644
index 0000000..b6c0ef4
--- /dev/null
+++ b/template/package.json
@@ -0,0 +1,74 @@
+{
+ "name": "@zone-kit/vite-js",
+ "author": "Minimals",
+ "version": "2.4.0",
+ "description": "Vite Starter & JavaScript",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "start": "vite preview",
+ "build": "vite build",
+ "lint": "eslint \"src/**/*.{js,jsx,ts,tsx}\"",
+ "lint:fix": "eslint --fix \"src/**/*.{js,jsx,ts,tsx}\"",
+ "prettier": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"",
+ "rm:all": "rm -rf node_modules .next out dist build",
+ "re:start": "yarn rm:all && yarn install && yarn dev",
+ "re:build": "yarn rm:all && yarn install && yarn build",
+ "re:build-npm": "npm run rm:all && npm install && npm run build",
+ "dev:host": "vite --host"
+ },
+ "dependencies": {
+ "@emotion/cache": "^11.11.0",
+ "@emotion/react": "^11.11.1",
+ "@emotion/styled": "^11.11.0",
+ "@hookform/resolvers": "^3.3.2",
+ "@iconify/react": "^4.1.1",
+ "@mui/lab": "^5.0.0-alpha.155",
+ "@mui/material": "^5.14.20",
+ "@mui/system": "^5.14.20",
+ "@mui/x-date-pickers": "^6.18.4",
+ "date-fns": "^2.30.0",
+ "framer-motion": "^10.16.16",
+ "google-map-react": "^2.2.1",
+ "lodash.isequal": "^4.5.0",
+ "lodash.merge": "^4.6.2",
+ "mui-one-time-password-input": "^2.0.1",
+ "nprogress": "^0.2.0",
+ "prop-types": "^15.8.1",
+ "react": "^18.2.0",
+ "react-countup": "^6.5.0",
+ "react-dom": "^18.2.0",
+ "react-helmet-async": "^2.0.3",
+ "react-hook-form": "^7.48.2",
+ "react-lazy-load-image-component": "^1.6.0",
+ "react-player": "^2.13.0",
+ "react-router": "^6.20.1",
+ "react-router-dom": "^6.20.1",
+ "react-slick": "^0.29.0",
+ "simplebar-react": "^3.2.4",
+ "slick-carousel": "^1.8.1",
+ "stylis": "^4.3.0",
+ "stylis-plugin-rtl": "^2.1.1",
+ "yet-another-react-lightbox": "^3.15.6",
+ "yup": "^1.3.2"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "eslint": "^8.55.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-import-resolver-alias": "^1.1.2",
+ "eslint-plugin-import": "^2.29.0",
+ "eslint-plugin-jsx-a11y": "^6.8.0",
+ "eslint-plugin-perfectionist": "^2.5.0",
+ "eslint-plugin-prettier": "^5.0.1",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-unused-imports": "^3.0.0",
+ "prettier": "^3.1.1",
+ "typescript": "^5.3.3",
+ "vite": "^5.0.7",
+ "vite-plugin-checker": "^0.6.2"
+ }
+}
diff --git a/template/public/_redirects b/template/public/_redirects
new file mode 100644
index 0000000..50a4633
--- /dev/null
+++ b/template/public/_redirects
@@ -0,0 +1 @@
+/* /index.html 200
\ No newline at end of file
diff --git a/template/public/assets/background/overlay_1.jpg b/template/public/assets/background/overlay_1.jpg
new file mode 100644
index 0000000..b2c0ac9
Binary files /dev/null and b/template/public/assets/background/overlay_1.jpg differ
diff --git a/template/public/assets/background/overlay_2.jpg b/template/public/assets/background/overlay_2.jpg
new file mode 100644
index 0000000..d4f133e
Binary files /dev/null and b/template/public/assets/background/overlay_2.jpg differ
diff --git a/template/public/assets/cyan-blur.png b/template/public/assets/cyan-blur.png
new file mode 100644
index 0000000..b5dbc95
Binary files /dev/null and b/template/public/assets/cyan-blur.png differ
diff --git a/template/public/assets/icons/app-store/ic_app_store.svg b/template/public/assets/icons/app-store/ic_app_store.svg
new file mode 100644
index 0000000..0fd59ad
--- /dev/null
+++ b/template/public/assets/icons/app-store/ic_app_store.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/app-store/ic_google_play.svg b/template/public/assets/icons/app-store/ic_google_play.svg
new file mode 100644
index 0000000..4e5f3d4
--- /dev/null
+++ b/template/public/assets/icons/app-store/ic_google_play.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_book.svg b/template/public/assets/icons/ecommerce/ic_book.svg
new file mode 100644
index 0000000..a732136
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_book.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_headphones.svg b/template/public/assets/icons/ecommerce/ic_headphones.svg
new file mode 100644
index 0000000..73ebb63
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_headphones.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_health.svg b/template/public/assets/icons/ecommerce/ic_health.svg
new file mode 100644
index 0000000..3c8f4ca
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_health.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_home_appliances.svg b/template/public/assets/icons/ecommerce/ic_home_appliances.svg
new file mode 100644
index 0000000..e1b514c
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_home_appliances.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_home_living.svg b/template/public/assets/icons/ecommerce/ic_home_living.svg
new file mode 100644
index 0000000..ce8d3f0
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_home_living.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_laptop.svg b/template/public/assets/icons/ecommerce/ic_laptop.svg
new file mode 100644
index 0000000..5ad746d
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_laptop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_men_clothes.svg b/template/public/assets/icons/ecommerce/ic_men_clothes.svg
new file mode 100644
index 0000000..ad16d1c
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_men_clothes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_mobile.svg b/template/public/assets/icons/ecommerce/ic_mobile.svg
new file mode 100644
index 0000000..3ddcbe9
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_mobile.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_sport.svg b/template/public/assets/icons/ecommerce/ic_sport.svg
new file mode 100644
index 0000000..a1cfed9
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_sport.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_tablet.svg b/template/public/assets/icons/ecommerce/ic_tablet.svg
new file mode 100644
index 0000000..ecb42b1
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_tablet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_watches.svg b/template/public/assets/icons/ecommerce/ic_watches.svg
new file mode 100644
index 0000000..8af9fe4
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_watches.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ecommerce/ic_women_clothes.svg b/template/public/assets/icons/ecommerce/ic_women_clothes.svg
new file mode 100644
index 0000000..d6ccd9d
--- /dev/null
+++ b/template/public/assets/icons/ecommerce/ic_women_clothes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/faq/ic_faq_account.svg b/template/public/assets/icons/faq/ic_faq_account.svg
new file mode 100644
index 0000000..50562b7
--- /dev/null
+++ b/template/public/assets/icons/faq/ic_faq_account.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/faq/ic_faq_assurances.svg b/template/public/assets/icons/faq/ic_faq_assurances.svg
new file mode 100644
index 0000000..2d0375f
--- /dev/null
+++ b/template/public/assets/icons/faq/ic_faq_assurances.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/faq/ic_faq_delivery.svg b/template/public/assets/icons/faq/ic_faq_delivery.svg
new file mode 100644
index 0000000..c9976bb
--- /dev/null
+++ b/template/public/assets/icons/faq/ic_faq_delivery.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/faq/ic_faq_package.svg b/template/public/assets/icons/faq/ic_faq_package.svg
new file mode 100644
index 0000000..52a975d
--- /dev/null
+++ b/template/public/assets/icons/faq/ic_faq_package.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/faq/ic_faq_payment.svg b/template/public/assets/icons/faq/ic_faq_payment.svg
new file mode 100644
index 0000000..9156ace
--- /dev/null
+++ b/template/public/assets/icons/faq/ic_faq_payment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/faq/ic_faq_refund.svg b/template/public/assets/icons/faq/ic_faq_refund.svg
new file mode 100644
index 0000000..9835b70
--- /dev/null
+++ b/template/public/assets/icons/faq/ic_faq_refund.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/flags/ic_flag_de.svg b/template/public/assets/icons/flags/ic_flag_de.svg
new file mode 100644
index 0000000..c361707
--- /dev/null
+++ b/template/public/assets/icons/flags/ic_flag_de.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/flags/ic_flag_en.svg b/template/public/assets/icons/flags/ic_flag_en.svg
new file mode 100644
index 0000000..485ad5c
--- /dev/null
+++ b/template/public/assets/icons/flags/ic_flag_en.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/flags/ic_flag_fr.svg b/template/public/assets/icons/flags/ic_flag_fr.svg
new file mode 100644
index 0000000..2ae63a1
--- /dev/null
+++ b/template/public/assets/icons/flags/ic_flag_fr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_accounting.svg b/template/public/assets/icons/ic_accounting.svg
new file mode 100644
index 0000000..11e7225
--- /dev/null
+++ b/template/public/assets/icons/ic_accounting.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_agreement.svg b/template/public/assets/icons/ic_agreement.svg
new file mode 100644
index 0000000..7f3253e
--- /dev/null
+++ b/template/public/assets/icons/ic_agreement.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_analysis.svg b/template/public/assets/icons/ic_analysis.svg
new file mode 100644
index 0000000..048adef
--- /dev/null
+++ b/template/public/assets/icons/ic_analysis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_banking.svg b/template/public/assets/icons/ic_banking.svg
new file mode 100644
index 0000000..5464db3
--- /dev/null
+++ b/template/public/assets/icons/ic_banking.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_banking_currency.svg b/template/public/assets/icons/ic_banking_currency.svg
new file mode 100644
index 0000000..fc9dea3
--- /dev/null
+++ b/template/public/assets/icons/ic_banking_currency.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_book.png b/template/public/assets/icons/ic_book.png
new file mode 100644
index 0000000..23f8b3e
Binary files /dev/null and b/template/public/assets/icons/ic_book.png differ
diff --git a/template/public/assets/icons/ic_checklist.svg b/template/public/assets/icons/ic_checklist.svg
new file mode 100644
index 0000000..cf4d5dc
--- /dev/null
+++ b/template/public/assets/icons/ic_checklist.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_chip.svg b/template/public/assets/icons/ic_chip.svg
new file mode 100644
index 0000000..69cdfd6
--- /dev/null
+++ b/template/public/assets/icons/ic_chip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_creativity.svg b/template/public/assets/icons/ic_creativity.svg
new file mode 100644
index 0000000..f001230
--- /dev/null
+++ b/template/public/assets/icons/ic_creativity.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_customer_service.svg b/template/public/assets/icons/ic_customer_service.svg
new file mode 100644
index 0000000..1e579d0
--- /dev/null
+++ b/template/public/assets/icons/ic_customer_service.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_email_inbox.svg b/template/public/assets/icons/ic_email_inbox.svg
new file mode 100644
index 0000000..339c23e
--- /dev/null
+++ b/template/public/assets/icons/ic_email_inbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_email_sent.svg b/template/public/assets/icons/ic_email_sent.svg
new file mode 100644
index 0000000..da91473
--- /dev/null
+++ b/template/public/assets/icons/ic_email_sent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_figma_outline.svg b/template/public/assets/icons/ic_figma_outline.svg
new file mode 100644
index 0000000..959892c
--- /dev/null
+++ b/template/public/assets/icons/ic_figma_outline.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_file.svg b/template/public/assets/icons/ic_file.svg
new file mode 100644
index 0000000..ee28e12
--- /dev/null
+++ b/template/public/assets/icons/ic_file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_google.svg b/template/public/assets/icons/ic_google.svg
new file mode 100644
index 0000000..003454c
--- /dev/null
+++ b/template/public/assets/icons/ic_google.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_health_care.svg b/template/public/assets/icons/ic_health_care.svg
new file mode 100644
index 0000000..b3daca5
--- /dev/null
+++ b/template/public/assets/icons/ic_health_care.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_lock_password.svg b/template/public/assets/icons/ic_lock_password.svg
new file mode 100644
index 0000000..a3d4e69
--- /dev/null
+++ b/template/public/assets/icons/ic_lock_password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_marketing_bullhorn.svg b/template/public/assets/icons/ic_marketing_bullhorn.svg
new file mode 100644
index 0000000..892d1dc
--- /dev/null
+++ b/template/public/assets/icons/ic_marketing_bullhorn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_money.svg b/template/public/assets/icons/ic_money.svg
new file mode 100644
index 0000000..3d6a7a7
--- /dev/null
+++ b/template/public/assets/icons/ic_money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_newsletter.svg b/template/public/assets/icons/ic_newsletter.svg
new file mode 100644
index 0000000..4e62e7d
--- /dev/null
+++ b/template/public/assets/icons/ic_newsletter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_optimization.svg b/template/public/assets/icons/ic_optimization.svg
new file mode 100644
index 0000000..80fd865
--- /dev/null
+++ b/template/public/assets/icons/ic_optimization.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_pencil.png b/template/public/assets/icons/ic_pencil.png
new file mode 100644
index 0000000..b8adb56
Binary files /dev/null and b/template/public/assets/icons/ic_pencil.png differ
diff --git a/template/public/assets/icons/ic_popularity.svg b/template/public/assets/icons/ic_popularity.svg
new file mode 100644
index 0000000..1130bc0
--- /dev/null
+++ b/template/public/assets/icons/ic_popularity.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_qrcode.svg b/template/public/assets/icons/ic_qrcode.svg
new file mode 100644
index 0000000..e13620a
--- /dev/null
+++ b/template/public/assets/icons/ic_qrcode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_real_time.svg b/template/public/assets/icons/ic_real_time.svg
new file mode 100644
index 0000000..cbe274c
--- /dev/null
+++ b/template/public/assets/icons/ic_real_time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_report.svg b/template/public/assets/icons/ic_report.svg
new file mode 100644
index 0000000..3528385
--- /dev/null
+++ b/template/public/assets/icons/ic_report.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_reputation.svg b/template/public/assets/icons/ic_reputation.svg
new file mode 100644
index 0000000..56bb10c
--- /dev/null
+++ b/template/public/assets/icons/ic_reputation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_resume_job.svg b/template/public/assets/icons/ic_resume_job.svg
new file mode 100644
index 0000000..d1de99a
--- /dev/null
+++ b/template/public/assets/icons/ic_resume_job.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_search.svg b/template/public/assets/icons/ic_search.svg
new file mode 100644
index 0000000..e4bfc8e
--- /dev/null
+++ b/template/public/assets/icons/ic_search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_search_job.svg b/template/public/assets/icons/ic_search_job.svg
new file mode 100644
index 0000000..51f31ad
--- /dev/null
+++ b/template/public/assets/icons/ic_search_job.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_secure_payment.svg b/template/public/assets/icons/ic_secure_payment.svg
new file mode 100644
index 0000000..7c5033a
--- /dev/null
+++ b/template/public/assets/icons/ic_secure_payment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_signup_job.svg b/template/public/assets/icons/ic_signup_job.svg
new file mode 100644
index 0000000..31269a1
--- /dev/null
+++ b/template/public/assets/icons/ic_signup_job.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_sketch_design.svg b/template/public/assets/icons/ic_sketch_design.svg
new file mode 100644
index 0000000..13023ef
--- /dev/null
+++ b/template/public/assets/icons/ic_sketch_design.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_social_media.svg b/template/public/assets/icons/ic_social_media.svg
new file mode 100644
index 0000000..93a99b0
--- /dev/null
+++ b/template/public/assets/icons/ic_social_media.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_software_development.svg b/template/public/assets/icons/ic_software_development.svg
new file mode 100644
index 0000000..d9d7cdc
--- /dev/null
+++ b/template/public/assets/icons/ic_software_development.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_statistics.svg b/template/public/assets/icons/ic_statistics.svg
new file mode 100644
index 0000000..5a69396
--- /dev/null
+++ b/template/public/assets/icons/ic_statistics.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_stethoscope.svg b/template/public/assets/icons/ic_stethoscope.svg
new file mode 100644
index 0000000..576f848
--- /dev/null
+++ b/template/public/assets/icons/ic_stethoscope.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_transparency.svg b/template/public/assets/icons/ic_transparency.svg
new file mode 100644
index 0000000..8cbf8b6
--- /dev/null
+++ b/template/public/assets/icons/ic_transparency.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/ic_web_programming.svg b/template/public/assets/icons/ic_web_programming.svg
new file mode 100644
index 0000000..c6a2203
--- /dev/null
+++ b/template/public/assets/icons/ic_web_programming.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/platforms/ic_figma.svg b/template/public/assets/icons/platforms/ic_figma.svg
new file mode 100644
index 0000000..91ce016
--- /dev/null
+++ b/template/public/assets/icons/platforms/ic_figma.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/template/public/assets/icons/platforms/ic_js.svg b/template/public/assets/icons/platforms/ic_js.svg
new file mode 100644
index 0000000..21b0c98
--- /dev/null
+++ b/template/public/assets/icons/platforms/ic_js.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/template/public/assets/icons/platforms/ic_nextjs.svg b/template/public/assets/icons/platforms/ic_nextjs.svg
new file mode 100644
index 0000000..1e038ce
--- /dev/null
+++ b/template/public/assets/icons/platforms/ic_nextjs.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/template/public/assets/icons/platforms/ic_python.svg b/template/public/assets/icons/platforms/ic_python.svg
new file mode 100644
index 0000000..8d95bb2
--- /dev/null
+++ b/template/public/assets/icons/platforms/ic_python.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/platforms/ic_ts.svg b/template/public/assets/icons/platforms/ic_ts.svg
new file mode 100644
index 0000000..8d1bcd2
--- /dev/null
+++ b/template/public/assets/icons/platforms/ic_ts.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/template/public/assets/icons/platforms/ic_vite.svg b/template/public/assets/icons/platforms/ic_vite.svg
new file mode 100644
index 0000000..f8bf102
--- /dev/null
+++ b/template/public/assets/icons/platforms/ic_vite.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/template/public/assets/icons/pricing/ic_plan_basic01.svg b/template/public/assets/icons/pricing/ic_plan_basic01.svg
new file mode 100644
index 0000000..f180e5e
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_basic01.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/pricing/ic_plan_basic02.svg b/template/public/assets/icons/pricing/ic_plan_basic02.svg
new file mode 100644
index 0000000..d1d3950
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_basic02.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/pricing/ic_plan_basic03.svg b/template/public/assets/icons/pricing/ic_plan_basic03.svg
new file mode 100644
index 0000000..01e5d80
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_basic03.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/pricing/ic_plan_premium01.svg b/template/public/assets/icons/pricing/ic_plan_premium01.svg
new file mode 100644
index 0000000..8429690
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_premium01.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/pricing/ic_plan_premium02.svg b/template/public/assets/icons/pricing/ic_plan_premium02.svg
new file mode 100644
index 0000000..53d8d96
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_premium02.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/pricing/ic_plan_premium03.svg b/template/public/assets/icons/pricing/ic_plan_premium03.svg
new file mode 100644
index 0000000..b675d03
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_premium03.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/pricing/ic_plan_starter01.svg b/template/public/assets/icons/pricing/ic_plan_starter01.svg
new file mode 100644
index 0000000..5b439b8
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_starter01.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/pricing/ic_plan_starter02.svg b/template/public/assets/icons/pricing/ic_plan_starter02.svg
new file mode 100644
index 0000000..0516c8c
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_starter02.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/pricing/ic_plan_starter03.svg b/template/public/assets/icons/pricing/ic_plan_starter03.svg
new file mode 100644
index 0000000..9de060c
--- /dev/null
+++ b/template/public/assets/icons/pricing/ic_plan_starter03.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/service/ic_service_analysis.svg b/template/public/assets/icons/service/ic_service_analysis.svg
new file mode 100644
index 0000000..83b2e59
--- /dev/null
+++ b/template/public/assets/icons/service/ic_service_analysis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/service/ic_service_bullhorn.svg b/template/public/assets/icons/service/ic_service_bullhorn.svg
new file mode 100644
index 0000000..16bd08d
--- /dev/null
+++ b/template/public/assets/icons/service/ic_service_bullhorn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/service/ic_service_mail.svg b/template/public/assets/icons/service/ic_service_mail.svg
new file mode 100644
index 0000000..8ba7d4c
--- /dev/null
+++ b/template/public/assets/icons/service/ic_service_mail.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/service/ic_service_seo.svg b/template/public/assets/icons/service/ic_service_seo.svg
new file mode 100644
index 0000000..4df8d8b
--- /dev/null
+++ b/template/public/assets/icons/service/ic_service_seo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/travel/ic_travel_booking.svg b/template/public/assets/icons/travel/ic_travel_booking.svg
new file mode 100644
index 0000000..42fe621
--- /dev/null
+++ b/template/public/assets/icons/travel/ic_travel_booking.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/travel/ic_travel_site_visitors.svg b/template/public/assets/icons/travel/ic_travel_site_visitors.svg
new file mode 100644
index 0000000..3e58d35
--- /dev/null
+++ b/template/public/assets/icons/travel/ic_travel_site_visitors.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/travel/ic_travel_tickets.svg b/template/public/assets/icons/travel/ic_travel_tickets.svg
new file mode 100644
index 0000000..2d06bd8
--- /dev/null
+++ b/template/public/assets/icons/travel/ic_travel_tickets.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/icons/travel/ic_travel_verified_hotels.svg b/template/public/assets/icons/travel/ic_travel_verified_hotels.svg
new file mode 100644
index 0000000..73aef51
--- /dev/null
+++ b/template/public/assets/icons/travel/ic_travel_verified_hotels.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_404.svg b/template/public/assets/illustrations/illustration_404.svg
new file mode 100644
index 0000000..ac27886
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_500.svg b/template/public/assets/illustrations/illustration_500.svg
new file mode 100644
index 0000000..3434a91
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_500.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_benefits.svg b/template/public/assets/illustrations/illustration_benefits.svg
new file mode 100644
index 0000000..0447799
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_benefits.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_comingsoon.svg b/template/public/assets/illustrations/illustration_comingsoon.svg
new file mode 100644
index 0000000..d607f8e
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_comingsoon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_courses_contact.svg b/template/public/assets/illustrations/illustration_courses_contact.svg
new file mode 100644
index 0000000..8a681ae
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_courses_contact.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_courses_hero.svg b/template/public/assets/illustrations/illustration_courses_hero.svg
new file mode 100644
index 0000000..bc2947e
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_courses_hero.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_faqs.svg b/template/public/assets/illustrations/illustration_faqs.svg
new file mode 100644
index 0000000..06dce57
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_faqs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_login.svg b/template/public/assets/illustrations/illustration_login.svg
new file mode 100644
index 0000000..073c9fe
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_login.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_maintenance.svg b/template/public/assets/illustrations/illustration_maintenance.svg
new file mode 100644
index 0000000..722a48e
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_maintenance.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_map.svg b/template/public/assets/illustrations/illustration_map.svg
new file mode 100644
index 0000000..ee6e2f0
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_map.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_marketing_contact.svg b/template/public/assets/illustrations/illustration_marketing_contact.svg
new file mode 100644
index 0000000..dba7f08
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_marketing_contact.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_marketing_market.svg b/template/public/assets/illustrations/illustration_marketing_market.svg
new file mode 100644
index 0000000..5ad0fdb
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_marketing_market.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_newsletter.svg b/template/public/assets/illustrations/illustration_newsletter.svg
new file mode 100644
index 0000000..a929bf3
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_newsletter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_recruitment.svg b/template/public/assets/illustrations/illustration_recruitment.svg
new file mode 100644
index 0000000..f11d5bb
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_recruitment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_services.svg b/template/public/assets/illustrations/illustration_services.svg
new file mode 100644
index 0000000..a9b7c77
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_services.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_teams.svg b/template/public/assets/illustrations/illustration_teams.svg
new file mode 100644
index 0000000..66ea182
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_teams.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_travel_contact.svg b/template/public/assets/illustrations/illustration_travel_contact.svg
new file mode 100644
index 0000000..9e0ff33
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_travel_contact.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/illustrations/illustration_vision.svg b/template/public/assets/illustrations/illustration_vision.svg
new file mode 100644
index 0000000..f057c99
--- /dev/null
+++ b/template/public/assets/illustrations/illustration_vision.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/images/avatar/avatar_1.jpg b/template/public/assets/images/avatar/avatar_1.jpg
new file mode 100644
index 0000000..455cc65
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_1.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_10.jpg b/template/public/assets/images/avatar/avatar_10.jpg
new file mode 100644
index 0000000..a7ec399
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_10.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_11.jpg b/template/public/assets/images/avatar/avatar_11.jpg
new file mode 100644
index 0000000..d7708bc
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_11.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_12.jpg b/template/public/assets/images/avatar/avatar_12.jpg
new file mode 100644
index 0000000..1e4e9ee
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_12.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_13.jpg b/template/public/assets/images/avatar/avatar_13.jpg
new file mode 100644
index 0000000..54a1823
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_13.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_14.jpg b/template/public/assets/images/avatar/avatar_14.jpg
new file mode 100644
index 0000000..996ffab
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_14.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_15.jpg b/template/public/assets/images/avatar/avatar_15.jpg
new file mode 100644
index 0000000..5928bb7
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_15.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_16.jpg b/template/public/assets/images/avatar/avatar_16.jpg
new file mode 100644
index 0000000..f1aa32a
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_16.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_17.jpg b/template/public/assets/images/avatar/avatar_17.jpg
new file mode 100644
index 0000000..d7312cc
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_17.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_18.jpg b/template/public/assets/images/avatar/avatar_18.jpg
new file mode 100644
index 0000000..b14e336
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_18.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_19.jpg b/template/public/assets/images/avatar/avatar_19.jpg
new file mode 100644
index 0000000..53be9bb
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_19.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_2.jpg b/template/public/assets/images/avatar/avatar_2.jpg
new file mode 100644
index 0000000..0ffd3e5
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_2.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_20.jpg b/template/public/assets/images/avatar/avatar_20.jpg
new file mode 100644
index 0000000..b0df0ea
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_20.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_21.jpg b/template/public/assets/images/avatar/avatar_21.jpg
new file mode 100644
index 0000000..0014e07
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_21.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_22.jpg b/template/public/assets/images/avatar/avatar_22.jpg
new file mode 100644
index 0000000..b5398cf
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_22.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_23.jpg b/template/public/assets/images/avatar/avatar_23.jpg
new file mode 100644
index 0000000..045c963
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_23.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_24.jpg b/template/public/assets/images/avatar/avatar_24.jpg
new file mode 100644
index 0000000..0c347bb
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_24.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_3.jpg b/template/public/assets/images/avatar/avatar_3.jpg
new file mode 100644
index 0000000..2cb8cef
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_3.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_4.jpg b/template/public/assets/images/avatar/avatar_4.jpg
new file mode 100644
index 0000000..c8cb22b
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_4.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_5.jpg b/template/public/assets/images/avatar/avatar_5.jpg
new file mode 100644
index 0000000..6929500
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_5.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_6.jpg b/template/public/assets/images/avatar/avatar_6.jpg
new file mode 100644
index 0000000..0956d99
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_6.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_7.jpg b/template/public/assets/images/avatar/avatar_7.jpg
new file mode 100644
index 0000000..5d6cac2
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_7.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_8.jpg b/template/public/assets/images/avatar/avatar_8.jpg
new file mode 100644
index 0000000..59e410a
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_8.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_9.jpg b/template/public/assets/images/avatar/avatar_9.jpg
new file mode 100644
index 0000000..56fa42a
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_9.jpg differ
diff --git a/template/public/assets/images/avatar/avatar_default.jpg b/template/public/assets/images/avatar/avatar_default.jpg
new file mode 100644
index 0000000..83fcb9e
Binary files /dev/null and b/template/public/assets/images/avatar/avatar_default.jpg differ
diff --git a/template/public/assets/images/career/career_1.jpg b/template/public/assets/images/career/career_1.jpg
new file mode 100644
index 0000000..4326579
Binary files /dev/null and b/template/public/assets/images/career/career_1.jpg differ
diff --git a/template/public/assets/images/career/career_10.jpg b/template/public/assets/images/career/career_10.jpg
new file mode 100644
index 0000000..428f2d5
Binary files /dev/null and b/template/public/assets/images/career/career_10.jpg differ
diff --git a/template/public/assets/images/career/career_11.jpg b/template/public/assets/images/career/career_11.jpg
new file mode 100644
index 0000000..ddf4009
Binary files /dev/null and b/template/public/assets/images/career/career_11.jpg differ
diff --git a/template/public/assets/images/career/career_12.jpg b/template/public/assets/images/career/career_12.jpg
new file mode 100644
index 0000000..06ac619
Binary files /dev/null and b/template/public/assets/images/career/career_12.jpg differ
diff --git a/template/public/assets/images/career/career_2.jpg b/template/public/assets/images/career/career_2.jpg
new file mode 100644
index 0000000..9a05097
Binary files /dev/null and b/template/public/assets/images/career/career_2.jpg differ
diff --git a/template/public/assets/images/career/career_3.jpg b/template/public/assets/images/career/career_3.jpg
new file mode 100644
index 0000000..b5a73da
Binary files /dev/null and b/template/public/assets/images/career/career_3.jpg differ
diff --git a/template/public/assets/images/career/career_4.jpg b/template/public/assets/images/career/career_4.jpg
new file mode 100644
index 0000000..c010f3e
Binary files /dev/null and b/template/public/assets/images/career/career_4.jpg differ
diff --git a/template/public/assets/images/career/career_5.jpg b/template/public/assets/images/career/career_5.jpg
new file mode 100644
index 0000000..13fdd5b
Binary files /dev/null and b/template/public/assets/images/career/career_5.jpg differ
diff --git a/template/public/assets/images/career/career_6.jpg b/template/public/assets/images/career/career_6.jpg
new file mode 100644
index 0000000..64ed6f4
Binary files /dev/null and b/template/public/assets/images/career/career_6.jpg differ
diff --git a/template/public/assets/images/career/career_7.jpg b/template/public/assets/images/career/career_7.jpg
new file mode 100644
index 0000000..b4cb297
Binary files /dev/null and b/template/public/assets/images/career/career_7.jpg differ
diff --git a/template/public/assets/images/career/career_8.jpg b/template/public/assets/images/career/career_8.jpg
new file mode 100644
index 0000000..06fa37f
Binary files /dev/null and b/template/public/assets/images/career/career_8.jpg differ
diff --git a/template/public/assets/images/career/career_9.jpg b/template/public/assets/images/career/career_9.jpg
new file mode 100644
index 0000000..e1b9e2b
Binary files /dev/null and b/template/public/assets/images/career/career_9.jpg differ
diff --git a/template/public/assets/images/career/career_about_team.jpg b/template/public/assets/images/career/career_about_team.jpg
new file mode 100644
index 0000000..126ee2e
Binary files /dev/null and b/template/public/assets/images/career/career_about_team.jpg differ
diff --git a/template/public/assets/images/career/career_download_app.png b/template/public/assets/images/career/career_download_app.png
new file mode 100644
index 0000000..c1fffae
Binary files /dev/null and b/template/public/assets/images/career/career_download_app.png differ
diff --git a/template/public/assets/images/career/career_newsletter.jpg b/template/public/assets/images/career/career_newsletter.jpg
new file mode 100644
index 0000000..a29c94d
Binary files /dev/null and b/template/public/assets/images/career/career_newsletter.jpg differ
diff --git a/template/public/assets/images/career/career_post_01.jpg b/template/public/assets/images/career/career_post_01.jpg
new file mode 100644
index 0000000..bbe39dc
Binary files /dev/null and b/template/public/assets/images/career/career_post_01.jpg differ
diff --git a/template/public/assets/images/career/career_post_02.jpg b/template/public/assets/images/career/career_post_02.jpg
new file mode 100644
index 0000000..ca8940e
Binary files /dev/null and b/template/public/assets/images/career/career_post_02.jpg differ
diff --git a/template/public/assets/images/career/career_post_hero.jpg b/template/public/assets/images/career/career_post_hero.jpg
new file mode 100644
index 0000000..749bcc7
Binary files /dev/null and b/template/public/assets/images/career/career_post_hero.jpg differ
diff --git a/template/public/assets/images/company/company_1.png b/template/public/assets/images/company/company_1.png
new file mode 100644
index 0000000..72c1e00
Binary files /dev/null and b/template/public/assets/images/company/company_1.png differ
diff --git a/template/public/assets/images/company/company_10.png b/template/public/assets/images/company/company_10.png
new file mode 100644
index 0000000..e79a41e
Binary files /dev/null and b/template/public/assets/images/company/company_10.png differ
diff --git a/template/public/assets/images/company/company_11.png b/template/public/assets/images/company/company_11.png
new file mode 100644
index 0000000..1d6593a
Binary files /dev/null and b/template/public/assets/images/company/company_11.png differ
diff --git a/template/public/assets/images/company/company_12.png b/template/public/assets/images/company/company_12.png
new file mode 100644
index 0000000..be48cd2
Binary files /dev/null and b/template/public/assets/images/company/company_12.png differ
diff --git a/template/public/assets/images/company/company_2.png b/template/public/assets/images/company/company_2.png
new file mode 100644
index 0000000..e57e90c
Binary files /dev/null and b/template/public/assets/images/company/company_2.png differ
diff --git a/template/public/assets/images/company/company_3.png b/template/public/assets/images/company/company_3.png
new file mode 100644
index 0000000..6109402
Binary files /dev/null and b/template/public/assets/images/company/company_3.png differ
diff --git a/template/public/assets/images/company/company_4.png b/template/public/assets/images/company/company_4.png
new file mode 100644
index 0000000..4a3113a
Binary files /dev/null and b/template/public/assets/images/company/company_4.png differ
diff --git a/template/public/assets/images/company/company_5.png b/template/public/assets/images/company/company_5.png
new file mode 100644
index 0000000..65f395d
Binary files /dev/null and b/template/public/assets/images/company/company_5.png differ
diff --git a/template/public/assets/images/company/company_6.png b/template/public/assets/images/company/company_6.png
new file mode 100644
index 0000000..f8b7518
Binary files /dev/null and b/template/public/assets/images/company/company_6.png differ
diff --git a/template/public/assets/images/company/company_7.png b/template/public/assets/images/company/company_7.png
new file mode 100644
index 0000000..591e32e
Binary files /dev/null and b/template/public/assets/images/company/company_7.png differ
diff --git a/template/public/assets/images/company/company_8.png b/template/public/assets/images/company/company_8.png
new file mode 100644
index 0000000..b5033d0
Binary files /dev/null and b/template/public/assets/images/company/company_8.png differ
diff --git a/template/public/assets/images/company/company_9.png b/template/public/assets/images/company/company_9.png
new file mode 100644
index 0000000..a7c4326
Binary files /dev/null and b/template/public/assets/images/company/company_9.png differ
diff --git a/template/public/assets/images/course/course_1.jpg b/template/public/assets/images/course/course_1.jpg
new file mode 100644
index 0000000..5a7e626
Binary files /dev/null and b/template/public/assets/images/course/course_1.jpg differ
diff --git a/template/public/assets/images/course/course_10.jpg b/template/public/assets/images/course/course_10.jpg
new file mode 100644
index 0000000..5cc1e4e
Binary files /dev/null and b/template/public/assets/images/course/course_10.jpg differ
diff --git a/template/public/assets/images/course/course_11.jpg b/template/public/assets/images/course/course_11.jpg
new file mode 100644
index 0000000..f241a4e
Binary files /dev/null and b/template/public/assets/images/course/course_11.jpg differ
diff --git a/template/public/assets/images/course/course_12.jpg b/template/public/assets/images/course/course_12.jpg
new file mode 100644
index 0000000..d9b64c3
Binary files /dev/null and b/template/public/assets/images/course/course_12.jpg differ
diff --git a/template/public/assets/images/course/course_2.jpg b/template/public/assets/images/course/course_2.jpg
new file mode 100644
index 0000000..322610d
Binary files /dev/null and b/template/public/assets/images/course/course_2.jpg differ
diff --git a/template/public/assets/images/course/course_3.jpg b/template/public/assets/images/course/course_3.jpg
new file mode 100644
index 0000000..693155e
Binary files /dev/null and b/template/public/assets/images/course/course_3.jpg differ
diff --git a/template/public/assets/images/course/course_4.jpg b/template/public/assets/images/course/course_4.jpg
new file mode 100644
index 0000000..bdb6a26
Binary files /dev/null and b/template/public/assets/images/course/course_4.jpg differ
diff --git a/template/public/assets/images/course/course_5.jpg b/template/public/assets/images/course/course_5.jpg
new file mode 100644
index 0000000..f035d8d
Binary files /dev/null and b/template/public/assets/images/course/course_5.jpg differ
diff --git a/template/public/assets/images/course/course_6.jpg b/template/public/assets/images/course/course_6.jpg
new file mode 100644
index 0000000..cb012a3
Binary files /dev/null and b/template/public/assets/images/course/course_6.jpg differ
diff --git a/template/public/assets/images/course/course_7.jpg b/template/public/assets/images/course/course_7.jpg
new file mode 100644
index 0000000..87a405c
Binary files /dev/null and b/template/public/assets/images/course/course_7.jpg differ
diff --git a/template/public/assets/images/course/course_8.jpg b/template/public/assets/images/course/course_8.jpg
new file mode 100644
index 0000000..0239f55
Binary files /dev/null and b/template/public/assets/images/course/course_8.jpg differ
diff --git a/template/public/assets/images/course/course_9.jpg b/template/public/assets/images/course/course_9.jpg
new file mode 100644
index 0000000..853d953
Binary files /dev/null and b/template/public/assets/images/course/course_9.jpg differ
diff --git a/template/public/assets/images/course/course_about.jpg b/template/public/assets/images/course/course_about.jpg
new file mode 100644
index 0000000..f58d0aa
Binary files /dev/null and b/template/public/assets/images/course/course_about.jpg differ
diff --git a/template/public/assets/images/course/course_download_app.png b/template/public/assets/images/course/course_download_app.png
new file mode 100644
index 0000000..7cbc36d
Binary files /dev/null and b/template/public/assets/images/course/course_download_app.png differ
diff --git a/template/public/assets/images/course/course_post_01.jpg b/template/public/assets/images/course/course_post_01.jpg
new file mode 100644
index 0000000..78171d0
Binary files /dev/null and b/template/public/assets/images/course/course_post_01.jpg differ
diff --git a/template/public/assets/images/course/course_post_02.jpg b/template/public/assets/images/course/course_post_02.jpg
new file mode 100644
index 0000000..2a6d661
Binary files /dev/null and b/template/public/assets/images/course/course_post_02.jpg differ
diff --git a/template/public/assets/images/course/course_post_hero.jpg b/template/public/assets/images/course/course_post_hero.jpg
new file mode 100644
index 0000000..4f02649
Binary files /dev/null and b/template/public/assets/images/course/course_post_hero.jpg differ
diff --git a/template/public/assets/images/course/course_teacher_hero.png b/template/public/assets/images/course/course_teacher_hero.png
new file mode 100644
index 0000000..a77ec10
Binary files /dev/null and b/template/public/assets/images/course/course_teacher_hero.png differ
diff --git a/template/public/assets/images/cover/cover_1.jpg b/template/public/assets/images/cover/cover_1.jpg
new file mode 100644
index 0000000..768b45c
Binary files /dev/null and b/template/public/assets/images/cover/cover_1.jpg differ
diff --git a/template/public/assets/images/cover/cover_10.jpg b/template/public/assets/images/cover/cover_10.jpg
new file mode 100644
index 0000000..77b2c47
Binary files /dev/null and b/template/public/assets/images/cover/cover_10.jpg differ
diff --git a/template/public/assets/images/cover/cover_11.jpg b/template/public/assets/images/cover/cover_11.jpg
new file mode 100644
index 0000000..4279cab
Binary files /dev/null and b/template/public/assets/images/cover/cover_11.jpg differ
diff --git a/template/public/assets/images/cover/cover_12.jpg b/template/public/assets/images/cover/cover_12.jpg
new file mode 100644
index 0000000..3bd7329
Binary files /dev/null and b/template/public/assets/images/cover/cover_12.jpg differ
diff --git a/template/public/assets/images/cover/cover_13.jpg b/template/public/assets/images/cover/cover_13.jpg
new file mode 100644
index 0000000..73217e2
Binary files /dev/null and b/template/public/assets/images/cover/cover_13.jpg differ
diff --git a/template/public/assets/images/cover/cover_14.jpg b/template/public/assets/images/cover/cover_14.jpg
new file mode 100644
index 0000000..866373b
Binary files /dev/null and b/template/public/assets/images/cover/cover_14.jpg differ
diff --git a/template/public/assets/images/cover/cover_15.jpg b/template/public/assets/images/cover/cover_15.jpg
new file mode 100644
index 0000000..121be9a
Binary files /dev/null and b/template/public/assets/images/cover/cover_15.jpg differ
diff --git a/template/public/assets/images/cover/cover_16.jpg b/template/public/assets/images/cover/cover_16.jpg
new file mode 100644
index 0000000..bbb2e16
Binary files /dev/null and b/template/public/assets/images/cover/cover_16.jpg differ
diff --git a/template/public/assets/images/cover/cover_17.jpg b/template/public/assets/images/cover/cover_17.jpg
new file mode 100644
index 0000000..3566e3c
Binary files /dev/null and b/template/public/assets/images/cover/cover_17.jpg differ
diff --git a/template/public/assets/images/cover/cover_18.jpg b/template/public/assets/images/cover/cover_18.jpg
new file mode 100644
index 0000000..71cfc54
Binary files /dev/null and b/template/public/assets/images/cover/cover_18.jpg differ
diff --git a/template/public/assets/images/cover/cover_19.jpg b/template/public/assets/images/cover/cover_19.jpg
new file mode 100644
index 0000000..f4b62be
Binary files /dev/null and b/template/public/assets/images/cover/cover_19.jpg differ
diff --git a/template/public/assets/images/cover/cover_2.jpg b/template/public/assets/images/cover/cover_2.jpg
new file mode 100644
index 0000000..37c637f
Binary files /dev/null and b/template/public/assets/images/cover/cover_2.jpg differ
diff --git a/template/public/assets/images/cover/cover_20.jpg b/template/public/assets/images/cover/cover_20.jpg
new file mode 100644
index 0000000..a5ee5d8
Binary files /dev/null and b/template/public/assets/images/cover/cover_20.jpg differ
diff --git a/template/public/assets/images/cover/cover_21.jpg b/template/public/assets/images/cover/cover_21.jpg
new file mode 100644
index 0000000..6eaaeda
Binary files /dev/null and b/template/public/assets/images/cover/cover_21.jpg differ
diff --git a/template/public/assets/images/cover/cover_22.jpg b/template/public/assets/images/cover/cover_22.jpg
new file mode 100644
index 0000000..786e649
Binary files /dev/null and b/template/public/assets/images/cover/cover_22.jpg differ
diff --git a/template/public/assets/images/cover/cover_23.jpg b/template/public/assets/images/cover/cover_23.jpg
new file mode 100644
index 0000000..ec6572d
Binary files /dev/null and b/template/public/assets/images/cover/cover_23.jpg differ
diff --git a/template/public/assets/images/cover/cover_24.jpg b/template/public/assets/images/cover/cover_24.jpg
new file mode 100644
index 0000000..f0347c0
Binary files /dev/null and b/template/public/assets/images/cover/cover_24.jpg differ
diff --git a/template/public/assets/images/cover/cover_3.jpg b/template/public/assets/images/cover/cover_3.jpg
new file mode 100644
index 0000000..93be1a4
Binary files /dev/null and b/template/public/assets/images/cover/cover_3.jpg differ
diff --git a/template/public/assets/images/cover/cover_4.jpg b/template/public/assets/images/cover/cover_4.jpg
new file mode 100644
index 0000000..774ed16
Binary files /dev/null and b/template/public/assets/images/cover/cover_4.jpg differ
diff --git a/template/public/assets/images/cover/cover_5.jpg b/template/public/assets/images/cover/cover_5.jpg
new file mode 100644
index 0000000..1657d6c
Binary files /dev/null and b/template/public/assets/images/cover/cover_5.jpg differ
diff --git a/template/public/assets/images/cover/cover_6.jpg b/template/public/assets/images/cover/cover_6.jpg
new file mode 100644
index 0000000..29d2345
Binary files /dev/null and b/template/public/assets/images/cover/cover_6.jpg differ
diff --git a/template/public/assets/images/cover/cover_7.jpg b/template/public/assets/images/cover/cover_7.jpg
new file mode 100644
index 0000000..4bedf71
Binary files /dev/null and b/template/public/assets/images/cover/cover_7.jpg differ
diff --git a/template/public/assets/images/cover/cover_8.jpg b/template/public/assets/images/cover/cover_8.jpg
new file mode 100644
index 0000000..31d53bc
Binary files /dev/null and b/template/public/assets/images/cover/cover_8.jpg differ
diff --git a/template/public/assets/images/cover/cover_9.jpg b/template/public/assets/images/cover/cover_9.jpg
new file mode 100644
index 0000000..444276b
Binary files /dev/null and b/template/public/assets/images/cover/cover_9.jpg differ
diff --git a/template/public/assets/images/home/advertisement.jpg b/template/public/assets/images/home/advertisement.jpg
new file mode 100644
index 0000000..3d2807d
Binary files /dev/null and b/template/public/assets/images/home/advertisement.jpg differ
diff --git a/template/public/assets/images/home/for_designer.jpg b/template/public/assets/images/home/for_designer.jpg
new file mode 100644
index 0000000..931c8ee
Binary files /dev/null and b/template/public/assets/images/home/for_designer.jpg differ
diff --git a/template/public/assets/images/home/home_hero.png b/template/public/assets/images/home/home_hero.png
new file mode 100644
index 0000000..869d6dc
Binary files /dev/null and b/template/public/assets/images/home/home_hero.png differ
diff --git a/template/public/assets/images/home/minimal_dashboard.png b/template/public/assets/images/home/minimal_dashboard.png
new file mode 100644
index 0000000..deed9c6
Binary files /dev/null and b/template/public/assets/images/home/minimal_dashboard.png differ
diff --git a/template/public/assets/images/home/new_start.png b/template/public/assets/images/home/new_start.png
new file mode 100644
index 0000000..ae558f1
Binary files /dev/null and b/template/public/assets/images/home/new_start.png differ
diff --git a/template/public/assets/images/marketing/marketing_1.jpg b/template/public/assets/images/marketing/marketing_1.jpg
new file mode 100644
index 0000000..b4ab11c
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_1.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_10.jpg b/template/public/assets/images/marketing/marketing_10.jpg
new file mode 100644
index 0000000..d14a48e
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_10.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_11.jpg b/template/public/assets/images/marketing/marketing_11.jpg
new file mode 100644
index 0000000..fa4dea0
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_11.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_12.jpg b/template/public/assets/images/marketing/marketing_12.jpg
new file mode 100644
index 0000000..5b61756
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_12.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_2.jpg b/template/public/assets/images/marketing/marketing_2.jpg
new file mode 100644
index 0000000..77fddb9
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_2.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_3.jpg b/template/public/assets/images/marketing/marketing_3.jpg
new file mode 100644
index 0000000..883372f
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_3.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_4.jpg b/template/public/assets/images/marketing/marketing_4.jpg
new file mode 100644
index 0000000..a4487cf
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_4.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_5.jpg b/template/public/assets/images/marketing/marketing_5.jpg
new file mode 100644
index 0000000..c717e37
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_5.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_6.jpg b/template/public/assets/images/marketing/marketing_6.jpg
new file mode 100644
index 0000000..4f4bdc0
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_6.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_7.jpg b/template/public/assets/images/marketing/marketing_7.jpg
new file mode 100644
index 0000000..9f637a3
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_7.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_8.jpg b/template/public/assets/images/marketing/marketing_8.jpg
new file mode 100644
index 0000000..0cbd21d
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_8.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_9.jpg b/template/public/assets/images/marketing/marketing_9.jpg
new file mode 100644
index 0000000..8301a18
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_9.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_get_free_seo.jpg b/template/public/assets/images/marketing/marketing_get_free_seo.jpg
new file mode 100644
index 0000000..f6f6f40
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_get_free_seo.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_post_01.jpg b/template/public/assets/images/marketing/marketing_post_01.jpg
new file mode 100644
index 0000000..5de7fc3
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_post_01.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_post_02.jpg b/template/public/assets/images/marketing/marketing_post_02.jpg
new file mode 100644
index 0000000..1ab453d
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_post_02.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_post_hero.jpg b/template/public/assets/images/marketing/marketing_post_hero.jpg
new file mode 100644
index 0000000..45625c9
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_post_hero.jpg differ
diff --git a/template/public/assets/images/marketing/marketing_services_hero.jpg b/template/public/assets/images/marketing/marketing_services_hero.jpg
new file mode 100644
index 0000000..3e12dd0
Binary files /dev/null and b/template/public/assets/images/marketing/marketing_services_hero.jpg differ
diff --git a/template/public/assets/images/menu/menu_career.jpg b/template/public/assets/images/menu/menu_career.jpg
new file mode 100644
index 0000000..2e35716
Binary files /dev/null and b/template/public/assets/images/menu/menu_career.jpg differ
diff --git a/template/public/assets/images/menu/menu_ecommerce.jpg b/template/public/assets/images/menu/menu_ecommerce.jpg
new file mode 100644
index 0000000..10feeaf
Binary files /dev/null and b/template/public/assets/images/menu/menu_ecommerce.jpg differ
diff --git a/template/public/assets/images/menu/menu_elearning.jpg b/template/public/assets/images/menu/menu_elearning.jpg
new file mode 100644
index 0000000..1c6a760
Binary files /dev/null and b/template/public/assets/images/menu/menu_elearning.jpg differ
diff --git a/template/public/assets/images/menu/menu_marketing.jpg b/template/public/assets/images/menu/menu_marketing.jpg
new file mode 100644
index 0000000..46709d1
Binary files /dev/null and b/template/public/assets/images/menu/menu_marketing.jpg differ
diff --git a/template/public/assets/images/menu/menu_travel.jpg b/template/public/assets/images/menu/menu_travel.jpg
new file mode 100644
index 0000000..249764e
Binary files /dev/null and b/template/public/assets/images/menu/menu_travel.jpg differ
diff --git a/template/public/assets/images/portrait/portrait_1.jpg b/template/public/assets/images/portrait/portrait_1.jpg
new file mode 100644
index 0000000..e6388d0
Binary files /dev/null and b/template/public/assets/images/portrait/portrait_1.jpg differ
diff --git a/template/public/assets/images/portrait/portrait_2.jpg b/template/public/assets/images/portrait/portrait_2.jpg
new file mode 100644
index 0000000..36c8410
Binary files /dev/null and b/template/public/assets/images/portrait/portrait_2.jpg differ
diff --git a/template/public/assets/images/portrait/portrait_3.jpg b/template/public/assets/images/portrait/portrait_3.jpg
new file mode 100644
index 0000000..af6b2ad
Binary files /dev/null and b/template/public/assets/images/portrait/portrait_3.jpg differ
diff --git a/template/public/assets/images/portrait/portrait_4.jpg b/template/public/assets/images/portrait/portrait_4.jpg
new file mode 100644
index 0000000..2718adf
Binary files /dev/null and b/template/public/assets/images/portrait/portrait_4.jpg differ
diff --git a/template/public/assets/images/portrait/portrait_5.jpg b/template/public/assets/images/portrait/portrait_5.jpg
new file mode 100644
index 0000000..6548d10
Binary files /dev/null and b/template/public/assets/images/portrait/portrait_5.jpg differ
diff --git a/template/public/assets/images/portrait/portrait_6.jpg b/template/public/assets/images/portrait/portrait_6.jpg
new file mode 100644
index 0000000..f15b85b
Binary files /dev/null and b/template/public/assets/images/portrait/portrait_6.jpg differ
diff --git a/template/public/assets/images/portrait/portrait_7.jpg b/template/public/assets/images/portrait/portrait_7.jpg
new file mode 100644
index 0000000..af2ddc7
Binary files /dev/null and b/template/public/assets/images/portrait/portrait_7.jpg differ
diff --git a/template/public/assets/images/portrait/portrait_8.jpg b/template/public/assets/images/portrait/portrait_8.jpg
new file mode 100644
index 0000000..b3b31da
Binary files /dev/null and b/template/public/assets/images/portrait/portrait_8.jpg differ
diff --git a/template/public/assets/images/travel/travel_1.jpg b/template/public/assets/images/travel/travel_1.jpg
new file mode 100644
index 0000000..58bf2b5
Binary files /dev/null and b/template/public/assets/images/travel/travel_1.jpg differ
diff --git a/template/public/assets/images/travel/travel_10.jpg b/template/public/assets/images/travel/travel_10.jpg
new file mode 100644
index 0000000..c502466
Binary files /dev/null and b/template/public/assets/images/travel/travel_10.jpg differ
diff --git a/template/public/assets/images/travel/travel_11.jpg b/template/public/assets/images/travel/travel_11.jpg
new file mode 100644
index 0000000..3ebb9bf
Binary files /dev/null and b/template/public/assets/images/travel/travel_11.jpg differ
diff --git a/template/public/assets/images/travel/travel_12.jpg b/template/public/assets/images/travel/travel_12.jpg
new file mode 100644
index 0000000..7880947
Binary files /dev/null and b/template/public/assets/images/travel/travel_12.jpg differ
diff --git a/template/public/assets/images/travel/travel_13.jpg b/template/public/assets/images/travel/travel_13.jpg
new file mode 100644
index 0000000..59c6ae5
Binary files /dev/null and b/template/public/assets/images/travel/travel_13.jpg differ
diff --git a/template/public/assets/images/travel/travel_14.jpg b/template/public/assets/images/travel/travel_14.jpg
new file mode 100644
index 0000000..880d643
Binary files /dev/null and b/template/public/assets/images/travel/travel_14.jpg differ
diff --git a/template/public/assets/images/travel/travel_15.jpg b/template/public/assets/images/travel/travel_15.jpg
new file mode 100644
index 0000000..8b40486
Binary files /dev/null and b/template/public/assets/images/travel/travel_15.jpg differ
diff --git a/template/public/assets/images/travel/travel_16.jpg b/template/public/assets/images/travel/travel_16.jpg
new file mode 100644
index 0000000..3a354d0
Binary files /dev/null and b/template/public/assets/images/travel/travel_16.jpg differ
diff --git a/template/public/assets/images/travel/travel_2.jpg b/template/public/assets/images/travel/travel_2.jpg
new file mode 100644
index 0000000..23e8a0f
Binary files /dev/null and b/template/public/assets/images/travel/travel_2.jpg differ
diff --git a/template/public/assets/images/travel/travel_3.jpg b/template/public/assets/images/travel/travel_3.jpg
new file mode 100644
index 0000000..9a93382
Binary files /dev/null and b/template/public/assets/images/travel/travel_3.jpg differ
diff --git a/template/public/assets/images/travel/travel_4.jpg b/template/public/assets/images/travel/travel_4.jpg
new file mode 100644
index 0000000..423524e
Binary files /dev/null and b/template/public/assets/images/travel/travel_4.jpg differ
diff --git a/template/public/assets/images/travel/travel_5.jpg b/template/public/assets/images/travel/travel_5.jpg
new file mode 100644
index 0000000..9145573
Binary files /dev/null and b/template/public/assets/images/travel/travel_5.jpg differ
diff --git a/template/public/assets/images/travel/travel_6.jpg b/template/public/assets/images/travel/travel_6.jpg
new file mode 100644
index 0000000..9e494d0
Binary files /dev/null and b/template/public/assets/images/travel/travel_6.jpg differ
diff --git a/template/public/assets/images/travel/travel_7.jpg b/template/public/assets/images/travel/travel_7.jpg
new file mode 100644
index 0000000..bc6de92
Binary files /dev/null and b/template/public/assets/images/travel/travel_7.jpg differ
diff --git a/template/public/assets/images/travel/travel_8.jpg b/template/public/assets/images/travel/travel_8.jpg
new file mode 100644
index 0000000..0628798
Binary files /dev/null and b/template/public/assets/images/travel/travel_8.jpg differ
diff --git a/template/public/assets/images/travel/travel_9.jpg b/template/public/assets/images/travel/travel_9.jpg
new file mode 100644
index 0000000..0ed9269
Binary files /dev/null and b/template/public/assets/images/travel/travel_9.jpg differ
diff --git a/template/public/assets/images/travel/travel_newsletter.jpg b/template/public/assets/images/travel/travel_newsletter.jpg
new file mode 100644
index 0000000..afbfe26
Binary files /dev/null and b/template/public/assets/images/travel/travel_newsletter.jpg differ
diff --git a/template/public/assets/images/travel/travel_post_01.jpg b/template/public/assets/images/travel/travel_post_01.jpg
new file mode 100644
index 0000000..6b87a0e
Binary files /dev/null and b/template/public/assets/images/travel/travel_post_01.jpg differ
diff --git a/template/public/assets/images/travel/travel_post_02.jpg b/template/public/assets/images/travel/travel_post_02.jpg
new file mode 100644
index 0000000..6fd1fa2
Binary files /dev/null and b/template/public/assets/images/travel/travel_post_02.jpg differ
diff --git a/template/public/assets/images/travel/travel_post_03.jpg b/template/public/assets/images/travel/travel_post_03.jpg
new file mode 100644
index 0000000..faeb1a1
Binary files /dev/null and b/template/public/assets/images/travel/travel_post_03.jpg differ
diff --git a/template/public/assets/images/travel/travel_post_04.jpg b/template/public/assets/images/travel/travel_post_04.jpg
new file mode 100644
index 0000000..7dd51ee
Binary files /dev/null and b/template/public/assets/images/travel/travel_post_04.jpg differ
diff --git a/template/public/assets/images/travel/travel_post_hero.jpg b/template/public/assets/images/travel/travel_post_hero.jpg
new file mode 100644
index 0000000..dfe7301
Binary files /dev/null and b/template/public/assets/images/travel/travel_post_hero.jpg differ
diff --git a/template/public/assets/images/travel/travel_testimonial.png b/template/public/assets/images/travel/travel_testimonial.png
new file mode 100644
index 0000000..bbd9d67
Binary files /dev/null and b/template/public/assets/images/travel/travel_testimonial.png differ
diff --git a/template/public/assets/images/z_product/product_1.png b/template/public/assets/images/z_product/product_1.png
new file mode 100644
index 0000000..376e364
Binary files /dev/null and b/template/public/assets/images/z_product/product_1.png differ
diff --git a/template/public/assets/images/z_product/product_10.png b/template/public/assets/images/z_product/product_10.png
new file mode 100644
index 0000000..711e088
Binary files /dev/null and b/template/public/assets/images/z_product/product_10.png differ
diff --git a/template/public/assets/images/z_product/product_11.png b/template/public/assets/images/z_product/product_11.png
new file mode 100644
index 0000000..7a22412
Binary files /dev/null and b/template/public/assets/images/z_product/product_11.png differ
diff --git a/template/public/assets/images/z_product/product_12.png b/template/public/assets/images/z_product/product_12.png
new file mode 100644
index 0000000..3aa3127
Binary files /dev/null and b/template/public/assets/images/z_product/product_12.png differ
diff --git a/template/public/assets/images/z_product/product_13.png b/template/public/assets/images/z_product/product_13.png
new file mode 100644
index 0000000..c874b07
Binary files /dev/null and b/template/public/assets/images/z_product/product_13.png differ
diff --git a/template/public/assets/images/z_product/product_14.png b/template/public/assets/images/z_product/product_14.png
new file mode 100644
index 0000000..a61cbd6
Binary files /dev/null and b/template/public/assets/images/z_product/product_14.png differ
diff --git a/template/public/assets/images/z_product/product_15.png b/template/public/assets/images/z_product/product_15.png
new file mode 100644
index 0000000..2671408
Binary files /dev/null and b/template/public/assets/images/z_product/product_15.png differ
diff --git a/template/public/assets/images/z_product/product_16.png b/template/public/assets/images/z_product/product_16.png
new file mode 100644
index 0000000..6e32409
Binary files /dev/null and b/template/public/assets/images/z_product/product_16.png differ
diff --git a/template/public/assets/images/z_product/product_17.png b/template/public/assets/images/z_product/product_17.png
new file mode 100644
index 0000000..e301e57
Binary files /dev/null and b/template/public/assets/images/z_product/product_17.png differ
diff --git a/template/public/assets/images/z_product/product_18.png b/template/public/assets/images/z_product/product_18.png
new file mode 100644
index 0000000..0da0752
Binary files /dev/null and b/template/public/assets/images/z_product/product_18.png differ
diff --git a/template/public/assets/images/z_product/product_19.png b/template/public/assets/images/z_product/product_19.png
new file mode 100644
index 0000000..023bb54
Binary files /dev/null and b/template/public/assets/images/z_product/product_19.png differ
diff --git a/template/public/assets/images/z_product/product_2.png b/template/public/assets/images/z_product/product_2.png
new file mode 100644
index 0000000..ee17068
Binary files /dev/null and b/template/public/assets/images/z_product/product_2.png differ
diff --git a/template/public/assets/images/z_product/product_20.png b/template/public/assets/images/z_product/product_20.png
new file mode 100644
index 0000000..9dde472
Binary files /dev/null and b/template/public/assets/images/z_product/product_20.png differ
diff --git a/template/public/assets/images/z_product/product_21.png b/template/public/assets/images/z_product/product_21.png
new file mode 100644
index 0000000..e6576f2
Binary files /dev/null and b/template/public/assets/images/z_product/product_21.png differ
diff --git a/template/public/assets/images/z_product/product_22.png b/template/public/assets/images/z_product/product_22.png
new file mode 100644
index 0000000..51bdfa1
Binary files /dev/null and b/template/public/assets/images/z_product/product_22.png differ
diff --git a/template/public/assets/images/z_product/product_23.png b/template/public/assets/images/z_product/product_23.png
new file mode 100644
index 0000000..e62ebc0
Binary files /dev/null and b/template/public/assets/images/z_product/product_23.png differ
diff --git a/template/public/assets/images/z_product/product_24.png b/template/public/assets/images/z_product/product_24.png
new file mode 100644
index 0000000..4d02903
Binary files /dev/null and b/template/public/assets/images/z_product/product_24.png differ
diff --git a/template/public/assets/images/z_product/product_3.png b/template/public/assets/images/z_product/product_3.png
new file mode 100644
index 0000000..fb8ab13
Binary files /dev/null and b/template/public/assets/images/z_product/product_3.png differ
diff --git a/template/public/assets/images/z_product/product_4.png b/template/public/assets/images/z_product/product_4.png
new file mode 100644
index 0000000..411ee94
Binary files /dev/null and b/template/public/assets/images/z_product/product_4.png differ
diff --git a/template/public/assets/images/z_product/product_5.png b/template/public/assets/images/z_product/product_5.png
new file mode 100644
index 0000000..534d204
Binary files /dev/null and b/template/public/assets/images/z_product/product_5.png differ
diff --git a/template/public/assets/images/z_product/product_6.png b/template/public/assets/images/z_product/product_6.png
new file mode 100644
index 0000000..0cc7dbe
Binary files /dev/null and b/template/public/assets/images/z_product/product_6.png differ
diff --git a/template/public/assets/images/z_product/product_7.png b/template/public/assets/images/z_product/product_7.png
new file mode 100644
index 0000000..f571f99
Binary files /dev/null and b/template/public/assets/images/z_product/product_7.png differ
diff --git a/template/public/assets/images/z_product/product_8.png b/template/public/assets/images/z_product/product_8.png
new file mode 100644
index 0000000..ac1b003
Binary files /dev/null and b/template/public/assets/images/z_product/product_8.png differ
diff --git a/template/public/assets/images/z_product/product_9.png b/template/public/assets/images/z_product/product_9.png
new file mode 100644
index 0000000..70e0c26
Binary files /dev/null and b/template/public/assets/images/z_product/product_9.png differ
diff --git a/template/public/assets/logo/airbnb.svg b/template/public/assets/logo/airbnb.svg
new file mode 100644
index 0000000..f58a5dd
--- /dev/null
+++ b/template/public/assets/logo/airbnb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/airbnb_original.svg b/template/public/assets/logo/airbnb_original.svg
new file mode 100644
index 0000000..ceec763
--- /dev/null
+++ b/template/public/assets/logo/airbnb_original.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/template/public/assets/logo/dropbox.svg b/template/public/assets/logo/dropbox.svg
new file mode 100644
index 0000000..f34dfb1
--- /dev/null
+++ b/template/public/assets/logo/dropbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/dropbox_original.svg b/template/public/assets/logo/dropbox_original.svg
new file mode 100644
index 0000000..603e8b0
--- /dev/null
+++ b/template/public/assets/logo/dropbox_original.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/template/public/assets/logo/facebook.svg b/template/public/assets/logo/facebook.svg
new file mode 100644
index 0000000..02f63c2
--- /dev/null
+++ b/template/public/assets/logo/facebook.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/facebook_original.svg b/template/public/assets/logo/facebook_original.svg
new file mode 100644
index 0000000..3544ab5
--- /dev/null
+++ b/template/public/assets/logo/facebook_original.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/template/public/assets/logo/google.svg b/template/public/assets/logo/google.svg
new file mode 100644
index 0000000..0219c7c
--- /dev/null
+++ b/template/public/assets/logo/google.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/google_original.svg b/template/public/assets/logo/google_original.svg
new file mode 100644
index 0000000..366dfae
--- /dev/null
+++ b/template/public/assets/logo/google_original.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/template/public/assets/logo/heroku.svg b/template/public/assets/logo/heroku.svg
new file mode 100644
index 0000000..50c03ce
--- /dev/null
+++ b/template/public/assets/logo/heroku.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/heroku_original.svg b/template/public/assets/logo/heroku_original.svg
new file mode 100644
index 0000000..cdc57e6
--- /dev/null
+++ b/template/public/assets/logo/heroku_original.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/template/public/assets/logo/lenovo.svg b/template/public/assets/logo/lenovo.svg
new file mode 100644
index 0000000..9132e57
--- /dev/null
+++ b/template/public/assets/logo/lenovo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/lenovo_original.svg b/template/public/assets/logo/lenovo_original.svg
new file mode 100644
index 0000000..4292072
--- /dev/null
+++ b/template/public/assets/logo/lenovo_original.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/template/public/assets/logo/microsoft.svg b/template/public/assets/logo/microsoft.svg
new file mode 100644
index 0000000..67e599a
--- /dev/null
+++ b/template/public/assets/logo/microsoft.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/microsoft_original.svg b/template/public/assets/logo/microsoft_original.svg
new file mode 100644
index 0000000..34ffe28
--- /dev/null
+++ b/template/public/assets/logo/microsoft_original.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/template/public/assets/logo/netflix.svg b/template/public/assets/logo/netflix.svg
new file mode 100644
index 0000000..4292234
--- /dev/null
+++ b/template/public/assets/logo/netflix.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/netflix_original.svg b/template/public/assets/logo/netflix_original.svg
new file mode 100644
index 0000000..ade4931
--- /dev/null
+++ b/template/public/assets/logo/netflix_original.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/template/public/assets/logo/slack.svg b/template/public/assets/logo/slack.svg
new file mode 100644
index 0000000..913439e
--- /dev/null
+++ b/template/public/assets/logo/slack.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/slack_original.svg b/template/public/assets/logo/slack_original.svg
new file mode 100644
index 0000000..5896c7e
--- /dev/null
+++ b/template/public/assets/logo/slack_original.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/template/public/assets/logo/spotify.svg b/template/public/assets/logo/spotify.svg
new file mode 100644
index 0000000..0a506bb
--- /dev/null
+++ b/template/public/assets/logo/spotify.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/spotify_original.svg b/template/public/assets/logo/spotify_original.svg
new file mode 100644
index 0000000..d1e176a
--- /dev/null
+++ b/template/public/assets/logo/spotify_original.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/template/public/assets/logo/tripadvisor.svg b/template/public/assets/logo/tripadvisor.svg
new file mode 100644
index 0000000..c9b8b49
--- /dev/null
+++ b/template/public/assets/logo/tripadvisor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/tripadvisor_original.svg b/template/public/assets/logo/tripadvisor_original.svg
new file mode 100644
index 0000000..29f59a1
--- /dev/null
+++ b/template/public/assets/logo/tripadvisor_original.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/template/public/assets/logo/vimeo.svg b/template/public/assets/logo/vimeo.svg
new file mode 100644
index 0000000..4967b56
--- /dev/null
+++ b/template/public/assets/logo/vimeo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/logo/vimeo_original.svg b/template/public/assets/logo/vimeo_original.svg
new file mode 100644
index 0000000..e19e15e
--- /dev/null
+++ b/template/public/assets/logo/vimeo_original.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/template/public/assets/placeholder.svg b/template/public/assets/placeholder.svg
new file mode 100644
index 0000000..011a73d
--- /dev/null
+++ b/template/public/assets/placeholder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/template/public/assets/red-blur.png b/template/public/assets/red-blur.png
new file mode 100644
index 0000000..a0df012
Binary files /dev/null and b/template/public/assets/red-blur.png differ
diff --git a/template/public/assets/transparent.png b/template/public/assets/transparent.png
new file mode 100644
index 0000000..c953550
Binary files /dev/null and b/template/public/assets/transparent.png differ
diff --git a/template/public/favicon/android-chrome-192x192.png b/template/public/favicon/android-chrome-192x192.png
new file mode 100644
index 0000000..2aeb86d
Binary files /dev/null and b/template/public/favicon/android-chrome-192x192.png differ
diff --git a/template/public/favicon/android-chrome-512x512.png b/template/public/favicon/android-chrome-512x512.png
new file mode 100644
index 0000000..0d42275
Binary files /dev/null and b/template/public/favicon/android-chrome-512x512.png differ
diff --git a/template/public/favicon/apple-touch-icon.png b/template/public/favicon/apple-touch-icon.png
new file mode 100644
index 0000000..15fd808
Binary files /dev/null and b/template/public/favicon/apple-touch-icon.png differ
diff --git a/template/public/favicon/favicon-16x16.png b/template/public/favicon/favicon-16x16.png
new file mode 100644
index 0000000..a3fe160
Binary files /dev/null and b/template/public/favicon/favicon-16x16.png differ
diff --git a/template/public/favicon/favicon-32x32.png b/template/public/favicon/favicon-32x32.png
new file mode 100644
index 0000000..a31de4a
Binary files /dev/null and b/template/public/favicon/favicon-32x32.png differ
diff --git a/template/public/favicon/favicon.ico b/template/public/favicon/favicon.ico
new file mode 100644
index 0000000..fef06be
Binary files /dev/null and b/template/public/favicon/favicon.ico differ
diff --git a/template/public/manifest.json b/template/public/manifest.json
new file mode 100644
index 0000000..7e8821c
--- /dev/null
+++ b/template/public/manifest.json
@@ -0,0 +1,20 @@
+{
+ "name": "Zone UI",
+ "short_name": "Zone UI",
+ "display": "standalone",
+ "start_url": "/",
+ "theme_color": "#000000",
+ "background_color": "#ffffff",
+ "icons": [
+ {
+ "src": "favicon/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "favicon/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ]
+}
diff --git a/template/public/robots.txt b/template/public/robots.txt
new file mode 100644
index 0000000..e9e57dc
--- /dev/null
+++ b/template/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/template/src/_mock/_blog.js b/template/src/_mock/_blog.js
new file mode 100644
index 0000000..037a004
--- /dev/null
+++ b/template/src/_mock/_blog.js
@@ -0,0 +1,104 @@
+import { _mock } from './_mock';
+import { _tags } from './assets';
+
+// ----------------------------------------------------------------------
+
+const content = (name) => `
+Pellentesque posuere. Phasellus a est. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc.
+
+
+Pellentesque posuere. Phasellus a est. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Phasellus viverra nulla ut metus varius laoreet. Praesent egestas tristique nibh. Donec posuere vulputate arcu. Quisque rutrum.
+
+
+Donec posuere vulputate arcu. Quisque rutrum. Curabitur vestibulum aliquam leo. Nam commodo suscipit quam. Vestibulum ullamcorper mauris at ligula.
+
+
+Pellentesque posuere. Phasellus a est. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Phasellus viverra nulla ut metus varius laoreet. Praesent egestas tristique nibh.
+
+
+
+
+
+
+
+
+
+Curabitur suscipit suscipit tellus
+
+
+Donec posuere vulputate arcu. Quisque rutrum. Curabitur vestibulum aliquam leo. Nam commodo suscipit quam. Vestibulum ullamcorper mauris at ligula.
+
+
+Nullam accumsan lorem in
+
+
+Donec posuere vulputate arcu. Quisque rutrum. Curabitur vestibulum aliquam leo. Nam commodo suscipit quam. Vestibulum ullamcorper mauris at ligula.
+
+
+Donec posuere vulputate arcu. Quisque rutrum. Curabitur vestibulum aliquam leo.
+
+
+
+
+
+
+
+
+
+Donec posuere vulputate arcu. Quisque rutrum. Curabitur vestibulum aliquam leo. Nam commodo suscipit quam. Vestibulum ullamcorper mauris at ligula.
+
+
+Pellentesque posuere. Phasellus a est. Suspendisse pulvinar, augue ac venenatis condimentum, sem libero volutpat nibh, nec pellentesque velit pede quis nunc. Phasellus viverra nulla ut metus varius laoreet. Praesent egestas tristique nibh.
+
+
+Donec posuere vulputate arcu. Quisque rutrum. Curabitur vestibulum aliquam leo. Nam commodo suscipit quam. Vestibulum ullamcorper mauris at ligula.
+`;
+
+const base = (index) => ({
+ id: _mock.id(index),
+ title: _mock.postTitle(index),
+ description: _mock.description(index),
+ category: 'Marketing',
+ favorited: _mock.boolean(index),
+ createdAt: _mock.time(index),
+ duration: '8 minutes read',
+ tags: _tags.slice(index + 1, index + 2),
+ author: {
+ name: _mock.fullName(index),
+ role: _mock.role(index),
+ avatarUrl: _mock.image.avatar(index),
+ quotes: 'Member since Mar 15, 2021',
+ about:
+ 'Integer tincidunt. Nullam dictum felis eu pede mollis pretium. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem.',
+ },
+});
+
+// ----------------------------------------------------------------------
+
+export const _marketingPosts = [...Array(12)].map((_, index) => ({
+ ...base(index),
+ content: content('marketing'),
+ coverUrl: _mock.image.marketing(index),
+ heroUrl: `/assets/images/marketing/marketing_post_hero.jpg`,
+}));
+
+export const _travelPosts = [...Array(12)].map((_, index) => ({
+ ...base(index),
+ content: content('travel'),
+ coverUrl: _mock.image.travel(index),
+ heroUrl: `/assets/images/travel/travel_post_hero.jpg`,
+}));
+
+export const _careerPosts = [...Array(12)].map((_, index) => ({
+ ...base(index),
+ content: content('career'),
+ coverUrl: _mock.image.career(index),
+ heroUrl: `/assets/images/career/career_post_hero.jpg`,
+}));
+
+export const _coursePosts = [...Array(12)].map((_, index) => ({
+ ...base(index),
+ content: content('course'),
+ coverUrl: _mock.image.course(index),
+ heroUrl: `/assets/images/course/course_post_hero.jpg`,
+}));
diff --git a/template/src/_mock/_caseStudies.js b/template/src/_mock/_caseStudies.js
new file mode 100644
index 0000000..b1a937e
--- /dev/null
+++ b/template/src/_mock/_caseStudies.js
@@ -0,0 +1,77 @@
+import { _mock } from './_mock';
+import { _tags } from './assets';
+
+// ----------------------------------------------------------------------
+
+const TITLE = [
+ 'Bank of America',
+ 'Technology Nixon',
+ 'Turn Key Smart',
+ 'Digital Shose',
+ 'Action Car',
+ 'The Zone UI',
+ 'Minimal UI',
+ 'Network Firefox',
+];
+
+const CONTENT = `
+Project Brief
+
+Nullam tincidunt adipiscing enim. Mauris sollicitudin fermentum libero. Pellentesque auctor neque nec urna. Sed fringilla mauris sit amet nibh. Phasellus viverra nulla ut metus varius laoreet.
+
+
+
+
+How We Work
+
+Nullam tincidunt adipiscing enim. Mauris sollicitudin fermentum libero. Pellentesque auctor neque nec urna. Sed fringilla mauris sit amet nibh. Phasellus viverra nulla ut metus varius laoreet.
+
+
+ Medical Assistant
+ Web Designer
+ Dog Trainer
+ Nursing Assistant
+ President of Sales
+
+
+
+
+Results
+
+Nullam tincidunt adipiscing enim. Mauris sollicitudin fermentum libero. Pellentesque auctor neque nec urna. Sed fringilla mauris sit amet nibh. Phasellus viverra nulla ut metus varius laoreet.
+
+ Medical Assistant
+ Web Designer
+ Dog Trainer
+ Nursing Assistant
+ President of Sales
+
+`;
+
+export const _caseStudies = TITLE.map((_, index) => {
+ const galleryImgs = [
+ _mock.image.marketing(0),
+ _mock.image.marketing(1),
+ _mock.image.marketing(2),
+ _mock.image.marketing(3),
+ _mock.image.marketing(4),
+ _mock.image.marketing(5),
+ ];
+
+ return {
+ id: _mock.id(index),
+ content: CONTENT,
+ title: TITLE[index],
+ category: _tags[index],
+ createdAt: _mock.time(index),
+ website: 'https://example.com/',
+ description: _mock.description(index),
+ heroUrl: '/assets/images/marketing/marketing_post_hero.jpg',
+ coverUrl: `/assets/images/marketing/marketing_${index + 1}.jpg`,
+ how_we_work:
+ 'Nullam tincidunt adipiscing enim. Mauris sollicitudin fermentum libero. Pellentesque auctor neque nec urna. Sed fringi',
+ results:
+ 'Nullam tincidunt adipiscing enim. Mauris sollicitudin fermentum libero. Pellentesque auctor neque nec urna. Sed fringi',
+ galleryImgs,
+ };
+});
diff --git a/template/src/_mock/_courses.js b/template/src/_mock/_courses.js
new file mode 100644
index 0000000..ad1742d
--- /dev/null
+++ b/template/src/_mock/_courses.js
@@ -0,0 +1,81 @@
+import { _mock } from './_mock';
+import { _tags } from './assets';
+
+// ----------------------------------------------------------------------
+
+const TEACHERS = [...Array(5)].map((_, index) => ({
+ id: _mock.id(index),
+ role: _mock.role(index),
+ name: _mock.fullName(index),
+ avatarUrl: _mock.image.avatar(index),
+ totalCourses: 48,
+ totalReviews: 3458,
+ totalStudents: 18000,
+ ratingNumber: _mock.number.rating(index),
+}));
+
+const LESSONS = [...Array(9)].map((_, index) => ({
+ id: _mock.id(index),
+ duration: 60 - index,
+ title: `Lesson ${index + 1}`,
+ videoPath: _mock.video(index),
+ description: _mock.sentence(index),
+ unLocked: [0, 1, 2].includes(index),
+}));
+
+export const _courses = [...Array(12)].map((_, index) => {
+ const languages = ['Russian', 'Spanish', 'English'];
+
+ const skills = _tags.slice(0, 5);
+
+ const level =
+ (index % 2 && 'Intermediate') ||
+ (index % 4 && 'Expert') ||
+ (index % 5 && 'All Levels') ||
+ 'Beginner';
+
+ const learnList = [
+ 'A fermentum in morbi pretium aliquam adipiscing donec tempus.',
+ 'Vulputate placerat amet pulvinar lorem nisl.',
+ 'Consequat feugiat habitant gravida quisque elit bibendum id adipiscing sed.',
+ 'Etiam duis lobortis in fames ultrices commodo nibh.',
+ 'Fusce neque. Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit.',
+ 'Curabitur a felis in nunc fringilla tristique. Praesent congue erat at massa.',
+ ];
+
+ return {
+ id: _mock.id(index),
+ level,
+ skills,
+ languages,
+ learnList,
+ resources: 12,
+ totalHours: 100,
+ lessons: LESSONS,
+ totalQuizzes: 100,
+ totalReviews: 3458,
+ teachers: TEACHERS,
+ totalStudents: 180000,
+ createdAt: new Date(),
+ category: _tags[index],
+ slug: _mock.courseTitle(index),
+ bestSeller: index === 2 || false,
+ coverUrl: _mock.image.course(index),
+ ratingNumber: _mock.number.rating(index),
+ description: _mock.description(index),
+ price: (index % 2 && 159.99) || 269.99,
+ priceSale: (index === 2 && 89.99) || (index === 5 && 69.99) || 0,
+ shareLinks: {
+ facebook: `facebook/user-name`,
+ instagram: `instagram/user-name`,
+ linkedin: `linkedin/user-name`,
+ twitter: `twitter/user-name`,
+ },
+ };
+});
+
+export const _coursesByCategories = [...Array(9)].map((_, index) => ({
+ id: _mock.id(index),
+ name: _tags[index],
+ totalStudents: _mock.number.nativeM(index),
+}));
diff --git a/template/src/_mock/_jobs.js b/template/src/_mock/_jobs.js
new file mode 100644
index 0000000..8231002
--- /dev/null
+++ b/template/src/_mock/_jobs.js
@@ -0,0 +1,145 @@
+import { add } from 'date-fns';
+
+import { countries } from 'src/assets/data';
+
+import { _mock } from './_mock';
+import { _tags } from './assets';
+
+// ----------------------------------------------------------------------
+
+const CONTENT = `
+Job Description
+
+Occaecati est et illo quibusdam accusamus qui. Incidunt aut et molestiae ut facere aut. Est quidem iusto praesentium excepturi harum nihil tenetur facilis. Ut omnis voluptates nihil accusantium doloribus eaque debitis.
+
+
+
+
+Key Responsibilities
+
+
+ Working with agency for design drawing detail, quotation and local production.
+ Produce window displays, signs, interior displays, floor plans and special promotions displays.
+ Change displays to promote new product launches and reflect festive or seasonal themes.
+ Planning and executing the open/renovation/ closing store procedure.
+ Follow‐up store maintenance procedure and keep updating SKU In & Out.
+ Monitor costs and work within budget.
+ Liaise with suppliers and source elements.
+
+
+
+
+
+Why You'll Love Working Here
+
+
+ Working with agency for design drawing detail, quotation and local production.
+ Produce window displays, signs, interior displays, floor plans and special promotions displays.
+ Change displays to promote new product launches and reflect festive or seasonal themes.
+ Planning and executing the open/renovation/ closing store procedure.
+ Follow‐up store maintenance procedure and keep updating SKU In & Out.
+ Monitor costs and work within budget.
+ Liaise with suppliers and source elements.
+
+`;
+
+export const JOB_BENEFIT_OPTIONS = [
+ { value: 'Free parking', label: 'Free parking' },
+ { value: 'Bonus commission', label: 'Bonus commission' },
+ { value: 'Travel', label: 'Travel' },
+ { value: 'Device support', label: 'Device support' },
+ { value: 'Health care', label: 'Health care' },
+ { value: 'Training', label: 'Training' },
+ { value: 'Health Insurance', label: 'Health Insurance' },
+ { value: 'Retirement Plans', label: 'Retirement Plans' },
+ { value: 'Paid Time Off', label: 'Paid Time Off' },
+ { value: 'Flexible Work Schedule', label: 'Flexible Work Schedule' },
+];
+
+export const _jobs = [...Array(12)].map((_, index) => {
+ const benefits = JOB_BENEFIT_OPTIONS.slice(0, 3).map((option) => option.label);
+
+ const type = (index % 2 && 'part time') || (index % 4 && 'freelance') || 'full time';
+
+ const level = (index % 2 && 'manager') || (index % 4 && 'intern/student') || 'No experience';
+
+ const location = countries.map((option) => option.label)[index + 1];
+
+ const languages = ['Russian', 'Spanish', 'English'];
+
+ const skills = _tags.slice(0, 5);
+
+ const company = {
+ name: _mock.companyName(index),
+ logo: _mock.image.company(index),
+ };
+
+ const locationMap = [
+ {
+ address: _mock.fullAddress(index),
+ phoneNumber: _mock.phoneNumber(index),
+ email: _mock.email(index),
+ latlng: [33, 65],
+ },
+ ];
+
+ return {
+ id: _mock.id(index),
+ type,
+ level,
+ skills,
+ company,
+ benefits,
+ location,
+ languages,
+ locationMap,
+ content: CONTENT,
+ createdAt: new Date(),
+ experience: index + 1,
+ category: _tags[index],
+ slug: _mock.jobTitle(index),
+ urgent: [1, 3].includes(index),
+ favorited: [2, 4].includes(index),
+ totalViews: _mock.number.nativeL(index),
+ deadline: add(new Date(), { months: index }),
+ salary: (index % 3 && 12000) || 'competitive',
+ shareLinks: {
+ facebook: `facebook/user-name`,
+ instagram: `instagram/user-name`,
+ linkedin: `linkedin/user-name`,
+ twitter: `twitter/user-name`,
+ },
+ };
+});
+
+export const _jobsByCompanies = [...Array(12)].map((_, index) => ({
+ id: _mock.id(index),
+ name: _mock.companyName(index),
+ logo: _mock.image.company(index),
+ totalJobs: 101 + index,
+}));
+
+const ICONS = [
+ '/assets/icons/ic_money.svg',
+ '/assets/icons/ic_marketing_bullhorn.svg',
+ '/assets/icons/ic_creativity.svg',
+ '/assets/icons/ic_web_programming.svg',
+ '/assets/icons/ic_chip.svg',
+ '/assets/icons/ic_customer_service.svg',
+ '/assets/icons/ic_stethoscope.svg',
+ '/assets/icons/ic_banking.svg',
+];
+
+export const _jobsByCategories = [...Array(8)].map((_, index) => ({
+ id: _mock.id(index),
+ icon: ICONS[index],
+ name: _mock.jobTitle(index),
+ totalJobs: _mock.number.nativeM(index),
+}));
+
+export const _jobsByCountries = [...Array(12)].map((_, index) => ({
+ id: _mock.id(index),
+ coverUrl: _mock.image.travel(index),
+ totalJobs: _mock.number.nativeM(index),
+ location: countries.map((option) => option.label)[index + 1],
+}));
diff --git a/template/src/_mock/_members.js b/template/src/_mock/_members.js
new file mode 100644
index 0000000..e801906
--- /dev/null
+++ b/template/src/_mock/_members.js
@@ -0,0 +1,16 @@
+import { _mock } from './_mock';
+
+// ----------------------------------------------------------------------
+
+export const _members = [...Array(8)].map((_, index) => ({
+ id: _mock.id(index),
+ role: _mock.role(index),
+ name: _mock.fullName(index),
+ photo: `/assets/images/portrait/portrait_${index + 1}.jpg`,
+ socialLinks: {
+ facebook: `facebook/${_mock.fullName(index)}`,
+ instagram: `instagram/${_mock.fullName(index)}`,
+ linkedin: `linkedin/${_mock.fullName(index)}`,
+ twitter: `twitter/${_mock.fullName(index)}`,
+ },
+}));
diff --git a/template/src/_mock/_mock.js b/template/src/_mock/_mock.js
new file mode 100644
index 0000000..da29f23
--- /dev/null
+++ b/template/src/_mock/_mock.js
@@ -0,0 +1,83 @@
+import { sub } from 'date-fns';
+
+import {
+ _id,
+ _ages,
+ _roles,
+ _emails,
+ _prices,
+ _nativeL,
+ _nativeM,
+ _nativeS,
+ _ratings,
+ _booleans,
+ _percents,
+ _taskNames,
+ _jobTitles,
+ _tourNames,
+ _fullNames,
+ _lastNames,
+ _sentences,
+ _firstNames,
+ _postTitles,
+ _courseTitle,
+ _fullAddress,
+ _phoneNumbers,
+ _descriptions,
+ _productNames,
+ _companyNames,
+} from './assets';
+
+// ----------------------------------------------------------------------
+
+export const _mock = {
+ id: (index) => _id[index],
+ time: (index) => sub(new Date(), { days: index, hours: index }),
+ boolean: (index) => _booleans[index],
+ role: (index) => _roles[index],
+ // Text
+ courseTitle: (index) => _courseTitle[index],
+ taskNames: (index) => _taskNames[index],
+ postTitle: (index) => _postTitles[index],
+ jobTitle: (index) => _jobTitles[index],
+ tourName: (index) => _tourNames[index],
+ productName: (index) => _productNames[index],
+ sentence: (index) => _sentences[index],
+ description: (index) => _descriptions[index],
+ // Contact
+ email: (index) => _emails[index],
+ phoneNumber: (index) => _phoneNumbers[index],
+ fullAddress: (index) => _fullAddress[index],
+ // Name
+ firstName: (index) => _firstNames[index],
+ lastName: (index) => _lastNames[index],
+ fullName: (index) => _fullNames[index],
+ companyName: (index) => _companyNames[index],
+ // Number
+ number: {
+ percent: (index) => _percents[index],
+ rating: (index) => _ratings[index],
+ age: (index) => _ages[index],
+ price: (index) => _prices[index],
+ nativeS: (index) => _nativeS[index],
+ nativeM: (index) => _nativeM[index],
+ nativeL: (index) => _nativeL[index],
+ },
+ // Image
+ image: {
+ cover: (index) => `/assets/images/cover/cover_${index + 1}.jpg`,
+ avatar: (index) => `/assets/images/avatar/avatar_${index + 1}.jpg`,
+ travel: (index) => `/assets/images/travel/travel_${index + 1}.jpg`,
+ company: (index) => `/assets/images/company/company_${index + 1}.png`,
+ product: (index) => `/assets/images/z_product/product_${index + 1}.png`,
+ portrait: (index) => `/assets/images/portrait/portrait_${index + 1}.jpg`,
+ career: (index) => `/assets/images/career/career_${index + 1}.jpg`,
+ marketing: (index) => `/assets/images/marketing/marketing_${index + 1}.jpg`,
+ course: (index) => `/assets/images/course/course_${index + 1}.jpg`,
+ },
+ video: (index) =>
+ [
+ `https://www.dropbox.com/s/odzycivuo9cy5rg/video_01.mp4?dl=0`,
+ `https://www.dropbox.com/s/7cx04n8rr4w5rbg/video_02.mp4?dl=0`,
+ ][index],
+};
diff --git a/template/src/_mock/_others.js b/template/src/_mock/_others.js
new file mode 100644
index 0000000..b5b0853
--- /dev/null
+++ b/template/src/_mock/_others.js
@@ -0,0 +1,133 @@
+import { _mock } from './_mock';
+
+// ----------------------------------------------------------------------
+
+export const _categories = [
+ { label: 'Marketing', path: '' },
+ { label: 'Community', path: '' },
+ { label: 'Tutorials', path: '' },
+ { label: 'Business', path: '' },
+ { label: 'Management', path: '' },
+];
+
+// ----------------------------------------------------------------------
+
+export const _testimonials = [...Array(8)].map((_, index) => ({
+ id: _mock.id(index),
+ name: _mock.fullName(index),
+ role: _mock.role(index),
+ avatarUrl: _mock.image.avatar(index),
+ createdAt: _mock.time(index),
+ ratingNumber: 5,
+ review:
+ 'Amazing experience i love it a lot. Thanks to the team that dreams come true, great! I appreciate there attitude and approach.',
+}));
+
+// ----------------------------------------------------------------------
+
+export const _socials = [
+ {
+ value: 'facebook',
+ label: 'FaceBook',
+ icon: 'carbon:logo-facebook',
+ color: '#1877F2',
+ },
+ {
+ value: 'instagram',
+ label: 'Instagram',
+ icon: 'carbon:logo-instagram',
+ color: '#E02D69',
+ },
+ {
+ value: 'linkedin',
+ label: 'Linkedin',
+ icon: 'carbon:logo-linkedin',
+ color: '#007EBB',
+ },
+ {
+ value: 'twitter',
+ label: 'Twitter',
+ icon: 'carbon:logo-twitter',
+ color: '#00AAEC',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+const LAT_LONG = [
+ [33, 65],
+ [-12.5, 18.5],
+ [20.96, 26.27],
+];
+
+export const _offices = ['Jordan', 'Canada', 'Portugal'].map((office, index) => ({
+ id: _mock.id(index),
+ country: office,
+ address: _mock.fullAddress(index),
+ phoneNumber: _mock.phoneNumber(index),
+ email: _mock.email(index),
+ photo: _mock.image.travel(index + 4),
+ latlng: LAT_LONG[index],
+}));
+
+// ----------------------------------------------------------------------
+
+const BRANDS_NAME = [
+ 'airbnb',
+ 'dropbox',
+ 'facebook',
+ 'google',
+ 'heroku',
+ 'lenovo',
+ 'microsoft',
+ 'netflix',
+ 'slack',
+ 'spotify',
+ 'tripadvisor',
+ 'vimeo',
+];
+
+export const _brands = BRANDS_NAME.map((brand, index) => ({
+ id: _mock.id(index),
+ name: brand,
+ image: `/assets/logo/${brand}.svg`,
+}));
+
+export const _brandsColor = BRANDS_NAME.map((brand, index) => ({
+ id: _mock.id(index),
+ name: brand,
+ image: `/assets/logo/${brand}_original.svg`,
+}));
+
+// ----------------------------------------------------------------------
+
+export const _faqs = [
+ 'Sed augue ipsum, egestas nec, vestibulum et',
+ 'alesuada adipiscing, dui vestibulum suscipit nulla quis orci.',
+ 'Ut varius tincidunt libero',
+ 'In ut quam vitae odio lacinia tincidunt.',
+ 'Fusce vel dui Morbi nec metus.',
+].map((question, index) => ({
+ id: _mock.id(index),
+ question,
+ answer:
+ 'Amazing experience i love it a lot. Thanks to the team that dreams come true, great! I appreciate there attitude and approach.',
+}));
+
+export const _faqsSupport = [
+ `[Covid] Seasonal Shopping Guide`,
+ 'I Want To Check Where My Order Is Delivered',
+ '[Shipping Information] How To Contact The Shipping Unit/Look Up Shipping Information/Delivery Exchange?',
+ '[Seller] Start Selling With Shopee',
+ 'Why Is My Account Locked/Limited?',
+ 'Free Shipping Code User Guide (Freeship Code)',
+ 'How To Buy / Order On Shopee App',
+ `Why I Didn't Receive the Verification Code (OTP)?`,
+ `Frequently Asked Questions About Product Reviews / Comments`,
+ `How to Login Shopee Account When Forgot/Lost Password`,
+].map((question, index) => ({
+ id: _mock.id(index),
+ question,
+ answer:
+ 'Amazing experience i love it a lot. Thanks to the team that dreams come true, great! I appreciate there attitude and approach.',
+}));
diff --git a/template/src/_mock/_pricing.js b/template/src/_mock/_pricing.js
new file mode 100644
index 0000000..afe3c23
--- /dev/null
+++ b/template/src/_mock/_pricing.js
@@ -0,0 +1,207 @@
+// ----------------------------------------------------------------------
+
+export const _pricingHome = [
+ {
+ license: 'Standard',
+ price: '59',
+ icons: ['/assets/icons/platforms/ic_js.svg'],
+ commons: ['One end products', '12 months updates', '6 months of support'],
+ options: [
+ { title: 'JavaScript version', disabled: false },
+ { title: 'TypeScript version', disabled: true },
+ { title: 'Design resources', disabled: true },
+ { title: 'Commercial applications', disabled: true },
+ ],
+ },
+ {
+ license: 'Plus',
+ price: '99',
+ icons: [
+ '/assets/icons/platforms/ic_js.svg',
+ '/assets/icons/platforms/ic_ts.svg',
+ '/assets/icons/platforms/ic_figma.svg',
+ ],
+ commons: ['One end products', '12 months updates', '6 months of support'],
+ options: [
+ { title: 'JavaScript version', disabled: false },
+ { title: 'TypeScript version', disabled: false },
+ { title: 'Design resources', disabled: false },
+ { title: 'Commercial applications', disabled: true },
+ ],
+ },
+ {
+ license: 'Extended',
+ price: '249',
+ icons: [
+ '/assets/icons/platforms/ic_js.svg',
+ '/assets/icons/platforms/ic_ts.svg',
+ '/assets/icons/platforms/ic_figma.svg',
+ ],
+ commons: ['One end products', '12 months updates', '6 months of support'],
+ options: [
+ { title: 'JavaScript version', disabled: false },
+ { title: 'TypeScript version', disabled: false },
+ { title: 'Design resources', disabled: false },
+ { title: 'Commercial applications', disabled: false },
+ ],
+ },
+];
+
+export const _pricingMarketing = [
+ {
+ license: 'Basic',
+ price: '29',
+ icon: '/assets/icons/pricing/ic_plan_basic03.svg',
+ caption: 'Proin viverra, ligula sit amet ultrices semper, ligula arcu tristique sapien',
+ options: ['Auto update mode', 'Online operator 24/7', 'International posting'],
+ },
+ {
+ license: 'Starter',
+ price: '59',
+ icon: '/assets/icons/pricing/ic_plan_starter03.svg',
+ caption: 'Sed lectus. Sed consequat, leo eget bibendum sodales',
+ options: [
+ 'Auto update mode',
+ 'Online operator 24/7',
+ 'Unique newsletters',
+ 'International posting',
+ ],
+ },
+ {
+ license: 'Premium',
+ price: '99',
+ icon: '/assets/icons/pricing/ic_plan_premium03.svg',
+ caption: 'Maecenas nec odio et ante tincidunt tempus.',
+ options: [
+ 'Auto update mode',
+ 'Online operator 24/7',
+ 'Unique newsletters',
+ 'International posting',
+ '20 Design templates',
+ ],
+ },
+];
+
+export const _pricing01 = [
+ {
+ license: 'Basic',
+ price: 'Free',
+ icon: '/assets/icons/pricing/ic_plan_basic01.svg',
+ options: [
+ { title: '3 prototypes', disabled: false },
+ { title: '3 boards', disabled: false },
+ { title: 'Up to 5 team members', disabled: true },
+ { title: 'Advanced security', disabled: true },
+ { title: 'Permissions & workflows', disabled: true },
+ ],
+ },
+ {
+ license: 'Starter',
+ price: '4.99',
+ icon: '/assets/icons/pricing/ic_plan_starter01.svg',
+ options: [
+ { title: '3 prototypes', disabled: false },
+ { title: '3 boards', disabled: false },
+ { title: 'Up to 5 team members', disabled: false },
+ { title: 'Advanced security', disabled: true },
+ { title: 'Permissions & workflows', disabled: true },
+ ],
+ },
+ {
+ license: 'Premium',
+ price: '9.99',
+ icon: '/assets/icons/pricing/ic_plan_premium01.svg',
+ options: [
+ { title: '3 prototypes', disabled: false },
+ { title: '3 boards', disabled: false },
+ { title: 'Up to 5 team members', disabled: false },
+ { title: 'Advanced security', disabled: false },
+ { title: 'Permissions & workflows', disabled: false },
+ ],
+ },
+];
+
+export const _pricing02 = [
+ {
+ license: 'Start',
+ caption: 'Next 3 months',
+ price: 'Free',
+ icon: '/assets/icons/pricing/ic_plan_basic02.svg',
+ options: [
+ { title: '3 prototypes', tootip: '3 prototypes', disabled: false },
+ { title: '3 boards', tootip: '3 boards', disabled: false },
+ {
+ title: 'Up to 5 team members',
+ tootip: 'Up to 5 team members',
+ disabled: true,
+ },
+ {
+ title: 'Advanced security',
+ tootip: 'Advanced security',
+ disabled: true,
+ },
+ {
+ title: 'Permissions & workflows',
+ tootip: 'Permissions & workflows',
+ disabled: true,
+ },
+ { title: 'Long feature one', tootip: 'Long feature one', disabled: true },
+ ],
+ },
+ {
+ license: 'Pro',
+ caption: 'Charging $456 per/y',
+ price: '4.99',
+ icon: '/assets/icons/pricing/ic_plan_starter02.svg',
+ options: [
+ { title: '3 prototypes', tootip: '3 prototypes', disabled: false },
+ { title: '3 boards', tootip: '3 boards', disabled: false },
+ {
+ title: 'Up to 5 team members',
+ tootip: 'Up to 5 team members',
+ disabled: false,
+ },
+ {
+ title: 'Advanced security',
+ tootip: 'Advanced security',
+ disabled: true,
+ },
+ {
+ title: 'Permissions & workflows',
+ tootip: 'Permissions & workflows',
+ disabled: true,
+ },
+ { title: 'Long feature one', tootip: 'Long feature one', disabled: true },
+ ],
+ },
+ {
+ license: 'Business',
+ caption: 'Charging $696 per/y',
+ price: '9.99',
+ icon: '/assets/icons/pricing/ic_plan_premium02.svg',
+ options: [
+ { title: '3 prototypes', tootip: '3 prototypes', disabled: false },
+ { title: '3 boards', tootip: '3 boards', disabled: false },
+ {
+ title: 'Up to 5 team members',
+ tootip: 'Up to 5 team members',
+ disabled: false,
+ },
+ {
+ title: 'Advanced security',
+ tootip: 'Advanced security',
+ disabled: false,
+ },
+ {
+ title: 'Permissions & workflows',
+ tootip: 'Permissions & workflows',
+ disabled: false,
+ },
+ {
+ title: 'Long feature one',
+ tootip: 'Long feature one',
+ disabled: false,
+ },
+ ],
+ },
+];
diff --git a/template/src/_mock/_products.js b/template/src/_mock/_products.js
new file mode 100644
index 0000000..eb8d75b
--- /dev/null
+++ b/template/src/_mock/_products.js
@@ -0,0 +1,145 @@
+import { _mock } from './_mock';
+
+// ----------------------------------------------------------------------
+
+const NAME = [
+ 'Apple iPhone',
+ 'Samsung Galaxy',
+ 'Nike Air Max',
+ 'Adidas Ultraboost',
+ 'Sony PlayStation',
+ 'Microsoft Surface',
+ 'Tesla Model S',
+ 'Amazon Echo',
+ 'Google Pixel',
+ 'Bose QuietComfort',
+ 'Canon EOS',
+ 'HP Spectre',
+ 'LG OLED',
+ 'Rolex Submariner',
+ 'Chanel No.5',
+ 'Louis Vuitton Speedy',
+ 'Gucci Ace',
+ 'Ray-Ban Aviator',
+ 'Herschel Little America',
+ 'Le Creuset Dutch Oven',
+ 'Yeti Tumbler',
+ 'Patagonia Nano Puff',
+ 'Lululemon Align Leggings',
+ 'Allbirds Wool Runners',
+];
+
+const CATEGORIES = [
+ 'Electronics',
+ 'Fashion and Apparel',
+ 'Home and Garden',
+ 'Beauty and Personal Care',
+ 'Health and Wellness',
+ 'Toys and Games',
+ 'Sports and Outdoors',
+ 'Baby and Kids',
+ 'Automotive and Industrial',
+ 'Pet Supplies',
+ 'Food and Beverage',
+ 'Office and School Supplies',
+ 'Jewelry and Accessories',
+ 'Arts and Crafts',
+ 'Books and Media',
+ 'Travel and Luggage',
+ 'Gifts and Flowers',
+ 'Musical Instruments',
+ 'Party Supplies',
+ 'Business and Industrial Supplies',
+ 'Tools and Hardware',
+ 'Electronics Accessories',
+ 'Furniture and Decor',
+ 'Computer and Software',
+];
+
+const DESCRIPTION = `
+Aenean viverra rhoncus pede. Etiam feugiat lorem non metus. Quisque malesuada placerat nisl.
+
+
+
+ Updated with a more matte texture, perfect for casual styling.
+ Durable water-repellent coating.
+ dsdsds
+ dsdsds
+ Anti-static lining.
+
+
+
+Living in today’s metropolitan world of cellular phones, mobile computers and other high-tech gadgets is not just hectic but very impersonal. We make money and then invest our time and effort in making more money..
+`;
+
+// ----------------------------------------------------------------------
+
+export const _productsTable = [...Array(12)].map((_, index) => ({
+ id: _mock.id(index),
+ orderId: `#011120${index + 1}`,
+ item: NAME[index],
+ deliveryDate: _mock.time(index),
+ price: _mock.number.price(index),
+ status: ['Completed', 'To Process', 'Cancelled', 'Return'][index] || 'Completed',
+}));
+
+export const _productsCarousel = [...Array(4)].map((_, index) => ({
+ id: _mock.id(index),
+ title: _mock.productName(index),
+ caption: _mock.description(index),
+ coverUrl: _mock.image.product(index),
+ label: 'Opening Sale Discount 50%',
+}));
+
+export const _productsCompare = [
+ 'Apple iPhone 12 Pro',
+ 'Apple iPhone 13 Pro',
+ 'Apple iPhone 14 Pro',
+].map((name, index) => ({
+ id: _mock.id(index),
+ name,
+ price: _mock.number.price(index),
+ coverUrl: _mock.image.product(4),
+ ratingNumber: _mock.number.rating(index),
+ details: (index === 0 && [
+ 'Super Retina XDR (OLED)',
+ 'Up to 29 hours video playback',
+ 'A14 Bionic',
+ 'True Tone',
+ 'IP68',
+ '2017',
+ ]) || ['Super Retina XDR (OLED)', '', 'A14 Bionic', '', 'IP68', '2017'],
+}));
+
+export const _products = [...Array(24)].map((_, index) => ({
+ id: _mock.id(index),
+ stock: 100,
+ name: NAME[index],
+ description: DESCRIPTION,
+ category: CATEGORIES[index],
+ price: _mock.number.price(index),
+ sold: _mock.number.nativeM(index),
+ caption: _mock.description(index),
+ coverUrl: _mock.image.product(index),
+ ratingNumber: _mock.number.rating(index),
+ totalReviews: _mock.number.nativeL(index),
+ label: ['sale', 'new', 'sale', 'sale'][index] || '',
+ priceSale:
+ [
+ _mock.number.price(1),
+ _mock.number.price(2),
+ _mock.number.price(3),
+ _mock.number.price(4),
+ _mock.number.price(5),
+ ][index] || 0,
+ images: [
+ _mock.image.product(1),
+ _mock.image.product(2),
+ _mock.image.product(3),
+ _mock.image.product(4),
+ _mock.image.product(5),
+ _mock.image.product(6),
+ _mock.image.product(7),
+ _mock.image.product(8),
+ ],
+}));
diff --git a/template/src/_mock/_reviews.js b/template/src/_mock/_reviews.js
new file mode 100644
index 0000000..040c5ce
--- /dev/null
+++ b/template/src/_mock/_reviews.js
@@ -0,0 +1,89 @@
+import { _mock } from './_mock';
+
+// ----------------------------------------------------------------------
+
+const users = [...Array(12)].map((_, index) => ({
+ id: _mock.id(index),
+ name: _mock.fullName(index),
+ avatarUrl: _mock.image.avatar(index),
+}));
+
+export const _reviews = [
+ {
+ id: _mock.id(0),
+ name: users[0].name,
+ avatarUrl: users[0].avatarUrl,
+ message: _mock.sentence(1),
+ createdAt: _mock.time(1),
+ users: [users[0], users[1], users[2]],
+ rating: 3.5,
+ helpful: 32,
+ replyComment: [
+ {
+ id: _mock.id(1),
+ userId: users[1].id,
+ message: _mock.sentence(2),
+ createdAt: _mock.time(2),
+ },
+ {
+ id: _mock.id(2),
+ userId: users[0].id,
+ message: _mock.sentence(3),
+ tagUser: users[1].name,
+ createdAt: _mock.time(3),
+ },
+ {
+ id: _mock.id(3),
+ userId: users[2].id,
+ message: _mock.sentence(4),
+ createdAt: _mock.time(4),
+ },
+ ],
+ },
+ {
+ id: _mock.id(4),
+ name: users[4].name,
+ avatarUrl: users[4].avatarUrl,
+ message: _mock.sentence(5),
+ createdAt: _mock.time(5),
+ users: [users[5], users[6], users[7]],
+ rating: 4.5,
+ helpful: 0,
+ replyComment: [
+ {
+ id: _mock.id(5),
+ userId: users[6].id,
+ message: _mock.sentence(7),
+ createdAt: _mock.time(7),
+ },
+ {
+ id: _mock.id(6),
+ userId: users[7].id,
+ message: _mock.sentence(8),
+ createdAt: _mock.time(8),
+ },
+ ],
+ },
+ {
+ id: _mock.id(7),
+ name: users[8].name,
+ avatarUrl: users[8].avatarUrl,
+ message: _mock.sentence(9),
+ createdAt: _mock.time(9),
+ rating: 4.5,
+ helpful: 10,
+ users: [],
+ replyComment: [],
+ },
+ {
+ id: _mock.id(8),
+ name: users[9].name,
+ avatarUrl: users[9].avatarUrl,
+ message: _mock.sentence(10),
+ createdAt: _mock.time(10),
+ rating: 5,
+ helpful: 0,
+ users: [],
+ replyComment: [],
+ },
+];
diff --git a/template/src/_mock/_tours.js b/template/src/_mock/_tours.js
new file mode 100644
index 0000000..7250342
--- /dev/null
+++ b/template/src/_mock/_tours.js
@@ -0,0 +1,107 @@
+import { add } from 'date-fns';
+
+import { countries } from 'src/assets/data';
+
+import { _mock } from './_mock';
+import { _tags } from './assets';
+
+// ----------------------------------------------------------------------
+
+export const TOUR_SERVICE_OPTIONS = [
+ { value: 'Audio guide', label: 'Audio guide' },
+ { value: 'Food and drinks', label: 'Food and drinks' },
+ { value: 'Lunch', label: 'Lunch' },
+ { value: 'Private tour', label: 'Private tour' },
+ { value: 'Special activities', label: 'Special activities' },
+ { value: 'Entrance fees', label: 'Entrance fees' },
+ { value: 'Gratuities', label: 'Gratuities' },
+ { value: 'Pick-up and drop off', label: 'Pick-up and drop off' },
+ { value: 'Professional guide', label: 'Professional guide' },
+ {
+ value: 'Transport by air-conditioned',
+ label: 'Transport by air-conditioned',
+ },
+];
+
+export const _tours = [...Array(12)].map((_, index) => {
+ const location = countries.map((option) => option.label)[index + 1];
+
+ const gallery = [...Array(6)].map((__, itemIndex) => _mock.image.travel(itemIndex + 2));
+
+ const highlights = [...Array(6)].map((__, itemIndex) => _mock.sentence(itemIndex));
+
+ const heroUrl = [
+ '/assets/images/travel/travel_post_hero.jpg',
+ '/assets/images/travel/travel_post_01.jpg',
+ '/assets/images/travel/travel_post_02.jpg',
+ '/assets/images/travel/travel_post_03.jpg',
+ '/assets/images/travel/travel_post_04.jpg',
+ ][index];
+
+ const program = [...Array(3)].map((__, itemIndex) => ({
+ label: `Day ${itemIndex + 1}`,
+ text: _mock.description(itemIndex),
+ }));
+
+ const services = (index % 2 && ['Audio guide', 'Food and drinks']) ||
+ (index % 3 && ['Lunch', 'Private tour']) ||
+ (index % 4 && ['Special activities', 'Entrance fees']) || [
+ 'Gratuities',
+ 'Pick-up and drop off',
+ 'Professional guide',
+ 'Transport by air-conditioned',
+ ];
+
+ const tourGuide = {
+ verified: true,
+ role: _mock.role(index),
+ name: _mock.fullName(index),
+ avatarUrl: _mock.image.avatar(index),
+ quotes: 'Member since Mar 15, 2021',
+ phoneNumber: _mock.phoneNumber(index),
+ ratingNumber: _mock.number.rating(index),
+ totalReviews: _mock.number.nativeL(index),
+ about:
+ 'Integer tincidunt. Nullam dictum felis eu pede mollis pretium. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem.',
+ shareLinks: {
+ facebook: `facebook/user-name`,
+ instagram: `instagram/user-name`,
+ linkedin: `linkedin/user-name`,
+ twitter: `twitter/user-name`,
+ },
+ };
+
+ return {
+ id: _mock.id(index),
+ heroUrl,
+ gallery,
+ program,
+ location,
+ services,
+ tourGuide,
+ highlights,
+ continent: location,
+ tags: _tags.slice(0, 5),
+ slug: _mock.tourName(index),
+ duration: '3 days 2 nights',
+ createdAt: _mock.time(index),
+ favorited: _mock.boolean(index),
+ price: _mock.number.price(index),
+ languages: ['Russian', 'Spanish'],
+ coverUrl: _mock.image.travel(index),
+ description: _mock.description(index),
+ ratingNumber: _mock.number.rating(index),
+ totalReviews: _mock.number.nativeL(index),
+ priceSale: (index === 2 && 89.99) || (index === 5 && 69.99) || 0,
+ available: {
+ start: add(new Date(), { months: 2 }),
+ end: add(new Date(), { months: 4 }),
+ },
+ shareLinks: {
+ facebook: `facebook/user-name`,
+ instagram: `instagram/user-name`,
+ linkedin: `linkedin/user-name`,
+ twitter: `twitter/user-name`,
+ },
+ };
+});
diff --git a/template/src/_mock/assets.js b/template/src/_mock/assets.js
new file mode 100644
index 0000000..a826a26
--- /dev/null
+++ b/template/src/_mock/assets.js
@@ -0,0 +1,546 @@
+// ----------------------------------------------------------------------
+
+export const _id = [...Array(40)].map(
+ (_, index) => `e99f09a7-dd88-49d5-b1c8-1daf80c2d7b${index + 1}`
+);
+
+export const _courseTitle = [
+ 'Design Masterclass Course',
+ 'Fitness For Beginners (2020)',
+ 'The Secrets To Teaching Online',
+ 'Learn How To Create A Course Online And Level Up Your Career',
+ 'Create A Course Online Masterclass',
+ 'Learn How To Create A Course Online And Level Up Your Career',
+ '2021 Complete Python Bootcamp From Zero to Hero in Python',
+ 'Machine Learning A-Z™: Hands-On Python & R In Data Science',
+ 'The Complete Digital Marketing Course - 12 Courses in 1',
+ 'SEO beginners : how I get 1,000 visitors a day with SEO',
+ 'Mega Digital Marketing Course A-Z: 12 Courses in 1 + Updates',
+ 'Copywriting: Fundamentals For Beginners',
+ 'Modern Copywriting: Writing copy that sells in 2021',
+ 'Copywriting secrets - How to write copy that sells',
+ 'Instagram Marketing 2021: Complete Guide To Instagram Growth',
+ 'Python for Finance and Algorithmic Trading with QuantConnect',
+];
+
+export const _fullAddress = [
+ '19034 Verna Unions Apt. 164 - Honolulu, RI / 87535',
+ '1147 Rohan Drive Suite 819 - Burlington, VT / 82021',
+ '18605 Thompson Circle Apt. 086 - Idaho Falls, WV / 50337',
+ '110 Lamar Station Apt. 730 - Hagerstown, OK / 49808',
+ '36901 Elmer Spurs Apt. 762 - Miramar, DE / 92836',
+ '2089 Runolfsson Harbors Suite 886 - Chapel Hill, TX / 32827',
+ '279 Karolann Ports Apt. 774 - Prescott Valley, WV / 53905',
+ '96607 Claire Square Suite 591 - St. Louis Park, HI / 40802',
+ '9388 Auer Station Suite 573 - Honolulu, AK / 98024',
+ '47665 Adaline Squares Suite 510 - Blacksburg, NE / 53515',
+ '989 Vernice Flats Apt. 183 - Billings, NV / 04147',
+ '91020 Wehner Locks Apt. 673 - Albany, WY / 68763',
+ '585 Candelario Pass Suite 090 - Columbus, LA / 25376',
+ '80988 Renner Crest Apt. 000 - Fargo, VA / 24266',
+ '28307 Shayne Pike Suite 523 - North Las Vegas, AZ / 28550',
+ '205 Farrell Highway Suite 333 - Rock Hill, OK / 63421',
+ '253 Kara Motorway Suite 821 - Manchester, SD / 09331',
+ '13663 Kiara Oval Suite 606 - Missoula, AR / 44478',
+ '8110 Claire Port Apt. 703 - Anchorage, TN / 01753',
+ '4642 Demetris Lane Suite 407 - Edmond, AZ / 60888',
+ '74794 Asha Flat Suite 890 - Lancaster, OR / 13466',
+ '8135 Keeling Pines Apt. 326 - Alexandria, MA / 89442',
+ '441 Gibson Shores Suite 247 - Pasco, NM / 60678',
+ '4373 Emelia Valley Suite 596 - Columbia, NM / 42586',
+];
+
+// ----------------------------------------------------------------------
+
+export const _booleans = [
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ true,
+];
+
+// ----------------------------------------------------------------------
+
+export const _emails = [
+ 'nannie_abernathy70@yahoo.com',
+ 'ashlynn_ohara62@gmail.com',
+ 'milo.farrell@hotmail.com',
+ 'violet.ratke86@yahoo.com',
+ 'letha_lubowitz24@yahoo.com',
+ 'aditya_greenfelder31@gmail.com',
+ 'lenna_bergnaum27@hotmail.com',
+ 'luella.ryan33@gmail.com',
+ 'joana.simonis84@gmail.com',
+ 'marjolaine_white94@gmail.com',
+ 'vergie_block82@hotmail.com',
+ 'vito.hudson@hotmail.com',
+ 'tyrel_greenholt@gmail.com',
+ 'dwight.block85@yahoo.com',
+ 'mireya13@hotmail.com',
+ 'dasia_jenkins@hotmail.com',
+ 'benny89@yahoo.com',
+ 'dawn.goyette@gmail.com',
+ 'zella_hickle4@yahoo.com',
+ 'avery43@hotmail.com',
+ 'olen_legros@gmail.com',
+ 'jimmie.gerhold73@hotmail.com',
+ 'genevieve.powlowski@hotmail.com',
+ 'louie.kuphal39@gmail.com',
+];
+
+// ----------------------------------------------------------------------
+
+export const _fullNames = [
+ 'Jayvion Simon',
+ 'Lucian Obrien',
+ 'Deja Brady',
+ 'Harrison Stein',
+ 'Reece Chung',
+ 'Lainey Davidson',
+ 'Cristopher Cardenas',
+ 'Melanie Noble',
+ 'Chase Day',
+ 'Shawn Manning',
+ 'Soren Durham',
+ 'Cortez Herring',
+ 'Brycen Jimenez',
+ 'Giana Brandt',
+ 'Aspen Schmitt',
+ 'Colten Aguilar',
+ 'Angelique Morse',
+ 'Selina Boyer',
+ 'Lawson Bass',
+ 'Ariana Lang',
+ 'Amiah Pruitt',
+ 'Harold Mcgrath',
+ 'Esperanza Mcintyre',
+ 'Mireya Conner',
+];
+
+export const _firstNames = [
+ 'Mossie',
+ 'David',
+ 'Ebba',
+ 'Chester',
+ 'Eula',
+ 'Jaren',
+ 'Boyd',
+ 'Brady',
+ 'Aida',
+ 'Anastasia',
+ 'Gregoria',
+ 'Julianne',
+ 'Ila',
+ 'Elyssa',
+ 'Lucio',
+ 'Lewis',
+ 'Jacinthe',
+ 'Molly',
+ 'Brown',
+ 'Fritz',
+ 'Keon',
+ 'Ella',
+ 'Ken',
+ 'Whitney',
+];
+
+export const _lastNames = [
+ 'Carroll',
+ 'Simonis',
+ 'Yost',
+ 'Hand',
+ 'Emmerich',
+ 'Wilderman',
+ 'Howell',
+ 'Sporer',
+ 'Boehm',
+ 'Morar',
+ 'Koch',
+ 'Reynolds',
+ 'Padberg',
+ 'Watsica',
+ 'Upton',
+ 'Yundt',
+ 'Pfeffer',
+ 'Parker',
+ 'Zulauf',
+ 'Treutel',
+ 'McDermott',
+ 'McDermott',
+ 'Cruickshank',
+ 'Parisian',
+];
+
+// ----------------------------------------------------------------------
+
+export const _prices = [
+ 83.74, 97.14, 68.71, 85.21, 52.17, 25.18, 43.84, 60.98, 98.42, 53.37, 72.75, 56.61, 64.55, 77.32,
+ 60.62, 79.81, 93.68, 47.44, 76.24, 92.87, 72.91, 20.54, 94.25, 37.51,
+];
+
+export const _ratings = [
+ 4.2, 3.7, 4.5, 3.5, 0.5, 3.0, 2.5, 2.8, 4.9, 3.6, 2.5, 1.7, 3.9, 2.8, 4.1, 4.5, 2.2, 3.2, 0.6,
+ 1.3, 3.8, 3.8, 3.8, 2.0,
+];
+
+export const _ages = [
+ 30, 26, 59, 47, 29, 46, 18, 56, 39, 19, 45, 18, 46, 56, 38, 41, 44, 48, 32, 45, 42, 60, 33, 57,
+];
+
+export const _percents = [
+ 10.1, 13.6, 28.2, 42.1, 37.2, 18.5, 40.1, 94.8, 91.4, 53.0, 25.4, 62.9, 86.6, 62.4, 35.4, 17.6,
+ 52.0, 6.8, 95.3, 26.6, 69.9, 92.1, 46.2, 85.6,
+];
+
+export const _nativeS = [
+ 11, 10, 7, 10, 12, 5, 10, 1, 8, 8, 10, 11, 12, 8, 4, 11, 8, 9, 4, 9, 2, 6, 3, 7,
+];
+
+export const _nativeM = [
+ 497, 763, 684, 451, 433, 463, 951, 194, 425, 435, 807, 521, 538, 839, 394, 269, 453, 821, 364,
+ 849, 804, 776, 263, 239,
+];
+
+export const _nativeL = [
+ 9911, 1947, 9124, 6984, 8488, 2034, 3364, 8401, 8996, 5271, 8478, 1139, 8061, 3035, 6733, 3952,
+ 2405, 3127, 6843, 4672, 6995, 6053, 5192, 9686,
+];
+
+// ----------------------------------------------------------------------
+
+export const _phoneNumbers = [
+ '365-374-4961',
+ '904-966-2836',
+ '399-757-9909',
+ '692-767-2903',
+ '990-588-5716',
+ '955-439-2578',
+ '226-924-4058',
+ '552-917-1454',
+ '285-840-9338',
+ '306-269-2446',
+ '883-373-6253',
+ '476-509-8866',
+ '201-465-1954',
+ '538-295-9408',
+ '531-492-6028',
+ '981-699-7588',
+ '500-268-4826',
+ '205-952-3828',
+ '222-255-5190',
+ '408-439-8033',
+ '272-940-8266',
+ '812-685-8057',
+ '353-801-5212',
+ '606-285-8928',
+];
+
+// ----------------------------------------------------------------------
+
+export const _roles = [
+ 'HR Manager',
+ 'Data Analyst',
+ 'Legal Counsel',
+ 'UX/UI Designer',
+ 'Project Manager',
+ 'Account Manager',
+ 'Registered Nurse',
+ 'Business Analyst',
+ 'Creative Director',
+ 'Financial Planner',
+ 'Event Coordinator',
+ 'Marketing Director',
+ 'Software Developer',
+ 'Research Scientist',
+ 'Content Strategist',
+ 'Operations Manager',
+ 'Sales Representative',
+ 'Supply Chain Analyst',
+ 'Operations Coordinator',
+ 'Customer Service Associate',
+ 'Quality Assurance Specialist',
+ 'CEO',
+ 'CFO',
+ 'CTO',
+];
+
+// ----------------------------------------------------------------------
+
+export const _postTitles = [
+ '10 Essential Tips for Healthy Living',
+ 'The Ultimate Guide to Productivity Hacks',
+ 'Exploring the Hidden Gems of [Destination]',
+ 'How to Master the Art of Public Speaking',
+ 'The Future of Artificial Intelligence: Trends and Insights',
+ 'Delicious Recipes for a Vegan Diet',
+ "A Beginner's Guide to Investing in Stocks",
+ 'The Impact of Social Media on Society',
+ '10 Must-Visit Destinations for Adventure Travelers',
+ 'The Benefits of Mindfulness Meditation',
+ 'The Importance of Mental Health Awareness',
+ 'Building a Strong Personal Brand: Tips and Strategies',
+ '10 Effective Strategies for Digital Marketing Success',
+ 'Unveiling the Secrets of Successful Entrepreneurs',
+ 'The Rise of Remote Work and its Impact on the Workforce',
+ 'The Art of Landscape Photography: Techniques and Inspiration',
+ 'Understanding Blockchain Technology and its Potential Applications',
+ 'How to Create Engaging Content for Social Media',
+ 'The Role of Artificial Intelligence in Healthcare',
+ '10 Home Organization Hacks for a Clutter-Free Space',
+ 'Exploring the History and Culture of [City/Region]',
+ 'The Power of Positive Thinking: Transform Your Mindset',
+ 'The Influence of Music on Mood and Emotions',
+ 'Travel Photography Tips: Capturing Memories Around the World',
+];
+
+// ----------------------------------------------------------------------
+
+export const _productNames = [
+ 'Nike Air Force 1 NDESTRUKT',
+ 'Foundations Matte Flip Flop',
+ 'Nike Air Zoom Pegasus 37 A.I.R. Chaz Bear',
+ 'Arizona Soft Footbed Sandal',
+ 'Boston Soft Footbed Sandal',
+ 'Zoom Freak 2',
+ 'Gazelle Vintage low-top sneakers',
+ 'Jordan Delta',
+ 'Air Jordan XXXV PF',
+ 'Rod Laver low-top sneakers',
+ 'Kyrie 7 EP Sisterhood',
+ 'Pharrell Williams Human Race NMD sneakers',
+ 'Nike Blazer Low 77 Vintage',
+ 'ASMC Winter Boot Cold.Rdy',
+ 'ZX 8000 Lego sneakers',
+ 'Ultraboost 21 sneakers',
+ '2750 Cotu Classic Sneaker',
+ 'ZX 9000 A-ZX Series sneakers',
+ 'Madrid Big Buckle Sandal',
+ 'Chuck 70 Hi Sneaker',
+ 'Relaxed Adjustable Strap Slingback Sandal',
+ 'Superturf Adventure X Atmos',
+ 'Chuck Taylor All Star Lift Sneaker',
+ 'Run Star Hike Platform Sneaker',
+];
+
+// ----------------------------------------------------------------------
+
+export const _tourNames = [
+ 'Adventure Seekers Expedition',
+ 'Historic Heritage Tour',
+ 'Culinary Delights Exploration',
+ "Nature's Wonders Escapade",
+ 'Cultural Immersion Journey',
+ 'Wildlife Safari Expedition',
+ "Urban Explorer's City Tour",
+ 'Coastal Paradise Getaway',
+ 'Wine Tasting Experience',
+ 'Spiritual Retreat Tour',
+ 'Outdoor Adventure Trek',
+ 'Photography Expedition',
+ 'Music and Arts Discovery Tour',
+ 'Wellness and Yoga Retreat',
+ 'Hidden Gems Discovery Tour',
+ 'Volcano and Geothermal Exploration',
+ "Foodie's Gastronomic Tour",
+ 'Hiking and Camping Adventure',
+ 'Architecture and Design Tour',
+ 'Coastal Cruise and Island Hopping',
+ 'Scenic Train Ride Experience',
+ 'Historical Landmarks Expedition',
+ 'Surfing and Beach Adventure',
+ 'Nightlife and Entertainment Tour',
+];
+
+// ----------------------------------------------------------------------
+
+export const _jobTitles = [
+ 'Software Engineer',
+ 'Marketing Manager',
+ 'Financial Analyst',
+ 'Graphic Designer',
+ 'Sales Representative',
+ 'Project Manager',
+ 'Data Scientist',
+ 'Human Resources Coordinator',
+ 'Accountant',
+ 'Customer Service Representative',
+ 'Nurse',
+ 'Product Manager',
+ 'Operations Manager',
+ 'Social Media Specialist',
+ 'Business Development Executive',
+ 'Content Writer',
+ 'Web Developer',
+ 'Electrical Engineer',
+ 'Research Scientist',
+ 'Legal Assistant',
+ 'Chef',
+ 'Financial Planner',
+ 'Architect',
+ 'Event Planner',
+];
+
+// ----------------------------------------------------------------------
+
+export const _companyNames = [
+ 'Lueilwitz and Sons',
+ 'Gleichner, Mueller and Tromp',
+ 'Nikolaus - Leuschke',
+ 'Hegmann, Kreiger and Bayer',
+ 'Grimes Inc',
+ 'Durgan - Murazik',
+ 'Altenwerth, Medhurst and Roberts',
+ 'Raynor Group',
+ 'Mraz, Donnelly and Collins',
+ 'Padberg - Bailey',
+ 'Heidenreich, Stokes and Parker',
+ 'Pagac and Sons',
+ 'Rempel, Hand and Herzog',
+ 'Dare - Treutel',
+ 'Kihn, Marquardt and Crist',
+ 'Nolan - Kunde',
+ 'Wuckert Inc',
+ 'Dibbert Inc',
+ 'Goyette and Sons',
+ 'Feest Group',
+ 'Bosco and Sons',
+ 'Bartell - Kovacek',
+ 'Schimmel - Raynor',
+ 'Tremblay LLC',
+];
+
+// ----------------------------------------------------------------------
+
+export const _tags = [
+ 'Technology',
+ 'Marketing',
+ 'Design',
+ 'Photography',
+ 'Art',
+ 'Fashion',
+ 'Food',
+ 'Travel',
+ 'Fitness',
+ 'Nature',
+ 'Business',
+ 'Music',
+ 'Health',
+ 'Books',
+ 'Sports',
+ 'Film',
+ 'Education',
+ 'Motivation',
+ 'Gaming',
+ 'Pets',
+ 'Cooking',
+ 'Finance',
+ 'Selfcare',
+ 'Writing',
+];
+
+// ----------------------------------------------------------------------
+
+export const _taskNames = [
+ 'Complete Project Proposal',
+ 'Conduct Market Research',
+ 'Design User Interface Mockups',
+ 'Develop Backend API',
+ 'Implement Authentication System',
+ 'Write Test Cases',
+ 'Perform Database Optimization',
+ 'Create Content Marketing Plan',
+ 'Update Website Copy',
+ 'Conduct A/B Testing',
+ 'Create Social Media Graphics',
+ 'Optimize Website Performance',
+ 'Review Competitor Websites',
+ 'Implement Payment Gateway Integration',
+ 'Conduct User Acceptance Testing',
+ 'Prepare Monthly Sales Report',
+ 'Enhance SEO Strategy',
+ 'Conduct Customer Satisfaction Survey',
+ 'Design Email Newsletter Template',
+ 'Monitor Server Logs for Errors',
+ 'Create Training Materials',
+ 'Plan and Execute Marketing Campaign',
+ 'Develop Mobile Application',
+ 'Coordinate Project Meetings',
+];
+
+// ----------------------------------------------------------------------
+
+export const _sentences = [
+ 'The sun slowly set over the horizon, painting the sky in vibrant hues of orange and pink.',
+ 'She eagerly opened the gift, her eyes sparkling with excitement.',
+ 'The old oak tree stood tall and majestic, its branches swaying gently in the breeze.',
+ 'The aroma of freshly brewed coffee filled the air, awakening my senses.',
+ 'The children giggled with joy as they ran through the sprinklers on a hot summer day.',
+ 'He carefully crafted a beautiful sculpture out of clay, his hands skillfully shaping the intricate details.',
+ 'The concert was a mesmerizing experience, with the music filling the venue and the crowd cheering in delight.',
+ 'The waves crashed against the shore, creating a soothing symphony of sound.',
+ 'The scent of blooming flowers wafted through the garden, creating a fragrant paradise.',
+ 'She gazed up at the night sky, marveling at the twinkling stars that dotted the darkness.',
+ 'The professor delivered a captivating lecture, engaging the students with thought-provoking ideas.',
+ 'The hiker trekked through the dense forest, guided by the soft glow of sunlight filtering through the trees.',
+ 'The delicate butterfly gracefully fluttered from flower to flower, sipping nectar with its slender proboscis.',
+ 'The aroma of freshly baked cookies filled the kitchen, tempting everyone with its irresistible scent.',
+ "The majestic waterfall cascaded down the rocks, creating a breathtaking display of nature's power.",
+ 'The actor delivered a powerful performance, moving the audience to tears with his emotional portrayal.',
+ 'The book transported me to a magical world, where imagination knew no bounds.',
+ 'The scent of rain filled the air as dark clouds gathered overhead, promising a refreshing downpour.',
+ 'The chef skillfully plated the dish, turning simple ingredients into a work of culinary art.',
+ 'The newborn baby let out a tiny cry, announcing its arrival to the world.',
+ 'The athlete sprinted across the finish line, arms raised in victory as the crowd erupted in applause.',
+ 'The ancient ruins stood as a testament to a civilization long gone, their grandeur still awe-inspiring.',
+ 'The artist dipped the brush into vibrant paint, bringing the canvas to life with bold strokes and vivid colors.',
+ 'The laughter of children echoed through the playground, filling the atmosphere with pure joy.',
+];
+
+// ----------------------------------------------------------------------
+
+export const _descriptions = [
+ `Occaecati est et illo quibusdam accusamus qui. Incidunt aut et molestiae ut facere aut. Est quidem iusto praesentium excepturi harum nihil tenetur facilis. Ut omnis voluptates nihil accusantium doloribus eaque debitis.`,
+ `Atque eaque ducimus minima distinctio velit. Laborum et veniam officiis. Delectus ex saepe hic id laboriosam officia. Odit nostrum qui illum saepe debitis ullam. Laudantium beatae modi fugit ut. Dolores consequatur beatae nihil voluptates rem maiores.`,
+ `Rerum eius velit dolores. Explicabo ad nemo quibusdam. Voluptatem eum suscipit et ipsum et consequatur aperiam quia. Rerum nulla sequi recusandae illum velit quia quas. Et error laborum maiores cupiditate occaecati.`,
+ `Et non omnis qui. Qui sunt deserunt dolorem aut velit cumque adipisci aut enim. Nihil quis quisquam nesciunt dicta nobis ab aperiam dolorem repellat. Voluptates non blanditiis. Error et tenetur iste soluta cupiditate ratione perspiciatis et. Quibusdam aliquid nam sunt et quisquam non esse.`,
+ `Nihil ea sunt facilis praesentium atque. Ab animi alias sequi molestias aut velit ea. Sed possimus eos. Et est aliquid est voluptatem.`,
+ `Non rerum modi. Accusamus voluptatem odit nihil in. Quidem et iusto numquam veniam culpa aperiam odio aut enim. Quae vel dolores. Pariatur est culpa veritatis aut dolorem.`,
+ `Est enim et sit non impedit aperiam cumque animi. Aut eius impedit saepe blanditiis. Totam molestias magnam minima fugiat.`,
+ `Unde a inventore et. Sed esse ut. Atque ducimus quibusdam fuga quas id qui fuga.`,
+ `Eaque natus adipisci soluta nostrum dolorem. Nesciunt ipsum molestias ut aliquid natus ut omnis qui fugiat. Dolor et rem. Ut neque voluptatem blanditiis quasi ullam deleniti.`,
+ `Nam et error exercitationem qui voluptate optio. Officia omnis qui accusantium ipsam qui. Quia sequi nulla perspiciatis optio vero omnis maxime omnis ipsum. Perspiciatis consequuntur asperiores veniam dolores.`,
+ `Perspiciatis nulla ut ut ut voluptates totam consectetur eligendi qui. Optio ut cum. Dolorum sapiente qui laborum. Impedit temporibus totam delectus nihil. Voluptatem corrupti rem.`,
+ `Distinctio omnis similique omnis eos. Repellat cumque rerum nisi. Reiciendis soluta non ut veniam temporibus. Accusantium et dolorem voluptas harum. Nemo eius voluptate dicta et hic nemo. Dolorem assumenda et beatae molestias sit quo mollitia quis consequatur.`,
+ `Sed ut mollitia tempore ipsam et illum doloribus ut. Occaecati ratione veritatis explicabo. Omnis nam omnis sunt placeat tempore accusantium placeat distinctio velit.`,
+ `Eum illo dicta et perspiciatis ut blanditiis eos sequi. Ea veritatis aut et voluptas aut. Laborum eos quia tempore a culpa.`,
+ `Aut quos quae dolores repudiandae similique perferendis perferendis earum laudantium. Facere placeat natus nobis. Eius vitae ullam dolorem.`,
+ `Vero dolorem et voluptatem fugit tempore a quam iure. Fuga consequatur corrupti sunt asperiores vitae. Libero totam repellendus animi debitis illum et sunt officia.`,
+ `Cupiditate illum officiis id molestiae. Numquam non molestiae aliquid et natus sed hic. Alias quia explicabo sed corrupti sint. Natus in et odio qui unde facilis quia. Est sit eius laboriosam aliquid non aperiam quia quo corporis.`,
+ `Et a ab. Optio aspernatur minus tempora amet vitae consectetur inventore cumque. Sed et omnis. Aspernatur a magnam.`,
+ `Ipsum omnis et. Quia ea et autem tempore consequuntur veniam dolorem officiis. Ipsa dicta et ut quidem quia doloremque. Sequi vitae doloremque temporibus. Deserunt incidunt id aperiam itaque natus. Earum sit eaque quas incidunt nihil.`,
+ `Quae consequatur reiciendis. Consequatur non optio. Eaque id placeat. Commodi quo officia aut repudiandae reiciendis tempore voluptatem et. Ut accusamus qui itaque maxime aliquam. Fugit ut animi molestiae porro maiores.`,
+ `Modi hic asperiores ab cumque quam est aut. Voluptas atque quos molestias. Ut excepturi distinctio ipsam aspernatur sit.`,
+ `Sunt totam facilis. Quam commodi voluptatem veniam. Tempora deleniti itaque fugit nihil voluptas.`,
+ `Ipsam aliquam velit nobis repellendus officiis aut deserunt id et. Nihil sunt aut dolores aut. Dolores est ipsa quia et laborum quidem laborum accusamus id. Facilis odit quod hic laudantium saepe omnis nisi in sint. Sed cupiditate possimus id.`,
+ `Magnam non eveniet optio optio ut aliquid atque. Velit libero aspernatur quis laborum consequatur laudantium. Tempora facere optio fugit accusantium ut. Omnis aspernatur reprehenderit autem esse ut ut enim voluptatibus.`,
+];
diff --git a/template/src/_mock/index.js b/template/src/_mock/index.js
new file mode 100644
index 0000000..e97fa82
--- /dev/null
+++ b/template/src/_mock/index.js
@@ -0,0 +1,15 @@
+export * from './assets';
+export * from './_mock';
+
+// ----------------------------------------------------------------------
+
+export * from './_jobs';
+export * from './_tours';
+export * from './_others';
+export * from './_reviews';
+export * from './_members';
+export * from './_pricing';
+export * from './_courses';
+export * from './_products';
+export * from './_blog';
+export * from './_caseStudies';
diff --git a/template/src/app.jsx b/template/src/app.jsx
new file mode 100644
index 0000000..480c11e
--- /dev/null
+++ b/template/src/app.jsx
@@ -0,0 +1,40 @@
+/* eslint-disable perfectionist/sort-imports */
+import 'src/global.css';
+
+// ----------------------------------------------------------------------
+
+import Router from 'src/routes/sections';
+import { useScrollToTop } from 'src/hooks/use-scroll-to-top';
+
+import ThemeProvider from 'src/theme';
+import { LocalizationProvider } from 'src/locales';
+
+import ProgressBar from 'src/components/progress-bar';
+import { MotionLazy } from 'src/components/animate/motion-lazy';
+import { SettingsDrawer, SettingsProvider } from 'src/components/settings';
+
+// ----------------------------------------------------------------------
+
+export default function App() {
+ useScrollToTop();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/assets/data/countries.js b/template/src/assets/data/countries.js
new file mode 100644
index 0000000..7ae08cc
--- /dev/null
+++ b/template/src/assets/data/countries.js
@@ -0,0 +1,425 @@
+export const countries = [
+ { code: '', label: '', phone: '' },
+ { code: 'AD', label: 'Andorra', phone: '376' },
+ {
+ code: 'AE',
+ label: 'United Arab Emirates',
+ phone: '971',
+ },
+ { code: 'AF', label: 'Afghanistan', phone: '93' },
+ {
+ code: 'AG',
+ label: 'Antigua and Barbuda',
+ phone: '1-268',
+ },
+ { code: 'AI', label: 'Anguilla', phone: '1-264' },
+ { code: 'AL', label: 'Albania', phone: '355' },
+ { code: 'AM', label: 'Armenia', phone: '374' },
+ { code: 'AO', label: 'Angola', phone: '244' },
+ { code: 'AQ', label: 'Antarctica', phone: '672' },
+ { code: 'AR', label: 'Argentina', phone: '54' },
+ { code: 'AS', label: 'American Samoa', phone: '1-684' },
+ { code: 'AT', label: 'Austria', phone: '43' },
+ {
+ code: 'AU',
+ label: 'Australia',
+ phone: '61',
+ suggested: true,
+ },
+ { code: 'AW', label: 'Aruba', phone: '297' },
+ { code: 'AX', label: 'Alland Islands', phone: '358' },
+ { code: 'AZ', label: 'Azerbaijan', phone: '994' },
+ {
+ code: 'BA',
+ label: 'Bosnia and Herzegovina',
+ phone: '387',
+ },
+ { code: 'BB', label: 'Barbados', phone: '1-246' },
+ { code: 'BD', label: 'Bangladesh', phone: '880' },
+ { code: 'BE', label: 'Belgium', phone: '32' },
+ { code: 'BF', label: 'Burkina Faso', phone: '226' },
+ { code: 'BG', label: 'Bulgaria', phone: '359' },
+ { code: 'BH', label: 'Bahrain', phone: '973' },
+ { code: 'BI', label: 'Burundi', phone: '257' },
+ { code: 'BJ', label: 'Benin', phone: '229' },
+ { code: 'BL', label: 'Saint Barthelemy', phone: '590' },
+ { code: 'BM', label: 'Bermuda', phone: '1-441' },
+ { code: 'BN', label: 'Brunei Darussalam', phone: '673' },
+ { code: 'BO', label: 'Bolivia', phone: '591' },
+ { code: 'BR', label: 'Brazil', phone: '55' },
+ { code: 'BS', label: 'Bahamas', phone: '1-242' },
+ { code: 'BT', label: 'Bhutan', phone: '975' },
+ { code: 'BV', label: 'Bouvet Island', phone: '47' },
+ { code: 'BW', label: 'Botswana', phone: '267' },
+ { code: 'BY', label: 'Belarus', phone: '375' },
+ { code: 'BZ', label: 'Belize', phone: '501' },
+ {
+ code: 'CA',
+ label: 'Canada',
+ phone: '1',
+ suggested: true,
+ },
+ {
+ code: 'CC',
+ label: 'Cocos (Keeling) Islands',
+ phone: '61',
+ },
+ {
+ code: 'CD',
+ label: 'Congo, Democratic Republic of the',
+ phone: '243',
+ },
+ {
+ code: 'CF',
+ label: 'Central African Republic',
+ phone: '236',
+ },
+ {
+ code: 'CG',
+ label: 'Congo, Republic of the',
+ phone: '242',
+ },
+ { code: 'CH', label: 'Switzerland', phone: '41' },
+ { code: 'CI', label: "Cote d'Ivoire", phone: '225' },
+ { code: 'CK', label: 'Cook Islands', phone: '682' },
+ { code: 'CL', label: 'Chile', phone: '56' },
+ { code: 'CM', label: 'Cameroon', phone: '237' },
+ { code: 'CN', label: 'China', phone: '86' },
+ { code: 'CO', label: 'Colombia', phone: '57' },
+ { code: 'CR', label: 'Costa Rica', phone: '506' },
+ { code: 'CU', label: 'Cuba', phone: '53' },
+ { code: 'CV', label: 'Cape Verde', phone: '238' },
+ { code: 'CW', label: 'Curacao', phone: '599' },
+ { code: 'CX', label: 'Christmas Island', phone: '61' },
+ { code: 'CY', label: 'Cyprus', phone: '357' },
+ { code: 'CZ', label: 'Czech Republic', phone: '420' },
+ {
+ code: 'DE',
+ label: 'Germany',
+ phone: '49',
+ suggested: true,
+ },
+ { code: 'DJ', label: 'Djibouti', phone: '253' },
+ { code: 'DK', label: 'Denmark', phone: '45' },
+ { code: 'DM', label: 'Dominica', phone: '1-767' },
+ {
+ code: 'DO',
+ label: 'Dominican Republic',
+ phone: '1-809',
+ },
+ { code: 'DZ', label: 'Algeria', phone: '213' },
+ { code: 'EC', label: 'Ecuador', phone: '593' },
+ { code: 'EE', label: 'Estonia', phone: '372' },
+ { code: 'EG', label: 'Egypt', phone: '20' },
+ { code: 'EH', label: 'Western Sahara', phone: '212' },
+ { code: 'ER', label: 'Eritrea', phone: '291' },
+ { code: 'ES', label: 'Spain', phone: '34' },
+ { code: 'ET', label: 'Ethiopia', phone: '251' },
+ { code: 'FI', label: 'Finland', phone: '358' },
+ { code: 'FJ', label: 'Fiji', phone: '679' },
+ {
+ code: 'FK',
+ label: 'Falkland Islands (Malvinas)',
+ phone: '500',
+ },
+ {
+ code: 'FM',
+ label: 'Micronesia, Federated States of',
+ phone: '691',
+ },
+ { code: 'FO', label: 'Faroe Islands', phone: '298' },
+ {
+ code: 'FR',
+ label: 'France',
+ phone: '33',
+ suggested: true,
+ },
+ { code: 'GA', label: 'Gabon', phone: '241' },
+ { code: 'GB', label: 'United Kingdom', phone: '44' },
+ { code: 'GD', label: 'Grenada', phone: '1-473' },
+ { code: 'GE', label: 'Georgia', phone: '995' },
+ { code: 'GF', label: 'French Guiana', phone: '594' },
+ { code: 'GG', label: 'Guernsey', phone: '44' },
+ { code: 'GH', label: 'Ghana', phone: '233' },
+ { code: 'GI', label: 'Gibraltar', phone: '350' },
+ { code: 'GL', label: 'Greenland', phone: '299' },
+ { code: 'GM', label: 'Gambia', phone: '220' },
+ { code: 'GN', label: 'Guinea', phone: '224' },
+ { code: 'GP', label: 'Guadeloupe', phone: '590' },
+ { code: 'GQ', label: 'Equatorial Guinea', phone: '240' },
+ { code: 'GR', label: 'Greece', phone: '30' },
+ {
+ code: 'GS',
+ label: 'South Georgia and the South Sandwich Islands',
+ phone: '500',
+ },
+ { code: 'GT', label: 'Guatemala', phone: '502' },
+ { code: 'GU', label: 'Guam', phone: '1-671' },
+ { code: 'GW', label: 'Guinea-Bissau', phone: '245' },
+ { code: 'GY', label: 'Guyana', phone: '592' },
+ { code: 'HK', label: 'Hong Kong', phone: '852' },
+ {
+ code: 'HM',
+ label: 'Heard Island and McDonald Islands',
+ phone: '672',
+ },
+ { code: 'HN', label: 'Honduras', phone: '504' },
+ { code: 'HR', label: 'Croatia', phone: '385' },
+ { code: 'HT', label: 'Haiti', phone: '509' },
+ { code: 'HU', label: 'Hungary', phone: '36' },
+ { code: 'ID', label: 'Indonesia', phone: '62' },
+ { code: 'IE', label: 'Ireland', phone: '353' },
+ { code: 'IL', label: 'Israel', phone: '972' },
+ { code: 'IM', label: 'Isle of Man', phone: '44' },
+ { code: 'IN', label: 'India', phone: '91' },
+ {
+ code: 'IO',
+ label: 'British Indian Ocean Territory',
+ phone: '246',
+ },
+ { code: 'IQ', label: 'Iraq', phone: '964' },
+ {
+ code: 'IR',
+ label: 'Iran, Islamic Republic of',
+ phone: '98',
+ },
+ { code: 'IS', label: 'Iceland', phone: '354' },
+ { code: 'IT', label: 'Italy', phone: '39' },
+ { code: 'JE', label: 'Jersey', phone: '44' },
+ { code: 'JM', label: 'Jamaica', phone: '1-876' },
+ { code: 'JO', label: 'Jordan', phone: '962' },
+ {
+ code: 'JP',
+ label: 'Japan',
+ phone: '81',
+ suggested: true,
+ },
+ { code: 'KE', label: 'Kenya', phone: '254' },
+ { code: 'KG', label: 'Kyrgyzstan', phone: '996' },
+ { code: 'KH', label: 'Cambodia', phone: '855' },
+ { code: 'KI', label: 'Kiribati', phone: '686' },
+ { code: 'KM', label: 'Comoros', phone: '269' },
+ {
+ code: 'KN',
+ label: 'Saint Kitts and Nevis',
+ phone: '1-869',
+ },
+ {
+ code: 'KP',
+ label: "Korea, Democratic People's Republic of",
+ phone: '850',
+ },
+ { code: 'KR', label: 'Korea, Republic of', phone: '82' },
+ { code: 'KW', label: 'Kuwait', phone: '965' },
+ { code: 'KY', label: 'Cayman Islands', phone: '1-345' },
+ { code: 'KZ', label: 'Kazakhstan', phone: '7' },
+ {
+ code: 'LA',
+ label: "Lao People's Democratic Republic",
+ phone: '856',
+ },
+ { code: 'LB', label: 'Lebanon', phone: '961' },
+ { code: 'LC', label: 'Saint Lucia', phone: '1-758' },
+ { code: 'LI', label: 'Liechtenstein', phone: '423' },
+ { code: 'LK', label: 'Sri Lanka', phone: '94' },
+ { code: 'LR', label: 'Liberia', phone: '231' },
+ { code: 'LS', label: 'Lesotho', phone: '266' },
+ { code: 'LT', label: 'Lithuania', phone: '370' },
+ { code: 'LU', label: 'Luxembourg', phone: '352' },
+ { code: 'LV', label: 'Latvia', phone: '371' },
+ { code: 'LY', label: 'Libya', phone: '218' },
+ { code: 'MA', label: 'Morocco', phone: '212' },
+ { code: 'MC', label: 'Monaco', phone: '377' },
+ {
+ code: 'MD',
+ label: 'Moldova, Republic of',
+ phone: '373',
+ },
+ { code: 'ME', label: 'Montenegro', phone: '382' },
+ {
+ code: 'MF',
+ label: 'Saint Martin (French part)',
+ phone: '590',
+ },
+ { code: 'MG', label: 'Madagascar', phone: '261' },
+ { code: 'MH', label: 'Marshall Islands', phone: '692' },
+ {
+ code: 'MK',
+ label: 'Macedonia, the Former Yugoslav Republic of',
+ phone: '389',
+ },
+ { code: 'ML', label: 'Mali', phone: '223' },
+ { code: 'MM', label: 'Myanmar', phone: '95' },
+ { code: 'MN', label: 'Mongolia', phone: '976' },
+ { code: 'MO', label: 'Macao', phone: '853' },
+ {
+ code: 'MP',
+ label: 'Northern Mariana Islands',
+ phone: '1-670',
+ },
+ { code: 'MQ', label: 'Martinique', phone: '596' },
+ { code: 'MR', label: 'Mauritania', phone: '222' },
+ { code: 'MS', label: 'Montserrat', phone: '1-664' },
+ { code: 'MT', label: 'Malta', phone: '356' },
+ { code: 'MU', label: 'Mauritius', phone: '230' },
+ { code: 'MV', label: 'Maldives', phone: '960' },
+ { code: 'MW', label: 'Malawi', phone: '265' },
+ { code: 'MX', label: 'Mexico', phone: '52' },
+ { code: 'MY', label: 'Malaysia', phone: '60' },
+ { code: 'MZ', label: 'Mozambique', phone: '258' },
+ { code: 'NA', label: 'Namibia', phone: '264' },
+ { code: 'NC', label: 'New Caledonia', phone: '687' },
+ { code: 'NE', label: 'Niger', phone: '227' },
+ { code: 'NF', label: 'Norfolk Island', phone: '672' },
+ { code: 'NG', label: 'Nigeria', phone: '234' },
+ { code: 'NI', label: 'Nicaragua', phone: '505' },
+ { code: 'NL', label: 'Netherlands', phone: '31' },
+ { code: 'NO', label: 'Norway', phone: '47' },
+ { code: 'NP', label: 'Nepal', phone: '977' },
+ { code: 'NR', label: 'Nauru', phone: '674' },
+ { code: 'NU', label: 'Niue', phone: '683' },
+ { code: 'NZ', label: 'New Zealand', phone: '64' },
+ { code: 'OM', label: 'Oman', phone: '968' },
+ { code: 'PA', label: 'Panama', phone: '507' },
+ { code: 'PE', label: 'Peru', phone: '51' },
+ { code: 'PF', label: 'French Polynesia', phone: '689' },
+ { code: 'PG', label: 'Papua New Guinea', phone: '675' },
+ { code: 'PH', label: 'Philippines', phone: '63' },
+ { code: 'PK', label: 'Pakistan', phone: '92' },
+ { code: 'PL', label: 'Poland', phone: '48' },
+ {
+ code: 'PM',
+ label: 'Saint Pierre and Miquelon',
+ phone: '508',
+ },
+ { code: 'PN', label: 'Pitcairn', phone: '870' },
+ { code: 'PR', label: 'Puerto Rico', phone: '1' },
+ {
+ code: 'PS',
+ label: 'Palestine, State of',
+ phone: '970',
+ },
+ { code: 'PT', label: 'Portugal', phone: '351' },
+ { code: 'PW', label: 'Palau', phone: '680' },
+ { code: 'PY', label: 'Paraguay', phone: '595' },
+ { code: 'QA', label: 'Qatar', phone: '974' },
+ { code: 'RE', label: 'Reunion', phone: '262' },
+ { code: 'RO', label: 'Romania', phone: '40' },
+ { code: 'RS', label: 'Serbia', phone: '381' },
+ { code: 'RU', label: 'Russian Federation', phone: '7' },
+ { code: 'RW', label: 'Rwanda', phone: '250' },
+ { code: 'SA', label: 'Saudi Arabia', phone: '966' },
+ { code: 'SB', label: 'Solomon Islands', phone: '677' },
+ { code: 'SC', label: 'Seychelles', phone: '248' },
+ { code: 'SD', label: 'Sudan', phone: '249' },
+ { code: 'SE', label: 'Sweden', phone: '46' },
+ { code: 'SG', label: 'Singapore', phone: '65' },
+ { code: 'SH', label: 'Saint Helena', phone: '290' },
+ { code: 'SI', label: 'Slovenia', phone: '386' },
+ {
+ code: 'SJ',
+ label: 'Svalbard and Jan Mayen',
+ phone: '47',
+ },
+ { code: 'SK', label: 'Slovakia', phone: '421' },
+ { code: 'SL', label: 'Sierra Leone', phone: '232' },
+ { code: 'SM', label: 'San Marino', phone: '378' },
+ { code: 'SN', label: 'Senegal', phone: '221' },
+ { code: 'SO', label: 'Somalia', phone: '252' },
+ { code: 'SR', label: 'Suriname', phone: '597' },
+ { code: 'SS', label: 'South Sudan', phone: '211' },
+ {
+ code: 'ST',
+ label: 'Sao Tome and Principe',
+ phone: '239',
+ },
+ { code: 'SV', label: 'El Salvador', phone: '503' },
+ {
+ code: 'SX',
+ label: 'Sint Maarten (Dutch part)',
+ phone: '1-721',
+ },
+ {
+ code: 'SY',
+ label: 'Syrian Arab Republic',
+ phone: '963',
+ },
+ { code: 'SZ', label: 'Swaziland', phone: '268' },
+ {
+ code: 'TC',
+ label: 'Turks and Caicos Islands',
+ phone: '1-649',
+ },
+ { code: 'TD', label: 'Chad', phone: '235' },
+ {
+ code: 'TF',
+ label: 'French Southern Territories',
+ phone: '262',
+ },
+ { code: 'TG', label: 'Togo', phone: '228' },
+ { code: 'TH', label: 'Thailand', phone: '66' },
+ { code: 'TJ', label: 'Tajikistan', phone: '992' },
+ { code: 'TK', label: 'Tokelau', phone: '690' },
+ { code: 'TL', label: 'Timor-Leste', phone: '670' },
+ { code: 'TM', label: 'Turkmenistan', phone: '993' },
+ { code: 'TN', label: 'Tunisia', phone: '216' },
+ { code: 'TO', label: 'Tonga', phone: '676' },
+ { code: 'TR', label: 'Turkey', phone: '90' },
+ {
+ code: 'TT',
+ label: 'Trinidad and Tobago',
+ phone: '1-868',
+ },
+ { code: 'TV', label: 'Tuvalu', phone: '688' },
+ {
+ code: 'TW',
+ label: 'Taiwan, Province of China',
+ phone: '886',
+ },
+ {
+ code: 'TZ',
+ label: 'United Republic of Tanzania',
+ phone: '255',
+ },
+ { code: 'UA', label: 'Ukraine', phone: '380' },
+ { code: 'UG', label: 'Uganda', phone: '256' },
+ {
+ code: 'US',
+ label: 'United States',
+ phone: '1',
+ suggested: true,
+ },
+ { code: 'UY', label: 'Uruguay', phone: '598' },
+ { code: 'UZ', label: 'Uzbekistan', phone: '998' },
+ {
+ code: 'VA',
+ label: 'Holy See (Vatican City State)',
+ phone: '379',
+ },
+ {
+ code: 'VC',
+ label: 'Saint Vincent and the Grenadines',
+ phone: '1-784',
+ },
+ { code: 'VE', label: 'Venezuela', phone: '58' },
+ {
+ code: 'VG',
+ label: 'British Virgin Islands',
+ phone: '1-284',
+ },
+ {
+ code: 'VI',
+ label: 'US Virgin Islands',
+ phone: '1-340',
+ },
+ { code: 'VN', label: 'Vietnam', phone: '84' },
+ { code: 'VU', label: 'Vanuatu', phone: '678' },
+ { code: 'WF', label: 'Wallis and Futuna', phone: '681' },
+ { code: 'WS', label: 'Samoa', phone: '685' },
+ { code: 'XK', label: 'Kosovo', phone: '383' },
+ { code: 'YE', label: 'Yemen', phone: '967' },
+ { code: 'YT', label: 'Mayotte', phone: '262' },
+ { code: 'ZA', label: 'South Africa', phone: '27' },
+ { code: 'ZM', label: 'Zambia', phone: '260' },
+ { code: 'ZW', label: 'Zimbabwe', phone: '263' },
+];
diff --git a/template/src/assets/data/index.js b/template/src/assets/data/index.js
new file mode 100644
index 0000000..8ab5434
--- /dev/null
+++ b/template/src/assets/data/index.js
@@ -0,0 +1 @@
+export * from './countries';
diff --git a/template/src/assets/illustrations/career-hero-illustration.jsx b/template/src/assets/illustrations/career-hero-illustration.jsx
new file mode 100644
index 0000000..5209e2c
--- /dev/null
+++ b/template/src/assets/illustrations/career-hero-illustration.jsx
@@ -0,0 +1,199 @@
+import { memo } from 'react';
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import { useTheme } from '@mui/material/styles';
+
+import { useHoverParallax } from 'src/hooks/use-hover-parallax';
+
+import Image from 'src/components/image';
+import SvgColor from 'src/components/svg-color';
+
+import Icon from './pattern/icon';
+import Label from './pattern/label';
+import Character from './pattern/character';
+import Pattern02 from './pattern/pattern-02';
+import Pattern01 from './pattern/pattern-01';
+
+// ----------------------------------------------------------------------
+
+const stylesIcon = {
+ width: 40,
+ height: 40,
+ color: 'common.black',
+};
+
+// ----------------------------------------------------------------------
+
+function CareerHeroIllustration({ sx, ...other }) {
+ const theme = useTheme();
+
+ const { offsetX, offsetY, onMouseMoveHandler, onMouseLeaveHandler } = useHoverParallax();
+
+ const BLUE = theme.palette.info.main;
+
+ const GREEN = theme.palette.success.main;
+
+ const YELLOW = theme.palette.warning.main;
+
+ return (
+
+ <>
+
+ {/* Accounting */}
+
+
+
+ }
+ />
+
+
+
+ >
+
+ {/* Banking */}
+
+
+
+ }
+ />
+
+
+
+ {/* Health Care */}
+
+
+
+ }
+ />
+
+
+
+ {/* Software */}
+
+
+
+ }
+ />
+
+
+
+ {/* Icon */}
+
+
+ }
+ />
+
+
+
+ {/* Icon */}
+
+
+
+ }
+ />
+
+
+
+ {/* Icon */}
+
+
+
+ }
+ />
+
+
+
+
+
+
+
+ );
+}
+
+CareerHeroIllustration.propTypes = {
+ sx: PropTypes.object,
+};
+
+export default memo(CareerHeroIllustration);
diff --git a/template/src/assets/illustrations/elearning-hero-illustration.jsx b/template/src/assets/illustrations/elearning-hero-illustration.jsx
new file mode 100644
index 0000000..963489f
--- /dev/null
+++ b/template/src/assets/illustrations/elearning-hero-illustration.jsx
@@ -0,0 +1,188 @@
+import { memo } from 'react';
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import Image from 'src/components/image';
+
+import Icon from './pattern/icon';
+import Label from './pattern/label';
+import Shape from './pattern/shape';
+import Pattern01 from './pattern/pattern-01';
+import Pattern02 from './pattern/pattern-02';
+
+// ----------------------------------------------------------------------
+
+const varUp = {
+ animate: { y: [-8, 8, -8], x: [-4, 4, -4] },
+ transition: { duration: 8, repeat: Infinity },
+};
+
+const varDown = {
+ animate: { y: [8, -8, 8], x: [4, -4, 4] },
+ transition: { duration: 8, repeat: Infinity },
+};
+
+const varLeft = {
+ animate: { x: [8, -8, 8], y: [4, -4, 4] },
+ transition: { duration: 7, repeat: Infinity },
+};
+
+const varRight = {
+ animate: { x: [8, -8, 8], y: [4, -4, 4] },
+ transition: { duration: 7, repeat: Infinity },
+};
+
+// ----------------------------------------------------------------------
+
+function ElearningHeroIllustration({ sx, ...other }) {
+ const theme = useTheme();
+
+ const GREEN = theme.palette.success.main;
+
+ const YELLOW = theme.palette.warning.main;
+
+ const BLUE = '#355EC9';
+
+ const PURPLE = '#9B3AB1';
+
+ const styleIconContent = {
+ fontSize: 22,
+ color: 'common.black',
+ fontWeight: 'fontWeightBold',
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ sx={{
+ py: 1.75,
+ typography: 'h3',
+ color: '#2994FF',
+ boxShadow: `0px 24px 48px rgba(0, 0, 0, 0.24), inset 0px -4px 10px ${alpha(
+ theme.palette.grey[600],
+ 0.48
+ )}`,
+ }}
+ />
+
+
+ {/* Icon */}
+
+
+ Dw}
+ sx={{ transform: 'scale(1.2) rotate(15deg)' }}
+ />
+
+
+
+ Ai}
+ sx={{ transform: 'translateX(40px) scale(1.2) rotate(-15deg)' }}
+ />
+
+
+
+ Ae}
+ sx={{ transform: 'scale(1.2) translateY(20px) rotate(15deg)' }}
+ />
+
+
+
+ Ps}
+ sx={{
+ transform: 'scale(1.2) translate(-135px, -75px) rotate(15deg)',
+ }}
+ />
+
+
+
+
+
+
+ );
+}
+
+ElearningHeroIllustration.propTypes = {
+ sx: PropTypes.object,
+};
+
+export default memo(ElearningHeroIllustration);
diff --git a/template/src/assets/illustrations/pattern/character.jsx b/template/src/assets/illustrations/pattern/character.jsx
new file mode 100644
index 0000000..733f37d
--- /dev/null
+++ b/template/src/assets/illustrations/pattern/character.jsx
@@ -0,0 +1,135 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import { useTheme } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+function Character({ front = false, ...other }) {
+ const theme = useTheme();
+
+ const PRIMARY_MAIN = theme.palette.primary.main;
+
+ const PRIMARY_DARK = theme.palette.primary.dark;
+
+ const PRIMARY_DARKER = theme.palette.primary.darker;
+
+ const SECONDARY_MAIN = theme.palette.secondary.main;
+
+ const SECONDARY_DARK = theme.palette.secondary.dark;
+
+ const SECONDARY_DARKER = theme.palette.secondary.darker;
+
+ return (
+
+
+ {!front && (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+Character.propTypes = {
+ front: PropTypes.bool,
+};
+
+export default memo(Character);
diff --git a/template/src/assets/illustrations/pattern/circle.jsx b/template/src/assets/illustrations/pattern/circle.jsx
new file mode 100644
index 0000000..c4d4025
--- /dev/null
+++ b/template/src/assets/illustrations/pattern/circle.jsx
@@ -0,0 +1,39 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+
+// ----------------------------------------------------------------------
+
+function Circle({ children, hide = false, sx, ...other }) {
+ return (
+
+ {!hide && (
+
+
+
+
+
+
+
+ )}
+
+ {children}
+
+ );
+}
+
+Circle.propTypes = {
+ children: PropTypes.node,
+ hide: PropTypes.bool,
+ sx: PropTypes.object,
+};
+
+export default memo(Circle);
diff --git a/template/src/assets/illustrations/pattern/dots.jsx b/template/src/assets/illustrations/pattern/dots.jsx
new file mode 100644
index 0000000..7ecee0f
--- /dev/null
+++ b/template/src/assets/illustrations/pattern/dots.jsx
@@ -0,0 +1,31 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+
+// ----------------------------------------------------------------------
+
+function Dot({ size = 24, color = 'primary', sx }) {
+ return (
+
+ `linear-gradient(to bottom, ${theme.palette[color].light}, ${theme.palette[color].main})`,
+ boxShadow: (theme) => `inset 0px -2px 4px ${theme.palette[color].darker}`,
+ ...sx,
+ }}
+ />
+ );
+}
+
+Dot.propTypes = {
+ color: PropTypes.string,
+ size: PropTypes.number,
+ sx: PropTypes.object,
+};
+export default memo(Dot);
diff --git a/template/src/assets/illustrations/pattern/icon.jsx b/template/src/assets/illustrations/pattern/icon.jsx
new file mode 100644
index 0000000..143056d
--- /dev/null
+++ b/template/src/assets/illustrations/pattern/icon.jsx
@@ -0,0 +1,93 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import { alpha, styled } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+const StyledContent = styled('div')(({ theme }) => ({
+ width: 56,
+ height: 56,
+ borderRadius: theme.shape.borderRadius * 1.5,
+ position: 'relative',
+ display: 'flex',
+ overflow: 'hidden',
+ alignItems: 'center',
+ justifyContent: 'center',
+ clipPath: 'polygon(25% 0, 100% 0, 100% 100%, 0 100%, 0 25%)',
+ boxShadow: `inset 0px -4px 6px rgba(0, 0, 0, 0.48)`,
+}));
+
+const StyledShape01 = styled('div')(() => ({
+ top: -2,
+ left: -2,
+ width: 16,
+ zIndex: 9,
+ height: 16,
+ borderRadius: '5px',
+ position: 'absolute',
+ '&:before': {
+ top: 0,
+ left: 0,
+ width: 16,
+ height: 16,
+ content: '" "',
+ borderRadius: '5px',
+ position: 'absolute',
+ backgroundColor: 'rgba(255,255,255,0.4)',
+ },
+}));
+
+const StyledShape02 = styled('div')(({ theme }) => ({
+ top: 2,
+ left: -10,
+ width: 18,
+ zIndex: 8,
+ height: 18,
+ opacity: 0.24,
+ position: 'absolute',
+ transform: 'rotate(45deg)',
+ backgroundColor: theme.palette.common.black,
+}));
+
+// ----------------------------------------------------------------------
+
+function Icon({ content, color, sx, ...other }) {
+ return (
+
+ `0px 24px 48px ${alpha(theme.palette.common.black, 0.4)}`,
+ }}
+ >
+
+
+
+ {content}
+
+
+
+ );
+}
+
+Icon.propTypes = {
+ color: PropTypes.string,
+ content: PropTypes.node,
+ sx: PropTypes.object,
+};
+
+export default memo(Icon);
diff --git a/template/src/assets/illustrations/pattern/label.jsx b/template/src/assets/illustrations/pattern/label.jsx
new file mode 100644
index 0000000..10380a7
--- /dev/null
+++ b/template/src/assets/illustrations/pattern/label.jsx
@@ -0,0 +1,43 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+
+// ----------------------------------------------------------------------
+
+function Label({ icon, text, sx, ...other }) {
+ return (
+
+ `0px 24px 48px rgba(0, 0, 0, 0.8), inset 0px -4px 10px ${theme.palette.grey[600]}`,
+ '& > div': { lineHeight: 0 },
+ '& svg': { width: 44, height: 44 },
+ ...sx,
+ }}
+ {...other}
+ >
+ {icon}
+ {text}
+
+ );
+}
+
+Label.propTypes = {
+ icon: PropTypes.node,
+ sx: PropTypes.object,
+ text: PropTypes.string,
+};
+
+export default memo(Label);
diff --git a/template/src/assets/illustrations/pattern/pattern-01.jsx b/template/src/assets/illustrations/pattern/pattern-01.jsx
new file mode 100644
index 0000000..6fbef86
--- /dev/null
+++ b/template/src/assets/illustrations/pattern/pattern-01.jsx
@@ -0,0 +1,127 @@
+import { memo } from 'react';
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import { useTheme } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+const varUp = {
+ animate: { y: [-12, 12, -12] },
+ transition: { duration: 8, repeat: Infinity },
+};
+
+const varDown = {
+ animate: { y: [12, -12, 12] },
+ transition: { duration: 8, repeat: Infinity },
+};
+
+const varLeft = {
+ animate: { x: [10, -10, 10] },
+ transition: { duration: 7, repeat: Infinity },
+};
+
+const varRight = {
+ animate: { x: [10, -10, 10] },
+ transition: { duration: 7, repeat: Infinity },
+};
+
+// ----------------------------------------------------------------------
+
+function Pattern01({ sx, ...other }) {
+ const theme = useTheme();
+
+ const PURPLE = '#DC8CFF';
+ const BLUE = theme.palette.info.light;
+ const RED = theme.palette.error.light;
+ const CYAN = theme.palette.info.lighter;
+ const GREEN = theme.palette.success.light;
+ const ORANGE = theme.palette.warning.light;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+Pattern01.propTypes = {
+ sx: PropTypes.object,
+};
+
+export default memo(Pattern01);
diff --git a/template/src/assets/illustrations/pattern/pattern-02.jsx b/template/src/assets/illustrations/pattern/pattern-02.jsx
new file mode 100644
index 0000000..775efe2
--- /dev/null
+++ b/template/src/assets/illustrations/pattern/pattern-02.jsx
@@ -0,0 +1,59 @@
+import { memo } from 'react';
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+
+import Dot from './dots';
+import Circle from './circle';
+
+// ----------------------------------------------------------------------
+
+const animateDown = (duration = 60) => ({
+ animate: { rotate: [360, 0] },
+ transition: { duration, repeat: Infinity, ease: 'linear' },
+});
+
+const animateUp = (duration = 60) => ({
+ animate: { rotate: [0, 360] },
+ transition: { duration, repeat: Infinity, ease: 'linear' },
+});
+
+function Pattern02({ sx, ...other }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+Pattern02.propTypes = {
+ sx: PropTypes.object,
+};
+
+export default memo(Pattern02);
diff --git a/template/src/assets/illustrations/pattern/shape.jsx b/template/src/assets/illustrations/pattern/shape.jsx
new file mode 100644
index 0000000..3de20c8
--- /dev/null
+++ b/template/src/assets/illustrations/pattern/shape.jsx
@@ -0,0 +1,63 @@
+import { memo } from 'react';
+
+import Box from '@mui/material/Box';
+import { useTheme } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+function Shape({ ...other }) {
+ const theme = useTheme();
+
+ const PRIMARY_LIGHT = theme.palette.primary.light;
+
+ const PRIMARY_MAIN = theme.palette.primary.main;
+
+ const SECONDARY_LIGHT = theme.palette.secondary.light;
+
+ const SECONDARY_MAIN = theme.palette.secondary.main;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default memo(Shape);
diff --git a/template/src/components/animate/index.js b/template/src/components/animate/index.js
new file mode 100644
index 0000000..a08ceb5
--- /dev/null
+++ b/template/src/components/animate/index.js
@@ -0,0 +1,6 @@
+// ----------------------------------------------------------------------
+
+export * from './variants';
+
+export { default as MotionViewport } from './motion-viewport';
+export { default as MotionContainer } from './motion-container';
diff --git a/template/src/components/animate/motion-container.jsx b/template/src/components/animate/motion-container.jsx
new file mode 100644
index 0000000..b147acf
--- /dev/null
+++ b/template/src/components/animate/motion-container.jsx
@@ -0,0 +1,43 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+
+import { varContainer } from './variants';
+
+// ----------------------------------------------------------------------
+
+export default function MotionContainer({ animate, action = false, children, ...other }) {
+ if (action) {
+ return (
+
+ {children}
+
+ );
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+
+MotionContainer.propTypes = {
+ action: PropTypes.bool,
+ animate: PropTypes.bool,
+ children: PropTypes.node,
+};
diff --git a/template/src/components/animate/motion-lazy.jsx b/template/src/components/animate/motion-lazy.jsx
new file mode 100644
index 0000000..954b022
--- /dev/null
+++ b/template/src/components/animate/motion-lazy.jsx
@@ -0,0 +1,16 @@
+import PropTypes from 'prop-types';
+import { m, domMax, LazyMotion } from 'framer-motion';
+
+// ----------------------------------------------------------------------
+
+export function MotionLazy({ children }) {
+ return (
+
+ {children}
+
+ );
+}
+
+MotionLazy.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/components/animate/motion-viewport.jsx b/template/src/components/animate/motion-viewport.jsx
new file mode 100644
index 0000000..c30d86f
--- /dev/null
+++ b/template/src/components/animate/motion-viewport.jsx
@@ -0,0 +1,36 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { varContainer } from './variants';
+
+// ----------------------------------------------------------------------
+
+export default function MotionViewport({ children, disableAnimatedMobile = true, ...other }) {
+ const smDown = useResponsive('down', 'sm');
+
+ if (smDown && disableAnimatedMobile) {
+ return {children} ;
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+
+MotionViewport.propTypes = {
+ children: PropTypes.node,
+ disableAnimatedMobile: PropTypes.bool,
+};
diff --git a/template/src/components/animate/variants/actions.js b/template/src/components/animate/variants/actions.js
new file mode 100644
index 0000000..e910044
--- /dev/null
+++ b/template/src/components/animate/variants/actions.js
@@ -0,0 +1,6 @@
+// ----------------------------------------------------------------------
+
+export const varHover = (hover = 1.09, tap = 0.97) => ({
+ hover: { scale: hover },
+ tap: { scale: tap },
+});
diff --git a/template/src/components/animate/variants/background.js b/template/src/components/animate/variants/background.js
new file mode 100644
index 0000000..c9a8822
--- /dev/null
+++ b/template/src/components/animate/variants/background.js
@@ -0,0 +1,103 @@
+// ----------------------------------------------------------------------
+
+export const varBgColor = (props) => {
+ const colors = props?.colors || ['#19dcea', '#b22cff'];
+ const duration = props?.duration || 5;
+ const ease = props?.ease || 'linear';
+
+ return {
+ animate: {
+ background: colors,
+ transition: { duration, ease },
+ },
+ };
+};
+
+// ----------------------------------------------------------------------
+
+export const varBgKenburns = (props) => {
+ const duration = props?.duration || 5;
+ const ease = props?.ease || 'easeOut';
+
+ return {
+ top: {
+ animate: {
+ scale: [1, 1.25],
+ y: [0, -15],
+ transformOrigin: ['50% 16%', '50% top'],
+ transition: { duration, ease },
+ },
+ },
+ bottom: {
+ animate: {
+ scale: [1, 1.25],
+ y: [0, 15],
+ transformOrigin: ['50% 84%', '50% bottom'],
+ transition: { duration, ease },
+ },
+ },
+ left: {
+ animate: {
+ scale: [1, 1.25],
+ x: [0, 20],
+ y: [0, 15],
+ transformOrigin: ['16% 50%', '0% left'],
+ transition: { duration, ease },
+ },
+ },
+ right: {
+ animate: {
+ scale: [1, 1.25],
+ x: [0, -20],
+ y: [0, -15],
+ transformOrigin: ['84% 50%', '0% right'],
+ transition: { duration, ease },
+ },
+ },
+ };
+};
+
+// ----------------------------------------------------------------------
+
+export const varBgPan = (props) => {
+ const colors = props?.colors || ['#ee7752', '#e73c7e', '#23a6d5', '#23d5ab'];
+ const duration = props?.duration || 5;
+ const ease = props?.ease || 'linear';
+
+ const gradient = (deg) => `linear-gradient(${deg}deg, ${colors})`;
+
+ return {
+ top: {
+ animate: {
+ backgroundImage: [gradient(0), gradient(0)],
+ backgroundPosition: ['center 99%', 'center 1%'],
+ backgroundSize: ['100% 600%', '100% 600%'],
+ transition: { duration, ease },
+ },
+ },
+ right: {
+ animate: {
+ backgroundPosition: ['1% center', '99% center'],
+ backgroundImage: [gradient(270), gradient(270)],
+ backgroundSize: ['600% 100%', '600% 100%'],
+ transition: { duration, ease },
+ },
+ },
+ bottom: {
+ animate: {
+ backgroundImage: [gradient(0), gradient(0)],
+ backgroundPosition: ['center 1%', 'center 99%'],
+ backgroundSize: ['100% 600%', '100% 600%'],
+ transition: { duration, ease },
+ },
+ },
+ left: {
+ animate: {
+ backgroundPosition: ['99% center', '1% center'],
+ backgroundImage: [gradient(270), gradient(270)],
+ backgroundSize: ['600% 100%', '600% 100%'],
+ transition: { duration, ease },
+ },
+ },
+ };
+};
diff --git a/template/src/components/animate/variants/bounce.js b/template/src/components/animate/variants/bounce.js
new file mode 100644
index 0000000..c1f2efa
--- /dev/null
+++ b/template/src/components/animate/variants/bounce.js
@@ -0,0 +1,111 @@
+import { varTranExit, varTranEnter } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varBounce = (props) => {
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ in: {
+ initial: {},
+ animate: {
+ scale: [0.3, 1.1, 0.9, 1.03, 0.97, 1],
+ opacity: [0, 1, 1, 1, 1, 1],
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: [0.9, 1.1, 0.3],
+ opacity: [1, 1, 0],
+ },
+ },
+ inUp: {
+ initial: {},
+ animate: {
+ y: [720, -24, 12, -4, 0],
+ scaleY: [4, 0.9, 0.95, 0.985, 1],
+ opacity: [0, 1, 1, 1, 1],
+ transition: { ...varTranEnter({ durationIn, easeIn }) },
+ },
+ exit: {
+ y: [12, -24, 720],
+ scaleY: [0.985, 0.9, 3],
+ opacity: [1, 1, 0],
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inDown: {
+ initial: {},
+ animate: {
+ y: [-720, 24, -12, 4, 0],
+ scaleY: [4, 0.9, 0.95, 0.985, 1],
+ opacity: [0, 1, 1, 1, 1],
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: [-12, 24, -720],
+ scaleY: [0.985, 0.9, 3],
+ opacity: [1, 1, 0],
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inLeft: {
+ initial: {},
+ animate: {
+ x: [-720, 24, -12, 4, 0],
+ scaleX: [3, 1, 0.98, 0.995, 1],
+ opacity: [0, 1, 1, 1, 1],
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: [0, 24, -720],
+ scaleX: [1, 0.9, 2],
+ opacity: [1, 1, 0],
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inRight: {
+ initial: {},
+ animate: {
+ x: [720, -24, 12, -4, 0],
+ scaleX: [3, 1, 0.98, 0.995, 1],
+ opacity: [0, 1, 1, 1, 1],
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: [0, -24, 720],
+ scaleX: [1, 0.9, 2],
+ opacity: [1, 1, 0],
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ out: {
+ animate: { scale: [0.9, 1.1, 0.3], opacity: [1, 1, 0] },
+ },
+ outUp: {
+ animate: {
+ y: [-12, 24, -720],
+ scaleY: [0.985, 0.9, 3],
+ opacity: [1, 1, 0],
+ },
+ },
+ outDown: {
+ animate: {
+ y: [12, -24, 720],
+ scaleY: [0.985, 0.9, 3],
+ opacity: [1, 1, 0],
+ },
+ },
+ outLeft: {
+ animate: { x: [0, 24, -720], scaleX: [1, 0.9, 2], opacity: [1, 1, 0] },
+ },
+ outRight: {
+ animate: { x: [0, -24, 720], scaleX: [1, 0.9, 2], opacity: [1, 1, 0] },
+ },
+ };
+};
diff --git a/template/src/components/animate/variants/container.js b/template/src/components/animate/variants/container.js
new file mode 100644
index 0000000..9edf946
--- /dev/null
+++ b/template/src/components/animate/variants/container.js
@@ -0,0 +1,22 @@
+// ----------------------------------------------------------------------
+
+export const varContainer = (props) => {
+ const staggerIn = props?.staggerIn || 0.05;
+ const delayIn = props?.staggerIn || 0.05;
+ const staggerOut = props?.staggerIn || 0.05;
+
+ return {
+ animate: {
+ transition: {
+ staggerChildren: staggerIn,
+ delayChildren: delayIn,
+ },
+ },
+ exit: {
+ transition: {
+ staggerChildren: staggerOut,
+ staggerDirection: -1,
+ },
+ },
+ };
+};
diff --git a/template/src/components/animate/variants/fade.js b/template/src/components/animate/variants/fade.js
new file mode 100644
index 0000000..5edf310
--- /dev/null
+++ b/template/src/components/animate/variants/fade.js
@@ -0,0 +1,131 @@
+import { varTranExit, varTranEnter } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varFade = (props) => {
+ const distance = props?.distance || 120;
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ in: {
+ initial: { opacity: 0 },
+ animate: { opacity: 1, transition: varTranEnter },
+ exit: { opacity: 0, transition: varTranExit },
+ },
+ inUp: {
+ initial: { y: distance, opacity: 0 },
+ animate: {
+ y: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: distance,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inDown: {
+ initial: { y: -distance, opacity: 0 },
+ animate: {
+ y: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: -distance,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inLeft: {
+ initial: { x: -distance, opacity: 0 },
+ animate: {
+ x: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: -distance,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inRight: {
+ initial: { x: distance, opacity: 0 },
+ animate: {
+ x: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: distance,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ out: {
+ initial: { opacity: 1 },
+ animate: { opacity: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { opacity: 1, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ outUp: {
+ initial: { y: 0, opacity: 1 },
+ animate: {
+ y: -distance,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: 0,
+ opacity: 1,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ outDown: {
+ initial: { y: 0, opacity: 1 },
+ animate: {
+ y: distance,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: 0,
+ opacity: 1,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ outLeft: {
+ initial: { x: 0, opacity: 1 },
+ animate: {
+ x: -distance,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: 0,
+ opacity: 1,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ outRight: {
+ initial: { x: 0, opacity: 1 },
+ animate: {
+ x: distance,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: 0,
+ opacity: 1,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ };
+};
diff --git a/template/src/components/animate/variants/flip.js b/template/src/components/animate/variants/flip.js
new file mode 100644
index 0000000..809a261
--- /dev/null
+++ b/template/src/components/animate/variants/flip.js
@@ -0,0 +1,58 @@
+import { varTranExit, varTranEnter } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varFlip = (props) => {
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ inX: {
+ initial: { rotateX: -180, opacity: 0 },
+ animate: {
+ rotateX: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ rotateX: -180,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inY: {
+ initial: { rotateY: -180, opacity: 0 },
+ animate: {
+ rotateY: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ rotateY: -180,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ outX: {
+ initial: { rotateX: 0, opacity: 1 },
+ animate: {
+ rotateX: 70,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ outY: {
+ initial: { rotateY: 0, opacity: 1 },
+ animate: {
+ rotateY: 70,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ };
+};
diff --git a/template/src/components/animate/variants/index.js b/template/src/components/animate/variants/index.js
new file mode 100644
index 0000000..ed93345
--- /dev/null
+++ b/template/src/components/animate/variants/index.js
@@ -0,0 +1,12 @@
+export * from './path';
+export * from './fade';
+export * from './zoom';
+export * from './flip';
+export * from './slide';
+export * from './scale';
+export * from './bounce';
+export * from './rotate';
+export * from './actions';
+export * from './container';
+export * from './transition';
+export * from './background';
diff --git a/template/src/components/animate/variants/path.js b/template/src/components/animate/variants/path.js
new file mode 100644
index 0000000..a4bee2c
--- /dev/null
+++ b/template/src/components/animate/variants/path.js
@@ -0,0 +1,14 @@
+// ----------------------------------------------------------------------
+
+export const TRANSITION = {
+ duration: 2,
+ ease: [0.43, 0.13, 0.23, 0.96],
+};
+
+export const varPath = {
+ animate: {
+ fillOpacity: [0, 0, 1],
+ pathLength: [1, 0.4, 0],
+ transition: TRANSITION,
+ },
+};
diff --git a/template/src/components/animate/variants/rotate.js b/template/src/components/animate/variants/rotate.js
new file mode 100644
index 0000000..474b6b7
--- /dev/null
+++ b/template/src/components/animate/variants/rotate.js
@@ -0,0 +1,37 @@
+import { varTranExit, varTranEnter } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varRotate = (props) => {
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ in: {
+ initial: { opacity: 0, rotate: -360 },
+ animate: {
+ opacity: 1,
+ rotate: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ opacity: 0,
+ rotate: -360,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ out: {
+ initial: { opacity: 1, rotate: 0 },
+ animate: {
+ opacity: 0,
+ rotate: -360,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ };
+};
diff --git a/template/src/components/animate/variants/scale.js b/template/src/components/animate/variants/scale.js
new file mode 100644
index 0000000..5037bfd
--- /dev/null
+++ b/template/src/components/animate/variants/scale.js
@@ -0,0 +1,58 @@
+import { varTranExit, varTranEnter } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varScale = (props) => {
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ inX: {
+ initial: { scaleX: 0, opacity: 0 },
+ animate: {
+ scaleX: 1,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scaleX: 0,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inY: {
+ initial: { scaleY: 0, opacity: 0 },
+ animate: {
+ scaleY: 1,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scaleY: 0,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ outX: {
+ initial: { scaleX: 1, opacity: 1 },
+ animate: {
+ scaleX: 0,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outY: {
+ initial: { scaleY: 1, opacity: 1 },
+ animate: {
+ scaleY: 0,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ };
+};
diff --git a/template/src/components/animate/variants/slide.js b/template/src/components/animate/variants/slide.js
new file mode 100644
index 0000000..8482d09
--- /dev/null
+++ b/template/src/components/animate/variants/slide.js
@@ -0,0 +1,69 @@
+import { varTranExit, varTranEnter } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varSlide = (props) => {
+ const distance = props?.distance || 160;
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ inUp: {
+ initial: { y: distance },
+ animate: { y: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { y: distance, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ inDown: {
+ initial: { y: -distance },
+ animate: { y: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { y: -distance, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ inLeft: {
+ initial: { x: -distance },
+ animate: { x: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { x: -distance, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ inRight: {
+ initial: { x: distance },
+ animate: { x: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { x: distance, transition: varTranExit({ durationOut, easeOut }) },
+ },
+
+ // OUT
+ outUp: {
+ initial: { y: 0 },
+ animate: {
+ y: -distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: { y: 0, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ outDown: {
+ initial: { y: 0 },
+ animate: {
+ y: distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: { y: 0, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ outLeft: {
+ initial: { x: 0 },
+ animate: {
+ x: -distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: { x: 0, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ outRight: {
+ initial: { x: 0 },
+ animate: {
+ x: distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: { x: 0, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ };
+};
diff --git a/template/src/components/animate/variants/transition.js b/template/src/components/animate/variants/transition.js
new file mode 100644
index 0000000..adf4dc2
--- /dev/null
+++ b/template/src/components/animate/variants/transition.js
@@ -0,0 +1,22 @@
+// ----------------------------------------------------------------------
+
+export const varTranHover = (props) => {
+ const duration = props?.duration || 0.32;
+ const ease = props?.ease || [0.43, 0.13, 0.23, 0.96];
+
+ return { duration, ease };
+};
+
+export const varTranEnter = (props) => {
+ const duration = props?.durationIn || 0.64;
+ const ease = props?.easeIn || [0.43, 0.13, 0.23, 0.96];
+
+ return { duration, ease };
+};
+
+export const varTranExit = (props) => {
+ const duration = props?.durationOut || 0.48;
+ const ease = props?.easeOut || [0.43, 0.13, 0.23, 0.96];
+
+ return { duration, ease };
+};
diff --git a/template/src/components/animate/variants/zoom.js b/template/src/components/animate/variants/zoom.js
new file mode 100644
index 0000000..b9fcbad
--- /dev/null
+++ b/template/src/components/animate/variants/zoom.js
@@ -0,0 +1,134 @@
+import { varTranExit, varTranEnter } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varZoom = (props) => {
+ const distance = props?.distance || 720;
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ in: {
+ initial: { scale: 0, opacity: 0 },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inUp: {
+ initial: { scale: 0, opacity: 0, translateY: distance },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ translateY: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ translateY: distance,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inDown: {
+ initial: { scale: 0, opacity: 0, translateY: -distance },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ translateY: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ translateY: -distance,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inLeft: {
+ initial: { scale: 0, opacity: 0, translateX: -distance },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ translateX: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ translateX: -distance,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inRight: {
+ initial: { scale: 0, opacity: 0, translateX: distance },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ translateX: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ translateX: distance,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ out: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outUp: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ translateY: -distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outDown: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ translateY: distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outLeft: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ translateX: -distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outRight: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ translateX: distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ };
+};
diff --git a/template/src/components/carousel/arrow-icons.jsx b/template/src/components/carousel/arrow-icons.jsx
new file mode 100644
index 0000000..b1b6bc2
--- /dev/null
+++ b/template/src/components/carousel/arrow-icons.jsx
@@ -0,0 +1,42 @@
+import PropTypes from 'prop-types';
+
+import Iconify from '../iconify';
+
+// ----------------------------------------------------------------------
+
+export function LeftIcon({ icon = 'eva:arrow-ios-forward-fill', isRTL }) {
+ return (
+
+ );
+}
+
+LeftIcon.propTypes = {
+ icon: PropTypes.string,
+ isRTL: PropTypes.bool,
+};
+
+export function RightIcon({ icon = 'eva:arrow-ios-forward-fill', isRTL }) {
+ return (
+
+ );
+}
+
+RightIcon.propTypes = {
+ icon: PropTypes.string,
+ isRTL: PropTypes.bool,
+};
diff --git a/template/src/components/carousel/carousel-arrow-index.jsx b/template/src/components/carousel/carousel-arrow-index.jsx
new file mode 100644
index 0000000..c7a5b8f
--- /dev/null
+++ b/template/src/components/carousel/carousel-arrow-index.jsx
@@ -0,0 +1,69 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import { styled, useTheme } from '@mui/material/styles';
+
+import { bgBlur } from 'src/theme/css';
+
+import { LeftIcon, RightIcon } from './arrow-icons';
+
+// ----------------------------------------------------------------------
+
+const StyledRoot = styled(Box)(({ theme }) => ({
+ ...bgBlur({
+ opacity: 0.48,
+ color: theme.palette.grey[900],
+ }),
+ zIndex: 9,
+ display: 'inline-flex',
+ alignItems: 'center',
+ position: 'absolute',
+ bottom: theme.spacing(2),
+ right: theme.spacing(2),
+ padding: theme.spacing(0.25),
+ color: theme.palette.common.white,
+ borderRadius: theme.shape.borderRadius,
+}));
+
+const StyledIconButton = styled(IconButton)({
+ width: 28,
+ height: 28,
+ padding: 0,
+ opacity: 0.48,
+ '&:hover': { opacity: 1 },
+});
+
+// ----------------------------------------------------------------------
+
+export default function CarouselArrowIndex({ index, total, onNext, onPrev, icon, sx, ...other }) {
+ const theme = useTheme();
+
+ const isRTL = theme.direction === 'rtl';
+
+ return (
+
+
+
+
+
+
+ {index + 1}/{total}
+
+
+
+
+
+
+ );
+}
+
+CarouselArrowIndex.propTypes = {
+ icon: PropTypes.oneOfType([PropTypes.element, PropTypes.string]),
+ index: PropTypes.number,
+ onNext: PropTypes.func,
+ onPrev: PropTypes.func,
+ sx: PropTypes.object,
+ total: PropTypes.number,
+};
diff --git a/template/src/components/carousel/carousel-arrows.jsx b/template/src/components/carousel/carousel-arrows.jsx
new file mode 100644
index 0000000..423600f
--- /dev/null
+++ b/template/src/components/carousel/carousel-arrows.jsx
@@ -0,0 +1,127 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import IconButton from '@mui/material/IconButton';
+import { alpha, styled, useTheme } from '@mui/material/styles';
+//
+
+import { LeftIcon, RightIcon } from './arrow-icons';
+
+// ----------------------------------------------------------------------
+
+const StyledIconButton = styled(IconButton, {
+ shouldForwardProp: (prop) => prop !== 'filled' && prop !== 'hasChild' && prop !== 'shape',
+})(({ filled, shape, hasChild, theme }) => ({
+ color: 'inherit',
+ transition: theme.transitions.create('all', {
+ duration: theme.transitions.duration.shorter,
+ }),
+ ...(shape === 'rounded' && {
+ borderRadius: theme.shape.borderRadius * 1.5,
+ }),
+ ...(!filled && {
+ opacity: 0.48,
+ '&:hover': {
+ opacity: 1,
+ },
+ }),
+ ...(filled && {
+ color: alpha(theme.palette.common.white, 0.8),
+ backgroundColor: alpha(theme.palette.grey[900], 0.48),
+ '&:hover': {
+ color: theme.palette.common.white,
+ backgroundColor: theme.palette.grey[900],
+ },
+ }),
+ ...(hasChild && {
+ zIndex: 9,
+ top: '50%',
+ position: 'absolute',
+ marginTop: theme.spacing(-2.5),
+ }),
+}));
+
+// ----------------------------------------------------------------------
+
+export default function CarouselArrows({
+ shape = 'circular',
+ filled = false,
+ icon,
+ onNext,
+ onPrev,
+ children,
+ leftButtonProps,
+ rightButtonProps,
+ sx,
+ ...other
+}) {
+ const theme = useTheme();
+
+ const isRTL = theme.direction === 'rtl';
+
+ const hasChild = !!children;
+
+ if (hasChild) {
+ return (
+
+ {onNext && (
+
+
+
+ )}
+
+ {children}
+
+ {onPrev && (
+
+
+
+ )}
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+CarouselArrows.propTypes = {
+ children: PropTypes.node,
+ filled: PropTypes.bool,
+ icon: PropTypes.oneOfType([PropTypes.element, PropTypes.string]),
+ leftButtonProps: PropTypes.object,
+ onNext: PropTypes.func,
+ onPrev: PropTypes.func,
+ rightButtonProps: PropTypes.object,
+ shape: PropTypes.oneOf(['circular', 'rounded']),
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/carousel/carousel-dots.jsx b/template/src/components/carousel/carousel-dots.jsx
new file mode 100644
index 0000000..c6ec5db
--- /dev/null
+++ b/template/src/components/carousel/carousel-dots.jsx
@@ -0,0 +1,85 @@
+/* eslint-disable react/jsx-no-useless-fragment */
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import { styled } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+const StyledRoot = styled(Box, {
+ shouldForwardProp: (prop) => prop !== 'rounded',
+})(({ rounded, theme }) => ({
+ zIndex: 9,
+ margin: 0,
+ padding: 0,
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ color: theme.palette.primary.main,
+ '& li': {
+ width: 18,
+ height: 18,
+ opacity: 0.32,
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ cursor: 'pointer',
+ '&.slick-active': {
+ opacity: 1,
+ ...(rounded && {
+ '& span': {
+ width: 16,
+ borderRadius: 6,
+ },
+ }),
+ },
+ },
+}));
+
+const StyledDot = styled('span')(({ theme }) => ({
+ width: 8,
+ height: 8,
+ borderRadius: '50%',
+ transition: theme.transitions.create(['width'], {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.short,
+ }),
+}));
+
+// ----------------------------------------------------------------------
+
+export default function CarouselDots(props) {
+ const rounded = props?.rounded || false;
+
+ const sx = props?.sx;
+
+ return {
+ appendDots: (dots) => (
+ <>
+
+ {dots}
+
+ >
+ ),
+ customPaging: () => (
+
+
+
+ ),
+ };
+}
+
+CarouselDots.propTypes = {
+ rounded: PropTypes.bool,
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/carousel/index.js b/template/src/components/carousel/index.js
new file mode 100644
index 0000000..d20092a
--- /dev/null
+++ b/template/src/components/carousel/index.js
@@ -0,0 +1,9 @@
+import Carousel from 'react-slick';
+
+export { default as useCarousel } from './use-carousel';
+export { default as CarouselDots } from './carousel-dots';
+export { default as CarouselArrows } from './carousel-arrows';
+
+export { default as CarouselArrowIndex } from './carousel-arrow-index';
+
+export default Carousel;
diff --git a/template/src/components/carousel/use-carousel.js b/template/src/components/carousel/use-carousel.js
new file mode 100644
index 0000000..096fec3
--- /dev/null
+++ b/template/src/components/carousel/use-carousel.js
@@ -0,0 +1,65 @@
+import { useRef, useState, useCallback } from 'react';
+
+import { useTheme } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+export default function useCarousel(props) {
+ const theme = useTheme();
+
+ const carouselRef = useRef(null);
+
+ const [currentIndex, setCurrentIndex] = useState(props?.initialSlide || 0);
+
+ const [nav, setNav] = useState(undefined);
+
+ const rtl = theme.direction === 'rtl';
+
+ const carouselSettings = {
+ arrows: false,
+ dots: !!props?.customPaging,
+ rtl,
+ beforeChange: (current, next) => setCurrentIndex(next),
+ ...props,
+ fade: !!(props?.fade && !rtl),
+ };
+
+ const onSetNav = useCallback(() => {
+ if (carouselRef.current) {
+ setNav(carouselRef.current);
+ }
+ }, []);
+
+ const onPrev = useCallback(() => {
+ if (carouselRef.current) {
+ carouselRef.current.slickPrev();
+ }
+ }, []);
+
+ const onNext = useCallback(() => {
+ if (carouselRef.current) {
+ carouselRef.current.slickNext();
+ }
+ }, []);
+
+ const onTogo = useCallback((index) => {
+ if (carouselRef.current) {
+ carouselRef.current.slickGoTo(index);
+ }
+ }, []);
+
+ return {
+ nav,
+ carouselRef,
+ currentIndex,
+ carouselSettings,
+ //
+ onPrev,
+ onNext,
+ onTogo,
+ onSetNav,
+ //
+ setNav,
+ setCurrentIndex,
+ };
+}
diff --git a/template/src/components/count-up/count-up.jsx b/template/src/components/count-up/count-up.jsx
new file mode 100644
index 0000000..e6e96f2
--- /dev/null
+++ b/template/src/components/count-up/count-up.jsx
@@ -0,0 +1,24 @@
+import { useRef } from 'react';
+import PropTypes from 'prop-types';
+import ReactCountUp from 'react-countup';
+import { useInView } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+
+// ----------------------------------------------------------------------
+
+export default function CountUp({ sx, ...other }) {
+ const ref = useRef(null);
+
+ const isInView = useInView(ref, { once: true });
+
+ return (
+
+ {isInView && }
+
+ );
+}
+
+CountUp.propTypes = {
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/count-up/index.js b/template/src/components/count-up/index.js
new file mode 100644
index 0000000..00f2671
--- /dev/null
+++ b/template/src/components/count-up/index.js
@@ -0,0 +1 @@
+export { default } from './count-up';
diff --git a/template/src/components/country-select/country-select.jsx b/template/src/components/country-select/country-select.jsx
new file mode 100644
index 0000000..d1f15b5
--- /dev/null
+++ b/template/src/components/country-select/country-select.jsx
@@ -0,0 +1,137 @@
+import PropTypes from 'prop-types';
+
+import Chip from '@mui/material/Chip';
+import TextField from '@mui/material/TextField';
+import Autocomplete from '@mui/material/Autocomplete';
+import InputAdornment from '@mui/material/InputAdornment';
+import { filledInputClasses } from '@mui/material/FilledInput';
+
+import { countries } from 'src/assets/data';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function CountrySelect({
+ label,
+ error,
+ helperText,
+ hiddenLabel,
+ placeholder,
+ ...other
+}) {
+ const { multiple } = other;
+
+ return (
+ {
+ const country = getCountry(option);
+
+ if (!country.label) {
+ return null;
+ }
+
+ return (
+
+
+ {country.label} ({country.code}) +{country.phone}
+
+ );
+ }}
+ renderInput={(params) => {
+ const country = getCountry(params.inputProps.value);
+
+ const baseField = {
+ ...params,
+ label,
+ placeholder,
+ error: !!error,
+ helperText,
+ hiddenLabel,
+ inputProps: {
+ ...params.inputProps,
+ autoComplete: 'new-password',
+ },
+ };
+
+ if (multiple) {
+ return ;
+ }
+
+ return (
+
+
+
+ ),
+ }}
+ sx={{
+ ...(!hiddenLabel && {
+ [`& .${filledInputClasses.root}`]: {
+ '& .component-iconify': {
+ mt: -2,
+ },
+ },
+ }),
+ }}
+ />
+ );
+ }}
+ renderTags={(selected, getTagProps) =>
+ selected.map((option, index) => {
+ const country = getCountry(option);
+
+ return (
+ }
+ size="small"
+ variant="soft"
+ />
+ );
+ })
+ }
+ {...other}
+ />
+ );
+}
+
+CountrySelect.propTypes = {
+ error: PropTypes.bool,
+ label: PropTypes.string,
+ helperText: PropTypes.node,
+ hiddenLabel: PropTypes.bool,
+ placeholder: PropTypes.string,
+};
+
+// ----------------------------------------------------------------------
+
+export function getCountry(inputValue) {
+ const option = countries.filter((country) => country.label === inputValue)[0];
+
+ return {
+ ...option,
+ };
+}
diff --git a/template/src/components/country-select/index.js b/template/src/components/country-select/index.js
new file mode 100644
index 0000000..b11067a
--- /dev/null
+++ b/template/src/components/country-select/index.js
@@ -0,0 +1 @@
+export { default } from './country-select';
diff --git a/template/src/components/custom-breadcrumbs/custom-breadcrumbs.jsx b/template/src/components/custom-breadcrumbs/custom-breadcrumbs.jsx
new file mode 100644
index 0000000..92ec173
--- /dev/null
+++ b/template/src/components/custom-breadcrumbs/custom-breadcrumbs.jsx
@@ -0,0 +1,97 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import Breadcrumbs from '@mui/material/Breadcrumbs';
+
+import LinkItem from './link-item';
+
+// ----------------------------------------------------------------------
+
+export default function CustomBreadcrumbs({
+ links,
+ action,
+ heading,
+ moreLink,
+ activeLast,
+ sx,
+ ...other
+}) {
+ const lastLink = links[links.length - 1].name;
+
+ return (
+
+
+
+ {/* HEADING */}
+ {heading && (
+
+ {heading}
+
+ )}
+
+ {/* BREADCRUMBS */}
+ {!!links.length && (
+ } {...other}>
+ {links.map((link) => (
+
+ ))}
+
+ )}
+
+
+ {action && {action} }
+
+
+ {/* MORE LINK */}
+ {!!moreLink && (
+
+ {moreLink.map((href) => (
+
+ {href}
+
+ ))}
+
+ )}
+
+ );
+}
+
+CustomBreadcrumbs.propTypes = {
+ action: PropTypes.node,
+ activeLast: PropTypes.bool,
+ heading: PropTypes.string,
+ links: PropTypes.array,
+ moreLink: PropTypes.array,
+ sx: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function Separator() {
+ return (
+
+ );
+}
diff --git a/template/src/components/custom-breadcrumbs/index.js b/template/src/components/custom-breadcrumbs/index.js
new file mode 100644
index 0000000..aef6601
--- /dev/null
+++ b/template/src/components/custom-breadcrumbs/index.js
@@ -0,0 +1 @@
+export { default } from './custom-breadcrumbs';
diff --git a/template/src/components/custom-breadcrumbs/link-item.jsx b/template/src/components/custom-breadcrumbs/link-item.jsx
new file mode 100644
index 0000000..c3516fa
--- /dev/null
+++ b/template/src/components/custom-breadcrumbs/link-item.jsx
@@ -0,0 +1,62 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+
+import { RouterLink } from 'src/routes/components';
+
+// ----------------------------------------------------------------------
+
+export default function BreadcrumbsLink({ link, activeLast, disabled }) {
+ const styles = {
+ typography: 'body2',
+ alignItems: 'center',
+ color: 'text.primary',
+ display: 'inline-flex',
+ ...(disabled &&
+ !activeLast && {
+ cursor: 'default',
+ pointerEvents: 'none',
+ color: 'text.disabled',
+ }),
+ };
+
+ const renderContent = (
+ <>
+ {link.icon && (
+
+ {link.icon}
+
+ )}
+
+ {link.name}
+ >
+ );
+
+ if (link.href) {
+ return (
+
+ {renderContent}
+
+ );
+ }
+
+ return {renderContent} ;
+}
+
+BreadcrumbsLink.propTypes = {
+ activeLast: PropTypes.bool,
+ disabled: PropTypes.bool,
+ link: PropTypes.shape({
+ href: PropTypes.string,
+ icon: PropTypes.node,
+ name: PropTypes.string,
+ }),
+};
diff --git a/template/src/components/hook-form/form-provider.jsx b/template/src/components/hook-form/form-provider.jsx
new file mode 100644
index 0000000..ec44751
--- /dev/null
+++ b/template/src/components/hook-form/form-provider.jsx
@@ -0,0 +1,18 @@
+import PropTypes from 'prop-types';
+import { FormProvider as Form } from 'react-hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function FormProvider({ children, onSubmit, methods }) {
+ return (
+
+
+ );
+}
+
+FormProvider.propTypes = {
+ children: PropTypes.node,
+ methods: PropTypes.object,
+ onSubmit: PropTypes.func,
+};
diff --git a/template/src/components/hook-form/index.js b/template/src/components/hook-form/index.js
new file mode 100644
index 0000000..245051e
--- /dev/null
+++ b/template/src/components/hook-form/index.js
@@ -0,0 +1,10 @@
+export * from './rhf-select';
+export * from './rhf-checkbox';
+
+export { default } from './form-provider';
+export { default as RHFCode } from './rhf-code';
+export { default as RHFSlider } from './rhf-slider';
+export { default as RHFSwitch } from './rhf-switch';
+export { default as RHFTextField } from './rhf-text-field';
+export { default as RHFRadioGroup } from './rhf-radio-group';
+export { default as RHFAutocomplete } from './rhf-autocomplete';
diff --git a/template/src/components/hook-form/rhf-autocomplete.jsx b/template/src/components/hook-form/rhf-autocomplete.jsx
new file mode 100644
index 0000000..b7af8d3
--- /dev/null
+++ b/template/src/components/hook-form/rhf-autocomplete.jsx
@@ -0,0 +1,177 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Chip from '@mui/material/Chip';
+import TextField from '@mui/material/TextField';
+import Autocomplete from '@mui/material/Autocomplete';
+import InputAdornment from '@mui/material/InputAdornment';
+import { filledInputClasses } from '@mui/material/FilledInput';
+
+import { countries } from 'src/assets/data';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function RHFAutocomplete({
+ name,
+ label,
+ type,
+ helperText,
+ hiddenLabel,
+ placeholder,
+ ...other
+}) {
+ const { control, setValue } = useFormContext();
+
+ const { multiple } = other;
+
+ return (
+ {
+ if (type === 'country') {
+ return (
+ setValue(name, newValue, { shouldValidate: true })}
+ renderOption={(props, option) => {
+ const country = getCountry(option);
+
+ if (!country.label) {
+ return null;
+ }
+
+ return (
+
+
+ {country.label} ({country.code}) +{country.phone}
+
+ );
+ }}
+ renderInput={(params) => {
+ const country = getCountry(params.inputProps.value);
+
+ const baseField = {
+ ...params,
+ label,
+ hiddenLabel,
+ placeholder,
+ error: !!error,
+ helperText: error ? error?.message : helperText,
+ inputProps: {
+ ...params.inputProps,
+ autoComplete: 'new-password',
+ },
+ };
+
+ if (multiple) {
+ return ;
+ }
+
+ return (
+
+
+
+ ),
+ }}
+ sx={{
+ ...(!hiddenLabel && {
+ [`& .${filledInputClasses.root}`]: {
+ '& .component-iconify': {
+ mt: -2,
+ },
+ },
+ }),
+ }}
+ />
+ );
+ }}
+ renderTags={(selected, getTagProps) =>
+ selected.map((option, index) => {
+ const country = getCountry(option);
+
+ return (
+ }
+ size="small"
+ variant="soft"
+ />
+ );
+ })
+ }
+ {...other}
+ />
+ );
+ }
+
+ return (
+ setValue(name, newValue, { shouldValidate: true })}
+ renderInput={(params) => (
+
+ )}
+ {...other}
+ />
+ );
+ }}
+ />
+ );
+}
+
+RHFAutocomplete.propTypes = {
+ name: PropTypes.string,
+ type: PropTypes.string,
+ label: PropTypes.string,
+ helperText: PropTypes.node,
+ hiddenLabel: PropTypes.bool,
+ placeholder: PropTypes.string,
+};
+
+// ----------------------------------------------------------------------
+
+export function getCountry(inputValue) {
+ const option = countries.filter((country) => country.label === inputValue)[0];
+
+ return {
+ ...option,
+ };
+}
diff --git a/template/src/components/hook-form/rhf-checkbox.jsx b/template/src/components/hook-form/rhf-checkbox.jsx
new file mode 100644
index 0000000..03056ff
--- /dev/null
+++ b/template/src/components/hook-form/rhf-checkbox.jsx
@@ -0,0 +1,113 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Checkbox from '@mui/material/Checkbox';
+import FormGroup from '@mui/material/FormGroup';
+import FormLabel from '@mui/material/FormLabel';
+import FormControl from '@mui/material/FormControl';
+import FormHelperText from '@mui/material/FormHelperText';
+import FormControlLabel, { formControlLabelClasses } from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+export function RHFCheckbox({ name, helperText, ...other }) {
+ const { control } = useFormContext();
+
+ return (
+ (
+
+ } {...other} />
+
+ {(!!error || helperText) && (
+ {error ? error?.message : helperText}
+ )}
+
+ )}
+ />
+ );
+}
+
+RHFCheckbox.propTypes = {
+ helperText: PropTypes.string,
+ name: PropTypes.string,
+};
+
+// ----------------------------------------------------------------------
+
+export function RHFMultiCheckbox({ row, name, label, options, spacing, helperText, sx, ...other }) {
+ const { control } = useFormContext();
+
+ const getSelected = (selectedItems, item) =>
+ selectedItems.includes(item)
+ ? selectedItems.filter((value) => value !== item)
+ : [...selectedItems, item];
+
+ return (
+ (
+
+ {label && (
+
+ {label}
+
+ )}
+
+
+ {options.map((option) => (
+ field.onChange(getSelected(field.value, option.value))}
+ />
+ }
+ label={option.label}
+ {...other}
+ />
+ ))}
+
+
+ {(!!error || helperText) && (
+
+ {error ? error?.message : helperText}
+
+ )}
+
+ )}
+ />
+ );
+}
+
+RHFMultiCheckbox.propTypes = {
+ helperText: PropTypes.string,
+ label: PropTypes.string,
+ name: PropTypes.string,
+ options: PropTypes.array,
+ row: PropTypes.bool,
+ spacing: PropTypes.number,
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/hook-form/rhf-code.jsx b/template/src/components/hook-form/rhf-code.jsx
new file mode 100644
index 0000000..6a31430
--- /dev/null
+++ b/template/src/components/hook-form/rhf-code.jsx
@@ -0,0 +1,43 @@
+import PropTypes from 'prop-types';
+import { MuiOtpInput } from 'mui-one-time-password-input';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import FormHelperText from '@mui/material/FormHelperText';
+
+// ----------------------------------------------------------------------
+
+export default function RHFCode({ name, ...other }) {
+ const { control } = useFormContext();
+
+ return (
+ (
+
+
+
+ {error && (
+
+ {error.message}
+
+ )}
+
+ )}
+ />
+ );
+}
+
+RHFCode.propTypes = {
+ name: PropTypes.string,
+};
diff --git a/template/src/components/hook-form/rhf-radio-group.jsx b/template/src/components/hook-form/rhf-radio-group.jsx
new file mode 100644
index 0000000..7e661fd
--- /dev/null
+++ b/template/src/components/hook-form/rhf-radio-group.jsx
@@ -0,0 +1,78 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Radio from '@mui/material/Radio';
+import FormLabel from '@mui/material/FormLabel';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControl from '@mui/material/FormControl';
+import FormHelperText from '@mui/material/FormHelperText';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+export default function RHFRadioGroup({
+ row,
+ name,
+ label,
+ options,
+ spacing,
+ helperText,
+ ...other
+}) {
+ const { control } = useFormContext();
+
+ const labelledby = label ? `${name}-${label}` : '';
+
+ return (
+ (
+
+ {label && (
+
+ {label}
+
+ )}
+
+
+ {options.map((option) => (
+ }
+ label={option.label}
+ sx={{
+ '&:not(:last-of-type)': {
+ mb: spacing || 0,
+ },
+ ...(row && {
+ mr: 0,
+ '&:not(:last-of-type)': {
+ mr: spacing || 2,
+ },
+ }),
+ }}
+ />
+ ))}
+
+
+ {(!!error || helperText) && (
+
+ {error ? error?.message : helperText}
+
+ )}
+
+ )}
+ />
+ );
+}
+
+RHFRadioGroup.propTypes = {
+ helperText: PropTypes.string,
+ label: PropTypes.string,
+ name: PropTypes.string,
+ options: PropTypes.array,
+ row: PropTypes.bool,
+ spacing: PropTypes.number,
+};
diff --git a/template/src/components/hook-form/rhf-select.jsx b/template/src/components/hook-form/rhf-select.jsx
new file mode 100644
index 0000000..e2fbf00
--- /dev/null
+++ b/template/src/components/hook-form/rhf-select.jsx
@@ -0,0 +1,151 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Box from '@mui/material/Box';
+import Chip from '@mui/material/Chip';
+import Select from '@mui/material/Select';
+import Checkbox from '@mui/material/Checkbox';
+import MenuItem from '@mui/material/MenuItem';
+import TextField from '@mui/material/TextField';
+import InputLabel from '@mui/material/InputLabel';
+import FormControl from '@mui/material/FormControl';
+import FormHelperText from '@mui/material/FormHelperText';
+
+// ----------------------------------------------------------------------
+
+export function RHFSelect({
+ name,
+ native,
+ maxHeight = 220,
+ helperText,
+ children,
+ PaperPropsSx,
+ ...other
+}) {
+ const { control } = useFormContext();
+
+ return (
+ (
+
+ {children}
+
+ )}
+ />
+ );
+}
+
+RHFSelect.propTypes = {
+ PaperPropsSx: PropTypes.object,
+ children: PropTypes.node,
+ helperText: PropTypes.object,
+ maxHeight: PropTypes.number,
+ name: PropTypes.string,
+ native: PropTypes.bool,
+};
+
+// ----------------------------------------------------------------------
+
+export function RHFMultiSelect({
+ name,
+ chip,
+ label,
+ options,
+ checkbox,
+ placeholder,
+ helperText,
+ ...other
+}) {
+ const { control } = useFormContext();
+
+ const renderValues = (selectedIds) => {
+ const selectedItems = options.filter((item) => selectedIds.includes(item.value));
+
+ if (!selectedItems.length && placeholder) {
+ return {placeholder} ;
+ }
+
+ if (chip) {
+ return (
+
+ {selectedItems.map((item) => (
+
+ ))}
+
+ );
+ }
+
+ return selectedItems.map((item) => item.label).join(', ');
+ };
+
+ return (
+ (
+
+ {label && {label} }
+
+
+ {options.map((option) => {
+ const selected = field.value.includes(option.value);
+
+ return (
+
+ {checkbox && }
+
+ {option.label}
+
+ );
+ })}
+
+
+ {(!!error || helperText) && (
+ {error ? error?.message : helperText}
+ )}
+
+ )}
+ />
+ );
+}
+
+RHFMultiSelect.propTypes = {
+ checkbox: PropTypes.bool,
+ chip: PropTypes.bool,
+ helperText: PropTypes.object,
+ label: PropTypes.string,
+ name: PropTypes.string,
+ options: PropTypes.array,
+ placeholder: PropTypes.string,
+};
diff --git a/template/src/components/hook-form/rhf-slider.jsx b/template/src/components/hook-form/rhf-slider.jsx
new file mode 100644
index 0000000..c3fe28e
--- /dev/null
+++ b/template/src/components/hook-form/rhf-slider.jsx
@@ -0,0 +1,32 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Slider from '@mui/material/Slider';
+import FormHelperText from '@mui/material/FormHelperText';
+
+// ----------------------------------------------------------------------
+
+export default function RHFSlider({ name, helperText, ...other }) {
+ const { control } = useFormContext();
+
+ return (
+ (
+ <>
+
+
+ {(!!error || helperText) && (
+ {error ? error?.message : helperText}
+ )}
+ >
+ )}
+ />
+ );
+}
+
+RHFSlider.propTypes = {
+ helperText: PropTypes.string,
+ name: PropTypes.string,
+};
diff --git a/template/src/components/hook-form/rhf-switch.jsx b/template/src/components/hook-form/rhf-switch.jsx
new file mode 100644
index 0000000..ce9928e
--- /dev/null
+++ b/template/src/components/hook-form/rhf-switch.jsx
@@ -0,0 +1,33 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Switch from '@mui/material/Switch';
+import FormHelperText from '@mui/material/FormHelperText';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+export default function RHFSwitch({ name, helperText, ...other }) {
+ const { control } = useFormContext();
+
+ return (
+ (
+
+ } {...other} />
+
+ {(!!error || helperText) && (
+ {error ? error?.message : helperText}
+ )}
+
+ )}
+ />
+ );
+}
+
+RHFSwitch.propTypes = {
+ helperText: PropTypes.string,
+ name: PropTypes.string,
+};
diff --git a/template/src/components/hook-form/rhf-text-field.jsx b/template/src/components/hook-form/rhf-text-field.jsx
new file mode 100644
index 0000000..a43e399
--- /dev/null
+++ b/template/src/components/hook-form/rhf-text-field.jsx
@@ -0,0 +1,41 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import TextField from '@mui/material/TextField';
+
+// ----------------------------------------------------------------------
+
+export default function RHFTextField({ name, helperText, type, ...other }) {
+ const { control } = useFormContext();
+
+ return (
+ (
+ {
+ if (type === 'number') {
+ field.onChange(Number(event.target.value));
+ } else {
+ field.onChange(event.target.value);
+ }
+ }}
+ error={!!error}
+ helperText={error ? error?.message : helperText}
+ {...other}
+ />
+ )}
+ />
+ );
+}
+
+RHFTextField.propTypes = {
+ helperText: PropTypes.object,
+ name: PropTypes.string,
+ type: PropTypes.string,
+};
diff --git a/template/src/components/iconify/iconify.jsx b/template/src/components/iconify/iconify.jsx
new file mode 100644
index 0000000..6d25190
--- /dev/null
+++ b/template/src/components/iconify/iconify.jsx
@@ -0,0 +1,27 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+// icons
+import { Icon } from '@iconify/react';
+
+import Box from '@mui/material/Box';
+
+// ----------------------------------------------------------------------
+
+const Iconify = forwardRef(({ icon, width = 20, sx, ...other }, ref) => (
+
+));
+
+Iconify.propTypes = {
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ sx: PropTypes.object,
+ width: PropTypes.number,
+};
+
+export default Iconify;
diff --git a/template/src/components/iconify/index.js b/template/src/components/iconify/index.js
new file mode 100644
index 0000000..f3bf213
--- /dev/null
+++ b/template/src/components/iconify/index.js
@@ -0,0 +1 @@
+export { default } from './iconify';
diff --git a/template/src/components/image/image.jsx b/template/src/components/image/image.jsx
new file mode 100644
index 0000000..dbded8d
--- /dev/null
+++ b/template/src/components/image/image.jsx
@@ -0,0 +1,139 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+import { LazyLoadImage } from 'react-lazy-load-image-component';
+
+import Box from '@mui/material/Box';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { getRatio } from './utils';
+
+// ----------------------------------------------------------------------
+
+const Image = forwardRef(
+ (
+ {
+ ratio,
+ overlay,
+ disabledEffect = false,
+ alt,
+ src,
+ afterLoad,
+ delayTime,
+ threshold,
+ beforeLoad,
+ delayMethod,
+ placeholder,
+ wrapperProps,
+ scrollPosition,
+ effect = 'blur',
+ visibleByDefault,
+ wrapperClassName,
+ useIntersectionObserver,
+ sx,
+ ...other
+ },
+ ref
+ ) => {
+ const theme = useTheme();
+
+ const overlayStyles = !!overlay && {
+ '&:before': {
+ content: "''",
+ top: 0,
+ left: 0,
+ width: 1,
+ height: 1,
+ zIndex: 1,
+ position: 'absolute',
+ background: overlay || alpha(theme.palette.grey[900], 0.48),
+ },
+ };
+
+ const content = (
+
+ );
+
+ return (
+
+ {content}
+
+ );
+ }
+);
+
+Image.propTypes = {
+ afterLoad: PropTypes.func,
+ alt: PropTypes.string,
+ beforeLoad: PropTypes.func,
+ delayMethod: PropTypes.string,
+ delayTime: PropTypes.number,
+ disabledEffect: PropTypes.bool,
+ effect: PropTypes.string,
+ overlay: PropTypes.string,
+ placeholder: PropTypes.element,
+ ratio: PropTypes.oneOf(['4/3', '3/4', '6/4', '4/6', '16/9', '9/16', '21/9', '9/21', '1/1']),
+ scrollPosition: PropTypes.object,
+ src: PropTypes.string,
+ sx: PropTypes.object,
+ threshold: PropTypes.number,
+ useIntersectionObserver: PropTypes.bool,
+ visibleByDefault: PropTypes.bool,
+ wrapperClassName: PropTypes.string,
+ wrapperProps: PropTypes.object,
+};
+
+export default Image;
diff --git a/template/src/components/image/index.js b/template/src/components/image/index.js
new file mode 100644
index 0000000..e566717
--- /dev/null
+++ b/template/src/components/image/index.js
@@ -0,0 +1 @@
+export { default } from './image';
diff --git a/template/src/components/image/utils.js b/template/src/components/image/utils.js
new file mode 100644
index 0000000..61abac4
--- /dev/null
+++ b/template/src/components/image/utils.js
@@ -0,0 +1,15 @@
+// ----------------------------------------------------------------------
+
+export function getRatio(ratio = '1/1') {
+ return {
+ '4/3': 'calc(100% / 4 * 3)',
+ '3/4': 'calc(100% / 3 * 4)',
+ '6/4': 'calc(100% / 6 * 4)',
+ '4/6': 'calc(100% / 4 * 6)',
+ '16/9': 'calc(100% / 16 * 9)',
+ '9/16': 'calc(100% / 9 * 16)',
+ '21/9': 'calc(100% / 21 * 9)',
+ '9/21': 'calc(100% / 9 * 21)',
+ '1/1': '100%',
+ }[ratio];
+}
diff --git a/template/src/components/label/index.js b/template/src/components/label/index.js
new file mode 100644
index 0000000..16a9e79
--- /dev/null
+++ b/template/src/components/label/index.js
@@ -0,0 +1 @@
+export { default } from './label';
diff --git a/template/src/components/label/label.jsx b/template/src/components/label/label.jsx
new file mode 100644
index 0000000..ae2b36d
--- /dev/null
+++ b/template/src/components/label/label.jsx
@@ -0,0 +1,61 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import { useTheme } from '@mui/material/styles';
+
+import { StyledLabel } from './styles';
+
+// ----------------------------------------------------------------------
+
+const Label = forwardRef(
+ ({ children, color = 'default', variant = 'soft', startIcon, endIcon, sx, ...other }, ref) => {
+ const theme = useTheme();
+
+ const iconStyles = {
+ width: 16,
+ height: 16,
+ '& svg, img': { width: 1, height: 1, objectFit: 'cover' },
+ };
+
+ return (
+
+ {startIcon && {startIcon} }
+
+ {children}
+
+ {endIcon && {endIcon} }
+
+ );
+ }
+);
+
+Label.propTypes = {
+ children: PropTypes.node,
+ color: PropTypes.oneOf([
+ 'default',
+ 'primary',
+ 'secondary',
+ 'info',
+ 'success',
+ 'warning',
+ 'error',
+ ]),
+ endIcon: PropTypes.object,
+ startIcon: PropTypes.object,
+ sx: PropTypes.object,
+ variant: PropTypes.oneOf(['filled', 'outlined', 'ghost', 'soft']),
+};
+
+export default Label;
diff --git a/template/src/components/label/styles.js b/template/src/components/label/styles.js
new file mode 100644
index 0000000..a2589de
--- /dev/null
+++ b/template/src/components/label/styles.js
@@ -0,0 +1,77 @@
+import Box from '@mui/material/Box';
+import { alpha, styled } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+export const StyledLabel = styled(Box)(({ theme, ownerState }) => {
+ const lightMode = theme.palette.mode === 'light';
+
+ const filledVariant = ownerState.variant === 'filled';
+
+ const outlinedVariant = ownerState.variant === 'outlined';
+
+ const softVariant = ownerState.variant === 'soft';
+
+ const defaultStyle = {
+ ...(ownerState.color === 'default' && {
+ // FILLED
+ ...(filledVariant && {
+ color: lightMode ? theme.palette.common.white : theme.palette.grey[800],
+ backgroundColor: theme.palette.text.primary,
+ }),
+ // OUTLINED
+ ...(outlinedVariant && {
+ backgroundColor: 'transparent',
+ color: theme.palette.text.primary,
+ border: `2px solid ${theme.palette.text.primary}`,
+ }),
+ // SOFT
+ ...(softVariant && {
+ color: theme.palette.text.secondary,
+ backgroundColor: alpha(theme.palette.grey[500], 0.16),
+ }),
+ }),
+ };
+
+ const colorStyle = {
+ ...(ownerState.color !== 'default' && {
+ // FILLED
+ ...(filledVariant && {
+ color: theme.palette[ownerState.color].contrastText,
+ backgroundColor: theme.palette[ownerState.color].main,
+ }),
+ // OUTLINED
+ ...(outlinedVariant && {
+ backgroundColor: 'transparent',
+ color: theme.palette[ownerState.color].main,
+ border: `2px solid ${theme.palette[ownerState.color].main}`,
+ }),
+ // SOFT
+ ...(softVariant && {
+ color: theme.palette[ownerState.color][lightMode ? 'dark' : 'light'],
+ backgroundColor: alpha(theme.palette[ownerState.color].main, 0.16),
+ }),
+ }),
+ };
+
+ return {
+ height: 24,
+ minWidth: 24,
+ lineHeight: 0,
+ borderRadius: 6,
+ cursor: 'default',
+ alignItems: 'center',
+ whiteSpace: 'nowrap',
+ display: 'inline-flex',
+ justifyContent: 'center',
+ textTransform: 'capitalize',
+ padding: theme.spacing(0, 0.75),
+ fontSize: theme.typography.pxToRem(12),
+ fontWeight: theme.typography.fontWeightBold,
+ transition: theme.transitions.create('all', {
+ duration: theme.transitions.duration.shorter,
+ }),
+ ...defaultStyle,
+ ...colorStyle,
+ };
+});
diff --git a/template/src/components/lightbox/index.js b/template/src/components/lightbox/index.js
new file mode 100644
index 0000000..e141b55
--- /dev/null
+++ b/template/src/components/lightbox/index.js
@@ -0,0 +1,5 @@
+export * from 'yet-another-react-lightbox';
+
+export { default } from './lightbox';
+
+export { default as useLightbox } from './use-light-box';
diff --git a/template/src/components/lightbox/lightbox.jsx b/template/src/components/lightbox/lightbox.jsx
new file mode 100644
index 0000000..065aa4d
--- /dev/null
+++ b/template/src/components/lightbox/lightbox.jsx
@@ -0,0 +1,152 @@
+import PropTypes from 'prop-types';
+import Zoom from 'yet-another-react-lightbox/plugins/zoom';
+import Video from 'yet-another-react-lightbox/plugins/video';
+import Captions from 'yet-another-react-lightbox/plugins/captions';
+import Slideshow from 'yet-another-react-lightbox/plugins/slideshow';
+import Fullscreen from 'yet-another-react-lightbox/plugins/fullscreen';
+import Thumbnails from 'yet-another-react-lightbox/plugins/thumbnails';
+import ReactLightbox, { useLightboxState } from 'yet-another-react-lightbox';
+
+import Box from '@mui/material/Box';
+
+import Iconify from '../iconify';
+import StyledLightbox from './styles';
+
+// ----------------------------------------------------------------------
+
+export default function Lightbox({
+ slides,
+ disabledZoom,
+ disabledVideo,
+ disabledTotal,
+ disabledCaptions,
+ disabledSlideshow,
+ disabledThumbnails,
+ disabledFullscreen,
+ onGetCurrentIndex,
+ ...other
+}) {
+ const totalItems = slides ? slides.length : 0;
+
+ return (
+ <>
+
+
+ {
+ if (onGetCurrentIndex) {
+ onGetCurrentIndex(index);
+ }
+ },
+ }}
+ toolbar={{
+ buttons: [
+ ,
+ 'close',
+ ],
+ }}
+ render={{
+ iconClose: () => ,
+ iconZoomIn: () => ,
+ iconZoomOut: () => ,
+ iconSlideshowPlay: () => ,
+ iconSlideshowPause: () => ,
+ iconPrev: () => ,
+ iconNext: () => ,
+ iconExitFullscreen: () => ,
+ iconEnterFullscreen: () => ,
+ }}
+ {...other}
+ />
+ >
+ );
+}
+
+Lightbox.propTypes = {
+ disabledCaptions: PropTypes.bool,
+ disabledFullscreen: PropTypes.bool,
+ disabledSlideshow: PropTypes.bool,
+ disabledThumbnails: PropTypes.bool,
+ disabledTotal: PropTypes.bool,
+ disabledVideo: PropTypes.bool,
+ disabledZoom: PropTypes.bool,
+ onGetCurrentIndex: PropTypes.func,
+ slides: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+export function getPlugins({
+ disabledZoom,
+ disabledVideo,
+ disabledCaptions,
+ disabledSlideshow,
+ disabledThumbnails,
+ disabledFullscreen,
+}) {
+ let plugins = [Captions, Fullscreen, Slideshow, Thumbnails, Video, Zoom];
+
+ if (disabledThumbnails) {
+ plugins = plugins.filter((plugin) => plugin !== Thumbnails);
+ }
+ if (disabledCaptions) {
+ plugins = plugins.filter((plugin) => plugin !== Captions);
+ }
+ if (disabledFullscreen) {
+ plugins = plugins.filter((plugin) => plugin !== Fullscreen);
+ }
+ if (disabledSlideshow) {
+ plugins = plugins.filter((plugin) => plugin !== Slideshow);
+ }
+ if (disabledZoom) {
+ plugins = plugins.filter((plugin) => plugin !== Zoom);
+ }
+ if (disabledVideo) {
+ plugins = plugins.filter((plugin) => plugin !== Video);
+ }
+
+ return plugins;
+}
+
+// ----------------------------------------------------------------------
+
+export function DisplayTotal({ totalItems, disabledTotal }) {
+ const { currentIndex } = useLightboxState();
+
+ if (disabledTotal) {
+ return null;
+ }
+
+ return (
+
+ {currentIndex + 1} / {totalItems}
+
+ );
+}
+
+DisplayTotal.propTypes = {
+ disabledTotal: PropTypes.bool,
+ totalItems: PropTypes.number,
+};
diff --git a/template/src/components/lightbox/styles.jsx b/template/src/components/lightbox/styles.jsx
new file mode 100644
index 0000000..57199e2
--- /dev/null
+++ b/template/src/components/lightbox/styles.jsx
@@ -0,0 +1,52 @@
+import GlobalStyles from '@mui/material/GlobalStyles';
+import { alpha, useTheme } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+export default function StyledLightbox() {
+ const theme = useTheme();
+
+ const inputGlobalStyles = (
+
+ );
+
+ return inputGlobalStyles;
+}
diff --git a/template/src/components/lightbox/use-light-box.js b/template/src/components/lightbox/use-light-box.js
new file mode 100644
index 0000000..15c9678
--- /dev/null
+++ b/template/src/components/lightbox/use-light-box.js
@@ -0,0 +1,30 @@
+import { useState, useCallback } from 'react';
+
+// ----------------------------------------------------------------------
+
+export default function useLightbox(slides) {
+ const [selected, setSelected] = useState(-1);
+
+ const handleOpen = useCallback(
+ (slideUrl) => {
+ const slideIndex = slides.findIndex((slide) =>
+ slide.type === 'video' ? slide.poster === slideUrl : slide.src === slideUrl
+ );
+
+ setSelected(slideIndex);
+ },
+ [slides]
+ );
+
+ const handleClose = useCallback(() => {
+ setSelected(-1);
+ }, []);
+
+ return {
+ selected,
+ open: selected >= 0,
+ onOpen: handleOpen,
+ onClose: handleClose,
+ setSelected,
+ };
+}
diff --git a/template/src/components/loading-screen/index.js b/template/src/components/loading-screen/index.js
new file mode 100644
index 0000000..480d3a5
--- /dev/null
+++ b/template/src/components/loading-screen/index.js
@@ -0,0 +1 @@
+export { default as SplashScreen } from './splash-screen';
diff --git a/template/src/components/loading-screen/splash-screen.jsx b/template/src/components/loading-screen/splash-screen.jsx
new file mode 100644
index 0000000..b45644f
--- /dev/null
+++ b/template/src/components/loading-screen/splash-screen.jsx
@@ -0,0 +1,61 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import { useTheme } from '@mui/material/styles';
+
+import { bgBlur } from 'src/theme/css';
+
+import Logo from '../logo';
+
+// ----------------------------------------------------------------------
+
+export default function SplashScreen({ sx, ...other }) {
+ const theme = useTheme();
+
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+}
+
+SplashScreen.propTypes = {
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/logo/index.js b/template/src/components/logo/index.js
new file mode 100644
index 0000000..f0d8afd
--- /dev/null
+++ b/template/src/components/logo/index.js
@@ -0,0 +1 @@
+export { default } from './logo';
diff --git a/template/src/components/logo/logo.jsx b/template/src/components/logo/logo.jsx
new file mode 100644
index 0000000..ded59d4
--- /dev/null
+++ b/template/src/components/logo/logo.jsx
@@ -0,0 +1,77 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import { useTheme } from '@mui/material/styles';
+
+import { RouterLink } from 'src/routes/components';
+
+// ----------------------------------------------------------------------
+
+function Logo({ single = false, sx }) {
+ const theme = useTheme();
+
+ const PRIMARY_MAIN = theme.palette.primary.main;
+
+ const singleLogo = (
+
+
+
+
+ );
+
+ const fullLogo = (
+
+
+
+
+ );
+
+ return (
+
+
+ {single ? singleLogo : fullLogo}
+
+
+ );
+}
+
+Logo.propTypes = {
+ single: PropTypes.bool,
+ sx: PropTypes.object,
+};
+
+export default memo(Logo);
diff --git a/template/src/components/map/index.js b/template/src/components/map/index.js
new file mode 100644
index 0000000..db1ba19
--- /dev/null
+++ b/template/src/components/map/index.js
@@ -0,0 +1 @@
+export { default } from './map';
diff --git a/template/src/components/map/map-marker.jsx b/template/src/components/map/map-marker.jsx
new file mode 100644
index 0000000..0aeb108
--- /dev/null
+++ b/template/src/components/map/map-marker.jsx
@@ -0,0 +1,36 @@
+/* eslint-disable unused-imports/no-unused-vars */
+import PropTypes from 'prop-types';
+import { useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import SvgIcon from '@mui/material/SvgIcon';
+
+// ----------------------------------------------------------------------
+
+export default function MapMarker({ onOpen, lat, lng }) {
+ const handleOpen = useCallback(
+ (event) => {
+ event.stopPropagation();
+ onOpen();
+ },
+ [onOpen]
+ );
+
+ return (
+
+
+
+
+
+ );
+}
+
+MapMarker.propTypes = {
+ lat: PropTypes.number,
+ lng: PropTypes.number,
+ onOpen: PropTypes.func,
+};
diff --git a/template/src/components/map/map-popup.jsx b/template/src/components/map/map-popup.jsx
new file mode 100644
index 0000000..9166223
--- /dev/null
+++ b/template/src/components/map/map-popup.jsx
@@ -0,0 +1,104 @@
+import PropTypes from 'prop-types';
+import { useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import Stack from '@mui/material/Stack';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function MapPopup({ office, onClose, lat, lng }) {
+ const handleClose = useCallback(
+ (event) => {
+ event.stopPropagation();
+ onClose();
+ console.log('lat-lng', lat, lng);
+ },
+ [lat, lng, onClose]
+ );
+
+ return (
+
+
+
+
+
+
+
+ {office.photo && }
+
+
+ {office.country && {office.country} }
+
+ {office.address && (
+
+ {office.address}
+
+ )}
+
+ {office.email && (
+
+
+ {office.email}
+
+ )}
+
+ {office.phoneNumber && (
+
+
+ {office.phoneNumber}
+
+ )}
+
+
+ );
+}
+
+MapPopup.propTypes = {
+ lat: PropTypes.number,
+ lng: PropTypes.number,
+ office: PropTypes.shape({
+ address: PropTypes.string,
+ country: PropTypes.string,
+ email: PropTypes.string,
+ phoneNumber: PropTypes.string,
+ photo: PropTypes.string,
+ }),
+ onClose: PropTypes.func,
+};
diff --git a/template/src/components/map/map.jsx b/template/src/components/map/map.jsx
new file mode 100644
index 0000000..8170ca4
--- /dev/null
+++ b/template/src/components/map/map.jsx
@@ -0,0 +1,71 @@
+import PropTypes from 'prop-types';
+import GoogleMapReact from 'google-map-react';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+
+import { GOOGLE_MAP_API } from 'src/config-global';
+
+import MapPopup from './map-popup';
+import { mapStyle } from './styles';
+import MapMarker from './map-marker';
+
+// ----------------------------------------------------------------------
+
+export default function Map({ offices, sx, ...other }) {
+ const [tooltip, setTooltip] = useState(null);
+
+ const [centerMap, setCenterMap] = useState({
+ lat: offices[0].latlng[0],
+ lng: offices[0].latlng[1],
+ });
+
+ const handleOpen = useCallback(
+ (lat, lng, office) => {
+ setCenterMap({
+ ...centerMap,
+ lat: lat - 32,
+ lng,
+ });
+ setTooltip(office);
+ },
+ [centerMap]
+ );
+
+ return (
+
+
+ {offices.map((office, index) => (
+ handleOpen(office.latlng[0], office.latlng[1], office)}
+ />
+ ))}
+
+ {tooltip && (
+ setTooltip(null)}
+ />
+ )}
+
+
+ );
+}
+
+Map.propTypes = {
+ offices: PropTypes.array,
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/map/styles.js b/template/src/components/map/styles.js
new file mode 100644
index 0000000..dc3ac26
--- /dev/null
+++ b/template/src/components/map/styles.js
@@ -0,0 +1,100 @@
+// ----------------------------------------------------------------------
+
+export const mapStyle = [
+ {
+ featureType: 'administrative',
+ elementType: 'labels.text.fill',
+ stylers: [{ color: '#6195a0' }],
+ },
+ {
+ featureType: 'administrative.province',
+ elementType: 'geometry.stroke',
+ stylers: [{ visibility: 'off' }],
+ },
+ {
+ featureType: 'landscape',
+ elementType: 'geometry',
+ stylers: [{ lightness: '0' }, { saturation: '0' }, { color: '#f5f5f2' }, { gamma: '1' }],
+ },
+ {
+ featureType: 'landscape.man_made',
+ elementType: 'all',
+ stylers: [{ lightness: '-3' }, { gamma: '1.00' }],
+ },
+ {
+ featureType: 'landscape.natural.terrain',
+ elementType: 'all',
+ stylers: [{ visibility: 'off' }],
+ },
+ { featureType: 'poi', elementType: 'all', stylers: [{ visibility: 'off' }] },
+ {
+ featureType: 'poi.park',
+ elementType: 'geometry.fill',
+ stylers: [{ color: '#bae5ce' }, { visibility: 'on' }],
+ },
+ {
+ featureType: 'road',
+ elementType: 'all',
+ stylers: [{ saturation: -100 }, { lightness: 45 }, { visibility: 'simplified' }],
+ },
+ {
+ featureType: 'road.highway',
+ elementType: 'all',
+ stylers: [{ visibility: 'simplified' }],
+ },
+ {
+ featureType: 'road.highway',
+ elementType: 'geometry.fill',
+ stylers: [{ color: '#fac9a9' }, { visibility: 'simplified' }],
+ },
+ {
+ featureType: 'road.highway',
+ elementType: 'labels.text',
+ stylers: [{ color: '#4e4e4e' }],
+ },
+ {
+ featureType: 'road.arterial',
+ elementType: 'labels.text.fill',
+ stylers: [{ color: '#787878' }],
+ },
+ {
+ featureType: 'road.arterial',
+ elementType: 'labels.icon',
+ stylers: [{ visibility: 'off' }],
+ },
+ {
+ featureType: 'transit',
+ elementType: 'all',
+ stylers: [{ visibility: 'simplified' }],
+ },
+ {
+ featureType: 'transit.station.airport',
+ elementType: 'labels.icon',
+ stylers: [{ hue: '#0a00ff' }, { saturation: '-77' }, { gamma: '0.57' }, { lightness: '0' }],
+ },
+ {
+ featureType: 'transit.station.rail',
+ elementType: 'labels.text.fill',
+ stylers: [{ color: '#43321e' }],
+ },
+ {
+ featureType: 'transit.station.rail',
+ elementType: 'labels.icon',
+ stylers: [{ hue: '#ff6c00' }, { lightness: '4' }, { gamma: '0.75' }, { saturation: '-68' }],
+ },
+ {
+ featureType: 'water',
+ elementType: 'all',
+ stylers: [{ color: '#eaf6f8' }, { visibility: 'on' }],
+ },
+ {
+ featureType: 'water',
+ elementType: 'geometry.fill',
+ stylers: [{ color: '#c7eced' }],
+ },
+ {
+ featureType: 'water',
+ elementType: 'labels.text.fill',
+ stylers: [{ lightness: '-49' }, { saturation: '-53' }, { gamma: '0.79' }],
+ },
+];
diff --git a/template/src/components/markdown/index.js b/template/src/components/markdown/index.js
new file mode 100644
index 0000000..6827d73
--- /dev/null
+++ b/template/src/components/markdown/index.js
@@ -0,0 +1 @@
+export { default } from './markdown';
diff --git a/template/src/components/markdown/markdown.jsx b/template/src/components/markdown/markdown.jsx
new file mode 100644
index 0000000..b8b5e0d
--- /dev/null
+++ b/template/src/components/markdown/markdown.jsx
@@ -0,0 +1,21 @@
+import PropTypes from 'prop-types';
+
+import StyledMarkdown from './styles';
+
+// ----------------------------------------------------------------------
+
+export default function Markdown({ content, firstLetter = false, sx }) {
+ return (
+
+ );
+}
+
+Markdown.propTypes = {
+ content: PropTypes.string,
+ firstLetter: PropTypes.bool,
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/markdown/styles.js b/template/src/components/markdown/styles.js
new file mode 100644
index 0000000..ba3d624
--- /dev/null
+++ b/template/src/components/markdown/styles.js
@@ -0,0 +1,151 @@
+import { styled } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+const StyledMarkdown = styled('div', {
+ shouldForwardProp: (prop) => prop !== 'firstLetter',
+})(({ firstLetter, theme }) => ({
+ // Text
+ h1: { margin: 0, ...theme.typography.h1 },
+ h2: { margin: 0, ...theme.typography.h2 },
+ h3: { margin: 0, ...theme.typography.h3 },
+ h4: { margin: 0, ...theme.typography.h4 },
+ h5: { margin: 0, ...theme.typography.h5 },
+ h6: { margin: 0, ...theme.typography.h6 },
+ p: { margin: 0, ...theme.typography.body1 },
+
+ br: {
+ display: 'grid',
+ content: '""',
+ marginTop: '0.75em',
+ },
+
+ // Link
+ a: {
+ color: theme.palette.primary.main,
+ textDecoration: 'none',
+ '&:hover': {
+ textDecoration: 'underline',
+ },
+ },
+
+ // List
+ '& ul, & ol': {
+ margin: 0,
+ '& li': {
+ lineHeight: 2,
+ },
+ },
+
+ // Divider
+ hr: {
+ margin: 0,
+ flexShrink: 0,
+ borderWidth: 0,
+ msFlexNegative: 0,
+ WebkitFlexShrink: 0,
+ borderStyle: 'solid',
+ borderBottomWidth: 'thin',
+ borderColor: theme.palette.divider,
+ },
+
+ // Blockquote
+ '& blockquote': {
+ lineHeight: 1.5,
+ fontSize: '1.5em',
+ margin: '40px auto',
+ position: 'relative',
+ fontFamily: 'Georgia, serif',
+ padding: theme.spacing(3, 3, 3, 8),
+ color: theme.palette.text.secondary,
+ borderRadius: theme.shape.borderRadius * 2,
+ backgroundColor: theme.palette.background.neutral,
+ [theme.breakpoints.up('md')]: {
+ width: '80%',
+ },
+ '& p, & span': {
+ marginBottom: 0,
+ fontSize: 'inherit',
+ fontFamily: 'inherit',
+ },
+ '&:before': {
+ left: 16,
+ top: -8,
+ display: 'block',
+ fontSize: '3em',
+ content: '"\\201C"',
+ position: 'absolute',
+ color: theme.palette.text.disabled,
+ },
+ },
+
+ // Image
+ '& img': {
+ borderRadius: theme.spacing(1),
+ },
+
+ // Table
+ table: {
+ width: '100%',
+ borderCollapse: 'collapse',
+ border: `1px solid ${theme.palette.divider}`,
+ 'th, td': {
+ padding: theme.spacing(1),
+ border: `1px solid ${theme.palette.divider}`,
+ },
+ 'tbody tr:nth-of-type(odd)': {
+ backgroundColor: theme.palette.background.neutral,
+ },
+ },
+
+ // Checkbox
+ input: {
+ '&[type=checkbox]': {
+ position: 'relative',
+ cursor: 'pointer',
+ '&:before': {
+ content: '""',
+ top: -2,
+ left: -2,
+ width: 17,
+ height: 17,
+ borderRadius: 3,
+ position: 'absolute',
+ backgroundColor: theme.palette.grey[theme.palette.mode === 'light' ? 300 : 700],
+ },
+ '&:checked': {
+ '&:before': {
+ backgroundColor: theme.palette.primary.main,
+ },
+ '&:after': {
+ content: '""',
+ top: 1,
+ left: 5,
+ width: 4,
+ height: 9,
+ position: 'absolute',
+ transform: 'rotate(45deg)',
+ msTransform: 'rotate(45deg)',
+ WebkitTransform: 'rotate(45deg)',
+ border: `solid ${theme.palette.common.white}`,
+ borderWidth: '0 2px 2px 0',
+ },
+ },
+ },
+ },
+
+ // First Letter
+ ...(firstLetter && {
+ '& > p:first-of-type': {
+ '&:first-letter': {
+ float: 'left',
+ fontSize: 80,
+ lineHeight: 1,
+ paddingRight: theme.spacing(2),
+ fontWeight: theme.typography.fontWeightBold,
+ },
+ },
+ }),
+}));
+
+export default StyledMarkdown;
diff --git a/template/src/components/mega-menu/common/menu-more-link.jsx b/template/src/components/mega-menu/common/menu-more-link.jsx
new file mode 100644
index 0000000..3ed8775
--- /dev/null
+++ b/template/src/components/mega-menu/common/menu-more-link.jsx
@@ -0,0 +1,33 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+export default function MenuMoreLink({ title, path }) {
+ return (
+
+ {title}
+
+ );
+}
+
+MenuMoreLink.propTypes = {
+ path: PropTypes.string,
+ title: PropTypes.string,
+};
diff --git a/template/src/components/mega-menu/common/menu-products.jsx b/template/src/components/mega-menu/common/menu-products.jsx
new file mode 100644
index 0000000..2742b5d
--- /dev/null
+++ b/template/src/components/mega-menu/common/menu-products.jsx
@@ -0,0 +1,81 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import { useTheme } from '@mui/material/styles';
+
+import { RouterLink } from 'src/routes/components';
+
+import Image from '../../image';
+import TextMaxLine from '../../text-max-line';
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from '../../carousel';
+
+// ----------------------------------------------------------------------
+
+export default function MenuProducts({ products, displayProduct = 8, sx }) {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ slidesToShow: displayProduct,
+ slidesToScroll: displayProduct,
+ ...CarouselDots({
+ sx: { mt: 3 },
+ }),
+ });
+
+ return (
+
+
+
+ {products.map((product) => (
+
+
+
+
+ {product.name}
+
+
+ ))}
+
+
+
+ );
+}
+
+MenuProducts.propTypes = {
+ displayProduct: PropTypes.number,
+ products: PropTypes.array,
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/mega-menu/common/menu-tags.jsx b/template/src/components/mega-menu/common/menu-tags.jsx
new file mode 100644
index 0000000..76be0ef
--- /dev/null
+++ b/template/src/components/mega-menu/common/menu-tags.jsx
@@ -0,0 +1,47 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Typography from '@mui/material/Typography';
+
+import { RouterLink } from 'src/routes/components';
+
+// ----------------------------------------------------------------------
+
+export default function MenuTags({ tags, ...other }) {
+ return (
+
+
+ Hot Products:
+
+
+ {tags.map((tag, index) => (
+ theme.transitions.create(['color']),
+ '&:hover': {
+ color: 'text.primary',
+ },
+ }}
+ >
+ {index === 0 ? tag.title : `, ${tag.title} `}
+
+ ))}
+
+ );
+}
+
+MenuTags.propTypes = {
+ tags: PropTypes.array,
+};
diff --git a/template/src/components/mega-menu/common/nav-sub-list.jsx b/template/src/components/mega-menu/common/nav-sub-list.jsx
new file mode 100644
index 0000000..7565b66
--- /dev/null
+++ b/template/src/components/mega-menu/common/nav-sub-list.jsx
@@ -0,0 +1,64 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import { usePathname } from 'src/routes/hooks';
+import { RouterLink } from 'src/routes/components';
+
+// ----------------------------------------------------------------------
+
+export default function NavSubList({ data, slotProps, ...other }) {
+ const pathname = usePathname();
+
+ return (
+ <>
+ {data.map((list, index) => (
+
+ {list.subheader && (
+
+ {list.subheader}
+
+ )}
+
+ {list.items.map((link) => {
+ const active = pathname === link.path || pathname === `${link.path}/`;
+
+ return (
+ theme.transitions.create('all'),
+ '&:hover': {
+ color: 'text.primary',
+ },
+ ...(active && {
+ color: 'text.primary',
+ textDecoration: 'underline',
+ fontWeight: 'fontWeightSemiBold',
+ }),
+ ...slotProps?.subItem,
+ }}
+ >
+ {link.title}
+
+ );
+ })}
+
+ ))}
+ >
+ );
+}
+
+NavSubList.propTypes = {
+ data: PropTypes.array,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/mega-menu/horizontal/mega-menu-desktop-horizontal.jsx b/template/src/components/mega-menu/horizontal/mega-menu-desktop-horizontal.jsx
new file mode 100644
index 0000000..083e5ad
--- /dev/null
+++ b/template/src/components/mega-menu/horizontal/mega-menu-desktop-horizontal.jsx
@@ -0,0 +1,33 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+export default function MegaMenuDesktopHorizontal({ data, sx, slotProps, ...other }) {
+ return (
+
+ );
+}
+
+MegaMenuDesktopHorizontal.propTypes = {
+ data: PropTypes.array,
+ sx: PropTypes.object,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/mega-menu/horizontal/nav-item.jsx b/template/src/components/mega-menu/horizontal/nav-item.jsx
new file mode 100644
index 0000000..07f6319
--- /dev/null
+++ b/template/src/components/mega-menu/horizontal/nav-item.jsx
@@ -0,0 +1,104 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import { styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ ({ title, path, icon, open, active, hasChild, externalLink, ...other }, ref) => {
+ const renderContent = (
+
+ {icon && (
+
+ {icon}
+
+ )}
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {hasChild && }
+
+ );
+
+ if (externalLink)
+ return (
+
+ {renderContent}
+
+ );
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ active: PropTypes.bool,
+ path: PropTypes.string,
+ icon: PropTypes.element,
+ title: PropTypes.string,
+ hasChild: PropTypes.bool,
+ externalLink: PropTypes.bool,
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, open, theme }) => {
+ const opened = open && !active;
+
+ return {
+ ...theme.typography.body2,
+ padding: 0,
+ minHeight: '100%',
+ fontWeight: theme.typography.fontWeightMedium,
+ transition: theme.transitions.create(['all'], {
+ duration: theme.transitions.duration.shorter,
+ }),
+ '&:hover': {
+ backgroundColor: 'transparent',
+ },
+ '& .icon': {
+ width: 20,
+ height: 20,
+ flexShrink: 0,
+ marginRight: theme.spacing(1),
+ },
+ '& .arrow': {
+ marginLeft: theme.spacing(0.75),
+ },
+ ...(active && {
+ color: theme.palette.primary.main,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ }),
+ ...(opened && {
+ opacity: 0.64,
+ }),
+ };
+});
diff --git a/template/src/components/mega-menu/horizontal/nav-list.jsx b/template/src/components/mega-menu/horizontal/nav-list.jsx
new file mode 100644
index 0000000..3254bb7
--- /dev/null
+++ b/template/src/components/mega-menu/horizontal/nav-list.jsx
@@ -0,0 +1,169 @@
+import PropTypes from 'prop-types';
+import { useRef, useState, useEffect, useCallback } from 'react';
+
+import Masonry from '@mui/lab/Masonry';
+import Stack from '@mui/material/Stack';
+import Popover from '@mui/material/Popover';
+import Divider from '@mui/material/Divider';
+
+import { usePathname, useActiveLink } from 'src/routes/hooks';
+
+import { hideScroll } from 'src/theme/css';
+
+import NavItem from './nav-item';
+import MenuTags from '../common/menu-tags';
+import NavSubList from '../common/nav-sub-list';
+import MenuProducts from '../common/menu-products';
+import MenuMoreLink from '../common/menu-more-link';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data, slotProps }) {
+ const navRef = useRef(null);
+
+ const pathname = usePathname();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const singleList = data.children?.length === 1;
+
+ const [openMenu, setOpenMenu] = useState(false);
+
+ const [rectTop, setRectTop] = useState(0);
+
+ useEffect(() => {
+ if (openMenu) {
+ handleCloseMenu();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ useEffect(() => {
+ const handleScroll = () => {
+ const element = navRef.current;
+
+ if (element) {
+ const clientRect = element.getBoundingClientRect();
+
+ setRectTop(clientRect.top + clientRect.height);
+ }
+ };
+
+ handleScroll();
+
+ window.addEventListener('scroll', handleScroll);
+
+ return () => {
+ window.removeEventListener('scroll', handleScroll);
+ };
+ }, []);
+
+ const handleOpenMenu = useCallback(() => {
+ if (data.children) {
+ setOpenMenu(true);
+ }
+ }, [data.children]);
+
+ const handleCloseMenu = useCallback(() => {
+ setOpenMenu(false);
+ }, []);
+
+ return (
+ <>
+
+
+ {!!data.children && (
+ theme.breakpoints.values.lg,
+ ...(singleList && {
+ p: 2,
+ minWidth: 160,
+ left: 'auto',
+ right: 'auto',
+ }),
+ ...(openMenu && {
+ pointerEvents: 'auto',
+ }),
+ },
+ },
+ }}
+ sx={{
+ pointerEvents: 'none',
+ }}
+ >
+ {singleList ? (
+
+ ) : (
+
+
+
+ )}
+
+
+ {!!data.moreLink && (
+
+ )}
+
+ {!!data.products && (
+ <>
+
+
+ >
+ )}
+
+ {!!data.tags && (
+ <>
+
+
+ >
+ )}
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/mega-menu/index.js b/template/src/components/mega-menu/index.js
new file mode 100644
index 0000000..c188006
--- /dev/null
+++ b/template/src/components/mega-menu/index.js
@@ -0,0 +1,3 @@
+export { default as MegaMenuMobile } from './mobile/mega-menu-mobile';
+export { default as MegaMenuDesktopVertical } from './vertical/mega-menu-desktop-vertical';
+export { default as MegaMenuDesktopHorizontal } from './horizontal/mega-menu-desktop-horizontal';
diff --git a/template/src/components/mega-menu/mobile/mega-menu-mobile.jsx b/template/src/components/mega-menu/mobile/mega-menu-mobile.jsx
new file mode 100644
index 0000000..e4fb0fd
--- /dev/null
+++ b/template/src/components/mega-menu/mobile/mega-menu-mobile.jsx
@@ -0,0 +1,22 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+export default function MegaMenuMobile({ data, slotProps, ...other }) {
+ return (
+
+ );
+}
+
+MegaMenuMobile.propTypes = {
+ data: PropTypes.array,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/mega-menu/mobile/nav-item.jsx b/template/src/components/mega-menu/mobile/nav-item.jsx
new file mode 100644
index 0000000..148b5e0
--- /dev/null
+++ b/template/src/components/mega-menu/mobile/nav-item.jsx
@@ -0,0 +1,95 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import { alpha, styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ ({ title, path, icon, active, hasChild, externalLink, ...other }, ref) => {
+ const renderContent = (
+
+ {icon && (
+
+ {icon}
+
+ )}
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {hasChild && }
+
+ );
+
+ if (externalLink)
+ return (
+
+ {renderContent}
+
+ );
+
+ if (hasChild) {
+ return renderContent;
+ }
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ active: PropTypes.bool,
+ path: PropTypes.string,
+ icon: PropTypes.element,
+ title: PropTypes.string,
+ hasChild: PropTypes.bool,
+ externalLink: PropTypes.bool,
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, theme }) => ({
+ ...theme.typography.body2,
+ paddingLeft: theme.spacing(2.5),
+ paddingRight: theme.spacing(1.5),
+ fontWeight: theme.typography.fontWeightMedium,
+ '& .icon': {
+ width: 20,
+ height: 20,
+ flexShrink: 0,
+ marginRight: theme.spacing(2),
+ },
+ '& .label': {
+ flexGrow: 1,
+ },
+ '& .arrow': {
+ marginLeft: theme.spacing(0.75),
+ },
+ ...(active && {
+ color: theme.palette.primary.main,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ backgroundColor: alpha(theme.palette.primary.main, 0.08),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.primary.main, 0.16),
+ },
+ }),
+}));
diff --git a/template/src/components/mega-menu/mobile/nav-list.jsx b/template/src/components/mega-menu/mobile/nav-list.jsx
new file mode 100644
index 0000000..35b10dd
--- /dev/null
+++ b/template/src/components/mega-menu/mobile/nav-list.jsx
@@ -0,0 +1,218 @@
+import PropTypes from 'prop-types';
+import { useState, useEffect, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import List from '@mui/material/List';
+import Stack from '@mui/material/Stack';
+import Drawer from '@mui/material/Drawer';
+import Divider from '@mui/material/Divider';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+import { usePathname, useActiveLink } from 'src/routes/hooks';
+
+import NavItem from './nav-item';
+import Iconify from '../../iconify';
+import Scrollbar from '../../scrollbar';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data, slotProps }) {
+ const pathname = usePathname();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const [openMenu, setOpenMenu] = useState(false);
+
+ const [rectWidth, setRectWidth] = useState(0);
+
+ useEffect(() => {
+ if (openMenu) {
+ handleCloseMenu();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ useEffect(() => {
+ const element = document.getElementById('mega-menu-mobile');
+
+ if (element) {
+ const clientRect = element?.getBoundingClientRect();
+
+ setRectWidth(clientRect.width);
+ }
+ }, []);
+
+ const handleOpenMenu = useCallback(() => {
+ if (data.children) {
+ setOpenMenu(true);
+ }
+ }, [data.children]);
+
+ const handleCloseMenu = useCallback(() => {
+ setOpenMenu(false);
+ }, []);
+
+ return (
+ <>
+
+
+ {!!data.children && (
+
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+ slotProps: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function NavSubList({ data, slotProps, title, onCloseMenu }) {
+ const theme = useTheme();
+
+ const pathname = usePathname();
+
+ return (
+ <>
+
+
+
+
+
+
+ {title}
+
+
+
+
+
+
+ {data.map((list, index) => (
+
+ {list.subheader && (
+
+ {list.subheader}
+
+ )}
+
+ {list.items.map((link) => {
+ const active = pathname === link.path || pathname === `${link.path}/`;
+
+ return (
+
+
+
+
+
+
+ {link.title}
+
+
+ );
+ })}
+
+ ))}
+
+ >
+ );
+}
+
+NavSubList.propTypes = {
+ data: PropTypes.array,
+ title: PropTypes.string,
+ onCloseMenu: PropTypes.func,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/mega-menu/vertical/mega-menu-desktop-vertical.jsx b/template/src/components/mega-menu/vertical/mega-menu-desktop-vertical.jsx
new file mode 100644
index 0000000..99d5be6
--- /dev/null
+++ b/template/src/components/mega-menu/vertical/mega-menu-desktop-vertical.jsx
@@ -0,0 +1,31 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+export default function MegaMenuDesktopVertical({ data, sx, slotProps, ...other }) {
+ return (
+
+ );
+}
+
+MegaMenuDesktopVertical.propTypes = {
+ data: PropTypes.array,
+ sx: PropTypes.object,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/mega-menu/vertical/nav-item.jsx b/template/src/components/mega-menu/vertical/nav-item.jsx
new file mode 100644
index 0000000..27b510c
--- /dev/null
+++ b/template/src/components/mega-menu/vertical/nav-item.jsx
@@ -0,0 +1,99 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import { alpha, styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ ({ title, path, icon, open, active, hasChild, externalLink, ...other }, ref) => {
+ const renderContent = (
+
+ {icon && (
+
+ {icon}
+
+ )}
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {hasChild && }
+
+ );
+
+ if (externalLink)
+ return (
+
+ {renderContent}
+
+ );
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ active: PropTypes.bool,
+ path: PropTypes.string,
+ icon: PropTypes.element,
+ title: PropTypes.string,
+ hasChild: PropTypes.bool,
+ externalLink: PropTypes.bool,
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, open, theme }) => {
+ const opened = open && !active;
+
+ return {
+ ...theme.typography.body2,
+ paddingLeft: theme.spacing(2.5),
+ paddingRight: theme.spacing(1.5),
+ fontWeight: theme.typography.fontWeightMedium,
+ '& .icon': {
+ width: 20,
+ height: 20,
+ flexShrink: 0,
+ marginRight: theme.spacing(2),
+ },
+ '& .label': {
+ flexGrow: 1,
+ },
+ '& .arrow': {
+ marginLeft: theme.spacing(0.75),
+ },
+ ...(active && {
+ color: theme.palette.primary.main,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ backgroundColor: alpha(theme.palette.primary.main, 0.08),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.primary.main, 0.16),
+ },
+ }),
+ ...(opened && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.hover,
+ }),
+ };
+});
diff --git a/template/src/components/mega-menu/vertical/nav-list.jsx b/template/src/components/mega-menu/vertical/nav-list.jsx
new file mode 100644
index 0000000..82bc656
--- /dev/null
+++ b/template/src/components/mega-menu/vertical/nav-list.jsx
@@ -0,0 +1,124 @@
+import PropTypes from 'prop-types';
+import { useRef, useState, useEffect, useCallback } from 'react';
+
+import Masonry from '@mui/lab/Masonry';
+import Paper from '@mui/material/Paper';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+
+import { usePathname, useActiveLink } from 'src/routes/hooks';
+
+import NavItem from './nav-item';
+import MenuTags from '../common/menu-tags';
+import NavSubList from '../common/nav-sub-list';
+import MenuProducts from '../common/menu-products';
+import MenuMoreLink from '../common/menu-more-link';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data, slotProps }) {
+ const navRef = useRef(null);
+
+ const pathname = usePathname();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const singleList = data.children?.length === 1;
+
+ const [openMenu, setOpenMenu] = useState(false);
+
+ useEffect(() => {
+ if (openMenu) {
+ handleCloseMenu();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ const handleOpenMenu = useCallback(() => {
+ if (data.children) {
+ setOpenMenu(true);
+ }
+ }, [data.children]);
+
+ const handleCloseMenu = useCallback(() => {
+ setOpenMenu(false);
+ }, []);
+
+ return (
+ <>
+
+
+ {!!data.children && openMenu && (
+ theme.zIndex.drawer,
+ boxShadow: (theme) => theme.customShadows.z20,
+ ...(singleList && {
+ p: 2,
+ width: 'auto',
+ minWidth: 160,
+ }),
+ }}
+ >
+ {singleList ? (
+
+ ) : (
+
+
+
+ )}
+
+
+ {!!data.moreLink && (
+
+ )}
+
+ {!!data.products && (
+ <>
+
+
+
+ >
+ )}
+
+ {!!data.tags && (
+ <>
+
+
+ >
+ )}
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/nav-basic/desktop/nav-basic-desktop.jsx b/template/src/components/nav-basic/desktop/nav-basic-desktop.jsx
new file mode 100644
index 0000000..ce599bc
--- /dev/null
+++ b/template/src/components/nav-basic/desktop/nav-basic-desktop.jsx
@@ -0,0 +1,25 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+function NavBasicDesktop({ data, slotProps, ...other }) {
+ return (
+
+ {data.map((list) => (
+
+ ))}
+
+ );
+}
+
+NavBasicDesktop.propTypes = {
+ data: PropTypes.array,
+ slotProps: PropTypes.object,
+};
+
+export default memo(NavBasicDesktop);
diff --git a/template/src/components/nav-basic/desktop/nav-item.jsx b/template/src/components/nav-basic/desktop/nav-item.jsx
new file mode 100644
index 0000000..3989218
--- /dev/null
+++ b/template/src/components/nav-basic/desktop/nav-item.jsx
@@ -0,0 +1,197 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import { styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ ({ title, path, icon, caption, depth, open, active, hasChild, externalLink, ...other }, ref) => {
+ const subItem = depth !== 1;
+
+ const renderContent = (
+
+ {icon && (
+
+ {icon}
+
+ )}
+
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {caption && (
+
+ {caption}
+
+ )}
+
+
+ {hasChild && (
+
+ )}
+
+ );
+
+ if (externalLink)
+ return (
+
+ {renderContent}
+
+ );
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ path: PropTypes.string,
+ active: PropTypes.bool,
+ icon: PropTypes.element,
+ title: PropTypes.string,
+ depth: PropTypes.number,
+ hasChild: PropTypes.bool,
+ caption: PropTypes.string,
+ externalLink: PropTypes.bool,
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, open, depth, theme }) => {
+ const subItem = depth !== 1;
+
+ const opened = open && !active;
+
+ const baseStyles = {
+ item: {
+ ...theme.typography.body2,
+ fontWeight: theme.typography.fontWeightMedium,
+ },
+ icon: {
+ width: 20,
+ height: 20,
+ flexShrink: 0,
+ marginRight: theme.spacing(1),
+ },
+ textContainer: {
+ flexGrow: 1,
+ display: 'inline-flex',
+ flexDirection: 'column',
+ },
+ label: {
+ flexGrow: 1,
+ },
+ caption: {
+ ...theme.typography.caption,
+ color: theme.palette.text.disabled,
+ },
+ arrow: {
+ flexShrink: 0,
+ marginLeft: theme.spacing(0.75),
+ },
+ };
+
+ return {
+ // Root item
+ ...(!subItem && {
+ ...baseStyles.item,
+ padding: 0,
+ minHeight: 40,
+ transition: theme.transitions.create(['all'], {
+ duration: theme.transitions.duration.shorter,
+ }),
+ '&:hover': {
+ backgroundColor: 'transparent',
+ },
+ '& .icon': {
+ ...baseStyles.icon,
+ },
+ '& .text-container': {
+ ...baseStyles.textContainer,
+ },
+ '& .label': {
+ ...baseStyles.label,
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ display: 'none',
+ },
+ '& .arrow': {
+ ...baseStyles.arrow,
+ },
+ ...(active && {
+ color: theme.palette.primary.main,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ }),
+ ...(opened && {
+ opacity: 0.64,
+ }),
+ }),
+
+ // Sub item
+ ...(subItem && {
+ ...baseStyles.item,
+ fontSize: 13,
+ borderRadius: 6,
+ padding: theme.spacing(0.75, 1),
+ color: theme.palette.text.secondary,
+ '& .icon': {
+ ...baseStyles.icon,
+ },
+ '& .text-container': {
+ ...baseStyles.textContainer,
+ },
+ '& .label': {
+ ...baseStyles.label,
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ },
+ '& .arrow': {
+ ...baseStyles.arrow,
+ marginRight: theme.spacing(-0.5),
+ },
+ ...(active && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.selected,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ }),
+ ...(opened && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.hover,
+ }),
+ }),
+ };
+});
diff --git a/template/src/components/nav-basic/desktop/nav-list.jsx b/template/src/components/nav-basic/desktop/nav-list.jsx
new file mode 100644
index 0000000..7f088d0
--- /dev/null
+++ b/template/src/components/nav-basic/desktop/nav-list.jsx
@@ -0,0 +1,123 @@
+import PropTypes from 'prop-types';
+import { useRef, useState, useEffect, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Popover from '@mui/material/Popover';
+
+import { usePathname } from 'src/routes/hooks';
+import { useActiveLink } from 'src/routes/hooks/use-active-link';
+
+import NavItem from './nav-item';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data, depth, slotProps }) {
+ const navRef = useRef(null);
+
+ const pathname = usePathname();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const [openMenu, setOpenMenu] = useState(false);
+
+ useEffect(() => {
+ if (openMenu) {
+ handleCloseMenu();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ const handleOpenMenu = useCallback(() => {
+ if (data.children) {
+ setOpenMenu(true);
+ }
+ }, [data.children]);
+
+ const handleCloseMenu = useCallback(() => {
+ setOpenMenu(false);
+ }, []);
+
+ return (
+ <>
+
+
+ {!!data.children && (
+
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function NavSubList({ data, depth, slotProps }) {
+ return (
+
+ {data.map((list) => (
+
+ ))}
+
+ );
+}
+
+NavSubList.propTypes = {
+ data: PropTypes.array,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/nav-basic/index.js b/template/src/components/nav-basic/index.js
new file mode 100644
index 0000000..bab38ef
--- /dev/null
+++ b/template/src/components/nav-basic/index.js
@@ -0,0 +1,2 @@
+export { default as NavBasicMobile } from './mobile/nav-basic-mobile';
+export { default as NavBasicDesktop } from './desktop/nav-basic-desktop';
diff --git a/template/src/components/nav-basic/mobile/nav-basic-mobile.jsx b/template/src/components/nav-basic/mobile/nav-basic-mobile.jsx
new file mode 100644
index 0000000..8d899f4
--- /dev/null
+++ b/template/src/components/nav-basic/mobile/nav-basic-mobile.jsx
@@ -0,0 +1,25 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+function NavBasicMobile({ data, slotProps, ...other }) {
+ return (
+
+ {data.map((list) => (
+
+ ))}
+
+ );
+}
+
+NavBasicMobile.propTypes = {
+ data: PropTypes.array,
+ slotProps: PropTypes.object,
+};
+
+export default memo(NavBasicMobile);
diff --git a/template/src/components/nav-basic/mobile/nav-item.jsx b/template/src/components/nav-basic/mobile/nav-item.jsx
new file mode 100644
index 0000000..e54bd0d
--- /dev/null
+++ b/template/src/components/nav-basic/mobile/nav-item.jsx
@@ -0,0 +1,217 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import { alpha, styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ ({ title, path, icon, caption, depth, open, active, hasChild, externalLink, ...other }, ref) => {
+ const renderContent = (
+
+ {icon && (
+
+ {icon}
+
+ )}
+
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {caption && (
+
+ {caption}
+
+ )}
+
+
+ {hasChild && (
+
+ )}
+
+ );
+
+ if (hasChild) {
+ return renderContent;
+ }
+
+ if (externalLink)
+ return (
+
+ {renderContent}
+
+ );
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ path: PropTypes.string,
+ active: PropTypes.bool,
+ icon: PropTypes.element,
+ title: PropTypes.string,
+ depth: PropTypes.number,
+ caption: PropTypes.bool,
+ hasChild: PropTypes.bool,
+ externalLink: PropTypes.bool,
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, open, depth, hasChild, theme }) => {
+ const subItem = depth !== 1;
+
+ const opened = open && !active;
+
+ const noWrapStyles = {
+ width: '100%',
+ maxWidth: '100%',
+ display: 'block',
+ overflow: 'hidden',
+ whiteSpace: 'nowrap',
+ textOverflow: 'ellipsis',
+ };
+
+ const baseStyles = {
+ item: {
+ ...theme.typography.body2,
+ },
+ icon: {
+ width: 20,
+ height: 20,
+ flexShrink: 0,
+ },
+ textContainer: {
+ minWidth: 0,
+ flex: '1 1 auto',
+ display: 'inline-flex',
+ flexDirection: 'column',
+ },
+ label: {
+ ...noWrapStyles,
+ },
+ caption: {
+ ...noWrapStyles,
+ ...theme.typography.caption,
+ color: theme.palette.text.disabled,
+ },
+ arrow: {
+ flexShrink: 0,
+ marginLeft: theme.spacing(0.75),
+ },
+ };
+
+ return {
+ // Root item
+ ...(!subItem && {
+ ...baseStyles.item,
+ paddingLeft: theme.spacing(2),
+ paddingRight: theme.spacing(hasChild ? 1 : 3),
+ fontWeight: theme.typography.fontWeightMedium,
+ '& .icon': {
+ ...baseStyles.icon,
+ marginRight: theme.spacing(2),
+ },
+ '& .text-container': {
+ ...baseStyles.textContainer,
+ },
+ '& .label': {
+ ...baseStyles.label,
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ },
+ '& .arrow': {
+ ...baseStyles.arrow,
+ },
+ ...(active && {
+ color: theme.palette.primary.main,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ backgroundColor: alpha(theme.palette.primary.main, 0.08),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.primary.main, 0.16),
+ },
+ }),
+ ...(opened && {
+ backgroundColor: theme.palette.action.hover,
+ }),
+ }),
+
+ // Sub item
+ ...(subItem && {
+ ...baseStyles.item,
+ fontSize: 13,
+ minHeight: 32,
+ color: theme.palette.text.secondary,
+ padding: theme.spacing(1, hasChild ? 1 : 3, 1, Number(depth) * 2 - 1),
+ '&:before': {
+ content: '""',
+ width: 1,
+ height: '100%',
+ position: 'absolute',
+ backgroundColor: theme.palette.divider,
+ ...(active && {
+ backgroundColor: theme.palette.text.primary,
+ }),
+ },
+ '& .icon': {
+ ...baseStyles.icon,
+ marginLeft: theme.spacing(2),
+ },
+ '& .text-container': {
+ ...baseStyles.textContainer,
+ marginLeft: theme.spacing(2),
+ },
+ '& .label': {
+ ...baseStyles.label,
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ },
+ '& .arrow': {
+ ...baseStyles.arrow,
+ },
+ ...(active && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.selected,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ }),
+ ...(opened && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.hover,
+ }),
+ }),
+ };
+});
diff --git a/template/src/components/nav-basic/mobile/nav-list.jsx b/template/src/components/nav-basic/mobile/nav-list.jsx
new file mode 100644
index 0000000..ba3b720
--- /dev/null
+++ b/template/src/components/nav-basic/mobile/nav-list.jsx
@@ -0,0 +1,88 @@
+import PropTypes from 'prop-types';
+import { useState, useEffect, useCallback } from 'react';
+
+import Collapse from '@mui/material/Collapse';
+
+import { usePathname } from 'src/routes/hooks';
+import { useActiveLink } from 'src/routes/hooks/use-active-link';
+
+import NavItem from './nav-item';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data, depth, slotProps }) {
+ const pathname = usePathname();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const [openMenu, setOpenMenu] = useState(active);
+
+ useEffect(() => {
+ if (!active) {
+ handleCloseMenu();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ const handleToggleMenu = useCallback(() => {
+ if (data.children) {
+ setOpenMenu((prev) => !prev);
+ }
+ }, [data.children]);
+
+ const handleCloseMenu = useCallback(() => {
+ setOpenMenu(false);
+ }, []);
+
+ return (
+ <>
+
+
+ {!!data.children && (
+
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function NavSubList({ data, depth, slotProps }) {
+ return (
+ <>
+ {data.map((list) => (
+
+ ))}
+ >
+ );
+}
+
+NavSubList.propTypes = {
+ data: PropTypes.array,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/nav-section/horizontal/index.js b/template/src/components/nav-section/horizontal/index.js
new file mode 100644
index 0000000..670925e
--- /dev/null
+++ b/template/src/components/nav-section/horizontal/index.js
@@ -0,0 +1 @@
+export { default } from './nav-section-horizontal';
diff --git a/template/src/components/nav-section/horizontal/nav-item.jsx b/template/src/components/nav-section/horizontal/nav-item.jsx
new file mode 100644
index 0000000..a18f7be
--- /dev/null
+++ b/template/src/components/nav-section/horizontal/nav-item.jsx
@@ -0,0 +1,246 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Tooltip from '@mui/material/Tooltip';
+import { styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ (
+ {
+ title,
+ path,
+ icon,
+ info,
+ disabled,
+ caption,
+ roles,
+ //
+ open,
+ depth,
+ active,
+ hasChild,
+ externalLink,
+ currentRole = 'admin',
+ ...other
+ },
+ ref
+ ) => {
+ const subItem = depth !== 1;
+
+ const renderContent = (
+
+ {icon && (
+
+ {icon}
+
+ )}
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {caption && (
+
+
+
+ )}
+
+ {info && (
+
+ {info}
+
+ )}
+
+ {hasChild && (
+
+ )}
+
+ );
+
+ // Hidden item by role
+ if (roles && !roles.includes(`${currentRole}`)) {
+ return null;
+ }
+
+ if (externalLink)
+ return (
+
+ {renderContent}
+
+ );
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ active: PropTypes.bool,
+ path: PropTypes.string,
+ depth: PropTypes.number,
+ icon: PropTypes.element,
+ info: PropTypes.element,
+ title: PropTypes.string,
+ disabled: PropTypes.bool,
+ hasChild: PropTypes.bool,
+ caption: PropTypes.string,
+ externalLink: PropTypes.bool,
+ currentRole: PropTypes.string,
+ roles: PropTypes.arrayOf(PropTypes.string),
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, open, depth, theme }) => {
+ const subItem = depth !== 1;
+
+ const opened = open && !active;
+
+ const baseStyles = {
+ item: {
+ ...theme.typography.body2,
+ borderRadius: 6,
+ color: theme.palette.text.secondary,
+ fontWeight: theme.typography.fontWeightMedium,
+ },
+ icon: {
+ width: 22,
+ height: 22,
+ flexShrink: 0,
+ marginRight: theme.spacing(1),
+ },
+ label: {
+ textTransform: 'capitalize',
+ },
+ caption: {
+ marginLeft: theme.spacing(0.75),
+ color: theme.palette.text.disabled,
+ },
+ info: {
+ display: 'inline-flex',
+ marginLeft: theme.spacing(0.75),
+ },
+ arrow: {
+ marginLeft: theme.spacing(0.75),
+ },
+ };
+
+ return {
+ // Root item
+ ...(!subItem && {
+ ...baseStyles.item,
+ minHeight: 32,
+ flexShrink: 0,
+ padding: theme.spacing(0, 0.75),
+ '& .icon': {
+ ...baseStyles.icon,
+ },
+ '& .label': {
+ ...baseStyles.label,
+ whiteSpace: 'nowrap',
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ },
+ '& .info': {
+ ...baseStyles.info,
+ },
+ '& .arrow': {
+ ...baseStyles.arrow,
+ },
+ ...(active && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.selected,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ }),
+ ...(opened && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.hover,
+ }),
+ }),
+
+ // Sub item
+ ...(subItem && {
+ ...baseStyles.item,
+ minHeight: 34,
+ padding: theme.spacing(0, 1),
+ '& .icon': {
+ ...baseStyles.icon,
+ },
+ '& .label': {
+ ...baseStyles.label,
+ flexGrow: 1,
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ },
+ '& .info': {
+ ...baseStyles.info,
+ },
+ '& .arrow': {
+ ...baseStyles.arrow,
+ marginRight: theme.spacing(-0.5),
+ },
+ ...(active && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.selected,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ }),
+ ...(opened && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.hover,
+ }),
+ }),
+ };
+});
diff --git a/template/src/components/nav-section/horizontal/nav-list.jsx b/template/src/components/nav-section/horizontal/nav-list.jsx
new file mode 100644
index 0000000..fc350f8
--- /dev/null
+++ b/template/src/components/nav-section/horizontal/nav-list.jsx
@@ -0,0 +1,126 @@
+import PropTypes from 'prop-types';
+import { useRef, useState, useEffect, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Popover from '@mui/material/Popover';
+
+import { usePathname } from 'src/routes/hooks';
+import { useActiveLink } from 'src/routes/hooks/use-active-link';
+
+import NavItem from './nav-item';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data, depth, slotProps }) {
+ const navRef = useRef(null);
+
+ const pathname = usePathname();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const [openMenu, setOpenMenu] = useState(false);
+
+ useEffect(() => {
+ if (openMenu) {
+ handleCloseMenu();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ const handleOpenMenu = useCallback(() => {
+ if (data.children) {
+ setOpenMenu(true);
+ }
+ }, [data.children]);
+
+ const handleCloseMenu = useCallback(() => {
+ setOpenMenu(false);
+ }, []);
+
+ return (
+ <>
+
+
+ {!!data.children && (
+
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function NavSubList({ data, depth, slotProps }) {
+ return (
+
+ {data.map((list) => (
+
+ ))}
+
+ );
+}
+
+NavSubList.propTypes = {
+ data: PropTypes.array,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/nav-section/horizontal/nav-section-horizontal.jsx b/template/src/components/nav-section/horizontal/nav-section-horizontal.jsx
new file mode 100644
index 0000000..3ec6aa1
--- /dev/null
+++ b/template/src/components/nav-section/horizontal/nav-section-horizontal.jsx
@@ -0,0 +1,54 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+function NavSectionHorizontal({ data, slotProps, sx, ...other }) {
+ return (
+
+ {data.map((group, index) => (
+
+ ))}
+
+ );
+}
+
+NavSectionHorizontal.propTypes = {
+ data: PropTypes.array,
+ sx: PropTypes.object,
+ slotProps: PropTypes.object,
+};
+
+export default memo(NavSectionHorizontal);
+
+// ----------------------------------------------------------------------
+
+function Group({ items, slotProps }) {
+ return (
+ <>
+ {items.map((list) => (
+
+ ))}
+ >
+ );
+}
+
+Group.propTypes = {
+ items: PropTypes.array,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/nav-section/index.js b/template/src/components/nav-section/index.js
new file mode 100644
index 0000000..730d102
--- /dev/null
+++ b/template/src/components/nav-section/index.js
@@ -0,0 +1,3 @@
+export { default as NavSectionMini } from './mini';
+export { default as NavSectionVertical } from './vertical';
+export { default as NavSectionHorizontal } from './horizontal';
diff --git a/template/src/components/nav-section/mini/index.js b/template/src/components/nav-section/mini/index.js
new file mode 100644
index 0000000..cdf35ab
--- /dev/null
+++ b/template/src/components/nav-section/mini/index.js
@@ -0,0 +1 @@
+export { default } from './nav-section-mini';
diff --git a/template/src/components/nav-section/mini/nav-item.jsx b/template/src/components/nav-section/mini/nav-item.jsx
new file mode 100644
index 0000000..cc3348d
--- /dev/null
+++ b/template/src/components/nav-section/mini/nav-item.jsx
@@ -0,0 +1,260 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Tooltip from '@mui/material/Tooltip';
+import { alpha, styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ (
+ {
+ title,
+ path,
+ icon,
+ info,
+ disabled,
+ caption,
+ roles,
+ //
+ open,
+ depth,
+ active,
+ hasChild,
+ externalLink,
+ currentRole = 'admin',
+ ...other
+ },
+ ref
+ ) => {
+ const subItem = depth !== 1;
+
+ const renderContent = (
+
+ {icon && (
+
+ {icon}
+
+ )}
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {caption && (
+
+
+
+ )}
+
+ {info && subItem && (
+
+ {info}
+
+ )}
+
+ {hasChild && }
+
+ );
+
+ // Hidden item by role
+ if (roles && !roles.includes(`${currentRole}`)) {
+ return null;
+ }
+
+ if (externalLink)
+ return (
+
+ {renderContent}
+
+ );
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ active: PropTypes.bool,
+ path: PropTypes.string,
+ depth: PropTypes.number,
+ icon: PropTypes.element,
+ info: PropTypes.element,
+ title: PropTypes.string,
+ disabled: PropTypes.bool,
+ hasChild: PropTypes.bool,
+ caption: PropTypes.string,
+ externalLink: PropTypes.bool,
+ currentRole: PropTypes.string,
+ roles: PropTypes.arrayOf(PropTypes.string),
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, open, depth, theme }) => {
+ const subItem = depth !== 1;
+
+ const opened = open && !active;
+
+ const lightMode = theme.palette.mode === 'light';
+
+ const noWrapStyles = {
+ width: '100%',
+ maxWidth: '100%',
+ display: 'block',
+ overflow: 'hidden',
+ whiteSpace: 'nowrap',
+ textOverflow: 'ellipsis',
+ };
+
+ const baseStyles = {
+ item: {
+ borderRadius: 6,
+ color: theme.palette.text.secondary,
+ },
+ icon: {
+ width: 22,
+ height: 22,
+ flexShrink: 0,
+ },
+ label: {
+ textTransform: 'capitalize',
+ },
+ caption: {
+ color: theme.palette.text.disabled,
+ },
+ };
+
+ return {
+ // Root item
+ ...(!subItem && {
+ ...baseStyles.item,
+ fontSize: 10,
+ minHeight: 56,
+ lineHeight: '16px',
+ textAlign: 'center',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ padding: theme.spacing(0.5),
+ margin: theme.spacing(0, 0.5),
+ fontWeight: theme.typography.fontWeightSemiBold,
+ '& .icon': {
+ ...baseStyles.icon,
+ },
+ '& .label': {
+ ...noWrapStyles,
+ ...baseStyles.label,
+ marginTop: theme.spacing(0.5),
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ top: 11,
+ left: 6,
+ position: 'absolute',
+ },
+ '& .arrow': {
+ top: 11,
+ right: 6,
+ position: 'absolute',
+ },
+ ...(active && {
+ fontWeight: theme.typography.fontWeightBold,
+ backgroundColor: alpha(theme.palette.primary.main, 0.08),
+ color: lightMode ? theme.palette.primary.main : theme.palette.primary.light,
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.primary.main, 0.16),
+ },
+ }),
+ ...(opened && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.hover,
+ }),
+ }),
+
+ // Sub item
+ ...(subItem && {
+ ...baseStyles.item,
+ ...theme.typography.body2,
+ minHeight: 34,
+ padding: theme.spacing(0, 1),
+ fontWeight: theme.typography.fontWeightMedium,
+ '& .icon': {
+ ...baseStyles.icon,
+ marginRight: theme.spacing(1),
+ },
+ '& .label': {
+ ...baseStyles.label,
+ flexGrow: 1,
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ marginLeft: theme.spacing(0.75),
+ },
+ '& .info': {
+ display: 'inline-flex',
+ marginLeft: theme.spacing(0.75),
+ },
+ '& .arrow': {
+ marginLeft: theme.spacing(0.75),
+ marginRight: theme.spacing(-0.5),
+ },
+ ...(active && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.selected,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ }),
+ ...(opened && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.hover,
+ }),
+ }),
+ };
+});
diff --git a/template/src/components/nav-section/mini/nav-list.jsx b/template/src/components/nav-section/mini/nav-list.jsx
new file mode 100644
index 0000000..a1b00c3
--- /dev/null
+++ b/template/src/components/nav-section/mini/nav-list.jsx
@@ -0,0 +1,119 @@
+import PropTypes from 'prop-types';
+import { useRef, useState, useEffect, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Popover from '@mui/material/Popover';
+
+import { usePathname } from 'src/routes/hooks';
+import { useActiveLink } from 'src/routes/hooks/use-active-link';
+
+import NavItem from './nav-item';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data, depth, slotProps }) {
+ const navRef = useRef(null);
+
+ const pathname = usePathname();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const [openMenu, setOpenMenu] = useState(false);
+
+ useEffect(() => {
+ if (openMenu) {
+ handleCloseMenu();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ const handleOpenMenu = useCallback(() => {
+ if (data.children) {
+ setOpenMenu(true);
+ }
+ }, [data.children]);
+
+ const handleCloseMenu = useCallback(() => {
+ setOpenMenu(false);
+ }, []);
+
+ return (
+ <>
+
+
+ {!!data.children && (
+
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function NavSubList({ data, depth, slotProps }) {
+ return (
+
+ {data.map((list) => (
+
+ ))}
+
+ );
+}
+
+NavSubList.propTypes = {
+ data: PropTypes.array,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/nav-section/mini/nav-section-mini.jsx b/template/src/components/nav-section/mini/nav-section-mini.jsx
new file mode 100644
index 0000000..3a4fb25
--- /dev/null
+++ b/template/src/components/nav-section/mini/nav-section-mini.jsx
@@ -0,0 +1,42 @@
+import { memo } from 'react';
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+function NavSectionMini({ data, slotProps, ...other }) {
+ return (
+
+ {data.map((group, index) => (
+
+ ))}
+
+ );
+}
+
+NavSectionMini.propTypes = {
+ data: PropTypes.array,
+ slotProps: PropTypes.object,
+};
+
+export default memo(NavSectionMini);
+
+// ----------------------------------------------------------------------
+
+function Group({ items, slotProps }) {
+ return (
+ <>
+ {items.map((list) => (
+
+ ))}
+ >
+ );
+}
+
+Group.propTypes = {
+ items: PropTypes.array,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/nav-section/vertical/index.js b/template/src/components/nav-section/vertical/index.js
new file mode 100644
index 0000000..88c6c85
--- /dev/null
+++ b/template/src/components/nav-section/vertical/index.js
@@ -0,0 +1 @@
+export { default } from './nav-section-vertical';
diff --git a/template/src/components/nav-section/vertical/nav-item.jsx b/template/src/components/nav-section/vertical/nav-item.jsx
new file mode 100644
index 0000000..a20eddc
--- /dev/null
+++ b/template/src/components/nav-section/vertical/nav-item.jsx
@@ -0,0 +1,298 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Tooltip from '@mui/material/Tooltip';
+import { alpha, styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ (
+ {
+ title,
+ path,
+ icon,
+ info,
+ disabled,
+ caption,
+ roles,
+ //
+ open,
+ depth,
+ active,
+ hasChild,
+ externalLink,
+ currentRole = 'admin',
+ ...other
+ },
+ ref
+ ) => {
+ const subItem = depth !== 1;
+
+ const renderContent = (
+
+ {!subItem && icon && (
+
+ {icon}
+
+ )}
+
+ {subItem && icon ? (
+
+ {icon}
+
+ ) : (
+
+ )}
+
+ {title && (
+
+
+ {title}
+
+
+ {caption && (
+
+
+ {caption}
+
+
+ )}
+
+ )}
+
+ {info && (
+
+ {info}
+
+ )}
+
+ {hasChild && (
+
+ )}
+
+ );
+
+ // Hidden item by role
+ if (roles && !roles.includes(`${currentRole}`)) {
+ return null;
+ }
+
+ if (hasChild) {
+ return renderContent;
+ }
+
+ if (externalLink)
+ return (
+
+ {renderContent}
+
+ );
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ active: PropTypes.bool,
+ path: PropTypes.string,
+ depth: PropTypes.number,
+ icon: PropTypes.element,
+ info: PropTypes.element,
+ title: PropTypes.string,
+ disabled: PropTypes.bool,
+ hasChild: PropTypes.bool,
+ caption: PropTypes.string,
+ externalLink: PropTypes.bool,
+ currentRole: PropTypes.string,
+ roles: PropTypes.arrayOf(PropTypes.string),
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, open, depth, theme }) => {
+ const subItem = depth !== 1;
+
+ const opened = open && !active;
+
+ const deepSubItem = Number(depth) > 2;
+
+ const noWrapStyles = {
+ width: '100%',
+ maxWidth: '100%',
+ display: 'block',
+ overflow: 'hidden',
+ whiteSpace: 'nowrap',
+ textOverflow: 'ellipsis',
+ };
+
+ const baseStyles = {
+ item: {
+ marginBottom: 4,
+ borderRadius: 8,
+ color: theme.palette.text.secondary,
+ padding: theme.spacing(0.5, 1, 0.5, 1.5),
+ },
+ icon: {
+ width: 24,
+ height: 24,
+ flexShrink: 0,
+ marginRight: theme.spacing(2),
+ },
+ label: {
+ ...noWrapStyles,
+ ...theme.typography.body2,
+ textTransform: 'capitalize',
+ fontWeight: theme.typography[active ? 'fontWeightSemiBold' : 'fontWeightMedium'],
+ },
+ caption: {
+ ...noWrapStyles,
+ ...theme.typography.caption,
+ color: theme.palette.text.disabled,
+ },
+ info: {
+ display: 'inline-flex',
+ marginLeft: theme.spacing(0.75),
+ },
+ arrow: {
+ flexShrink: 0,
+ marginLeft: theme.spacing(0.75),
+ },
+ };
+
+ return {
+ // Root item
+ ...(!subItem && {
+ ...baseStyles.item,
+ minHeight: 44,
+ '& .icon': {
+ ...baseStyles.icon,
+ },
+ '& .sub-icon': {
+ display: 'none',
+ },
+ '& .label': {
+ ...baseStyles.label,
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ },
+ '& .info': {
+ ...baseStyles.info,
+ },
+ '& .arrow': {
+ ...baseStyles.arrow,
+ },
+ ...(active && {
+ color:
+ theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.primary.light,
+ backgroundColor: alpha(theme.palette.primary.main, 0.08),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.primary.main, 0.16),
+ },
+ }),
+ ...(opened && {
+ color: theme.palette.text.primary,
+ backgroundColor: theme.palette.action.hover,
+ }),
+ }),
+
+ // Sub item
+ ...(subItem && {
+ ...baseStyles.item,
+ minHeight: 36,
+ '& .icon': {
+ ...baseStyles.icon,
+ },
+ '& .sub-icon': {
+ ...baseStyles.icon,
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ '&:before': {
+ content: '""',
+ width: 4,
+ height: 4,
+ borderRadius: '50%',
+ backgroundColor: theme.palette.text.disabled,
+ transition: theme.transitions.create(['transform'], {
+ duration: theme.transitions.duration.shorter,
+ }),
+ ...(active && {
+ transform: 'scale(2)',
+ backgroundColor: theme.palette.primary.main,
+ }),
+ },
+ },
+ '& .label': {
+ ...baseStyles.label,
+ },
+ '& .caption': {
+ ...baseStyles.caption,
+ },
+ '& .info': {
+ ...baseStyles.info,
+ },
+ '& .arrow': {
+ ...baseStyles.arrow,
+ },
+ ...(active && {
+ color: theme.palette.text.primary,
+ }),
+ }),
+
+ // Deep sub item
+ ...(deepSubItem && {
+ paddingLeft: `${theme.spacing(Number(depth))} !important`,
+ }),
+ };
+});
diff --git a/template/src/components/nav-section/vertical/nav-list.jsx b/template/src/components/nav-section/vertical/nav-list.jsx
new file mode 100644
index 0000000..fb983fc
--- /dev/null
+++ b/template/src/components/nav-section/vertical/nav-list.jsx
@@ -0,0 +1,95 @@
+import PropTypes from 'prop-types';
+import { useState, useEffect, useCallback } from 'react';
+
+import Collapse from '@mui/material/Collapse';
+
+import { usePathname } from 'src/routes/hooks';
+import { useActiveLink } from 'src/routes/hooks/use-active-link';
+
+import NavItem from './nav-item';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data, depth, slotProps }) {
+ const pathname = usePathname();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const [openMenu, setOpenMenu] = useState(active);
+
+ useEffect(() => {
+ if (!active) {
+ handleCloseMenu();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ const handleToggleMenu = useCallback(() => {
+ if (data.children) {
+ setOpenMenu((prev) => !prev);
+ }
+ }, [data.children]);
+
+ const handleCloseMenu = useCallback(() => {
+ setOpenMenu(false);
+ }, []);
+
+ return (
+ <>
+
+
+ {!!data.children && (
+
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function NavSubList({ data, depth, slotProps }) {
+ return (
+ <>
+ {data.map((list) => (
+
+ ))}
+ >
+ );
+}
+
+NavSubList.propTypes = {
+ data: PropTypes.array,
+ depth: PropTypes.number,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/nav-section/vertical/nav-section-vertical.jsx b/template/src/components/nav-section/vertical/nav-section-vertical.jsx
new file mode 100644
index 0000000..f157fea
--- /dev/null
+++ b/template/src/components/nav-section/vertical/nav-section-vertical.jsx
@@ -0,0 +1,89 @@
+import PropTypes from 'prop-types';
+import { memo, useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Collapse from '@mui/material/Collapse';
+import ListSubheader from '@mui/material/ListSubheader';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+function NavSectionVertical({ data, slotProps, ...other }) {
+ return (
+
+ {data.map((group, index) => (
+
+ ))}
+
+ );
+}
+
+NavSectionVertical.propTypes = {
+ data: PropTypes.array,
+ slotProps: PropTypes.object,
+};
+
+export default memo(NavSectionVertical);
+
+// ----------------------------------------------------------------------
+
+function Group({ subheader, items, slotProps }) {
+ const [open, setOpen] = useState(true);
+
+ const handleToggle = useCallback(() => {
+ setOpen((prev) => !prev);
+ }, []);
+
+ const renderContent = items.map((list) => (
+
+ ));
+
+ return (
+
+ {subheader ? (
+ <>
+ theme.spacing(2, 1, 1, 1.5),
+ transition: (theme) =>
+ theme.transitions.create(['color'], {
+ duration: theme.transitions.duration.shortest,
+ }),
+ '&:hover': {
+ color: 'text.primary',
+ },
+ ...slotProps?.subheader,
+ }}
+ >
+ {subheader}
+
+
+ {renderContent}
+ >
+ ) : (
+ renderContent
+ )}
+
+ );
+}
+
+Group.propTypes = {
+ items: PropTypes.array,
+ subheader: PropTypes.string,
+ slotProps: PropTypes.object,
+};
diff --git a/template/src/components/player/index.js b/template/src/components/player/index.js
new file mode 100644
index 0000000..5dd1904
--- /dev/null
+++ b/template/src/components/player/index.js
@@ -0,0 +1,3 @@
+export { default } from './player';
+
+export { default as PlayerDialog } from './player-dialog';
diff --git a/template/src/components/player/player-dialog.jsx b/template/src/components/player/player-dialog.jsx
new file mode 100644
index 0000000..86d225d
--- /dev/null
+++ b/template/src/components/player/player-dialog.jsx
@@ -0,0 +1,71 @@
+import PropTypes from 'prop-types';
+
+import Dialog from '@mui/material/Dialog';
+import { alpha } from '@mui/material/styles';
+import IconButton from '@mui/material/IconButton';
+import CircularProgress from '@mui/material/CircularProgress';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from '../iconify';
+import { StyledReactPlayer } from './styles';
+
+// ----------------------------------------------------------------------
+
+export default function PlayerDialog({ videoPath, open, onClose, ...other }) {
+ const loading = useBoolean(true);
+
+ return (
+
+ alpha(theme.palette.common.white, 0.72),
+ bgcolor: (theme) => alpha(theme.palette.common.white, 0.08),
+ '&:hover': {
+ bgcolor: (theme) => alpha(theme.palette.common.white, 0.16),
+ },
+ }}
+ >
+
+
+
+ {loading.value && (
+
+ )}
+
+
+
+ );
+}
+
+PlayerDialog.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+ videoPath: PropTypes.string,
+};
diff --git a/template/src/components/player/player.jsx b/template/src/components/player/player.jsx
new file mode 100644
index 0000000..d973291
--- /dev/null
+++ b/template/src/components/player/player.jsx
@@ -0,0 +1,9 @@
+import { StyledReactPlayer } from './styles';
+
+// ----------------------------------------------------------------------
+
+// https://github.com/CookPete/react-player
+
+export default function Player({ ...other }) {
+ return ;
+}
diff --git a/template/src/components/player/styles.js b/template/src/components/player/styles.js
new file mode 100644
index 0000000..b6acae9
--- /dev/null
+++ b/template/src/components/player/styles.js
@@ -0,0 +1,13 @@
+import ReactPlayer from 'react-player';
+
+import { styled } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+export const StyledReactPlayer = styled(ReactPlayer)({
+ width: '100% !important',
+ height: '100% !important',
+ '& video': {
+ objectFit: 'cover',
+ },
+});
diff --git a/template/src/components/progress-bar/index.js b/template/src/components/progress-bar/index.js
new file mode 100644
index 0000000..e671dce
--- /dev/null
+++ b/template/src/components/progress-bar/index.js
@@ -0,0 +1,3 @@
+export { default } from './progress-bar';
+
+export { default as StyledProgressBar } from './styles';
diff --git a/template/src/components/progress-bar/progress-bar.jsx b/template/src/components/progress-bar/progress-bar.jsx
new file mode 100644
index 0000000..adbf011
--- /dev/null
+++ b/template/src/components/progress-bar/progress-bar.jsx
@@ -0,0 +1,48 @@
+import NProgress from 'nprogress';
+import { useState, useEffect } from 'react';
+
+import { usePathname } from 'src/routes/hooks';
+
+import StyledProgressBar from './styles';
+
+// ----------------------------------------------------------------------
+
+export default function ProgressBar() {
+ const pathname = usePathname();
+
+ const [mounted, setMounted] = useState(false);
+
+ const [visible, setVisible] = useState(false);
+
+ useEffect(() => {
+ setMounted(true);
+ }, []);
+
+ useEffect(() => {
+ if (!visible) {
+ NProgress.start();
+ setVisible(true);
+ }
+
+ if (visible) {
+ NProgress.done();
+ setVisible(false);
+ }
+
+ if (!visible && mounted) {
+ setVisible(false);
+ NProgress.done();
+ }
+
+ return () => {
+ NProgress.done();
+ };
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname, mounted]);
+
+ if (!mounted) {
+ return null;
+ }
+
+ return ;
+}
diff --git a/template/src/components/progress-bar/styles.jsx b/template/src/components/progress-bar/styles.jsx
new file mode 100644
index 0000000..ffa41e2
--- /dev/null
+++ b/template/src/components/progress-bar/styles.jsx
@@ -0,0 +1,40 @@
+import { useTheme } from '@mui/material/styles';
+import GlobalStyles from '@mui/material/GlobalStyles';
+
+// ----------------------------------------------------------------------
+
+export default function StyledProgressBar() {
+ const theme = useTheme();
+
+ const inputGlobalStyles = (
+
+ );
+
+ return inputGlobalStyles;
+}
diff --git a/template/src/components/scroll-progress/index.js b/template/src/components/scroll-progress/index.js
new file mode 100644
index 0000000..2d85fbb
--- /dev/null
+++ b/template/src/components/scroll-progress/index.js
@@ -0,0 +1 @@
+export { default } from './scroll-progress';
diff --git a/template/src/components/scroll-progress/scroll-progress.jsx b/template/src/components/scroll-progress/scroll-progress.jsx
new file mode 100644
index 0000000..87a6048
--- /dev/null
+++ b/template/src/components/scroll-progress/scroll-progress.jsx
@@ -0,0 +1,58 @@
+import PropTypes from 'prop-types';
+import { m, useSpring } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+
+// ----------------------------------------------------------------------
+
+export default function ScrollProgress({
+ color = 'primary',
+ size = 3,
+ scrollYProgress,
+ sx,
+ ...other
+}) {
+ const scaleX = useSpring(scrollYProgress, {
+ stiffness: 100,
+ damping: 30,
+ restDelta: 0.001,
+ });
+
+ return (
+
+ `linear-gradient(135deg, ${theme.palette[color].light} 0%, ${theme.palette[color].main} 100%)`,
+ }),
+ ...sx,
+ }}
+ style={{ scaleX }}
+ {...other}
+ />
+ );
+}
+
+ScrollProgress.propTypes = {
+ color: PropTypes.oneOf([
+ 'inherit',
+ 'primary',
+ 'secondary',
+ 'info',
+ 'success',
+ 'warning',
+ 'error',
+ ]),
+ scrollYProgress: PropTypes.object,
+ size: PropTypes.number,
+ sx: PropTypes.object,
+};
diff --git a/template/src/components/scrollbar/index.js b/template/src/components/scrollbar/index.js
new file mode 100644
index 0000000..52778f5
--- /dev/null
+++ b/template/src/components/scrollbar/index.js
@@ -0,0 +1 @@
+export { default } from './scrollbar';
diff --git a/template/src/components/scrollbar/scrollbar.jsx b/template/src/components/scrollbar/scrollbar.jsx
new file mode 100644
index 0000000..5179478
--- /dev/null
+++ b/template/src/components/scrollbar/scrollbar.jsx
@@ -0,0 +1,44 @@
+import PropTypes from 'prop-types';
+import { memo, forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+
+import { StyledScrollbar, StyledRootScrollbar } from './styles';
+
+// ----------------------------------------------------------------------
+
+const Scrollbar = forwardRef(({ children, sx, ...other }, ref) => {
+ const userAgent = typeof navigator === 'undefined' ? 'SSR' : navigator.userAgent;
+
+ const mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
+
+ if (mobile) {
+ return (
+
+ {children}
+
+ );
+ }
+
+ return (
+
+
+ {children}
+
+
+ );
+});
+
+Scrollbar.propTypes = {
+ children: PropTypes.node,
+ sx: PropTypes.object,
+};
+
+export default memo(Scrollbar);
diff --git a/template/src/components/scrollbar/styles.js b/template/src/components/scrollbar/styles.js
new file mode 100644
index 0000000..f77cdab
--- /dev/null
+++ b/template/src/components/scrollbar/styles.js
@@ -0,0 +1,26 @@
+import SimpleBar from 'simplebar-react';
+
+import { alpha, styled } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+export const StyledRootScrollbar = styled('div')(() => ({
+ flexGrow: 1,
+ height: '100%',
+ overflow: 'hidden',
+}));
+
+export const StyledScrollbar = styled(SimpleBar)(({ theme }) => ({
+ maxHeight: '100%',
+ '& .simplebar-scrollbar': {
+ '&:before': {
+ backgroundColor: alpha(theme.palette.grey[600], 0.48),
+ },
+ '&.simplebar-visible:before': {
+ opacity: 1,
+ },
+ },
+ '& .simplebar-mask': {
+ zIndex: 'inherit',
+ },
+}));
diff --git a/template/src/components/settings/context/index.js b/template/src/components/settings/context/index.js
new file mode 100644
index 0000000..278e885
--- /dev/null
+++ b/template/src/components/settings/context/index.js
@@ -0,0 +1,2 @@
+export { SettingsProvider } from './settings-provider';
+export { useSettingsContext } from './settings-context';
diff --git a/template/src/components/settings/context/settings-context.js b/template/src/components/settings/context/settings-context.js
new file mode 100644
index 0000000..89c6418
--- /dev/null
+++ b/template/src/components/settings/context/settings-context.js
@@ -0,0 +1,13 @@
+import { useContext, createContext } from 'react';
+
+// ----------------------------------------------------------------------
+
+export const SettingsContext = createContext({});
+
+export const useSettingsContext = () => {
+ const context = useContext(SettingsContext);
+
+ if (!context) throw new Error('useSettingsContext must be use inside SettingsProvider');
+
+ return context;
+};
diff --git a/template/src/components/settings/context/settings-provider.jsx b/template/src/components/settings/context/settings-provider.jsx
new file mode 100644
index 0000000..60c11d8
--- /dev/null
+++ b/template/src/components/settings/context/settings-provider.jsx
@@ -0,0 +1,50 @@
+import PropTypes from 'prop-types';
+import isEqual from 'lodash.isequal';
+import { useMemo, useState, useCallback } from 'react';
+
+import { useLocalStorage } from 'src/hooks/use-local-storage';
+
+import { SettingsContext } from './settings-context';
+
+// ----------------------------------------------------------------------
+
+const STORAGE_KEY = 'settings';
+
+export function SettingsProvider({ children, defaultSettings }) {
+ const { state, update, reset } = useLocalStorage(STORAGE_KEY, defaultSettings);
+
+ const [openDrawer, setOpenDrawer] = useState(false);
+
+ // Drawer
+ const onToggleDrawer = useCallback(() => {
+ setOpenDrawer((prev) => !prev);
+ }, []);
+
+ const onCloseDrawer = useCallback(() => {
+ setOpenDrawer(false);
+ }, []);
+
+ const canReset = !isEqual(state, defaultSettings);
+
+ const memoizedValue = useMemo(
+ () => ({
+ ...state,
+ onUpdate: update,
+ // Reset
+ canReset,
+ onReset: reset,
+ // Drawer
+ open: openDrawer,
+ onToggle: onToggleDrawer,
+ onClose: onCloseDrawer,
+ }),
+ [canReset, onCloseDrawer, onToggleDrawer, openDrawer, reset, state, update]
+ );
+
+ return {children} ;
+}
+
+SettingsProvider.propTypes = {
+ children: PropTypes.node,
+ defaultSettings: PropTypes.object,
+};
diff --git a/template/src/components/settings/drawer/base-options.jsx b/template/src/components/settings/drawer/base-options.jsx
new file mode 100644
index 0000000..fb22861
--- /dev/null
+++ b/template/src/components/settings/drawer/base-options.jsx
@@ -0,0 +1,32 @@
+import PropTypes from 'prop-types';
+
+import Typography from '@mui/material/Typography';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import Iconify from '../../iconify';
+
+// ----------------------------------------------------------------------
+
+export default function BaseOptions({ title, icons, selected, ...other }) {
+ return (
+
+ {title}
+
+
+ );
+}
+
+BaseOptions.propTypes = {
+ icons: PropTypes.arrayOf(PropTypes.string),
+ selected: PropTypes.bool,
+ title: PropTypes.string,
+};
diff --git a/template/src/components/settings/drawer/index.js b/template/src/components/settings/drawer/index.js
new file mode 100644
index 0000000..201e333
--- /dev/null
+++ b/template/src/components/settings/drawer/index.js
@@ -0,0 +1 @@
+export { default } from './settings-drawer';
diff --git a/template/src/components/settings/drawer/presets-options.jsx b/template/src/components/settings/drawer/presets-options.jsx
new file mode 100644
index 0000000..84556bd
--- /dev/null
+++ b/template/src/components/settings/drawer/presets-options.jsx
@@ -0,0 +1,136 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Radio from '@mui/material/Radio';
+import Paper from '@mui/material/Paper';
+import Typography from '@mui/material/Typography';
+import RadioGroup from '@mui/material/RadioGroup';
+import { alpha, styled } from '@mui/material/styles';
+import CardActionArea from '@mui/material/CardActionArea';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+import { presetOptions } from 'src/theme/options/presets';
+
+// ----------------------------------------------------------------------
+
+const BOX_BORDER_RADIUS = 1.5;
+
+const StyledBoxWrap = styled('div')(() => ({
+ height: 104,
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+}));
+
+const StyledBoxPrimary = styled('div')(() => ({
+ width: 64,
+ height: 64,
+ overflow: 'hidden',
+ borderRadius: '50%',
+ position: 'relative',
+}));
+
+const StyledBoxSecondary = styled('div')(({ theme }) => ({
+ top: 0,
+ bottom: 0,
+ right: 0,
+ margin: 'auto',
+ width: '50%',
+ height: '120%',
+ position: 'absolute',
+ borderRadius: '50%',
+ [theme.breakpoints.up('md')]: {
+ transition: theme.transitions.create('transform', {
+ duration: theme.transitions.duration.complex,
+ easing: theme.transitions.easing.sharp,
+ }),
+ },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function PresetsOptions({ value, onChange }) {
+ return (
+
+
+ Presets
+
+
+
+ {presetOptions.map((color) => (
+
+ ))}
+
+
+ );
+}
+
+PresetsOptions.propTypes = {
+ onChange: PropTypes.func,
+ value: PropTypes.string,
+};
+
+// ----------------------------------------------------------------------
+
+function OptionItem({ colorName, selected, primaryColor, secondaryColor }) {
+ return (
+
+
+
+
+
+
+
+
+ }
+ sx={{
+ top: 0,
+ margin: 0,
+ width: 1,
+ height: 1,
+ position: 'absolute',
+ }}
+ />
+
+
+ );
+}
+
+OptionItem.propTypes = {
+ selected: PropTypes.bool,
+ colorName: PropTypes.string,
+ primaryColor: PropTypes.string,
+ secondaryColor: PropTypes.string,
+};
diff --git a/template/src/components/settings/drawer/settings-drawer.jsx b/template/src/components/settings/drawer/settings-drawer.jsx
new file mode 100644
index 0000000..8c1e89c
--- /dev/null
+++ b/template/src/components/settings/drawer/settings-drawer.jsx
@@ -0,0 +1,101 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Badge from '@mui/material/Badge';
+import Drawer from '@mui/material/Drawer';
+import Tooltip from '@mui/material/Tooltip';
+import Divider from '@mui/material/Divider';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import Iconify from '../../iconify';
+import Scrollbar from '../../scrollbar';
+import BaseOptions from './base-options';
+import PresetsOptions from './presets-options';
+import { useSettingsContext } from '../context';
+
+// ----------------------------------------------------------------------
+
+export default function SettingsDrawer() {
+ const settings = useSettingsContext();
+
+ const renderHead = (
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ const renderMode = (
+
+ settings.onUpdate('themeMode', settings.themeMode === 'dark' ? 'light' : 'dark')
+ }
+ icons={['carbon:asleep', 'carbon:asleep-filled']}
+ />
+ );
+
+ const renderDirection = (
+
+ settings.onUpdate('themeDirection', settings.themeDirection === 'rtl' ? 'ltr' : 'rtl')
+ }
+ icons={['carbon:align-horizontal-right', 'carbon:align-horizontal-left']}
+ />
+ );
+
+ const renderPresets = (
+ settings.onUpdate('themeColorPresets', event.target.value)}
+ />
+ );
+
+ return (
+
+ {renderHead}
+
+
+
+
+
+ {renderMode}
+
+ {renderDirection}
+
+ {renderPresets}
+
+
+
+ );
+}
diff --git a/template/src/components/settings/index.js b/template/src/components/settings/index.js
new file mode 100644
index 0000000..b2e66d9
--- /dev/null
+++ b/template/src/components/settings/index.js
@@ -0,0 +1,3 @@
+export * from './context';
+
+export { default as SettingsDrawer } from './drawer';
diff --git a/template/src/components/svg-color/index.js b/template/src/components/svg-color/index.js
new file mode 100644
index 0000000..d370ec9
--- /dev/null
+++ b/template/src/components/svg-color/index.js
@@ -0,0 +1 @@
+export { default } from './svg-color';
diff --git a/template/src/components/svg-color/svg-color.jsx b/template/src/components/svg-color/svg-color.jsx
new file mode 100644
index 0000000..9f72428
--- /dev/null
+++ b/template/src/components/svg-color/svg-color.jsx
@@ -0,0 +1,31 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+
+// ----------------------------------------------------------------------
+
+const SvgColor = forwardRef(({ src, sx, ...other }, ref) => (
+
+));
+
+SvgColor.propTypes = {
+ src: PropTypes.string,
+ sx: PropTypes.object,
+};
+
+export default SvgColor;
diff --git a/template/src/components/text-max-line/index.js b/template/src/components/text-max-line/index.js
new file mode 100644
index 0000000..4e84fe3
--- /dev/null
+++ b/template/src/components/text-max-line/index.js
@@ -0,0 +1,3 @@
+export { default } from './text-max-line';
+
+export { default as useTypography } from './use-typography';
diff --git a/template/src/components/text-max-line/text-max-line.jsx b/template/src/components/text-max-line/text-max-line.jsx
new file mode 100644
index 0000000..20d0fc7
--- /dev/null
+++ b/template/src/components/text-max-line/text-max-line.jsx
@@ -0,0 +1,67 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Link from '@mui/material/Link';
+import Typography from '@mui/material/Typography';
+
+import useTypography from './use-typography';
+
+// ----------------------------------------------------------------------
+
+const TextMaxLine = forwardRef(
+ ({ asLink, variant = 'body1', line = 2, persistent = false, children, sx, ...other }, ref) => {
+ const { lineHeight } = useTypography(variant);
+
+ const styles = {
+ overflow: 'hidden',
+ textOverflow: 'ellipsis',
+ display: '-webkit-box',
+ WebkitLineClamp: line,
+ WebkitBoxOrient: 'vertical',
+ ...(persistent && {
+ height: lineHeight * line,
+ }),
+ ...sx,
+ };
+
+ if (asLink) {
+ return (
+
+ {children}
+
+ );
+ }
+
+ return (
+
+ {children}
+
+ );
+ }
+);
+
+TextMaxLine.propTypes = {
+ asLink: PropTypes.bool,
+ children: PropTypes.node,
+ line: PropTypes.number,
+ persistent: PropTypes.bool,
+ sx: PropTypes.object,
+ variant: PropTypes.oneOf([
+ 'body1',
+ 'body2',
+ 'button',
+ 'caption',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'inherit',
+ 'overline',
+ 'subtitle1',
+ 'subtitle2',
+ ]),
+};
+
+export default TextMaxLine;
diff --git a/template/src/components/text-max-line/use-typography.js b/template/src/components/text-max-line/use-typography.js
new file mode 100644
index 0000000..e94410f
--- /dev/null
+++ b/template/src/components/text-max-line/use-typography.js
@@ -0,0 +1,38 @@
+import { useTheme } from '@mui/material/styles';
+
+import { useWidth } from 'src/hooks/use-responsive';
+
+// ----------------------------------------------------------------------
+
+function remToPx(value) {
+ return Math.round(parseFloat(value) * 16);
+}
+
+export default function useTypography(variant) {
+ const theme = useTheme();
+
+ const breakpoints = useWidth();
+
+ const key = theme.breakpoints.up(breakpoints === 'xl' ? 'lg' : breakpoints);
+
+ const hasResponsive =
+ variant === 'h1' ||
+ variant === 'h2' ||
+ variant === 'h3' ||
+ variant === 'h4' ||
+ variant === 'h5' ||
+ variant === 'h6';
+
+ const getFont =
+ hasResponsive && theme.typography[variant][key]
+ ? theme.typography[variant][key]
+ : theme.typography[variant];
+
+ const fontSize = remToPx(getFont.fontSize);
+
+ const lineHeight = Number(theme.typography[variant].lineHeight) * fontSize;
+
+ const { fontWeight, letterSpacing } = theme.typography[variant];
+
+ return { fontSize, lineHeight, fontWeight, letterSpacing };
+}
diff --git a/template/src/config-global.js b/template/src/config-global.js
new file mode 100644
index 0000000..96dd463
--- /dev/null
+++ b/template/src/config-global.js
@@ -0,0 +1,3 @@
+// ----------------------------------------------------------------------
+
+export const GOOGLE_MAP_API = import.meta.env.VITE_MAP_API;
diff --git a/template/src/global.css b/template/src/global.css
new file mode 100644
index 0000000..9b40abd
--- /dev/null
+++ b/template/src/global.css
@@ -0,0 +1,14 @@
+/* scrollbar */
+@import 'simplebar-react/dist/simplebar.min.css';
+
+/* lazy image */
+@import 'react-lazy-load-image-component/src/effects/blur.css';
+
+/* carousel */
+@import 'slick-carousel/slick/slick.css';
+@import 'slick-carousel/slick/slick-theme.css';
+
+/* lightbox */
+@import 'yet-another-react-lightbox/styles.css';
+@import 'yet-another-react-lightbox/plugins/captions.css';
+@import 'yet-another-react-lightbox/plugins/thumbnails.css';
diff --git a/template/src/hooks/use-boolean.js b/template/src/hooks/use-boolean.js
new file mode 100644
index 0000000..93de679
--- /dev/null
+++ b/template/src/hooks/use-boolean.js
@@ -0,0 +1,27 @@
+import { useState, useCallback } from 'react';
+
+// ----------------------------------------------------------------------
+
+export function useBoolean(defaultValue) {
+ const [value, setValue] = useState(!!defaultValue);
+
+ const onTrue = useCallback(() => {
+ setValue(true);
+ }, []);
+
+ const onFalse = useCallback(() => {
+ setValue(false);
+ }, []);
+
+ const onToggle = useCallback(() => {
+ setValue((prev) => !prev);
+ }, []);
+
+ return {
+ value,
+ onTrue,
+ onFalse,
+ onToggle,
+ setValue,
+ };
+}
diff --git a/template/src/hooks/use-bounding-client-rect.js b/template/src/hooks/use-bounding-client-rect.js
new file mode 100644
index 0000000..612d816
--- /dev/null
+++ b/template/src/hooks/use-bounding-client-rect.js
@@ -0,0 +1,24 @@
+import { useState, useEffect, useCallback } from 'react';
+
+// ----------------------------------------------------------------------
+
+export function useBoundingClientRect(containerRef) {
+ const [container, setContainer] = useState(null);
+
+ const handleResize = useCallback(() => {
+ if (containerRef.current) {
+ const value = containerRef.current.getBoundingClientRect();
+ setContainer(value);
+ }
+ }, [containerRef]);
+
+ useEffect(() => {
+ window.addEventListener('resize', handleResize);
+
+ handleResize();
+
+ return () => window.removeEventListener('resize', handleResize);
+ }, [handleResize]);
+
+ return container;
+}
diff --git a/template/src/hooks/use-countdown.js b/template/src/hooks/use-countdown.js
new file mode 100644
index 0000000..c46fc26
--- /dev/null
+++ b/template/src/hooks/use-countdown.js
@@ -0,0 +1,53 @@
+import { useState, useEffect } from 'react';
+
+// ----------------------------------------------------------------------
+
+export function useCountdown(date) {
+ const [countdown, setCountdown] = useState({
+ days: '00',
+ hours: '00',
+ minutes: '00',
+ seconds: '00',
+ });
+
+ useEffect(() => {
+ const interval = setInterval(() => setNewTime(), 1000);
+ return () => clearInterval(interval);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ const setNewTime = () => {
+ const startTime = date;
+
+ const endTime = new Date();
+
+ const distanceToNow = startTime.valueOf() - endTime.valueOf();
+
+ const getDays = Math.floor(distanceToNow / (1000 * 60 * 60 * 24));
+
+ const getHours = `0${Math.floor(
+ (distanceToNow % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
+ )}`.slice(-2);
+
+ const getMinutes = `0${Math.floor((distanceToNow % (1000 * 60 * 60)) / (1000 * 60))}`.slice(-2);
+
+ const getSeconds = `0${Math.floor((distanceToNow % (1000 * 60)) / 1000)}`.slice(-2);
+
+ setCountdown({
+ days: getDays.toString() || '000',
+ hours: getHours || '000',
+ minutes: getMinutes || '000',
+ seconds: getSeconds || '000',
+ });
+ };
+
+ return {
+ days: countdown.days,
+ hours: countdown.hours,
+ minutes: countdown.minutes,
+ seconds: countdown.seconds,
+ };
+}
+
+// Usage
+// const countdown = useCountdown(new Date('07/07/2022 21:30'));
diff --git a/template/src/hooks/use-hover-parallax.js b/template/src/hooks/use-hover-parallax.js
new file mode 100644
index 0000000..cfe7890
--- /dev/null
+++ b/template/src/hooks/use-hover-parallax.js
@@ -0,0 +1,35 @@
+/* eslint-disable react-hooks/rules-of-hooks */
+import { useSpring, useTransform } from 'framer-motion';
+
+// ----------------------------------------------------------------------
+
+export function useHoverParallax(stiffness = 250, damping = 20) {
+ const x = useSpring(0, {
+ stiffness,
+ damping,
+ });
+ const y = useSpring(0, {
+ stiffness,
+ damping,
+ });
+
+ const offsetX = (force) => useTransform(x, (event) => event / force);
+ const offsetY = (force) => useTransform(y, (event) => event / force);
+
+ const onMouseMoveHandler = (event) => {
+ x.set(event.clientX);
+ y.set(event.clientY);
+ };
+
+ const onMouseLeaveHandler = () => {
+ x.set(0);
+ y.set(0);
+ };
+
+ return {
+ offsetX,
+ offsetY,
+ onMouseMoveHandler,
+ onMouseLeaveHandler,
+ };
+}
diff --git a/template/src/hooks/use-local-storage.js b/template/src/hooks/use-local-storage.js
new file mode 100644
index 0000000..9782f8c
--- /dev/null
+++ b/template/src/hooks/use-local-storage.js
@@ -0,0 +1,89 @@
+import { useState, useEffect, useCallback } from 'react';
+
+// ----------------------------------------------------------------------
+
+export function useLocalStorage(key, initialState) {
+ const [state, setState] = useState(initialState);
+
+ useEffect(() => {
+ const restored = getStorage(key);
+
+ if (restored) {
+ setState((prevValue) => ({
+ ...prevValue,
+ ...restored,
+ }));
+ }
+ }, [key]);
+
+ const updateState = useCallback(
+ (updateValue) => {
+ setState((prevValue) => {
+ setStorage(key, {
+ ...prevValue,
+ ...updateValue,
+ });
+
+ return {
+ ...prevValue,
+ ...updateValue,
+ };
+ });
+ },
+ [key]
+ );
+
+ const update = useCallback(
+ (name, updateValue) => {
+ updateState({
+ [name]: updateValue,
+ });
+ },
+ [updateState]
+ );
+
+ const reset = useCallback(() => {
+ removeStorage(key);
+ setState(initialState);
+ }, [initialState, key]);
+
+ return {
+ state,
+ update,
+ reset,
+ };
+}
+
+// ----------------------------------------------------------------------
+
+export const getStorage = (key) => {
+ let value = null;
+
+ try {
+ const result = window.localStorage.getItem(key);
+
+ if (result) {
+ value = JSON.parse(result);
+ }
+ } catch (error) {
+ console.error(error);
+ }
+
+ return value;
+};
+
+export const setStorage = (key, value) => {
+ try {
+ window.localStorage.setItem(key, JSON.stringify(value));
+ } catch (error) {
+ console.error(error);
+ }
+};
+
+export const removeStorage = (key) => {
+ try {
+ window.localStorage.removeItem(key);
+ } catch (error) {
+ console.error(error);
+ }
+};
diff --git a/template/src/hooks/use-off-set-top.js b/template/src/hooks/use-off-set-top.js
new file mode 100644
index 0000000..2bb0213
--- /dev/null
+++ b/template/src/hooks/use-off-set-top.js
@@ -0,0 +1,36 @@
+import { useScroll } from 'framer-motion';
+import { useMemo, useState, useEffect, useCallback } from 'react';
+
+// ----------------------------------------------------------------------
+
+export function useOffSetTop(top = 0, options) {
+ const { scrollY } = useScroll(options);
+
+ const [value, setValue] = useState(false);
+
+ const onOffSetTop = useCallback(() => {
+ scrollY.on('change', (scrollHeight) => {
+ if (scrollHeight > top) {
+ setValue(true);
+ } else {
+ setValue(false);
+ }
+ });
+ }, [scrollY, top]);
+
+ useEffect(() => {
+ onOffSetTop();
+ }, [onOffSetTop]);
+
+ const memoizedValue = useMemo(() => value, [value]);
+
+ return memoizedValue;
+}
+
+// Usage
+// const offset = useOffSetTop(100);
+
+// Or
+// const offset = useOffSetTop(100, {
+// container: ref,
+// });
diff --git a/template/src/hooks/use-responsive.js b/template/src/hooks/use-responsive.js
new file mode 100644
index 0000000..6c0657f
--- /dev/null
+++ b/template/src/hooks/use-responsive.js
@@ -0,0 +1,47 @@
+import { useTheme } from '@mui/material/styles';
+import useMediaQuery from '@mui/material/useMediaQuery';
+
+// ----------------------------------------------------------------------
+
+export function useResponsive(query, start, end) {
+ const theme = useTheme();
+
+ const mediaUp = useMediaQuery(theme.breakpoints.up(start));
+
+ const mediaDown = useMediaQuery(theme.breakpoints.down(start));
+
+ const mediaBetween = useMediaQuery(theme.breakpoints.between(start, end));
+
+ const mediaOnly = useMediaQuery(theme.breakpoints.only(start));
+
+ if (query === 'up') {
+ return mediaUp;
+ }
+
+ if (query === 'down') {
+ return mediaDown;
+ }
+
+ if (query === 'between') {
+ return mediaBetween;
+ }
+
+ return mediaOnly;
+}
+
+// ----------------------------------------------------------------------
+
+export function useWidth() {
+ const theme = useTheme();
+
+ const keys = [...theme.breakpoints.keys].reverse();
+
+ return (
+ keys.reduce((output, key) => {
+ // eslint-disable-next-line react-hooks/rules-of-hooks
+ const matches = useMediaQuery(theme.breakpoints.up(key));
+
+ return !output && matches ? key : output;
+ }, null) || 'xs'
+ );
+}
diff --git a/template/src/hooks/use-scroll-to-top.js b/template/src/hooks/use-scroll-to-top.js
new file mode 100644
index 0000000..9d1dfb6
--- /dev/null
+++ b/template/src/hooks/use-scroll-to-top.js
@@ -0,0 +1,15 @@
+import { useEffect } from 'react';
+
+import { usePathname } from 'src/routes/hooks';
+
+// ----------------------------------------------------------------------
+
+export function useScrollToTop() {
+ const pathname = usePathname();
+
+ useEffect(() => {
+ window.scrollTo(0, 0);
+ }, [pathname]);
+
+ return null;
+}
diff --git a/template/src/layouts/account/index.jsx b/template/src/layouts/account/index.jsx
new file mode 100644
index 0000000..83105c7
--- /dev/null
+++ b/template/src/layouts/account/index.jsx
@@ -0,0 +1,84 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import Nav from './nav';
+
+// ----------------------------------------------------------------------
+
+export default function AccountLayout({ children }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const menuOpen = useBoolean();
+
+ return (
+ <>
+ {mdUp ? (
+
+ Account
+
+ ) : (
+ `solid 1px ${theme.palette.divider}`,
+ }}
+ >
+
+ }
+ onClick={menuOpen.onTrue}
+ >
+ Account
+
+
+
+ )}
+
+
+
+
+
+
+ {children}
+
+
+
+ >
+ );
+}
+
+AccountLayout.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/layouts/account/nav.jsx b/template/src/layouts/account/nav.jsx
new file mode 100644
index 0000000..ff8e945
--- /dev/null
+++ b/template/src/layouts/account/nav.jsx
@@ -0,0 +1,197 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Drawer from '@mui/material/Drawer';
+import Avatar from '@mui/material/Avatar';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import ListItemText from '@mui/material/ListItemText';
+import ListItemIcon from '@mui/material/ListItemIcon';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { paths } from 'src/routes/paths';
+import { useActiveLink } from 'src/routes/hooks';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _mock } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+const navigations = [
+ {
+ title: 'Personal Info',
+ path: paths.eCommerce.account.personal,
+ icon: ,
+ },
+ {
+ title: 'Wishlist',
+ path: paths.eCommerce.account.wishlist,
+ icon: ,
+ },
+ {
+ title: 'Vouchers',
+ path: paths.eCommerce.account.vouchers,
+ icon: ,
+ },
+ {
+ title: 'Orders',
+ path: paths.eCommerce.account.orders,
+ icon: ,
+ },
+ {
+ title: 'Payment',
+ path: paths.eCommerce.account.payment,
+ icon: ,
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function Nav({ open, onClose }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const renderContent = (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ }),
+ }}
+ >
+
+
+
+
+
+ Change photo
+
+
+
+
+
+ Jayvion Simon
+
+
+ nannie_abernathy70@yahoo.com
+
+
+
+
+
+
+
+ {navigations.map((item) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ return (
+ <>
+ {mdUp ? (
+ renderContent
+ ) : (
+
+ {renderContent}
+
+ )}
+ >
+ );
+}
+
+Nav.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+};
+
+// ----------------------------------------------------------------------
+
+function NavItem({ item }) {
+ const active = useActiveLink(item.path);
+
+ return (
+
+
+ {item.icon}
+
+
+
+ );
+}
+
+NavItem.propTypes = {
+ item: PropTypes.shape({
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ path: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
diff --git a/template/src/layouts/auth/background.jsx b/template/src/layouts/auth/background.jsx
new file mode 100644
index 0000000..3568caf
--- /dev/null
+++ b/template/src/layouts/auth/background.jsx
@@ -0,0 +1,55 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { bgGradient } from 'src/theme/css';
+
+import Header from '../common/header-simple';
+
+// ----------------------------------------------------------------------
+
+export default function AuthBackgroundLayout({ children }) {
+ const theme = useTheme();
+
+ return (
+ <>
+
+
+
+
+ {children}
+
+
+ >
+ );
+}
+
+AuthBackgroundLayout.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/layouts/auth/cover.jsx b/template/src/layouts/auth/cover.jsx
new file mode 100644
index 0000000..8c66ef1
--- /dev/null
+++ b/template/src/layouts/auth/cover.jsx
@@ -0,0 +1,108 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import Carousel, { useCarousel, CarouselDots } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function AuthCoverLayout({ title, images, children }) {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ autoplaySpeed: 5000,
+ fade: true,
+ arrows: false,
+ autoplay: true,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ ...CarouselDots({
+ rounded: true,
+ sx: {
+ left: 0,
+ right: 0,
+ zIndex: 99,
+ bottom: 80,
+ mx: 'auto',
+ position: 'absolute',
+ },
+ }),
+ });
+
+ const renderCarousel = (
+
+ {images.map((img) => (
+
+ ))}
+
+ );
+
+ return (
+
+
+ {children}
+
+
+ {mdUp && (
+
+
+ {title}
+
+
+ {renderCarousel}
+
+ )}
+
+ );
+}
+
+AuthCoverLayout.propTypes = {
+ children: PropTypes.node,
+ images: PropTypes.array,
+ title: PropTypes.string,
+};
diff --git a/template/src/layouts/auth/illustration.jsx b/template/src/layouts/auth/illustration.jsx
new file mode 100644
index 0000000..00d2a7e
--- /dev/null
+++ b/template/src/layouts/auth/illustration.jsx
@@ -0,0 +1,62 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+
+import Header from '../common/header-simple';
+
+// ----------------------------------------------------------------------
+
+export default function AuthIllustrationLayout({ children }) {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+ <>
+
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+ theme.customShadows.z24,
+ }}
+ >
+ {children}
+
+
+
+
+ >
+ );
+}
+
+AuthIllustrationLayout.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/layouts/common/header-shadow.jsx b/template/src/layouts/common/header-shadow.jsx
new file mode 100644
index 0000000..97e172f
--- /dev/null
+++ b/template/src/layouts/common/header-shadow.jsx
@@ -0,0 +1,31 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+
+// ----------------------------------------------------------------------
+
+export default function HeaderShadow({ sx, ...other }) {
+ return (
+ theme.customShadows.z8,
+ ...sx,
+ }}
+ {...other}
+ />
+ );
+}
+
+HeaderShadow.propTypes = {
+ sx: PropTypes.object,
+};
diff --git a/template/src/layouts/common/header-simple.jsx b/template/src/layouts/common/header-simple.jsx
new file mode 100644
index 0000000..f8220c0
--- /dev/null
+++ b/template/src/layouts/common/header-simple.jsx
@@ -0,0 +1,74 @@
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import AppBar from '@mui/material/AppBar';
+import Toolbar from '@mui/material/Toolbar';
+import { useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useOffSetTop } from 'src/hooks/use-off-set-top';
+
+import { bgBlur } from 'src/theme/css';
+
+import Logo from 'src/components/logo';
+
+import { HEADER } from '../config-layout';
+import HeaderShadow from './header-shadow';
+import SettingsButton from './settings-button';
+
+// ----------------------------------------------------------------------
+
+export default function HeaderSimple() {
+ const theme = useTheme();
+
+ const offset = useOffSetTop(HEADER.H_DESKTOP);
+
+ return (
+
+
+
+
+
+
+
+
+ Need help?
+
+
+
+
+ {offset && }
+
+ );
+}
diff --git a/template/src/layouts/common/searchbar.jsx b/template/src/layouts/common/searchbar.jsx
new file mode 100644
index 0000000..4322a8b
--- /dev/null
+++ b/template/src/layouts/common/searchbar.jsx
@@ -0,0 +1,77 @@
+import PropTypes from 'prop-types';
+
+import Slide from '@mui/material/Slide';
+import Input from '@mui/material/Input';
+import Button from '@mui/material/Button';
+import IconButton from '@mui/material/IconButton';
+import { alpha, styled } from '@mui/material/styles';
+import InputAdornment from '@mui/material/InputAdornment';
+import ClickAwayListener from '@mui/material/ClickAwayListener';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+
+import { HEADER } from '../config-layout';
+
+// ----------------------------------------------------------------------
+
+const StyledSearchbar = styled('div')(({ theme }) => ({
+ top: 0,
+ left: 0,
+ zIndex: 99,
+ width: '100%',
+ display: 'flex',
+ position: 'absolute',
+ alignItems: 'center',
+ height: HEADER.H_MOBILE,
+ backdropFilter: 'blur(6px)',
+ WebkitBackdropFilter: 'blur(6px)', // Fix on Mobile
+ padding: theme.spacing(0, 3),
+ boxShadow: theme.customShadows.z8,
+ backgroundColor: `${alpha(theme.palette.background.default, 0.72)}`,
+ [theme.breakpoints.up('md')]: {
+ height: HEADER.H_DESKTOP,
+ padding: theme.spacing(0, 5),
+ },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function Searchbar({ sx }) {
+ const searchOpen = useBoolean();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ }
+ sx={{ mr: 1, fontWeight: 'fontWeightBold' }}
+ />
+
+ Search
+
+
+
+
+
+ );
+}
+
+Searchbar.propTypes = {
+ sx: PropTypes.object,
+};
diff --git a/template/src/layouts/common/settings-button.jsx b/template/src/layouts/common/settings-button.jsx
new file mode 100644
index 0000000..aebf768
--- /dev/null
+++ b/template/src/layouts/common/settings-button.jsx
@@ -0,0 +1,59 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import IconButton from '@mui/material/IconButton';
+import Badge, { badgeClasses } from '@mui/material/Badge';
+
+import Iconify from 'src/components/iconify';
+import { varHover } from 'src/components/animate';
+import { useSettingsContext } from 'src/components/settings';
+
+// ----------------------------------------------------------------------
+
+export default function SettingsButton({ sx }) {
+ const settings = useSettingsContext();
+
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+SettingsButton.propTypes = {
+ sx: PropTypes.object,
+};
diff --git a/template/src/layouts/compact/index.jsx b/template/src/layouts/compact/index.jsx
new file mode 100644
index 0000000..b51f4ae
--- /dev/null
+++ b/template/src/layouts/compact/index.jsx
@@ -0,0 +1,35 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+
+import Header from '../common/header-simple';
+
+// ----------------------------------------------------------------------
+
+export default function CompactLayout({ children }) {
+ return (
+ <>
+
+
+
+
+ {children}
+
+
+ >
+ );
+}
+
+CompactLayout.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/layouts/config-layout.js b/template/src/layouts/config-layout.js
new file mode 100644
index 0000000..232cba2
--- /dev/null
+++ b/template/src/layouts/config-layout.js
@@ -0,0 +1,12 @@
+// ----------------------------------------------------------------------
+
+export const HEADER = {
+ H_MOBILE: 64,
+ H_DESKTOP: 80,
+ H_DESKTOP_OFFSET: 80 - 16,
+};
+
+export const NAV = {
+ W_VERTICAL: 280,
+ W_MINI: 88,
+};
diff --git a/template/src/layouts/ecommerce/config-navigation.jsx b/template/src/layouts/ecommerce/config-navigation.jsx
new file mode 100644
index 0000000..a0e0ba1
--- /dev/null
+++ b/template/src/layouts/ecommerce/config-navigation.jsx
@@ -0,0 +1,88 @@
+import { _mock } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export const data = [
+ {
+ path: '#',
+ title: 'Categories',
+ icon: ,
+ products: [...Array(10)].map((_, index) => ({
+ name: _mock.productName(index),
+ coverUrl: _mock.image.product(index),
+ path: '#',
+ })),
+ moreLink: {
+ title: 'More Categories',
+ path: '#',
+ },
+ tags: [
+ { title: 'Paper Cup', path: '#' },
+ { title: 'Lotion Pump', path: '#' },
+ { title: 'Brush Cutter', path: '#' },
+ { title: 'Display Rack', path: '#' },
+ { title: 'Glass Bottle', path: '#' },
+ ],
+ children: [
+ {
+ subheader: 'Other Machinery & Parts',
+ items: [
+ { title: 'Metallic Processing Machinery', path: '#' },
+ { title: 'Machinery for Food, Beverage & Cereal', path: '#' },
+ { title: 'Laser Equipment', path: '#' },
+ { title: 'Mould', path: '#' },
+ { title: 'Textile Machinery & Parts', path: '#' },
+ { title: 'Cutting & Fold-bend Machine', path: '#' },
+ { title: 'Paper Machinery', path: '#' },
+ { title: 'Rubber Machinery', path: '#' },
+ { title: 'Chemical Equipment & Machinery', path: '#' },
+ { title: 'Mixing Equipment', path: '#' },
+ { title: 'Machinery for Garment, Shoes & Accessories', path: '#' },
+ { title: 'Crushing & Culling Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Plastic & Woodworking',
+ items: [
+ { title: 'Plastic Machinery', path: '#' },
+ { title: 'Woodworking Machinery', path: '#' },
+ { title: 'Blow Molding Machine', path: '#' },
+ { title: 'Plastic Recycling Machine', path: '#' },
+ { title: 'Injection Molding Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Construction Machinery',
+ items: [
+ { title: 'Building Material Making Machinery', path: '#' },
+ { title: 'Lifting Equipment', path: '#' },
+ { title: 'Excavator', path: '#' },
+ { title: 'Concrete Machinery', path: '#' },
+ { title: 'Stone Processing Machinery', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Agriculture Machinery',
+ items: [
+ { title: 'Agriculture Machinery', path: '#' },
+ { title: 'Livestock MachineryFeed', path: '#' },
+ { title: 'Feed Processing Machinery', path: '#' },
+ { title: 'Tiller', path: '#' },
+ { title: 'Harvesting Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Machine Tools',
+ items: [
+ { title: 'CNC Machine Tools', path: '#' },
+ { title: 'Lathe', path: '#' },
+ { title: 'Grinding Machine ', path: '#' },
+ { title: 'Drilling Machine ', path: '#' },
+ { title: 'Milling Machine ', path: '#' },
+ ],
+ },
+ ],
+ },
+];
diff --git a/template/src/layouts/ecommerce/header.jsx b/template/src/layouts/ecommerce/header.jsx
new file mode 100644
index 0000000..14941d5
--- /dev/null
+++ b/template/src/layouts/ecommerce/header.jsx
@@ -0,0 +1,126 @@
+import Box from '@mui/material/Box';
+import Badge from '@mui/material/Badge';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Drawer from '@mui/material/Drawer';
+import Container from '@mui/material/Container';
+import IconButton from '@mui/material/IconButton';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { bgGradient } from 'src/theme/css';
+
+import Iconify from 'src/components/iconify';
+import { MegaMenuMobile, MegaMenuDesktopHorizontal } from 'src/components/mega-menu';
+
+import { data } from './config-navigation';
+
+// ----------------------------------------------------------------------
+
+export default function Header() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const menuOpen = useBoolean();
+
+ return (
+
+
+ {mdUp ? (
+
+ ) : (
+ <>
+ }
+ >
+ Categories
+
+
+
+
+
+ >
+ )}
+
+
+ {!mdUp && (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/layouts/ecommerce/index.jsx b/template/src/layouts/ecommerce/index.jsx
new file mode 100644
index 0000000..b009304
--- /dev/null
+++ b/template/src/layouts/ecommerce/index.jsx
@@ -0,0 +1,19 @@
+import PropTypes from 'prop-types';
+
+import Header from './header';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLayout({ children }) {
+ return (
+ <>
+
+
+ {children}
+ >
+ );
+}
+
+EcommerceLayout.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/layouts/main/config-navigation.js b/template/src/layouts/main/config-navigation.js
new file mode 100644
index 0000000..eca721b
--- /dev/null
+++ b/template/src/layouts/main/config-navigation.js
@@ -0,0 +1,119 @@
+import { paths } from 'src/routes/paths';
+
+// ----------------------------------------------------------------------
+
+export const pageLinks = [
+ {
+ order: '1',
+ subheader: 'Marketing',
+ cover: '/assets/images/menu/menu_marketing.jpg',
+ items: [
+ { title: 'Landing', path: paths.marketing.root },
+ { title: 'Services', path: paths.marketing.services },
+ { title: 'Case Studies', path: paths.marketing.caseStudies },
+ { title: 'Case Study', path: paths.marketing.caseStudy },
+ { title: 'Blog Posts', path: paths.marketing.posts },
+ { title: 'Blog Post', path: paths.marketing.post },
+ { title: 'About', path: paths.marketing.about },
+ { title: 'Contact', path: paths.marketing.contact },
+ ],
+ },
+ {
+ order: '6',
+ subheader: 'Travel',
+ cover: '/assets/images/menu/menu_travel.jpg',
+ items: [
+ { title: 'Landing', path: paths.travel.root },
+ { title: 'Tours', path: paths.travel.tours },
+ { title: 'Tour', path: paths.travel.tour },
+ { title: 'Checkout', path: paths.travel.checkout },
+ { title: 'Order Completed', path: paths.travel.orderCompleted },
+ { title: 'Blog Posts', path: paths.travel.posts },
+ { title: 'Blog Post', path: paths.travel.post },
+ { title: 'About', path: paths.travel.about },
+ { title: 'Contact', path: paths.travel.contact },
+ ],
+ },
+ {
+ order: '2',
+ subheader: 'Career',
+ cover: '/assets/images/menu/menu_career.jpg',
+ items: [
+ { title: 'Landing', path: paths.career.root },
+ { title: 'Jobs', path: paths.career.jobs },
+ { title: 'Job', path: paths.career.job },
+ { title: 'Blog Posts', path: paths.career.posts },
+ { title: 'Blog Post', path: paths.career.post },
+ { title: 'About', path: paths.career.about },
+ { title: 'Contact', path: paths.career.contact },
+ ],
+ },
+ {
+ order: '5',
+ subheader: 'E-learning',
+ cover: '/assets/images/menu/menu_elearning.jpg',
+ items: [
+ { title: 'Landing', path: paths.eLearning.root },
+ { title: 'Courses', path: paths.eLearning.courses },
+ { title: 'Course', path: paths.eLearning.course },
+ { title: 'Blog Posts', path: paths.eLearning.posts },
+ { title: 'Blog Post', path: paths.eLearning.post },
+ { title: 'About', path: paths.eLearning.about },
+ { title: 'Contact', path: paths.eLearning.contact },
+ ],
+ },
+ {
+ isNew: true,
+ order: '3',
+ subheader: 'E-commerce',
+ cover: '/assets/images/menu/menu_ecommerce.jpg',
+ items: [
+ { title: 'Landing', path: paths.eCommerce.root },
+ { title: 'Products', path: paths.eCommerce.products },
+ { title: 'Product', path: paths.eCommerce.product },
+ { title: 'Cart', path: paths.eCommerce.cart },
+ { title: 'Checkout', path: paths.eCommerce.checkout },
+ { title: 'Order Completed', path: paths.eCommerce.orderCompleted },
+ { title: 'Wishlist', path: paths.eCommerce.wishlist },
+ { title: 'Compare', path: paths.eCommerce.compare },
+ { title: 'Account Personal', path: paths.eCommerce.account.personal },
+ { title: 'Account Wishlist', path: paths.eCommerce.account.wishlist },
+ { title: 'Account Vouchers', path: paths.eCommerce.account.vouchers },
+ { title: 'Account Orders', path: paths.eCommerce.account.orders },
+ { title: 'Account Payment', path: paths.eCommerce.account.payment },
+ ],
+ },
+ {
+ order: '4',
+ subheader: 'Common',
+ items: [
+ { title: 'Login Cover', path: paths.loginCover },
+ { title: 'Login Illustration', path: paths.loginIllustration },
+ { title: 'Login Background', path: paths.loginBackground },
+ { title: 'Register Cover', path: paths.registerCover },
+ { title: 'Register Illustration', path: paths.registerIllustration },
+ { title: 'Register Background', path: paths.registerBackground },
+ { title: 'Forgot Password', path: paths.forgotPassword },
+ { title: 'Verify Code', path: paths.verify },
+ { title: '404 Error', path: paths.page404 },
+ { title: '500 Error', path: paths.page500 },
+ { title: 'Maintenance', path: paths.maintenance },
+ { title: 'ComingSoon', path: paths.comingsoon },
+ { title: 'Pricing 01', path: paths.pricing01 },
+ { title: 'Pricing 02', path: paths.pricing02 },
+ { title: 'Payment', path: paths.payment },
+ { title: 'Support', path: paths.support },
+ ],
+ },
+];
+
+export const navConfig = [
+ { title: 'Home', path: '/' },
+ { title: 'Components', path: paths.components.root },
+ {
+ title: 'Pages',
+ path: paths.pages,
+ children: [pageLinks[0], pageLinks[1], pageLinks[2], pageLinks[3], pageLinks[4], pageLinks[5]],
+ },
+ { title: 'Docs', path: paths.docs },
+];
diff --git a/template/src/layouts/main/footer.jsx b/template/src/layouts/main/footer.jsx
new file mode 100644
index 0000000..8acb42e
--- /dev/null
+++ b/template/src/layouts/main/footer.jsx
@@ -0,0 +1,330 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Masonry from '@mui/lab/Masonry';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Collapse from '@mui/material/Collapse';
+import TextField from '@mui/material/TextField';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import { alpha, styled } from '@mui/material/styles';
+import InputAdornment from '@mui/material/InputAdornment';
+import Button, { buttonClasses } from '@mui/material/Button';
+
+import { usePathname } from 'src/routes/hooks';
+import { RouterLink } from 'src/routes/components';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _socials } from 'src/_mock';
+
+import Logo from 'src/components/logo';
+import Iconify from 'src/components/iconify';
+
+import { pageLinks, navConfig } from './config-navigation';
+
+// ----------------------------------------------------------------------
+
+const StyledAppStoreButton = styled(Button)(({ theme }) => ({
+ flexShrink: 0,
+ padding: '5px 12px',
+ color: theme.palette.common.white,
+ border: `solid 1px ${alpha(theme.palette.common.black, 0.24)}`,
+ background: `linear-gradient(180deg, ${theme.palette.grey[900]} 0%, ${theme.palette.common.black} 100%)`,
+ [`& .${buttonClasses.startIcon}`]: {
+ marginLeft: 0,
+ },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function Footer() {
+ const mdUp = useResponsive('up', 'md');
+
+ const pathname = usePathname();
+
+ const mobileList = navConfig.find((i) => i.title === 'Pages')?.children || [];
+
+ const desktopList = pageLinks.sort((listA, listB) => Number(listA.order) - Number(listB.order));
+
+ const renderLists = mdUp ? desktopList : mobileList;
+
+ const isHome = pathname === '/';
+
+ const simpleFooter = (
+
+
+
+
+ © 2023. All rights reserved
+
+
+ );
+
+ const mainFooter = (
+ <>
+
+
+
+
+
+
+
+
+
+
+ The starting point for your next project based on easy-to-customize Material-UI ©
+ helps you build apps faster and better.
+
+
+
+
+ Community
+
+ Documentation
+
+
+
+ Changelog
+
+
+
+ Contributing
+
+
+
+
+
+ Let’s stay in touch
+
+ Ubscribe to our newsletter to receive latest articles to your inbox weekly.
+
+
+
+
+
+ Subscribe
+
+
+ ),
+ }}
+ />
+
+
+
+ Social
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+ Apps
+
+
+
+
+
+
+ {mdUp ? (
+
+ {renderLists.map((list) => (
+
+ ))}
+
+ ) : (
+
+ {renderLists.map((list) => (
+
+ ))}
+
+ )}
+
+
+
+
+
+
+
+
+
+ © 2023. All rights reserved
+
+
+
+
+ Help Center
+
+
+
+ Terms of Service
+
+
+
+
+ >
+ );
+
+ return {isHome ? simpleFooter : mainFooter} ;
+}
+
+// ----------------------------------------------------------------------
+
+export function ListDesktop({ list }) {
+ const pathname = usePathname();
+
+ return (
+
+ {list.subheader}
+
+ {list.items?.map((link) => {
+ const active = pathname === link.path || pathname === `${link.path}/`;
+
+ return (
+
+ {link.title}
+
+ );
+ })}
+
+ );
+}
+
+ListDesktop.propTypes = {
+ list: PropTypes.shape({
+ items: PropTypes.array,
+ subheader: PropTypes.string,
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+export function ListMobile({ list }) {
+ const pathname = usePathname();
+
+ const listExpand = useBoolean();
+
+ return (
+
+
+ {list.subheader}
+
+
+
+
+
+ {list.items?.map((link) => (
+
+ {link.title}
+
+ ))}
+
+
+
+ );
+}
+
+ListMobile.propTypes = {
+ list: PropTypes.shape({
+ items: PropTypes.array,
+ subheader: PropTypes.string,
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+function AppStoreButton({ ...other }) {
+ return (
+
+ }>
+
+
+ Download on the
+
+
+
+ Apple Store
+
+
+
+
+ }>
+
+
+ Download from
+
+
+
+ Google Play
+
+
+
+
+ );
+}
diff --git a/template/src/layouts/main/header.jsx b/template/src/layouts/main/header.jsx
new file mode 100644
index 0000000..4bcc443
--- /dev/null
+++ b/template/src/layouts/main/header.jsx
@@ -0,0 +1,147 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import AppBar from '@mui/material/AppBar';
+import Toolbar from '@mui/material/Toolbar';
+import Container from '@mui/material/Container';
+import { useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+
+import { useOffSetTop } from 'src/hooks/use-off-set-top';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { bgBlur } from 'src/theme/css';
+
+import Logo from 'src/components/logo';
+import Label from 'src/components/label';
+
+import NavMobile from './nav/mobile';
+import NavDesktop from './nav/desktop';
+import { HEADER } from '../config-layout';
+import Searchbar from '../common/searchbar';
+import { navConfig } from './config-navigation';
+import HeaderShadow from '../common/header-shadow';
+import SettingsButton from '../common/settings-button';
+
+// ----------------------------------------------------------------------
+
+export default function Header({ headerOnDark }) {
+ const theme = useTheme();
+
+ const offset = useOffSetTop();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const renderContent = (
+ <>
+
+
+
+
+
+ v2.4.0
+
+
+
+
+ <>
+
+
+
+
+
+ >
+
+
+
+
+
+
+
+
+
+ Buy Now
+
+
+
+ {!mdUp && }
+ >
+ );
+
+ return (
+
+
+
+ {renderContent}
+
+
+
+ {offset && }
+
+ );
+}
+
+Header.propTypes = {
+ headerOnDark: PropTypes.bool,
+};
diff --git a/template/src/layouts/main/index.jsx b/template/src/layouts/main/index.jsx
new file mode 100644
index 0000000..c4ef8b3
--- /dev/null
+++ b/template/src/layouts/main/index.jsx
@@ -0,0 +1,52 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+
+import Header from './header';
+import Footer from './footer';
+import { HEADER } from '../config-layout';
+
+// ----------------------------------------------------------------------
+
+export default function MainLayout({
+ children,
+ headerOnDark = false,
+ disabledSpacing = false,
+ sx,
+ ...other
+}) {
+ return (
+
+
+
+
+ {!(disabledSpacing || headerOnDark) && (
+
+ )}
+
+ {children}
+
+
+
+
+ );
+}
+
+MainLayout.propTypes = {
+ children: PropTypes.node,
+ headerOnDark: PropTypes.bool,
+ disabledSpacing: PropTypes.bool,
+ sx: PropTypes.object,
+};
diff --git a/template/src/layouts/main/nav/desktop/index.jsx b/template/src/layouts/main/nav/desktop/index.jsx
new file mode 100644
index 0000000..f3a50cc
--- /dev/null
+++ b/template/src/layouts/main/nav/desktop/index.jsx
@@ -0,0 +1,31 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import NavList from './nav-list';
+
+// ----------------------------------------------------------------------
+
+export default function NavDesktop({ data, sx, ...other }) {
+ return (
+
+ {data.map((list) => (
+
+ ))}
+
+ );
+}
+
+NavDesktop.propTypes = {
+ data: PropTypes.array,
+ sx: PropTypes.object,
+};
diff --git a/template/src/layouts/main/nav/desktop/nav-item.jsx b/template/src/layouts/main/nav/desktop/nav-item.jsx
new file mode 100644
index 0000000..2b5386b
--- /dev/null
+++ b/template/src/layouts/main/nav/desktop/nav-item.jsx
@@ -0,0 +1,132 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Link from '@mui/material/Link';
+import { styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ ({ title, path, open, active, subItem, hasChild, externalLink, ...other }, ref) => {
+ const renderContent = (
+
+ {title}
+
+ {hasChild && }
+
+ );
+
+ if (hasChild) {
+ return renderContent;
+ }
+
+ if (externalLink) {
+ return (
+
+ {renderContent}
+
+ );
+ }
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ active: PropTypes.bool,
+ path: PropTypes.string,
+ subItem: PropTypes.bool,
+ title: PropTypes.string,
+ hasChild: PropTypes.bool,
+ externalLink: PropTypes.bool,
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active' && prop !== 'subItem',
+})(({ active, open, subItem, theme }) => {
+ const opened = open && !active;
+
+ const dotStyles = {
+ content: '""',
+ borderRadius: '50%',
+ position: 'absolute',
+ width: 6,
+ height: 6,
+ left: -12,
+ opacity: 1,
+ backgroundColor: theme.palette.primary.main,
+ transition: theme.transitions.create(['opacity'], {
+ duration: theme.transitions.duration.shortest,
+ }),
+ };
+
+ return {
+ // Root item
+ ...(!subItem && {
+ ...theme.typography.body1,
+ padding: 0,
+ fontSize: 15,
+ minHeight: '100%',
+ fontWeight: theme.typography.fontWeightMedium,
+ fontFamily: theme.typography.fontSecondaryFamily,
+ '&:hover': {
+ backgroundColor: 'transparent',
+ '&:before': {
+ ...dotStyles,
+ opacity: 0.64,
+ },
+ },
+ ...(active && {
+ fontWeight: theme.typography.fontWeightSemiBold,
+ '&:before': dotStyles,
+ }),
+ }),
+
+ // Sub item
+ ...(subItem && {
+ ...theme.typography.body2,
+ padding: 0,
+ fontSize: 13,
+ color: theme.palette.text.secondary,
+ '&:hover': {
+ backgroundColor: 'transparent',
+ color: theme.palette.text.primary,
+ },
+ ...(active && {
+ color: theme.palette.text.primary,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ '&:before': dotStyles,
+ }),
+ }),
+
+ // Open
+ ...(opened && {
+ '&:before': {
+ ...dotStyles,
+ opacity: 0.64,
+ },
+ }),
+ };
+});
diff --git a/template/src/layouts/main/nav/desktop/nav-list.jsx b/template/src/layouts/main/nav/desktop/nav-list.jsx
new file mode 100644
index 0000000..1267016
--- /dev/null
+++ b/template/src/layouts/main/nav/desktop/nav-list.jsx
@@ -0,0 +1,194 @@
+import PropTypes from 'prop-types';
+import { useEffect, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Fade from '@mui/material/Fade';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Portal from '@mui/material/Portal';
+import Grid from '@mui/material/Unstable_Grid2';
+import ListSubheader from '@mui/material/ListSubheader';
+
+import { usePathname } from 'src/routes/hooks';
+import { RouterLink } from 'src/routes/components';
+import { useActiveLink } from 'src/routes/hooks/use-active-link';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Label from 'src/components/label';
+import Image from 'src/components/image';
+
+import NavItem from './nav-item';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data }) {
+ const pathname = usePathname();
+
+ const menuOpen = useBoolean();
+
+ const active = useActiveLink(data.path, !!data.children);
+
+ const mainList = data.children ? data.children.filter((list) => list.subheader !== 'Common') : [];
+
+ const commonList = data.children
+ ? data.children.find((list) => list.subheader === 'Common')
+ : null;
+
+ useEffect(() => {
+ if (menuOpen.value) {
+ menuOpen.onFalse();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ const handleOpenMenu = useCallback(() => {
+ if (data.children) {
+ menuOpen.onTrue();
+ }
+ }, [data.children, menuOpen]);
+
+ return (
+ <>
+
+
+ {!!data.children && menuOpen.value && (
+
+
+ theme.zIndex.modal,
+ boxShadow: (theme) => theme.customShadows.dialog,
+ }}
+ >
+
+
+
+ {mainList.map((list) => (
+
+ ))}
+
+
+
+ {commonList && (
+
+
+
+
+
+ )}
+
+
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function NavSubList({ subheader, isNew, cover, items }) {
+ const pathname = usePathname();
+
+ const coverPath = items.length ? items[0].path : '';
+
+ const commonList = subheader === 'Common';
+
+ return (
+
+
+ {subheader}
+ {isNew && (
+
+ NEW
+
+ )}
+
+
+ {!commonList && (
+
+ theme.customShadows.z8,
+ transition: (theme) => theme.transitions.create('all'),
+ '&:hover': {
+ opacity: 0.8,
+ boxShadow: (theme) => theme.customShadows.z24,
+ },
+ }}
+ />
+
+ )}
+
+
+ {items.map((item) => {
+ const active = pathname === item.path || pathname === `${item.path}/`;
+
+ return (
+
+ );
+ })}
+
+
+ );
+}
+
+NavSubList.propTypes = {
+ cover: PropTypes.string,
+ isNew: PropTypes.bool,
+ items: PropTypes.array,
+ subheader: PropTypes.string,
+};
diff --git a/template/src/layouts/main/nav/mobile/index.jsx b/template/src/layouts/main/nav/mobile/index.jsx
new file mode 100644
index 0000000..6cefed3
--- /dev/null
+++ b/template/src/layouts/main/nav/mobile/index.jsx
@@ -0,0 +1,81 @@
+import { useEffect } from 'react';
+import PropTypes from 'prop-types';
+
+import List from '@mui/material/List';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Drawer from '@mui/material/Drawer';
+import IconButton from '@mui/material/IconButton';
+
+import { paths } from 'src/routes/paths';
+import { usePathname } from 'src/routes/hooks';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Logo from 'src/components/logo';
+import Iconify from 'src/components/iconify';
+import Scrollbar from 'src/components/scrollbar';
+
+import NavList from './nav-list';
+import { NAV } from '../../../config-layout';
+
+// ----------------------------------------------------------------------
+
+export default function NavMobile({ data }) {
+ const pathname = usePathname();
+
+ const mobileOpen = useBoolean();
+
+ useEffect(() => {
+ if (mobileOpen.value) {
+ mobileOpen.onFalse();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ {data.map((list) => (
+
+ ))}
+
+
+
+
+ Buy Now
+
+
+
+
+ >
+ );
+}
+
+NavMobile.propTypes = {
+ data: PropTypes.array,
+};
diff --git a/template/src/layouts/main/nav/mobile/nav-item.jsx b/template/src/layouts/main/nav/mobile/nav-item.jsx
new file mode 100644
index 0000000..1aa37ac
--- /dev/null
+++ b/template/src/layouts/main/nav/mobile/nav-item.jsx
@@ -0,0 +1,81 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import { alpha, styled } from '@mui/material/styles';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const NavItem = forwardRef(
+ ({ title, path, open, active, hasChild, externalLink, ...other }, ref) => {
+ const renderContent = (
+
+
+ {title}
+
+
+ {hasChild && (
+
+ )}
+
+ );
+
+ if (hasChild) {
+ return renderContent;
+ }
+
+ if (externalLink) {
+ return (
+
+ {renderContent}
+
+ );
+ }
+
+ return (
+
+ {renderContent}
+
+ );
+ }
+);
+
+NavItem.propTypes = {
+ open: PropTypes.bool,
+ active: PropTypes.bool,
+ path: PropTypes.string,
+ subItem: PropTypes.bool,
+ title: PropTypes.string,
+ hasChild: PropTypes.bool,
+ externalLink: PropTypes.bool,
+};
+
+export default NavItem;
+
+// ----------------------------------------------------------------------
+
+const StyledNavItem = styled(ListItemButton, {
+ shouldForwardProp: (prop) => prop !== 'active',
+})(({ active, theme }) => ({
+ ...theme.typography.body1,
+ paddingLeft: theme.spacing(3),
+ paddingRight: theme.spacing(1.5),
+ color: theme.palette.text.primary,
+ fontWeight: theme.typography.fontWeightMedium,
+ fontFamily: theme.typography.fontSecondaryFamily,
+ ...(active && {
+ color: theme.palette.primary.main,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity),
+ }),
+}));
diff --git a/template/src/layouts/main/nav/mobile/nav-list.jsx b/template/src/layouts/main/nav/mobile/nav-list.jsx
new file mode 100644
index 0000000..8ab19b8
--- /dev/null
+++ b/template/src/layouts/main/nav/mobile/nav-list.jsx
@@ -0,0 +1,56 @@
+import PropTypes from 'prop-types';
+
+import Collapse from '@mui/material/Collapse';
+
+import { useActiveLink } from 'src/routes/hooks/use-active-link';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { NavSectionVertical } from 'src/components/nav-section';
+
+import NavItem from './nav-item';
+
+// ----------------------------------------------------------------------
+
+export default function NavList({ data }) {
+ const active = useActiveLink(data.path, !!data.children);
+
+ const menuOpen = useBoolean();
+
+ return (
+ <>
+
+
+ {!!data.children && (
+
+
+
+ )}
+ >
+ );
+}
+
+NavList.propTypes = {
+ data: PropTypes.object,
+};
diff --git a/template/src/layouts/simple/index.jsx b/template/src/layouts/simple/index.jsx
new file mode 100644
index 0000000..bab2c7e
--- /dev/null
+++ b/template/src/layouts/simple/index.jsx
@@ -0,0 +1,19 @@
+import PropTypes from 'prop-types';
+
+import Header from '../common/header-simple';
+
+// ----------------------------------------------------------------------
+
+export default function SimpleLayout({ children }) {
+ return (
+ <>
+
+
+ {children}
+ >
+ );
+}
+
+SimpleLayout.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/locales/index.js b/template/src/locales/index.js
new file mode 100644
index 0000000..5ad7e12
--- /dev/null
+++ b/template/src/locales/index.js
@@ -0,0 +1 @@
+export { default as LocalizationProvider } from './localization-provider';
diff --git a/template/src/locales/localization-provider.jsx b/template/src/locales/localization-provider.jsx
new file mode 100644
index 0000000..afea9d7
--- /dev/null
+++ b/template/src/locales/localization-provider.jsx
@@ -0,0 +1,14 @@
+import PropTypes from 'prop-types';
+
+import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
+import { LocalizationProvider as MuiLocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
+
+// ----------------------------------------------------------------------
+
+export default function LocalizationProvider({ children }) {
+ return {children} ;
+}
+
+LocalizationProvider.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/main.jsx b/template/src/main.jsx
new file mode 100644
index 0000000..ef2d1c5
--- /dev/null
+++ b/template/src/main.jsx
@@ -0,0 +1,20 @@
+import { Suspense } from 'react';
+import ReactDOM from 'react-dom/client';
+import { BrowserRouter } from 'react-router-dom';
+import { HelmetProvider } from 'react-helmet-async';
+
+import App from './app';
+
+// ----------------------------------------------------------------------
+
+const root = ReactDOM.createRoot(document.getElementById('root'));
+
+root.render(
+
+
+
+
+
+
+
+);
diff --git a/template/src/pages/404.jsx b/template/src/pages/404.jsx
new file mode 100644
index 0000000..b71fd5a
--- /dev/null
+++ b/template/src/pages/404.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import NotFoundView from 'src/sections/error/not-found-view';
+
+// ----------------------------------------------------------------------
+
+export default function NotFoundPage() {
+ return (
+ <>
+
+ 404 Page Not Found!
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/500.jsx b/template/src/pages/500.jsx
new file mode 100644
index 0000000..5192351
--- /dev/null
+++ b/template/src/pages/500.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import View500 from 'src/sections/error/500-view';
+
+// ----------------------------------------------------------------------
+
+export default function Page500() {
+ return (
+ <>
+
+ 500 Internal Server Error
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/auth/forgot-password.jsx b/template/src/pages/auth/forgot-password.jsx
new file mode 100644
index 0000000..93af9a9
--- /dev/null
+++ b/template/src/pages/auth/forgot-password.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ForgotPasswordView from 'src/sections/auth/forgot-password-view';
+
+// ----------------------------------------------------------------------
+
+export default function ForgotPasswordPage() {
+ return (
+ <>
+
+ Forgot Password
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/auth/login-background.jsx b/template/src/pages/auth/login-background.jsx
new file mode 100644
index 0000000..a225620
--- /dev/null
+++ b/template/src/pages/auth/login-background.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import LoginBackgroundView from 'src/sections/auth/login-background-view';
+
+// ----------------------------------------------------------------------
+
+export default function LoginBackgroundPage() {
+ return (
+ <>
+
+ Login: Background
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/auth/login-cover.jsx b/template/src/pages/auth/login-cover.jsx
new file mode 100644
index 0000000..9c28f5e
--- /dev/null
+++ b/template/src/pages/auth/login-cover.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import LoginCoverView from 'src/sections/auth/login-cover-view';
+
+// ----------------------------------------------------------------------
+
+export default function LoginCoverPage() {
+ return (
+ <>
+
+ Login: Cover
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/auth/login-illustration.jsx b/template/src/pages/auth/login-illustration.jsx
new file mode 100644
index 0000000..ecacc5f
--- /dev/null
+++ b/template/src/pages/auth/login-illustration.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import LoginIllustrationView from 'src/sections/auth/login-illustration-view';
+
+// ----------------------------------------------------------------------
+
+export default function LoginIllustrationPage() {
+ return (
+ <>
+
+ Login: Illustration
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/auth/register-background.jsx b/template/src/pages/auth/register-background.jsx
new file mode 100644
index 0000000..b9d1d4d
--- /dev/null
+++ b/template/src/pages/auth/register-background.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import RegisterBackgroundView from 'src/sections/auth/register-background-view';
+
+// ----------------------------------------------------------------------
+
+export default function RegisterBackgroundPage() {
+ return (
+ <>
+
+ Register: Background
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/auth/register-cover.jsx b/template/src/pages/auth/register-cover.jsx
new file mode 100644
index 0000000..f135ac5
--- /dev/null
+++ b/template/src/pages/auth/register-cover.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import RegisterCoverView from 'src/sections/auth/register-cover-view';
+
+// ----------------------------------------------------------------------
+
+export default function RegisterCoverPage() {
+ return (
+ <>
+
+ Register: Cover
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/auth/register-illustration.jsx b/template/src/pages/auth/register-illustration.jsx
new file mode 100644
index 0000000..fda5613
--- /dev/null
+++ b/template/src/pages/auth/register-illustration.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import RegisterIllustrationView from 'src/sections/auth/register-illustration-view';
+
+// ----------------------------------------------------------------------
+
+export default function RegisterIllustrationPage() {
+ return (
+ <>
+
+ Register: Illustration
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/auth/verify.jsx b/template/src/pages/auth/verify.jsx
new file mode 100644
index 0000000..feee524
--- /dev/null
+++ b/template/src/pages/auth/verify.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import VerifyView from 'src/sections/auth/verify-view';
+
+// ----------------------------------------------------------------------
+
+export default function VerifyPage() {
+ return (
+ <>
+
+ Verify
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/career/about.jsx b/template/src/pages/career/about.jsx
new file mode 100644
index 0000000..08c53bf
--- /dev/null
+++ b/template/src/pages/career/about.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CareerAboutView from 'src/sections/_career/view/career-about-view';
+
+// ----------------------------------------------------------------------
+
+export default function CareerAboutPage() {
+ return (
+ <>
+
+ Career: About us
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/career/contact.jsx b/template/src/pages/career/contact.jsx
new file mode 100644
index 0000000..982b52f
--- /dev/null
+++ b/template/src/pages/career/contact.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CareerContactView from 'src/sections/_career/view/career-contact-view';
+
+// ----------------------------------------------------------------------
+
+export default function CareerContactPage() {
+ return (
+ <>
+
+ Career: Contact us
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/career/job.jsx b/template/src/pages/career/job.jsx
new file mode 100644
index 0000000..e5823ee
--- /dev/null
+++ b/template/src/pages/career/job.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CareerJobView from 'src/sections/_career/view/career-job-view';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobPage() {
+ return (
+ <>
+
+ Career: Job
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/career/jobs.jsx b/template/src/pages/career/jobs.jsx
new file mode 100644
index 0000000..28a30d5
--- /dev/null
+++ b/template/src/pages/career/jobs.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CareerJobsView from 'src/sections/_career/view/career-jobs-view';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobsPage() {
+ return (
+ <>
+
+ Career: Jobs
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/career/landing.jsx b/template/src/pages/career/landing.jsx
new file mode 100644
index 0000000..f432d8e
--- /dev/null
+++ b/template/src/pages/career/landing.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CareerLandingView from 'src/sections/_career/view/career-landing-view';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingPage() {
+ return (
+ <>
+
+ Career: Home
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/career/post.jsx b/template/src/pages/career/post.jsx
new file mode 100644
index 0000000..d597266
--- /dev/null
+++ b/template/src/pages/career/post.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CareerPostView from 'src/sections/_career/view/career-post-view';
+
+// ----------------------------------------------------------------------
+
+export default function CareerPostPage() {
+ return (
+ <>
+
+ Career: Blog Post
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/career/posts.jsx b/template/src/pages/career/posts.jsx
new file mode 100644
index 0000000..92836d3
--- /dev/null
+++ b/template/src/pages/career/posts.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CareerPostsView from 'src/sections/_career/view/career-posts-view';
+
+// ----------------------------------------------------------------------
+
+export default function CareerPostsPage() {
+ return (
+ <>
+
+ Career: Blog
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/coming-soon.jsx b/template/src/pages/coming-soon.jsx
new file mode 100644
index 0000000..5d05a4f
--- /dev/null
+++ b/template/src/pages/coming-soon.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ComingSoonView from 'src/sections/status/view/coming-soon-view';
+
+// ----------------------------------------------------------------------
+
+export default function ComingSoonPage() {
+ return (
+ <>
+
+ Coming Soon
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/animate.jsx b/template/src/pages/components/animate.jsx
new file mode 100644
index 0000000..e0c2570
--- /dev/null
+++ b/template/src/pages/components/animate.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import AnimateView from 'src/sections/examples/animate-view';
+
+// ----------------------------------------------------------------------
+
+export default function AnimatePage() {
+ return (
+ <>
+
+ Components: Animate
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/carousel.jsx b/template/src/pages/components/carousel.jsx
new file mode 100644
index 0000000..bf82d6b
--- /dev/null
+++ b/template/src/pages/components/carousel.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CarouselView from 'src/sections/examples/carousel-view';
+
+// ----------------------------------------------------------------------
+
+export default function CarouselPage() {
+ return (
+ <>
+
+ Components: Carousel
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/count-up.jsx b/template/src/pages/components/count-up.jsx
new file mode 100644
index 0000000..d2b0a34
--- /dev/null
+++ b/template/src/pages/components/count-up.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import CountUpPageView from 'src/sections/examples/count-up-view';
+
+// ----------------------------------------------------------------------
+
+export default function CountUpPage() {
+ return (
+ <>
+
+ Components: CountUp
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/form-validation.jsx b/template/src/pages/components/form-validation.jsx
new file mode 100644
index 0000000..d26bfee
--- /dev/null
+++ b/template/src/pages/components/form-validation.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import FormValidationView from 'src/sections/examples/form-validation-view';
+
+// ----------------------------------------------------------------------
+
+export default function FormValidationPage() {
+ return (
+ <>
+
+ Components: Form Validation
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/icons.jsx b/template/src/pages/components/icons.jsx
new file mode 100644
index 0000000..a64da0a
--- /dev/null
+++ b/template/src/pages/components/icons.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import IconsView from 'src/sections/examples/icons-view';
+
+// ----------------------------------------------------------------------
+
+export default function IconsPage() {
+ return (
+ <>
+
+ Components: Icons
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/image.jsx b/template/src/pages/components/image.jsx
new file mode 100644
index 0000000..eda7340
--- /dev/null
+++ b/template/src/pages/components/image.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ImageView from 'src/sections/examples/image-view';
+
+// ----------------------------------------------------------------------
+
+export default function ImagePage() {
+ return (
+ <>
+
+ Components: Image
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/index.jsx b/template/src/pages/components/index.jsx
new file mode 100644
index 0000000..8e0e17b
--- /dev/null
+++ b/template/src/pages/components/index.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ComponentsView from 'src/sections/examples/view';
+
+// ----------------------------------------------------------------------
+
+export default function ComponentsPage() {
+ return (
+ <>
+
+ Components
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/label.jsx b/template/src/pages/components/label.jsx
new file mode 100644
index 0000000..4314ffc
--- /dev/null
+++ b/template/src/pages/components/label.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import LabelView from 'src/sections/examples/label-view';
+
+// ----------------------------------------------------------------------
+
+export default function LabelPage() {
+ return (
+ <>
+
+ Components: Label
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/lightbox.jsx b/template/src/pages/components/lightbox.jsx
new file mode 100644
index 0000000..89ed98e
--- /dev/null
+++ b/template/src/pages/components/lightbox.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import LightboxView from 'src/sections/examples/lightbox-view';
+
+// ----------------------------------------------------------------------
+
+export default function LightboxPage() {
+ return (
+ <>
+
+ Components: Lightbox
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/markdown.jsx b/template/src/pages/components/markdown.jsx
new file mode 100644
index 0000000..fbf28f5
--- /dev/null
+++ b/template/src/pages/components/markdown.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarkdownView from 'src/sections/examples/markdown-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarkdownPage() {
+ return (
+ <>
+
+ Extra Components: Markdown
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/mega-menu.jsx b/template/src/pages/components/mega-menu.jsx
new file mode 100644
index 0000000..c9c9463
--- /dev/null
+++ b/template/src/pages/components/mega-menu.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MegaMenuView from 'src/sections/examples/mega-menu-view';
+
+// ----------------------------------------------------------------------
+
+export default function MegaMenuPage() {
+ return (
+ <>
+
+ Components: Mega Menu
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/navigation-bar.jsx b/template/src/pages/components/navigation-bar.jsx
new file mode 100644
index 0000000..0517c50
--- /dev/null
+++ b/template/src/pages/components/navigation-bar.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import NavigationBarView from 'src/sections/examples/navigation-bar-view';
+
+// ----------------------------------------------------------------------
+
+export default function NavigationBarPage() {
+ return (
+ <>
+
+ Components: Navigation Bar
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/player.jsx b/template/src/pages/components/player.jsx
new file mode 100644
index 0000000..83848a5
--- /dev/null
+++ b/template/src/pages/components/player.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import PlayerView from 'src/sections/examples/player-view';
+
+// ----------------------------------------------------------------------
+
+export default function PlayerPage() {
+ return (
+ <>
+
+ Components: Player
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/scroll-progress.jsx b/template/src/pages/components/scroll-progress.jsx
new file mode 100644
index 0000000..daa5043
--- /dev/null
+++ b/template/src/pages/components/scroll-progress.jsx
@@ -0,0 +1,11 @@
+import ScrollProgressView from 'src/sections/examples/scroll-progress-view';
+
+// ----------------------------------------------------------------------
+
+export const metadata = {
+ title: 'Components: Scroll Progress',
+};
+
+export default function ScrollProgressPage() {
+ return ;
+}
diff --git a/template/src/pages/components/scroll.jsx b/template/src/pages/components/scroll.jsx
new file mode 100644
index 0000000..358771c
--- /dev/null
+++ b/template/src/pages/components/scroll.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ScrollView from 'src/sections/examples/scroll-view';
+
+// ----------------------------------------------------------------------
+
+export default function ScrollbarPage() {
+ return (
+ <>
+
+ Components: Scrollbar
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/components/text-max-line.jsx b/template/src/pages/components/text-max-line.jsx
new file mode 100644
index 0000000..0184cc3
--- /dev/null
+++ b/template/src/pages/components/text-max-line.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TextMaxLineView from 'src/sections/examples/text-max-line-view';
+
+// ----------------------------------------------------------------------
+
+export default function TextMaxLinePage() {
+ return (
+ <>
+
+ Components: Text Max Line
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/account/orders.jsx b/template/src/pages/e-commerce/account/orders.jsx
new file mode 100644
index 0000000..ff3f08c
--- /dev/null
+++ b/template/src/pages/e-commerce/account/orders.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceAccountOrdersView from 'src/sections/_ecommerce/view/ecommerce-account-orders-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountOrdersPage() {
+ return (
+ <>
+
+ E-commerce: Account Orders
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/account/payment.jsx b/template/src/pages/e-commerce/account/payment.jsx
new file mode 100644
index 0000000..de8534e
--- /dev/null
+++ b/template/src/pages/e-commerce/account/payment.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceAccountPaymentView from 'src/sections/_ecommerce/view/ecommerce-account-payment-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountPaymentPage() {
+ return (
+ <>
+
+ E-commerce: Account Payment
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/account/personal.jsx b/template/src/pages/e-commerce/account/personal.jsx
new file mode 100644
index 0000000..2c8188a
--- /dev/null
+++ b/template/src/pages/e-commerce/account/personal.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceAccountPersonalView from 'src/sections/_ecommerce/view/ecommerce-account-personal-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountPersonalPage() {
+ return (
+ <>
+
+ E-commerce: Account Personal
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/account/vouchers.jsx b/template/src/pages/e-commerce/account/vouchers.jsx
new file mode 100644
index 0000000..fe8ff03
--- /dev/null
+++ b/template/src/pages/e-commerce/account/vouchers.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceAccountVouchersView from 'src/sections/_ecommerce/view/ecommerce-account-vouchers-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountVouchersPage() {
+ return (
+ <>
+
+ E-commerce: Account Vouchers
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/account/wishlist.jsx b/template/src/pages/e-commerce/account/wishlist.jsx
new file mode 100644
index 0000000..60c35e1
--- /dev/null
+++ b/template/src/pages/e-commerce/account/wishlist.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceAccountWishlistView from 'src/sections/_ecommerce/view/ecommerce-account-wishlist-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountWishlistPage() {
+ return (
+ <>
+
+ E-commerce: Account Wishlist
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/cart.jsx b/template/src/pages/e-commerce/cart.jsx
new file mode 100644
index 0000000..aaf9ea1
--- /dev/null
+++ b/template/src/pages/e-commerce/cart.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceCartView from 'src/sections/_ecommerce/view/ecommerce-cart-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCartPage() {
+ return (
+ <>
+
+ E-commerce: Cart
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/checkout.jsx b/template/src/pages/e-commerce/checkout.jsx
new file mode 100644
index 0000000..d6e9b10
--- /dev/null
+++ b/template/src/pages/e-commerce/checkout.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceCheckoutView from 'src/sections/_ecommerce/view/ecommerce-checkout-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCheckoutPage() {
+ return (
+ <>
+
+ E-commerce: Checkout
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/compare.jsx b/template/src/pages/e-commerce/compare.jsx
new file mode 100644
index 0000000..15f759a
--- /dev/null
+++ b/template/src/pages/e-commerce/compare.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceCompareView from 'src/sections/_ecommerce/view/ecommerce-compare-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceComparePage() {
+ return (
+ <>
+
+ E-commerce: Compare
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/landing.jsx b/template/src/pages/e-commerce/landing.jsx
new file mode 100644
index 0000000..c223f59
--- /dev/null
+++ b/template/src/pages/e-commerce/landing.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceLandingView from 'src/sections/_ecommerce/view/ecommerce-landing-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingPage() {
+ return (
+ <>
+
+ E-commerce: Home
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/order-completed.jsx b/template/src/pages/e-commerce/order-completed.jsx
new file mode 100644
index 0000000..9b7dada
--- /dev/null
+++ b/template/src/pages/e-commerce/order-completed.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceOrderCompletedView from 'src/sections/_ecommerce/view/ecommerce-order-completed-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceOrderCompletedPage() {
+ return (
+ <>
+
+ E-commerce: Order Completed
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/product.jsx b/template/src/pages/e-commerce/product.jsx
new file mode 100644
index 0000000..17112fe
--- /dev/null
+++ b/template/src/pages/e-commerce/product.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceProductView from 'src/sections/_ecommerce/view/ecommerce-product-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductPage() {
+ return (
+ <>
+
+ E-commerce: Product
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/products.jsx b/template/src/pages/e-commerce/products.jsx
new file mode 100644
index 0000000..9537a5b
--- /dev/null
+++ b/template/src/pages/e-commerce/products.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceProductsView from 'src/sections/_ecommerce/view/ecommerce-products-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductsPage() {
+ return (
+ <>
+
+ E-commerce: Products
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-commerce/wishlist.jsx b/template/src/pages/e-commerce/wishlist.jsx
new file mode 100644
index 0000000..93806cb
--- /dev/null
+++ b/template/src/pages/e-commerce/wishlist.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import EcommerceWishlistView from 'src/sections/_ecommerce/view/ecommerce-wishlist-view';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceWishlistPage() {
+ return (
+ <>
+
+ E-commerce: Wishlist
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-learning/about.jsx b/template/src/pages/e-learning/about.jsx
new file mode 100644
index 0000000..3a4a099
--- /dev/null
+++ b/template/src/pages/e-learning/about.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ElearningAboutView from 'src/sections/_elearning/view/elearning-about-view';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningAboutPage() {
+ return (
+ <>
+
+ E-learning: About us
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-learning/contact.jsx b/template/src/pages/e-learning/contact.jsx
new file mode 100644
index 0000000..37c8eb8
--- /dev/null
+++ b/template/src/pages/e-learning/contact.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ElearningContactView from 'src/sections/_elearning/view/elearning-contact-view';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningContactPage() {
+ return (
+ <>
+
+ E-learning: Contact us
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-learning/course.jsx b/template/src/pages/e-learning/course.jsx
new file mode 100644
index 0000000..26bba35
--- /dev/null
+++ b/template/src/pages/e-learning/course.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ElearningCourseView from 'src/sections/_elearning/view/elearning-course-view';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCoursePage() {
+ return (
+ <>
+
+ E-learning: Course
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-learning/courses.jsx b/template/src/pages/e-learning/courses.jsx
new file mode 100644
index 0000000..10a8bb0
--- /dev/null
+++ b/template/src/pages/e-learning/courses.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ElearningCoursesView from 'src/sections/_elearning/view/elearning-courses-view';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCoursesPage() {
+ return (
+ <>
+
+ E-learning: Courses
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-learning/landing.jsx b/template/src/pages/e-learning/landing.jsx
new file mode 100644
index 0000000..307667c
--- /dev/null
+++ b/template/src/pages/e-learning/landing.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ElearningLandingView from 'src/sections/_elearning/view/elearning-landing-view';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningLandingPage() {
+ return (
+ <>
+
+ E-learning: Home
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-learning/post.jsx b/template/src/pages/e-learning/post.jsx
new file mode 100644
index 0000000..ef39703
--- /dev/null
+++ b/template/src/pages/e-learning/post.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ElearningPostView from 'src/sections/_elearning/view/elearning-post-view';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningPostPage() {
+ return (
+ <>
+
+ E-learning: Blog Post
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/e-learning/posts.jsx b/template/src/pages/e-learning/posts.jsx
new file mode 100644
index 0000000..2f8eca2
--- /dev/null
+++ b/template/src/pages/e-learning/posts.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import ElearningPostsView from 'src/sections/_elearning/view/elearning-posts-view';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningPostsPage() {
+ return (
+ <>
+
+ E-learning: Blog
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/home.jsx b/template/src/pages/home.jsx
new file mode 100644
index 0000000..09e3306
--- /dev/null
+++ b/template/src/pages/home.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import HomeView from 'src/sections/_home/view/home-view';
+
+// ----------------------------------------------------------------------
+
+export default function HomePage() {
+ return (
+ <>
+
+ The starting point for your next project
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/maintenance.jsx b/template/src/pages/maintenance.jsx
new file mode 100644
index 0000000..005ba68
--- /dev/null
+++ b/template/src/pages/maintenance.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MaintenanceView from 'src/sections/status/view/maintenance-view';
+
+// ----------------------------------------------------------------------
+
+export default function MaintenancePage() {
+ return (
+ <>
+
+ Maintenance
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/marketing/about.jsx b/template/src/pages/marketing/about.jsx
new file mode 100644
index 0000000..4c5ab60
--- /dev/null
+++ b/template/src/pages/marketing/about.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarketingAboutView from 'src/sections/_marketing/view/marketing-about-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingAboutPage() {
+ return (
+ <>
+
+ Marketing: About us
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/marketing/case-studies.jsx b/template/src/pages/marketing/case-studies.jsx
new file mode 100644
index 0000000..099ede0
--- /dev/null
+++ b/template/src/pages/marketing/case-studies.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarketingCaseStudiesView from 'src/sections/_marketing/view/marketing-case-studies-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingCaseStudiesPage() {
+ return (
+ <>
+
+ Marketing: Case Studies
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/marketing/case-study.jsx b/template/src/pages/marketing/case-study.jsx
new file mode 100644
index 0000000..83f9b3a
--- /dev/null
+++ b/template/src/pages/marketing/case-study.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarketingCaseStudyView from 'src/sections/_marketing/view/marketing-case-study-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingCaseStudyPage() {
+ return (
+ <>
+
+ Marketing: Case Study
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/marketing/contact.jsx b/template/src/pages/marketing/contact.jsx
new file mode 100644
index 0000000..d5bb2ac
--- /dev/null
+++ b/template/src/pages/marketing/contact.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarketingContactView from 'src/sections/_marketing/view/marketing-contact-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingContactPage() {
+ return (
+ <>
+
+ Marketing: Contact us
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/marketing/landing.jsx b/template/src/pages/marketing/landing.jsx
new file mode 100644
index 0000000..f390183
--- /dev/null
+++ b/template/src/pages/marketing/landing.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarketingLandingView from 'src/sections/_marketing/view/marketing-landing-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingPage() {
+ return (
+ <>
+
+ Marketing: Home
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/marketing/post.jsx b/template/src/pages/marketing/post.jsx
new file mode 100644
index 0000000..de8dfb7
--- /dev/null
+++ b/template/src/pages/marketing/post.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarketingPostView from 'src/sections/_marketing/view/marketing-post-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingPostPage() {
+ return (
+ <>
+
+ Marketing: Blog Post
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/marketing/posts.jsx b/template/src/pages/marketing/posts.jsx
new file mode 100644
index 0000000..3801207
--- /dev/null
+++ b/template/src/pages/marketing/posts.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarketingPostsView from 'src/sections/_marketing/view/marketing-posts-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingPostsPage() {
+ return (
+ <>
+
+ Marketing: Blog
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/marketing/services.jsx b/template/src/pages/marketing/services.jsx
new file mode 100644
index 0000000..b6bd2ae
--- /dev/null
+++ b/template/src/pages/marketing/services.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import MarketingServicesView from 'src/sections/_marketing/view/marketing-services-view';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingServicesPage() {
+ return (
+ <>
+
+ Marketing: Services
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/payment.jsx b/template/src/pages/payment.jsx
new file mode 100644
index 0000000..8df063f
--- /dev/null
+++ b/template/src/pages/payment.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import PaymentView from 'src/sections/payment/view/payment-view';
+
+// ----------------------------------------------------------------------
+
+export default function PaymentPage() {
+ return (
+ <>
+
+ Payment
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/pricing-01.jsx b/template/src/pages/pricing-01.jsx
new file mode 100644
index 0000000..bf0cced
--- /dev/null
+++ b/template/src/pages/pricing-01.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import Pricing01View from 'src/sections/pricing/view/pricing-01-view';
+
+// ----------------------------------------------------------------------
+
+export default function Pricing01Page() {
+ return (
+ <>
+
+ Pricing 01
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/pricing-02.jsx b/template/src/pages/pricing-02.jsx
new file mode 100644
index 0000000..b8238cc
--- /dev/null
+++ b/template/src/pages/pricing-02.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import Pricing02View from 'src/sections/pricing/view/pricing-02-view';
+
+// ----------------------------------------------------------------------
+
+export default function Pricing02Page() {
+ return (
+ <>
+
+ Pricing 02
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/support.jsx b/template/src/pages/support.jsx
new file mode 100644
index 0000000..a22c868
--- /dev/null
+++ b/template/src/pages/support.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import SupportView from 'src/sections/support/view/support-view';
+
+// ----------------------------------------------------------------------
+
+export default function SupportPage() {
+ return (
+ <>
+
+ Support
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/about.jsx b/template/src/pages/travel/about.jsx
new file mode 100644
index 0000000..9297aa0
--- /dev/null
+++ b/template/src/pages/travel/about.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelAboutView from 'src/sections/_travel/view/travel-about-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelAboutPage() {
+ return (
+ <>
+
+ Travel: About us
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/checkout.jsx b/template/src/pages/travel/checkout.jsx
new file mode 100644
index 0000000..1dcc83b
--- /dev/null
+++ b/template/src/pages/travel/checkout.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelCheckoutView from 'src/sections/_travel/view/travel-checkout-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelCheckoutPage() {
+ return (
+ <>
+
+ Travel: Checkout
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/contact.jsx b/template/src/pages/travel/contact.jsx
new file mode 100644
index 0000000..cadf39d
--- /dev/null
+++ b/template/src/pages/travel/contact.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelContactView from 'src/sections/_travel/view/travel-contact-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelContactPage() {
+ return (
+ <>
+
+ Travel: Contact us
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/landing.jsx b/template/src/pages/travel/landing.jsx
new file mode 100644
index 0000000..2d096dc
--- /dev/null
+++ b/template/src/pages/travel/landing.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelLandingView from 'src/sections/_travel/view/travel-landing-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingPage() {
+ return (
+ <>
+
+ Travel: Home
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/order-completed.jsx b/template/src/pages/travel/order-completed.jsx
new file mode 100644
index 0000000..68386bd
--- /dev/null
+++ b/template/src/pages/travel/order-completed.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelOrderCompletedView from 'src/sections/_travel/view/travel-order-completed-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelOrderCompletedPage() {
+ return (
+ <>
+
+ Travel: Order Completed
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/post.jsx b/template/src/pages/travel/post.jsx
new file mode 100644
index 0000000..88eca4a
--- /dev/null
+++ b/template/src/pages/travel/post.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelPostView from 'src/sections/_travel/view/travel-post-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelPostPage() {
+ return (
+ <>
+
+ Travel: Blog Post
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/posts.jsx b/template/src/pages/travel/posts.jsx
new file mode 100644
index 0000000..78ec64a
--- /dev/null
+++ b/template/src/pages/travel/posts.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelPostsView from 'src/sections/_travel/view/travel-posts-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelPostsPage() {
+ return (
+ <>
+
+ Travel: Blog
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/tour.jsx b/template/src/pages/travel/tour.jsx
new file mode 100644
index 0000000..d23886b
--- /dev/null
+++ b/template/src/pages/travel/tour.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelTourView from 'src/sections/_travel/view/travel-tour-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourPage() {
+ return (
+ <>
+
+ Travel: Tour
+
+
+
+ >
+ );
+}
diff --git a/template/src/pages/travel/tours.jsx b/template/src/pages/travel/tours.jsx
new file mode 100644
index 0000000..d89748c
--- /dev/null
+++ b/template/src/pages/travel/tours.jsx
@@ -0,0 +1,17 @@
+import { Helmet } from 'react-helmet-async';
+
+import TravelToursView from 'src/sections/_travel/view/travel-tours-view';
+
+// ----------------------------------------------------------------------
+
+export default function TravelToursPage() {
+ return (
+ <>
+
+ Travel: Tours
+
+
+
+ >
+ );
+}
diff --git a/template/src/routes/components/index.js b/template/src/routes/components/index.js
new file mode 100644
index 0000000..b293f85
--- /dev/null
+++ b/template/src/routes/components/index.js
@@ -0,0 +1 @@
+export { default as RouterLink } from './router-link';
diff --git a/template/src/routes/components/router-link.jsx b/template/src/routes/components/router-link.jsx
new file mode 100644
index 0000000..f17e744
--- /dev/null
+++ b/template/src/routes/components/router-link.jsx
@@ -0,0 +1,13 @@
+import PropTypes from 'prop-types';
+import { forwardRef } from 'react';
+import { Link } from 'react-router-dom';
+
+// ----------------------------------------------------------------------
+
+const RouterLink = forwardRef(({ href, ...other }, ref) => );
+
+RouterLink.propTypes = {
+ href: PropTypes.string,
+};
+
+export default RouterLink;
diff --git a/template/src/routes/hooks/index.js b/template/src/routes/hooks/index.js
new file mode 100644
index 0000000..8a6f86f
--- /dev/null
+++ b/template/src/routes/hooks/index.js
@@ -0,0 +1,5 @@
+export { useRouter } from './use-router';
+export { useParams } from './use-params';
+export { usePathname } from './use-pathname';
+export { useActiveLink } from './use-active-link';
+export { useSearchParams } from './use-search-params';
diff --git a/template/src/routes/hooks/use-active-link.js b/template/src/routes/hooks/use-active-link.js
new file mode 100644
index 0000000..282417c
--- /dev/null
+++ b/template/src/routes/hooks/use-active-link.js
@@ -0,0 +1,13 @@
+import { matchPath, useLocation } from 'react-router-dom';
+
+// ----------------------------------------------------------------------
+
+export function useActiveLink(path, deep = true) {
+ const { pathname } = useLocation();
+
+ const normalActive = path ? !!matchPath({ path, end: true }, pathname) : false;
+
+ const deepActive = path ? !!matchPath({ path, end: false }, pathname) : false;
+
+ return deep ? deepActive : normalActive;
+}
diff --git a/template/src/routes/hooks/use-params.js b/template/src/routes/hooks/use-params.js
new file mode 100644
index 0000000..6876ff3
--- /dev/null
+++ b/template/src/routes/hooks/use-params.js
@@ -0,0 +1,10 @@
+import { useMemo } from 'react';
+import { useParams as _useParams } from 'react-router-dom';
+
+// ----------------------------------------------------------------------
+
+export function useParams() {
+ const params = _useParams();
+
+ return useMemo(() => params, [params]);
+}
diff --git a/template/src/routes/hooks/use-pathname.js b/template/src/routes/hooks/use-pathname.js
new file mode 100644
index 0000000..6e96c24
--- /dev/null
+++ b/template/src/routes/hooks/use-pathname.js
@@ -0,0 +1,10 @@
+import { useMemo } from 'react';
+import { useLocation } from 'react-router-dom';
+
+// ----------------------------------------------------------------------
+
+export function usePathname() {
+ const { pathname } = useLocation();
+
+ return useMemo(() => pathname, [pathname]);
+}
diff --git a/template/src/routes/hooks/use-router.js b/template/src/routes/hooks/use-router.js
new file mode 100644
index 0000000..5ad675f
--- /dev/null
+++ b/template/src/routes/hooks/use-router.js
@@ -0,0 +1,21 @@
+import { useMemo } from 'react';
+import { useNavigate } from 'react-router-dom';
+
+// ----------------------------------------------------------------------
+
+export function useRouter() {
+ const navigate = useNavigate();
+
+ const router = useMemo(
+ () => ({
+ back: () => navigate(-1),
+ forward: () => navigate(1),
+ reload: () => window.location.reload(),
+ push: (href) => navigate(href),
+ replace: (href) => navigate(href, { replace: true }),
+ }),
+ [navigate]
+ );
+
+ return router;
+}
diff --git a/template/src/routes/hooks/use-search-params.js b/template/src/routes/hooks/use-search-params.js
new file mode 100644
index 0000000..b29af44
--- /dev/null
+++ b/template/src/routes/hooks/use-search-params.js
@@ -0,0 +1,10 @@
+import { useMemo } from 'react';
+import { useSearchParams as _useSearchParams } from 'react-router-dom';
+
+// ----------------------------------------------------------------------
+
+export function useSearchParams() {
+ const [searchParams] = _useSearchParams();
+
+ return useMemo(() => searchParams, [searchParams]);
+}
diff --git a/template/src/routes/paths.js b/template/src/routes/paths.js
new file mode 100644
index 0000000..1be5cfc
--- /dev/null
+++ b/template/src/routes/paths.js
@@ -0,0 +1,111 @@
+// ----------------------------------------------------------------------
+
+export const paths = {
+ // Marketing
+ marketing: {
+ root: '/marketing',
+ services: '/marketing/services',
+ caseStudies: '/marketing/case-studies',
+ caseStudy: `/marketing/case-study`,
+ posts: '/marketing/posts',
+ post: `/marketing/post`,
+ about: '/marketing/about',
+ contact: '/marketing/contact',
+ },
+ // Travel
+ travel: {
+ root: '/travel',
+ tours: '/travel/tours',
+ tour: `/travel/tour`,
+ checkout: '/travel/checkout',
+ orderCompleted: '/travel/order-completed',
+ posts: '/travel/posts',
+ post: `/travel/post`,
+ about: '/travel/about',
+ contact: '/travel/contact',
+ },
+ // Career
+ career: {
+ root: '/career',
+ jobs: '/career/jobs',
+ job: `/career/job`,
+ posts: '/career/posts',
+ post: `/career/post`,
+ about: '/career/about',
+ contact: '/career/contact',
+ },
+ // E-learning
+ eLearning: {
+ root: '/e-learning',
+ courses: '/e-learning/courses',
+ course: `/e-learning/course`,
+ posts: '/e-learning/posts',
+ post: `/e-learning/post`,
+ about: '/e-learning/about',
+ contact: '/e-learning/contact',
+ },
+ // E-commerce
+ eCommerce: {
+ root: '/e-commerce',
+ products: '/e-commerce/products',
+ product: `/e-commerce/product`,
+ cart: '/e-commerce/cart',
+ checkout: `/e-commerce/checkout`,
+ orderCompleted: '/e-commerce/order-completed',
+ wishlist: `/e-commerce/wishlist`,
+ compare: `/e-commerce/compare`,
+ account: {
+ root: `/e-commerce/account`,
+ personal: `/e-commerce/account/personal`,
+ wishlist: `/e-commerce/account/wishlist`,
+ vouchers: `/e-commerce/account/vouchers`,
+ orders: `/e-commerce/account/orders`,
+ payment: `/e-commerce/account/payment`,
+ },
+ },
+ // Auth
+ loginCover: '/auth/login-cover',
+ loginBackground: '/auth/login-background',
+ loginIllustration: '/auth/login-illustration',
+ registerCover: '/auth/register-cover',
+ registerBackground: '/auth/register-background',
+ registerIllustration: '/auth/register-illustration',
+ forgotPassword: '/auth/forgot-password',
+ verify: '/auth/verify',
+ // Common
+ maintenance: '/maintenance',
+ comingsoon: '/coming-soon',
+ pricing01: '/pricing-01',
+ pricing02: '/pricing-02',
+ payment: '/payment',
+ support: '/support',
+ page404: '/404',
+ page500: '/error',
+ // Components
+ components: {
+ root: '/components',
+ animate: '/components/animate',
+ carousel: '/components/carousel',
+ countUp: '/components/count-up',
+ form: '/components/form-validation',
+ icons: '/components/icons',
+ image: '/components/image',
+ label: '/components/label',
+ lightbox: '/components/lightbox',
+ markdown: '/components/markdown',
+ megaMenu: '/components/mega-menu',
+ navigation: '/components/navigation-bar',
+ scroll: '/components/scroll',
+ scrollProgress: '/components/scroll-progress',
+ player: '/components/player',
+ textMaxLine: '/components/text-max-line',
+ },
+ // Others
+ pages: '/pages',
+ docs: 'https://zone-docs.vercel.app',
+ license: 'https://material-ui.com/store/license/#i-standard-license',
+ minimalStore: 'https://material-ui.com/store/items/minimal-dashboard',
+ zoneStore: 'https://mui.com/store/items/zone-landing-page/',
+ figmaPreview:
+ 'https://www.figma.com/file/Zam9QBLhV4pZf5xtNs0Lf8/%5BPreview%5D-Zone_Web.v2.3.0?type=design&node-id=59%3A680507&mode=design&t=GCVeJci5zfUu5WCy-1',
+};
diff --git a/template/src/routes/sections/auth.jsx b/template/src/routes/sections/auth.jsx
new file mode 100644
index 0000000..36b57ea
--- /dev/null
+++ b/template/src/routes/sections/auth.jsx
@@ -0,0 +1,98 @@
+import { lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import AuthCoverLayout from 'src/layouts/auth/cover';
+import AuthBackgroundLayout from 'src/layouts/auth/background';
+import AuthIllustrationLayout from 'src/layouts/auth/illustration';
+
+// ----------------------------------------------------------------------
+
+const LoginBackgroundPage = lazy(() => import('src/pages/auth/login-background'));
+const LoginCoverPage = lazy(() => import('src/pages/auth/login-cover'));
+const LoginIllustrationPage = lazy(() => import('src/pages/auth/login-illustration'));
+const RegisterBackgroundPage = lazy(() => import('src/pages/auth/register-background'));
+const RegisterCoverPage = lazy(() => import('src/pages/auth/register-cover'));
+const RegisterIllustrationPage = lazy(() => import('src/pages/auth/register-illustration'));
+const ForgotPasswordPage = lazy(() => import('src/pages/auth/forgot-password'));
+const VerifyPage = lazy(() => import('src/pages/auth/verify'));
+
+// ----------------------------------------------------------------------
+
+export const authRoutes = [
+ {
+ path: 'auth',
+ children: [
+ {
+ path: 'login-cover',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: 'register-cover',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: 'login-illustration',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: 'register-illustration',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: 'login-background',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: 'register-background',
+ element: (
+
+
+
+ ),
+ },
+ {
+ element: (
+
+
+
+ ),
+ children: [
+ { path: 'forgot-password', element: },
+ { path: 'verify', element: },
+ ],
+ },
+ ],
+ },
+];
diff --git a/template/src/routes/sections/career.jsx b/template/src/routes/sections/career.jsx
new file mode 100644
index 0000000..1e14cef
--- /dev/null
+++ b/template/src/routes/sections/career.jsx
@@ -0,0 +1,47 @@
+import { lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import MainLayout from 'src/layouts/main';
+
+// ----------------------------------------------------------------------
+
+const AboutPage = lazy(() => import('src/pages/career/about'));
+const BlogPage = lazy(() => import('src/pages/career/posts'));
+const ContactPage = lazy(() => import('src/pages/career/contact'));
+const JobPage = lazy(() => import('src/pages/career/job'));
+const JobsPage = lazy(() => import('src/pages/career/jobs'));
+const LandingPage = lazy(() => import('src/pages/career/landing'));
+const PostPage = lazy(() => import('src/pages/career/post'));
+
+// ----------------------------------------------------------------------
+
+export const careerRoutes = [
+ {
+ path: 'career',
+ children: [
+ {
+ element: (
+
+
+
+ ),
+ index: true,
+ },
+ {
+ element: (
+
+
+
+ ),
+ children: [
+ { path: 'jobs', element: },
+ { path: 'job', element: },
+ { path: 'posts', element: },
+ { path: 'post', element: },
+ { path: 'about', element: },
+ { path: 'contact', element: },
+ ],
+ },
+ ],
+ },
+];
diff --git a/template/src/routes/sections/common.jsx b/template/src/routes/sections/common.jsx
new file mode 100644
index 0000000..13c4746
--- /dev/null
+++ b/template/src/routes/sections/common.jsx
@@ -0,0 +1,41 @@
+import { lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import SimpleLayout from 'src/layouts/simple';
+import CompactLayout from 'src/layouts/compact';
+
+// ----------------------------------------------------------------------
+
+const ComingSoonPage = lazy(() => import('src/pages/coming-soon'));
+const MaintenancePage = lazy(() => import('src/pages/maintenance'));
+const PaymentPage = lazy(() => import('src/pages/payment'));
+const Pricing01Page = lazy(() => import('src/pages/pricing-01'));
+const Pricing02Page = lazy(() => import('src/pages/pricing-02'));
+
+// ----------------------------------------------------------------------
+
+export const commonRoutes = [
+ {
+ element: (
+
+
+
+ ),
+ children: [
+ { path: 'payment', element: },
+ { path: 'pricing-01', element: },
+ { path: 'pricing-02', element: },
+ ],
+ },
+ {
+ element: (
+
+
+
+ ),
+ children: [
+ { path: 'coming-soon', element: },
+ { path: 'maintenance', element: },
+ ],
+ },
+];
diff --git a/template/src/routes/sections/components.jsx b/template/src/routes/sections/components.jsx
new file mode 100644
index 0000000..194cedf
--- /dev/null
+++ b/template/src/routes/sections/components.jsx
@@ -0,0 +1,54 @@
+import { lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import MainLayout from 'src/layouts/main';
+
+// ----------------------------------------------------------------------
+
+const IndexPage = lazy(() => import('src/pages/components'));
+const IconsPage = lazy(() => import('src/pages/components/icons'));
+const ImagePage = lazy(() => import('src/pages/components/image'));
+const LabelPage = lazy(() => import('src/pages/components/label'));
+const PlayerPage = lazy(() => import('src/pages/components/player'));
+const AnimatePage = lazy(() => import('src/pages/components/animate'));
+const CountUpPage = lazy(() => import('src/pages/components/count-up'));
+const ScrollbarPage = lazy(() => import('src/pages/components/scroll'));
+const LightboxPage = lazy(() => import('src/pages/components/lightbox'));
+const MarkdownPage = lazy(() => import('src/pages/components/markdown'));
+const CarouselsPage = lazy(() => import('src/pages/components/carousel'));
+const MegaMenuPage = lazy(() => import('src/pages/components/mega-menu'));
+const TextMaxLinePage = lazy(() => import('src/pages/components/text-max-line'));
+const NavigationBarPage = lazy(() => import('src/pages/components/navigation-bar'));
+const FormValidationPage = lazy(() => import('src/pages/components/form-validation'));
+const ScrollProgressPage = lazy(() => import('src/pages/components/scroll-progress'));
+
+// ----------------------------------------------------------------------
+
+export const componentsRoutes = [
+ {
+ path: 'components',
+ element: (
+
+
+
+ ),
+ children: [
+ { element: , index: true },
+ { path: 'animate', element: },
+ { path: 'carousel', element: },
+ { path: 'count-up', element: },
+ { path: 'form-validation', element: },
+ { path: 'icons', element: },
+ { path: 'image', element: },
+ { path: 'label', element: },
+ { path: 'lightbox', element: },
+ { path: 'markdown', element: },
+ { path: 'mega-menu', element: },
+ { path: 'navigation-bar', element: },
+ { path: 'scroll', element: },
+ { path: 'scroll-progress', element: },
+ { path: 'player', element: },
+ { path: 'text-max-line', element: },
+ ],
+ },
+];
diff --git a/template/src/routes/sections/ecommerce.jsx b/template/src/routes/sections/ecommerce.jsx
new file mode 100644
index 0000000..a69d962
--- /dev/null
+++ b/template/src/routes/sections/ecommerce.jsx
@@ -0,0 +1,63 @@
+import { lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import MainLayout from 'src/layouts/main';
+import AccountLayout from 'src/layouts/account';
+import EcommerceLayout from 'src/layouts/ecommerce';
+
+// ----------------------------------------------------------------------
+
+const CartPage = lazy(() => import('src/pages/e-commerce/cart'));
+const ComparePage = lazy(() => import('src/pages/e-commerce/compare'));
+const LandingPage = lazy(() => import('src/pages/e-commerce/landing'));
+const ProductPage = lazy(() => import('src/pages/e-commerce/product'));
+const CheckoutPage = lazy(() => import('src/pages/e-commerce/checkout'));
+const ProductsPage = lazy(() => import('src/pages/e-commerce/products'));
+const WishlistPage = lazy(() => import('src/pages/e-commerce/wishlist'));
+const OrderCompletedPage = lazy(() => import('src/pages/e-commerce/order-completed'));
+
+const AccountOrdersPage = lazy(() => import('src/pages/e-commerce/account/orders'));
+const AccountPaymentPage = lazy(() => import('src/pages/e-commerce/account/payment'));
+const AccountPersonalPage = lazy(() => import('src/pages/e-commerce/account/personal'));
+const AccountVouchersPage = lazy(() => import('src/pages/e-commerce/account/vouchers'));
+const AccountWishlistPage = lazy(() => import('src/pages/e-commerce/account/wishlist'));
+
+// ----------------------------------------------------------------------
+
+export const eCommerceRoutes = [
+ {
+ path: 'e-commerce',
+ element: (
+
+
+
+
+
+ ),
+ children: [
+ { element: , index: true },
+ { path: 'products', element: },
+ { path: 'product', element: },
+ { path: 'cart', element: },
+ { path: 'checkout', element: },
+ { path: 'order-completed', element: },
+ { path: 'wishlist', element: },
+ { path: 'compare', element: },
+ {
+ path: 'account',
+ element: (
+
+
+
+ ),
+ children: [
+ { path: 'personal', element: },
+ { path: 'wishlist', element: },
+ { path: 'vouchers', element: },
+ { path: 'orders', element: },
+ { path: 'payment', element: },
+ ],
+ },
+ ],
+ },
+];
diff --git a/template/src/routes/sections/elearning.jsx b/template/src/routes/sections/elearning.jsx
new file mode 100644
index 0000000..376af58
--- /dev/null
+++ b/template/src/routes/sections/elearning.jsx
@@ -0,0 +1,47 @@
+import { lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import MainLayout from 'src/layouts/main';
+
+// ----------------------------------------------------------------------
+
+const AboutPage = lazy(() => import('src/pages/e-learning/about'));
+const BlogPage = lazy(() => import('src/pages/e-learning/posts'));
+const ContactPage = lazy(() => import('src/pages/e-learning/contact'));
+const CoursePage = lazy(() => import('src/pages/e-learning/course'));
+const CoursesPage = lazy(() => import('src/pages/e-learning/courses'));
+const LandingPage = lazy(() => import('src/pages/e-learning/landing'));
+const PostPage = lazy(() => import('src/pages/e-learning/post'));
+
+// ----------------------------------------------------------------------
+
+export const eLearningRoutes = [
+ {
+ path: 'e-learning',
+ children: [
+ {
+ element: (
+
+
+
+ ),
+ index: true,
+ },
+ {
+ element: (
+
+
+
+ ),
+ children: [
+ { path: 'courses', element: },
+ { path: 'course', element: },
+ { path: 'posts', element: },
+ { path: 'post', element: },
+ { path: 'about', element: },
+ { path: 'contact', element: },
+ ],
+ },
+ ],
+ },
+];
diff --git a/template/src/routes/sections/error.jsx b/template/src/routes/sections/error.jsx
new file mode 100644
index 0000000..739c658
--- /dev/null
+++ b/template/src/routes/sections/error.jsx
@@ -0,0 +1,13 @@
+import { lazy } from 'react';
+
+// ----------------------------------------------------------------------
+
+const Page404 = lazy(() => import('src/pages/404'));
+const Page500 = lazy(() => import('src/pages/500'));
+
+// ----------------------------------------------------------------------
+
+export const errorRoutes = [
+ { path: 'error', element: },
+ { path: '404', element: },
+];
diff --git a/template/src/routes/sections/index.jsx b/template/src/routes/sections/index.jsx
new file mode 100644
index 0000000..9efe71b
--- /dev/null
+++ b/template/src/routes/sections/index.jsx
@@ -0,0 +1,74 @@
+import { lazy, Suspense } from 'react';
+import { Outlet, Navigate, useRoutes } from 'react-router-dom';
+
+import MainLayout from 'src/layouts/main';
+
+import { SplashScreen } from 'src/components/loading-screen';
+
+import { authRoutes } from './auth';
+import { errorRoutes } from './error';
+import { commonRoutes } from './common';
+import { careerRoutes } from './career';
+import { travelRoutes } from './travel';
+import { marketingRoutes } from './marketing';
+import { eLearningRoutes } from './elearning';
+import { eCommerceRoutes } from './ecommerce';
+import { componentsRoutes } from './components';
+
+// ----------------------------------------------------------------------
+
+const IndexPage = lazy(() => import('src/pages/home'));
+const SupportPage = lazy(() => import('src/pages/support'));
+
+// ----------------------------------------------------------------------
+
+export default function Router() {
+ return useRoutes([
+ {
+ element: (
+ }>
+
+
+ ),
+ children: [
+ {
+ element: (
+
+
+
+ ),
+ index: true,
+ },
+
+ {
+ path: 'support',
+ element: (
+
+
+
+ ),
+ },
+
+ ...marketingRoutes,
+
+ ...travelRoutes,
+
+ ...careerRoutes,
+
+ ...eLearningRoutes,
+
+ ...eCommerceRoutes,
+
+ ...componentsRoutes,
+
+ ...authRoutes,
+
+ ...errorRoutes,
+
+ ...commonRoutes,
+
+ { path: '*', element: },
+ ],
+ },
+ ]);
+}
diff --git a/template/src/routes/sections/marketing.jsx b/template/src/routes/sections/marketing.jsx
new file mode 100644
index 0000000..de6b90d
--- /dev/null
+++ b/template/src/routes/sections/marketing.jsx
@@ -0,0 +1,49 @@
+import { lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import MainLayout from 'src/layouts/main';
+
+// ----------------------------------------------------------------------
+
+const BlogPage = lazy(() => import('src/pages/marketing/posts'));
+const PostPage = lazy(() => import('src/pages/marketing/post'));
+const AboutPage = lazy(() => import('src/pages/marketing/about'));
+const ContactPage = lazy(() => import('src/pages/marketing/contact'));
+const LandingPage = lazy(() => import('src/pages/marketing/landing'));
+const ServicesPage = lazy(() => import('src/pages/marketing/services'));
+const CaseStudyPage = lazy(() => import('src/pages/marketing/case-study'));
+const CaseStudiesPage = lazy(() => import('src/pages/marketing/case-studies'));
+
+// ----------------------------------------------------------------------
+
+export const marketingRoutes = [
+ {
+ path: 'marketing',
+ children: [
+ {
+ element: (
+
+
+
+ ),
+ index: true,
+ },
+ {
+ element: (
+
+
+
+ ),
+ children: [
+ { path: 'services', element: },
+ { path: 'case-studies', element: },
+ { path: 'case-study', element: },
+ { path: 'posts', element: },
+ { path: 'post', element: },
+ { path: 'about', element: },
+ { path: 'contact', element: },
+ ],
+ },
+ ],
+ },
+];
diff --git a/template/src/routes/sections/travel.jsx b/template/src/routes/sections/travel.jsx
new file mode 100644
index 0000000..15cf328
--- /dev/null
+++ b/template/src/routes/sections/travel.jsx
@@ -0,0 +1,51 @@
+import { lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import MainLayout from 'src/layouts/main';
+
+// ----------------------------------------------------------------------
+
+const BlogPage = lazy(() => import('src/pages/travel/posts'));
+const PostPage = lazy(() => import('src/pages/travel/post'));
+const TourPage = lazy(() => import('src/pages/travel/tour'));
+const AboutPage = lazy(() => import('src/pages/travel/about'));
+const ToursPage = lazy(() => import('src/pages/travel/tours'));
+const ContactPage = lazy(() => import('src/pages/travel/contact'));
+const LandingPage = lazy(() => import('src/pages/travel/landing'));
+const CheckoutPage = lazy(() => import('src/pages/travel/checkout'));
+const OrderCompletedPage = lazy(() => import('src/pages/travel/order-completed'));
+
+// ----------------------------------------------------------------------
+
+export const travelRoutes = [
+ {
+ path: 'travel',
+ children: [
+ {
+ element: (
+
+
+
+ ),
+ index: true,
+ },
+ {
+ element: (
+
+
+
+ ),
+ children: [
+ { path: 'tours', element: },
+ { path: 'tour', element: },
+ { path: 'checkout', element: },
+ { path: 'order-completed', element: },
+ { path: 'posts', element: },
+ { path: 'post', element: },
+ { path: 'about', element: },
+ { path: 'contact', element: },
+ ],
+ },
+ ],
+ },
+];
diff --git a/template/src/sections/_career/about/career-about-our-vision.jsx b/template/src/sections/_career/about/career-about-our-vision.jsx
new file mode 100644
index 0000000..e9d102b
--- /dev/null
+++ b/template/src/sections/_career/about/career-about-our-vision.jsx
@@ -0,0 +1,64 @@
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function CareerAboutOurVision() {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+
+ Fusce convallis metus id felis luctus
+
+
+
+ Fusce convallis metus id felis luctus adipiscing. Etiam imperdiet imperdiet orci.
+ Vestibulum eu odio. Phasellus nec sem in justo pellentesque facilisis.
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+ Fusce convallis metus id felis luctus
+
+
+
+ Fusce convallis metus id felis luctus adipiscing. Etiam imperdiet imperdiet orci.
+ Vestibulum eu odio. Phasellus nec sem in justo pellentesque facilisis.
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/about/career-about.jsx b/template/src/sections/_career/about/career-about.jsx
new file mode 100644
index 0000000..1b9b76d
--- /dev/null
+++ b/template/src/sections/_career/about/career-about.jsx
@@ -0,0 +1,179 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, styled } from '@mui/material/styles';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import CountUp from 'src/components/count-up';
+
+// ----------------------------------------------------------------------
+
+const SUMMARY = [
+ { name: 'Jobs', number: 2230000 },
+ { name: 'Successful Hiring', number: 500000 },
+ { name: 'Partners', number: 250 },
+ { name: 'Employee', number: 1560 },
+];
+
+// ----------------------------------------------------------------------
+
+const StyledSection = styled('div')(({ theme }) => ({
+ overflow: 'hidden',
+ position: 'relative',
+ borderRadius: theme.shape.borderRadius * 2,
+ marginTop: theme.spacing(5),
+ [theme.breakpoints.up('md')]: {
+ marginTop: theme.spacing(10),
+ },
+}));
+
+const StyledOverlay = styled('div')(({ theme }) => ({
+ ...bgGradient({
+ startColor: `${alpha(theme.palette.common.black, 0)} 0%`,
+ endColor: `${theme.palette.common.black} 75%`,
+ }),
+ top: 0,
+ left: 0,
+ zIndex: 8,
+ width: '100%',
+ height: '100%',
+ position: 'absolute',
+ [theme.breakpoints.up('md')]: {
+ right: 0,
+ width: '75%',
+ left: 'auto',
+ },
+ [theme.breakpoints.up('lg')]: {
+ width: '50%',
+ },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function CareerAbout() {
+ return (
+
+
+ About us
+
+
+
+
+ We Make The Best For All Our Customers.
+
+
+
+
+
+ Curabitur ullamcorper ultricies nisi. Sed mollis, eros et ultrices tempus, mauris
+ ipsum aliquam libero, non adipiscing dolor urna a orci.
+
+
+
+ Donec vitae sapien ut libero venenatis faucibus. Vestibulum fringilla pede sit amet
+ augue. Vivamus euismod mauris.
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function Section() {
+ return (
+
+
+
+
+ Our Agency Has Been
+
+
+ Hello. Our agency has been present for over 20 years. We make the best for all our
+ customers.
+
+
+
+
+ {SUMMARY.map((value) => (
+
+
+ fShortenNumber(newValue)}
+ />
+
+
+ +
+
+
+
+
+ {value.name}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/career-download-app.jsx b/template/src/sections/_career/career-download-app.jsx
new file mode 100644
index 0000000..1e5a03e
--- /dev/null
+++ b/template/src/sections/_career/career-download-app.jsx
@@ -0,0 +1,103 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import { alpha, styled } from '@mui/material/styles';
+import Button, { buttonClasses } from '@mui/material/Button';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const StyledButton = styled(Button)(({ theme }) => ({
+ flexShrink: 0,
+ padding: '5px 12px',
+ color: theme.palette.common.white,
+ border: `solid 1px ${alpha(theme.palette.common.black, 0.24)}`,
+ background: `linear-gradient(180deg, ${theme.palette.grey[900]} 0%, ${theme.palette.common.black} 100%)`,
+ [`& .${buttonClasses.startIcon}`]: {
+ marginLeft: 0,
+ },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function CareerDownloadApp() {
+ return (
+
+
+
+
+ Download App
+
+
+ Now finding the new job just got even easier with our new app!
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function AppStoreButton({ ...other }) {
+ return (
+
+ }>
+
+
+ Download on the
+
+
+
+ Apple Store
+
+
+
+
+ }>
+
+
+ Download from
+
+
+
+ Google Play
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/career-newsletter.jsx b/template/src/sections/_career/career-newsletter.jsx
new file mode 100644
index 0000000..d658b11
--- /dev/null
+++ b/template/src/sections/_career/career-newsletter.jsx
@@ -0,0 +1,66 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import InputBase from '@mui/material/InputBase';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { bgGradient } from 'src/theme/css';
+
+// ----------------------------------------------------------------------
+
+export default function CareerNewsletter() {
+ const theme = useTheme();
+
+ return (
+
+
+
+ Get The Right Job For You
+
+
+ Subscribe to get updated on latest and relevant career opportunities
+
+
+
+
+ Subscribe
+
+
+ }
+ sx={{
+ pl: 1.5,
+ width: 1,
+ height: 54,
+ maxWidth: 560,
+ borderRadius: 1,
+ bgcolor: 'common.white',
+ }}
+ />
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/career-our-clients.jsx b/template/src/sections/_career/career-our-clients.jsx
new file mode 100644
index 0000000..235640a
--- /dev/null
+++ b/template/src/sections/_career/career-our-clients.jsx
@@ -0,0 +1,94 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import { useTheme } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+import Carousel, { useCarousel } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function CareerOurClients({ brands }) {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ slidesToShow: 6,
+ slidesToScroll: 1,
+ autoplay: true,
+ speed: 5000,
+ autoplaySpeed: 5000,
+ cssEase: 'linear',
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 4 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 2 },
+ },
+ ],
+ });
+
+ return (
+
+
+ Our Clients
+
+
+ Curabitur a felis in nunc fringilla tristique. Fusce egestas elit eget lorem. Etiam vitae
+ tortor.
+
+
+
+
+ {brands.map((brand) => (
+
+
+
+
+
+ ))}
+
+
+ );
+}
+
+CareerOurClients.propTypes = {
+ brands: PropTypes.array,
+};
diff --git a/template/src/sections/_career/contact/career-contact-form.jsx b/template/src/sections/_career/contact/career-contact-form.jsx
new file mode 100644
index 0000000..d620726
--- /dev/null
+++ b/template/src/sections/_career/contact/career-contact-form.jsx
@@ -0,0 +1,94 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function CareerContactForm() {
+ const CareerContactSchema = Yup.object().shape({
+ fullName: Yup.string().required('Full name is required'),
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ subject: Yup.string().required('Subject is required'),
+ message: Yup.string().required('Message is required'),
+ });
+
+ const defaultValues = {
+ fullName: '',
+ subject: '',
+ email: '',
+ message: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(CareerContactSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ return (
+
+
+
+
+ Drop Us A Line
+
+
+ We normally respond within 2 business days
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Message
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/contact/career-contact-info.jsx b/template/src/sections/_career/contact/career-contact-info.jsx
new file mode 100644
index 0000000..dd46339
--- /dev/null
+++ b/template/src/sections/_career/contact/career-contact-info.jsx
@@ -0,0 +1,67 @@
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+
+import { _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function CareerContactInfo() {
+ return (
+
+ Get In Touch
+
+ {`We'd love to talk about how we can help you.`}
+
+
+
+ Email
+
+
+ hello@example.com
+
+
+
+
+ Phone
+
+ (907) 555-0101
+
+
+
+ Address
+
+ 3891 Ranchview Dr. Richardson, California 62639
+
+
+
+ Follow Us
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/details/career-job-details-company-info.jsx b/template/src/sections/_career/details/career-job-details-company-info.jsx
new file mode 100644
index 0000000..4e015b7
--- /dev/null
+++ b/template/src/sections/_career/details/career-job-details-company-info.jsx
@@ -0,0 +1,40 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Paper from '@mui/material/Paper';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobDetailsCompanyInfo({ job }) {
+ return (
+
+
+
+
+
+ {job.company.name}
+
+ View Company Profile
+
+
+
+
+ );
+}
+
+CareerJobDetailsCompanyInfo.propTypes = {
+ job: PropTypes.shape({
+ company: PropTypes.shape({
+ logo: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/_career/details/career-job-details-company-similar.jsx b/template/src/sections/_career/details/career-job-details-company-similar.jsx
new file mode 100644
index 0000000..681e9fc
--- /dev/null
+++ b/template/src/sections/_career/details/career-job-details-company-similar.jsx
@@ -0,0 +1,56 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobDetailsCompanySimilar({ jobs }) {
+ return (
+
+
+ Jobs From This Company
+
+
+ {jobs.map((job) => (
+ `dashed 1px ${theme.palette.divider}`,
+ '&:last-child': {
+ borderBottom: 0,
+ },
+ }}
+ >
+
+ {job.slug}
+
+
+
+ {fDate(job.deadline)}
+
+
+ ))}
+
+ );
+}
+
+CareerJobDetailsCompanySimilar.propTypes = {
+ jobs: PropTypes.array,
+};
diff --git a/template/src/sections/_career/details/career-job-details-hero.jsx b/template/src/sections/_career/details/career-job-details-hero.jsx
new file mode 100644
index 0000000..3069e76
--- /dev/null
+++ b/template/src/sections/_career/details/career-job-details-hero.jsx
@@ -0,0 +1,131 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Checkbox from '@mui/material/Checkbox';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+
+import { fDate } from 'src/utils/format-time';
+
+import { bgGradient } from 'src/theme/css';
+
+import Iconify from 'src/components/iconify';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobDetailsHero({ job }) {
+ const theme = useTheme();
+
+ const [favorite, setFavorite] = useState(job.favorited);
+
+ const handleChangeFavorite = useCallback((event) => {
+ setFavorite(event.target.checked);
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+ {job.slug}
+
+
+
+
+
+
+ {job.category}
+
+
+
+
+ {`${job.totalViews} views`}
+
+
+
+ {job.location}
+
+
+
+
+
+
+
+ Apply Now
+
+
+
+ {`Expiration date: `}
+
+ {fDate(job.deadline)}
+
+
+
+
+
+ }
+ checkedIcon={ }
+ />
+
+
+
+
+
+ );
+}
+
+CareerJobDetailsHero.propTypes = {
+ job: PropTypes.shape({
+ slug: PropTypes.string,
+ favorited: PropTypes.bool,
+ category: PropTypes.string,
+ location: PropTypes.string,
+ totalViews: PropTypes.number,
+ deadline: PropTypes.instanceOf(Date),
+ }),
+};
diff --git a/template/src/sections/_career/details/career-job-details-info.jsx b/template/src/sections/_career/details/career-job-details-info.jsx
new file mode 100644
index 0000000..0328fef
--- /dev/null
+++ b/template/src/sections/_career/details/career-job-details-info.jsx
@@ -0,0 +1,93 @@
+import PropTypes from 'prop-types';
+
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import { fDate } from 'src/utils/format-time';
+import { fCurrency } from 'src/utils/format-number';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobDetailsInfo({ job }) {
+ const { createdAt, salary, experience, deadline, level, languages } = job;
+
+ return (
+
+
+
+
+
+ Date Posted
+
+ {fDate(createdAt)}
+
+
+
+
+
+
+
+ Expiration date
+
+ {fDate(deadline)}
+
+
+
+
+
+
+
+ Offered Salary (month)
+
+ {typeof salary === 'number' ? fCurrency(salary) : salary}
+
+
+
+
+
+
+
+ Experience
+
+ {`${experience} year exp`}
+
+
+
+
+
+
+
+ Level
+
+ {level}
+
+
+
+
+
+
+
+ Language
+
+ {typeof languages === 'string' ? languages : languages.join(', ')}
+
+
+
+
+
+ );
+}
+
+CareerJobDetailsInfo.propTypes = {
+ job: PropTypes.shape({
+ level: PropTypes.string,
+ salary: PropTypes.string,
+ experience: PropTypes.number,
+ deadline: PropTypes.instanceOf(Date),
+ createdAt: PropTypes.instanceOf(Date),
+ languages: PropTypes.arrayOf(PropTypes.string),
+ }),
+};
diff --git a/template/src/sections/_career/details/career-job-details-summary.jsx b/template/src/sections/_career/details/career-job-details-summary.jsx
new file mode 100644
index 0000000..01cd6c4
--- /dev/null
+++ b/template/src/sections/_career/details/career-job-details-summary.jsx
@@ -0,0 +1,83 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Chip from '@mui/material/Chip';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import ContactMap from 'src/components/map';
+import Iconify from 'src/components/iconify';
+import Markdown from 'src/components/markdown';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobDetailsSummary({ job }) {
+ const { skills, benefits, locationMap, content } = job;
+
+ return (
+
+
+
+
+ Job Skills
+
+
+ {skills.map((skill) => (
+ {}} />
+ ))}
+
+
+
+
+ Other Benefits
+
+
+ {benefits.map((benefit) => (
+
+
+ {benefit}
+
+ ))}
+
+
+
+
+ Location
+
+
+
+
+ );
+}
+
+CareerJobDetailsSummary.propTypes = {
+ job: PropTypes.shape({
+ benefits: PropTypes.array,
+ content: PropTypes.string,
+ locationMap: PropTypes.array,
+ skills: PropTypes.array,
+ }),
+};
diff --git a/template/src/sections/_career/filters/career-filters.jsx b/template/src/sections/_career/filters/career-filters.jsx
new file mode 100644
index 0000000..7b0fdd6
--- /dev/null
+++ b/template/src/sections/_career/filters/career-filters.jsx
@@ -0,0 +1,217 @@
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Drawer from '@mui/material/Drawer';
+import Button from '@mui/material/Button';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import FilterType from './filter-type';
+import FilterLevel from './filter-level';
+import FilterSalary from './filter-salary';
+import FilterKeyword from './filter-keyword';
+import FilterBenefits from './filter-benefits';
+import FilterLocation from './filter-location';
+import FilterCategories from './filter-categories';
+
+// ----------------------------------------------------------------------
+
+const defaultValues = {
+ filterKeyword: null,
+ filterCategories: null,
+ filterLocation: null,
+ filterType: [],
+ filterLevel: [],
+ filterBenefits: [],
+ filterSalary: [0, 20000],
+};
+
+export default function CareerFilters() {
+ const mdUp = useResponsive('up', 'md');
+
+ const mobileOpen = useBoolean();
+
+ const [filters, setFilters] = useState(defaultValues);
+
+ const handleChangeKeyword = useCallback(
+ (newValue) => {
+ setFilters({
+ ...filters,
+ filterKeyword: newValue,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeCategory = useCallback(
+ (newValue) => {
+ setFilters({
+ ...filters,
+ filterCategories: newValue,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeLocation = useCallback(
+ (newValue) => {
+ setFilters({
+ ...filters,
+ filterLocation: newValue,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeJobType = useCallback(
+ (event) => {
+ const {
+ target: { value },
+ } = event;
+
+ setFilters({
+ ...filters,
+ filterType: typeof value === 'string' ? value.split(',') : value,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeJobLevel = useCallback(
+ (event) => {
+ const {
+ target: { value },
+ } = event;
+ setFilters({
+ ...filters,
+ filterLevel: typeof value === 'string' ? value.split(',') : value,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeJobBenefits = useCallback(
+ (event) => {
+ const {
+ target: { value },
+ } = event;
+ setFilters({
+ ...filters,
+ filterBenefits: typeof value === 'string' ? value.split(',') : value,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeSalary = useCallback(
+ (event, newValue) => {
+ setFilters({
+ ...filters,
+ filterSalary: newValue,
+ });
+ },
+ [filters]
+ );
+
+ const onReset = useCallback(() => {
+ setFilters(defaultValues);
+ }, []);
+
+ const onSubmit = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ alert(JSON.stringify(filters, null, 2));
+ onReset();
+ };
+
+ const renderFilters = (
+ <>
+
+
+
+
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+ {!mdUp && (
+ }
+ sx={{ mt: 2.5 }}
+ >
+ Search
+
+ )}
+ >
+ );
+
+ if (mdUp) {
+ return {renderFilters} ;
+ }
+
+ return (
+ <>
+
+ }
+ onClick={mobileOpen.onTrue}
+ >
+ Filters
+
+
+
+
+ {renderFilters}
+
+ >
+ );
+}
diff --git a/template/src/sections/_career/filters/filter-benefits.jsx b/template/src/sections/_career/filters/filter-benefits.jsx
new file mode 100644
index 0000000..fd70b78
--- /dev/null
+++ b/template/src/sections/_career/filters/filter-benefits.jsx
@@ -0,0 +1,69 @@
+import PropTypes from 'prop-types';
+
+import Select from '@mui/material/Select';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+import Checkbox, { checkboxClasses } from '@mui/material/Checkbox';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { JOB_BENEFIT_OPTIONS } from 'src/_mock';
+
+// ----------------------------------------------------------------------
+
+export default function FilterBenefits({ filterBenefits, onChangeJobBenefits }) {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+ {
+ if (!selected.length) {
+ return (
+
+ Benefits
+
+ );
+ }
+ return (
+
+ {selected.join(', ')}
+
+ );
+ }}
+ >
+ {JOB_BENEFIT_OPTIONS.map((option) => (
+
+
+
+ {option.label}
+
+ ))}
+
+
+ );
+}
+
+FilterBenefits.propTypes = {
+ filterBenefits: PropTypes.arrayOf(PropTypes.string),
+ onChangeJobBenefits: PropTypes.func,
+};
diff --git a/template/src/sections/_career/filters/filter-categories.jsx b/template/src/sections/_career/filters/filter-categories.jsx
new file mode 100644
index 0000000..0238539
--- /dev/null
+++ b/template/src/sections/_career/filters/filter-categories.jsx
@@ -0,0 +1,54 @@
+import PropTypes from 'prop-types';
+
+import TextField from '@mui/material/TextField';
+import Autocomplete from '@mui/material/Autocomplete';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { _tags } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function FilterCategories({ filterCategories, onChangeCategory }) {
+ return (
+ option}
+ value={filterCategories}
+ onChange={(event, value) => onChangeCategory(value)}
+ renderInput={(params) => (
+
+
+
+ ),
+ sx: { pb: 1 },
+ }}
+ />
+ )}
+ renderOption={(props, option) => (
+
+ {option}
+
+ )}
+ />
+ );
+}
+
+FilterCategories.propTypes = {
+ filterCategories: PropTypes.string,
+ onChangeCategory: PropTypes.func,
+};
diff --git a/template/src/sections/_career/filters/filter-keyword.jsx b/template/src/sections/_career/filters/filter-keyword.jsx
new file mode 100644
index 0000000..831da8c
--- /dev/null
+++ b/template/src/sections/_career/filters/filter-keyword.jsx
@@ -0,0 +1,51 @@
+import PropTypes from 'prop-types';
+
+import TextField from '@mui/material/TextField';
+import Autocomplete from '@mui/material/Autocomplete';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { _jobTitles } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function FilterKeyword({ filterKeyword, onChangeKeyword, sx }) {
+ return (
+ option}
+ value={filterKeyword}
+ onChange={(event, value) => onChangeKeyword(value)}
+ renderInput={(params) => (
+
+
+
+ ),
+ sx: { pb: 1, ...sx },
+ }}
+ />
+ )}
+ renderOption={(props, option) => (
+
+ {option}
+
+ )}
+ />
+ );
+}
+
+FilterKeyword.propTypes = {
+ filterKeyword: PropTypes.string,
+ onChangeKeyword: PropTypes.func,
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_career/filters/filter-level.jsx b/template/src/sections/_career/filters/filter-level.jsx
new file mode 100644
index 0000000..0aa5481
--- /dev/null
+++ b/template/src/sections/_career/filters/filter-level.jsx
@@ -0,0 +1,78 @@
+import PropTypes from 'prop-types';
+
+import Select from '@mui/material/Select';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+import Checkbox, { checkboxClasses } from '@mui/material/Checkbox';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+// ----------------------------------------------------------------------
+
+const JOB_LEVELS = [
+ 'Manager',
+ 'Intern/Student',
+ 'No experience',
+ 'Senior',
+ 'Supervisor',
+ 'Director',
+];
+
+// ----------------------------------------------------------------------
+
+export default function FilterLevel({ filterLevel, onChangeJobType }) {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+ {
+ if (!selected.length) {
+ return (
+
+ All levels
+
+ );
+ }
+ return (
+
+ {selected.join(', ')}
+
+ );
+ }}
+ >
+ {JOB_LEVELS.map((type) => (
+
+
+
+ {type}
+
+ ))}
+
+
+ );
+}
+
+FilterLevel.propTypes = {
+ filterLevel: PropTypes.arrayOf(PropTypes.string),
+ onChangeJobType: PropTypes.func,
+};
diff --git a/template/src/sections/_career/filters/filter-location.jsx b/template/src/sections/_career/filters/filter-location.jsx
new file mode 100644
index 0000000..ae15564
--- /dev/null
+++ b/template/src/sections/_career/filters/filter-location.jsx
@@ -0,0 +1,28 @@
+import PropTypes from 'prop-types';
+
+import { countries } from 'src/assets/data';
+
+import CountrySelect from 'src/components/country-select';
+
+// ----------------------------------------------------------------------
+
+export default function FilterLocation({ filterLocation, onChangeLocation, sx }) {
+ return (
+ onChangeLocation(newValue)}
+ options={countries.map((option) => option.label)}
+ getOptionLabel={(option) => option}
+ sx={sx}
+ />
+ );
+}
+
+FilterLocation.propTypes = {
+ filterLocation: PropTypes.string,
+ onChangeLocation: PropTypes.func,
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_career/filters/filter-salary.jsx b/template/src/sections/_career/filters/filter-salary.jsx
new file mode 100644
index 0000000..be46547
--- /dev/null
+++ b/template/src/sections/_career/filters/filter-salary.jsx
@@ -0,0 +1,104 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Select from '@mui/material/Select';
+import Slider from '@mui/material/Slider';
+import Popover from '@mui/material/Popover';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fCurrency } from 'src/utils/format-number';
+
+// ----------------------------------------------------------------------
+
+export default function FilterSalary({ filterSalary, onChangeSalary }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const [open, setOpen] = useState(null);
+
+ const handleOpen = useCallback((event) => {
+ setOpen(event.currentTarget);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(null);
+ }, []);
+
+ const minSalary = filterSalary[0];
+
+ const maxSalary = filterSalary[1];
+
+ return (
+ <>
+
+ {
+ if (minSalary === 0 && maxSalary === 20000) {
+ return (
+
+ All salary ranges
+
+ );
+ }
+ return (
+ {`${fCurrency(
+ minSalary
+ )} - ${fCurrency(maxSalary)}`}
+ );
+ }}
+ />
+
+
+
+
+ Value based on 1 month
+
+
+ `$${value}`}
+ value={filterSalary}
+ onChange={onChangeSalary}
+ />
+
+ >
+ );
+}
+
+FilterSalary.propTypes = {
+ filterSalary: PropTypes.array,
+ onChangeSalary: PropTypes.func,
+};
diff --git a/template/src/sections/_career/filters/filter-type.jsx b/template/src/sections/_career/filters/filter-type.jsx
new file mode 100644
index 0000000..5c43f7f
--- /dev/null
+++ b/template/src/sections/_career/filters/filter-type.jsx
@@ -0,0 +1,70 @@
+import PropTypes from 'prop-types';
+
+import Select from '@mui/material/Select';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+import Checkbox, { checkboxClasses } from '@mui/material/Checkbox';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+// ----------------------------------------------------------------------
+
+const JOB_TYPES = ['Part time', 'Full time', 'Freelance'];
+
+// ----------------------------------------------------------------------
+
+export default function FilterType({ filterType, onChangeJobType }) {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+ {
+ if (!selected.length) {
+ return (
+
+ Job type
+
+ );
+ }
+ return (
+
+ {selected.join(', ')}
+
+ );
+ }}
+ >
+ {JOB_TYPES.map((type) => (
+
+
+ {type}
+
+ ))}
+
+
+ );
+}
+
+FilterType.propTypes = {
+ filterType: PropTypes.arrayOf(PropTypes.string),
+ onChangeJobType: PropTypes.func,
+};
diff --git a/template/src/sections/_career/landing/career-landing-connections.jsx b/template/src/sections/_career/landing/career-landing-connections.jsx
new file mode 100644
index 0000000..ddd0b5c
--- /dev/null
+++ b/template/src/sections/_career/landing/career-landing-connections.jsx
@@ -0,0 +1,205 @@
+import { useRef } from 'react';
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import { useTheme } from '@mui/material/styles';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+import { useBoundingClientRect } from 'src/hooks/use-bounding-client-rect';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import SvgColor from 'src/components/svg-color';
+import { varHover, varTranHover } from 'src/components/animate';
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingConnections({ countries }) {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const containerRef = useRef(null);
+
+ const container = useBoundingClientRect(containerRef);
+
+ const offsetLeft = container?.left;
+
+ const carousel = useCarousel({
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.xl,
+ settings: { slidesToShow: 3 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.lg,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 1 },
+ },
+ ],
+ });
+
+ return (
+
+
+ {mdUp && (
+
+ )}
+
+
+
+
+ Global Connections
+
+
+ Vestibulum fringilla pede sit amet augue. Nam adipiscing. Nulla neque dolor,
+ sagittis eget, iaculis quis.
+
+
+ }
+ >
+ View All Jobs
+
+
+
+
+
+
+
+
+
+
+
+
+ {countries.map((country) => (
+
+
+
+ ))}
+
+
+
+
+
+ );
+}
+
+CareerLandingConnections.propTypes = {
+ countries: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function JobByCountryItem({ country }) {
+ const { location, coverUrl, totalJobs } = country;
+
+ return (
+
+ theme.customShadows.z24,
+ },
+ }}
+ >
+
+
+
+
+
+
+
+ {location}
+
+ {totalJobs} Jobs
+
+
+
+
+ );
+}
+
+JobByCountryItem.propTypes = {
+ country: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ location: PropTypes.string,
+ totalJobs: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_career/landing/career-landing-featured-jobs.jsx b/template/src/sections/_career/landing/career-landing-featured-jobs.jsx
new file mode 100644
index 0000000..c935465
--- /dev/null
+++ b/template/src/sections/_career/landing/career-landing-featured-jobs.jsx
@@ -0,0 +1,84 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from 'src/components/iconify';
+
+import CareerJobItem from '../list/career-job-item';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingFeaturedJobs({ jobs }) {
+ return (
+
+
+
+
+ Featured Jobs
+
+
+
+
+
+ Jobs available apply to Editorial Specialist, Account Manager, Human Resources
+ Specialist and more!
+
+
+
+
+
+ {jobs.map((job) => (
+
+ ))}
+
+
+
+ }
+ >
+ View All Jobs
+
+
+
+ );
+}
+
+CareerLandingFeaturedJobs.propTypes = {
+ jobs: PropTypes.array,
+};
diff --git a/template/src/sections/_career/landing/career-landing-for-recruiters.jsx b/template/src/sections/_career/landing/career-landing-for-recruiters.jsx
new file mode 100644
index 0000000..fcb7e37
--- /dev/null
+++ b/template/src/sections/_career/landing/career-landing-for-recruiters.jsx
@@ -0,0 +1,73 @@
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingForRecruiters() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+
+
+ FOR RECRUITERS
+
+
+ Do You Have A Position To Post Job?
+
+
+ Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Morbi mattis
+ ullamcorper velit.
+
+
+ }
+ >
+ Post a Job
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/landing/career-landing-hero.jsx b/template/src/sections/_career/landing/career-landing-hero.jsx
new file mode 100644
index 0000000..69698c7
--- /dev/null
+++ b/template/src/sections/_career/landing/career-landing-hero.jsx
@@ -0,0 +1,250 @@
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import { inputClasses } from '@mui/material/Input';
+import { alpha, useTheme } from '@mui/material/styles';
+import { filledInputClasses } from '@mui/material/FilledInput';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import { _brands } from 'src/_mock';
+import { bgGradient } from 'src/theme/css';
+import CareerHeroIllustration from 'src/assets/illustrations/career-hero-illustration';
+
+import Iconify from 'src/components/iconify';
+import SvgColor from 'src/components/svg-color';
+
+import FilterKeyword from '../filters/filter-keyword';
+import FilterLocation from '../filters/filter-location';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingHero() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const [filters, setFilters] = useState({
+ filterKeyword: null,
+ filterLocation: null,
+ });
+
+ const handleChangeKeyword = useCallback(
+ (newValue) => {
+ setFilters({
+ ...filters,
+ filterKeyword: newValue,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeLocation = useCallback(
+ (newValue) => {
+ setFilters({
+ ...filters,
+ filterLocation: newValue,
+ });
+ },
+ [filters]
+ );
+
+ const renderFilters = (
+
+
+
+ {mdUp && }
+
+
+
+
+
+
+
+ );
+
+ const renderSummary = (
+ }
+ sx={{ pt: { md: 5 } }}
+ >
+ }
+ >
+
+ {fShortenNumber(2000000)}+
+
+ Jobs
+
+
+
+
+ {fShortenNumber(500000)}+
+
+ Successful Hiring
+
+
+
+
+ }
+ >
+
+ {fShortenNumber(250000)}+
+
+ Partners
+
+
+
+
+ {fShortenNumber(156000)}+
+
+ Employee
+
+
+
+
+ );
+
+ const renderBrands = (
+
+ {_brands.slice(0, 4).map((brand) => (
+
+
+
+ ))}
+
+ );
+
+ return (
+
+
+
+
+
+
+
+ Get The
+
+ {` Career `}
+
+ You Deserve
+
+
+
+ Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis
+ venenatis ante odio sit amet eros.
+
+
+
+ {renderFilters}
+
+ {renderBrands}
+
+ {renderSummary}
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/landing/career-landing-hot-categories.jsx b/template/src/sections/_career/landing/career-landing-hot-categories.jsx
new file mode 100644
index 0000000..9db13de
--- /dev/null
+++ b/template/src/sections/_career/landing/career-landing-hot-categories.jsx
@@ -0,0 +1,134 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+import SvgColor from 'src/components/svg-color';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingHotCategories({ categories }) {
+ return (
+
+
+ Hot Categories
+
+
+
+ {categories.map((category) => (
+
+ ))}
+
+
+
+ }
+ >
+ View All Categories
+
+
+
+ );
+}
+
+CareerLandingHotCategories.propTypes = {
+ categories: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function CategoryItem({ category }) {
+ return (
+ theme.transitions.create('all'),
+ '&:hover': {
+ bgcolor: 'background.paper',
+ boxShadow: (theme) => theme.customShadows.z24,
+ '& .icon': {
+ bgcolor: 'primary.main',
+ transition: (theme) => theme.transitions.create('all'),
+ '& > span': {
+ color: 'common.white',
+ },
+ },
+ },
+ }}
+ >
+
+
+
+
+
+
+ {category.name}
+
+
+
+ {category.totalJobs} jobs
+
+
+
+ );
+}
+
+CategoryItem.propTypes = {
+ category: PropTypes.shape({
+ name: PropTypes.string,
+ totalJobs: PropTypes.number,
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ }),
+};
diff --git a/template/src/sections/_career/landing/career-landing-step.jsx b/template/src/sections/_career/landing/career-landing-step.jsx
new file mode 100644
index 0000000..88fc6de
--- /dev/null
+++ b/template/src/sections/_career/landing/career-landing-step.jsx
@@ -0,0 +1,105 @@
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+import SvgColor from 'src/components/svg-color';
+
+// ----------------------------------------------------------------------
+
+const STEPS = [
+ {
+ title: 'Create an account',
+ description: 'Nunc nonummy metus. Donec elit libero.',
+ icon: '/assets/icons/ic_resume_job.svg',
+ },
+ {
+ title: 'Complete your profile',
+ description: 'Nunc nonummy metus. Donec elit libero.',
+ icon: '/assets/icons/ic_resume_job.svg',
+ },
+ {
+ title: 'Search your job',
+ description: 'Nunc nonummy metus. Donec elit libero.',
+ icon: '/assets/icons/ic_search_job.svg',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingStep() {
+ return (
+
+
+
+ For Candidates
+
+
+
+ Explore Thousands of Jobs
+
+
+
+ Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Morbi mattis ullamcorper
+ velit.
+
+
+
+ {STEPS.map((value, index) => (
+
+
+
+ Step {index + 1}
+
+
+
+ {value.title}
+
+
+
+ {value.description}
+
+
+ ))}
+
+
+ }
+ >
+ Upload Your CV
+
+
+
+ );
+}
diff --git a/template/src/sections/_career/landing/career-landing-top-companies.jsx b/template/src/sections/_career/landing/career-landing-top-companies.jsx
new file mode 100644
index 0000000..6048c26
--- /dev/null
+++ b/template/src/sections/_career/landing/career-landing-top-companies.jsx
@@ -0,0 +1,135 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Container from '@mui/material/Container';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingTopCompanies({ companies }) {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ slidesToShow: 5,
+ slidesToScroll: 1,
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.lg,
+ settings: { slidesToShow: 4 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 1 },
+ },
+ ],
+ });
+
+ return (
+
+
+
+ Top Companies
+
+
+
+
+
+ {companies.map((company) => (
+
+
+
+ ))}
+
+
+
+
+
+ );
+}
+
+CareerLandingTopCompanies.propTypes = {
+ companies: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function CompanyItem({ company }) {
+ return (
+
+
+ theme.transitions.create('all', {
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ '&:hover': {
+ bgcolor: 'background.paper',
+ boxShadow: (theme) => theme.customShadows.z24,
+ },
+ }}
+ >
+
+
+ {company.totalJobs} jobs
+
+
+
+ {company.name}
+
+
+
+ );
+}
+
+CompanyItem.propTypes = {
+ company: PropTypes.shape({
+ logo: PropTypes.string,
+ name: PropTypes.string,
+ totalJobs: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_career/list/career-job-item-skeleton.jsx b/template/src/sections/_career/list/career-job-item-skeleton.jsx
new file mode 100644
index 0000000..4db8224
--- /dev/null
+++ b/template/src/sections/_career/list/career-job-item-skeleton.jsx
@@ -0,0 +1,47 @@
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Skeleton from '@mui/material/Skeleton';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobItemSkeleton({ ...other }) {
+ return (
+
+
+
+
+ {[...Array(4)].map((_, index) => (
+
+ ))}
+
+
+
+
+
+ {[...Array(4)].map((_, index) => (
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/_career/list/career-job-item.jsx b/template/src/sections/_career/list/career-job-item.jsx
new file mode 100644
index 0000000..d8438da
--- /dev/null
+++ b/template/src/sections/_career/list/career-job-item.jsx
@@ -0,0 +1,150 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Card from '@mui/material/Card';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Checkbox from '@mui/material/Checkbox';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+import { fCurrency } from 'src/utils/format-number';
+
+import Label from 'src/components/label';
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobItem({ job }) {
+ const { slug, type, level, salary, location, urgent, createdAt, favorited, experience, company } =
+ job;
+
+ const [favorite, setFavorite] = useState(favorited);
+
+ const handleChangeFavorite = useCallback((event) => {
+ setFavorite(event.target.checked);
+ }, []);
+
+ return (
+ theme.customShadows.z24,
+ },
+ }}
+ >
+ }
+ checkedIcon={ }
+ sx={{ position: 'absolute', right: 16, top: 16 }}
+ />
+
+
+
+
+
+ {urgent && Urgent }
+
+
+
+
+
+ {slug}
+
+
+
+
+ {company.name}
+
+
+
+
+ {location}
+
+
+
+
+ Posted day: {fDate(createdAt)}
+
+
+
+
+
+
+
+
+
+ {`${experience} year exp`}
+
+
+
+
+
+
+ {type}
+
+
+
+
+
+
+ {typeof salary === 'number' ? fCurrency(salary) : salary}
+
+
+
+
+
+
+ {level}
+
+
+
+
+ );
+}
+
+CareerJobItem.propTypes = {
+ job: PropTypes.shape({
+ slug: PropTypes.string,
+ type: PropTypes.string,
+ urgent: PropTypes.bool,
+ level: PropTypes.string,
+ favorited: PropTypes.bool,
+ location: PropTypes.string,
+ experience: PropTypes.number,
+ createdAt: PropTypes.instanceOf(Date),
+ salary: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ company: PropTypes.shape({
+ logo: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/_career/list/career-job-list-similar.jsx b/template/src/sections/_career/list/career-job-list-similar.jsx
new file mode 100644
index 0000000..911d46c
--- /dev/null
+++ b/template/src/sections/_career/list/career-job-list-similar.jsx
@@ -0,0 +1,78 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import CareerJobItem from './career-job-item';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobListSimilar({ jobs }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const viewAllBtn = (
+ }
+ >
+ View All Jobs
+
+ );
+
+ return (
+
+
+
+ Similar Jobs
+
+ {mdUp && viewAllBtn}
+
+
+
+ {jobs.map((job) => (
+
+ ))}
+
+
+ {!mdUp && (
+
+ {viewAllBtn}
+
+ )}
+
+
+ );
+}
+
+CareerJobListSimilar.propTypes = {
+ jobs: PropTypes.array,
+};
diff --git a/template/src/sections/_career/list/career-job-list.jsx b/template/src/sections/_career/list/career-job-list.jsx
new file mode 100644
index 0000000..76697c1
--- /dev/null
+++ b/template/src/sections/_career/list/career-job-list.jsx
@@ -0,0 +1,48 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import CareerJobItem from './career-job-item';
+import CareerJobItemSkeleton from './career-job-item-skeleton';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobList({ jobs, loading }) {
+ return (
+ <>
+
+ {(loading ? [...Array(9)] : jobs).map((job, index) =>
+ job ? :
+ )}
+
+
+
+ >
+ );
+}
+
+CareerJobList.propTypes = {
+ jobs: PropTypes.array,
+ loading: PropTypes.bool,
+};
diff --git a/template/src/sections/_career/team/career-team-item.jsx b/template/src/sections/_career/team/career-team-item.jsx
new file mode 100644
index 0000000..c6a6a4c
--- /dev/null
+++ b/template/src/sections/_career/team/career-team-item.jsx
@@ -0,0 +1,83 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import { alpha, styled } from '@mui/material/styles';
+
+import { _socials } from 'src/_mock';
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const StyledOverlay = styled('div')(({ theme }) => ({
+ ...bgGradient({
+ startColor: alpha(theme.palette.grey[900], 0.88),
+ endColor: alpha(theme.palette.grey[900], 0.88),
+ }),
+ top: 0,
+ left: 0,
+ zIndex: 8,
+ opacity: 0,
+ width: '100%',
+ height: '100%',
+ position: 'absolute',
+ transition: theme.transitions.create('opacity', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.short,
+ }),
+ '&:hover': { opacity: 1 },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function CareerTeamItem({ member }) {
+ return (
+
+
+
+ {member.name}
+
+
+ {member.role}
+
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+
+
+ );
+}
+
+CareerTeamItem.propTypes = {
+ member: PropTypes.shape({
+ name: PropTypes.string,
+ photo: PropTypes.string,
+ role: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_career/team/career-team.jsx b/template/src/sections/_career/team/career-team.jsx
new file mode 100644
index 0000000..7f64c0e
--- /dev/null
+++ b/template/src/sections/_career/team/career-team.jsx
@@ -0,0 +1,55 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import CareerTeamItem from './career-team-item';
+
+// ----------------------------------------------------------------------
+
+export default function CareerTeam({ members }) {
+ return (
+
+
+ Our Team
+
+
+ Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis
+ ante odio sit amet eros.
+
+
+
+
+ {members.map((member) => (
+
+ ))}
+
+
+ );
+}
+
+CareerTeam.propTypes = {
+ members: PropTypes.array,
+};
diff --git a/template/src/sections/_career/testimonial/career-testimonial-item.jsx b/template/src/sections/_career/testimonial/career-testimonial-item.jsx
new file mode 100644
index 0000000..cebedcf
--- /dev/null
+++ b/template/src/sections/_career/testimonial/career-testimonial-item.jsx
@@ -0,0 +1,48 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Rating from '@mui/material/Rating';
+import Typography from '@mui/material/Typography';
+
+// ----------------------------------------------------------------------
+
+export default function TestimonialItem({ testimonial, sx, ...other }) {
+ return (
+
+
+
+
+ {testimonial.review}
+
+
+ {testimonial.name}
+
+
+ {testimonial.role}
+
+
+ );
+}
+
+TestimonialItem.propTypes = {
+ sx: PropTypes.object,
+ testimonial: PropTypes.shape({
+ name: PropTypes.string,
+ review: PropTypes.string,
+ role: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_career/testimonial/career-testimonial.jsx b/template/src/sections/_career/testimonial/career-testimonial.jsx
new file mode 100644
index 0000000..42e01f2
--- /dev/null
+++ b/template/src/sections/_career/testimonial/career-testimonial.jsx
@@ -0,0 +1,68 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import TestimonialItem from './career-testimonial-item';
+
+// ----------------------------------------------------------------------
+
+export default function CareerTestimonial({ testimonials }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ dots: !mdUp,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ ...CarouselDots({
+ sx: {
+ mt: 8,
+ },
+ }),
+ });
+
+ return (
+
+
+
+
+
+ What Our Customer Say
+
+
+
+ {testimonials.map((testimonial) => (
+
+ ))}
+
+
+
+
+ {mdUp && (
+
+ )}
+
+
+ );
+}
+
+CareerTestimonial.propTypes = {
+ testimonials: PropTypes.array,
+};
diff --git a/template/src/sections/_career/view/career-about-view.jsx b/template/src/sections/_career/view/career-about-view.jsx
new file mode 100644
index 0000000..d6ce52b
--- /dev/null
+++ b/template/src/sections/_career/view/career-about-view.jsx
@@ -0,0 +1,35 @@
+import Divider from '@mui/material/Divider';
+
+import { _members, _careerPosts, _brandsColor, _testimonials } from 'src/_mock';
+
+import CareerTeam from '../team/career-team';
+import CareerAbout from '../about/career-about';
+import CareerNewsletter from '../career-newsletter';
+import CareerOurClients from '../career-our-clients';
+import CareerTestimonial from '../testimonial/career-testimonial';
+import CareerAboutOurVision from '../about/career-about-our-vision';
+import CareerLatestPosts from '../../blog/career/career-latest-posts';
+
+// ----------------------------------------------------------------------
+
+export default function CareerAboutView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_career/view/career-contact-view.jsx b/template/src/sections/_career/view/career-contact-view.jsx
new file mode 100644
index 0000000..b1423c1
--- /dev/null
+++ b/template/src/sections/_career/view/career-contact-view.jsx
@@ -0,0 +1,23 @@
+import { _offices } from 'src/_mock';
+
+import ContactMap from 'src/components/map';
+
+import CareerNewsletter from '../career-newsletter';
+import CareerContactForm from '../contact/career-contact-form';
+import CareerContactInfo from '../contact/career-contact-info';
+
+// ----------------------------------------------------------------------
+
+export default function CareerContactView() {
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_career/view/career-job-view.jsx b/template/src/sections/_career/view/career-job-view.jsx
new file mode 100644
index 0000000..294c5ba
--- /dev/null
+++ b/template/src/sections/_career/view/career-job-view.jsx
@@ -0,0 +1,128 @@
+import { useEffect } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _jobs, _mock, _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+import { SplashScreen } from 'src/components/loading-screen';
+
+import Advertisement from '../../advertisement';
+import CareerNewsletter from '../career-newsletter';
+import CareerJobListSimilar from '../list/career-job-list-similar';
+import CareerJobDetailsInfo from '../details/career-job-details-info';
+import CareerJobDetailsHero from '../details/career-job-details-hero';
+import CareerJobDetailsSummary from '../details/career-job-details-summary';
+import CareerJobDetailsCompanyInfo from '../details/career-job-details-company-info';
+import CareerJobDetailsCompanySimilar from '../details/career-job-details-company-similar';
+
+// ----------------------------------------------------------------------
+
+const _mockJob = _jobs[0];
+
+export default function CareerJobView() {
+ const mdUp = useResponsive('up', 'md');
+
+ const loading = useBoolean(true);
+
+ useEffect(() => {
+ const fakeLoading = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ loading.onFalse();
+ };
+ fakeLoading();
+ }, [loading]);
+
+ if (loading.value) {
+ return ;
+ }
+
+ return (
+ <>
+
+
+
+
+ {!mdUp && (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+ Share:
+
+
+
+ {_socials.map((social) => (
+ }
+ sx={{
+ m: 0.5,
+ flexShrink: 0,
+ color: social.color,
+ borderColor: social.color,
+ '&:hover': {
+ borderColor: social.color,
+ bgcolor: alpha(social.color, 0.08),
+ },
+ }}
+ >
+ {social.label}
+
+ ))}
+
+
+
+
+
+
+ {mdUp && }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_career/view/career-jobs-view.jsx b/template/src/sections/_career/view/career-jobs-view.jsx
new file mode 100644
index 0000000..8f88772
--- /dev/null
+++ b/template/src/sections/_career/view/career-jobs-view.jsx
@@ -0,0 +1,37 @@
+import { useEffect } from 'react';
+
+import Container from '@mui/material/Container';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _jobs } from 'src/_mock';
+
+import CareerJobList from '../list/career-job-list';
+import CareerNewsletter from '../career-newsletter';
+import CareerFilters from '../filters/career-filters';
+
+// ----------------------------------------------------------------------
+
+export default function CareerJobsView() {
+ const loading = useBoolean(true);
+
+ useEffect(() => {
+ const fakeLoading = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ loading.onFalse();
+ };
+ fakeLoading();
+ }, [loading]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_career/view/career-landing-view.jsx b/template/src/sections/_career/view/career-landing-view.jsx
new file mode 100644
index 0000000..f8569df
--- /dev/null
+++ b/template/src/sections/_career/view/career-landing-view.jsx
@@ -0,0 +1,54 @@
+import {
+ _jobs,
+ _careerPosts,
+ _brandsColor,
+ _testimonials,
+ _jobsByCompanies,
+ _jobsByCountries,
+ _jobsByCategories,
+} from 'src/_mock';
+
+import CareerNewsletter from '../career-newsletter';
+import CareerOurClients from '../career-our-clients';
+import CareerDownloadApp from '../career-download-app';
+import CareerLandingHero from '../landing/career-landing-hero';
+import CareerLandingStep from '../landing/career-landing-step';
+import CareerTestimonial from '../testimonial/career-testimonial';
+import CareerLatestPosts from '../../blog/career/career-latest-posts';
+import CareerLandingConnections from '../landing/career-landing-connections';
+import CareerLandingFeaturedJobs from '../landing/career-landing-featured-jobs';
+import CareerLandingTopCompanies from '../landing/career-landing-top-companies';
+import CareerLandingHotCategories from '../landing/career-landing-hot-categories';
+import CareerLandingForRecruiters from '../landing/career-landing-for-recruiters';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLandingView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_career/view/career-post-view.jsx b/template/src/sections/_career/view/career-post-view.jsx
new file mode 100644
index 0000000..06c9dc6
--- /dev/null
+++ b/template/src/sections/_career/view/career-post-view.jsx
@@ -0,0 +1,141 @@
+import { useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Divider from '@mui/material/Divider';
+import Popover from '@mui/material/Popover';
+import MenuItem from '@mui/material/MenuItem';
+import Checkbox from '@mui/material/Checkbox';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+
+import { paths } from 'src/routes/paths';
+
+import { fDate } from 'src/utils/format-time';
+
+import { _socials, _careerPosts } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+import Markdown from 'src/components/markdown';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import PostTags from '../../blog/common/post-tags';
+import CareerNewsletter from '../career-newsletter';
+import PostAuthor from '../../blog/common/post-author';
+import PostTimeBlock from '../../blog/common/post-time-block';
+import PostSocialsShare from '../../blog/common/post-socials-share';
+import CareerLatestPosts from '../../blog/career/career-latest-posts';
+
+// ----------------------------------------------------------------------
+
+export default function CareerPostView() {
+ const { title, description, duration, createdAt, favorited, author, tags, content } =
+ _careerPosts[0];
+
+ const [favorite, setFavorite] = useState(favorited);
+
+ const [open, setOpen] = useState(null);
+
+ const handleOpen = useCallback((event) => {
+ setOpen(event.currentTarget);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(null);
+ }, []);
+
+ const handleChangeFavorite = useCallback((event) => {
+ setFavorite(event.target.checked);
+ }, []);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ {title}
+
+
+
+
+
+
+ {author.name}
+
+
+
+
+
+
+
+
+
+ }
+ checkedIcon={ }
+ />
+
+
+
+
+ {description}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {_socials.map((social) => (
+
+
+ Share via {social.label}
+
+ ))}
+
+ >
+ );
+}
diff --git a/template/src/sections/_career/view/career-posts-view.jsx b/template/src/sections/_career/view/career-posts-view.jsx
new file mode 100644
index 0000000..bae8648
--- /dev/null
+++ b/template/src/sections/_career/view/career-posts-view.jsx
@@ -0,0 +1,48 @@
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+
+import { _tags, _mock, _categories, _careerPosts } from 'src/_mock';
+
+import CareerNewsletter from '../career-newsletter';
+import PostSidebar from '../../blog/common/post-sidebar';
+import CareerPosts from '../../blog/career/career-posts';
+import PostSearchMobile from '../../blog/common/post-search-mobile';
+
+// ----------------------------------------------------------------------
+
+export default function CareerPostsView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_ecommerce/account/ecommerce-account-new-card-form.jsx b/template/src/sections/_ecommerce/account/ecommerce-account-new-card-form.jsx
new file mode 100644
index 0000000..9995a45
--- /dev/null
+++ b/template/src/sections/_ecommerce/account/ecommerce-account-new-card-form.jsx
@@ -0,0 +1,39 @@
+import Stack from '@mui/material/Stack';
+import TextField from '@mui/material/TextField';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountNewCardForm() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ Your transaction is secured with SSL encryption
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-head.jsx b/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-head.jsx
new file mode 100644
index 0000000..f0b0902
--- /dev/null
+++ b/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-head.jsx
@@ -0,0 +1,69 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import TableRow from '@mui/material/TableRow';
+import Checkbox from '@mui/material/Checkbox';
+import TableHead from '@mui/material/TableHead';
+import TableCell from '@mui/material/TableCell';
+import TableSortLabel from '@mui/material/TableSortLabel';
+
+import { visuallyHidden } from './utils';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountOrdersTableHead({
+ order,
+ onSort,
+ orderBy,
+ rowCount,
+ headCells,
+ numSelected,
+ onSelectAllRows,
+}) {
+ return (
+
+
+
+ 0 && numSelected < rowCount}
+ checked={rowCount > 0 && numSelected === rowCount}
+ onChange={onSelectAllRows}
+ />
+
+
+ {headCells.map((headCell) => (
+
+ onSort(headCell.id)}
+ >
+ {headCell.label}
+ {orderBy === headCell.id ? (
+
+ {order === 'desc' ? 'sorted descending' : 'sorted ascending'}
+
+ ) : null}
+
+
+ ))}
+
+
+ );
+}
+
+EcommerceAccountOrdersTableHead.propTypes = {
+ headCells: PropTypes.array,
+ numSelected: PropTypes.number,
+ onSelectAllRows: PropTypes.func,
+ onSort: PropTypes.func,
+ order: PropTypes.string,
+ orderBy: PropTypes.string,
+ rowCount: PropTypes.number,
+};
diff --git a/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-row.jsx b/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-row.jsx
new file mode 100644
index 0000000..dc34f52
--- /dev/null
+++ b/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-row.jsx
@@ -0,0 +1,115 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Divider from '@mui/material/Divider';
+import Popover from '@mui/material/Popover';
+import MenuItem from '@mui/material/MenuItem';
+import TableRow from '@mui/material/TableRow';
+import Checkbox from '@mui/material/Checkbox';
+import TableCell from '@mui/material/TableCell';
+import IconButton from '@mui/material/IconButton';
+import InputBase, { inputBaseClasses } from '@mui/material/InputBase';
+
+// utils
+import { fDate } from 'src/utils/format-time';
+import { fCurrency } from 'src/utils/format-number';
+
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountOrdersTableRow({ row, onSelectRow, selected }) {
+ const [open, setOpen] = useState(null);
+
+ const handleOpen = useCallback((event) => {
+ setOpen(event.currentTarget);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(null);
+ }, []);
+
+ const inputStyles = {
+ pl: 1,
+ [`&.${inputBaseClasses.focused}`]: {
+ bgcolor: 'action.selected',
+ },
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {fDate(row.deliveryDate)}
+
+
+
+
+
+
+
+ {row.status}
+
+
+
+
+
+
+
+
+
+
+
+
+ View
+
+
+
+ Edit
+
+
+
+
+
+ Delete
+
+
+ >
+ );
+}
+
+EcommerceAccountOrdersTableRow.propTypes = {
+ onSelectRow: PropTypes.func,
+ row: PropTypes.object,
+ selected: PropTypes.bool,
+};
diff --git a/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-toolbar.jsx b/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-toolbar.jsx
new file mode 100644
index 0000000..c69e0aa
--- /dev/null
+++ b/template/src/sections/_ecommerce/account/ecommerce-account-orders-table-toolbar.jsx
@@ -0,0 +1,66 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Tooltip from '@mui/material/Tooltip';
+import Checkbox from '@mui/material/Checkbox';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountOrdersTableToolbar({
+ rowCount,
+ numSelected,
+ onSelectAllRows,
+}) {
+ if (!numSelected) {
+ return null;
+ }
+
+ return (
+ (theme.palette.mode === 'light' ? 'common.white' : 'grey.800'),
+ }}
+ >
+ 0 && numSelected < rowCount}
+ checked={rowCount > 0 && numSelected === rowCount}
+ onChange={onSelectAllRows}
+ inputProps={{
+ 'aria-label': 'select all desserts',
+ }}
+ />
+
+
+ {numSelected} selected
+
+
+
+
+
+
+
+
+ );
+}
+
+EcommerceAccountOrdersTableToolbar.propTypes = {
+ rowCount: PropTypes.number,
+ numSelected: PropTypes.number,
+ onSelectAllRows: PropTypes.func,
+};
diff --git a/template/src/sections/_ecommerce/account/ecommerce-account-payment-card.jsx b/template/src/sections/_ecommerce/account/ecommerce-account-payment-card.jsx
new file mode 100644
index 0000000..e347868
--- /dev/null
+++ b/template/src/sections/_ecommerce/account/ecommerce-account-payment-card.jsx
@@ -0,0 +1,130 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Popover from '@mui/material/Popover';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountPaymentCard({ card }) {
+ const { value, label, cardNumber, cardHolder, expirationDate, isPrimary } = card;
+
+ const [open, setOpen] = useState(null);
+
+ const numberShow = useBoolean();
+
+ const handleOpen = useCallback((event) => {
+ setOpen(event.currentTarget);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(null);
+ }, []);
+
+ return (
+ <>
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ }}
+ >
+
+
+ {label}
+
+ {isPrimary && (
+ } sx={{ ml: 1 }}>
+ Primary
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+ {numberShow.value ? cardNumber : `**** **** **** ${cardNumber.slice(-4)}`}
+
+
+
+
+
+
+
+
+
+ Card Holder
+
+ {cardHolder}
+
+
+
+ Expiry Date
+
+ {expirationDate}
+
+
+
+
+
+
+ Set primary payment
+
+
+
+ Edit
+
+
+
+
+
+ Delete
+
+
+ >
+ );
+}
+
+EcommerceAccountPaymentCard.propTypes = {
+ card: PropTypes.shape({
+ label: PropTypes.string,
+ value: PropTypes.string,
+ isPrimary: PropTypes.bool,
+ cardHolder: PropTypes.string,
+ cardNumber: PropTypes.string,
+ expirationDate: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_ecommerce/account/ecommerce-account-voucher-item.jsx b/template/src/sections/_ecommerce/account/ecommerce-account-voucher-item.jsx
new file mode 100644
index 0000000..4d9e78e
--- /dev/null
+++ b/template/src/sections/_ecommerce/account/ecommerce-account-voucher-item.jsx
@@ -0,0 +1,96 @@
+import PropTypes from 'prop-types';
+import { differenceInCalendarDays } from 'date-fns';
+
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import { fDate } from 'src/utils/format-time';
+
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountVoucherItem({ voucher }) {
+ const dayLeft = differenceInCalendarDays(voucher.dueOn, new Date());
+
+ return (
+ `dashed 1px ${theme.palette.divider}`,
+ }}
+ >
+ `dashed 1px ${theme.palette.divider}`,
+ }}
+ >
+ {getIcon(voucher.type)}
+
+
+ {voucher.label}
+
+
+
+
+ {voucher.title}
+
+ {voucher.description}
+
+
+
+
+
+ {dayLeft <= 1 ? `${dayLeft} day left` : `Valid Till: ${fDate(voucher.dueOn)}`}
+
+
+
+ );
+}
+
+EcommerceAccountVoucherItem.propTypes = {
+ voucher: PropTypes.shape({
+ type: PropTypes.string,
+ label: PropTypes.string,
+ title: PropTypes.string,
+ description: PropTypes.string,
+ dueOn: PropTypes.instanceOf(Date),
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+function getIcon(type) {
+ let icon;
+
+ switch (type) {
+ case 'shipping':
+ icon = ;
+ break;
+ case 'category':
+ icon = ;
+ break;
+ default:
+ icon = ;
+ }
+ return icon;
+}
diff --git a/template/src/sections/_ecommerce/account/utils.js b/template/src/sections/_ecommerce/account/utils.js
new file mode 100644
index 0000000..15ca486
--- /dev/null
+++ b/template/src/sections/_ecommerce/account/utils.js
@@ -0,0 +1,49 @@
+// ----------------------------------------------------------------------
+
+export function descendingComparator(a, b, orderBy) {
+ if (b[orderBy] < a[orderBy]) {
+ return -1;
+ }
+ if (b[orderBy] > a[orderBy]) {
+ return 1;
+ }
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+
+export function getComparator(order, orderBy) {
+ return order === 'desc'
+ ? (a, b) => descendingComparator(a, b, orderBy)
+ : (a, b) => -descendingComparator(a, b, orderBy);
+}
+
+// ----------------------------------------------------------------------
+
+export function stableSort(array, comparator) {
+ const stabilizedThis = array.map((el, index) => [el, index]);
+
+ stabilizedThis.sort((a, b) => {
+ const order = comparator(a[0], b[0]);
+ if (order !== 0) {
+ return order;
+ }
+ return a[1] - b[1];
+ });
+
+ return stabilizedThis.map((el) => el[0]);
+}
+
+// ----------------------------------------------------------------------
+
+export const visuallyHidden = {
+ border: 0,
+ margin: -1,
+ padding: 0,
+ width: '1px',
+ height: '1px',
+ overflow: 'hidden',
+ position: 'absolute',
+ whiteSpace: 'nowrap',
+ clip: 'rect(0 0 0 0)',
+};
diff --git a/template/src/sections/_ecommerce/cart/ecommerce-cart-item.jsx b/template/src/sections/_ecommerce/cart/ecommerce-cart-item.jsx
new file mode 100644
index 0000000..ea6dc40
--- /dev/null
+++ b/template/src/sections/_ecommerce/cart/ecommerce-cart-item.jsx
@@ -0,0 +1,86 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import TextField from '@mui/material/TextField';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import { fCurrency } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCartItem({ product, wishlist }) {
+ return (
+ `solid 1px ${theme.palette.divider}`,
+ }}
+ >
+
+
+
+
+ {product.name}
+
+ Color: Grey Space
+
+
+
+
+
+
+ {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((option) => (
+
+ {option}
+
+ ))}
+
+
+
+ {fCurrency(product.price)}
+
+
+
+
+
+ {wishlist && (
+
+
+
+ )}
+
+ );
+}
+
+EcommerceCartItem.propTypes = {
+ product: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ }),
+ wishlist: PropTypes.bool,
+};
diff --git a/template/src/sections/_ecommerce/cart/ecommerce-cart-list.jsx b/template/src/sections/_ecommerce/cart/ecommerce-cart-list.jsx
new file mode 100644
index 0000000..4499c5a
--- /dev/null
+++ b/template/src/sections/_ecommerce/cart/ecommerce-cart-list.jsx
@@ -0,0 +1,41 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import Scrollbar from 'src/components/scrollbar';
+
+import EcommerceCartItem from './ecommerce-cart-item';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCartList({ products, wishlist = false }) {
+ return (
+
+ `solid 1px ${theme.palette.divider}`,
+ }}
+ >
+ Item
+ Qty
+ Subtotal
+
+ {wishlist && }
+
+
+ {products.map((product) => (
+
+ ))}
+
+ );
+}
+
+EcommerceCartList.propTypes = {
+ products: PropTypes.array,
+ wishlist: PropTypes.bool,
+};
diff --git a/template/src/sections/_ecommerce/cart/ecommerce-cart-summary.jsx b/template/src/sections/_ecommerce/cart/ecommerce-cart-summary.jsx
new file mode 100644
index 0000000..0a84aba
--- /dev/null
+++ b/template/src/sections/_ecommerce/cart/ecommerce-cart-summary.jsx
@@ -0,0 +1,108 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fPercent, fCurrency } from 'src/utils/format-number';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCartSummary({ tax, total, subtotal, shipping, discount }) {
+ return (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ }}
+ >
+ Summary
+
+
+
+
+
+
+
+
+
+
+
+
+ Apply
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ Checkout
+
+
+ );
+}
+
+EcommerceCartSummary.propTypes = {
+ tax: PropTypes.number,
+ total: PropTypes.number,
+ discount: PropTypes.number,
+ shipping: PropTypes.number,
+ subtotal: PropTypes.number,
+};
+
+// ----------------------------------------------------------------------
+
+function Row({ label, value, sx, ...other }) {
+ return (
+
+
+ {label}
+
+ {value}
+
+ );
+}
+
+Row.propTypes = {
+ sx: PropTypes.object,
+ label: PropTypes.string,
+ value: PropTypes.string,
+};
diff --git a/template/src/sections/_ecommerce/checkout/ecommerce-checkout-new-card-form.jsx b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-new-card-form.jsx
new file mode 100644
index 0000000..59dec80
--- /dev/null
+++ b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-new-card-form.jsx
@@ -0,0 +1,50 @@
+import Stack from '@mui/material/Stack';
+
+import Iconify from 'src/components/iconify';
+import { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCheckoutNewCardForm() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ Your transaction is secured with SSL encryption
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/checkout/ecommerce-checkout-order-summary.jsx b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-order-summary.jsx
new file mode 100644
index 0000000..16704ae
--- /dev/null
+++ b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-order-summary.jsx
@@ -0,0 +1,189 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { fPercent, fCurrency } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCheckoutOrderSummary({
+ tax,
+ total,
+ subtotal,
+ shipping,
+ discount,
+ products,
+ loading,
+}) {
+ return (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ }}
+ >
+ Order Summary
+
+ {!!products?.length && (
+ <>
+ {products.map((product) => (
+
+ ))}
+
+
+ >
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+ Apply
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ Order Now
+
+
+ );
+}
+
+EcommerceCheckoutOrderSummary.propTypes = {
+ discount: PropTypes.number,
+ loading: PropTypes.bool,
+ products: PropTypes.array,
+ shipping: PropTypes.number,
+ subtotal: PropTypes.number,
+ tax: PropTypes.number,
+ total: PropTypes.number,
+};
+
+// ----------------------------------------------------------------------
+
+function ProductItem({ product, ...other }) {
+ return (
+
+
+
+
+
+ {product.name}
+
+
+
+ {fCurrency(product.price)}
+
+
+
+ {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((option) => (
+
+ {option}
+
+ ))}
+
+
+
+
+
+
+
+ );
+}
+
+ProductItem.propTypes = {
+ product: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+function Row({ label, value, sx, ...other }) {
+ return (
+
+
+ {label}
+
+ {value}
+
+ );
+}
+
+Row.propTypes = {
+ label: PropTypes.string,
+ sx: PropTypes.object,
+ value: PropTypes.string,
+};
diff --git a/template/src/sections/_ecommerce/checkout/ecommerce-checkout-payment-method.jsx b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-payment-method.jsx
new file mode 100644
index 0000000..4170a18
--- /dev/null
+++ b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-payment-method.jsx
@@ -0,0 +1,112 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Box from '@mui/material/Box';
+import Radio from '@mui/material/Radio';
+import Stack from '@mui/material/Stack';
+import { alpha } from '@mui/material/styles';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel, { formControlLabelClasses } from '@mui/material/FormControlLabel';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCheckoutPaymentMethod({ options }) {
+ const { control } = useFormContext();
+
+ return (
+ (
+
+ {options.map((option) => (
+
+ ))}
+
+ )}
+ />
+ );
+}
+
+EcommerceCheckoutPaymentMethod.propTypes = {
+ options: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function OptionItem({ option, selected }) {
+ const { value, label, description } = option;
+
+ const renderLabel = (
+
+
+
+ {label}
+
+
+
+
+
+
+ {description}
+
+
+ );
+
+ return (
+ }
+ sx={{ mx: 1 }}
+ />
+ }
+ label={renderLabel}
+ sx={{
+ m: 0,
+ py: 3,
+ pr: 2,
+ borderRadius: 1,
+ border: (theme) => `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ ...(selected && {
+ boxShadow: (theme) => `0 0 0 2px ${theme.palette.text.primary}`,
+ }),
+ [`& .${formControlLabelClasses.label}`]: {
+ width: 1,
+ },
+ }}
+ />
+ );
+}
+
+OptionItem.propTypes = {
+ option: PropTypes.shape({
+ description: PropTypes.string,
+ label: PropTypes.string,
+ value: PropTypes.string,
+ }),
+ selected: PropTypes.bool,
+};
diff --git a/template/src/sections/_ecommerce/checkout/ecommerce-checkout-personal-details.jsx b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-personal-details.jsx
new file mode 100644
index 0000000..c14f0ac
--- /dev/null
+++ b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-personal-details.jsx
@@ -0,0 +1,86 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+import { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCheckoutPersonalDetails() {
+ const passwordShow = useBoolean();
+
+ return (
+ <>
+
+ Sign in with:
+
+ }
+ >
+ Facebook
+
+
+ }>
+ Google
+
+
+ }>
+ Continue with Email
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+ >
+ );
+}
diff --git a/template/src/sections/_ecommerce/checkout/ecommerce-checkout-shipping-details.jsx b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-shipping-details.jsx
new file mode 100644
index 0000000..2afc0f1
--- /dev/null
+++ b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-shipping-details.jsx
@@ -0,0 +1,34 @@
+import Box from '@mui/material/Box';
+
+import { countries } from 'src/assets/data';
+
+import { RHFTextField, RHFAutocomplete } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCheckoutShippingDetails() {
+ return (
+
+
+
+
+
+
+
+ option.label)}
+ getOptionLabel={(option) => option}
+ />
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/checkout/ecommerce-checkout-shipping-method.jsx b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-shipping-method.jsx
new file mode 100644
index 0000000..929cf80
--- /dev/null
+++ b/template/src/sections/_ecommerce/checkout/ecommerce-checkout-shipping-method.jsx
@@ -0,0 +1,117 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Box from '@mui/material/Box';
+import Radio from '@mui/material/Radio';
+import Stack from '@mui/material/Stack';
+import { alpha } from '@mui/material/styles';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel, { formControlLabelClasses } from '@mui/material/FormControlLabel';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCheckoutShippingMethod({ options }) {
+ const { control } = useFormContext();
+
+ return (
+ (
+
+ {options.map((option) => (
+
+ ))}
+
+ )}
+ />
+ );
+}
+
+EcommerceCheckoutShippingMethod.propTypes = {
+ options: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function OptionItem({ option, selected }) {
+ const { value, label, price, description } = option;
+
+ const renderLabel = (
+
+
+
+
+
+ {label}
+
+
+
+ {`$${price}`}
+
+
+
+
+ {description}
+
+
+ );
+
+ return (
+ }
+ sx={{ mx: 1 }}
+ />
+ }
+ label={renderLabel}
+ sx={{
+ m: 0,
+ py: 3,
+ pr: 2,
+ borderRadius: 1,
+ border: (theme) => `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ ...(selected && {
+ boxShadow: (theme) => `0 0 0 2px ${theme.palette.text.primary}`,
+ }),
+ [`& .${formControlLabelClasses.label}`]: {
+ width: 1,
+ },
+ }}
+ />
+ );
+}
+
+OptionItem.propTypes = {
+ option: PropTypes.shape({
+ description: PropTypes.string,
+ label: PropTypes.string,
+ price: PropTypes.number,
+ value: PropTypes.string,
+ }),
+ selected: PropTypes.bool,
+};
diff --git a/template/src/sections/_ecommerce/common/product-color-picker.jsx b/template/src/sections/_ecommerce/common/product-color-picker.jsx
new file mode 100644
index 0000000..4431406
--- /dev/null
+++ b/template/src/sections/_ecommerce/common/product-color-picker.jsx
@@ -0,0 +1,57 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Radio from '@mui/material/Radio';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ProductColorPicker({ value, options, onChange, sx }) {
+ return (
+
+ {options.map((option) => (
+
+ {value === option.value && }
+
+ }
+ label=""
+ sx={{
+ m: 0,
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ position: 'absolute',
+ }}
+ />
+
+ ))}
+
+ );
+}
+
+ProductColorPicker.propTypes = {
+ sx: PropTypes.object,
+ value: PropTypes.string,
+ onChange: PropTypes.func,
+ options: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/common/product-countdown-block.jsx b/template/src/sections/_ecommerce/common/product-countdown-block.jsx
new file mode 100644
index 0000000..aa6c773
--- /dev/null
+++ b/template/src/sections/_ecommerce/common/product-countdown-block.jsx
@@ -0,0 +1,111 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import { useCountdown } from 'src/hooks/use-countdown';
+
+// ----------------------------------------------------------------------
+
+export default function ProductCountdownBlock({ expired, hiddenLabel = false, sx, ...other }) {
+ const { days, hours, minutes, seconds } = useCountdown(expired);
+
+ return (
+
+ {Number(days) > 0 && (
+ <>
+
+
+ >
+ )}
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+ProductCountdownBlock.propTypes = {
+ sx: PropTypes.object,
+ hiddenLabel: PropTypes.bool,
+ expired: PropTypes.instanceOf(Date),
+};
+
+// ----------------------------------------------------------------------
+
+function TimeBlock({ label, value, hiddenLabel }) {
+ return (
+
+
+ {value}
+
+
+ {!hiddenLabel && (
+
+ {label}
+
+ )}
+
+ );
+}
+
+TimeBlock.propTypes = {
+ label: PropTypes.string,
+ value: PropTypes.string,
+ hiddenLabel: PropTypes.bool,
+};
+
+// ----------------------------------------------------------------------
+
+function Separator({ hiddenLabel }) {
+ return (
+
+
+ :
+
+
+ {!hiddenLabel && (
+
+ :
+
+ )}
+
+ );
+}
+
+Separator.propTypes = {
+ hiddenLabel: PropTypes.bool,
+};
diff --git a/template/src/sections/_ecommerce/common/product-option-picker.jsx b/template/src/sections/_ecommerce/common/product-option-picker.jsx
new file mode 100644
index 0000000..b5ea923
--- /dev/null
+++ b/template/src/sections/_ecommerce/common/product-option-picker.jsx
@@ -0,0 +1,59 @@
+import PropTypes from 'prop-types';
+
+import Radio from '@mui/material/Radio';
+import Stack from '@mui/material/Stack';
+import { alpha } from '@mui/material/styles';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+export default function ProductOptionPicker({ value, options, onChange, sx }) {
+ return (
+
+ {options.map((option) => (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ ...(value === option.value && {
+ boxShadow: (theme) => `0 0 0 2px ${theme.palette.text.primary}`,
+ }),
+ ...sx,
+ }}
+ >
+ {option.label}
+
+ }
+ label=""
+ sx={{
+ m: 0,
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ position: 'absolute',
+ }}
+ />
+
+ ))}
+
+ );
+}
+
+ProductOptionPicker.propTypes = {
+ sx: PropTypes.object,
+ value: PropTypes.string,
+ onChange: PropTypes.func,
+ options: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/common/product-price.jsx b/template/src/sections/_ecommerce/common/product-price.jsx
new file mode 100644
index 0000000..e127edb
--- /dev/null
+++ b/template/src/sections/_ecommerce/common/product-price.jsx
@@ -0,0 +1,34 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+
+import { fCurrency } from 'src/utils/format-number';
+
+// ----------------------------------------------------------------------
+
+export default function ProductPrice({ price, priceSale = 0, sx, ...other }) {
+ return (
+
+ {fCurrency(price)}
+
+
+ {priceSale > 0 && fCurrency(priceSale)}
+
+
+ );
+}
+
+ProductPrice.propTypes = {
+ price: PropTypes.number,
+ priceSale: PropTypes.number,
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_ecommerce/common/product-rating.jsx b/template/src/sections/_ecommerce/common/product-rating.jsx
new file mode 100644
index 0000000..285329a
--- /dev/null
+++ b/template/src/sections/_ecommerce/common/product-rating.jsx
@@ -0,0 +1,39 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import Rating, { ratingClasses } from '@mui/material/Rating';
+
+// ----------------------------------------------------------------------
+
+export default function ProductRating({ ratingNumber, label, ...other }) {
+ return (
+
+
+
+ {label && (
+
+ {label}
+
+ )}
+
+ );
+}
+
+ProductRating.propTypes = {
+ label: PropTypes.string,
+ ratingNumber: PropTypes.number,
+};
diff --git a/template/src/sections/_ecommerce/compare/ecommerce-compare-item.jsx b/template/src/sections/_ecommerce/compare/ecommerce-compare-item.jsx
new file mode 100644
index 0000000..94585ae
--- /dev/null
+++ b/template/src/sections/_ecommerce/compare/ecommerce-compare-item.jsx
@@ -0,0 +1,82 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+import Rating, { ratingClasses } from '@mui/material/Rating';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fCurrency } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCompareItem({ product }) {
+ return (
+
+
+
+
+ {product.name}
+ {fCurrency(product.price)}
+
+
+
+
+ Buy Now
+
+
+ {product.details.map((row, index) => (
+
+ {row || '-'}
+
+ ))}
+
+ );
+}
+
+EcommerceCompareItem.propTypes = {
+ product: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ details: PropTypes.array,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ ratingNumber: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_ecommerce/compare/ecommerce-compare-list.jsx b/template/src/sections/_ecommerce/compare/ecommerce-compare-list.jsx
new file mode 100644
index 0000000..d70fb16
--- /dev/null
+++ b/template/src/sections/_ecommerce/compare/ecommerce-compare-list.jsx
@@ -0,0 +1,26 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+
+import EcommerceCompareItem from './ecommerce-compare-item';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCompareList({ products }) {
+ return (
+ }
+ >
+ {products.map((product) => (
+
+ ))}
+
+ );
+}
+
+EcommerceCompareList.propTypes = {
+ products: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/landing/ecommerce-landing-categories.jsx b/template/src/sections/_ecommerce/landing/ecommerce-landing-categories.jsx
new file mode 100644
index 0000000..7d5f29d
--- /dev/null
+++ b/template/src/sections/_ecommerce/landing/ecommerce-landing-categories.jsx
@@ -0,0 +1,122 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+const CATEGORIES = [
+ {
+ label: 'Men Clothes',
+ icon: '/assets/icons/ecommerce/ic_men_clothes.svg',
+ path: '#',
+ },
+ {
+ label: 'Women Clothes',
+ icon: '/assets/icons/ecommerce/ic_women_clothes.svg',
+ path: '#',
+ },
+ {
+ label: 'Watches',
+ icon: '/assets/icons/ecommerce/ic_watches.svg',
+ path: '#',
+ },
+ {
+ label: 'Home Appliances',
+ icon: '/assets/icons/ecommerce/ic_home_appliances.svg',
+ path: '#',
+ },
+ {
+ label: 'Sport & Outdoor',
+ icon: '/assets/icons/ecommerce/ic_sport.svg',
+ path: '#',
+ },
+ {
+ label: 'Books & Stationery',
+ icon: '/assets/icons/ecommerce/ic_book.svg',
+ path: '#',
+ },
+ {
+ label: 'Home & Living',
+ icon: '/assets/icons/ecommerce/ic_home_living.svg',
+ path: '#',
+ },
+ { label: 'Health', icon: '/assets/icons/ecommerce/ic_health.svg', path: '#' },
+ { label: 'Mobile', icon: '/assets/icons/ecommerce/ic_mobile.svg', path: '#' },
+ { label: 'Laptop', icon: '/assets/icons/ecommerce/ic_laptop.svg', path: '#' },
+ { label: 'Tablet', icon: '/assets/icons/ecommerce/ic_tablet.svg', path: '#' },
+ {
+ label: 'Headphones',
+ icon: '/assets/icons/ecommerce/ic_headphones.svg',
+ path: '#',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingCategories() {
+ return (
+
+
+ Categories
+
+
+
+ {CATEGORIES.map((category) => (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ '&:hover': {
+ boxShadow: (theme) => `0 0 0 2px ${theme.palette.text.primary}`,
+ },
+ }}
+ >
+
+
+
+
+
+ {category.label}
+
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/landing/ecommerce-landing-featured-brands.jsx b/template/src/sections/_ecommerce/landing/ecommerce-landing-featured-brands.jsx
new file mode 100644
index 0000000..9994eb7
--- /dev/null
+++ b/template/src/sections/_ecommerce/landing/ecommerce-landing-featured-brands.jsx
@@ -0,0 +1,113 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import { alpha } from '@mui/material/styles';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { RouterLink } from 'src/routes/components';
+
+import { _products } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import EcommerceProductItemFeaturedByBrand from '../product/item/ecommerce-product-item-featured-by-brand';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingFeaturedBrands() {
+ return (
+
+
+ Featured Brands
+
+
+
+
+ }
+ name="Apple"
+ description=" While most people enjoy casino gambling, sports betting, lottery and bingo playing."
+ path="#"
+ sx={{ height: 1 }}
+ />
+
+
+
+
+ {_products.slice(4, 8).map((product) => (
+
+ ))}
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function BrandInfo({ logo, name, description, path, sx, ...other }) {
+ return (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ ...sx,
+ }}
+ {...other}
+ >
+ {logo}
+
+
+ {name}
+
+
+
+ {description}
+
+
+ }
+ sx={{ mt: 5 }}
+ >
+ More Details
+
+
+ );
+}
+
+BrandInfo.propTypes = {
+ logo: PropTypes.node,
+ sx: PropTypes.object,
+ name: PropTypes.string,
+ path: PropTypes.string,
+ description: PropTypes.string,
+};
diff --git a/template/src/sections/_ecommerce/landing/ecommerce-landing-featured-products.jsx b/template/src/sections/_ecommerce/landing/ecommerce-landing-featured-products.jsx
new file mode 100644
index 0000000..3a2e291
--- /dev/null
+++ b/template/src/sections/_ecommerce/landing/ecommerce-landing-featured-products.jsx
@@ -0,0 +1,65 @@
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { _products } from 'src/_mock';
+
+import EcommerceProductItemHot from '../product/item/ecommerce-product-item-hot';
+import EcommerceProductItemCountDown from '../product/item/ecommerce-product-item-count-down';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingFeaturedProducts() {
+ return (
+
+
+ Featured Products
+
+
+
+
+
+ {_products.slice(1, 3).map((product, index) => (
+
+ ))}
+
+
+
+
+
+ {_products.slice(4, 8).map((product) => (
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/landing/ecommerce-landing-hero.jsx b/template/src/sections/_ecommerce/landing/ecommerce-landing-hero.jsx
new file mode 100644
index 0000000..80d33bc
--- /dev/null
+++ b/template/src/sections/_ecommerce/landing/ecommerce-landing-hero.jsx
@@ -0,0 +1,62 @@
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { bgGradient } from 'src/theme/css';
+import { _productsCarousel } from 'src/_mock';
+
+import Carousel, { useCarousel, CarouselDots } from 'src/components/carousel';
+
+import EcommerceProductItemHero from '../product/item/ecommerce-product-item-hero';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingHero() {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ fade: true,
+ speed: 100,
+ autoplay: true,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ autoplaySpeed: 3000,
+ ...CarouselDots({
+ rounded: true,
+ sx: {
+ left: 0,
+ right: 0,
+ zIndex: 9,
+ bottom: 40,
+ mx: 'auto',
+ position: 'absolute',
+ },
+ }),
+ });
+
+ return (
+
+
+
+ {_productsCarousel.map((product) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/landing/ecommerce-landing-hot-deal-today.jsx b/template/src/sections/_ecommerce/landing/ecommerce-landing-hot-deal-today.jsx
new file mode 100644
index 0000000..a53ab34
--- /dev/null
+++ b/template/src/sections/_ecommerce/landing/ecommerce-landing-hot-deal-today.jsx
@@ -0,0 +1,114 @@
+import { add } from 'date-fns';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _products } from 'src/_mock';
+
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import ProductCountdownBlock from '../common/product-countdown-block';
+import EcommerceProductItemHot from '../product/item/ecommerce-product-item-hot';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingHotDealToday() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ dots: !mdUp,
+ slidesToShow: 6,
+ slidesToScroll: 6,
+ ...CarouselDots({
+ sx: {
+ mt: 8,
+ },
+ }),
+ responsive: [
+ {
+ // Down md
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 3, slidesToScroll: 3 },
+ },
+ {
+ // Down sm
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 2, slidesToScroll: 2 },
+ },
+ ],
+ });
+
+ return (
+
+
+
+ 🔥 Hot Deal Today
+
+
+
+
+ {mdUp && (
+
+ )}
+
+
+
+ {_products.map((product) => (
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/landing/ecommerce-landing-popular-products.jsx b/template/src/sections/_ecommerce/landing/ecommerce-landing-popular-products.jsx
new file mode 100644
index 0000000..340e584
--- /dev/null
+++ b/template/src/sections/_ecommerce/landing/ecommerce-landing-popular-products.jsx
@@ -0,0 +1,69 @@
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Tab from '@mui/material/Tab';
+import Tabs from '@mui/material/Tabs';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { _products } from 'src/_mock';
+
+import EcommerceProductItemBestSellers from '../product/item/ecommerce-product-item-best-sellers';
+
+// ----------------------------------------------------------------------
+
+const TABS = ['Featured Products', 'Top Rated Products', 'Onsale Products'];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingPopularProducts() {
+ const [tab, setTab] = useState('Featured Products');
+
+ const handleChangeTab = useCallback((event, newValue) => {
+ setTab(newValue);
+ }, []);
+
+ return (
+
+
+ Popular Products
+
+
+
+ {TABS.map((category) => (
+
+ ))}
+
+
+
+ {_products.slice(0, 8).map((product) => (
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/landing/ecommerce-landing-special-offer.jsx b/template/src/sections/_ecommerce/landing/ecommerce-landing-special-offer.jsx
new file mode 100644
index 0000000..8a99fd2
--- /dev/null
+++ b/template/src/sections/_ecommerce/landing/ecommerce-landing-special-offer.jsx
@@ -0,0 +1,197 @@
+import { add } from 'date-fns';
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { _mock } from 'src/_mock';
+
+import Image from 'src/components/image';
+
+import ProductColorPicker from '../common/product-color-picker';
+import ProductOptionPicker from '../common/product-option-picker';
+import ProductCountdownBlock from '../common/product-countdown-block';
+
+// ----------------------------------------------------------------------
+
+const COLOR_OPTIONS = [
+ { label: '#FA541C', value: 'red' },
+ { label: '#754FFE', value: 'violet' },
+ { label: '#00B8D9', value: 'cyan' },
+ { label: '#36B37E', value: 'green' },
+];
+
+const MEMORY_OPTIONS = [
+ { label: '128GB', value: '128gb' },
+ { label: '256GB', value: '256gb' },
+ { label: '512GB', value: '512gb' },
+ { label: '1TB', value: '1tb' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingSpecialOffer() {
+ const [color, setColor] = useState('red');
+
+ const [memory, setMemory] = useState('128gb');
+
+ const handleChangeColor = useCallback((event) => {
+ setColor(event.target.value);
+ }, []);
+
+ const handleChangeMemory = useCallback((event) => {
+ setMemory(event.target.value);
+ }, []);
+
+ return (
+
+
+ Special Offer
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function SpecialOfferCountdown({ expired, label, name, price, sx, ...other }) {
+ return (
+ theme.customShadows.z24,
+ ...sx,
+ }}
+ {...other}
+ >
+
+ {label}
+
+
+
+ {name}
+
+
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ }}
+ >
+ {price}
+
+
+
+
+
+ Deal ends in:
+
+
+ `solid 1px ${alpha(theme.palette.grey[500], 0.32)}`,
+ },
+ '& .label': { color: 'text.secondary' },
+ '& .separator': { color: 'inherit' },
+ }}
+ />
+
+ );
+}
+
+SpecialOfferCountdown.propTypes = {
+ sx: PropTypes.object,
+ name: PropTypes.string,
+ label: PropTypes.string,
+ price: PropTypes.string,
+ expired: PropTypes.instanceOf(Date),
+};
+
+// ----------------------------------------------------------------------
+
+function SpecialOfferBuyNow({ color, memory, onChangeColor, onChangeMemory, ...other }) {
+ return (
+
+
+ Apple iPhone 14
+
+
+ While most people enjoy casino gambling, sports betting, lottery and bingo playing for the
+ fun.
+
+
+
+
+ Color
+
+
+
+
+ Memory
+
+
+
+
+ Buy Now
+
+
+ );
+}
+
+SpecialOfferBuyNow.propTypes = {
+ color: PropTypes.string,
+ memory: PropTypes.string,
+ onChangeColor: PropTypes.func,
+ onChangeMemory: PropTypes.func,
+};
diff --git a/template/src/sections/_ecommerce/landing/ecommerce-landing-top-products.jsx b/template/src/sections/_ecommerce/landing/ecommerce-landing-top-products.jsx
new file mode 100644
index 0000000..c8a270f
--- /dev/null
+++ b/template/src/sections/_ecommerce/landing/ecommerce-landing-top-products.jsx
@@ -0,0 +1,67 @@
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { _products } from 'src/_mock';
+
+import EcommerceProductItemTop from '../product/item/ecommerce-product-item-top';
+import EcommerceProductItemHot from '../product/item/ecommerce-product-item-hot';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingTopProducts() {
+ return (
+
+
+ Top Products
+
+
+
+ {_products.slice(4, 8).map((product) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/product/details/ecommerce-product-details-carousel.jsx b/template/src/sections/_ecommerce/product/details/ecommerce-product-details-carousel.jsx
new file mode 100644
index 0000000..f23af98
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/details/ecommerce-product-details-carousel.jsx
@@ -0,0 +1,189 @@
+import { useEffect } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Avatar from '@mui/material/Avatar';
+import { alpha, styled, useTheme } from '@mui/material/styles';
+
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Lightbox, { useLightbox } from 'src/components/lightbox';
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+const THUMB_SIZE = 64;
+
+const StyledThumbnailsContainer = styled('div')(({ length, theme }) => ({
+ position: 'relative',
+ margin: theme.spacing(0, 'auto'),
+ '& .slick-slide': {
+ lineHeight: 0,
+ },
+
+ ...(length === 1 && {
+ maxWidth: THUMB_SIZE * 1 + 16,
+ }),
+
+ ...(length === 2 && {
+ maxWidth: THUMB_SIZE * 2 + 32,
+ }),
+
+ ...((length === 3 || length === 4) && {
+ maxWidth: THUMB_SIZE * 3 + 48,
+ }),
+
+ ...(length >= 5 && {
+ maxWidth: THUMB_SIZE * 6,
+ }),
+
+ ...(length > 3 && {
+ '&:before, &:after': {
+ ...bgGradient({
+ direction: 'to left',
+ startColor: `${alpha(theme.palette.background.default, 0)} 0%`,
+ endColor: `${theme.palette.background.default} 100%`,
+ }),
+ top: 0,
+ zIndex: 9,
+ content: "''",
+ height: '100%',
+ position: 'absolute',
+ width: (THUMB_SIZE * 2) / 3,
+ },
+ '&:after': {
+ right: 0,
+ transform: 'scaleX(-1)',
+ },
+ }),
+}));
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductDetailsCarousel({ images }) {
+ const theme = useTheme();
+
+ const slides = images.map((slide) => ({
+ src: slide,
+ }));
+
+ const lightbox = useLightbox(slides);
+
+ const carouselLarge = useCarousel({
+ rtl: false,
+ draggable: false,
+ adaptiveHeight: true,
+ });
+
+ const carouselThumb = useCarousel({
+ rtl: false,
+ centerMode: true,
+ swipeToSlide: true,
+ focusOnSelect: true,
+ variableWidth: true,
+ centerPadding: '0px',
+ slidesToShow: slides.length > 3 ? 3 : slides.length,
+ });
+
+ useEffect(() => {
+ carouselLarge.onSetNav();
+ carouselThumb.onSetNav();
+ }, [carouselLarge, carouselThumb]);
+
+ useEffect(() => {
+ if (lightbox.open) {
+ carouselLarge.onTogo(lightbox.selected);
+ }
+ }, [carouselLarge, lightbox.open, lightbox.selected]);
+
+ const renderLargeImg = (
+
+
+
+ {slides.map((slide) => (
+ lightbox.onOpen(slide.src)}
+ sx={{ cursor: 'zoom-in' }}
+ />
+ ))}
+
+
+
+ );
+
+ const renderThumbnails = (
+
+
+ {slides.map((item, index) => (
+
+
+
+ ))}
+
+
+ );
+
+ return (
+ <>
+
+ {renderLargeImg}
+
+ {renderThumbnails}
+
+
+ lightbox.setSelected(index)}
+ />
+ >
+ );
+}
+
+EcommerceProductDetailsCarousel.propTypes = {
+ images: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/product/details/ecommerce-product-details-description.jsx b/template/src/sections/_ecommerce/product/details/ecommerce-product-details-description.jsx
new file mode 100644
index 0000000..9c0bf2e
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/details/ecommerce-product-details-description.jsx
@@ -0,0 +1,49 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import Markdown from 'src/components/markdown';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductDetailsDescription({ description, specifications }) {
+ return (
+
+
+ Specifications
+
+ {specifications.map((row) => (
+
+
+ {row.label}
+
+ {row.value}
+
+ ))}
+
+
+
+ Description
+
+
+
+ );
+}
+
+EcommerceProductDetailsDescription.propTypes = {
+ description: PropTypes.string,
+ specifications: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/product/details/ecommerce-product-details-info.jsx b/template/src/sections/_ecommerce/product/details/ecommerce-product-details-info.jsx
new file mode 100644
index 0000000..851fe24
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/details/ecommerce-product-details-info.jsx
@@ -0,0 +1,175 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Rating from '@mui/material/Rating';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+
+import ProductPrice from '../../common/product-price';
+import ProductColorPicker from '../../common/product-color-picker';
+import ProductOptionPicker from '../../common/product-option-picker';
+
+// ----------------------------------------------------------------------
+
+const COLOR_OPTIONS = [
+ { label: '#FA541C', value: 'red' },
+ { label: '#754FFE', value: 'violet' },
+ { label: '#00B8D9', value: 'cyan' },
+ { label: '#36B37E', value: 'green' },
+];
+
+const MEMORY_OPTIONS = [
+ { label: '128GB', value: '128gb' },
+ { label: '256GB', value: '256gb' },
+ { label: '512GB', value: '512gb' },
+ { label: '1TB', value: '1tb' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductDetailsInfo({
+ name,
+ price,
+ ratingNumber,
+ totalReviews,
+ priceSale,
+ caption,
+}) {
+ const mdUp = useResponsive('up', 'md');
+
+ const [color, setColor] = useState('red');
+
+ const [memory, setMemory] = useState('128gb');
+
+ const handleChangeColor = useCallback((event) => {
+ setColor(event.target.value);
+ }, []);
+
+ const handleChangeMemory = useCallback((event) => {
+ setMemory(event.target.value);
+ }, []);
+
+ return (
+ <>
+
+ In Stock
+
+
+
+ {name}
+
+
+
+
+
+ ({totalReviews} reviews)
+
+
+
+
+
+
+
+
+ {caption}
+
+
+
+
+
+ Color
+
+
+
+
+ Memory
+
+
+
+
+
+
+ {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((option) => (
+
+ {option}
+
+ ))}
+
+
+
+ }
+ >
+ Add to Cart
+
+
+
+ Buy Now
+
+
+
+
+
+
+
+
+ Compare
+
+
+
+ Compare
+
+
+
+ Compare
+
+
+ >
+ );
+}
+
+EcommerceProductDetailsInfo.propTypes = {
+ caption: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ priceSale: PropTypes.number,
+ ratingNumber: PropTypes.number,
+ totalReviews: PropTypes.number,
+};
diff --git a/template/src/sections/_ecommerce/product/filters/ecommerce-filters.jsx b/template/src/sections/_ecommerce/product/filters/ecommerce-filters.jsx
new file mode 100644
index 0000000..f49c16c
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/filters/ecommerce-filters.jsx
@@ -0,0 +1,292 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Drawer from '@mui/material/Drawer';
+import Button from '@mui/material/Button';
+import Collapse from '@mui/material/Collapse';
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import FilterTag from './filter-tag';
+import FilterBrand from './filter-brand';
+import FilterPrice from './filter-price';
+import FilterStock from './filter-stock';
+import FilterRating from './filter-rating';
+import FilterCategory from './filter-category';
+import FilterShipping from './filter-shipping';
+
+// ----------------------------------------------------------------------
+
+const BRAND_OPTIONS = ['Apple', 'Samsung', 'Xiaomi', 'Honor'];
+
+const CATEGORY_OPTIONS = [
+ 'Apple iPhone',
+ 'Samsung Galaxy',
+ 'Nike Air Max',
+ 'Adidas Ultraboost',
+ 'Sony PlayStation',
+];
+
+const SHIPPING_OPTIONS = ['Fast', 'Saving', 'Free'];
+
+const TAG_OPTIONS = ['Books and Media', 'Pet', 'Electronics', 'Food', 'Automotive and Industrial'];
+
+// ----------------------------------------------------------------------
+
+const defaultValues = {
+ filterBrand: [BRAND_OPTIONS[1]],
+ filterCategories: '',
+ filterRating: null,
+ filterStock: false,
+ filterShipping: [],
+ filterTag: [],
+ filterPrice: {
+ start: 0,
+ end: 0,
+ },
+};
+
+export default function EcommerceFilters({ open, onClose }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const [filters, setFilters] = useState(defaultValues);
+
+ const getSelected = (selectedItems, item) =>
+ selectedItems.includes(item)
+ ? selectedItems.filter((value) => value !== item)
+ : [...selectedItems, item];
+
+ const handleChangeCategories = useCallback(
+ (name) => {
+ setFilters({
+ ...filters,
+ filterCategories: name,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeBrand = useCallback(
+ (name) => {
+ setFilters({
+ ...filters,
+ filterBrand: getSelected(filters.filterBrand, name),
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeShipping = useCallback(
+ (name) => {
+ setFilters({
+ ...filters,
+ filterShipping: getSelected(filters.filterShipping, name),
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeTag = useCallback(
+ (name) => {
+ setFilters({
+ ...filters,
+ filterTag: getSelected(filters.filterTag, name),
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeRating = useCallback(
+ (event) => {
+ setFilters({
+ ...filters,
+ filterRating: event.target.value,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeStartPrice = useCallback(
+ (event) => {
+ setFilters({
+ ...filters,
+ filterPrice: {
+ ...filters.filterPrice,
+ start: Number(event.target.value),
+ },
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeEndPrice = useCallback(
+ (event) => {
+ setFilters({
+ ...filters,
+ filterPrice: {
+ ...filters.filterPrice,
+ end: Number(event.target.value),
+ },
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeStock = useCallback(
+ (event) => {
+ setFilters({
+ ...filters,
+ filterStock: event.target.checked,
+ });
+ },
+ [filters]
+ );
+
+ const handleClearAll = useCallback(() => {
+ setFilters(defaultValues);
+ }, []);
+
+ const renderContent = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ onClick={handleClearAll}
+ >
+ Clear All
+
+
+ );
+
+ return (
+ <>
+ {mdUp ? (
+ renderContent
+ ) : (
+
+ {renderContent}
+
+ )}
+ >
+ );
+}
+
+EcommerceFilters.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+};
+
+// ----------------------------------------------------------------------
+
+function Block({ title, children, ...other }) {
+ const contentOpen = useBoolean(true);
+
+ return (
+
+
+ {title}
+
+
+
+
+
+ {children}
+
+
+ );
+}
+
+Block.propTypes = {
+ children: PropTypes.node,
+ title: PropTypes.string,
+};
diff --git a/template/src/sections/_ecommerce/product/filters/filter-brand.jsx b/template/src/sections/_ecommerce/product/filters/filter-brand.jsx
new file mode 100644
index 0000000..ceb707f
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/filters/filter-brand.jsx
@@ -0,0 +1,34 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Checkbox from '@mui/material/Checkbox';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+export default function FilterBrand({ options, filterBrand, onChangeBrand, ...other }) {
+ return (
+
+ {options.map((option) => (
+ onChangeBrand(option)}
+ />
+ }
+ label={option}
+ />
+ ))}
+
+ );
+}
+
+FilterBrand.propTypes = {
+ filterBrand: PropTypes.arrayOf(PropTypes.string),
+ onChangeBrand: PropTypes.func,
+ options: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/product/filters/filter-category.jsx b/template/src/sections/_ecommerce/product/filters/filter-category.jsx
new file mode 100644
index 0000000..d82cf96
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/filters/filter-category.jsx
@@ -0,0 +1,43 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function FilterCategory({
+ options,
+ filterCategories,
+ onChangeCategories,
+ ...other
+}) {
+ return (
+
+ {options.map((option) => (
+ onChangeCategories(option)}
+ sx={{
+ typography: 'body2',
+ cursor: 'pointer',
+ ...(filterCategories === option && {
+ fontWeight: 'fontWeightBold',
+ }),
+ }}
+ >
+
+ {option}
+
+ ))}
+
+ );
+}
+
+FilterCategory.propTypes = {
+ filterCategories: PropTypes.string,
+ onChangeCategories: PropTypes.func,
+ options: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/product/filters/filter-price.jsx b/template/src/sections/_ecommerce/product/filters/filter-price.jsx
new file mode 100644
index 0000000..006417e
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/filters/filter-price.jsx
@@ -0,0 +1,41 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import TextField from '@mui/material/TextField';
+
+// ----------------------------------------------------------------------
+
+export default function FilterPrice({
+ filterPrice,
+ onChangeStartPrice,
+ onChangeEndPrice,
+ ...other
+}) {
+ return (
+ - } {...other}>
+
+
+
+ );
+}
+
+FilterPrice.propTypes = {
+ filterPrice: PropTypes.shape({
+ end: PropTypes.number,
+ start: PropTypes.number,
+ }),
+ onChangeEndPrice: PropTypes.func,
+ onChangeStartPrice: PropTypes.func,
+};
diff --git a/template/src/sections/_ecommerce/product/filters/filter-rating.jsx b/template/src/sections/_ecommerce/product/filters/filter-rating.jsx
new file mode 100644
index 0000000..3bea637
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/filters/filter-rating.jsx
@@ -0,0 +1,62 @@
+import PropTypes from 'prop-types';
+
+import Radio from '@mui/material/Radio';
+import Stack from '@mui/material/Stack';
+import Rating from '@mui/material/Rating';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+const RATINGS = ['up_4_stars', 'up_3_stars', 'up_2_stars'];
+
+export default function FilterRating({ filterRating, onChangeRating, ...other }) {
+ return (
+
+
+
+ {RATINGS.map((rating) => (
+ }
+ label={
+
+
+ & Up
+
+ }
+ sx={{
+ m: 0,
+ '&:hover': { opacity: 0.48 },
+ }}
+ />
+ ))}
+
+
+
+ );
+}
+
+FilterRating.propTypes = {
+ filterRating: PropTypes.string,
+ onChangeRating: PropTypes.func,
+};
diff --git a/template/src/sections/_ecommerce/product/filters/filter-shipping.jsx b/template/src/sections/_ecommerce/product/filters/filter-shipping.jsx
new file mode 100644
index 0000000..c27f095
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/filters/filter-shipping.jsx
@@ -0,0 +1,34 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Checkbox from '@mui/material/Checkbox';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+export default function FilterShipping({ options, filterShipping, onChangeShipping, ...other }) {
+ return (
+
+ {options.map((option) => (
+ onChangeShipping(option)}
+ />
+ }
+ label={option}
+ />
+ ))}
+
+ );
+}
+
+FilterShipping.propTypes = {
+ filterShipping: PropTypes.arrayOf(PropTypes.string),
+ onChangeShipping: PropTypes.func,
+ options: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/product/filters/filter-stock.jsx b/template/src/sections/_ecommerce/product/filters/filter-stock.jsx
new file mode 100644
index 0000000..2183a5a
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/filters/filter-stock.jsx
@@ -0,0 +1,27 @@
+import PropTypes from 'prop-types';
+
+import Switch from '@mui/material/Switch';
+import FormControlLabel, { formControlLabelClasses } from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+export default function FilterStock({ filterStock, onChangeStock }) {
+ return (
+ }
+ labelPlacement="start"
+ label="Only in Stock"
+ sx={{
+ m: 0,
+ [`& .${formControlLabelClasses.label}`]: {
+ typography: 'h6',
+ },
+ }}
+ />
+ );
+}
+
+FilterStock.propTypes = {
+ filterStock: PropTypes.bool,
+ onChangeStock: PropTypes.func,
+};
diff --git a/template/src/sections/_ecommerce/product/filters/filter-tag.jsx b/template/src/sections/_ecommerce/product/filters/filter-tag.jsx
new file mode 100644
index 0000000..b1c7bb1
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/filters/filter-tag.jsx
@@ -0,0 +1,38 @@
+import PropTypes from 'prop-types';
+
+import Chip from '@mui/material/Chip';
+import Stack from '@mui/material/Stack';
+
+// ----------------------------------------------------------------------
+
+export default function FilterTag({ options, filterTag, onChangeTag, ...other }) {
+ return (
+
+ {options.map((option) => {
+ const selected = filterTag.includes(option);
+
+ return (
+ onChangeTag(option)}
+ sx={{
+ ...(selected && {
+ bgcolor: 'action.selected',
+ fontWeight: 'fontWeightBold',
+ }),
+ }}
+ />
+ );
+ })}
+
+ );
+}
+
+FilterTag.propTypes = {
+ filterTag: PropTypes.arrayOf(PropTypes.string),
+ onChangeTag: PropTypes.func,
+ options: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-item-best-sellers.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-best-sellers.jsx
new file mode 100644
index 0000000..6f25378
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-best-sellers.jsx
@@ -0,0 +1,67 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import ProductPrice from '../../common/product-price';
+import ProductRating from '../../common/product-rating';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductItemBestSellers({ product, ...other }) {
+ return (
+
+
+ theme.transitions.create('opacity', {
+ easing: theme.transitions.easing.easeIn,
+ duration: theme.transitions.duration.shortest,
+ }),
+ '&:hover': { opacity: 0.72 },
+ }}
+ {...other}
+ >
+
+
+
+
+ {product.name}
+
+
+
+
+
+
+
+
+ );
+}
+
+EcommerceProductItemBestSellers.propTypes = {
+ product: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ priceSale: PropTypes.number,
+ sold: PropTypes.number,
+ ratingNumber: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-item-count-down.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-count-down.jsx
new file mode 100644
index 0000000..b8f98de
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-count-down.jsx
@@ -0,0 +1,72 @@
+import { add } from 'date-fns';
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fCurrency } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import ProductCountdownBlock from '../../common/product-countdown-block';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductItemCountDown({ product, color = 'primary', sx }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+
+ {product.name}
+
+
+ {`From ${fCurrency(product.price)}`}
+
+
+
+
+
+ );
+}
+
+EcommerceProductItemCountDown.propTypes = {
+ color: PropTypes.string,
+ product: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ }),
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-item-featured-by-brand.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-featured-by-brand.jsx
new file mode 100644
index 0000000..528916d
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-featured-by-brand.jsx
@@ -0,0 +1,77 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import { alpha } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import ProductPrice from '../../common/product-price';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductItemFeaturedByBrand({ product, sx, ...other }) {
+ return (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ ...sx,
+ }}
+ {...other}
+ >
+
+
+
+
+ {product.name}
+
+
+
+ {product.category}
+
+
+
+
+
+
+ Buy Now
+
+
+
+
+ );
+}
+
+EcommerceProductItemFeaturedByBrand.propTypes = {
+ product: PropTypes.shape({
+ category: PropTypes.string,
+ coverUrl: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ priceSale: PropTypes.number,
+ }),
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-item-hero.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-hero.jsx
new file mode 100644
index 0000000..2a7cff6
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-hero.jsx
@@ -0,0 +1,89 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import Grid from '@mui/material/Unstable_Grid2';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductItemHero({ product }) {
+ const theme = useTheme();
+
+ const { label, title, caption, coverUrl } = product;
+
+ return (
+
+
+
+
+ {label}
+
+
+
+ {title}
+
+
+
+ {caption}
+
+
+ }
+ >
+ Shop Now
+
+
+
+
+
+
+
+
+ );
+}
+
+EcommerceProductItemHero.propTypes = {
+ product: PropTypes.shape({
+ caption: PropTypes.string,
+ coverUrl: PropTypes.string,
+ label: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-item-hot.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-hot.jsx
new file mode 100644
index 0000000..5192070
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-hot.jsx
@@ -0,0 +1,93 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Typography from '@mui/material/Typography';
+import LinearProgress from '@mui/material/LinearProgress';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import ProductPrice from '../../common/product-price';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductItemHot({ product, hotProduct = false, sx }) {
+ return (
+
+
+ theme.transitions.create('background-color', {
+ easing: theme.transitions.easing.easeIn,
+ duration: theme.transitions.duration.shortest,
+ }),
+ '&:hover': {
+ bgcolor: 'background.neutral',
+ },
+ ...sx,
+ }}
+ >
+
+
+
+
+ {product.name}
+
+
+
+
+
+ {hotProduct && (
+
+
+
+ {`🔥 ${product.sold} Sold`}
+
+ )}
+
+
+ );
+}
+
+EcommerceProductItemHot.propTypes = {
+ hotProduct: PropTypes.bool,
+ product: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ sold: PropTypes.number,
+ stock: PropTypes.number,
+ }),
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-item-top.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-top.jsx
new file mode 100644
index 0000000..f725bf9
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-item-top.jsx
@@ -0,0 +1,118 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+import ProductPrice from '../../common/product-price';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductItemTop({ product, variant = 'small', sx }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const isLarge = mdUp && variant === 'large';
+
+ const coverUrl = ;
+
+ const nameText = (
+
+ {product.name}
+
+ );
+
+ const priceText = (
+
+ );
+
+ const moreBtn = (
+ }
+ sx={{ flexShrink: 0 }}
+ >
+ More Details
+
+ );
+
+ const renderLargeItem = (
+
+ {coverUrl}
+
+
+
+ {nameText}
+ {priceText}
+
+
+ {moreBtn}
+
+
+ );
+
+ const renderSmallItem = (
+
+
+ {coverUrl}
+
+
+
+ {nameText}
+ {priceText}
+
+
+ {moreBtn}
+
+
+
+ );
+
+ return (
+
+ {isLarge ? renderLargeItem : renderSmallItem}
+
+ );
+}
+
+EcommerceProductItemTop.propTypes = {
+ product: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ }),
+ sx: PropTypes.object,
+ variant: PropTypes.string,
+};
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-view-grid-item-skeleton.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-view-grid-item-skeleton.jsx
new file mode 100644
index 0000000..3296a6f
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-view-grid-item-skeleton.jsx
@@ -0,0 +1,35 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Skeleton from '@mui/material/Skeleton';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductViewGridItemSkeleton() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-view-grid-item.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-view-grid-item.jsx
new file mode 100644
index 0000000..8f89c4c
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-view-grid-item.jsx
@@ -0,0 +1,109 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Fab from '@mui/material/Fab';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Label from 'src/components/label';
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+import ProductPrice from '../../common/product-price';
+import ProductRating from '../../common/product-rating';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductViewGridItem({ product, sx, ...other }) {
+ return (
+
+ {product.label === 'new' && (
+
+ NEW
+
+ )}
+
+ {product.label === 'sale' && (
+
+ SALE
+
+ )}
+
+
+
+ theme.transitions.create('opacity', {
+ easing: theme.transitions.easing.easeIn,
+ duration: theme.transitions.duration.shortest,
+ }),
+ }}
+ >
+
+
+
+
+
+
+
+
+ {product.category}
+
+
+
+
+ {product.name}
+
+
+
+
+
+
+
+
+ );
+}
+
+EcommerceProductViewGridItem.propTypes = {
+ product: PropTypes.shape({
+ name: PropTypes.string,
+ sold: PropTypes.number,
+ label: PropTypes.string,
+ price: PropTypes.number,
+ category: PropTypes.string,
+ coverUrl: PropTypes.string,
+ priceSale: PropTypes.number,
+ ratingNumber: PropTypes.number,
+ }),
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-view-list-item-skeleton.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-view-list-item-skeleton.jsx
new file mode 100644
index 0000000..34a8356
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-view-list-item-skeleton.jsx
@@ -0,0 +1,28 @@
+import Stack from '@mui/material/Stack';
+import Skeleton from '@mui/material/Skeleton';
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductViewListItemSkeleton() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/product/item/ecommerce-product-view-list-item.jsx b/template/src/sections/_ecommerce/product/item/ecommerce-product-view-list-item.jsx
new file mode 100644
index 0000000..c182ebb
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/item/ecommerce-product-view-list-item.jsx
@@ -0,0 +1,118 @@
+import PropTypes from 'prop-types';
+
+import Fab from '@mui/material/Fab';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+import ProductPrice from '../../common/product-price';
+import ProductRating from '../../common/product-rating';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductViewListItem({ product, ...other }) {
+ return (
+
+ {product.label === 'new' && (
+
+ NEW
+
+ )}
+
+ {product.label === 'sale' && (
+
+ SALE
+
+ )}
+
+
+ theme.transitions.create('opacity', {
+ easing: theme.transitions.easing.easeIn,
+ duration: theme.transitions.duration.shortest,
+ }),
+ }}
+ >
+
+
+
+
+
+
+
+
+ {product.category}
+
+
+
+
+ {product.name}
+
+
+
+
+
+
+
+ {product.caption}
+
+
+
+
+
+ );
+}
+
+EcommerceProductViewListItem.propTypes = {
+ product: PropTypes.shape({
+ caption: PropTypes.string,
+ category: PropTypes.string,
+ coverUrl: PropTypes.string,
+ label: PropTypes.string,
+ name: PropTypes.string,
+ price: PropTypes.number,
+ priceSale: PropTypes.number,
+ sold: PropTypes.number,
+ ratingNumber: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_ecommerce/product/list/ecommerce-product-list-best-sellers.jsx b/template/src/sections/_ecommerce/product/list/ecommerce-product-list-best-sellers.jsx
new file mode 100644
index 0000000..8fc8601
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/list/ecommerce-product-list-best-sellers.jsx
@@ -0,0 +1,24 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import EcommerceProductItemBestSellers from '../item/ecommerce-product-item-best-sellers';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductListBestSellers({ products }) {
+ return (
+
+ Best Sellers
+
+ {products.slice(0, 8).map((product) => (
+
+ ))}
+
+ );
+}
+
+EcommerceProductListBestSellers.propTypes = {
+ products: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/product/list/ecommerce-product-list.jsx b/template/src/sections/_ecommerce/product/list/ecommerce-product-list.jsx
new file mode 100644
index 0000000..e10aadb
--- /dev/null
+++ b/template/src/sections/_ecommerce/product/list/ecommerce-product-list.jsx
@@ -0,0 +1,67 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import EcommerceProductViewListItem from '../item/ecommerce-product-view-list-item';
+import EcommerceProductViewGridItem from '../item/ecommerce-product-view-grid-item';
+import EcommerceProductViewListItemSkeleton from '../item/ecommerce-product-view-list-item-skeleton';
+import EcommerceProductViewGridItemSkeleton from '../item/ecommerce-product-view-grid-item-skeleton';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductList({ loading, viewMode, products }) {
+ return (
+ <>
+ {viewMode === 'grid' ? (
+
+ {(loading ? [...Array(16)] : products).map((product, index) =>
+ product ? (
+
+ ) : (
+
+ )
+ )}
+
+ ) : (
+
+ {(loading ? [...Array(16)] : products).map((product, index) =>
+ product ? (
+
+ ) : (
+
+ )
+ )}
+
+ )}
+
+
+ >
+ );
+}
+
+EcommerceProductList.propTypes = {
+ loading: PropTypes.bool,
+ products: PropTypes.array,
+ viewMode: PropTypes.string,
+};
diff --git a/template/src/sections/_ecommerce/testimonial/ecommerce-testimonial-item.jsx b/template/src/sections/_ecommerce/testimonial/ecommerce-testimonial-item.jsx
new file mode 100644
index 0000000..23a970a
--- /dev/null
+++ b/template/src/sections/_ecommerce/testimonial/ecommerce-testimonial-item.jsx
@@ -0,0 +1,48 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Rating from '@mui/material/Rating';
+import Typography from '@mui/material/Typography';
+
+import { fDate } from 'src/utils/format-time';
+
+// ----------------------------------------------------------------------
+
+export default function TestimonialItem({ testimonial, sx, ...other }) {
+ return (
+
+ {testimonial.createdAt && (
+
+ {fDate(testimonial.createdAt)}
+
+ )}
+
+ {testimonial.name}
+
+
+
+
+ {testimonial.review}
+
+
+ );
+}
+
+TestimonialItem.propTypes = {
+ sx: PropTypes.object,
+ testimonial: PropTypes.shape({
+ name: PropTypes.string,
+ review: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ createdAt: PropTypes.instanceOf(Date),
+ }),
+};
diff --git a/template/src/sections/_ecommerce/testimonial/ecommerce-testimonial.jsx b/template/src/sections/_ecommerce/testimonial/ecommerce-testimonial.jsx
new file mode 100644
index 0000000..c1e396c
--- /dev/null
+++ b/template/src/sections/_ecommerce/testimonial/ecommerce-testimonial.jsx
@@ -0,0 +1,80 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import TestimonialItem from './ecommerce-testimonial-item';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceTestimonial({ testimonials }) {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ dots: !mdUp,
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ ...CarouselDots({
+ sx: {
+ mt: 8,
+ },
+ }),
+ responsive: [
+ {
+ // Down md
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 2, slidesToScroll: 3 },
+ },
+ {
+ // Down sm
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 1, slidesToScroll: 1 },
+ },
+ ],
+ });
+
+ return (
+
+
+
+ Popular Reviews
+
+
+ {mdUp && (
+
+ )}
+
+
+
+ {testimonials.map((testimonial) => (
+
+
+
+ ))}
+
+
+ );
+}
+
+EcommerceTestimonial.propTypes = {
+ testimonials: PropTypes.array,
+};
diff --git a/template/src/sections/_ecommerce/view/ecommerce-account-orders-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-account-orders-view.jsx
new file mode 100644
index 0000000..9d4c21e
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-account-orders-view.jsx
@@ -0,0 +1,246 @@
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Tab from '@mui/material/Tab';
+import Tabs from '@mui/material/Tabs';
+import Stack from '@mui/material/Stack';
+import Table from '@mui/material/Table';
+import Switch from '@mui/material/Switch';
+import TableRow from '@mui/material/TableRow';
+import TableBody from '@mui/material/TableBody';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+import TableContainer from '@mui/material/TableContainer';
+import { DatePicker } from '@mui/x-date-pickers/DatePicker';
+import TablePagination from '@mui/material/TablePagination';
+import FormControlLabel from '@mui/material/FormControlLabel';
+import TableCell, { tableCellClasses } from '@mui/material/TableCell';
+
+import { _productsTable } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+import Scrollbar from 'src/components/scrollbar';
+
+import { stableSort, getComparator } from '../account/utils';
+import EcommerceAccountOrdersTableRow from '../account/ecommerce-account-orders-table-row';
+import EcommerceAccountOrdersTableHead from '../account/ecommerce-account-orders-table-head';
+import EcommerceAccountOrdersTableToolbar from '../account/ecommerce-account-orders-table-toolbar';
+
+// ----------------------------------------------------------------------
+
+const TABS = ['All Orders', 'Completed', 'To Process', 'Cancelled', 'Return & Refund'];
+
+export const TABLE_HEAD = [
+ { id: 'orderId', label: 'Order ID' },
+ { id: 'item', label: 'Item' },
+ { id: 'deliveryDate', label: 'Delivery date', width: 160 },
+ { id: 'price', label: 'Price', width: 100 },
+ { id: 'status', label: 'Status', width: 100 },
+ { id: '' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountOrdersPage() {
+ const [tab, setTab] = useState('All Orders');
+
+ const [order, setOrder] = useState('asc');
+
+ const [orderBy, setOrderBy] = useState('orderId');
+
+ const [selected, setSelected] = useState([]);
+
+ const [page, setPage] = useState(0);
+
+ const [dense, setDense] = useState(false);
+
+ const [rowsPerPage, setRowsPerPage] = useState(10);
+
+ const handleChangeTab = useCallback((event, newValue) => {
+ setTab(newValue);
+ }, []);
+
+ const handleSort = useCallback(
+ (id) => {
+ const isAsc = orderBy === id && order === 'asc';
+ if (id !== '') {
+ setOrder(isAsc ? 'desc' : 'asc');
+ setOrderBy(id);
+ }
+ },
+ [order, orderBy]
+ );
+
+ const handleSelectAllRows = useCallback((event) => {
+ if (event.target.checked) {
+ const newSelected = _productsTable.map((n) => n.id);
+ setSelected(newSelected);
+ return;
+ }
+ setSelected([]);
+ }, []);
+
+ const handleSelectRow = useCallback(
+ (id) => {
+ const selectedIndex = selected.indexOf(id);
+ let newSelected = [];
+
+ if (selectedIndex === -1) {
+ newSelected = newSelected.concat(selected, id);
+ } else if (selectedIndex === 0) {
+ newSelected = newSelected.concat(selected.slice(1));
+ } else if (selectedIndex === selected.length - 1) {
+ newSelected = newSelected.concat(selected.slice(0, -1));
+ } else if (selectedIndex > 0) {
+ newSelected = newSelected.concat(
+ selected.slice(0, selectedIndex),
+ selected.slice(selectedIndex + 1)
+ );
+ }
+
+ setSelected(newSelected);
+ },
+ [selected]
+ );
+
+ const handleChangePage = useCallback((event, newPage) => {
+ setPage(newPage);
+ }, []);
+
+ const handleChangeRowsPerPage = useCallback((event) => {
+ setRowsPerPage(parseInt(event.target.value, 10));
+ setPage(0);
+ }, []);
+
+ const handleChangeDense = useCallback((event) => {
+ setDense(event.target.checked);
+ }, []);
+
+ const emptyRows = page > 0 ? Math.max(0, (1 + page) * rowsPerPage - _productsTable.length) : 0;
+
+ return (
+ <>
+
+ Orders
+
+
+
+ {TABS.map((category) => (
+
+ ))}
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ theme.palette.divider,
+ },
+ }}
+ >
+
+
+
+
+
+
+
+ {stableSort(_productsTable, getComparator(order, orderBy))
+ .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
+ .map((row) => (
+ handleSelectRow(row.id)}
+ />
+ ))}
+
+ {emptyRows > 0 && (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+ }
+ label="Dense padding"
+ sx={{
+ pl: 2,
+ py: 1.5,
+ top: 0,
+ position: {
+ sm: 'absolute',
+ },
+ }}
+ />
+
+ >
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-account-payment-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-account-payment-view.jsx
new file mode 100644
index 0000000..cc5ba92
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-account-payment-view.jsx
@@ -0,0 +1,76 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+
+import { _mock } from 'src/_mock';
+
+import EcommerceAccountPaymentCard from '../account/ecommerce-account-payment-card';
+import EcommerceAccountNewCardForm from '../account/ecommerce-account-new-card-form';
+
+// ----------------------------------------------------------------------
+
+const CARD_OPTIONS = [
+ {
+ id: _mock.id(1),
+ value: 'paypal',
+ label: 'Paypal',
+ cardNumber: '2904 1902 1802 1234',
+ cardHolder: _mock.fullName(1),
+ expirationDate: '08/24',
+ isPrimary: false,
+ },
+ {
+ id: _mock.id(2),
+ value: 'mastercard',
+ label: 'Mastercard',
+ cardNumber: '2904 1902 1802 5678',
+ cardHolder: _mock.fullName(2),
+ expirationDate: '08/24',
+ isPrimary: true,
+ },
+ {
+ id: _mock.id(3),
+ value: 'visa',
+ label: 'Visa',
+ cardNumber: '2904 1902 1802 7890',
+ cardHolder: _mock.fullName(3),
+ expirationDate: '08/24',
+ isPrimary: false,
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountPaymentView() {
+ return (
+
+
+ Payment Method
+
+
+ {CARD_OPTIONS.map((card) => (
+
+ ))}
+
+
+
+
+
+
+ Add New Card
+
+
+
+
+ Save
+
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-account-personal-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-account-personal-view.jsx
new file mode 100644
index 0000000..ff9dd68
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-account-personal-view.jsx
@@ -0,0 +1,200 @@
+import * as Yup from 'yup';
+import { yupResolver } from '@hookform/resolvers/yup';
+import { useForm, Controller } from 'react-hook-form';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+import { DatePicker } from '@mui/x-date-pickers/DatePicker';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { countries } from 'src/assets/data';
+
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFSelect, RHFTextField, RHFAutocomplete } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+const GENDER_OPTIONS = ['Male', 'Female', 'Other'];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountPersonalView() {
+ const passwordShow = useBoolean();
+
+ const EcommerceAccountPersonalSchema = Yup.object().shape({
+ firstName: Yup.string().required('First name is required'),
+ lastName: Yup.string().required('Last name is required'),
+ emailAddress: Yup.string().required('Email address is required'),
+ phoneNumber: Yup.string().required('Phone number is required'),
+ birthday: Yup.mixed().nullable().required('Birthday is required'),
+ gender: Yup.string().required('Gender is required'),
+ streetAddress: Yup.string().required('Street address is required'),
+ city: Yup.string().required('City is required'),
+ zipCode: Yup.string().required('Zip code is required'),
+ });
+
+ const defaultValues = {
+ firstName: 'Jayvion',
+ lastName: 'Simon',
+ emailAddress: 'nannie_abernathy70@yahoo.com',
+ phoneNumber: '365-374-4961',
+ birthday: null,
+ gender: 'Male',
+ streetAddress: '',
+ zipCode: '',
+ city: '',
+ country: 'United States',
+ oldPassword: '',
+ newPassword: '',
+ confirmNewPassword: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(EcommerceAccountPersonalSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ return (
+
+
+ Personal
+
+
+
+
+
+
+
+
+
+
+
+ (
+
+ )}
+ />
+
+
+ {GENDER_OPTIONS.map((option) => (
+
+ {option}
+
+ ))}
+
+
+
+
+
+
+
+
+ option.label)}
+ getOptionLabel={(option) => option}
+ />
+
+
+ Change Password
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+ Save Changes
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-account-vouchers-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-account-vouchers-view.jsx
new file mode 100644
index 0000000..ea85058
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-account-vouchers-view.jsx
@@ -0,0 +1,138 @@
+import { add } from 'date-fns';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Tab from '@mui/material/Tab';
+import Tabs from '@mui/material/Tabs';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { _mock } from 'src/_mock';
+
+import EcommerceAccountVoucherItem from '../account/ecommerce-account-voucher-item';
+
+// ----------------------------------------------------------------------
+
+const TABS = ['All Vouchers', 'Latest', 'Popular', 'Expiring'];
+
+const VOUCHERS = [
+ {
+ id: _mock.id(1),
+ type: 'shipping',
+ label: 'Shipping',
+ title: '6% off',
+ description: 'Min. Spend $0',
+ dueOn: add(new Date(), { days: 1 }),
+ },
+ {
+ id: _mock.id(2),
+ type: 'shipping',
+ label: 'Shipping',
+ title: '6% off',
+ description: 'Min. Spend $0',
+ dueOn: add(new Date(), { days: 2 }),
+ },
+ {
+ id: _mock.id(3),
+ type: 'all',
+ label: 'All Categories',
+ title: '6% off',
+ description: 'Min. Spend $0 Capped at $10',
+ dueOn: add(new Date(), { days: 1 }),
+ },
+ {
+ id: _mock.id(4),
+ type: 'shipping',
+ label: 'Shipping',
+ title: '6% off',
+ description: 'Min. Spend $0 Capped at $10',
+ dueOn: add(new Date(), { days: 2 }),
+ },
+ {
+ id: _mock.id(5),
+ type: 'category',
+ label: 'Men Clothes',
+ title: 'Up to 50%',
+ description: 'Min. Spend $0 Capped at $10',
+ dueOn: add(new Date(), { days: 3 }),
+ },
+ {
+ id: _mock.id(6),
+ type: 'shipping',
+ label: 'Shipping',
+ title: '6% off',
+ description: 'Min. Spend $0',
+ dueOn: add(new Date(), { days: 4 }),
+ },
+ {
+ id: _mock.id(7),
+ type: 'shipping',
+ label: 'Shipping',
+ title: '6% off',
+ description: 'Min. Spend $0',
+ dueOn: add(new Date(), { days: 5 }),
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountVouchersView() {
+ const [tab, setTab] = useState('All Vouchers');
+
+ const handleChangeTab = useCallback((event, newValue) => {
+ setTab(newValue);
+ }, []);
+
+ return (
+ <>
+
+ Vouchers
+
+
+
+
+ Redeem
+
+
+ ),
+ }}
+ />
+
+
+
+
+ {TABS.map((category) => (
+
+ ))}
+
+
+
+ {VOUCHERS.map((voucher) => (
+
+ ))}
+
+ >
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-account-wishlist-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-account-wishlist-view.jsx
new file mode 100644
index 0000000..bdb3928
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-account-wishlist-view.jsx
@@ -0,0 +1,52 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { _products } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import EcommerceCartList from '../cart/ecommerce-cart-list';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceAccountWishlistView() {
+ return (
+ <>
+
+ Wishlist
+
+
+
+
+
+
+
+ Subtotal
+ $58.07
+
+
+ }
+ >
+ Add to Cart
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-cart-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-cart-view.jsx
new file mode 100644
index 0000000..f16a443
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-cart-view.jsx
@@ -0,0 +1,58 @@
+import Button from '@mui/material/Button';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { _products } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import EcommerceCartList from '../cart/ecommerce-cart-list';
+import EcommerceCartSummary from '../cart/ecommerce-cart-summary';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCartView() {
+ return (
+
+
+ Shopping Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ sx={{ mt: 3 }}
+ >
+ Continue Shopping
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-checkout-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-checkout-view.jsx
new file mode 100644
index 0000000..1c8a9dc
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-checkout-view.jsx
@@ -0,0 +1,237 @@
+import * as Yup from 'yup';
+import PropTypes from 'prop-types';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import Collapse from '@mui/material/Collapse';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { useRouter } from 'src/routes/hooks';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _products } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+import FormProvider from 'src/components/hook-form';
+
+import EcommerceCheckoutNewCardForm from '../checkout/ecommerce-checkout-new-card-form';
+import EcommerceCheckoutOrderSummary from '../checkout/ecommerce-checkout-order-summary';
+import EcommerceCheckoutPaymentMethod from '../checkout/ecommerce-checkout-payment-method';
+import EcommerceCheckoutShippingMethod from '../checkout/ecommerce-checkout-shipping-method';
+import EcommerceCheckoutPersonalDetails from '../checkout/ecommerce-checkout-personal-details';
+import EcommerceCheckoutShippingDetails from '../checkout/ecommerce-checkout-shipping-details';
+
+// ----------------------------------------------------------------------
+
+const SHIPPING_OPTIONS = [
+ {
+ label: 'Free',
+ value: 'free',
+ description: '5-7 Days delivery',
+ price: 0,
+ },
+ {
+ label: 'Standard',
+ value: 'standard',
+ description: '3-5 Days delivery',
+ price: 10,
+ },
+ {
+ label: 'Express',
+ value: 'express',
+ description: '2-3 Days delivery',
+ price: 20,
+ },
+];
+
+const PAYMENT_OPTIONS = [
+ {
+ label: 'Paypal',
+ value: 'paypal',
+ description: '**** **** **** 1234',
+ },
+ {
+ label: 'MasterCard',
+ value: 'mastercard',
+ description: '**** **** **** 3456',
+ },
+ {
+ label: 'Visa',
+ value: 'visa',
+ description: '**** **** **** 6789',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCheckoutView() {
+ const router = useRouter();
+
+ const formOpen = useBoolean();
+
+ const EcommerceCheckoutSchema = Yup.object().shape({
+ firstName: Yup.string().required('First name is required'),
+ lastName: Yup.string().required('Last name is required'),
+ emailAddress: Yup.string().required('Email address is required'),
+ phoneNumber: Yup.string().required('Phone number is required'),
+ streetAddress: Yup.string().required('Street address is required'),
+ city: Yup.string().required('City is required'),
+ zipCode: Yup.string().required('Zip code is required'),
+ });
+
+ const defaultValues = {
+ firstName: 'Jayvion',
+ lastName: 'Simon',
+ emailAddress: 'nannie_abernathy70@yahoo.com',
+ phoneNumber: '365-374-4961',
+ password: '',
+ confirmPassword: '',
+ streetAddress: '',
+ city: '',
+ country: 'United States',
+ zipCode: '',
+ shipping: 'free',
+ paymentMethods: 'mastercard',
+ newCard: {
+ cardNumber: '',
+ cardHolder: '',
+ expirationDate: '',
+ ccv: '',
+ },
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(EcommerceCheckoutSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ router.push(paths.eCommerce.orderCompleted);
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ return (
+
+
+ Checkout
+
+
+
+
+
+ }>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ onClick={formOpen.onToggle}
+ >
+ {formOpen.value ? 'Cancel' : 'Add New Card'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function StepLabel({ step, title }) {
+ return (
+
+
+ {step}
+
+ {title}
+
+ );
+}
+
+StepLabel.propTypes = {
+ step: PropTypes.string,
+ title: PropTypes.string,
+};
diff --git a/template/src/sections/_ecommerce/view/ecommerce-compare-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-compare-view.jsx
new file mode 100644
index 0000000..2cce384
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-compare-view.jsx
@@ -0,0 +1,34 @@
+import Stack from '@mui/material/Stack';
+import Switch from '@mui/material/Switch';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+import { _productsCompare } from 'src/_mock';
+
+import EcommerceCompareList from '../compare/ecommerce-compare-list';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceCompareView() {
+ return (
+
+
+ Compare
+
+ }
+ label="Only view the difference"
+ />
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-landing-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-landing-view.jsx
new file mode 100644
index 0000000..1231c04
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-landing-view.jsx
@@ -0,0 +1,37 @@
+import { _testimonials } from 'src/_mock';
+
+import EcommerceLandingHero from '../landing/ecommerce-landing-hero';
+import EcommerceTestimonial from '../testimonial/ecommerce-testimonial';
+import EcommerceLandingCategories from '../landing/ecommerce-landing-categories';
+import EcommerceLandingTopProducts from '../landing/ecommerce-landing-top-products';
+import EcommerceLandingSpecialOffer from '../landing/ecommerce-landing-special-offer';
+import EcommerceLandingHotDealToday from '../landing/ecommerce-landing-hot-deal-today';
+import EcommerceLandingFeaturedBrands from '../landing/ecommerce-landing-featured-brands';
+import EcommerceLandingPopularProducts from '../landing/ecommerce-landing-popular-products';
+import EcommerceLandingFeaturedProducts from '../landing/ecommerce-landing-featured-products';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceLandingView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-order-completed-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-order-completed-view.jsx
new file mode 100644
index 0000000..77287b0
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-order-completed-view.jsx
@@ -0,0 +1,51 @@
+import { m } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from 'src/components/iconify';
+import { varBounce, MotionContainer } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceOrderCompletedView() {
+ return (
+
+
+ 🎉
+
+
+
+ Your order is complete!
+
+
+ You will be receiving a confirmation email with order details.
+
+
+
+ }
+ >
+ Continue Shopping
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-product-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-product-view.jsx
new file mode 100644
index 0000000..1ba1465
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-product-view.jsx
@@ -0,0 +1,91 @@
+import { useEffect } from 'react';
+
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _products } from 'src/_mock';
+
+import { SplashScreen } from 'src/components/loading-screen';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import ReviewEcommerce from '../../review/ecommerce/review-ecommerce';
+import EcommerceProductDetailsInfo from '../product/details/ecommerce-product-details-info';
+import EcommerceProductDetailsCarousel from '../product/details/ecommerce-product-details-carousel';
+import EcommerceProductDetailsDescription from '../product/details/ecommerce-product-details-description';
+
+// ----------------------------------------------------------------------
+
+const _mockProduct = _products[0];
+
+export default function EcommerceProductView() {
+ const loading = useBoolean(true);
+
+ useEffect(() => {
+ const fakeLoading = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ loading.onFalse();
+ };
+ fakeLoading();
+ }, [loading]);
+
+ if (loading.value) {
+ return ;
+ }
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-products-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-products-view.jsx
new file mode 100644
index 0000000..742badc
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-products-view.jsx
@@ -0,0 +1,146 @@
+import { useState, useEffect, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Select from '@mui/material/Select';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import MenuItem from '@mui/material/MenuItem';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+import ToggleButton from '@mui/material/ToggleButton';
+import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _products } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import EcommerceFilters from '../product/filters/ecommerce-filters';
+import EcommerceProductList from '../product/list/ecommerce-product-list';
+import EcommerceProductListBestSellers from '../product/list/ecommerce-product-list-best-sellers';
+
+// ----------------------------------------------------------------------
+
+const VIEW_OPTIONS = [
+ { value: 'list', icon: },
+ { value: 'grid', icon: },
+];
+
+const SORT_OPTIONS = [
+ { value: 'latest', label: 'Latest' },
+ { value: 'oldest', label: 'Oldest' },
+ { value: 'popular', label: 'Popular' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceProductsView() {
+ const mobileOpen = useBoolean();
+
+ const [sort, setSort] = useState('latest');
+
+ const loading = useBoolean(true);
+
+ const [viewMode, setViewMode] = useState('grid');
+
+ useEffect(() => {
+ const fakeLoading = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ loading.onFalse();
+ };
+ fakeLoading();
+ }, [loading]);
+
+ const handleChangeViewMode = useCallback((event, newAlignment) => {
+ if (newAlignment !== null) {
+ setViewMode(newAlignment);
+ }
+ }, []);
+
+ const handleChangeSort = useCallback((event) => {
+ setSort(event.target.value);
+ }, []);
+
+ return (
+
+
+ Catalog
+
+ }
+ onClick={mobileOpen.onTrue}
+ sx={{
+ display: { md: 'none' },
+ }}
+ >
+ Filters
+
+
+
+
+ }>
+
+
+
+
+
+
+
+ {VIEW_OPTIONS.map((option) => (
+
+ {option.icon}
+
+ ))}
+
+
+
+
+ {SORT_OPTIONS.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_ecommerce/view/ecommerce-wishlist-view.jsx b/template/src/sections/_ecommerce/view/ecommerce-wishlist-view.jsx
new file mode 100644
index 0000000..e73bb98
--- /dev/null
+++ b/template/src/sections/_ecommerce/view/ecommerce-wishlist-view.jsx
@@ -0,0 +1,74 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { _products } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import EcommerceCartList from '../cart/ecommerce-cart-list';
+
+// ----------------------------------------------------------------------
+
+export default function EcommerceWishlistView() {
+ return (
+
+
+ Wishlist
+
+
+
+
+
+ }
+ sx={{ mt: 3 }}
+ >
+ Continue Shopping
+
+
+
+
+ Subtotal
+ $58.07
+
+
+ }
+ >
+ Add to Cart
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/about/elearning-about-core-values.jsx b/template/src/sections/_elearning/about/elearning-about-core-values.jsx
new file mode 100644
index 0000000..3e0850b
--- /dev/null
+++ b/template/src/sections/_elearning/about/elearning-about-core-values.jsx
@@ -0,0 +1,88 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const CORE_VALUES = [
+ {
+ title: 'Customer Satisfaction',
+ description: 'Aenean urna dictum adipiscing nec, cras quisque.',
+ icon: 'carbon:3d-curve-auto-colon',
+ },
+ {
+ title: 'Transparency',
+ description: 'Aenean urna dictum adipiscing nec, cras quisque.',
+ icon: 'carbon:chat-bot',
+ },
+ {
+ title: 'Reputation',
+ description: 'Aenean urna dictum adipiscing nec, cras quisque.',
+ icon: 'carbon:airport-location',
+ },
+ {
+ title: 'Cooperation',
+ description: 'Aenean urna dictum adipiscing nec, cras quisque.',
+ icon: 'carbon:event',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function ElearningAboutCoreValues() {
+ return (
+
+
+
+ Core Values
+
+
+ Etiam ultricies nisi vel augue. Suspendisse potenti. Sed mollis, eros et ultrices
+ tempus, mauris ipsum aliquam libero, non adipiscing dolor urna a orci. Phasellus viverra
+ nulla ut metus varius laoreet.
+
+
+
+
+ {CORE_VALUES.map((value) => (
+
+
+
+
+ {value.title}
+
+
+ {value.description}
+
+ ))}
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/about/elearning-about-hero.jsx b/template/src/sections/_elearning/about/elearning-about-hero.jsx
new file mode 100644
index 0000000..dede409
--- /dev/null
+++ b/template/src/sections/_elearning/about/elearning-about-hero.jsx
@@ -0,0 +1,50 @@
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningAboutHero() {
+ return (
+
+
+
+
+ Online Courses
+
+
+ Nunc nulla. Ut leo. Pellentesque commodo eros a enim. Nunc egestas, augue at
+ pellentesque laoreet, felis eros vehicula leo, at malesuada velit leo quis pede.
+
+
+
+ Browse Courses
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/about/elearning-about.jsx b/template/src/sections/_elearning/about/elearning-about.jsx
new file mode 100644
index 0000000..e3fdce0
--- /dev/null
+++ b/template/src/sections/_elearning/about/elearning-about.jsx
@@ -0,0 +1,121 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import CountUp from 'src/components/count-up';
+
+// ----------------------------------------------------------------------
+
+const SUMMARY = [
+ {
+ name: 'Learners',
+ number: 14000,
+ description:
+ 'Ut varius tincidunt libero. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.',
+ },
+ {
+ name: 'Courses',
+ number: 1050,
+ description:
+ 'Ut varius tincidunt libero. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.',
+ },
+ {
+ name: 'Graduates',
+ number: 52000,
+ description:
+ 'Ut varius tincidunt libero. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function ElearningAbout() {
+ return (
+
+
+
+
+ Nullam accumsan lorem in dui.
+
+
+
+
+
+ Effective Forms Advertising Internet Web Site
+
+
+
+ Over 92% of computers are infected with Adware and spyware. Such software is rarely
+ accompanied by uninstall utility and even when it is it almost always leaves broken
+ Windows
+
+
+
+
+
+
+
+
+
+
+
+ {SUMMARY.map((value) => (
+
+
+ {value.name}
+
+
+
+ fShortenNumber(newValue)}
+ />
+ +
+
+
+ {value.description}
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/contact/elearning-contact-form.jsx b/template/src/sections/_elearning/contact/elearning-contact-form.jsx
new file mode 100644
index 0000000..2a309a0
--- /dev/null
+++ b/template/src/sections/_elearning/contact/elearning-contact-form.jsx
@@ -0,0 +1,119 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningContactForm() {
+ const mdUp = useResponsive('up', 'md');
+
+ const ElearningContactSchema = Yup.object().shape({
+ fullName: Yup.string().required('Full name is required'),
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ subject: Yup.string().required('Subject is required'),
+ message: Yup.string().required('Message is required'),
+ });
+
+ const defaultValues = {
+ fullName: '',
+ subject: '',
+ email: '',
+ message: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(ElearningContactSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ return (
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+ Drop Us A Line
+
+
+ We normally respond within 2 business days
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Request
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/contact/elearning-contact-info.jsx b/template/src/sections/_elearning/contact/elearning-contact-info.jsx
new file mode 100644
index 0000000..738e2c7
--- /dev/null
+++ b/template/src/sections/_elearning/contact/elearning-contact-info.jsx
@@ -0,0 +1,86 @@
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import { _socials, _offices } from 'src/_mock';
+
+import ContactMap from 'src/components/map';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningContactInfo() {
+ return (
+
+
+
+
+ Get In Touch
+
+
+
+
+
+ Email
+
+
+
+ hello@example.com
+
+
+
+
+
+ Phone
+
+
+ (907) 555-0101
+
+
+
+
+ Address
+
+
+
+ 3891 Ranchview Dr. Richardson, California 62639
+
+
+
+
+
+
+ Follow Us
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/details/elearning-course-details-hero.jsx b/template/src/sections/_elearning/details/elearning-course-details-hero.jsx
new file mode 100644
index 0000000..d9a635e
--- /dev/null
+++ b/template/src/sections/_elearning/details/elearning-course-details-hero.jsx
@@ -0,0 +1,248 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Fab from '@mui/material/Fab';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Divider from '@mui/material/Divider';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import { _mock } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+import { PlayerDialog } from 'src/components/player';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseDetailsHero({ course }) {
+ const {
+ slug,
+ level,
+ lessons,
+ category,
+ coverUrl,
+ languages,
+ bestSeller,
+ totalHours,
+ description,
+ ratingNumber,
+ totalQuizzes,
+ totalReviews,
+ totalStudents,
+ teachers = [],
+ } = course;
+
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const videoOpen = useBoolean();
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {bestSeller && (
+
+ Best Seller
+
+ )}
+
+
+ {category}
+
+
+
+ {slug}
+
+
+ {description}
+
+
+ }
+ >
+
+
+
+ {Number.isInteger(ratingNumber) ? `${ratingNumber}.0` : ratingNumber}
+
+
+ {totalReviews && (
+
+ ({fShortenNumber(totalReviews)} reviews)
+
+ )}
+
+
+
+ {fShortenNumber(totalStudents)}
+
+ students
+
+
+
+
+
+
+
+
+ {teachers[0]?.name}
+
+
+ {!!teachers.length && (
+
+ + {teachers.length} teachers
+
+ )}
+
+
+
+
+
+ *': { my: 0.5, mr: 3 },
+ }}
+ >
+
+ {`${totalHours} hours`}
+
+
+
+
+ {`${lessons?.length} Lessons`}
+
+
+
+
+ {level}
+
+
+
+ *': { my: 0.5, mr: 3 },
+ }}
+ >
+
+
+ {typeof languages === 'string' ? languages : languages?.join(', ')}
+
+
+
+ {`${totalQuizzes} Quizzes`}
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+ElearningCourseDetailsHero.propTypes = {
+ course: PropTypes.shape({
+ slug: PropTypes.string,
+ level: PropTypes.string,
+ lessons: PropTypes.array,
+ teachers: PropTypes.array,
+ bestSeller: PropTypes.bool,
+ category: PropTypes.string,
+ coverUrl: PropTypes.string,
+ totalHours: PropTypes.number,
+ description: PropTypes.string,
+ totalQuizzes: PropTypes.number,
+ ratingNumber: PropTypes.number,
+ totalReviews: PropTypes.number,
+ totalStudents: PropTypes.number,
+ languages: PropTypes.arrayOf(PropTypes.string),
+ }),
+};
diff --git a/template/src/sections/_elearning/details/elearning-course-details-info.jsx b/template/src/sections/_elearning/details/elearning-course-details-info.jsx
new file mode 100644
index 0000000..b3c402b
--- /dev/null
+++ b/template/src/sections/_elearning/details/elearning-course-details-info.jsx
@@ -0,0 +1,86 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+
+import { fCurrency } from 'src/utils/format-number';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseDetailsInfo({ course }) {
+ return (
+
+
+
+ {!!course.priceSale && (
+
+ {fCurrency(course.priceSale)}
+
+ )}
+ {fCurrency(course.price)}
+
+
+
+ This course includes:
+
+
+
+
+ {course.lessons?.length}
+
+ Lessons
+
+
+
+
+
+ {course.resources}
+
+ Downloadable resources
+
+
+
+
+ Full lifetime access
+
+
+
+
+ Access on desktops, tablets, mobile
+
+
+
+
+ Certificate of completion
+
+
+
+
+ Enrol Now
+
+
+
+ );
+}
+
+ElearningCourseDetailsInfo.propTypes = {
+ course: PropTypes.shape({
+ lessons: PropTypes.array,
+ price: PropTypes.number,
+ priceSale: PropTypes.number,
+ resources: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_elearning/details/elearning-course-details-lesson-item.jsx b/template/src/sections/_elearning/details/elearning-course-details-lesson-item.jsx
new file mode 100644
index 0000000..379bdb0
--- /dev/null
+++ b/template/src/sections/_elearning/details/elearning-course-details-lesson-item.jsx
@@ -0,0 +1,85 @@
+import PropTypes from 'prop-types';
+
+import Typography from '@mui/material/Typography';
+import AccordionDetails from '@mui/material/AccordionDetails';
+import Accordion, { accordionClasses } from '@mui/material/Accordion';
+import AccordionSummary, { accordionSummaryClasses } from '@mui/material/AccordionSummary';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseDetailsLessonItem({
+ lesson,
+ expanded,
+ selected,
+ onSelected,
+ onExpanded,
+}) {
+ const playIcon = selected ? 'carbon:pause-outline' : 'carbon:play';
+
+ return (
+
+
+
+
+
+ {lesson.title}
+
+
+ {lesson.duration} m
+
+
+
+
+
+ {lesson.description}
+
+
+ );
+}
+
+ElearningCourseDetailsLessonItem.propTypes = {
+ expanded: PropTypes.bool,
+ lesson: PropTypes.object,
+ onExpanded: PropTypes.func,
+ onSelected: PropTypes.func,
+ selected: PropTypes.bool,
+};
diff --git a/template/src/sections/_elearning/details/elearning-course-details-lesson-list.jsx b/template/src/sections/_elearning/details/elearning-course-details-lesson-list.jsx
new file mode 100644
index 0000000..05b8749
--- /dev/null
+++ b/template/src/sections/_elearning/details/elearning-course-details-lesson-list.jsx
@@ -0,0 +1,79 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import ElearningCourseDetailsLessonItem from './elearning-course-details-lesson-item';
+import ElearningCourseDetailsLessonsDialog from './elearning-course-details-lessons-dialog';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseDetailsLessonList({ lessons }) {
+ const videoPlay = useBoolean();
+
+ const [expanded, setExpanded] = useState(false);
+
+ const [selectedLesson, setSelectedLesson] = useState(null);
+
+ const handleReady = useCallback(() => {
+ setTimeout(() => videoPlay.onTrue(), 500);
+ }, [videoPlay]);
+
+ const handleSelectedLesson = useCallback((lesson) => {
+ if (lesson.unLocked) {
+ setSelectedLesson(lesson);
+ }
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setSelectedLesson(null);
+ videoPlay.onFalse();
+ }, [videoPlay]);
+
+ const handleExpandedLesson = useCallback(
+ (panel) => (event, isExpanded) => {
+ setExpanded(isExpanded ? panel : false);
+ },
+ []
+ );
+
+ return (
+
+
+ Lessons
+
+
+ {lessons.map((lesson) => (
+ {
+ handleSelectedLesson(lesson);
+ }}
+ />
+ ))}
+
+ setSelectedLesson(lesson)}
+ open={!!selectedLesson?.unLocked}
+ onClose={handleClose}
+ playing={videoPlay.value}
+ onReady={handleReady}
+ onEnded={videoPlay.onFalse}
+ onPlay={videoPlay.onTrue}
+ onPause={videoPlay.onFalse}
+ />
+
+ );
+}
+
+ElearningCourseDetailsLessonList.propTypes = {
+ lessons: PropTypes.array,
+};
diff --git a/template/src/sections/_elearning/details/elearning-course-details-lessons-dialog.jsx b/template/src/sections/_elearning/details/elearning-course-details-lessons-dialog.jsx
new file mode 100644
index 0000000..d793fc5
--- /dev/null
+++ b/template/src/sections/_elearning/details/elearning-course-details-lessons-dialog.jsx
@@ -0,0 +1,158 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Dialog from '@mui/material/Dialog';
+import IconButton from '@mui/material/IconButton';
+import ListItemText from '@mui/material/ListItemText';
+import ListItemButton from '@mui/material/ListItemButton';
+
+import Player from 'src/components/player';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseDetailsLessonsDialog({
+ lessons,
+ selectedLesson,
+ onSelectedLesson,
+ open,
+ onClose,
+ playing,
+ onReady,
+ onEnded,
+ onPlay,
+ onPause,
+}) {
+ const renderVideo = (
+
+ {selectedLesson?.videoPath ? (
+
+ ) : (
+
+ No Data
+
+ )}
+
+ );
+
+ const renderList = (
+
+ {lessons?.map((lesson) => {
+ const selected = selectedLesson?.id === lesson.id;
+
+ const playIcon = selected ? 'carbon:pause-outline' : 'carbon:play';
+
+ return (
+ onSelectedLesson(lesson)}
+ sx={{ borderRadius: 1 }}
+ >
+
+
+
+
+ );
+ })}
+
+ );
+
+ return (
+
+
+
+
+
+
+ {renderVideo}
+
+ {renderList}
+
+
+ );
+}
+
+ElearningCourseDetailsLessonsDialog.propTypes = {
+ lessons: PropTypes.array,
+ onClose: PropTypes.func,
+ onEnded: PropTypes.func,
+ onPause: PropTypes.func,
+ onPlay: PropTypes.func,
+ onReady: PropTypes.func,
+ onSelectedLesson: PropTypes.func,
+ open: PropTypes.bool,
+ playing: PropTypes.bool,
+ selectedLesson: PropTypes.object,
+};
diff --git a/template/src/sections/_elearning/details/elearning-course-details-summary.jsx b/template/src/sections/_elearning/details/elearning-course-details-summary.jsx
new file mode 100644
index 0000000..afb1bc3
--- /dev/null
+++ b/template/src/sections/_elearning/details/elearning-course-details-summary.jsx
@@ -0,0 +1,78 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Chip from '@mui/material/Chip';
+import Stack from '@mui/material/Stack';
+import { alpha } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+
+import ElearningCourseDetailsLessonList from './elearning-course-details-lesson-list';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseDetailsSummary({ course }) {
+ return (
+
+
+
+
+ What You Will Learn
+
+
+ {course.learnList?.map((learn) => (
+
+ alpha(theme?.palette?.primary?.main, 0.08),
+ }}
+ >
+
+
+ {learn}
+
+ ))}
+
+
+
+
+ Skills You Will Gain
+
+
+ {course.skills?.map((skill) => (
+ {}} />
+ ))}
+
+
+
+
+ Overview
+
+
+ Consentaneum aeternitate dignitati commoventur primisque cupit mea officia peccata parens
+ egone dolorem minuis. Secundae neglegi sextilius conantur commodaita siti philosophi ioca
+ tenere lorem apparet assentior pudoris sint leves neglegebat unde reliquisti simile.
+
+
+
+ );
+}
+
+ElearningCourseDetailsSummary.propTypes = {
+ course: PropTypes.shape({
+ learnList: PropTypes.array,
+ lessons: PropTypes.array,
+ skills: PropTypes.array,
+ }),
+};
diff --git a/template/src/sections/_elearning/details/elearning-course-details-teachers-info.jsx b/template/src/sections/_elearning/details/elearning-course-details-teachers-info.jsx
new file mode 100644
index 0000000..f7c0c1b
--- /dev/null
+++ b/template/src/sections/_elearning/details/elearning-course-details-teachers-info.jsx
@@ -0,0 +1,115 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Avatar from '@mui/material/Avatar';
+import Typography from '@mui/material/Typography';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseDetailsTeachersInfo({ teachers = [] }) {
+ return (
+ <>
+
+ Instructors ({teachers.length})
+
+
+
+ {teachers.map((teacher) => (
+
+ ))}
+
+ >
+ );
+}
+
+ElearningCourseDetailsTeachersInfo.propTypes = {
+ teachers: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function TeacherItem({ teacher }) {
+ return (
+
+
+
+
+
+
+ {teacher.name}
+
+ {teacher.role}
+
+
+
+
+
+
+ {Number.isInteger(teacher.ratingNumber)
+ ? `${teacher.ratingNumber}.0`
+ : teacher.ratingNumber}
+
+
+ {teacher.totalReviews && (
+
+ ({fShortenNumber(teacher.totalReviews)} reviews)
+
+ )}
+
+
+
+
+
+ {fShortenNumber(teacher.totalStudents)}
+
+ Students
+
+
+
+
+
+ {teacher.totalCourses}
+
+ Lessons
+
+
+
+
+ );
+}
+
+TeacherItem.propTypes = {
+ teacher: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ role: PropTypes.string,
+ totalCourses: PropTypes.number,
+ ratingNumber: PropTypes.number,
+ totalReviews: PropTypes.number,
+ totalStudents: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_elearning/elearning-download-app.jsx b/template/src/sections/_elearning/elearning-download-app.jsx
new file mode 100644
index 0000000..d5e1c6f
--- /dev/null
+++ b/template/src/sections/_elearning/elearning-download-app.jsx
@@ -0,0 +1,119 @@
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, styled } from '@mui/material/styles';
+import Button, { buttonClasses } from '@mui/material/Button';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import SvgColor from 'src/components/svg-color';
+
+// ----------------------------------------------------------------------
+
+const StyledAppStoreButton = styled(Button)(({ theme }) => ({
+ flexShrink: 0,
+ padding: '5px 12px',
+ color: theme.palette.common.white,
+ border: `solid 1px ${alpha(theme.palette.common.black, 0.24)}`,
+ background: `linear-gradient(180deg, ${theme.palette.grey[900]} 0%, ${theme.palette.common.black} 100%)`,
+ [`& .${buttonClasses.startIcon}`]: {
+ marginLeft: 0,
+ },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function ElearningDownloadApp() {
+ return (
+
+
+
+
+ Download App
+
+
+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+ Phasellus leo dolor, tempus non, auctor et, hendrerit quis, nisi.
+
+
+
+ `solid 1px ${theme.palette.divider}`,
+ }}
+ >
+
+
+
+ Scan QR code to
+ install on your device
+
+
+
+
+
+
+
+
+
+
+
+ `drop-shadow(0 48px 80px ${alpha(theme.palette.common.black, 0.24)})`,
+ }}
+ />
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function AppStoreButton({ ...other }) {
+ return (
+
+ }>
+
+
+ Download on the
+
+
+
+ Apple Store
+
+
+
+
+ }>
+
+
+ Download from
+
+
+
+ Google Play
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/elearning-newsletter.jsx b/template/src/sections/_elearning/elearning-newsletter.jsx
new file mode 100644
index 0000000..7ff2c05
--- /dev/null
+++ b/template/src/sections/_elearning/elearning-newsletter.jsx
@@ -0,0 +1,74 @@
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+import InputBase, { inputBaseClasses } from '@mui/material/InputBase';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningNewsletter() {
+ return (
+
+
+
+
+ Register Now Forget 20% Discount Every Courses
+
+
+ Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus. Sed magna purus,
+ fermentum eu
+
+
+
+
+ Register
+
+
+ }
+ sx={{
+ pr: 0.5,
+ pl: 1.5,
+ height: 56,
+ maxWidth: 560,
+ borderRadius: 1,
+ bgcolor: 'common.white',
+ transition: (theme) => theme.transitions.create(['box-shadow']),
+ [`&.${inputBaseClasses.focused}`]: {
+ boxShadow: (theme) => theme.customShadows.z4,
+ },
+ }}
+ />
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/elearning-our-clients.jsx b/template/src/sections/_elearning/elearning-our-clients.jsx
new file mode 100644
index 0000000..63f6ada
--- /dev/null
+++ b/template/src/sections/_elearning/elearning-our-clients.jsx
@@ -0,0 +1,67 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import { useTheme } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import SvgColor from 'src/components/svg-color';
+import Carousel, { useCarousel } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningOurClients({ brands }) {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ slidesToShow: 6,
+ slidesToScroll: 1,
+ autoplay: true,
+ speed: 5000,
+ autoplaySpeed: 5000,
+ cssEase: 'linear',
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 4 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 2 },
+ },
+ ],
+ });
+
+ return (
+
+
+ We Work With
+
+
+ Quisque aliquet, libero consequat elementum convallis.
+
+
+
+
+ {brands.map((brand) => (
+
+ ))}
+
+
+ );
+}
+
+ElearningOurClients.propTypes = {
+ brands: PropTypes.array,
+};
diff --git a/template/src/sections/_elearning/filters/elearning-filters.jsx b/template/src/sections/_elearning/filters/elearning-filters.jsx
new file mode 100644
index 0000000..3396c93
--- /dev/null
+++ b/template/src/sections/_elearning/filters/elearning-filters.jsx
@@ -0,0 +1,208 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Drawer from '@mui/material/Drawer';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import FilterFee from './filter-fee';
+import FilterLevel from './filter-level';
+import FilterRating from './filter-rating';
+import FilterLanguage from './filter-language';
+import FilterDuration from './filter-duration';
+import FilterCategories from './filter-categories';
+
+// ----------------------------------------------------------------------
+
+const defaultValues = {
+ filterDuration: [],
+ filterCategories: [],
+ filterRating: null,
+ filterFee: [],
+ filterLevel: [],
+ filterLanguage: [],
+};
+
+export default function ElearningFilters({ open, onClose }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const [filters, setFilters] = useState(defaultValues);
+
+ const handleChangeRating = useCallback(
+ (event) => {
+ setFilters({
+ ...filters,
+ filterRating: event.target.value,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeCategory = useCallback(
+ (newValue) => {
+ setFilters({
+ ...filters,
+ filterCategories: newValue,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeLevel = useCallback(
+ (event) => {
+ const {
+ target: { value },
+ } = event;
+ setFilters({
+ ...filters,
+ filterLevel: typeof value === 'string' ? value.split(',') : value,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeFee = useCallback(
+ (event) => {
+ const {
+ target: { value },
+ } = event;
+ setFilters({
+ ...filters,
+ filterFee: typeof value === 'string' ? value.split(',') : value,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeDuration = useCallback(
+ (event) => {
+ const {
+ target: { value },
+ } = event;
+ setFilters({
+ ...filters,
+ filterDuration: typeof value === 'string' ? value.split(',') : value,
+ });
+ },
+ [filters]
+ );
+
+ const handleChangeLanguage = useCallback(
+ (newValue) => {
+ setFilters({
+ ...filters,
+ filterLanguage: newValue,
+ });
+ },
+ [filters]
+ );
+
+ const renderContent = (
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ return (
+ <>
+ {mdUp ? (
+ renderContent
+ ) : (
+
+ {renderContent}
+
+ )}
+ >
+ );
+}
+
+ElearningFilters.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+};
+
+// ----------------------------------------------------------------------
+
+function Block({ title, children }) {
+ return (
+
+
+ {title}
+
+
+ {children}
+
+ );
+}
+
+Block.propTypes = {
+ children: PropTypes.node,
+ title: PropTypes.string,
+};
diff --git a/template/src/sections/_elearning/filters/filter-categories.jsx b/template/src/sections/_elearning/filters/filter-categories.jsx
new file mode 100644
index 0000000..12bce9b
--- /dev/null
+++ b/template/src/sections/_elearning/filters/filter-categories.jsx
@@ -0,0 +1,72 @@
+import PropTypes from 'prop-types';
+
+import Chip from '@mui/material/Chip';
+import TextField from '@mui/material/TextField';
+import Checkbox, { checkboxClasses } from '@mui/material/Checkbox';
+import Autocomplete, { autocompleteClasses } from '@mui/material/Autocomplete';
+
+import { _tags } from 'src/_mock';
+
+// ----------------------------------------------------------------------
+
+export default function FilterCategories({ filterCategories, onChangeCategory }) {
+ return (
+ option}
+ value={filterCategories}
+ onChange={(event, value) => onChangeCategory(value)}
+ slotProps={{
+ paper: {
+ sx: {
+ [`& .${autocompleteClasses.listbox}`]: {
+ [`& .${autocompleteClasses.option}`]: {
+ [`& .${checkboxClasses.root}`]: {
+ p: 0,
+ mr: 1,
+ },
+ },
+ },
+ },
+ },
+ }}
+ renderInput={(params) => (
+
+ )}
+ renderOption={(props, option, { selected }) => (
+
+
+ {option}
+
+ )}
+ renderTags={(selected, getTagProps) =>
+ selected.map((option, index) => (
+
+ ))
+ }
+ />
+ );
+}
+
+FilterCategories.propTypes = {
+ filterCategories: PropTypes.arrayOf(PropTypes.string),
+ onChangeCategory: PropTypes.func,
+};
diff --git a/template/src/sections/_elearning/filters/filter-duration.jsx b/template/src/sections/_elearning/filters/filter-duration.jsx
new file mode 100644
index 0000000..6d2ac50
--- /dev/null
+++ b/template/src/sections/_elearning/filters/filter-duration.jsx
@@ -0,0 +1,61 @@
+import PropTypes from 'prop-types';
+
+import Select from '@mui/material/Select';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+import Checkbox, { checkboxClasses } from '@mui/material/Checkbox';
+
+// ----------------------------------------------------------------------
+
+const DURATIONS = ['0 - 1 Hour', '1 - 3 Hours', '3 - 6 Hours', '6 - 18 Hours', '18+ Hours'];
+
+// ----------------------------------------------------------------------
+
+export default function FilterDuration({ filterDuration, onChangeDuration }) {
+ return (
+
+ {
+ if (!selected.length) {
+ return (
+
+ All Duration
+
+ );
+ }
+ return (
+
+ {selected.join(', ')}
+
+ );
+ }}
+ >
+ {DURATIONS.map((duration) => (
+
+
+ {duration}
+
+ ))}
+
+
+ );
+}
+
+FilterDuration.propTypes = {
+ filterDuration: PropTypes.arrayOf(PropTypes.string),
+ onChangeDuration: PropTypes.func,
+};
diff --git a/template/src/sections/_elearning/filters/filter-fee.jsx b/template/src/sections/_elearning/filters/filter-fee.jsx
new file mode 100644
index 0000000..38f2bb2
--- /dev/null
+++ b/template/src/sections/_elearning/filters/filter-fee.jsx
@@ -0,0 +1,61 @@
+import PropTypes from 'prop-types';
+
+import Select from '@mui/material/Select';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+import Checkbox, { checkboxClasses } from '@mui/material/Checkbox';
+
+// ----------------------------------------------------------------------
+
+const FEES = ['Free', 'Paid'];
+
+// ----------------------------------------------------------------------
+
+export default function FilterFee({ filterFee, onChangeFee }) {
+ return (
+
+ {
+ if (!selected.length) {
+ return (
+
+ All Fee
+
+ );
+ }
+ return (
+
+ {selected.join(', ')}
+
+ );
+ }}
+ >
+ {FEES.map((type) => (
+
+
+ {type}
+
+ ))}
+
+
+ );
+}
+
+FilterFee.propTypes = {
+ filterFee: PropTypes.arrayOf(PropTypes.string),
+ onChangeFee: PropTypes.func,
+};
diff --git a/template/src/sections/_elearning/filters/filter-language.jsx b/template/src/sections/_elearning/filters/filter-language.jsx
new file mode 100644
index 0000000..b1ab9ef
--- /dev/null
+++ b/template/src/sections/_elearning/filters/filter-language.jsx
@@ -0,0 +1,79 @@
+import PropTypes from 'prop-types';
+
+import Chip from '@mui/material/Chip';
+import TextField from '@mui/material/TextField';
+import Checkbox, { checkboxClasses } from '@mui/material/Checkbox';
+import Autocomplete, { autocompleteClasses } from '@mui/material/Autocomplete';
+
+import { countries } from 'src/assets/data';
+
+// ----------------------------------------------------------------------
+
+export default function FilterLanguage({ filterLanguage, onChangeLanguage }) {
+ return (
+ option.label}
+ value={filterLanguage}
+ onChange={(event, value) => onChangeLanguage(value)}
+ slotProps={{
+ paper: {
+ sx: {
+ [`& .${autocompleteClasses.listbox}`]: {
+ [`& .${autocompleteClasses.option}`]: {
+ [`& .${checkboxClasses.root}`]: {
+ p: 0,
+ mr: 1,
+ },
+ },
+ },
+ },
+ },
+ }}
+ renderInput={(params) => (
+
+ )}
+ renderOption={(props, option, { selected }) => {
+ if (!option.label) {
+ return null;
+ }
+
+ return (
+
+
+ {option.label}
+
+ );
+ }}
+ renderTags={(selected, getTagProps) =>
+ selected.map((option, index) => (
+
+ ))
+ }
+ />
+ );
+}
+
+FilterLanguage.propTypes = {
+ filterLanguage: PropTypes.array,
+ onChangeLanguage: PropTypes.func,
+};
diff --git a/template/src/sections/_elearning/filters/filter-level.jsx b/template/src/sections/_elearning/filters/filter-level.jsx
new file mode 100644
index 0000000..bb30ae3
--- /dev/null
+++ b/template/src/sections/_elearning/filters/filter-level.jsx
@@ -0,0 +1,61 @@
+import PropTypes from 'prop-types';
+
+import Select from '@mui/material/Select';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+import Checkbox, { checkboxClasses } from '@mui/material/Checkbox';
+
+// ----------------------------------------------------------------------
+
+const LEVELS = ['Beginner', 'Intermediate', 'Expert'];
+
+// ----------------------------------------------------------------------
+
+export default function FilterLevel({ filterLevel, onChangeLevel }) {
+ return (
+
+ {
+ if (!selected.length) {
+ return (
+
+ All levels
+
+ );
+ }
+ return (
+
+ {selected.join(', ')}
+
+ );
+ }}
+ >
+ {LEVELS.map((level) => (
+
+
+ {level}
+
+ ))}
+
+
+ );
+}
+
+FilterLevel.propTypes = {
+ filterLevel: PropTypes.arrayOf(PropTypes.string),
+ onChangeLevel: PropTypes.func,
+};
diff --git a/template/src/sections/_elearning/filters/filter-rating.jsx b/template/src/sections/_elearning/filters/filter-rating.jsx
new file mode 100644
index 0000000..18f3400
--- /dev/null
+++ b/template/src/sections/_elearning/filters/filter-rating.jsx
@@ -0,0 +1,60 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Radio from '@mui/material/Radio';
+import Rating from '@mui/material/Rating';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+// ----------------------------------------------------------------------
+
+const RATINGS = ['up_4_stars', 'up_3_stars', 'up_2_stars'];
+
+export default function FilterRating({ filterRating, onChangeRating }) {
+ return (
+
+
+ {RATINGS.map((rating) => (
+ }
+ label={
+
+
+ & Up
+
+ }
+ sx={{
+ m: 0,
+ '&:hover': { opacity: 0.48 },
+ }}
+ />
+ ))}
+
+
+ );
+}
+
+FilterRating.propTypes = {
+ filterRating: PropTypes.string,
+ onChangeRating: PropTypes.func,
+};
diff --git a/template/src/sections/_elearning/landing/elearning-landing-categories.jsx b/template/src/sections/_elearning/landing/elearning-landing-categories.jsx
new file mode 100644
index 0000000..d327121
--- /dev/null
+++ b/template/src/sections/_elearning/landing/elearning-landing-categories.jsx
@@ -0,0 +1,116 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningLandingCategories({ categories }) {
+ return (
+
+
+
+
+ Featured Category
+
+
+ Since wire-frame renderings are relatively simple and fast to calculate, they are
+ often used in cases
+
+
+ }
+ >
+ Explore more
+
+
+
+
+
+ {categories.map((category) => (
+
+ ))}
+
+
+
+
+
+ );
+}
+
+ElearningLandingCategories.propTypes = {
+ categories: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function CategoryItem({ category }) {
+ return (
+
+ theme.transitions.create('all', {
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ '&:hover': {
+ bgcolor: 'background.paper',
+ boxShadow: (theme) => theme.customShadows.z24,
+ h6: {
+ color: 'primary.main',
+ },
+ },
+ }}
+ >
+
+ {category.name}
+
+
+
+ {category.totalStudents} students
+
+
+ );
+}
+
+CategoryItem.propTypes = {
+ category: PropTypes.shape({
+ name: PropTypes.string,
+ totalStudents: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_elearning/landing/elearning-landing-featured-courses.jsx b/template/src/sections/_elearning/landing/elearning-landing-featured-courses.jsx
new file mode 100644
index 0000000..ae7c307
--- /dev/null
+++ b/template/src/sections/_elearning/landing/elearning-landing-featured-courses.jsx
@@ -0,0 +1,113 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+import ElearningCourseItem from '../list/elearning-course-item';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningLandingFeaturedCourses({ courses }) {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ slidesToShow: 3,
+ slidesToScroll: 1,
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.lg,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 1 },
+ },
+ ],
+ });
+
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+ Featured Courses
+
+ Nullam accumsan lorem in dui. Praesent ac massa at ligula laoreet iaculis.
+
+
+
+ {mdUp && }
+
+
+
+
+
+ {courses.map((course) => (
+
+
+
+ ))}
+
+
+
+
+ );
+}
+
+ElearningLandingFeaturedCourses.propTypes = {
+ courses: PropTypes.array,
+};
diff --git a/template/src/sections/_elearning/landing/elearning-landing-hero.jsx b/template/src/sections/_elearning/landing/elearning-landing-hero.jsx
new file mode 100644
index 0000000..6641d4a
--- /dev/null
+++ b/template/src/sections/_elearning/landing/elearning-landing-hero.jsx
@@ -0,0 +1,138 @@
+import Box from '@mui/material/Box';
+import Fab from '@mui/material/Fab';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import { _mock } from 'src/_mock';
+import { bgGradient } from 'src/theme/css';
+import ElearningHeroIllustration from 'src/assets/illustrations/elearning-hero-illustration';
+
+import Iconify from 'src/components/iconify';
+import { PlayerDialog } from 'src/components/player';
+
+// ----------------------------------------------------------------------
+
+const SUMMARY = [
+ { value: 14000, label: 'Learners', color: 'warning' },
+ { value: 1050, label: 'Courses', color: 'error' },
+ { value: 59000, label: 'Graduates', color: 'success' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function ElearningLandingHero() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const videoOpen = useBoolean();
+
+ return (
+ <>
+
+
+
+
+
+
+ Free
+
+ {` Online `}
+
+
+ {` Courses `}
+
+ From The Experts
+
+
+
+ Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis
+ venenatis ante odio sit amet eros.
+
+
+
+
+ Ready Start
+
+
+
+
+
+
+ Watch Video
+
+
+
+
+
+
+ {SUMMARY.map((item) => (
+
+
+ {fShortenNumber(item.value)}+
+
+ {item.label}
+
+
+ ))}
+
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_elearning/landing/elearning-landing-introduce.jsx b/template/src/sections/_elearning/landing/elearning-landing-introduce.jsx
new file mode 100644
index 0000000..19ec495
--- /dev/null
+++ b/template/src/sections/_elearning/landing/elearning-landing-introduce.jsx
@@ -0,0 +1,84 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningLandingIntroduce() {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+ Nullam accumsan lorem in dui.
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+ Phasellus gravida semper nisi. Vestibulum rutrum
+
+
+
+ Curabitur a felis in nunc fringilla tristique. Fusce egestas elit eget lorem. Etiam
+ vitae tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
+ inceptos hymenaeos.
+
+
+
+
+
+
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis
+
+
+
+
+
+
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/list/elearning-course-item-skeleton.jsx b/template/src/sections/_elearning/list/elearning-course-item-skeleton.jsx
new file mode 100644
index 0000000..dbc1478
--- /dev/null
+++ b/template/src/sections/_elearning/list/elearning-course-item-skeleton.jsx
@@ -0,0 +1,74 @@
+import PropTypes from 'prop-types';
+
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Skeleton from '@mui/material/Skeleton';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseItemSkeleton({ vertical, ...other }) {
+ const smUp = useResponsive('up', 'sm');
+
+ const verticalStyle = vertical || !smUp;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ {[...Array(3)].map((_, index) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+ElearningCourseItemSkeleton.propTypes = {
+ vertical: PropTypes.string,
+};
diff --git a/template/src/sections/_elearning/list/elearning-course-item.jsx b/template/src/sections/_elearning/list/elearning-course-item.jsx
new file mode 100644
index 0000000..5078a31
--- /dev/null
+++ b/template/src/sections/_elearning/list/elearning-course-item.jsx
@@ -0,0 +1,228 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fCurrency, fShortenNumber } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseItem({ course, vertical }) {
+ const {
+ slug,
+ level,
+ price,
+ teachers,
+ coverUrl,
+ category,
+ priceSale,
+ bestSeller,
+ totalHours,
+ description,
+ ratingNumber,
+ totalReviews,
+ totalStudents,
+ } = course;
+
+ return (
+ theme.customShadows.z24,
+ },
+ ...(vertical && {
+ flexDirection: 'column',
+ }),
+ }}
+ >
+
+
+
+
+ {bestSeller && (
+
+ Best Seller
+
+ )}
+
+
+
+
+
+ {category}
+
+
+
+ {priceSale > 0 && (
+
+ {fCurrency(priceSale)}
+
+ )}
+ {fCurrency(price)}
+
+
+
+
+
+
+ {slug}
+
+
+
+
+ {description}
+
+
+
+
+ }
+ >
+
+
+
+ {Number.isInteger(ratingNumber) ? `${ratingNumber}.0` : ratingNumber}
+
+
+ {totalReviews && (
+
+ ({fShortenNumber(totalReviews)} reviews)
+
+ )}
+
+
+
+ {fShortenNumber(totalStudents)}
+
+ students
+
+
+
+
+
+
+
+
+ {teachers[0]?.name}
+
+
+ {teachers?.length > 0 && (
+
+ + {teachers?.length} teachers
+
+ )}
+
+
+
+
+ *:not(:last-child)': { mr: 2.5 } }}
+ >
+
+ {`${totalHours} hours`}
+
+
+
+
+ {level}
+
+
+
+
+ );
+}
+
+ElearningCourseItem.propTypes = {
+ course: PropTypes.shape({
+ slug: PropTypes.string,
+ level: PropTypes.string,
+ price: PropTypes.number,
+ teachers: PropTypes.array,
+ bestSeller: PropTypes.bool,
+ category: PropTypes.string,
+ coverUrl: PropTypes.string,
+ priceSale: PropTypes.number,
+ totalHours: PropTypes.number,
+ description: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ totalReviews: PropTypes.number,
+ totalStudents: PropTypes.number,
+ }),
+ vertical: PropTypes.bool,
+};
diff --git a/template/src/sections/_elearning/list/elearning-course-list-similar.jsx b/template/src/sections/_elearning/list/elearning-course-list-similar.jsx
new file mode 100644
index 0000000..501be3c
--- /dev/null
+++ b/template/src/sections/_elearning/list/elearning-course-list-similar.jsx
@@ -0,0 +1,83 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import ElearningCourseItem from './elearning-course-item';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseListSimilar({ courses }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const viewAllBtn = (
+ }
+ >
+ View All
+
+ );
+
+ return (
+
+
+
+ Similar Courses
+
+ {mdUp && viewAllBtn}
+
+
+
+ {courses.map((course) => (
+
+ ))}
+
+
+ {!mdUp && (
+
+ {viewAllBtn}
+
+ )}
+
+
+ );
+}
+
+ElearningCourseListSimilar.propTypes = {
+ courses: PropTypes.array,
+};
diff --git a/template/src/sections/_elearning/list/elearning-course-list.jsx b/template/src/sections/_elearning/list/elearning-course-list.jsx
new file mode 100644
index 0000000..62905b2
--- /dev/null
+++ b/template/src/sections/_elearning/list/elearning-course-list.jsx
@@ -0,0 +1,41 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import ElearningCourseItem from './elearning-course-item';
+import ElearningCourseItemSkeleton from './elearning-course-item-skeleton';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCourseList({ courses, loading }) {
+ return (
+ <>
+
+ {(loading ? [...Array(9)] : courses).map((course, index) =>
+ course ? (
+
+ ) : (
+
+ )
+ )}
+
+
+
+ >
+ );
+}
+
+ElearningCourseList.propTypes = {
+ courses: PropTypes.array,
+ loading: PropTypes.bool,
+};
diff --git a/template/src/sections/_elearning/team/elearning-team-about.jsx b/template/src/sections/_elearning/team/elearning-team-about.jsx
new file mode 100644
index 0000000..fde6f87
--- /dev/null
+++ b/template/src/sections/_elearning/team/elearning-team-about.jsx
@@ -0,0 +1,46 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import ElearningTeamItem from './elearning-team-item';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningTeamAbout({ members }) {
+ return (
+
+
+ Our Teachers
+
+
+
+ {members.map((member) => (
+
+ ))}
+
+
+ );
+}
+
+ElearningTeamAbout.propTypes = {
+ members: PropTypes.array,
+};
diff --git a/template/src/sections/_elearning/team/elearning-team-item.jsx b/template/src/sections/_elearning/team/elearning-team-item.jsx
new file mode 100644
index 0000000..88984c8
--- /dev/null
+++ b/template/src/sections/_elearning/team/elearning-team-item.jsx
@@ -0,0 +1,102 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import { alpha, styled } from '@mui/material/styles';
+
+import { _socials } from 'src/_mock';
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const StyledOverlay = styled('div')(({ theme }) => ({
+ ...bgGradient({
+ startColor: `${alpha(theme.palette.common.black, 0)} 0%`,
+ endColor: `${theme.palette.common.black} 75%`,
+ }),
+ top: 0,
+ left: 0,
+ zIndex: 8,
+ opacity: 0,
+ width: '100%',
+ height: '100%',
+ position: 'absolute',
+ transition: theme.transitions.create('opacity', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.short,
+ }),
+ '&:hover': { opacity: 1 },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function ElearningTeamItem({ member }) {
+ const { name, role, photo } = member;
+
+ return (
+
+
+ {name}
+
+
+ {role}
+
+
+
+
+
+
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+
+
+ );
+}
+
+ElearningTeamItem.propTypes = {
+ member: PropTypes.shape({
+ name: PropTypes.string,
+ photo: PropTypes.string,
+ role: PropTypes.string,
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+function Shape() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_elearning/team/elearning-team.jsx b/template/src/sections/_elearning/team/elearning-team.jsx
new file mode 100644
index 0000000..65e2f44
--- /dev/null
+++ b/template/src/sections/_elearning/team/elearning-team.jsx
@@ -0,0 +1,57 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import ElearningTeamItem from './elearning-team-item';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningTeam({ members }) {
+ return (
+
+
+ Meet Our Teachers
+
+
+ Since wire-frame renderings are relatively simple and fast to calculate, they are often
+ used in cases
+
+
+
+
+ {members.map((member) => (
+
+ ))}
+
+
+
+
+ View All Teachers
+
+
+
+ );
+}
+
+ElearningTeam.propTypes = {
+ members: PropTypes.array,
+};
diff --git a/template/src/sections/_elearning/testimonial/elearning-testimonial.jsx b/template/src/sections/_elearning/testimonial/elearning-testimonial.jsx
new file mode 100644
index 0000000..a9f6421
--- /dev/null
+++ b/template/src/sections/_elearning/testimonial/elearning-testimonial.jsx
@@ -0,0 +1,125 @@
+import { useEffect } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+import { TestimonialItemContent, TestimonialItemThumbnail } from './testimonial-item';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningTestimonial({ testimonials }) {
+ const theme = useTheme();
+
+ const carouselLarge = useCarousel({
+ slidesToShow: 1,
+ draggable: false,
+ slidesToScroll: 1,
+ adaptiveHeight: true,
+ });
+
+ const carouselThumb = useCarousel({
+ autoplay: true,
+ slidesToShow: 5,
+ centerMode: true,
+ swipeToSlide: true,
+ autoplaySpeed: 3000,
+ focusOnSelect: true,
+ centerPadding: '0px',
+ rtl: Boolean(theme.direction === 'rtl'),
+
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: {
+ slidesToShow: 3,
+ },
+ },
+ ],
+ });
+
+ useEffect(() => {
+ carouselLarge.onSetNav();
+ carouselThumb.onSetNav();
+ }, [carouselLarge, carouselThumb]);
+
+ return (
+
+
+
+
+
+ What Our Customer Say
+
+
+
+
+ {testimonials.map((testimonial) => (
+
+ ))}
+
+
+
+
+ {testimonials.map((testimonial, index) => (
+
+ ))}
+
+
+
+
+ {testimonials.map(
+ (testimonial, index) =>
+ carouselLarge.currentIndex === index && (
+
+ {testimonial.name}
+
+ {testimonial.role}
+
+
+ )
+ )}
+
+
+
+
+ );
+}
+
+ElearningTestimonial.propTypes = {
+ testimonials: PropTypes.array,
+};
diff --git a/template/src/sections/_elearning/testimonial/testimonial-item.jsx b/template/src/sections/_elearning/testimonial/testimonial-item.jsx
new file mode 100644
index 0000000..a91e975
--- /dev/null
+++ b/template/src/sections/_elearning/testimonial/testimonial-item.jsx
@@ -0,0 +1,77 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export function TestimonialItemContent({ testimonial }) {
+ const { review } = testimonial;
+
+ return (
+
+
+
+ theme.typography.h1.fontFamily,
+ }}
+ >
+ {review}
+
+
+ );
+}
+
+TestimonialItemContent.propTypes = {
+ testimonial: PropTypes.shape({
+ review: PropTypes.string,
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+export function TestimonialItemThumbnail({ testimonial, selected }) {
+ return (
+
+ theme.transitions.create('all'),
+ ...(selected && {
+ opacity: 1,
+ transform: 'scale(2)',
+ }),
+ }}
+ />
+
+ );
+}
+
+TestimonialItemThumbnail.propTypes = {
+ selected: PropTypes.bool,
+ testimonial: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_elearning/view/elearning-about-view.jsx b/template/src/sections/_elearning/view/elearning-about-view.jsx
new file mode 100644
index 0000000..af8e73e
--- /dev/null
+++ b/template/src/sections/_elearning/view/elearning-about-view.jsx
@@ -0,0 +1,34 @@
+import { _members, _coursePosts, _brandsColor, _testimonials } from 'src/_mock';
+
+import ElearningAbout from '../about/elearning-about';
+import ElearningNewsletter from '../elearning-newsletter';
+import ElearningOurClients from '../elearning-our-clients';
+import TeamElearningAbout from '../team/elearning-team-about';
+import ElearningAboutHero from '../about/elearning-about-hero';
+import ElearningTestimonial from '../testimonial/elearning-testimonial';
+import ElearningAboutCoreValues from '../about/elearning-about-core-values';
+import ElearningLatestPosts from '../../blog/elearning/elearning-latest-posts';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningAboutView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_elearning/view/elearning-contact-view.jsx b/template/src/sections/_elearning/view/elearning-contact-view.jsx
new file mode 100644
index 0000000..3301bca
--- /dev/null
+++ b/template/src/sections/_elearning/view/elearning-contact-view.jsx
@@ -0,0 +1,17 @@
+import ElearningNewsletter from '../elearning-newsletter';
+import ElearningContactInfo from '../contact/elearning-contact-info';
+import ElearningContactForm from '../contact/elearning-contact-form';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningContactView() {
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_elearning/view/elearning-course-view.jsx b/template/src/sections/_elearning/view/elearning-course-view.jsx
new file mode 100644
index 0000000..954782b
--- /dev/null
+++ b/template/src/sections/_elearning/view/elearning-course-view.jsx
@@ -0,0 +1,132 @@
+import { useEffect } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _mock, _socials, _courses } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+import { SplashScreen } from 'src/components/loading-screen';
+
+import Advertisement from '../../advertisement';
+import ElearningNewsletter from '../elearning-newsletter';
+import ReviewElearning from '../../review/elearning/review-elearning';
+import ElearningCourseListSimilar from '../list/elearning-course-list-similar';
+import ElearningCourseDetailsHero from '../details/elearning-course-details-hero';
+import ElearningCourseDetailsInfo from '../details/elearning-course-details-info';
+import ElearningCourseDetailsSummary from '../details/elearning-course-details-summary';
+import ElearningCourseDetailsTeachersInfo from '../details/elearning-course-details-teachers-info';
+
+// ----------------------------------------------------------------------
+
+const _mockCourse = _courses[0];
+
+export default function ElearningCourseView() {
+ const mdUp = useResponsive('up', 'md');
+
+ const loading = useBoolean(true);
+
+ const courseSimilar = _courses.slice(-3);
+
+ useEffect(() => {
+ const fakeLoading = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ loading.onFalse();
+ };
+ fakeLoading();
+ }, [loading]);
+
+ if (loading.value) {
+ return ;
+ }
+
+ return (
+ <>
+
+
+
+
+ {!mdUp && (
+
+
+
+ )}
+
+
+
+
+
+
+ Share:
+
+
+
+ {_socials.map((social) => (
+ }
+ sx={{
+ m: 0.5,
+ flexShrink: 0,
+ color: social.color,
+ borderColor: social.color,
+ '&:hover': {
+ borderColor: social.color,
+ bgcolor: alpha(social.color, 0.08),
+ },
+ }}
+ >
+ {social.label}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ {mdUp && }
+
+
+
+
+
+
+
+ {mdUp && }
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_elearning/view/elearning-courses-view.jsx b/template/src/sections/_elearning/view/elearning-courses-view.jsx
new file mode 100644
index 0000000..e2ab8f0
--- /dev/null
+++ b/template/src/sections/_elearning/view/elearning-courses-view.jsx
@@ -0,0 +1,78 @@
+import { useEffect } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _courses } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import ElearningNewsletter from '../elearning-newsletter';
+import ElearningFilters from '../filters/elearning-filters';
+import ElearningCourseList from '../list/elearning-course-list';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningCoursesView() {
+ const mobileOpen = useBoolean();
+
+ const loading = useBoolean(true);
+
+ useEffect(() => {
+ const fakeLoading = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ loading.onFalse();
+ };
+ fakeLoading();
+ }, [loading]);
+
+ return (
+ <>
+
+
+ Courses
+
+ }
+ onClick={mobileOpen.onTrue}
+ sx={{
+ display: { md: 'none' },
+ }}
+ >
+ Filters
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_elearning/view/elearning-landing-view.jsx b/template/src/sections/_elearning/view/elearning-landing-view.jsx
new file mode 100644
index 0000000..781349e
--- /dev/null
+++ b/template/src/sections/_elearning/view/elearning-landing-view.jsx
@@ -0,0 +1,47 @@
+import {
+ _courses,
+ _members,
+ _coursePosts,
+ _brandsColor,
+ _testimonials,
+ _coursesByCategories,
+} from 'src/_mock';
+
+import ElearningTeam from '../team/elearning-team';
+import ElearningNewsletter from '../elearning-newsletter';
+import ElearningOurClients from '../elearning-our-clients';
+import ElearningDownloadApp from '../elearning-download-app';
+import ElearningLandingHero from '../landing/elearning-landing-hero';
+import ElearningTestimonial from '../testimonial/elearning-testimonial';
+import ElearningLandingIntroduce from '../landing/elearning-landing-introduce';
+import ElearningLatestPosts from '../../blog/elearning/elearning-latest-posts';
+import ElearningLandingCategories from '../landing/elearning-landing-categories';
+import ElearningLandingFeaturedCourses from '../landing/elearning-landing-featured-courses';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningLandingView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_elearning/view/elearning-post-view.jsx b/template/src/sections/_elearning/view/elearning-post-view.jsx
new file mode 100644
index 0000000..cbdf697
--- /dev/null
+++ b/template/src/sections/_elearning/view/elearning-post-view.jsx
@@ -0,0 +1,195 @@
+import { useState, useCallback } from 'react';
+
+import Fab from '@mui/material/Fab';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Divider from '@mui/material/Divider';
+import Popover from '@mui/material/Popover';
+import MenuItem from '@mui/material/MenuItem';
+import Checkbox from '@mui/material/Checkbox';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fDate } from 'src/utils/format-time';
+
+import { _socials, _coursePosts } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import Markdown from 'src/components/markdown';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import PostTags from '../../blog/common/post-tags';
+import PostAuthor from '../../blog/common/post-author';
+import ElearningNewsletter from '../elearning-newsletter';
+import PostPrevAndNext from '../../blog/common/post-prev-and-next';
+import PostSocialsShare from '../../blog/common/post-socials-share';
+import ElearningLatestPosts from '../../blog/elearning/elearning-latest-posts';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningPostView() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const { title, description, duration, createdAt, author, favorited, heroUrl, tags, content } =
+ _coursePosts[0];
+
+ const [favorite, setFavorite] = useState(favorited);
+
+ const [open, setOpen] = useState(null);
+
+ const handleOpen = useCallback((event) => {
+ setOpen(event.currentTarget);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(null);
+ }, []);
+
+ const handleChangeFavorite = useCallback((event) => {
+ setFavorite(event.target.checked);
+ }, []);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {duration}
+
+
+
+ {title}
+
+
+ {description}
+
+
+
+
+
+
+
+
+ {author.name}
+
+ {fDate(createdAt, 'dd/MM/yyyy p')}
+
+
+
+
+
+
+
+
+ }
+ checkedIcon={ }
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {_socials.map((social) => (
+
+
+ Share via {social.label}
+
+ ))}
+
+ >
+ );
+}
diff --git a/template/src/sections/_elearning/view/elearning-posts-view.jsx b/template/src/sections/_elearning/view/elearning-posts-view.jsx
new file mode 100644
index 0000000..f509ab5
--- /dev/null
+++ b/template/src/sections/_elearning/view/elearning-posts-view.jsx
@@ -0,0 +1,49 @@
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+
+import { _tags, _mock, _categories, _coursePosts } from 'src/_mock';
+
+import PostSidebar from '../../blog/common/post-sidebar';
+import ElearningNewsletter from '../elearning-newsletter';
+import ElearningPosts from '../../blog/elearning/elearning-posts';
+import PostSearchMobile from '../../blog/common/post-search-mobile';
+import ElearningFeaturedPost from '../../blog/elearning/elearning-featured-post';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningPostsView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_home/home-advertisement.jsx b/template/src/sections/_home/home-advertisement.jsx
new file mode 100644
index 0000000..4a6b6af
--- /dev/null
+++ b/template/src/sections/_home/home-advertisement.jsx
@@ -0,0 +1,59 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+
+import { bgGradient } from 'src/theme/css';
+
+// ----------------------------------------------------------------------
+
+export default function HomeAdvertisement() {
+ const theme = useTheme();
+
+ return (
+
+
+
+ Start Now
+
+
+
+ Create Your
+ Website Today
+
+
+
+ Purchase Now
+
+
+
+ );
+}
diff --git a/template/src/sections/_home/home-combination.jsx b/template/src/sections/_home/home-combination.jsx
new file mode 100644
index 0000000..5a9f3ca
--- /dev/null
+++ b/template/src/sections/_home/home-combination.jsx
@@ -0,0 +1,108 @@
+import { m } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import { varFade, MotionViewport } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function HomeCombination() {
+ const mdUp = useResponsive('up', 'md');
+
+ const visitBtn = (
+
+ }
+ sx={{ ...(mdUp && { mt: 5 }) }}
+ >
+ Visit Minimal Dashboard
+
+
+ );
+
+ return (
+
+
+
+
+ Perfect combination
+
+
+
+
+
+ Looking For a
+ Dashboard Template?
+
+
+
+
+
+ Minimal UI Kit is a professional dashboard used by many of our clients.
+
+
+
+ {mdUp && visitBtn}
+
+
+
+
+
+
+
+
+ {!mdUp && visitBtn}
+
+ );
+}
diff --git a/template/src/sections/_home/home-faqs.jsx b/template/src/sections/_home/home-faqs.jsx
new file mode 100644
index 0000000..f0cd00c
--- /dev/null
+++ b/template/src/sections/_home/home-faqs.jsx
@@ -0,0 +1,170 @@
+import { m } from 'framer-motion';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Accordion from '@mui/material/Accordion';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import AccordionDetails from '@mui/material/AccordionDetails';
+import AccordionSummary, { accordionSummaryClasses } from '@mui/material/AccordionSummary';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Pattern01 from 'src/assets/illustrations/pattern/pattern-01';
+
+import Iconify from 'src/components/iconify';
+import { varFade, MotionViewport } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+const CONTENTS = [
+ {
+ question: `What's in the product packages?`,
+ answer: `Curabitur nisi. Phasellus blandit leo ut odio. Donec posuere vulputate arcu. Donec mi odio, faucibus at, scelerisque quis, convallis in,`,
+ },
+ {
+ question: 'How can I upgrade my product plan?',
+ answer: `Curabitur nisi. Phasellus blandit leo ut odio. Donec posuere vulputate arcu. Donec mi odio, faucibus at, scelerisque quis, convallis in,`,
+ },
+ {
+ question: 'Are design assets (Figma, Sketch, Adobe XD) included?',
+ answer: `Curabitur nisi. Phasellus blandit leo ut odio. Donec posuere vulputate arcu. Donec mi odio, faucibus at, scelerisque quis, convallis in,`,
+ },
+ {
+ question: 'Does this product support TypeScript?',
+ answer: `Curabitur nisi. Phasellus blandit leo ut odio. Donec posuere vulputate arcu. Donec mi odio, faucibus at, scelerisque quis, convallis in,`,
+ },
+ {
+ question: 'Can I use this template in commercial projects like a SaaS?',
+ answer: `Curabitur nisi. Phasellus blandit leo ut odio. Donec posuere vulputate arcu. Donec mi odio, faucibus at, scelerisque quis, convallis in,`,
+ },
+ {
+ question: 'How can I request support?',
+ answer: `Curabitur nisi. Phasellus blandit leo ut odio. Donec posuere vulputate arcu. Donec mi odio, faucibus at, scelerisque quis, convallis in,`,
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function HomeFAQs() {
+ const smUp = useResponsive('up', 'sm');
+
+ const [expanded, setExpanded] = useState(false);
+
+ const handleChangeExpanded = useCallback(
+ (panel) => (event, isExpanded) => {
+ setExpanded(isExpanded ? panel : false);
+ },
+ []
+ );
+
+ return (
+
+
+
+
+
+ Frequently Asked Questions
+
+
+
+
+ {CONTENTS.map((faq) => (
+
+
+ `dashed 1px ${theme.palette.divider}`,
+ [`& .${accordionSummaryClasses.content}`]: {
+ p: 0,
+ m: 0,
+ },
+ [`&.${accordionSummaryClasses.expanded}`]: {
+ bgcolor: 'action.selected',
+ },
+ }}
+ >
+
+ {faq.question}
+
+
+
+
+
+ {faq.answer}
+
+
+ ))}
+
+
+ alpha(theme.palette.grey[500], 0.32),
+ px: { xs: 3, md: 8 },
+ py: { xs: 6, md: 8 },
+ }}
+ >
+
+ Still Have Questions?
+
+
+
+
+ Please describe your case to receive the most accurate advice.
+
+
+
+
+
+ Contact us
+
+
+
+
+
+
+ {smUp && (
+
+ )}
+
+ );
+}
diff --git a/template/src/sections/_home/home-feature-highlights.jsx b/template/src/sections/_home/home-feature-highlights.jsx
new file mode 100644
index 0000000..4cd3d7d
--- /dev/null
+++ b/template/src/sections/_home/home-feature-highlights.jsx
@@ -0,0 +1,97 @@
+import { m } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+import { varFade, MotionViewport } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+const FEATURE_HIGHLIGHTS = [
+ { title: '5 Prebuilt Websites', icon: 'carbon:application-web' },
+ { title: '60+ Demo Page', icon: 'carbon:stacked-scrolling-2' },
+ { title: 'Easy to Customize', icon: 'carbon:settings-adjust' },
+ { title: 'Color Presets', icon: 'carbon:color-switch' },
+ { title: 'Dark Mode', icon: 'carbon:asleep' },
+ { title: 'Awesome Animation', icon: 'carbon:boolean' },
+ { title: 'Google Fonts', icon: 'carbon:text-font' },
+ { title: 'Figma Design', icon: 'ph:figma-logo' },
+ { title: 'Fully Responsive', icon: 'carbon:devices' },
+ { title: 'Mega Menu', icon: 'carbon:list-dropdown' },
+ { title: 'Clean Markup', icon: 'carbon:script' },
+ { title: 'Free Updates', icon: 'carbon:update-now' },
+ { title: 'Fast Support', icon: 'carbon:headset' },
+ { title: 'Well Documented', icon: 'carbon:notebook' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function HomeFeatureHighlights() {
+ return (
+
+
+
+
+
+ Feature Highlights
+
+
+
+
+
+ Have Everything You Need
+
+
+
+
+
+ {`Let's see what makes our theme super powerful and user-friendly!`}
+
+
+
+
+
+
+ {FEATURE_HIGHLIGHTS.map((feature) => (
+
+
+
+
+
+ {feature.title}
+
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_home/home-flexible-components.jsx b/template/src/sections/_home/home-flexible-components.jsx
new file mode 100644
index 0000000..0dc628f
--- /dev/null
+++ b/template/src/sections/_home/home-flexible-components.jsx
@@ -0,0 +1,393 @@
+import { m } from 'framer-motion';
+import { useState, useEffect, useCallback } from 'react';
+
+import Tab from '@mui/material/Tab';
+import Fab from '@mui/material/Fab';
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Tabs from '@mui/material/Tabs';
+import Chip from '@mui/material/Chip';
+import Stack from '@mui/material/Stack';
+import Alert from '@mui/material/Alert';
+import Radio from '@mui/material/Radio';
+import Paper from '@mui/material/Paper';
+import Badge from '@mui/material/Badge';
+import Slider from '@mui/material/Slider';
+import Switch from '@mui/material/Switch';
+import Rating from '@mui/material/Rating';
+import Button from '@mui/material/Button';
+import Avatar from '@mui/material/Avatar';
+import Tooltip from '@mui/material/Tooltip';
+import Checkbox from '@mui/material/Checkbox';
+import TextField from '@mui/material/TextField';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import CardHeader from '@mui/material/CardHeader';
+import AvatarGroup from '@mui/material/AvatarGroup';
+import ToggleButton from '@mui/material/ToggleButton';
+import FormControlLabel from '@mui/material/FormControlLabel';
+import CircularProgress from '@mui/material/CircularProgress';
+import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { _mock } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import { varFade, MotionViewport } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+const FASHION_CATEGORY = [
+ { value: 'clothes', label: 'Clothes' },
+ { value: 'footwear', label: 'Footwear' },
+ { value: 'jean', label: 'Jean' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function HomeFlexibleComponents() {
+ const [tab, setTab] = useState('angular');
+
+ const [progress, setProgress] = useState(0);
+
+ const [alignment, setAlignment] = useState('left');
+
+ const [category, setCategory] = useState('clothes');
+
+ const [rating, setRating] = useState(5);
+
+ useEffect(() => {
+ const timer = setInterval(() => {
+ setProgress((prevProgress) => (prevProgress >= 100 ? 0 : prevProgress + 10));
+ }, 800);
+
+ return () => {
+ clearInterval(timer);
+ };
+ }, []);
+
+ const handleChangeTab = useCallback((event, newValue) => {
+ setTab(newValue);
+ }, []);
+
+ const handleChangeAlignment = useCallback((event, newAlignment) => {
+ if (newAlignment !== null) {
+ setAlignment(newAlignment);
+ }
+ }, []);
+
+ const handleChangeCategory = useCallback((event) => {
+ setCategory(event.target.value);
+ }, []);
+
+ return (
+
+
+
+
+
+
+ Interface Starter Kit
+
+
+
+
+
+ Flexible Components
+
+
+
+
+
+ Pre-set components are easy to customize and use. We collected most popular
+ elements. Menu, sliders, buttons, inputs etc. are all here. Just dive in!
+
+
+
+
+ }
+ >
+ Browse Components
+
+
+
+
+
+
+ `dashed 1px ${theme.palette.divider}`,
+ }}
+ >
+
+ }
+ >
+ Add to cart
+
+
+
+
+ Upload
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {}}
+ avatar={P }
+ />
+
+
+
+
+
+
+ {[...Array(8)].map((_, index) => (
+
+ ))}
+
+
+
+ Hover Me
+
+
+ {
+ setRating(newValue);
+ }}
+ />
+
+
+
+
+
+ {}}>
+
+
+ }
+ >
+ This is a success alert
+
+
+
+
+ theme.customShadows.z24 }}>
+ theme.customShadows.z20,
+ }}
+ >
+
+
+
+ }
+ titleTypographyProps={{
+ typography: 'subtitle2',
+ sx: { mb: 0.25 },
+ }}
+ subheaderTypographyProps={{ typography: 'caption' }}
+ sx={{ p: 2 }}
+ />
+
+
+
+
+
+ Phasellus dolor. Fusce egestas elit eget lorem. Quisque id odio.
+
+
+
+ }
+ checkedIcon={ }
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ } label="Switch" />
+
+ } label="Checkbox" />
+
+ }
+ label="Radio Button"
+ />
+
+
+
+
+ {FASHION_CATEGORY.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_home/home-for-designer.jsx b/template/src/sections/_home/home-for-designer.jsx
new file mode 100644
index 0000000..157fc35
--- /dev/null
+++ b/template/src/sections/_home/home-for-designer.jsx
@@ -0,0 +1,60 @@
+import { m } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+
+import { bgGradient } from 'src/theme/css';
+
+import Iconify from 'src/components/iconify';
+import { varFade, MotionViewport } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function HomeForDesigner() {
+ const theme = useTheme();
+
+ return (
+
+
+
+ Professional Kit
+
+
+
+
+
+ For Designer
+
+
+
+
+ }
+ target="_blank"
+ rel="noopener"
+ href={paths.figmaPreview}
+ >
+ figma workspace
+
+
+
+ );
+}
diff --git a/template/src/sections/_home/home-hero.jsx b/template/src/sections/_home/home-hero.jsx
new file mode 100644
index 0000000..d5c1db0
--- /dev/null
+++ b/template/src/sections/_home/home-hero.jsx
@@ -0,0 +1,128 @@
+import { useRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+import { useBoundingClientRect } from 'src/hooks/use-bounding-client-rect';
+
+import { bgGradient } from 'src/theme/css';
+import { HEADER } from 'src/layouts/config-layout';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function HomeHero() {
+ const theme = useTheme();
+
+ const containerRef = useRef(null);
+
+ const mdUp = useResponsive('up', 'md');
+
+ const container = useBoundingClientRect(containerRef);
+
+ const offsetLeft = container?.left;
+
+ return (
+
+
+
+
+
+
+ Create Your Website Today with
+
+ {` ZONE`}
+
+
+
+
+ The ZONE is built on top of MUI, a powerful library that provides flexible,
+ customizable, and easy-to-use components.
+
+
+ }
+ target="_blank"
+ rel="noopener"
+ href={paths.figmaPreview}
+ >
+ figma workspace
+
+
+
+
+ AVAILABLE FOR
+
+
+ {['js', 'ts', 'figma', 'nextjs', 'vite'].map((icon) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+ );
+}
diff --git a/template/src/sections/_home/home-new-start.jsx b/template/src/sections/_home/home-new-start.jsx
new file mode 100644
index 0000000..75377d1
--- /dev/null
+++ b/template/src/sections/_home/home-new-start.jsx
@@ -0,0 +1,65 @@
+import { m } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+import { varFade, MotionViewport } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function HomeNewStart() {
+ return (
+
+
+
+
+
+
+
+
+
+ new start
+
+
+
+
+
+ The
+
+ {` ZONE `}
+
+ UI Kit
+
+
+
+
+
+ Modern ui kit to save your time, boost your creativity. Neat and super stylish layout
+ ready to help with your projects
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_home/view/home-view.jsx b/template/src/sections/_home/view/home-view.jsx
new file mode 100644
index 0000000..13875bb
--- /dev/null
+++ b/template/src/sections/_home/view/home-view.jsx
@@ -0,0 +1,45 @@
+import { useScroll } from 'framer-motion';
+
+import { _pricingHome } from 'src/_mock';
+
+import ScrollProgress from 'src/components/scroll-progress';
+
+import HomeHero from '../home-hero';
+import HomeFAQs from '../home-faqs';
+import HomeNewStart from '../home-new-start';
+import HomeCombination from '../home-combination';
+import HomeForDesigner from '../home-for-designer';
+import HomeAdvertisement from '../home-advertisement';
+import PricingHome from '../../pricing/home/pricing-home';
+import HomeFeatureHighlights from '../home-feature-highlights';
+import HomeFlexibleComponents from '../home-flexible-components';
+
+// ----------------------------------------------------------------------
+
+export default function HomeView() {
+ const { scrollYProgress } = useScroll();
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_marketing/about/marketing-about-core-values.jsx b/template/src/sections/_marketing/about/marketing-about-core-values.jsx
new file mode 100644
index 0000000..37743b5
--- /dev/null
+++ b/template/src/sections/_marketing/about/marketing-about-core-values.jsx
@@ -0,0 +1,80 @@
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import SvgColor from 'src/components/svg-color';
+
+// ----------------------------------------------------------------------
+
+const CORE_VALUES = [
+ {
+ title: 'Customer Satisfaction',
+ description: 'Aenean urna dictum adipiscing nec, cras quisque.',
+ icon: '/assets/icons/ic_agreement.svg',
+ },
+ {
+ title: 'Transparency',
+ description: 'Aenean urna dictum adipiscing nec, cras quisque.',
+ icon: '/assets/icons/ic_transparency.svg',
+ },
+ {
+ title: 'Reputation',
+ description: 'Aenean urna dictum adipiscing nec, cras quisque.',
+ icon: '/assets/icons/ic_reputation.svg',
+ },
+ {
+ title: 'Cooperation',
+ description: 'Aenean urna dictum adipiscing nec, cras quisque.',
+ icon: '/assets/icons/ic_popularity.svg',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingAboutCoreValues() {
+ return (
+
+
+ Our Core Values
+
+
+
+ {CORE_VALUES.map((value) => (
+
+
+
+
+ {value.title}
+
+
+ {value.description}
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/about/marketing-about-our-vision.jsx b/template/src/sections/_marketing/about/marketing-about-our-vision.jsx
new file mode 100644
index 0000000..69a02c9
--- /dev/null
+++ b/template/src/sections/_marketing/about/marketing-about-our-vision.jsx
@@ -0,0 +1,92 @@
+import Fab from '@mui/material/Fab';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import { alpha, styled, useTheme } from '@mui/material/styles';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const StyledTypography = styled(Typography)(({ theme }) => ({
+ maxWidth: 564,
+ margin: 'auto',
+ textAlign: 'center',
+ [theme.breakpoints.up('md')]: {
+ left: 0,
+ right: 0,
+ zIndex: 9,
+ position: 'absolute',
+ color: theme.palette.common.white,
+ },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function MarketingAboutOurVision() {
+ const theme = useTheme();
+
+ return (
+
+
+
+ Our Vision
+
+
+
+
+
+
+
+
+
+
+
+ Our vision offering the best product nulla vehicula tortor scelerisque ultrices malesuada.
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/about/marketing-about-story.jsx b/template/src/sections/_marketing/about/marketing-about-story.jsx
new file mode 100644
index 0000000..a173fc2
--- /dev/null
+++ b/template/src/sections/_marketing/about/marketing-about-story.jsx
@@ -0,0 +1,117 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Timeline from '@mui/lab/Timeline';
+import TimelineDot from '@mui/lab/TimelineDot';
+import Container from '@mui/material/Container';
+import TimelineItem from '@mui/lab/TimelineItem';
+import Typography from '@mui/material/Typography';
+import TimelineContent from '@mui/lab/TimelineContent';
+import TimelineConnector from '@mui/lab/TimelineConnector';
+import TimelineSeparator from '@mui/lab/TimelineSeparator';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+// ----------------------------------------------------------------------
+
+const TIMELINES = [
+ {
+ year: '2021',
+ title: 'Customer Satisfaction',
+ description:
+ 'Curabitur ullamcorper ultricies nisi. Praesent nonummy mi in odio. Donec mollis hendrerit risus.',
+ },
+ {
+ year: '2020',
+ title: 'Transparency',
+ description:
+ 'Curabitur ullamcorper ultricies nisi. Praesent nonummy mi in odio. Donec mollis hendrerit risus.',
+ },
+ {
+ year: '2019',
+ title: 'Reputation',
+ description:
+ 'Curabitur ullamcorper ultricies nisi. Praesent nonummy mi in odio. Donec mollis hendrerit risus.',
+ },
+ {
+ year: '2018',
+ title: 'Cooperation',
+ description:
+ 'Curabitur ullamcorper ultricies nisi. Praesent nonummy mi in odio. Donec mollis hendrerit risus.',
+ },
+];
+
+const COLORS = ['primary', 'secondary', 'warning', 'success'];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingAboutStory() {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+ Our Story
+
+
+ Nunc nonummy metus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.
+
+
+
+
+ {TIMELINES.map((value, index) => (
+
+
+
+
+
+
+
+
+ {value.year}
+
+
+
+ {value.title}
+
+
+
+ {value.description}
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/about/marketing-about.jsx b/template/src/sections/_marketing/about/marketing-about.jsx
new file mode 100644
index 0000000..68d4015
--- /dev/null
+++ b/template/src/sections/_marketing/about/marketing-about.jsx
@@ -0,0 +1,139 @@
+import Box from '@mui/material/Box';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, styled } from '@mui/material/styles';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import CountUp from 'src/components/count-up';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'warning', 'success'];
+
+const SUMMARY = [
+ { title: 'Years of experience', total: 12, icon: 'carbon:increase-level' },
+ { title: 'Awards', total: 20, icon: 'carbon:trophy' },
+ { title: 'Projects', total: 150, icon: 'carbon:data-vis-4' },
+ { title: 'Happy clients', total: 32000, icon: 'carbon:user-certification' },
+];
+
+// ----------------------------------------------------------------------
+
+const StyledIcon = styled('div', {
+ shouldForwardProp: (prop) => prop !== 'color',
+})(({ color, theme }) => ({
+ width: 160,
+ height: 160,
+ margin: 'auto',
+ display: 'flex',
+ borderRadius: '50%',
+ alignItems: 'center',
+ position: 'relative',
+ justifyContent: 'center',
+ color: theme.palette[color].darker,
+ border: `dashed 2px ${alpha(theme.palette[color].main, 0.24)}`,
+ '&:before': {
+ zIndex: 8,
+ content: '""',
+ borderRadius: '50%',
+ position: 'absolute',
+ width: 'calc(100% - 48px)',
+ height: 'calc(100% - 48px)',
+ background: `conic-gradient(from 0deg at 50% 50%, ${theme.palette[color].main} 0deg, ${theme.palette[color].light} 360deg)`,
+ },
+ '& svg': {
+ zIndex: 9,
+ },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function MarketingAbout() {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+ Who We Are?
+
+
+ Vivamus consectetuer hendrerit lacus. Curabitur a felis in nunc fringilla tristique.
+ Nulla neque dolor, sagittis eget, iaculis quis, molestie non, velit.
+
+
+ Nam pretium turpis et arcu. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl
+ dignissim dolor, a pretium mi sem ut ipsum. Praesent venenatis metus at tortor pulvinar
+ varius.
+
+
+ }
+ >
+ Check Our Work
+
+
+
+
+
+ {SUMMARY.map((value, index) => (
+
+
+
+
+
+
+ fShortenNumber(newValue)}
+ />
+
+
+ {value.title}
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/contact/marketing-contact-form.jsx b/template/src/sections/_marketing/contact/marketing-contact-form.jsx
new file mode 100644
index 0000000..ca9d60d
--- /dev/null
+++ b/template/src/sections/_marketing/contact/marketing-contact-form.jsx
@@ -0,0 +1,162 @@
+import * as Yup from 'yup';
+import { useForm, Controller } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+import FormHelperText from '@mui/material/FormHelperText';
+import ToggleButton, { toggleButtonClasses } from '@mui/material/ToggleButton';
+
+import { fCurrency } from 'src/utils/format-number';
+
+import { _tags } from 'src/_mock';
+
+import FormProvider, { RHFSlider, RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingContactForm() {
+ const MarketingContactSchema = Yup.object().shape({
+ services: Yup.array().required().min(1, 'Services field must have at least 1 items'),
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ compnany: Yup.string().required('Compnany is required'),
+ website: Yup.string().required('Website is required'),
+ });
+
+ const defaultValues = {
+ services: [],
+ firstName: '',
+ lastName: '',
+ email: '',
+ phoneNumber: '',
+ compnany: '',
+ website: '',
+ budget: [2000, 10000],
+ message: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(MarketingContactSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ control,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ const getSelected = (selectedItems, item) =>
+ selectedItems.includes(item)
+ ? selectedItems.filter((value) => value !== item)
+ : [...selectedItems, item];
+
+ return (
+
+
+ (
+
+
+ {_tags.slice(0, 5).map((service) => (
+ field.onChange(getSelected(field.value, service))}
+ sx={{
+ py: 0.5,
+ px: 2,
+ typography: 'body2',
+ [`&.${toggleButtonClasses.selected}`]: {
+ bgcolor: 'text.primary',
+ borderColor: 'transparent',
+ color: (theme) =>
+ theme.palette.mode === 'light' ? 'common.white' : 'grey.800',
+ '&:hover': {
+ bgcolor: 'text.primary',
+ },
+ },
+ }}
+ >
+ {service}
+
+ ))}
+
+
+ {!!error && (
+
+ {error?.message}
+
+ )}
+
+ )}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Your Budget
+
+
+ fCurrency(value)}
+ />
+
+
+
+
+
+
+ Send Request
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/contact/marketing-contact-info.jsx b/template/src/sections/_marketing/contact/marketing-contact-info.jsx
new file mode 100644
index 0000000..0c66381
--- /dev/null
+++ b/template/src/sections/_marketing/contact/marketing-contact-info.jsx
@@ -0,0 +1,67 @@
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingContactInfo() {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+ {mdUp && (
+
+ )}
+
+
+
+
+
+
+ Visit us
+
+
+
+
+
+
+ 508 Bridle Avenue Newnan, GA 30263e
+
+
+
+
+
+
+ Call us
+
+
+
+
+
+
+ Talk to us
+
+ hello@example.com
+
+
+
+
+
+
+
+ Working Hours
+ Mon-Fri: 9 am — 6 pm
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/details/marketing-case-study-details-gallery.jsx b/template/src/sections/_marketing/details/marketing-case-study-details-gallery.jsx
new file mode 100644
index 0000000..14b9594
--- /dev/null
+++ b/template/src/sections/_marketing/details/marketing-case-study-details-gallery.jsx
@@ -0,0 +1,86 @@
+import { useEffect } from 'react';
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+import { varHover, varTranHover } from 'src/components/animate';
+import Lightbox, { useLightbox } from 'src/components/lightbox';
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingCaseStudyDetailsGallery({ images }) {
+ const theme = useTheme();
+
+ const slides = images.map((slide) => ({
+ src: slide,
+ }));
+
+ const lightbox = useLightbox(slides);
+
+ const carousel = useCarousel({
+ slidesToShow: 3,
+ slidesToScroll: 1,
+ centerMode: true,
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 1 },
+ },
+ ],
+ });
+
+ useEffect(() => {
+ if (lightbox.open) {
+ carousel.onTogo(lightbox.selected);
+ }
+ }, [carousel, lightbox.open, lightbox.selected]);
+
+ return (
+ <>
+
+ Gallery
+
+
+
+
+ {slides.map((slide) => (
+ lightbox.onOpen(slide.src)}
+ >
+
+
+
+
+
+
+ ))}
+
+
+ lightbox.setSelected(index)}
+ />
+ >
+ );
+}
+
+MarketingCaseStudyDetailsGallery.propTypes = {
+ images: PropTypes.array,
+};
diff --git a/template/src/sections/_marketing/details/marketing-case-study-details-summary.jsx b/template/src/sections/_marketing/details/marketing-case-study-details-summary.jsx
new file mode 100644
index 0000000..84f0ad2
--- /dev/null
+++ b/template/src/sections/_marketing/details/marketing-case-study-details-summary.jsx
@@ -0,0 +1,83 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import { fDate } from 'src/utils/format-time';
+
+import { _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingCaseStudyDetailsSummary({ caseStudy }) {
+ const { title, description, category, website, createdAt } = caseStudy;
+
+ return (
+
+
+
+ summary
+
+
+ {title}
+
+ {description}
+
+
+
+
+
+
+ Website
+
+
+
+ {website}
+
+
+
+ Category
+
+
+
+ {category}
+
+
+
+ Date
+
+
+ {fDate(createdAt)}
+
+
+
+
+
+ Share:
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+ );
+}
+
+MarketingCaseStudyDetailsSummary.propTypes = {
+ caseStudy: PropTypes.shape({
+ title: PropTypes.string,
+ website: PropTypes.string,
+ category: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ }),
+};
diff --git a/template/src/sections/_marketing/landing/marketing-landing-about.jsx b/template/src/sections/_marketing/landing/marketing-landing-about.jsx
new file mode 100644
index 0000000..733da38
--- /dev/null
+++ b/template/src/sections/_marketing/landing/marketing-landing-about.jsx
@@ -0,0 +1,129 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const ROWS = [
+ {
+ label: 'projects',
+ total: 20,
+ content: 'Praesent turpis. Praesent blandit laoreet nibh. Nunc nonummy metus.',
+ },
+ {
+ label: 'Happy clients',
+ total: 32000,
+ content: 'Praesent turpis. Praesent blandit laoreet nibh. Nunc nonummy metus.',
+ },
+ {
+ label: 'years of experience',
+ total: 20,
+ content: 'Praesent turpis. Praesent blandit laoreet nibh. Nunc nonummy metus.',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingAbout() {
+ return (
+
+
+
+
+
+
+ About us
+
+
+
+ Who We Are
+
+
+
+ In hac habitasse platea dictumst. Aliquam lobortis. Lorem ipsum dolor sit amet,
+ consectetuer adipiscing elit. In dui magna, posuere eget, vestibulum et, tempor auctor,
+ justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac
+ turpis egestas.
+
+
+ }
+ sx={{ my: 5 }}
+ >
+ Lean more
+
+
+
+
+
+ {ROWS.map((row) => (
+
+ }
+ >
+
+
+ {fShortenNumber(row.total)}
+
+ +
+
+
+
+
+ {row.label}
+
+
+
+
+ {row.content}
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/landing/marketing-landing-case-studies.jsx b/template/src/sections/_marketing/landing/marketing-landing-case-studies.jsx
new file mode 100644
index 0000000..2c30bf2
--- /dev/null
+++ b/template/src/sections/_marketing/landing/marketing-landing-case-studies.jsx
@@ -0,0 +1,237 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Paper from '@mui/material/Paper';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+import { varHover, varTranHover } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingCaseStudies({ caseStudies }) {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+ Our Work
+
+
+ Case Studies
+
+
+
+
+
+
+
+ {!mdUp && (
+
+
+
+ )}
+
+
+
+ {mdUp ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {mdUp ? (
+
+ ) : (
+
+ )}
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+ }
+ >
+ View all
+
+
+
+ );
+}
+
+MarketingLandingCaseStudies.propTypes = {
+ caseStudies: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function LargeItem({ caseStudy }) {
+ return (
+ theme.customShadows.z24,
+ gridTemplateColumns: {
+ xs: 'repeat(1, 1fr)',
+ md: 'repeat(2, 1fr)',
+ },
+ }}
+ >
+
+
+
+
+
+
+
+ {caseStudy.category}
+
+
+
+ {caseStudy.title}
+
+
+
+ {caseStudy.description}
+
+
+
+ }
+ >
+ Learn more
+
+
+
+ );
+}
+
+LargeItem.propTypes = {
+ caseStudy: PropTypes.shape({
+ category: PropTypes.string,
+ coverUrl: PropTypes.string,
+ description: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+function SmallItem({ caseStudy, square }) {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+
+ {caseStudy.category}
+
+ {caseStudy.title}
+
+
+
+
+
+
+
+ );
+}
+
+SmallItem.propTypes = {
+ caseStudy: PropTypes.shape({
+ category: PropTypes.string,
+ coverUrl: PropTypes.string,
+ title: PropTypes.string,
+ }),
+ square: PropTypes.bool,
+};
diff --git a/template/src/sections/_marketing/landing/marketing-landing-faqs.jsx b/template/src/sections/_marketing/landing/marketing-landing-faqs.jsx
new file mode 100644
index 0000000..d4855f8
--- /dev/null
+++ b/template/src/sections/_marketing/landing/marketing-landing-faqs.jsx
@@ -0,0 +1,90 @@
+import { useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Accordion from '@mui/material/Accordion';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import AccordionDetails from '@mui/material/AccordionDetails';
+import AccordionSummary, { accordionSummaryClasses } from '@mui/material/AccordionSummary';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _faqs } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingFaqs() {
+ const mdUp = useResponsive('up', 'md');
+
+ const [expanded, setExpanded] = useState(false);
+
+ const handleChangeExpanded = useCallback(
+ (panel) => (event, isExpanded) => {
+ setExpanded(isExpanded ? panel : false);
+ },
+ []
+ );
+
+ return (
+
+
+
+
+
+ FAQS
+
+
+ Frequently Asked Questions
+
+
+ {_faqs.map((faq) => (
+
+
+
+ {faq.question}
+
+
+
+
+
+ {faq.answer}
+
+ ))}
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/landing/marketing-landing-free-seo.jsx b/template/src/sections/_marketing/landing/marketing-landing-free-seo.jsx
new file mode 100644
index 0000000..8d78aa8
--- /dev/null
+++ b/template/src/sections/_marketing/landing/marketing-landing-free-seo.jsx
@@ -0,0 +1,126 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import TextField from '@mui/material/TextField';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { inputBaseClasses } from '@mui/material/InputBase';
+import { inputLabelClasses } from '@mui/material/InputLabel';
+import { alpha, styled, useTheme } from '@mui/material/styles';
+
+import { bgGradient } from 'src/theme/css';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const StyledInput = styled((props) => )(({ theme }) => ({
+ [`& .${inputBaseClasses.input}`]: {
+ color: theme.palette.common.white,
+ },
+ [`& .${inputLabelClasses.root}.${inputLabelClasses.shrink}`]: {
+ color: theme.palette.grey[500],
+ [`&.${inputLabelClasses.focused}`]: {
+ color: theme.palette.grey[500],
+ },
+ },
+}));
+
+StyledInput.propTypes = {
+ theme: PropTypes.shape({
+ palette: PropTypes.shape({
+ common: PropTypes.shape({
+ white: PropTypes.string,
+ }),
+ grey: PropTypes.string,
+ }),
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingFreeSEO() {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+ Get Free
+ SEO Analysis
+
+
+
+
+
+
+ hello@example.com
+
+
+
+
+
+ 508 Bridle Avenue Newnan, GA 30263
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Request
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/landing/marketing-landing-hero.jsx b/template/src/sections/_marketing/landing/marketing-landing-hero.jsx
new file mode 100644
index 0000000..6eb70d8
--- /dev/null
+++ b/template/src/sections/_marketing/landing/marketing-landing-hero.jsx
@@ -0,0 +1,98 @@
+import Box from '@mui/material/Box';
+import Fab from '@mui/material/Fab';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingHero() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+
+
+ Digital Marketing
+
+
+
+ Boosts Your Website Traffic
+
+
+
+ Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis
+ venenatis ante odio sit amet eros.
+
+
+
+
+ Try For Free
+
+
+
+
+
+
+ See Our Work
+
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/landing/marketing-landing-process.jsx b/template/src/sections/_marketing/landing/marketing-landing-process.jsx
new file mode 100644
index 0000000..1bebe7e
--- /dev/null
+++ b/template/src/sections/_marketing/landing/marketing-landing-process.jsx
@@ -0,0 +1,129 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import SvgColor from 'src/components/svg-color';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'warning', 'success'];
+
+const SERVICES = [
+ {
+ name: 'Planning',
+ icon: '/assets/icons/ic_sketch_design.svg',
+ },
+ {
+ name: 'Research',
+ icon: '/assets/icons/ic_search.svg',
+ },
+ {
+ name: 'Optimizing',
+ icon: '/assets/icons/ic_optimization.svg',
+ },
+ {
+ name: 'Results',
+ icon: '/assets/icons/ic_analysis.svg',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingProcess() {
+ return (
+
+
+
+ Work Flow
+
+
+ Working Process
+
+
+ Nunc nonummy metus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.
+
+
+
+
+ {SERVICES.map((service, index) => (
+
+ ))}
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function ServiceItem({ service, index }) {
+ const { name, icon } = service;
+
+ return (
+ theme.palette[COLORS[index]].darker,
+ bgcolor: (theme) => theme.palette[COLORS[index]].light,
+ boxShadow: (theme) => `-8px 12px 32px 0px ${alpha(theme.palette[COLORS[index]].main, 0.2)}`,
+ ...(index === 1 && {
+ mb: { md: 2.5 },
+ }),
+ ...(index === 2 && {
+ mb: { md: 5 },
+ }),
+ ...(index === 3 && {
+ mb: { md: 7.5 },
+ }),
+ }}
+ >
+
+
+
+ {name}
+
+
+ );
+}
+
+ServiceItem.propTypes = {
+ index: PropTypes.number,
+ service: PropTypes.shape({
+ name: PropTypes.string,
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ }),
+};
diff --git a/template/src/sections/_marketing/landing/marketing-landing-services.jsx b/template/src/sections/_marketing/landing/marketing-landing-services.jsx
new file mode 100644
index 0000000..d3f9c73
--- /dev/null
+++ b/template/src/sections/_marketing/landing/marketing-landing-services.jsx
@@ -0,0 +1,158 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Iconify from 'src/components/iconify';
+import SvgColor from 'src/components/svg-color';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'success', 'warning'];
+
+const SERVICES = [
+ {
+ name: 'SEO',
+ icon: '/assets/icons/service/ic_service_seo.svg',
+ content: 'Nunc nonummy metus. Donec elit libero',
+ path: paths.marketing.services,
+ },
+ {
+ name: 'Email Marketing',
+ icon: '/assets/icons/service/ic_service_mail.svg',
+ content: 'Nunc nonummy metus. Donec elit libero',
+ path: paths.marketing.services,
+ },
+ {
+ name: 'Search Engine Oprimization',
+ icon: '/assets/icons/service/ic_service_analysis.svg',
+ content: 'Nunc nonummy metus. Donec elit libero',
+ path: paths.marketing.services,
+ },
+ {
+ name: 'Social Marketing',
+ icon: '/assets/icons/service/ic_service_bullhorn.svg',
+ content: 'Nunc nonummy metus. Donec elit libero',
+ path: paths.marketing.services,
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingServices() {
+ return (
+
+
+
+ Our Services
+
+
+ We Provide
+
+
+ Nunc nonummy metus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.
+
+
+
+
+ {SERVICES.map((service, index) => (
+
+ ))}
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function ServiceItem({ service, index }) {
+ const { name, icon, content, path } = service;
+
+ return (
+ ({ md: theme.customShadows.z24 }),
+ }),
+ }}
+ >
+ theme.palette[COLORS[index]].main,
+ }}
+ />
+
+
+ {name}
+
+ {content}
+
+
+
+
+
+
+
+ );
+}
+
+ServiceItem.propTypes = {
+ index: PropTypes.number,
+ service: PropTypes.shape({
+ name: PropTypes.string,
+ path: PropTypes.string,
+ content: PropTypes.string,
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ }),
+};
diff --git a/template/src/sections/_marketing/list/marketing-case-study-item.jsx b/template/src/sections/_marketing/list/marketing-case-study-item.jsx
new file mode 100644
index 0000000..9f01f7a
--- /dev/null
+++ b/template/src/sections/_marketing/list/marketing-case-study-item.jsx
@@ -0,0 +1,43 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingCaseStudyItem({ project }) {
+ const { title, coverUrl, category } = project;
+
+ return (
+
+
+
+
+
+ {category}
+
+
+
+
+ {title}
+
+
+
+
+ );
+}
+
+MarketingCaseStudyItem.propTypes = {
+ project: PropTypes.shape({
+ category: PropTypes.string,
+ coverUrl: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_marketing/list/marketing-case-study-list-similar.jsx b/template/src/sections/_marketing/list/marketing-case-study-list-similar.jsx
new file mode 100644
index 0000000..6b6ba22
--- /dev/null
+++ b/template/src/sections/_marketing/list/marketing-case-study-list-similar.jsx
@@ -0,0 +1,80 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import MarketingCaseStudyItem from './marketing-case-study-item';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingCaseStudyListSimilar({ caseStudies }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const viewAllBtn = (
+ }
+ >
+ View All
+
+ );
+
+ return (
+
+
+ You Might Like
+
+ {mdUp && viewAllBtn}
+
+
+
+ {caseStudies.map((project) => (
+
+ ))}
+
+
+ {!mdUp && (
+
+ {viewAllBtn}
+
+ )}
+
+ );
+}
+
+MarketingCaseStudyListSimilar.propTypes = {
+ caseStudies: PropTypes.array,
+};
diff --git a/template/src/sections/_marketing/list/marketing-case-study-list.jsx b/template/src/sections/_marketing/list/marketing-case-study-list.jsx
new file mode 100644
index 0000000..982d7d5
--- /dev/null
+++ b/template/src/sections/_marketing/list/marketing-case-study-list.jsx
@@ -0,0 +1,83 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Tab from '@mui/material/Tab';
+import Box from '@mui/material/Box';
+import Tabs from '@mui/material/Tabs';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import MarketingCaseStudyItem from './marketing-case-study-item';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingCaseStudyList({ caseStudies }) {
+ const [tab, setTab] = useState('All');
+
+ const getCategories = caseStudies.map((project) => project.category);
+
+ const categories = ['All', ...Array.from(new Set(getCategories))];
+
+ const filtered = applyFilter(caseStudies, tab);
+
+ const handleChangeTab = useCallback((event, newValue) => {
+ setTab(newValue);
+ }, []);
+
+ return (
+ <>
+
+ {categories.map((category) => (
+
+ ))}
+
+
+
+ {filtered.map((project) => (
+
+ ))}
+
+
+
+ >
+ );
+}
+
+MarketingCaseStudyList.propTypes = {
+ caseStudies: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function applyFilter(arr, category) {
+ if (category !== 'All') {
+ arr = arr.filter((project) => project.category === category);
+ }
+ return arr;
+}
diff --git a/template/src/sections/_marketing/marketing-about-our-clients.jsx b/template/src/sections/_marketing/marketing-about-our-clients.jsx
new file mode 100644
index 0000000..a278561
--- /dev/null
+++ b/template/src/sections/_marketing/marketing-about-our-clients.jsx
@@ -0,0 +1,49 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingAboutOurClients({ brands }) {
+ return (
+
+
+ Our Clients
+
+
+ {brands.slice(0, 8).map((brand) => (
+
+
+
+ ))}
+
+
+
+ );
+}
+
+MarketingAboutOurClients.propTypes = {
+ brands: PropTypes.array,
+};
diff --git a/template/src/sections/_marketing/marketing-newsletter.jsx b/template/src/sections/_marketing/marketing-newsletter.jsx
new file mode 100644
index 0000000..0f0b8f4
--- /dev/null
+++ b/template/src/sections/_marketing/marketing-newsletter.jsx
@@ -0,0 +1,78 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import TextField from '@mui/material/TextField';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import SvgColor from 'src/components/svg-color';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingNewsletter({ sx, ...other }) {
+ return (
+
+
+
+
+
+
+
+ Sign Up For Newsletter
+
+
+ Receive 50% discount on first project
+
+
+
+
+
+
+ Sign Up
+
+
+ ),
+ sx: { pr: 0 },
+ }}
+ sx={{ maxWidth: 466 }}
+ />
+
+
+
+ );
+}
+
+MarketingNewsletter.propTypes = {
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_marketing/marketing-our-clients.jsx b/template/src/sections/_marketing/marketing-our-clients.jsx
new file mode 100644
index 0000000..4ecb0e4
--- /dev/null
+++ b/template/src/sections/_marketing/marketing-our-clients.jsx
@@ -0,0 +1,58 @@
+import PropTypes from 'prop-types';
+
+import { useTheme } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+
+import SvgColor from 'src/components/svg-color';
+import Carousel, { useCarousel } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingOurClients({ brands }) {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ speed: 5000,
+ autoplay: true,
+ slidesToShow: 6,
+ slidesToScroll: 1,
+ cssEase: 'linear',
+ autoplaySpeed: 5000,
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 4 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 2 },
+ },
+ ],
+ });
+
+ return (
+
+
+ {brands.map((brand) => (
+
+ ))}
+
+
+ );
+}
+
+MarketingOurClients.propTypes = {
+ brands: PropTypes.array,
+};
diff --git a/template/src/sections/_marketing/services/marketing-services-benefits.jsx b/template/src/sections/_marketing/services/marketing-services-benefits.jsx
new file mode 100644
index 0000000..92b8f8f
--- /dev/null
+++ b/template/src/sections/_marketing/services/marketing-services-benefits.jsx
@@ -0,0 +1,165 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+const BENEFITS = [
+ {
+ title: 'Online Media',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ iconColor: 'primary',
+ },
+ {
+ title: 'Design',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ iconColor: 'success',
+ },
+ {
+ title: 'Marketing',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ iconColor: 'secondary',
+ },
+ {
+ title: 'HR & Recruiting',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ iconColor: 'secondary',
+ },
+ {
+ title: 'Management',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ iconColor: 'success',
+ },
+ {
+ title: 'Branding',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ iconColor: 'primary',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingServicesBenefits() {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+ Benefits Achieved
+
+
+
+ Nunc nonummy metus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.
+
+
+
+
+ {BENEFITS.slice(0, 3).map((benefit, index) => (
+
+ ))}
+
+
+ {mdUp && }
+
+
+ {BENEFITS.slice(-3).map((benefit, index) => (
+
+ ))}
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function BenefitItem({ benefit, reverse, index }) {
+ const { title, description, iconColor } = benefit;
+
+ return (
+
+
+ `linear-gradient(to bottom, ${theme.palette.primary.light}, ${theme.palette.primary.main})`,
+ ...(iconColor === 'secondary' && {
+ background: (theme) =>
+ `linear-gradient(to bottom, ${theme.palette.secondary.light}, ${theme.palette.secondary.main})`,
+ }),
+ ...(iconColor === 'success' && {
+ background: (theme) =>
+ `linear-gradient(to bottom, ${theme.palette.success.light}, ${theme.palette.success.main})`,
+ }),
+ }}
+ />
+
+
+ {title}
+
+
+ {description}
+
+
+
+ );
+}
+
+BenefitItem.propTypes = {
+ benefit: PropTypes.shape({
+ description: PropTypes.string,
+ iconColor: PropTypes.string,
+ title: PropTypes.string,
+ }),
+ index: PropTypes.number,
+ reverse: PropTypes.bool,
+};
diff --git a/template/src/sections/_marketing/services/marketing-services-hero.jsx b/template/src/sections/_marketing/services/marketing-services-hero.jsx
new file mode 100644
index 0000000..fef2a93
--- /dev/null
+++ b/template/src/sections/_marketing/services/marketing-services-hero.jsx
@@ -0,0 +1,112 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import InputBase from '@mui/material/InputBase';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { bgGradient } from 'src/theme/css';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingServicesHero() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const renderForm = (
+
+
+
+
+ }
+ placeholder="Email"
+ sx={{
+ pl: 1.5,
+ height: 48,
+ borderRadius: 1,
+ color: 'grey.800',
+ bgcolor: 'common.white',
+ }}
+ />
+
+
+
+
+ }
+ placeholder="Website URL"
+ sx={{
+ pl: 1.5,
+ height: 48,
+ borderRadius: 1,
+ color: 'grey.800',
+ bgcolor: 'common.white',
+ }}
+ />
+
+
+ Analyse
+
+
+ );
+
+ return (
+
+
+
+
+
+
+ Offline SEO
+
+
+
+ Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis
+ venenatis ante odio sit amet eros.
+
+
+
+ {renderForm}
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/services/marketing-services-how-it-work.jsx b/template/src/sections/_marketing/services/marketing-services-how-it-work.jsx
new file mode 100644
index 0000000..f1124bd
--- /dev/null
+++ b/template/src/sections/_marketing/services/marketing-services-how-it-work.jsx
@@ -0,0 +1,126 @@
+import Box from '@mui/material/Box';
+import Timeline from '@mui/lab/Timeline';
+import TimelineDot from '@mui/lab/TimelineDot';
+import Container from '@mui/material/Container';
+import TimelineItem from '@mui/lab/TimelineItem';
+import Typography from '@mui/material/Typography';
+import TimelineContent from '@mui/lab/TimelineContent';
+import { alpha, useTheme } from '@mui/material/styles';
+import TimelineConnector from '@mui/lab/TimelineConnector';
+import TimelineSeparator from '@mui/lab/TimelineSeparator';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { bgGradient } from 'src/theme/css';
+
+// ----------------------------------------------------------------------
+
+const TIMELINES = [
+ {
+ step: 'STEP 1',
+ title: 'Planning',
+ description:
+ 'Curabitur ullamcorper ultricies nisi. Praesent nonummy mi in odio. Donec mollis hendrerit risus.',
+ },
+ {
+ step: 'STEP 2',
+ title: 'Research',
+ description:
+ 'Curabitur ullamcorper ultricies nisi. Praesent nonummy mi in odio. Donec mollis hendrerit risus.',
+ },
+ {
+ step: 'STEP 3',
+ title: 'Optimizing',
+ description:
+ 'Curabitur ullamcorper ultricies nisi. Praesent nonummy mi in odio. Donec mollis hendrerit risus.',
+ },
+ {
+ step: 'STEP 4',
+ title: 'Results',
+ description:
+ 'Curabitur ullamcorper ultricies nisi. Praesent nonummy mi in odio. Donec mollis hendrerit risus.',
+ },
+];
+
+const COLORS = ['primary', 'secondary', 'warning', 'success'];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingServicesHowItWork() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+ How It Works
+
+
+
+ Nunc nonummy metus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.
+
+
+
+ {TIMELINES.map((value, index) => (
+
+
+
+
+
+
+
+
+ {value.step}
+
+
+
+ {value.title}
+
+
+
+ {value.description}
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/services/marketing-services-include.jsx b/template/src/sections/_marketing/services/marketing-services-include.jsx
new file mode 100644
index 0000000..dc3ef0a
--- /dev/null
+++ b/template/src/sections/_marketing/services/marketing-services-include.jsx
@@ -0,0 +1,102 @@
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import SvgColor from 'src/components/svg-color';
+
+// ----------------------------------------------------------------------
+
+const SERVICES = [
+ {
+ title: 'Search Engine Optimization',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ icon: '/assets/icons/ic_statistics.svg',
+ },
+ {
+ title: 'Social Media Strategy',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ icon: '/assets/icons/ic_social_media.svg',
+ },
+ {
+ title: 'Real Time and Data',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ icon: '/assets/icons/ic_real_time.svg',
+ },
+ {
+ title: 'Online Media Management',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ icon: '/assets/icons/ic_checklist.svg',
+ },
+ {
+ title: 'Reporting & Analysis',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ icon: '/assets/icons/ic_report.svg',
+ },
+ {
+ title: 'Penalty Recovery',
+ description: 'Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec, nisi. ',
+ icon: '/assets/icons/ic_file.svg',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingServicesInclude() {
+ return (
+
+ Services Include
+
+
+ Nunc nonummy metus. Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.
+
+
+
+ {SERVICES.map((value) => (
+
+
+
+
+ {value.title}
+
+
+ {value.description}
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/services/marketing-services.jsx b/template/src/sections/_marketing/services/marketing-services.jsx
new file mode 100644
index 0000000..e34462c
--- /dev/null
+++ b/template/src/sections/_marketing/services/marketing-services.jsx
@@ -0,0 +1,81 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const LISTS = [
+ 'First Class Flights',
+ '5 Star Accommodations',
+ 'Inclusive Packages',
+ 'Latest Model Vehicles',
+];
+
+// ----------------------------------------------------------------------
+
+export default function MarketingServices() {
+ return (
+
+
+
+
+
+
+
+
+ Offline SEO
+
+
+ Aenean commodo ligula eget dolor. Sed hendrerit. Vestibulum ante ipsum primis in
+ faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer
+ lacinia.
+
+
+
+ {LISTS.map((text) => (
+
+
+ {text}
+
+ ))}
+
+
+
+ }
+ >
+ Check Our Work
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_marketing/team/marketing-team-about.jsx b/template/src/sections/_marketing/team/marketing-team-about.jsx
new file mode 100644
index 0000000..375c805
--- /dev/null
+++ b/template/src/sections/_marketing/team/marketing-team-about.jsx
@@ -0,0 +1,58 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import MarketingTeamItem from './marketing-team-item';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingTeamAbout({ members }) {
+ return (
+
+
+ Great Team Is The Key
+
+
+
+ Since wire-frame renderings are relatively simple and fast to calculate, they are often used
+ in cases
+
+
+
+ {members.map((member) => (
+
+ ))}
+
+
+ );
+}
+
+MarketingTeamAbout.propTypes = {
+ members: PropTypes.array,
+};
diff --git a/template/src/sections/_marketing/team/marketing-team-item.jsx b/template/src/sections/_marketing/team/marketing-team-item.jsx
new file mode 100644
index 0000000..933d400
--- /dev/null
+++ b/template/src/sections/_marketing/team/marketing-team-item.jsx
@@ -0,0 +1,88 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import { alpha, styled } from '@mui/material/styles';
+
+import { _socials } from 'src/_mock';
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import { varHover, varTranHover } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+const StyledOverlay = styled('div')(({ theme }) => ({
+ ...bgGradient({
+ startColor: `${alpha(theme.palette.common.black, 0)} 0%`,
+ endColor: `${theme.palette.common.black} 75%`,
+ }),
+ top: 0,
+ left: 0,
+ zIndex: 8,
+ opacity: 0,
+ width: '100%',
+ height: '100%',
+ position: 'absolute',
+ transition: theme.transitions.create('opacity', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.short,
+ }),
+ '&:hover': { opacity: 1 },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function MarketingTeamItem({ member, ...other }) {
+ const { name, role, photo } = member;
+
+ return (
+
+
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+ {name}
+
+
+ {role}
+
+
+
+ );
+}
+
+MarketingTeamItem.propTypes = {
+ member: PropTypes.shape({
+ name: PropTypes.string,
+ photo: PropTypes.string,
+ role: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_marketing/team/marketing-team.jsx b/template/src/sections/_marketing/team/marketing-team.jsx
new file mode 100644
index 0000000..71a2e94
--- /dev/null
+++ b/template/src/sections/_marketing/team/marketing-team.jsx
@@ -0,0 +1,148 @@
+import { useRef } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+import { useBoundingClientRect } from 'src/hooks/use-bounding-client-rect';
+
+import { bgGradient } from 'src/theme/css';
+
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import MarketingTeamItem from './marketing-team-item';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingTeam({ members }) {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ dots: !mdUp,
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ ...CarouselDots({
+ sx: {
+ mt: 8,
+ },
+ }),
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.xl,
+ settings: { slidesToShow: 3 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.lg,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 1 },
+ },
+ ],
+ });
+
+ const containerRef = useRef(null);
+
+ const container = useBoundingClientRect(containerRef);
+
+ const offsetLeft = container?.left;
+
+ return (
+
+
+
+
+
+
+ Team
+
+
+
+ Meet Our Team
+
+
+
+ Since wire-frame renderings are relatively simple and fast to calculate, they are
+ often used in cases
+
+
+
+
+
+
+
+
+
+ {mdUp && (
+
+ )}
+
+
+
+
+ {members.map((member) => (
+
+
+
+ ))}
+
+
+
+ );
+}
+
+MarketingTeam.propTypes = {
+ members: PropTypes.array,
+};
diff --git a/template/src/sections/_marketing/testimonial/marketing-testimonial-item.jsx b/template/src/sections/_marketing/testimonial/marketing-testimonial-item.jsx
new file mode 100644
index 0000000..c57e541
--- /dev/null
+++ b/template/src/sections/_marketing/testimonial/marketing-testimonial-item.jsx
@@ -0,0 +1,59 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Typography from '@mui/material/Typography';
+
+// ----------------------------------------------------------------------
+
+export default function TestimonialItem({ testimonial, ...other }) {
+ return (
+
+
+ {testimonial.review}
+
+
+
+
+
+
+ {testimonial.name}
+
+
+
+ {testimonial.role}
+
+
+
+ );
+}
+
+TestimonialItem.propTypes = {
+ testimonial: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ review: PropTypes.string,
+ role: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_marketing/testimonial/marketing-testimonial.jsx b/template/src/sections/_marketing/testimonial/marketing-testimonial.jsx
new file mode 100644
index 0000000..3ac1a16
--- /dev/null
+++ b/template/src/sections/_marketing/testimonial/marketing-testimonial.jsx
@@ -0,0 +1,75 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import TestimonialItem from './marketing-testimonial-item';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingTestimonial({ testimonials }) {
+ const carousel = useCarousel({
+ autoplay: true,
+ autoplaySpeed: 5000,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ ...CarouselDots({
+ sx: {
+ mt: { xs: 8, md: 10 },
+ },
+ }),
+ });
+
+ return (
+
+
+
+
+ Testimonials
+
+
+ Who Love Our Work
+
+
+
+
+
+
+ {testimonials.map((testimonial) => (
+
+ ))}
+
+
+
+
+
+
+ );
+}
+
+MarketingTestimonial.propTypes = {
+ testimonials: PropTypes.array,
+};
diff --git a/template/src/sections/_marketing/view/marketing-about-view.jsx b/template/src/sections/_marketing/view/marketing-about-view.jsx
new file mode 100644
index 0000000..2659e88
--- /dev/null
+++ b/template/src/sections/_marketing/view/marketing-about-view.jsx
@@ -0,0 +1,40 @@
+import { _members, _brandsColor, _testimonials } from 'src/_mock';
+
+import MarketingAbout from '../about/marketing-about';
+import MarketingNewsletter from '../marketing-newsletter';
+import MarketingTeamAbout from '../team/marketing-team-about';
+import MarketingAboutStory from '../about/marketing-about-story';
+import MarketingLandingFaqs from '../landing/marketing-landing-faqs';
+import MarketingAboutOurClients from '../marketing-about-our-clients';
+import MarketingTestimonial from '../testimonial/marketing-testimonial';
+import MarketingAboutOurVision from '../about/marketing-about-our-vision';
+import MarketingLandingFreeSEO from '../landing/marketing-landing-free-seo';
+import MarketingAboutCoreValues from '../about/marketing-about-core-values';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingAboutView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_marketing/view/marketing-case-studies-view.jsx b/template/src/sections/_marketing/view/marketing-case-studies-view.jsx
new file mode 100644
index 0000000..f0cf164
--- /dev/null
+++ b/template/src/sections/_marketing/view/marketing-case-studies-view.jsx
@@ -0,0 +1,46 @@
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { _caseStudies, _testimonials, _marketingPosts } from 'src/_mock';
+
+import MarketingNewsletter from '../marketing-newsletter';
+import MarketingCaseStudyList from '../list/marketing-case-study-list';
+import MarketingTestimonial from '../testimonial/marketing-testimonial';
+import MarketingLandingFreeSEO from '../landing/marketing-landing-free-seo';
+import BlogMarketingLatestPosts from '../../blog/marketing/marketing-latest-posts';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingCaseStudiesView() {
+ return (
+ <>
+
+
+ Our Case Studies
+
+
+ Nullam tincidunt adipiscing enim.
+ Mauris sollicitudin fermentum libero.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_marketing/view/marketing-case-study-view.jsx b/template/src/sections/_marketing/view/marketing-case-study-view.jsx
new file mode 100644
index 0000000..8d108fe
--- /dev/null
+++ b/template/src/sections/_marketing/view/marketing-case-study-view.jsx
@@ -0,0 +1,65 @@
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+
+import { paths } from 'src/routes/paths';
+
+import { _caseStudies, _testimonials } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Markdown from 'src/components/markdown';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import MarketingNewsletter from '../marketing-newsletter';
+import MarketingTestimonial from '../testimonial/marketing-testimonial';
+import MarketingLandingFreeSEO from '../landing/marketing-landing-free-seo';
+import MarketingCaseStudyListSimilar from '../list/marketing-case-study-list-similar';
+import MarketingCaseStudyDetailsGallery from '../details/marketing-case-study-details-gallery';
+import MarketingCaseStudyDetailsSummary from '../details/marketing-case-study-details-summary';
+
+// ----------------------------------------------------------------------
+
+const _mockCaseStudy = _caseStudies[0];
+
+export default function MarketingCaseStudyView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_marketing/view/marketing-contact-view.jsx b/template/src/sections/_marketing/view/marketing-contact-view.jsx
new file mode 100644
index 0000000..8acc7cc
--- /dev/null
+++ b/template/src/sections/_marketing/view/marketing-contact-view.jsx
@@ -0,0 +1,47 @@
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import MarketingNewsletter from '../marketing-newsletter';
+import MarketingContactInfo from '../contact/marketing-contact-info';
+import MarketingContactForm from '../contact/marketing-contact-form';
+import MarketingLandingFreeSEO from '../landing/marketing-landing-free-seo';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingContactView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+ Ready To Get Started?
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_marketing/view/marketing-landing-view.jsx b/template/src/sections/_marketing/view/marketing-landing-view.jsx
new file mode 100644
index 0000000..67695e7
--- /dev/null
+++ b/template/src/sections/_marketing/view/marketing-landing-view.jsx
@@ -0,0 +1,56 @@
+import {
+ _brands,
+ _members,
+ _caseStudies,
+ _testimonials,
+ _marketingPosts,
+ _pricingMarketing,
+} from 'src/_mock';
+
+import MarketingTeam from '../team/marketing-team';
+import MarketingNewsletter from '../marketing-newsletter';
+import MarketingOurClients from '../marketing-our-clients';
+import MarketingLandingHero from '../landing/marketing-landing-hero';
+import MarketingLandingFaqs from '../landing/marketing-landing-faqs';
+import MarketingLandingAbout from '../landing/marketing-landing-about';
+import MarketingTestimonial from '../testimonial/marketing-testimonial';
+import PricingMarketing from '../../pricing/marketing/pricing-marketing';
+import MarketingLandingProcess from '../landing/marketing-landing-process';
+import MarketingLandingFreeSEO from '../landing/marketing-landing-free-seo';
+import MarketingLandingServices from '../landing/marketing-landing-services';
+import BlogMarketingLatestPosts from '../../blog/marketing/marketing-latest-posts';
+import MarketingLandingCaseStudies from '../landing/marketing-landing-case-studies';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLandingView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_marketing/view/marketing-post-view.jsx b/template/src/sections/_marketing/view/marketing-post-view.jsx
new file mode 100644
index 0000000..8eb1964
--- /dev/null
+++ b/template/src/sections/_marketing/view/marketing-post-view.jsx
@@ -0,0 +1,162 @@
+import { useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Divider from '@mui/material/Divider';
+import Popover from '@mui/material/Popover';
+import Checkbox from '@mui/material/Checkbox';
+import MenuItem from '@mui/material/MenuItem';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+
+import { paths } from 'src/routes/paths';
+
+import { fDate } from 'src/utils/format-time';
+
+import { _socials, _marketingPosts } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import Markdown from 'src/components/markdown';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import PostTags from '../../blog/common/post-tags';
+import PostAuthor from '../../blog/common/post-author';
+import MarketingNewsletter from '../marketing-newsletter';
+import PostSocialsShare from '../../blog/common/post-socials-share';
+import MarketingLandingFreeSEO from '../landing/marketing-landing-free-seo';
+import BlogMarketingLatestPosts from '../../blog/marketing/marketing-latest-posts';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingPostView() {
+ const { title, description, duration, createdAt, author, favorited, heroUrl, tags, content } =
+ _marketingPosts[0];
+
+ const [favorite, setFavorite] = useState(favorited);
+
+ const [open, setOpen] = useState(null);
+
+ const handleOpen = useCallback((event) => {
+ setOpen(event.currentTarget);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(null);
+ }, []);
+
+ const handleChangeFavorite = useCallback((event) => {
+ setFavorite(event.target.checked);
+ }, []);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {duration}
+
+
+
+ {title}
+
+ {description}
+
+
+
+
+
+
+
+ {author.name}
+
+ {fDate(createdAt, 'dd/MM/yyyy p')}
+
+
+
+
+
+
+
+
+ }
+ checkedIcon={ }
+ />
+
+
+
+
+
+
+
+ {tags.length && }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {_socials.map((social) => (
+
+
+ Share via {social.label}
+
+ ))}
+
+ >
+ );
+}
diff --git a/template/src/sections/_marketing/view/marketing-posts-view.jsx b/template/src/sections/_marketing/view/marketing-posts-view.jsx
new file mode 100644
index 0000000..9534d72
--- /dev/null
+++ b/template/src/sections/_marketing/view/marketing-posts-view.jsx
@@ -0,0 +1,52 @@
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+
+import { _tags, _mock, _categories, _marketingPosts } from 'src/_mock';
+
+import PostSidebar from '../../blog/common/post-sidebar';
+import MarketingNewsletter from '../marketing-newsletter';
+import PostSearchMobile from '../../blog/common/post-search-mobile';
+import BlogMarketingPosts from '../../blog/marketing/marketing-posts';
+import MarketingLandingFreeSEO from '../landing/marketing-landing-free-seo';
+import BlogMarketingFeaturedPosts from '../../blog/marketing/marketing-featured-posts';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingPostsView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_marketing/view/marketing-services-view.jsx b/template/src/sections/_marketing/view/marketing-services-view.jsx
new file mode 100644
index 0000000..a5d4617
--- /dev/null
+++ b/template/src/sections/_marketing/view/marketing-services-view.jsx
@@ -0,0 +1,37 @@
+import { _testimonials, _marketingPosts } from 'src/_mock';
+
+import MarketingNewsletter from '../marketing-newsletter';
+import MarketingServices from '../services/marketing-services';
+import MarketingServicesHero from '../services/marketing-services-hero';
+import MarketingTestimonial from '../testimonial/marketing-testimonial';
+import MarketingLandingFreeSEO from '../landing/marketing-landing-free-seo';
+import MarketingServicesInclude from '../services/marketing-services-include';
+import MarketingServicesBenefits from '../services/marketing-services-benefits';
+import BlogMarketingLatestPosts from '../../blog/marketing/marketing-latest-posts';
+import MarketingServicesHowItWork from '../services/marketing-services-how-it-work';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingServicesView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_travel/about/travel-about-our-mission.jsx b/template/src/sections/_travel/about/travel-about-our-mission.jsx
new file mode 100644
index 0000000..7c7a210
--- /dev/null
+++ b/template/src/sections/_travel/about/travel-about-our-mission.jsx
@@ -0,0 +1,118 @@
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+const VISIONS = [
+ {
+ name: 'Vestibulum',
+ description: 'In dui magna, posuere eget, vestibulum et, tempor auctor, justo.',
+ },
+ {
+ name: 'Fusce',
+ description: 'Donec elit libero, sodales nec, volutpat a, suscipit non, turpis.',
+ },
+ { name: 'Praesent', description: 'Suspendisse feugiat. Quisque id odio.' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function TravelAboutOurVision() {
+ return (
+
+
+ Our Mission
+
+
+ Curabitur ullamcorper ultricies nisi. Aenean viverra rhoncus pede.
+
+
+
+
+
+
+
+
+
+
+ {VISIONS.map((vision, index) => {
+ const { name, description } = vision;
+
+ const firstVision = index === 0;
+
+ const secondVision = index === 1;
+
+ const thirdVision = index === 2;
+
+ return (
+ ({ md: theme.customShadows.z24 }),
+ }),
+ ...(thirdVision && {
+ boxShadow: { md: 0 },
+ }),
+ }}
+ >
+
+ {`0${index + 1}`}
+
+
+
+ {name}
+
+
+ {description}
+
+ );
+ })}
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_travel/about/travel-about.jsx b/template/src/sections/_travel/about/travel-about.jsx
new file mode 100644
index 0000000..9571b11
--- /dev/null
+++ b/template/src/sections/_travel/about/travel-about.jsx
@@ -0,0 +1,145 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import { _mock } from 'src/_mock';
+
+import Image from 'src/components/image';
+import CountUp from 'src/components/count-up';
+
+// ----------------------------------------------------------------------
+
+const IMAGES = [...Array(4)].map((_, index) => _mock.image.travel(index + 2));
+
+const SUMMARY = [
+ { name: 'Air tickets sold', number: 130 },
+ { name: 'Tours booked', number: 196 },
+ { name: 'Site visitors', number: 10679 },
+ { name: 'Verified hotels', number: 877 },
+];
+
+// ----------------------------------------------------------------------
+
+export default function TravelAbout() {
+ const smUp = useResponsive('up', 'sm');
+
+ return (
+
+
+ About us
+
+
+ Master Digital Marketing Strategy, Social Media Marketing, SEO, YouTube, Email, Facebook
+ Marketing, Analytics & More!
+
+
+
+
+ {(smUp ? IMAGES : IMAGES.slice(0, 1)).map((img, index) => (
+
+
+
+ ))}
+
+
+
+ {SUMMARY.map((value) => (
+
+
+ fShortenNumber(newValue)}
+ />
+
+
+ +
+
+
+
+
+ {value.name}
+
+
+ ))}
+
+
+
+
+
+
+ Maecenas malesuada. Cras ultricies mi eu turpis hendrerit fringilla Nunc egestas
+
+
+
+
+
+ Fusce convallis metus id felis luctus
+
+
+
+ Fusce convallis metus id felis luctus adipiscing. Etiam imperdiet imperdiet orci.
+ Vestibulum eu odio. Phasellus nec sem in justo pellentesque facilisis.
+
+
+ Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. Maecenas nec odio et
+ ante tincidunt tempus. Suspendisse enim turpis, dictum sed, iaculis a, condimentum nec,
+ nisi. Vestibulum eu odio. Curabitur ullamcorper ultricies nisi.
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_travel/checkout/travel-check-out-payment-form.jsx b/template/src/sections/_travel/checkout/travel-check-out-payment-form.jsx
new file mode 100644
index 0000000..f205dc1
--- /dev/null
+++ b/template/src/sections/_travel/checkout/travel-check-out-payment-form.jsx
@@ -0,0 +1,168 @@
+import PropTypes from 'prop-types';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import Box from '@mui/material/Box';
+import Radio from '@mui/material/Radio';
+import Stack from '@mui/material/Stack';
+import { alpha } from '@mui/material/styles';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel, { formControlLabelClasses } from '@mui/material/FormControlLabel';
+
+import Iconify from 'src/components/iconify';
+import { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+const PAYMENT_OPTIONS = [
+ {
+ label: 'Paypal',
+ value: 'paypal',
+ description: 'You will be redirected to PayPal website to complete your purchase securely.',
+ },
+ {
+ label: 'Credit / Debit',
+ value: 'creditcard',
+ description: 'We support Mastercard, Visa, Discover and Stripe.',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function TravelCheckOutPaymentForm() {
+ const { control } = useFormContext();
+
+ return (
+ (
+
+
+ {PAYMENT_OPTIONS.map((option, index) => (
+
+ ))}
+
+
+ )}
+ />
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function OptionItem({ option, isCredit, selected }) {
+ const { value, label, description } = option;
+
+ const renderLabel = (
+
+
+
+ {label}
+
+
+
+ {description}
+
+
+
+
+ {value === 'creditcard' ? (
+ <>
+
+
+ >
+ ) : (
+
+ )}
+
+
+ );
+
+ return (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ ...(selected && {
+ boxShadow: (theme) => `0 0 0 2px ${theme.palette.text.primary}`,
+ }),
+ }}
+ >
+ }
+ sx={{ mx: 1 }}
+ />
+ }
+ label={renderLabel}
+ sx={{
+ m: 0,
+ py: 2,
+ pr: 2.5,
+ width: 1,
+ [`& .${formControlLabelClasses.label}`]: {
+ width: 1,
+ },
+ }}
+ />
+
+ {isCredit && }
+
+ );
+}
+
+OptionItem.propTypes = {
+ isCredit: PropTypes.bool,
+ option: PropTypes.shape({
+ label: PropTypes.string,
+ value: PropTypes.string,
+ description: PropTypes.string,
+ }),
+ selected: PropTypes.bool,
+};
+
+// ----------------------------------------------------------------------
+
+function NewCardForm() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ Your transaction is secured with SSL encryption
+
+
+ );
+}
diff --git a/template/src/sections/_travel/checkout/travel-check-out-shipping-form.jsx b/template/src/sections/_travel/checkout/travel-check-out-shipping-form.jsx
new file mode 100644
index 0000000..9073026
--- /dev/null
+++ b/template/src/sections/_travel/checkout/travel-check-out-shipping-form.jsx
@@ -0,0 +1,72 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Switch from '@mui/material/Switch';
+import Collapse from '@mui/material/Collapse';
+import Typography from '@mui/material/Typography';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+import { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function TravelCheckOutShippingForm({ sameBilling, onChangeSameBilling }) {
+ return (
+
+
+
+ Billing Address
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Shipping Address
+
+ }
+ label="Same as Billing Address"
+ labelPlacement="start"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+TravelCheckOutShippingForm.propTypes = {
+ onChangeSameBilling: PropTypes.func,
+ sameBilling: PropTypes.bool,
+};
diff --git a/template/src/sections/_travel/checkout/travel-check-out-summary.jsx b/template/src/sections/_travel/checkout/travel-check-out-summary.jsx
new file mode 100644
index 0000000..1627eb1
--- /dev/null
+++ b/template/src/sections/_travel/checkout/travel-check-out-summary.jsx
@@ -0,0 +1,208 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+import { inputBaseClasses } from '@mui/material/InputBase';
+import { inputAdornmentClasses } from '@mui/material/InputAdornment';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fCurrency, fShortenNumber } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+import FilterTime from '../filters/filter-time';
+import FilterGuests from '../filters/filter-guests';
+
+// ----------------------------------------------------------------------
+
+export default function TravelCheckOutSummary({
+ tour,
+ guests,
+ departureDay,
+ isSubmitting,
+ onDecreaseGuests,
+ onIncrementGuests,
+ onChangeDepartureDay,
+}) {
+ const smUp = useResponsive('up', 'sm');
+
+ const { coverUrl, slug, ratingNumber, totalReviews, price, tourGuide } = tour;
+
+ return (
+
+
+
+
+
+
+ {slug}
+
+
+
+
+
+
+ {Number.isInteger(ratingNumber) ? `${ratingNumber}.0` : ratingNumber}
+
+
+ {totalReviews && (
+
+ ({fShortenNumber(totalReviews)} reviews)
+
+ )}
+
+
+
+
+
+
+
+
+
+ Tour guide by
+
+
+ {tourGuide.name}
+
+
+
+
+
+
+
+
+
+
+
+ Departure day
+
+
+
+
+
+ {smUp && }
+
+
+
+
+
+ Guests
+
+
+
+
+
+
+
+
+ Service charge
+
+ {fCurrency(price)}
+
+
+
+
+ Discount
+
+ -
+
+
+
+
+
+
+
+ Total
+ {fCurrency(price)}
+
+
+
+ Complete Booking
+
+
+
+ );
+}
+
+TravelCheckOutSummary.propTypes = {
+ isSubmitting: PropTypes.bool,
+ onDecreaseGuests: PropTypes.func,
+ onIncrementGuests: PropTypes.func,
+ onChangeDepartureDay: PropTypes.func,
+ departureDay: PropTypes.instanceOf(Date),
+ guests: PropTypes.shape({
+ adults: PropTypes.number,
+ children: PropTypes.number,
+ }),
+ tour: PropTypes.shape({
+ slug: PropTypes.string,
+ price: PropTypes.number,
+ coverUrl: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ totalReviews: PropTypes.number,
+ tourGuide: PropTypes.shape({
+ name: PropTypes.string,
+ avatarUrl: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/_travel/contact/travel-contact-form.jsx b/template/src/sections/_travel/contact/travel-contact-form.jsx
new file mode 100644
index 0000000..b94a614
--- /dev/null
+++ b/template/src/sections/_travel/contact/travel-contact-form.jsx
@@ -0,0 +1,114 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function TravelContactForm() {
+ const mdUp = useResponsive('up', 'md');
+
+ const TravelContactSchema = Yup.object().shape({
+ fullName: Yup.string().required('Full name is required'),
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ subject: Yup.string().required('Subject is required'),
+ message: Yup.string().required('Message is required'),
+ });
+
+ const defaultValues = {
+ fullName: '',
+ subject: '',
+ email: '',
+ message: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(TravelContactSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ console.log('DATA', data);
+ reset();
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ return (
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+
+ Drop Us A Line
+
+
+ We normally respond within 2 business days
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Request
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_travel/contact/travel-contact-info.jsx b/template/src/sections/_travel/contact/travel-contact-info.jsx
new file mode 100644
index 0000000..3cd5636
--- /dev/null
+++ b/template/src/sections/_travel/contact/travel-contact-info.jsx
@@ -0,0 +1,137 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { _offices } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import { varHover, varTranHover } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function TravelContactInfo() {
+ return (
+ <>
+
+
+ We Work
+ Worldwide.
+
+
+
+ {`We'd love to talk about how we can help you.`}
+
+
+
+
+
+
+ {_offices.map((office) => (
+
+ ))}
+
+
+
+ >
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function OfficeCard({ office }) {
+ const { country, address, photo, email, phoneNumber } = office;
+
+ return (
+ theme.customShadows.z24,
+ },
+ }}
+ >
+
+
+
+
+
+
+
+
+ {country}
+
+
+
+
+ Address
+
+
+
+
+
+ {address}
+
+
+
+
+
+ Phone
+
+
+ {phoneNumber}
+
+
+
+
+
+ Email
+
+
+ {email}
+
+
+
+
+ );
+}
+
+OfficeCard.propTypes = {
+ office: PropTypes.shape({
+ address: PropTypes.string,
+ country: PropTypes.string,
+ email: PropTypes.string,
+ phoneNumber: PropTypes.string,
+ photo: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_travel/details/travel-tour-details-gallery.jsx b/template/src/sections/_travel/details/travel-tour-details-gallery.jsx
new file mode 100644
index 0000000..408d253
--- /dev/null
+++ b/template/src/sections/_travel/details/travel-tour-details-gallery.jsx
@@ -0,0 +1,90 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+
+import Image from 'src/components/image';
+import { varTranHover } from 'src/components/animate';
+import Lightbox, { useLightbox } from 'src/components/lightbox';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourDetailsGallery({ images }) {
+ const slides = images.map((slide) => ({
+ src: slide,
+ }));
+
+ const lightbox = useLightbox(slides);
+
+ return (
+ <>
+
+ lightbox.onOpen(slides[0].src)} />
+
+
+ {slides.slice(1, 5).map((slide) => (
+ lightbox.onOpen(slide.src)}
+ />
+ ))}
+
+
+
+
+ >
+ );
+}
+
+TravelTourDetailsGallery.propTypes = {
+ images: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function PhotoItem({ photo, onOpenLightbox }) {
+ return (
+
+
+
+ );
+}
+
+PhotoItem.propTypes = {
+ onOpenLightbox: PropTypes.func,
+ photo: PropTypes.string,
+};
diff --git a/template/src/sections/_travel/details/travel-tour-details-header.jsx b/template/src/sections/_travel/details/travel-tour-details-header.jsx
new file mode 100644
index 0000000..70f00f8
--- /dev/null
+++ b/template/src/sections/_travel/details/travel-tour-details-header.jsx
@@ -0,0 +1,134 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Popover from '@mui/material/Popover';
+import Checkbox from '@mui/material/Checkbox';
+import MenuItem from '@mui/material/MenuItem';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import { _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourDetailsHeader({ tour }) {
+ const { slug, ratingNumber, totalReviews, location, favorited, tourGuide } = tour;
+
+ const [favorite, setFavorite] = useState(favorited);
+
+ const [open, setOpen] = useState(null);
+
+ const handleOpen = useCallback((event) => {
+ setOpen(event.currentTarget);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(null);
+ }, []);
+
+ const handleChangeFavorite = useCallback((event) => {
+ setFavorite(event.target.checked);
+ }, []);
+
+ return (
+ <>
+
+
+ {slug}
+
+
+
+
+
+
+
+ }
+ checkedIcon={ }
+ />
+
+
+
+
+
+
+
+
+ {Number.isInteger(ratingNumber) ? `${ratingNumber}.0` : ratingNumber}
+
+
+
+ ({fShortenNumber(totalReviews)} reviews)
+
+
+
+
+ {location}
+
+
+
+
+
+
+ Tour guide by
+
+
+
+ {tourGuide?.name}
+
+
+
+
+
+ {_socials.map((social) => (
+
+
+ Share via {social.label}
+
+ ))}
+
+ >
+ );
+}
+
+TravelTourDetailsHeader.propTypes = {
+ tour: PropTypes.shape({
+ favorited: PropTypes.bool,
+ location: PropTypes.string,
+ slug: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ totalReviews: PropTypes.number,
+ tourGuide: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/_travel/details/travel-tour-details-reserve-form.jsx b/template/src/sections/_travel/details/travel-tour-details-reserve-form.jsx
new file mode 100644
index 0000000..d97ccc0
--- /dev/null
+++ b/template/src/sections/_travel/details/travel-tour-details-reserve-form.jsx
@@ -0,0 +1,143 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { useRouter } from 'src/routes/hooks';
+
+import { fCurrency } from 'src/utils/format-number';
+
+import FilterTime from '../filters/filter-time';
+import FilterGuests from '../filters/filter-guests';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourDetailsReserveForm({ tour }) {
+ const router = useRouter();
+
+ const [departureDay, setDepartureDay] = useState(null);
+
+ const [guests, setGuests] = useState({
+ adults: 0,
+ children: 0,
+ });
+
+ const { price, priceSale } = tour;
+
+ const handleChangeDepartureDay = useCallback((newValue) => {
+ setDepartureDay(newValue);
+ }, []);
+
+ const handleIncrementGuests = useCallback(
+ (guest) => {
+ if (guest === 'children') {
+ setGuests({ ...guests, children: guests.children + 1 });
+ } else {
+ setGuests({ ...guests, adults: guests.adults + 1 });
+ }
+ },
+ [guests]
+ );
+
+ const handleDecreaseGuests = useCallback(
+ (guest) => {
+ if (guest === 'children') {
+ setGuests({ ...guests, children: guests.children - 1 });
+ } else {
+ setGuests({ ...guests, adults: guests.adults - 1 });
+ }
+ },
+ [guests]
+ );
+
+ const handleClickReserve = useCallback(() => {
+ router.push(paths.travel.checkout);
+ }, [router]);
+
+ return (
+
+
+
+ {priceSale > 0 && (
+
+ {fCurrency(priceSale)}
+
+ )}
+
+ {fCurrency(price)}
+
+ /Tour
+
+
+
+
+ alpha(theme.palette.grey[500], 0.08),
+ }}
+ />
+
+ alpha(theme.palette.grey[500], 0.08),
+ }}
+ >
+
+
+
+
+
+
+ Service charge
+
+ {fCurrency(priceSale) || '-'}
+
+
+
+
+ Discount
+
+ -
+
+
+
+
+
+
+
+ Total
+ {fCurrency(priceSale)}
+
+
+
+ Reserve
+
+
+
+ );
+}
+
+TravelTourDetailsReserveForm.propTypes = {
+ tour: PropTypes.shape({
+ price: PropTypes.number,
+ priceSale: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_travel/details/travel-tour-details-summary.jsx b/template/src/sections/_travel/details/travel-tour-details-summary.jsx
new file mode 100644
index 0000000..4f69d9a
--- /dev/null
+++ b/template/src/sections/_travel/details/travel-tour-details-summary.jsx
@@ -0,0 +1,197 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+
+import { fDate } from 'src/utils/format-time';
+
+import { TOUR_SERVICE_OPTIONS } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourDetailsSummary({ tour }) {
+ const {
+ program,
+ services,
+ location,
+ duration,
+ tourGuide,
+ languages,
+ highlights,
+ description,
+ available,
+ } = tour;
+
+ return (
+
+
+ Tour Overview
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tour Description
+ {description}
+
+
+
+ Tour Highlights
+
+
+ {highlights.map((highlight) => (
+ {highlight}
+ ))}
+
+
+
+
+ Services
+
+
+ {TOUR_SERVICE_OPTIONS.map((service) => (
+
+
+ {service.label}
+
+ ))}
+
+
+
+
+ Tour Program
+ {program.map((content) => (
+
+ ))}
+
+
+ );
+}
+
+TravelTourDetailsSummary.propTypes = {
+ tour: PropTypes.shape({
+ program: PropTypes.array,
+ services: PropTypes.array,
+ duration: PropTypes.string,
+ languages: PropTypes.array,
+ location: PropTypes.string,
+ highlights: PropTypes.array,
+ description: PropTypes.string,
+ tourGuide: PropTypes.shape({
+ name: PropTypes.string,
+ phoneNumber: PropTypes.string,
+ }),
+ available: PropTypes.shape({
+ end: PropTypes.instanceOf(Date),
+ start: PropTypes.instanceOf(Date),
+ }),
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+function OverviewItem({ icon, label, text = '-' }) {
+ return (
+
+
+
+
+ {label}
+
+ {text}
+
+
+ );
+}
+
+OverviewItem.propTypes = {
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ label: PropTypes.string,
+ text: PropTypes.string,
+};
+
+// ----------------------------------------------------------------------
+
+function HighlightItem({ label, text }) {
+ return (
+
+
+
+ {label}
+
+ {text}
+
+ );
+}
+
+HighlightItem.propTypes = {
+ label: PropTypes.string,
+ text: PropTypes.string,
+};
diff --git a/template/src/sections/_travel/filters/filter-guests.jsx b/template/src/sections/_travel/filters/filter-guests.jsx
new file mode 100644
index 0000000..a2f9a43
--- /dev/null
+++ b/template/src/sections/_travel/filters/filter-guests.jsx
@@ -0,0 +1,148 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Popover from '@mui/material/Popover';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+import InputBase, { inputBaseClasses } from '@mui/material/InputBase';
+import IconButton, { iconButtonClasses } from '@mui/material/IconButton';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function FilterGuests({
+ guests,
+ onIncrementGuests,
+ onDecreaseGuests,
+ sx,
+ ...other
+}) {
+ const totalGuests = guests.children + guests.adults;
+
+ const [open, setOpen] = useState(null);
+
+ const handleOpen = useCallback((event) => {
+ setOpen(event.currentTarget);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(null);
+ }, []);
+
+ return (
+ <>
+ 0 ? `${totalGuests} Guests` : ''}
+ placeholder="Guests"
+ startAdornment={
+
+
+
+ }
+ onClick={handleOpen}
+ sx={{
+ height: 52,
+ [`& .${inputBaseClasses.input}`]: {
+ typography: 'subtitle1',
+ },
+ ...sx,
+ }}
+ {...other}
+ />
+
+
+ }>
+
+
+ onDecreaseGuests('children')}
+ onIncrement={() => onIncrementGuests('children')}
+ />
+
+
+ >
+ );
+}
+
+FilterGuests.propTypes = {
+ guests: PropTypes.shape({
+ adults: PropTypes.number,
+ children: PropTypes.number,
+ }),
+ onDecreaseGuests: PropTypes.func,
+ onIncrementGuests: PropTypes.func,
+ sx: PropTypes.object,
+};
+
+// ----------------------------------------------------------------------
+
+function Input({ title, caption, total, onDecrease, onIncrement }) {
+ return (
+
+
+ {title}
+
+ {caption}
+
+
+
+
+
+
+
+
+ {total}
+
+
+
+
+
+
+ );
+}
+
+Input.propTypes = {
+ caption: PropTypes.string,
+ onDecrease: PropTypes.func,
+ onIncrement: PropTypes.func,
+ title: PropTypes.string,
+ total: PropTypes.number,
+};
diff --git a/template/src/sections/_travel/filters/filter-location.jsx b/template/src/sections/_travel/filters/filter-location.jsx
new file mode 100644
index 0000000..7e6e43c
--- /dev/null
+++ b/template/src/sections/_travel/filters/filter-location.jsx
@@ -0,0 +1,34 @@
+import { filledInputClasses } from '@mui/material/FilledInput';
+
+import { countries } from 'src/assets/data';
+
+import CountrySelect from 'src/components/country-select';
+
+// ----------------------------------------------------------------------
+
+export default function FilterLocation() {
+ return (
+ option.label)}
+ getOptionLabel={(option) => option}
+ sx={{
+ [`& .${filledInputClasses.root}`]: {
+ bgcolor: 'transparent',
+ '&:hover': {
+ bgcolor: 'transparent',
+ },
+ [`&.${filledInputClasses.focused}`]: {
+ bgcolor: 'transparent',
+ },
+ },
+ [`& .${filledInputClasses.input}`]: {
+ typography: 'subtitle1',
+ },
+ }}
+ />
+ );
+}
diff --git a/template/src/sections/_travel/filters/filter-time.jsx b/template/src/sections/_travel/filters/filter-time.jsx
new file mode 100644
index 0000000..3de7c45
--- /dev/null
+++ b/template/src/sections/_travel/filters/filter-time.jsx
@@ -0,0 +1,46 @@
+import PropTypes from 'prop-types';
+
+import InputAdornment from '@mui/material/InputAdornment';
+import { inputBaseClasses } from '@mui/material/InputBase';
+import { MobileDatePicker } from '@mui/x-date-pickers/MobileDatePicker';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function FilterTime({ departureDay, onChangeDepartureDay, sx }) {
+ return (
+
+
+
+ ),
+ },
+ sx: {
+ [`& .${inputBaseClasses.input}`]: {
+ py: 0,
+ height: 52,
+ typography: 'subtitle1',
+ },
+ ...sx,
+ },
+ },
+ }}
+ />
+ );
+}
+
+FilterTime.propTypes = {
+ departureDay: PropTypes.instanceOf(Date),
+ onChangeDepartureDay: PropTypes.func,
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_travel/filters/travel-filters.jsx b/template/src/sections/_travel/filters/travel-filters.jsx
new file mode 100644
index 0000000..a5ef7f7
--- /dev/null
+++ b/template/src/sections/_travel/filters/travel-filters.jsx
@@ -0,0 +1,90 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+
+import Iconify from 'src/components/iconify';
+
+import FilterTime from './filter-time';
+import FilterGuests from './filter-guests';
+import FilterLocation from './filter-location';
+
+// ----------------------------------------------------------------------
+
+export default function TravelFilters({ sx, ...other }) {
+ const [departureDay, setDepartureDay] = useState(null);
+
+ const [guests, setGuests] = useState({
+ adults: 0,
+ children: 0,
+ });
+
+ const handleChangeDepartureDay = useCallback((newValue) => {
+ setDepartureDay(newValue);
+ }, []);
+
+ const handleIncrementGuests = useCallback(
+ (guest) => {
+ if (guest === 'children') {
+ setGuests({ ...guests, children: guests.children + 1 });
+ } else {
+ setGuests({ ...guests, adults: guests.adults + 1 });
+ }
+ },
+ [guests]
+ );
+
+ const handleDecreaseGuests = useCallback(
+ (guest) => {
+ if (guest === 'children') {
+ setGuests({ ...guests, children: guests.children - 1 });
+ } else {
+ setGuests({ ...guests, adults: guests.adults - 1 });
+ }
+ },
+ [guests]
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+TravelFilters.propTypes = {
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/_travel/landing/travel-landing-favorite-destinations.jsx b/template/src/sections/_travel/landing/travel-landing-favorite-destinations.jsx
new file mode 100644
index 0000000..5b0356f
--- /dev/null
+++ b/template/src/sections/_travel/landing/travel-landing-favorite-destinations.jsx
@@ -0,0 +1,155 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+const ROWS = [
+ 'First Class Flights',
+ '5 Star Accommodations',
+ 'Inclusive Packages',
+ 'Latest Model Vehicles',
+ 'Handpicked Hotels',
+ 'Accesibility managment',
+];
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingFavoriteDestinations({ tours }) {
+ return (
+
+
+
+ Our Favorite Destinations
+
+
+ Since wire-frame renderings are relatively simple and fast to calculate, they are often
+ used in cases
+
+
+
+ {ROWS.map((line) => (
+
+
+ {line}
+
+ ))}
+
+
+
+
+ {tours.map((tour, index) => (
+
+
+
+ ))}
+
+
+
+ );
+}
+
+TravelLandingFavoriteDestinations.propTypes = {
+ tours: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function DestinationItem({ tour, order }) {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const { location, continent, coverUrl } = tour;
+
+ return (
+
+
+
+
+
+ {location}
+
+
+
+
+
+ {continent}
+
+
+
+
+ );
+}
+
+DestinationItem.propTypes = {
+ order: PropTypes.number,
+ tour: PropTypes.shape({
+ continent: PropTypes.string,
+ coverUrl: PropTypes.string,
+ location: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_travel/landing/travel-landing-hero.jsx b/template/src/sections/_travel/landing/travel-landing-hero.jsx
new file mode 100644
index 0000000..ba3b64a
--- /dev/null
+++ b/template/src/sections/_travel/landing/travel-landing-hero.jsx
@@ -0,0 +1,271 @@
+import { useEffect } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Avatar from '@mui/material/Avatar';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { fCurrency } from 'src/utils/format-number';
+
+import { bgBlur, bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+import Carousel, { useCarousel, CarouselDots } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingHero({ tours }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const carouselLarge = useCarousel({
+ speed: 500,
+ slidesToShow: 1,
+ draggable: false,
+ slidesToScroll: 1,
+ adaptiveHeight: true,
+ ...CarouselDots({
+ rounded: true,
+ sx: {
+ left: 0,
+ right: 0,
+ zIndex: 9,
+ bottom: 64,
+ position: 'absolute',
+ display: { md: 'none' },
+ },
+ }),
+ });
+
+ const carouselThumb = useCarousel({
+ vertical: true,
+ slidesToShow: 3,
+ centerMode: true,
+ slidesToScroll: 1,
+ swipeToSlide: true,
+ focusOnSelect: true,
+ centerPadding: '0px',
+ verticalSwiping: true,
+ });
+
+ useEffect(() => {
+ carouselLarge.onSetNav();
+ carouselThumb.onSetNav();
+ }, [carouselLarge, carouselThumb]);
+
+ return (
+
+ {!!tours.length && (
+
+ {tours.map((tour) => (
+
+ ))}
+
+ )}
+
+ {mdUp && (
+
+ {!!tours.length && (
+
+ {tours.map((tour, index) => (
+
+ ))}
+
+ )}
+
+ )}
+
+ );
+}
+
+TravelLandingHero.propTypes = {
+ tours: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function CarouselItem({ tour }) {
+ const theme = useTheme();
+
+ const renderOverlay = (
+
+ );
+
+ return (
+
+
+
+ {tour.location}
+
+
+
+ {tour.slug}
+
+
+
+
+
+ {tour.duration}
+
+
+
+
+ {`${tour.ratingNumber} reviews`}
+
+
+
+
+ {`Starting at ${fCurrency(tour.price)}`}
+
+
+
+
+ Book Now
+
+
+
+
+ {renderOverlay}
+
+
+
+
+ );
+}
+
+CarouselItem.propTypes = {
+ tour: PropTypes.shape({
+ duration: PropTypes.string,
+ heroUrl: PropTypes.string,
+ location: PropTypes.string,
+ price: PropTypes.number,
+ slug: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+function ThumbnailItem({ tour, selected }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+ {tour.location}
+
+
+
+
+
+ {tour.continent}
+
+
+
+
+ );
+}
+
+ThumbnailItem.propTypes = {
+ tour: PropTypes.object,
+ selected: PropTypes.bool,
+};
diff --git a/template/src/sections/_travel/landing/travel-landing-introduce.jsx b/template/src/sections/_travel/landing/travel-landing-introduce.jsx
new file mode 100644
index 0000000..4803686
--- /dev/null
+++ b/template/src/sections/_travel/landing/travel-landing-introduce.jsx
@@ -0,0 +1,163 @@
+import { useRef } from 'react';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+import { useBoundingClientRect } from 'src/hooks/use-bounding-client-rect';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import SvgColor from 'src/components/svg-color';
+
+// ----------------------------------------------------------------------
+
+const SUMMARY = [
+ {
+ title: 'Professional Tour Guides',
+ description: 'Nunc nonummy metus. Donec elit libero',
+ icon: '/assets/icons/ic_popularity.svg',
+ },
+ {
+ title: 'Customer Satisfaction',
+ description: 'Nunc nonummy metus. Donec elit libero',
+ icon: '/assets/icons/ic_reputation.svg',
+ },
+ {
+ title: 'Secure Payment',
+ description: 'Nunc nonummy metus. Donec elit libero',
+ icon: '/assets/icons/ic_secure_payment.svg',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingIntroduce() {
+ const mdUp = useResponsive('up', 'md');
+
+ const containerRef = useRef(null);
+
+ const container = useBoundingClientRect(containerRef);
+
+ const offsetLeft = container && container.left + 20;
+
+ return (
+
+
+
+ Explore A Different Way To Travel
+
+
+ Cras ultricies mi eu turpis hendrerit fringilla. Nulla consequat massa quis enim.
+
+
+
+
+
+
+
+ Device
+
+
+
+ The More Important the Work
+
+
+
+ Watch Video
+
+
+
+
+
+
+
+
+ {SUMMARY.map((value) => (
+
+
+
+ {value.title}
+
+
+ {value.description}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/template/src/sections/_travel/landing/travel-landing-summary.jsx b/template/src/sections/_travel/landing/travel-landing-summary.jsx
new file mode 100644
index 0000000..4918ac0
--- /dev/null
+++ b/template/src/sections/_travel/landing/travel-landing-summary.jsx
@@ -0,0 +1,95 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import CountUp from 'src/components/count-up';
+
+// ----------------------------------------------------------------------
+
+const SUMMARY = [
+ {
+ total: 130,
+ description: 'Air tickets sold',
+ icon: '/assets/icons/travel/ic_travel_tickets.svg',
+ },
+ {
+ total: 196,
+ description: 'Tours booked',
+ icon: '/assets/icons/travel/ic_travel_booking.svg',
+ },
+ {
+ total: 10670,
+ description: 'Site visitors',
+ icon: '/assets/icons/travel/ic_travel_site_visitors.svg',
+ },
+ {
+ total: 877,
+ description: 'Verified hotels',
+ icon: '/assets/icons/travel/ic_travel_verified_hotels.svg',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingSummary() {
+ return (
+
+
+ Fastest Way to Book over 450 Great Tours
+
+
+ Since wire-frame renderings are relatively simple and fast to calculate, they are often
+ used in cases
+
+
+
+
+ {SUMMARY.map((value) => (
+
+
+
+
+ fShortenNumber(newValue)}
+ />
+
+
+ {value.description}
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/_travel/landing/travel-landing-tour-featured.jsx b/template/src/sections/_travel/landing/travel-landing-tour-featured.jsx
new file mode 100644
index 0000000..7856ad9
--- /dev/null
+++ b/template/src/sections/_travel/landing/travel-landing-tour-featured.jsx
@@ -0,0 +1,65 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import TravelTourItem from '../list/travel-tour-item';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingTourFeatured({ tours }) {
+ return (
+
+
+ Featured Tours
+
+
+ {`Our Featured Tours can help you find the trip that's perfect for you!`}
+
+
+
+
+ {tours.map((tour) => (
+
+ ))}
+
+
+
+
+ View All Tours
+
+
+
+ );
+}
+
+TravelLandingTourFeatured.propTypes = {
+ tours: PropTypes.array,
+};
diff --git a/template/src/sections/_travel/landing/travel-landing-tours-by-city.jsx b/template/src/sections/_travel/landing/travel-landing-tours-by-city.jsx
new file mode 100644
index 0000000..49af765
--- /dev/null
+++ b/template/src/sections/_travel/landing/travel-landing-tours-by-city.jsx
@@ -0,0 +1,136 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Button from '@mui/material/Button';
+import Avatar from '@mui/material/Avatar';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingToursByCity({ tours }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const viewAllBtn = (
+ }
+ >
+ View All
+
+ );
+
+ return (
+
+
+
+ Tours By City
+
+
+ {`Our Featured Tours can help you find the trip that's perfect for you!`}
+
+
+
+ {mdUp && viewAllBtn}
+
+
+
+ {tours.map((tour) => (
+
+ ))}
+
+
+ {!mdUp && (
+
+ {viewAllBtn}
+
+ )}
+
+ );
+}
+
+TravelLandingToursByCity.propTypes = {
+ tours: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function TourItem({ tour }) {
+ const { coverUrl, location } = tour;
+
+ return (
+
+ theme.customShadows.z24,
+ bgcolor: 'background.paper',
+ },
+ }}
+ >
+
+
+
+
+
+ {location}
+
+
+
+ 196 Place
+
+
+
+
+
+ );
+}
+
+TourItem.propTypes = {
+ tour: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ location: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_travel/list/travel-tour-item-skeleton.jsx b/template/src/sections/_travel/list/travel-tour-item-skeleton.jsx
new file mode 100644
index 0000000..93c86e1
--- /dev/null
+++ b/template/src/sections/_travel/list/travel-tour-item-skeleton.jsx
@@ -0,0 +1,26 @@
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Skeleton from '@mui/material/Skeleton';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourItemSkeleton({ ...other }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_travel/list/travel-tour-item.jsx b/template/src/sections/_travel/list/travel-tour-item.jsx
new file mode 100644
index 0000000..ae73663
--- /dev/null
+++ b/template/src/sections/_travel/list/travel-tour-item.jsx
@@ -0,0 +1,131 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Checkbox from '@mui/material/Checkbox';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fCurrency } from 'src/utils/format-number';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourItem({ tour }) {
+ const { slug, location, price, priceSale, favorited, duration, ratingNumber, coverUrl } = tour;
+
+ const [favorite, setFavorite] = useState(favorited);
+
+ const handleChangeFavorite = useCallback((event) => {
+ setFavorite(event.target.checked);
+ }, []);
+
+ return (
+
+
+ (theme.palette.mode === 'light' ? 'common.white' : 'grey.800'),
+ }}
+ >
+ {priceSale > 0 && (
+
+ {fCurrency(priceSale)}
+
+ )}
+ {fCurrency(price)}
+
+
+ }
+ checkedIcon={ }
+ sx={{ color: 'common.white' }}
+ />
+
+
+
+
+
+
+ {location}
+
+
+
+
+ {slug}
+
+
+
+
+
+
+
+
+ {duration}
+
+
+
+
+
+ {Number.isInteger(ratingNumber) ? `${ratingNumber}.0` : ratingNumber}
+
+
+
+
+ );
+}
+
+TravelTourItem.propTypes = {
+ tour: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ favorited: PropTypes.bool,
+ location: PropTypes.string,
+ price: PropTypes.number,
+ priceSale: PropTypes.number,
+ slug: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/_travel/list/travel-tour-list-similar.jsx b/template/src/sections/_travel/list/travel-tour-list-similar.jsx
new file mode 100644
index 0000000..7125ae1
--- /dev/null
+++ b/template/src/sections/_travel/list/travel-tour-list-similar.jsx
@@ -0,0 +1,82 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import TravelTourItem from './travel-tour-item';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourListSimilar({ tours }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const viewAllBtn = (
+ }
+ >
+ View All
+
+ );
+
+ return (
+
+
+
+ You Might Like
+
+ {mdUp && viewAllBtn}
+
+
+
+ {tours.map((tour) => (
+
+ ))}
+
+
+ {!mdUp && (
+
+ viewAllBtn
+
+ )}
+
+
+ );
+}
+
+TravelTourListSimilar.propTypes = {
+ tours: PropTypes.array,
+};
diff --git a/template/src/sections/_travel/list/travel-tour-list.jsx b/template/src/sections/_travel/list/travel-tour-list.jsx
new file mode 100644
index 0000000..183edfa
--- /dev/null
+++ b/template/src/sections/_travel/list/travel-tour-list.jsx
@@ -0,0 +1,52 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import TravelTourItem from './travel-tour-item';
+import TravelTourItemSkeleton from './travel-tour-item-skeleton';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTourList({ tours, loading }) {
+ return (
+ <>
+
+ {(loading ? [...Array(12)] : tours).map((tour, index) =>
+ tour ? (
+
+ ) : (
+
+ )
+ )}
+
+
+
+ >
+ );
+}
+
+TravelTourList.propTypes = {
+ loading: PropTypes.bool,
+ tours: PropTypes.array,
+};
diff --git a/template/src/sections/_travel/order-completed/travel-order-completed-info.jsx b/template/src/sections/_travel/order-completed/travel-order-completed-info.jsx
new file mode 100644
index 0000000..93fe0fe
--- /dev/null
+++ b/template/src/sections/_travel/order-completed/travel-order-completed-info.jsx
@@ -0,0 +1,64 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Typography from '@mui/material/Typography';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function TravelOrderCompletedInfo({ tour }) {
+ const { slug, ratingNumber, totalReviews, tourGuide } = tour;
+
+ return (
+
+
+ {slug}
+
+
+
+
+ {Number.isInteger(ratingNumber) ? `${ratingNumber}.0` : ratingNumber}
+
+
+ {totalReviews && (
+
+ ({fShortenNumber(totalReviews)} reviews)
+
+ )}
+
+
+
+
+
+
+
+ Tour guide by
+
+ {tourGuide?.name}
+
+
+
+ );
+}
+
+TravelOrderCompletedInfo.propTypes = {
+ tour: PropTypes.shape({
+ slug: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ totalReviews: PropTypes.number,
+ tourGuide: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/_travel/order-completed/travel-order-completed-summary.jsx b/template/src/sections/_travel/order-completed/travel-order-completed-summary.jsx
new file mode 100644
index 0000000..6236d8f
--- /dev/null
+++ b/template/src/sections/_travel/order-completed/travel-order-completed-summary.jsx
@@ -0,0 +1,67 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+
+import { fDate } from 'src/utils/format-time';
+import { fCurrency } from 'src/utils/format-number';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function TravelOrderCompletedSummary() {
+ return (
+ `dashed 1px ${theme.palette.divider}`,
+ }}
+ >
+ Booking Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function LineItem({ icon, label, value }) {
+ return (
+
+ {label}
+
+ {value}
+
+
+ );
+}
+
+LineItem.propTypes = {
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ label: PropTypes.string,
+ value: PropTypes.string,
+};
diff --git a/template/src/sections/_travel/team/travel-team-item.jsx b/template/src/sections/_travel/team/travel-team-item.jsx
new file mode 100644
index 0000000..71a1a12
--- /dev/null
+++ b/template/src/sections/_travel/team/travel-team-item.jsx
@@ -0,0 +1,92 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import { alpha, styled } from '@mui/material/styles';
+
+import { _socials } from 'src/_mock';
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import { varHover, varTranHover } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+const StyledOverlay = styled('div')(({ theme }) => ({
+ ...bgGradient({
+ startColor: `${alpha(theme.palette.common.black, 0)} 0%`,
+ endColor: `${theme.palette.common.black} 75%`,
+ }),
+ top: 0,
+ left: 0,
+ zIndex: 8,
+ width: '100%',
+ height: '100%',
+ position: 'absolute',
+ opacity: 0,
+ transition: theme.transitions.create('opacity', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.short,
+ }),
+ '&:hover': { opacity: 1 },
+}));
+
+// ----------------------------------------------------------------------
+
+export default function TravelTeamItem({ member }) {
+ const { name, role, photo } = member;
+
+ return (
+
+
+
+ {name}
+
+
+ {role}
+
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+}
+
+TravelTeamItem.propTypes = {
+ member: PropTypes.shape({
+ name: PropTypes.string,
+ photo: PropTypes.string,
+ role: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_travel/team/travel-team.jsx b/template/src/sections/_travel/team/travel-team.jsx
new file mode 100644
index 0000000..4fd96ad
--- /dev/null
+++ b/template/src/sections/_travel/team/travel-team.jsx
@@ -0,0 +1,58 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import TravelTeamItem from './travel-team-item';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTeam({ members }) {
+ return (
+
+
+ Our Team
+
+
+ Etiam sollicitudin, ipsum eu pulvinar rutrum, tellus ipsum laoreet sapien, quis venenatis
+ ante odio sit amet eros.
+
+
+
+
+ {members.map((member) => (
+
+ ))}
+
+
+ );
+}
+
+TravelTeam.propTypes = {
+ members: PropTypes.array,
+};
diff --git a/template/src/sections/_travel/testimonial/travel-testimonial-item.jsx b/template/src/sections/_travel/testimonial/travel-testimonial-item.jsx
new file mode 100644
index 0000000..3a16315
--- /dev/null
+++ b/template/src/sections/_travel/testimonial/travel-testimonial-item.jsx
@@ -0,0 +1,61 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function TestimonialItem({ testimonial, sx, ...other }) {
+ return (
+
+
+
+
+ {testimonial.review}
+
+
+
+
+ {testimonial.name}
+
+
+ );
+}
+
+TestimonialItem.propTypes = {
+ sx: PropTypes.object,
+ testimonial: PropTypes.shape({
+ name: PropTypes.string,
+ review: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/_travel/testimonial/travel-testimonial.jsx b/template/src/sections/_travel/testimonial/travel-testimonial.jsx
new file mode 100644
index 0000000..9b4c61c
--- /dev/null
+++ b/template/src/sections/_travel/testimonial/travel-testimonial.jsx
@@ -0,0 +1,81 @@
+import PropTypes from 'prop-types';
+
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import TestimonialItem from './travel-testimonial-item';
+
+// ----------------------------------------------------------------------
+
+export default function TravelTestimonial({ testimonials }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ dots: !mdUp,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ ...CarouselDots({
+ sx: {
+ mt: 8,
+ },
+ }),
+ });
+
+ return (
+
+
+
+
+ What Our Customer Say
+
+
+
+ {testimonials.map((testimonial) => (
+
+ ))}
+
+
+
+ {mdUp && (
+
+
+
+ )}
+
+
+ {mdUp && (
+
+ )}
+
+ );
+}
+
+TravelTestimonial.propTypes = {
+ testimonials: PropTypes.array,
+};
diff --git a/template/src/sections/_travel/travel-newsletter.jsx b/template/src/sections/_travel/travel-newsletter.jsx
new file mode 100644
index 0000000..8f48e4e
--- /dev/null
+++ b/template/src/sections/_travel/travel-newsletter.jsx
@@ -0,0 +1,87 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import TextField from '@mui/material/TextField';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { bgGradient } from 'src/theme/css';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function TravelNewsletter() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+
+
+
+ Newsletter
+
+
+ Sign up now to receive hot special offers
+ and information about the best tours!
+
+
+
+
+
+
+
+ ),
+ sx: { pr: 0.5, color: 'common.white' },
+ }}
+ sx={{ my: 5 }}
+ />
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_travel/travel-our-clients.jsx b/template/src/sections/_travel/travel-our-clients.jsx
new file mode 100644
index 0000000..17d759d
--- /dev/null
+++ b/template/src/sections/_travel/travel-our-clients.jsx
@@ -0,0 +1,78 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import SvgColor from 'src/components/svg-color';
+
+// ----------------------------------------------------------------------
+
+export default function TravelOurClients({ brands }) {
+ return (
+
+
+ Our Clients
+
+
+
+ Enhance Your Life By Having A Sense Of Purpose
+
+
+
+ Around the world, food-borne illnesses have become increasingly common. In the United
+ States alone, millions of people get a food-related illness each year.
+
+
+
+
+
+ {brands.map((brand) => (
+
+ ))}
+
+
+ );
+}
+
+TravelOurClients.propTypes = {
+ brands: PropTypes.array,
+};
diff --git a/template/src/sections/_travel/view/travel-about-view.jsx b/template/src/sections/_travel/view/travel-about-view.jsx
new file mode 100644
index 0000000..3071570
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-about-view.jsx
@@ -0,0 +1,31 @@
+import { _brands, _members, _travelPosts, _testimonials } from 'src/_mock';
+
+import TravelTeam from '../team/travel-team';
+import TravelAbout from '../about/travel-about';
+import TravelNewsletter from '../travel-newsletter';
+import TravelOurClients from '../travel-our-clients';
+import TravelTestimonial from '../testimonial/travel-testimonial';
+import TravelAboutOurMission from '../about/travel-about-our-mission';
+import TravelLatestPosts from '../../blog/travel/travel-latest-posts';
+
+// ----------------------------------------------------------------------
+
+export default function TravelAboutView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_travel/view/travel-checkout-view.jsx b/template/src/sections/_travel/view/travel-checkout-view.jsx
new file mode 100644
index 0000000..673f66a
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-checkout-view.jsx
@@ -0,0 +1,199 @@
+import * as Yup from 'yup';
+import PropTypes from 'prop-types';
+import { useForm } from 'react-hook-form';
+import { useState, useCallback } from 'react';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { useRouter } from 'src/routes/hooks';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _tours } from 'src/_mock';
+
+import FormProvider from 'src/components/hook-form';
+
+import TravelCheckOutSummary from '../checkout/travel-check-out-summary';
+import TravelCheckOutPaymentForm from '../checkout/travel-check-out-payment-form';
+import TravelCheckOutShippingForm from '../checkout/travel-check-out-shipping-form';
+
+// ----------------------------------------------------------------------
+
+export default function TravelCheckoutView() {
+ const router = useRouter();
+
+ const sameBilling = useBoolean();
+
+ const [departureDay, setDepartureDay] = useState(new Date());
+
+ const [guests, setGuests] = useState({
+ adults: 2,
+ children: 1,
+ });
+
+ const TravelCheckoutSchema = Yup.object().shape({
+ billingAddress: Yup.object().shape({
+ firstName: Yup.string().required('First name is required'),
+ lastName: Yup.string().required('Last name is required'),
+ fullAddress: Yup.string().required('Full address is required'),
+ }),
+ });
+
+ const defaultValues = {
+ billingAddress: {
+ firstName: '',
+ lastName: '',
+ fullAddress: '',
+ fullAddress2: '',
+ },
+ shippingAddress: {
+ firstName: '',
+ lastName: '',
+ fullAddress: '',
+ fullAddress2: '',
+ },
+ paymentMethods: {
+ methods: 'paypal',
+ card: {
+ cardNumber: '',
+ cardHolder: '',
+ expirationDate: '',
+ ccv: '',
+ },
+ },
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(TravelCheckoutSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ router.push(paths.travel.orderCompleted);
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ const handleChangeDepartureDay = useCallback((newValue) => {
+ setDepartureDay(newValue);
+ }, []);
+
+ const handleIncrementGuests = useCallback(
+ (guest) => {
+ if (guest === 'children') {
+ setGuests({ ...guests, children: guests.children + 1 });
+ } else {
+ setGuests({ ...guests, adults: guests.adults + 1 });
+ }
+ },
+ [guests]
+ );
+
+ const handleDecreaseGuests = useCallback(
+ (guest) => {
+ if (guest === 'children') {
+ setGuests({ ...guests, children: guests.children - 1 });
+ } else {
+ setGuests({ ...guests, adults: guests.adults - 1 });
+ }
+ },
+ [guests]
+ );
+
+ return (
+
+
+ Confirm and Pay
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function StepLabel({ step, title }) {
+ return (
+
+
+ {step}
+
+ {title}
+
+ );
+}
+
+StepLabel.propTypes = {
+ step: PropTypes.string,
+ title: PropTypes.string,
+};
diff --git a/template/src/sections/_travel/view/travel-contact-view.jsx b/template/src/sections/_travel/view/travel-contact-view.jsx
new file mode 100644
index 0000000..548c879
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-contact-view.jsx
@@ -0,0 +1,17 @@
+import TravelNewsletter from '../travel-newsletter';
+import TravelContactInfo from '../contact/travel-contact-info';
+import TravelContactForm from '../contact/travel-contact-form';
+
+// ----------------------------------------------------------------------
+
+export default function TravelContactView() {
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_travel/view/travel-landing-view.jsx b/template/src/sections/_travel/view/travel-landing-view.jsx
new file mode 100644
index 0000000..f402b2c
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-landing-view.jsx
@@ -0,0 +1,66 @@
+import Box from '@mui/material/Box';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+
+import { _tours, _travelPosts, _testimonials } from 'src/_mock';
+
+import TravelNewsletter from '../travel-newsletter';
+import TravelFilters from '../filters/travel-filters';
+import TravelLandingHero from '../landing/travel-landing-hero';
+import TravelTestimonial from '../testimonial/travel-testimonial';
+import TravelLandingSummary from '../landing/travel-landing-summary';
+import TravelLandingIntroduce from '../landing/travel-landing-introduce';
+import TravelLandingToursByCity from '../landing/travel-landing-tours-by-city';
+import TravelLandingTourFeatured from '../landing/travel-landing-tour-featured';
+import BlogTravelLandingLatestPosts from '../../blog/travel/travel-landing-posts';
+import TravelLandingFavoriteDestinations from '../landing/travel-landing-favorite-destinations';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingView() {
+ return (
+ <>
+
+
+
+
+ ({
+ xs: 'background.neutral',
+ md: alpha(theme.palette.common.white, 0.08),
+ }),
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_travel/view/travel-order-completed-view.jsx b/template/src/sections/_travel/view/travel-order-completed-view.jsx
new file mode 100644
index 0000000..d2d7dc7
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-order-completed-view.jsx
@@ -0,0 +1,69 @@
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _tours } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+import TravelOrderCompletedInfo from '../order-completed/travel-order-completed-info';
+import TravelOrderCompletedSummary from '../order-completed/travel-order-completed-summary';
+
+// ----------------------------------------------------------------------
+
+const _mockTour = _tours[1];
+
+export default function TravelOrderCompletedView() {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+ {mdUp && }
+
+
+ Completed 🎉
+
+
+
+
+
+
+ }
+ >
+ Back Home
+
+
+ }
+ >
+ Download Invoice
+
+
+
+
+ );
+}
diff --git a/template/src/sections/_travel/view/travel-post-view.jsx b/template/src/sections/_travel/view/travel-post-view.jsx
new file mode 100644
index 0000000..d70c652
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-post-view.jsx
@@ -0,0 +1,83 @@
+import Divider from '@mui/material/Divider';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+
+import { _tags, _mock, _categories, _travelPosts } from 'src/_mock';
+
+import Markdown from 'src/components/markdown';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import PostTags from '../../blog/common/post-tags';
+import TravelNewsletter from '../travel-newsletter';
+import PostAuthor from '../../blog/common/post-author';
+import PostSidebar from '../../blog/common/post-sidebar';
+import TravelPostHero from '../../blog/travel/travel-post-hero';
+import PostSocialsShare from '../../blog/common/post-socials-share';
+import TravelLatestPosts from '../../blog/travel/travel-latest-posts';
+
+// ----------------------------------------------------------------------
+
+export default function TravelPostView() {
+ const { title, description, author, tags, content } = _travelPosts[0];
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+ {description}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_travel/view/travel-posts-view.jsx b/template/src/sections/_travel/view/travel-posts-view.jsx
new file mode 100644
index 0000000..d544264
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-posts-view.jsx
@@ -0,0 +1,53 @@
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+
+import { _tags, _mock, _categories, _travelPosts } from 'src/_mock';
+
+import TravelNewsletter from '../travel-newsletter';
+import PostSidebar from '../../blog/common/post-sidebar';
+import TravelPosts from '../../blog/travel/travel-posts';
+import PostSearchMobile from '../../blog/common/post-search-mobile';
+import TravelFeaturedPosts from '../../blog/travel/travel-featured-posts';
+import TravelTrendingTopics from '../../blog/travel/travel-trending-topics';
+
+// ----------------------------------------------------------------------
+
+export default function TravelPostsView() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_travel/view/travel-tour-view.jsx b/template/src/sections/_travel/view/travel-tour-view.jsx
new file mode 100644
index 0000000..163ab2a
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-tour-view.jsx
@@ -0,0 +1,115 @@
+import { useEffect } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _tours, _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+import { SplashScreen } from 'src/components/loading-screen';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import TravelNewsletter from '../travel-newsletter';
+import ReviewTravel from '../../review/travel/review-travel';
+import TravelTourListSimilar from '../list/travel-tour-list-similar';
+import TravelTourDetailsHeader from '../details/travel-tour-details-header';
+import TravelTourDetailsSummary from '../details/travel-tour-details-summary';
+import TravelTourDetailsGallery from '../details/travel-tour-details-gallery';
+import TravelTourDetailsReserveForm from '../details/travel-tour-details-reserve-form';
+
+// ----------------------------------------------------------------------
+
+const _mockTour = _tours[0];
+
+export default function TravelTourView() {
+ const loading = useBoolean(true);
+
+ useEffect(() => {
+ const fakeLoading = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ loading.onFalse();
+ };
+ fakeLoading();
+ }, [loading]);
+
+ if (loading.value) {
+ return ;
+ }
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share:
+
+
+
+ {_socials.map((social) => (
+ }
+ sx={{
+ m: 0.5,
+ flexShrink: 0,
+ color: social.color,
+ borderColor: social.color,
+ '&:hover': {
+ borderColor: social.color,
+ bgcolor: alpha(social.color, 0.08),
+ },
+ }}
+ >
+ {social.label}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/_travel/view/travel-tours-view.jsx b/template/src/sections/_travel/view/travel-tours-view.jsx
new file mode 100644
index 0000000..6a1a17a
--- /dev/null
+++ b/template/src/sections/_travel/view/travel-tours-view.jsx
@@ -0,0 +1,42 @@
+import { useEffect } from 'react';
+
+import Container from '@mui/material/Container';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _tours } from 'src/_mock';
+
+import TravelNewsletter from '../travel-newsletter';
+import TravelFilters from '../filters/travel-filters';
+import TravelTourList from '../list/travel-tour-list';
+
+// ----------------------------------------------------------------------
+
+export default function TravelToursView() {
+ const loading = useBoolean(true);
+
+ useEffect(() => {
+ const fakeLoading = async () => {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ loading.onFalse();
+ };
+ fakeLoading();
+ }, [loading]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/advertisement/advertisement.jsx b/template/src/sections/advertisement/advertisement.jsx
new file mode 100644
index 0000000..6bc7559
--- /dev/null
+++ b/template/src/sections/advertisement/advertisement.jsx
@@ -0,0 +1,62 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function Advertisement({ advertisement, sx, ...other }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+ {advertisement.title}
+
+
+
+ {advertisement.description}
+
+
+
+ Go Now
+
+
+
+
+
+ );
+}
+
+Advertisement.propTypes = {
+ advertisement: PropTypes.shape({
+ description: PropTypes.string,
+ imageUrl: PropTypes.string,
+ path: PropTypes.string,
+ title: PropTypes.string,
+ }),
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/advertisement/index.js b/template/src/sections/advertisement/index.js
new file mode 100644
index 0000000..f8537b1
--- /dev/null
+++ b/template/src/sections/advertisement/index.js
@@ -0,0 +1 @@
+export { default } from './advertisement';
diff --git a/template/src/sections/auth/forgot-password-view.jsx b/template/src/sections/auth/forgot-password-view.jsx
new file mode 100644
index 0000000..d1fe07c
--- /dev/null
+++ b/template/src/sections/auth/forgot-password-view.jsx
@@ -0,0 +1,98 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function ForgotPasswordView() {
+ const ForgotPasswordSchema = Yup.object().shape({
+ email: Yup.string().required('Email is required').email('Email must be a valid email address'),
+ });
+
+ const defaultValues = {
+ email: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(ForgotPasswordSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ return (
+
+
+
+
+ Forgot Your Password?
+
+
+
+ Please enter the email address associated with your account and We will email you a link to
+ reset your password.
+
+
+
+
+
+
+ Reset Password
+
+
+
+
+
+ Return to sign in
+
+
+ );
+}
diff --git a/template/src/sections/auth/login-background-view.jsx b/template/src/sections/auth/login-background-view.jsx
new file mode 100644
index 0000000..b5680f4
--- /dev/null
+++ b/template/src/sections/auth/login-background-view.jsx
@@ -0,0 +1,155 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function LoginBackgroundView() {
+ const passwordShow = useBoolean();
+
+ const LoginSchema = Yup.object().shape({
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ password: Yup.string()
+ .required('Password is required')
+ .min(6, 'Password should be of minimum 6 characters length'),
+ });
+
+ const defaultValues = {
+ email: '',
+ password: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(LoginSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ const renderHead = (
+
+
+ Login
+
+
+
+ {`Don’t have an account? `}
+
+ Get started
+
+
+
+ );
+
+ const renderSocials = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ const renderForm = (
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+ Forgot password?
+
+
+
+ Login
+
+
+
+ );
+
+ return (
+ <>
+ {renderHead}
+
+ {renderForm}
+
+
+
+ or continue with
+
+
+
+ {renderSocials}
+ >
+ );
+}
diff --git a/template/src/sections/auth/login-cover-view.jsx b/template/src/sections/auth/login-cover-view.jsx
new file mode 100644
index 0000000..e6d142a
--- /dev/null
+++ b/template/src/sections/auth/login-cover-view.jsx
@@ -0,0 +1,159 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Logo from 'src/components/logo';
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function LoginCoverView() {
+ const passwordShow = useBoolean();
+
+ const LoginSchema = Yup.object().shape({
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ password: Yup.string()
+ .required('Password is required')
+ .min(6, 'Password should be of minimum 6 characters length'),
+ });
+
+ const defaultValues = {
+ email: '',
+ password: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(LoginSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ const renderHead = (
+
+
+ Login
+
+
+
+ {`Don’t have an account? `}
+
+ Get started
+
+
+
+ );
+
+ const renderSocials = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ const renderForm = (
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+ Forgot password?
+
+
+
+ Login
+
+
+
+ );
+
+ return (
+ <>
+
+
+ {renderHead}
+
+ {renderSocials}
+
+
+
+ OR
+
+
+
+ {renderForm}
+ >
+ );
+}
diff --git a/template/src/sections/auth/login-illustration-view.jsx b/template/src/sections/auth/login-illustration-view.jsx
new file mode 100644
index 0000000..aea7b95
--- /dev/null
+++ b/template/src/sections/auth/login-illustration-view.jsx
@@ -0,0 +1,155 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function LoginIllustrationView() {
+ const passwordShow = useBoolean();
+
+ const LoginSchema = Yup.object().shape({
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ password: Yup.string()
+ .required('Password is required')
+ .min(6, 'Password should be of minimum 6 characters length'),
+ });
+
+ const defaultValues = {
+ email: '',
+ password: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(LoginSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ const renderHead = (
+
+
+ Login
+
+
+
+ {`Don’t have an account? `}
+
+ Get started
+
+
+
+ );
+
+ const renderSocials = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ const renderForm = (
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+ Forgot password?
+
+
+
+ Login
+
+
+
+ );
+
+ return (
+ <>
+ {renderHead}
+
+ {renderForm}
+
+
+
+ or continue with
+
+
+
+ {renderSocials}
+ >
+ );
+}
diff --git a/template/src/sections/auth/register-background-view.jsx b/template/src/sections/auth/register-background-view.jsx
new file mode 100644
index 0000000..ec559e4
--- /dev/null
+++ b/template/src/sections/auth/register-background-view.jsx
@@ -0,0 +1,182 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function RegisterBackgroundView() {
+ const passwordShow = useBoolean();
+
+ const RegisterSchema = Yup.object().shape({
+ fullName: Yup.string()
+ .required('Full name is required')
+ .min(6, 'Mininum 6 characters')
+ .max(15, 'Maximum 15 characters'),
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ password: Yup.string()
+ .required('Password is required')
+ .min(6, 'Password should be of minimum 6 characters length'),
+ confirmPassword: Yup.string()
+ .required('Confirm password is required')
+ .oneOf([Yup.ref('password')], "Password's not match"),
+ });
+
+ const defaultValues = {
+ fullName: '',
+ email: '',
+ password: '',
+ confirmPassword: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(RegisterSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ const renderHead = (
+
+
+ Get Started
+
+
+
+ {`Already have an account? `}
+
+ Login
+
+
+
+ );
+
+ const renderSocials = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ const renderForm = (
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+ Register
+
+
+
+ {`I agree to `}
+
+ Terms of Service
+
+ {` and `}
+
+ Privacy Policy.
+
+
+
+
+ );
+
+ return (
+ <>
+ {renderHead}
+
+ {renderForm}
+
+
+
+ or continue with
+
+
+
+ {renderSocials}
+ >
+ );
+}
diff --git a/template/src/sections/auth/register-cover-view.jsx b/template/src/sections/auth/register-cover-view.jsx
new file mode 100644
index 0000000..486932e
--- /dev/null
+++ b/template/src/sections/auth/register-cover-view.jsx
@@ -0,0 +1,186 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Logo from 'src/components/logo';
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function RegisterCoverView() {
+ const passwordShow = useBoolean();
+
+ const RegisterSchema = Yup.object().shape({
+ fullName: Yup.string()
+ .required('Full name is required')
+ .min(6, 'Mininum 6 characters')
+ .max(15, 'Maximum 15 characters'),
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ password: Yup.string()
+ .required('Password is required')
+ .min(6, 'Password should be of minimum 6 characters length'),
+ confirmPassword: Yup.string()
+ .required('Confirm password is required')
+ .oneOf([Yup.ref('password')], "Password's not match"),
+ });
+
+ const defaultValues = {
+ fullName: '',
+ email: '',
+ password: '',
+ confirmPassword: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(RegisterSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ const renderHead = (
+
+
+ Get Started
+
+
+
+ {`Already have an account? `}
+
+ Login
+
+
+
+ );
+
+ const renderSocials = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ const renderForm = (
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+ Register
+
+
+
+ {`I agree to `}
+
+ Terms of Service
+
+ {` and `}
+
+ Privacy Policy.
+
+
+
+
+ );
+
+ return (
+ <>
+
+
+ {renderHead}
+
+ {renderSocials}
+
+
+
+ OR
+
+
+
+ {renderForm}
+ >
+ );
+}
diff --git a/template/src/sections/auth/register-illustration-view.jsx b/template/src/sections/auth/register-illustration-view.jsx
new file mode 100644
index 0000000..8a23f60
--- /dev/null
+++ b/template/src/sections/auth/register-illustration-view.jsx
@@ -0,0 +1,182 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function RegisterIllustrationView() {
+ const passwordShow = useBoolean();
+
+ const RegisterSchema = Yup.object().shape({
+ fullName: Yup.string()
+ .required('Full name is required')
+ .min(6, 'Mininum 6 characters')
+ .max(15, 'Maximum 15 characters'),
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ password: Yup.string()
+ .required('Password is required')
+ .min(6, 'Password should be of minimum 6 characters length'),
+ confirmPassword: Yup.string()
+ .required('Confirm password is required')
+ .oneOf([Yup.ref('password')], "Password's not match"),
+ });
+
+ const defaultValues = {
+ fullName: '',
+ email: '',
+ password: '',
+ confirmPassword: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(RegisterSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ const renderHead = (
+
+
+ Get Started
+
+
+
+ {`Already have an account? `}
+
+ Login
+
+
+
+ );
+
+ const renderSocials = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+
+ const renderForm = (
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+ Register
+
+
+
+ {`I agree to `}
+
+ Terms of Service
+
+ {` and `}
+
+ Privacy Policy.
+
+
+
+
+ );
+
+ return (
+ <>
+ {renderHead}
+
+ {renderForm}
+
+
+
+ or continue with
+
+
+
+ {renderSocials}
+ >
+ );
+}
diff --git a/template/src/sections/auth/verify-view.jsx b/template/src/sections/auth/verify-view.jsx
new file mode 100644
index 0000000..e7f4e53
--- /dev/null
+++ b/template/src/sections/auth/verify-view.jsx
@@ -0,0 +1,103 @@
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import FormProvider, { RHFCode } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function VerifyView() {
+ const VerifySchema = Yup.object().shape({
+ code: Yup.string().min(6, 'Code must be at least 6 characters').required('Code is required'),
+ });
+
+ const defaultValues = {
+ code: '',
+ };
+
+ const methods = useForm({
+ mode: 'onChange',
+ resolver: yupResolver(VerifySchema),
+ defaultValues,
+ });
+
+ const {
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ return (
+
+
+
+ Check Your Email
+
+
+ We have emailed a 6-digit confirmation code to acb@domain, please enter the code in below
+ box to verify your email.
+
+
+
+
+
+
+ Verify
+
+
+
+
+ {`Don’t have a code? `}
+
+ Resend code
+
+
+
+
+
+ Return to sign in
+
+
+ );
+}
diff --git a/template/src/sections/blog/career/career-latest-post-item.jsx b/template/src/sections/blog/career/career-latest-post-item.jsx
new file mode 100644
index 0000000..722fd73
--- /dev/null
+++ b/template/src/sections/blog/career/career-latest-post-item.jsx
@@ -0,0 +1,91 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLatestPostItem({ post, order, largePost }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+
+
+ {post.title}
+
+
+ {largePost && {post.description} }
+
+
+ );
+}
+
+CareerLatestPostItem.propTypes = {
+ order: PropTypes.number,
+ largePost: PropTypes.bool,
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ }),
+};
diff --git a/template/src/sections/blog/career/career-latest-posts.jsx b/template/src/sections/blog/career/career-latest-posts.jsx
new file mode 100644
index 0000000..623be76
--- /dev/null
+++ b/template/src/sections/blog/career/career-latest-posts.jsx
@@ -0,0 +1,116 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Masonry from '@mui/lab/Masonry';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import PostItemMobile from '../common/post-item-mobile';
+import CareerLatestPostItem from './career-latest-post-item';
+
+// ----------------------------------------------------------------------
+
+export default function CareerLatestPosts({ posts }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const latestPost = posts[0];
+
+ const viewAllBtn = (
+ }
+ >
+ View All
+
+ );
+
+ return (
+
+
+
+
+ BLOG
+
+
+
+ Read Our Lates News
+
+
+
+ Aenean vulputate eleifend tellus. Mauris turpis nunc, blandit et, volutpat molestie,
+ porta ut, ligula.
+
+
+
+ {mdUp && viewAllBtn}
+
+
+
+ {mdUp ? (
+ <>
+
+
+
+ {posts.slice(1, 5).map((post, index) => (
+
+ ))}
+
+ >
+ ) : (
+ <>
+ {posts.slice(0, 5).map((post) => (
+
+ ))}
+ >
+ )}
+
+
+ {!mdUp && (
+
+ {viewAllBtn}
+
+ )}
+
+ );
+}
+
+CareerLatestPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/career/career-post-item.jsx b/template/src/sections/blog/career/career-post-item.jsx
new file mode 100644
index 0000000..c91400d
--- /dev/null
+++ b/template/src/sections/blog/career/career-post-item.jsx
@@ -0,0 +1,112 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function CareerPostItem({ post, index }) {
+ const noImage = index === 1 || index === 4;
+
+ const smallImage = index === 2 || index === 7;
+
+ return (
+
+ {!noImage && (
+
+ )}
+
+
+
+
+
+ {post.title}
+
+
+
+ {post.description}
+
+
+
+
+ {post.author?.name}
+
+
+
+ );
+}
+
+CareerPostItem.propTypes = {
+ index: PropTypes.number,
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/career/career-posts.jsx b/template/src/sections/blog/career/career-posts.jsx
new file mode 100644
index 0000000..0b621e6
--- /dev/null
+++ b/template/src/sections/blog/career/career-posts.jsx
@@ -0,0 +1,52 @@
+import PropTypes from 'prop-types';
+
+import Masonry from '@mui/lab/Masonry';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+
+import Iconify from 'src/components/iconify';
+
+import CareerPostItem from './career-post-item';
+
+// ----------------------------------------------------------------------
+
+export default function CareerPosts({ posts }) {
+ return (
+ <>
+
+ {posts.slice(0, 8).map((post, index) => (
+
+ ))}
+
+
+
+ }
+ >
+ Load more
+
+
+ >
+ );
+}
+
+CareerPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/common/post-author.jsx b/template/src/sections/blog/common/post-author.jsx
new file mode 100644
index 0000000..c1613a0
--- /dev/null
+++ b/template/src/sections/blog/common/post-author.jsx
@@ -0,0 +1,71 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import { _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function PostAuthor({ author }) {
+ const { name, role, about, quotes, avatarUrl } = author;
+
+ return (
+
+
+
+
+
+
+ {name}
+
+
+ {role}
+
+
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+ {about}
+
+
+
+ {quotes}
+
+
+
+ );
+}
+
+PostAuthor.propTypes = {
+ author: PropTypes.shape({
+ about: PropTypes.string,
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ quotes: PropTypes.string,
+ role: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/blog/common/post-item-mobile.jsx b/template/src/sections/blog/common/post-item-mobile.jsx
new file mode 100644
index 0000000..2e77d8c
--- /dev/null
+++ b/template/src/sections/blog/common/post-item-mobile.jsx
@@ -0,0 +1,53 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import PostTimeBlock from './post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function PostItemMobile({ post, onSiderbar }) {
+ return (
+
+
+
+
+
+ {post.title}
+
+
+
+
+
+ );
+}
+
+PostItemMobile.propTypes = {
+ onSiderbar: PropTypes.bool,
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ }),
+};
diff --git a/template/src/sections/blog/common/post-prev-and-next.jsx b/template/src/sections/blog/common/post-prev-and-next.jsx
new file mode 100644
index 0000000..dafd108
--- /dev/null
+++ b/template/src/sections/blog/common/post-prev-and-next.jsx
@@ -0,0 +1,95 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import CardActionArea from '@mui/material/CardActionArea';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function PostPrevAndNext({ prevPost, nextPost }) {
+ return (
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+ );
+}
+
+PostPrevAndNext.propTypes = {
+ nextPost: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ title: PropTypes.string,
+ }),
+ prevPost: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
+
+// ----------------------------------------------------------------------
+
+function PostItem({ coverUrl, title, icon, isNext }) {
+ return (
+
+
+
+ {icon}
+
+
+
+
+
+ {isNext ? 'Next Post' : 'Previous Post'}
+
+
+ {title}
+
+
+
+
+ );
+}
+
+PostItem.propTypes = {
+ isNext: PropTypes.bool,
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+};
diff --git a/template/src/sections/blog/common/post-search-mobile.jsx b/template/src/sections/blog/common/post-search-mobile.jsx
new file mode 100644
index 0000000..a672fd5
--- /dev/null
+++ b/template/src/sections/blog/common/post-search-mobile.jsx
@@ -0,0 +1,34 @@
+import Box from '@mui/material/Box';
+import TextField from '@mui/material/TextField';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function PostSearchMobile() {
+ const mdDown = useResponsive('down', 'md');
+
+ return (
+ <>
+ {mdDown && (
+
+
+
+
+ ),
+ }}
+ />
+
+ )}
+ >
+ );
+}
diff --git a/template/src/sections/blog/common/post-sidebar.jsx b/template/src/sections/blog/common/post-sidebar.jsx
new file mode 100644
index 0000000..be64421
--- /dev/null
+++ b/template/src/sections/blog/common/post-sidebar.jsx
@@ -0,0 +1,158 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Chip from '@mui/material/Chip';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import TextField from '@mui/material/TextField';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import Advertisement from '../../advertisement';
+import PostItemMobile from './post-item-mobile';
+
+// ----------------------------------------------------------------------
+
+export default function PostSidebar({
+ author,
+ categories,
+ popularTags,
+ recentPosts,
+ advertisement,
+ sx,
+ ...other
+}) {
+ const mdUp = useResponsive('up', 'md');
+
+ const renderAuthor = author && (
+
+
+
+
+ {author.name}
+
+
+ {author.role}
+
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+ );
+
+ const renderCategories = categories && (
+
+
+ Categories
+
+
+ {categories.map((category) => (
+
+
+
+
+ {category.label}
+
+
+ ))}
+
+ );
+
+ const renderRecentPosts = recentPosts && (
+
+ Recent Posts
+
+ {recentPosts.list.map((post) => (
+
+ ))}
+
+ );
+
+ const renderPopularTags = popularTags && (
+
+ Popular Tags
+
+
+ {popularTags.map((tag) => (
+ {}} />
+ ))}
+
+
+ );
+
+ return (
+ <>
+ {mdUp && renderAuthor}
+
+ {mdUp && (
+
+
+
+ ),
+ }}
+ />
+ )}
+
+
+ {renderCategories}
+
+ {renderRecentPosts}
+
+ {renderPopularTags}
+
+ {advertisement && }
+
+ >
+ );
+}
+
+PostSidebar.propTypes = {
+ advertisement: PropTypes.object,
+ author: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ role: PropTypes.string,
+ }),
+ categories: PropTypes.array,
+ popularTags: PropTypes.array,
+ recentPosts: PropTypes.shape({
+ list: PropTypes.array,
+ }),
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/blog/common/post-socials-share.jsx b/template/src/sections/blog/common/post-socials-share.jsx
new file mode 100644
index 0000000..360c340
--- /dev/null
+++ b/template/src/sections/blog/common/post-socials-share.jsx
@@ -0,0 +1,43 @@
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import { alpha } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function PostSocialsShare() {
+ return (
+
+
+ Share:
+
+
+
+ {_socials.map((social) => (
+ }
+ sx={{
+ m: 0.5,
+ flexShrink: 0,
+ color: social.color,
+ borderColor: social.color,
+ '&:hover': {
+ borderColor: social.color,
+ bgcolor: alpha(social.color, 0.08),
+ },
+ }}
+ >
+ {social.label}
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/blog/common/post-tags.jsx b/template/src/sections/blog/common/post-tags.jsx
new file mode 100644
index 0000000..75f1651
--- /dev/null
+++ b/template/src/sections/blog/common/post-tags.jsx
@@ -0,0 +1,27 @@
+import PropTypes from 'prop-types';
+
+import Chip from '@mui/material/Chip';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+// ----------------------------------------------------------------------
+
+export default function PostTags({ tags }) {
+ return (
+
+
+ Tags:
+
+
+
+ {tags.map((tag) => (
+ {}} />
+ ))}
+
+
+ );
+}
+
+PostTags.propTypes = {
+ tags: PropTypes.array,
+};
diff --git a/template/src/sections/blog/common/post-time-block.jsx b/template/src/sections/blog/common/post-time-block.jsx
new file mode 100644
index 0000000..653ad99
--- /dev/null
+++ b/template/src/sections/blog/common/post-time-block.jsx
@@ -0,0 +1,45 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+
+import { fDate } from 'src/utils/format-time';
+
+// ----------------------------------------------------------------------
+
+export default function PostTimeBlock({ createdAt, duration, sx, ...other }) {
+ return (
+
+ {fDate(createdAt)}
+
+ {duration && (
+ <>
+
+
+ {duration}
+ >
+ )}
+
+ );
+}
+
+PostTimeBlock.propTypes = {
+ createdAt: PropTypes.string,
+ duration: PropTypes.string,
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/blog/elearning/elearning-featured-post.jsx b/template/src/sections/blog/elearning/elearning-featured-post.jsx
new file mode 100644
index 0000000..f485704
--- /dev/null
+++ b/template/src/sections/blog/elearning/elearning-featured-post.jsx
@@ -0,0 +1,79 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningFeaturedPost({ post }) {
+ return (
+
+
+
+
+
+
+
+
+
+ {post.title}
+
+
+
+ {post.description}
+
+
+
+
+ {post.author.name}
+
+
+
+
+
+ );
+}
+
+ElearningFeaturedPost.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ name: PropTypes.string,
+ avatarUrl: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/elearning/elearning-latest-posts.jsx b/template/src/sections/blog/elearning/elearning-latest-posts.jsx
new file mode 100644
index 0000000..72ff0f1
--- /dev/null
+++ b/template/src/sections/blog/elearning/elearning-latest-posts.jsx
@@ -0,0 +1,86 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import PostItem from './elearning-post-item';
+import PostItemMobile from '../common/post-item-mobile';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningLatestPosts({ posts }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const viewAllBtn = (
+ }
+ >
+ View All
+
+ );
+
+ return (
+
+
+ Latest Posts
+
+ {mdUp && viewAllBtn}
+
+
+
+ {posts
+ .slice(0, 3)
+ .map((post) =>
+ mdUp ? (
+
+ ) : (
+
+ )
+ )}
+
+
+ {!mdUp && (
+
+ {viewAllBtn}
+
+ )}
+
+ );
+}
+
+ElearningLatestPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/elearning/elearning-post-item.jsx b/template/src/sections/blog/elearning/elearning-post-item.jsx
new file mode 100644
index 0000000..fe55652
--- /dev/null
+++ b/template/src/sections/blog/elearning/elearning-post-item.jsx
@@ -0,0 +1,72 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Paper from '@mui/material/Paper';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningPostItem({ post }) {
+ return (
+
+
+
+
+
+ {fDate(post.createdAt, 'MMM')}
+
+
+
+ {fDate(post.createdAt, 'dd')}
+
+
+
+
+
+ {post.title}
+
+
+
+
+ {post.description}
+
+
+
+
+
+ {post.author.name}
+
+ {post.duration}
+
+
+
+
+
+
+ );
+}
+
+ElearningPostItem.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/elearning/elearning-posts.jsx b/template/src/sections/blog/elearning/elearning-posts.jsx
new file mode 100644
index 0000000..5a2b12d
--- /dev/null
+++ b/template/src/sections/blog/elearning/elearning-posts.jsx
@@ -0,0 +1,45 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import PostItem from './elearning-post-item';
+
+// ----------------------------------------------------------------------
+
+export default function ElearningPosts({ posts }) {
+ return (
+ <>
+
+ {posts.slice(0, 8).map((post) => (
+
+ ))}
+
+
+
+ >
+ );
+}
+
+ElearningPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/marketing/marketing-featured-post-item.jsx b/template/src/sections/blog/marketing/marketing-featured-post-item.jsx
new file mode 100644
index 0000000..a1ad717
--- /dev/null
+++ b/template/src/sections/blog/marketing/marketing-featured-post-item.jsx
@@ -0,0 +1,71 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingFeaturedPostItem({ post }) {
+ return (
+
+
+
+
+
+
+
+
+ {post.title}
+
+
+
+ {post.description}
+
+
+
+
+
+ {post.author.name}
+
+
+
+ );
+}
+
+MarketingFeaturedPostItem.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/marketing/marketing-featured-posts.jsx b/template/src/sections/blog/marketing/marketing-featured-posts.jsx
new file mode 100644
index 0000000..8cbc779
--- /dev/null
+++ b/template/src/sections/blog/marketing/marketing-featured-posts.jsx
@@ -0,0 +1,91 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import Image from 'src/components/image';
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import MarketingFeaturedPostItem from './marketing-featured-post-item';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingFeaturedPosts({ posts }) {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ adaptiveHeight: true,
+ ...CarouselDots({
+ rounded: true,
+ sx: { mt: 5 },
+ }),
+ });
+
+ return (
+
+
+
+
+ {posts.map((post) => (
+
+ ))}
+
+
+
+
+ {posts.map(
+ (post, index) =>
+ carousel.currentIndex === index && (
+
+ )
+ )}
+
+ );
+}
+
+MarketingFeaturedPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/marketing/marketing-latest-post-item.jsx b/template/src/sections/blog/marketing/marketing-latest-post-item.jsx
new file mode 100644
index 0000000..1135d68
--- /dev/null
+++ b/template/src/sections/blog/marketing/marketing-latest-post-item.jsx
@@ -0,0 +1,95 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import { varHover, varTranHover } from 'src/components/animate';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLatestPostItem({ post }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {post.title}
+
+
+
+
+
+ {post.author.name}
+
+
+
+ );
+}
+
+MarketingLatestPostItem.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/marketing/marketing-latest-posts.jsx b/template/src/sections/blog/marketing/marketing-latest-posts.jsx
new file mode 100644
index 0000000..2d7f545
--- /dev/null
+++ b/template/src/sections/blog/marketing/marketing-latest-posts.jsx
@@ -0,0 +1,104 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import MarketingLatestPostItem from './marketing-latest-post-item';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingLatestPosts({ posts }) {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ slidesToShow: 3,
+ slidesToScroll: 1,
+ ...CarouselDots(),
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 1 },
+ },
+ ],
+ });
+
+ const viewAllBtn = (
+ }
+ >
+ View All
+
+ );
+
+ return (
+
+
+ Latest Posts
+
+ {mdUp && viewAllBtn}
+
+
+
+
+
+ {posts.map((post) => (
+
+
+
+ ))}
+
+
+
+
+ {!mdUp && (
+
+ {viewAllBtn}
+
+ )}
+
+ );
+}
+
+MarketingLatestPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/marketing/marketing-post-item.jsx b/template/src/sections/blog/marketing/marketing-post-item.jsx
new file mode 100644
index 0000000..2521d55
--- /dev/null
+++ b/template/src/sections/blog/marketing/marketing-post-item.jsx
@@ -0,0 +1,86 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+import { varHover, varTranHover } from 'src/components/animate';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingPostItem({ post }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {post.title}
+
+
+
+
+
+ {post.author.name}
+
+
+
+ );
+}
+
+MarketingPostItem.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/marketing/marketing-posts.jsx b/template/src/sections/blog/marketing/marketing-posts.jsx
new file mode 100644
index 0000000..83e9b90
--- /dev/null
+++ b/template/src/sections/blog/marketing/marketing-posts.jsx
@@ -0,0 +1,45 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import MarketingPostItem from './marketing-post-item';
+
+// ----------------------------------------------------------------------
+
+export default function MarketingPosts({ posts }) {
+ return (
+ <>
+
+ {posts.slice(0, 8).map((post) => (
+
+ ))}
+
+
+
+ >
+ );
+}
+
+MarketingPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/travel/travel-featured-post-item.jsx b/template/src/sections/blog/travel/travel-featured-post-item.jsx
new file mode 100644
index 0000000..cce3a88
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-featured-post-item.jsx
@@ -0,0 +1,102 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function TravelFeaturedPostItem({ post, largePost }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+
+
+
+ {post.title}
+
+
+
+ {largePost && {post.description} }
+
+
+
+ {post.author.name}
+
+
+
+ );
+}
+
+TravelFeaturedPostItem.propTypes = {
+ largePost: PropTypes.bool,
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ name: PropTypes.string,
+ avatarUrl: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/travel/travel-featured-posts.jsx b/template/src/sections/blog/travel/travel-featured-posts.jsx
new file mode 100644
index 0000000..e8cb1f6
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-featured-posts.jsx
@@ -0,0 +1,53 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+
+import PostItem from './travel-featured-post-item';
+
+// ----------------------------------------------------------------------
+
+export default function TravelFeaturedPosts({ posts }) {
+ const featuredPost = posts[0];
+
+ return (
+
+
+
+
+
+ {posts.slice(1, 5).map((post) => (
+
+ ))}
+
+
+
+ );
+}
+
+TravelFeaturedPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/travel/travel-landing-post-item-carousel.jsx b/template/src/sections/blog/travel/travel-landing-post-item-carousel.jsx
new file mode 100644
index 0000000..84e6f6a
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-landing-post-item-carousel.jsx
@@ -0,0 +1,76 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Fab from '@mui/material/Fab';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingPostItemCarousel({ post }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+ {fDate(post.createdAt)}
+
+
+
+ {post.title}
+
+
+ {post.description}
+
+
+
+
+
+
+
+
+
+ );
+}
+
+TravelLandingPostItemCarousel.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ }),
+};
diff --git a/template/src/sections/blog/travel/travel-landing-post-item.jsx b/template/src/sections/blog/travel/travel-landing-post-item.jsx
new file mode 100644
index 0000000..4ea951c
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-landing-post-item.jsx
@@ -0,0 +1,44 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import TextMaxLine from 'src/components/text-max-line';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingPostItem({ post }) {
+ return (
+
+
+ {fDate(post.createdAt)}
+
+
+
+
+ {post.title}
+
+
+
+
+ {post.description}
+
+
+
+
+ );
+}
+
+TravelLandingPostItem.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ description: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ }),
+};
diff --git a/template/src/sections/blog/travel/travel-landing-posts.jsx b/template/src/sections/blog/travel/travel-landing-posts.jsx
new file mode 100644
index 0000000..e510a69
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-landing-posts.jsx
@@ -0,0 +1,106 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+import PostItem from './travel-landing-post-item';
+import PostItemCarousel from './travel-landing-post-item-carousel';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLandingPosts({ posts }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ ...CarouselDots({
+ width: 1,
+ bottom: 80,
+ position: 'absolute',
+ }),
+ });
+
+ return (
+
+ {!mdUp && (
+
+ Latest Posts
+
+ )}
+
+
+
+
+
+ {posts.map((post) => (
+
+ ))}
+
+
+
+
+
+ {mdUp && (
+
+ Latest Posts
+
+ )}
+
+
+ {posts.slice(0, 3).map((post) => (
+
+ ))}
+
+
+
+ }
+ >
+ View All
+
+
+
+
+
+ );
+}
+
+TravelLandingPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/travel/travel-latest-post-item.jsx b/template/src/sections/blog/travel/travel-latest-post-item.jsx
new file mode 100644
index 0000000..5f74633
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-latest-post-item.jsx
@@ -0,0 +1,54 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLatestPostItem({ post }) {
+ return (
+
+
+
+
+
+
+
+
+ {post.title}
+
+
+
+
+
+
+ {post.author.name}
+
+
+ );
+}
+
+TravelLatestPostItem.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/travel/travel-latest-posts.jsx b/template/src/sections/blog/travel/travel-latest-posts.jsx
new file mode 100644
index 0000000..9fd5623
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-latest-posts.jsx
@@ -0,0 +1,90 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Iconify from 'src/components/iconify';
+
+import PostItem from './travel-latest-post-item';
+import PostItemMobile from '../common/post-item-mobile';
+
+// ----------------------------------------------------------------------
+
+export default function TravelLatestPosts({ posts }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const viewAllBtn = (
+ }
+ >
+ View All
+
+ );
+
+ return (
+
+
+
+ Latest Posts
+
+ {mdUp && viewAllBtn}
+
+
+
+ {posts
+ .slice(0, 4)
+ .map((post) =>
+ mdUp ? (
+
+ ) : (
+
+ )
+ )}
+
+
+ {!mdUp && (
+
+ {viewAllBtn}
+
+ )}
+
+
+ );
+}
+
+TravelLatestPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/travel/travel-post-hero.jsx b/template/src/sections/blog/travel/travel-post-hero.jsx
new file mode 100644
index 0000000..1135f79
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-post-hero.jsx
@@ -0,0 +1,86 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { fDate } from 'src/utils/format-time';
+
+import { _socials } from 'src/_mock';
+import { bgGradient } from 'src/theme/css';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function TravelPostHero({ post }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+
+ {post.duration}
+
+
+
+ {post.title}
+
+
+
+ {fDate(post.createdAt, 'dd/MM/yyyy p')}
+
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+
+
+
+ );
+}
+
+TravelPostHero.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ heroUrl: PropTypes.string,
+ duration: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ }),
+};
diff --git a/template/src/sections/blog/travel/travel-post-item.jsx b/template/src/sections/blog/travel/travel-post-item.jsx
new file mode 100644
index 0000000..fc20dce
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-post-item.jsx
@@ -0,0 +1,53 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Avatar from '@mui/material/Avatar';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+import { fDate } from 'src/utils/format-time';
+
+import Image from 'src/components/image';
+import TextMaxLine from 'src/components/text-max-line';
+
+import PostTimeBlock from '../common/post-time-block';
+
+// ----------------------------------------------------------------------
+
+export default function TravelPostItem({ post }) {
+ return (
+
+
+
+
+
+
+
+
+ {post.title}
+
+
+
+
+
+
+ {post.author.name}
+
+
+ );
+}
+
+TravelPostItem.propTypes = {
+ post: PropTypes.shape({
+ title: PropTypes.string,
+ coverUrl: PropTypes.string,
+ duration: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+ author: PropTypes.shape({
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ }),
+ }),
+};
diff --git a/template/src/sections/blog/travel/travel-posts.jsx b/template/src/sections/blog/travel/travel-posts.jsx
new file mode 100644
index 0000000..5991339
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-posts.jsx
@@ -0,0 +1,45 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import PostItem from './travel-post-item';
+
+// ----------------------------------------------------------------------
+
+export default function TravelPosts({ posts }) {
+ return (
+ <>
+
+ {posts.slice(0, 8).map((post) => (
+
+ ))}
+
+
+
+ >
+ );
+}
+
+TravelPosts.propTypes = {
+ posts: PropTypes.array,
+};
diff --git a/template/src/sections/blog/travel/travel-trending-topic-item.jsx b/template/src/sections/blog/travel/travel-trending-topic-item.jsx
new file mode 100644
index 0000000..8f50b11
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-trending-topic-item.jsx
@@ -0,0 +1,90 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { _mock } from 'src/_mock';
+
+import Image from 'src/components/image';
+import { varHover, varTranHover } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+const CATEGORIES = [
+ 'Marketing',
+ 'Community',
+ 'Tutorials',
+ 'Business',
+ 'Management',
+ 'Sports',
+ 'Travel',
+ 'Design',
+];
+
+export const TOPICS = [...Array(8)].map((_, index) => ({
+ id: _mock.id(index),
+ cover: _mock.image.travel(index + 4),
+ totalPost: index + 10,
+ category: CATEGORIES[index],
+}));
+
+// ----------------------------------------------------------------------
+
+export default function TravelTrendingTopicItem({ topic }) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+ {topic.category}
+
+
+
+ {topic.totalPost} posts
+
+
+
+
+
+
+
+
+ );
+}
+
+TravelTrendingTopicItem.propTypes = {
+ topic: PropTypes.shape({
+ category: PropTypes.string,
+ cover: PropTypes.string,
+ totalPost: PropTypes.number,
+ }),
+};
diff --git a/template/src/sections/blog/travel/travel-trending-topics.jsx b/template/src/sections/blog/travel/travel-trending-topics.jsx
new file mode 100644
index 0000000..10ff9e8
--- /dev/null
+++ b/template/src/sections/blog/travel/travel-trending-topics.jsx
@@ -0,0 +1,94 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _mock } from 'src/_mock';
+
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+import TopicItem from './travel-trending-topic-item';
+
+// ----------------------------------------------------------------------
+
+const CATEGORIES = [
+ 'Marketing',
+ 'Community',
+ 'Tutorials',
+ 'Business',
+ 'Management',
+ 'Sports',
+ 'Travel',
+ 'Design',
+];
+
+export const TOPICS = [...Array(8)].map((_, index) => ({
+ id: _mock.id(index),
+ cover: _mock.image.travel(index + 4),
+ totalPost: index + 10,
+ category: CATEGORIES[index],
+}));
+
+// ----------------------------------------------------------------------
+
+export default function TravelTrendingTopics() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const carousel = useCarousel({
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ responsive: [
+ {
+ breakpoint: theme.breakpoints.values.md,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: theme.breakpoints.values.sm,
+ settings: { slidesToShow: 1 },
+ },
+ ],
+ });
+
+ return (
+
+
+
+ Trending Topics
+
+ {mdUp && }
+
+
+
+ {TOPICS.map((topic) => (
+
+ ))}
+
+
+ {!mdUp && (
+
+ )}
+
+
+ );
+}
diff --git a/template/src/sections/error/500-view.jsx b/template/src/sections/error/500-view.jsx
new file mode 100644
index 0000000..538a424
--- /dev/null
+++ b/template/src/sections/error/500-view.jsx
@@ -0,0 +1,49 @@
+import { m } from 'framer-motion';
+
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+
+import { RouterLink } from 'src/routes/components';
+
+import CompactLayout from 'src/layouts/compact';
+
+import Image from 'src/components/image';
+import { varBounce, MotionContainer } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function Error500View() {
+ return (
+
+
+
+
+ 500 Internal Server Error
+
+
+
+
+
+ There was an error, please try again later.
+
+
+
+
+
+
+
+
+ Go to Home
+
+
+
+ );
+}
diff --git a/template/src/sections/error/not-found-view.jsx b/template/src/sections/error/not-found-view.jsx
new file mode 100644
index 0000000..539a24e
--- /dev/null
+++ b/template/src/sections/error/not-found-view.jsx
@@ -0,0 +1,50 @@
+import { m } from 'framer-motion';
+
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+
+import { RouterLink } from 'src/routes/components';
+
+import CompactLayout from 'src/layouts/compact';
+
+import Image from 'src/components/image';
+import { varBounce, MotionContainer } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function NotFoundView() {
+ return (
+
+
+
+
+ Page Not Found!
+
+
+
+
+
+ Sorry, we couldn’t find the page you’re looking for. Perhaps you’ve mistyped the URL? Be
+ sure to check your spelling.
+
+
+
+
+
+
+
+
+ Go to Home
+
+
+
+ );
+}
diff --git a/template/src/sections/examples/animate-view/background/container.jsx b/template/src/sections/examples/animate-view/background/container.jsx
new file mode 100644
index 0000000..76b40cb
--- /dev/null
+++ b/template/src/sections/examples/animate-view/background/container.jsx
@@ -0,0 +1,42 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+
+import { _mock } from 'src/_mock';
+
+import getVariant from '../get-variant';
+
+// ----------------------------------------------------------------------
+
+export default function ContainerView({ selectVariant, ...other }) {
+ const isKenburns = selectVariant.includes('kenburns');
+
+ return (
+ theme.customShadows.z8,
+ }}
+ {...other}
+ >
+ {isKenburns ? (
+
+ ) : (
+
+ )}
+
+ );
+}
+
+ContainerView.propTypes = {
+ selectVariant: PropTypes.string,
+};
diff --git a/template/src/sections/examples/animate-view/background/index.jsx b/template/src/sections/examples/animate-view/background/index.jsx
new file mode 100644
index 0000000..2da0f5c
--- /dev/null
+++ b/template/src/sections/examples/animate-view/background/index.jsx
@@ -0,0 +1,65 @@
+import { useState, useCallback } from 'react';
+
+import Card from '@mui/material/Card';
+import Grid from '@mui/material/Unstable_Grid2';
+
+import Toolbar from './toolbar';
+import ContainerView from './container';
+import ControlPanel from '../control-panel';
+
+// ----------------------------------------------------------------------
+
+export default function BackgroundView() {
+ const [count, setCount] = useState(0);
+
+ const [selectVariant, setSelectVariant] = useState('kenburnsTop');
+
+ const handleChangeVariant = useCallback(
+ (event) => {
+ setCount(count + 1);
+ setSelectVariant(event.target.value);
+ },
+ [count]
+ );
+
+ return (
+
+
+
+ setCount(count + 1)} />
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+const variantKey = [
+ {
+ type: 'kenburns',
+ values: ['kenburnsTop', 'kenburnsBottom', 'kenburnsLeft', 'kenburnsRight'],
+ },
+ {
+ type: 'pan',
+ values: ['panTop', 'panBottom', 'panLeft', 'panRight'],
+ },
+ {
+ type: 'color change',
+ values: ['color2x', 'color3x', 'color4x', 'color5x'],
+ },
+];
diff --git a/template/src/sections/examples/animate-view/background/toolbar.jsx b/template/src/sections/examples/animate-view/background/toolbar.jsx
new file mode 100644
index 0000000..e4a0b23
--- /dev/null
+++ b/template/src/sections/examples/animate-view/background/toolbar.jsx
@@ -0,0 +1,22 @@
+import PropTypes from 'prop-types';
+
+import Paper from '@mui/material/Paper';
+import IconButton from '@mui/material/IconButton';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function Toolbar({ onRefresh, ...other }) {
+ return (
+
+
+
+
+
+ );
+}
+
+Toolbar.propTypes = {
+ onRefresh: PropTypes.func,
+};
diff --git a/template/src/sections/examples/animate-view/control-panel.jsx b/template/src/sections/examples/animate-view/control-panel.jsx
new file mode 100644
index 0000000..5b4d242
--- /dev/null
+++ b/template/src/sections/examples/animate-view/control-panel.jsx
@@ -0,0 +1,61 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Radio from '@mui/material/Radio';
+import Paper from '@mui/material/Paper';
+import Typography from '@mui/material/Typography';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+import Scrollbar from 'src/components/scrollbar';
+
+// ----------------------------------------------------------------------
+
+export default function ControlPanel({ variantKey, selectVariant, onChangeVariant, sx }) {
+ return (
+
+
+
+ {variantKey.map((variant) => (
+
+
+ {variant.type}
+
+
+ {variant.values.map((value) => (
+ }
+ sx={{
+ px: 1,
+ py: 0.5,
+ mx: 0,
+ my: 0.25,
+ width: '100%',
+ borderRadius: 0.75,
+ color: 'text.secondary',
+ ...(selectVariant === value && {
+ color: 'warning.contrastText',
+ }),
+ ...(selectVariant === value && {
+ bgcolor: 'warning.main',
+ }),
+ }}
+ />
+ ))}
+
+ ))}
+
+
+
+ );
+}
+
+ControlPanel.propTypes = {
+ onChangeVariant: PropTypes.func,
+ selectVariant: PropTypes.string,
+ sx: PropTypes.object,
+ variantKey: PropTypes.array,
+};
diff --git a/template/src/sections/examples/animate-view/dialog/container.jsx b/template/src/sections/examples/animate-view/dialog/container.jsx
new file mode 100644
index 0000000..ac8c447
--- /dev/null
+++ b/template/src/sections/examples/animate-view/dialog/container.jsx
@@ -0,0 +1,72 @@
+import PropTypes from 'prop-types';
+import { m, AnimatePresence } from 'framer-motion';
+
+import Paper from '@mui/material/Paper';
+import Dialog from '@mui/material/Dialog';
+import Button from '@mui/material/Button';
+import DialogTitle from '@mui/material/DialogTitle';
+import DialogContent from '@mui/material/DialogContent';
+import DialogActions from '@mui/material/DialogActions';
+
+import getVariant from '../get-variant';
+
+// ----------------------------------------------------------------------
+
+export default function ContainerView({ open, onOpen, onClose, selectVariant, ...other }) {
+ return (
+ <>
+
+
+ Click Me!
+
+
+
+
+ {open && (
+ (
+
+ {props.children}
+
+ )}
+ >
+ {`Use Google's location service?`}
+
+
+ Let Google help apps determine location. This means sending anonymous location data to
+ Google, even when no apps are running.
+
+
+
+ Disagree
+
+ Agree
+
+
+
+ )}
+
+ >
+ );
+}
+
+ContainerView.propTypes = {
+ onClose: PropTypes.func,
+ onOpen: PropTypes.func,
+ open: PropTypes.bool,
+ selectVariant: PropTypes.string,
+ children: PropTypes.node,
+};
diff --git a/template/src/sections/examples/animate-view/dialog/index.jsx b/template/src/sections/examples/animate-view/dialog/index.jsx
new file mode 100644
index 0000000..72d9505
--- /dev/null
+++ b/template/src/sections/examples/animate-view/dialog/index.jsx
@@ -0,0 +1,76 @@
+import { useState, useCallback } from 'react';
+
+import Card from '@mui/material/Card';
+import Grid from '@mui/material/Unstable_Grid2';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import ContainerView from './container';
+import ControlPanel from '../control-panel';
+
+// ----------------------------------------------------------------------
+
+export default function DialogView() {
+ const dialogOpen = useBoolean();
+
+ const [selectVariant, setSelectVariant] = useState('slideInUp');
+
+ const handleChangeVariant = useCallback((event) => {
+ setSelectVariant(event.target.value);
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+const variantKey = [
+ {
+ type: 'slide',
+ values: ['slideInUp', 'slideInDown', 'slideInLeft', 'slideInRight'],
+ },
+ {
+ type: 'fade',
+ values: ['fadeIn', 'fadeInUp', 'fadeInDown', 'fadeInLeft', 'fadeInRight'],
+ },
+ {
+ type: 'zoom',
+ values: ['zoomIn', 'zoomInUp', 'zoomInDown', 'zoomInLeft', 'zoomInRight'],
+ },
+ {
+ type: 'bounce',
+ values: ['bounceIn', 'bounceInUp', 'bounceInDown', 'bounceInLeft', 'bounceInRight'],
+ },
+ {
+ type: 'flip',
+ values: ['flipInX', 'flipInY'],
+ },
+ {
+ type: 'scale',
+ values: ['scaleInX', 'scaleInY'],
+ },
+ {
+ type: 'rotate',
+ values: ['rotateIn'],
+ },
+];
diff --git a/template/src/sections/examples/animate-view/get-variant.js b/template/src/sections/examples/animate-view/get-variant.js
new file mode 100644
index 0000000..b799a7a
--- /dev/null
+++ b/template/src/sections/examples/animate-view/get-variant.js
@@ -0,0 +1,91 @@
+import {
+ varFade,
+ varZoom,
+ varFlip,
+ varSlide,
+ varScale,
+ varBgPan,
+ varBounce,
+ varRotate,
+ varBgColor,
+ varBgKenburns,
+} from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function getVariant(variant = 'slideInUp') {
+ return {
+ // Slide
+ slideInUp: varSlide().inUp,
+ slideInDown: varSlide().inDown,
+ slideInLeft: varSlide().inLeft,
+ slideInRight: varSlide().inRight,
+ slideOutUp: varSlide().outUp,
+ slideOutDown: varSlide().outDown,
+ slideOutLeft: varSlide().outLeft,
+ slideOutRight: varSlide().outRight,
+ // Fade
+ fadeIn: varFade().in,
+ fadeInUp: varFade().inUp,
+ fadeInDown: varFade().inDown,
+ fadeInLeft: varFade().inLeft,
+ fadeInRight: varFade().inRight,
+ fadeOut: varFade().out,
+ fadeOutUp: varFade().outUp,
+ fadeOutDown: varFade().outDown,
+ fadeOutLeft: varFade().outLeft,
+ fadeOutRight: varFade().outRight,
+ // Zoom
+ zoomIn: varZoom({ distance: 80 }).in,
+ zoomInUp: varZoom({ distance: 80 }).inUp,
+ zoomInDown: varZoom({ distance: 80 }).inDown,
+ zoomInLeft: varZoom({ distance: 240 }).inLeft,
+ zoomInRight: varZoom({ distance: 240 }).inRight,
+ zoomOut: varZoom().out,
+ zoomOutLeft: varZoom().outLeft,
+ zoomOutRight: varZoom().outRight,
+ zoomOutUp: varZoom().outUp,
+ zoomOutDown: varZoom().outDown,
+ // Bounce
+ bounceIn: varBounce().in,
+ bounceInUp: varBounce().inUp,
+ bounceInDown: varBounce().inDown,
+ bounceInLeft: varBounce().inLeft,
+ bounceInRight: varBounce().inRight,
+ bounceOut: varBounce().out,
+ bounceOutUp: varBounce().outUp,
+ bounceOutDown: varBounce().outDown,
+ bounceOutLeft: varBounce().outLeft,
+ bounceOutRight: varBounce().outRight,
+ // Flip
+ flipInX: varFlip().inX,
+ flipInY: varFlip().inY,
+ flipOutX: varFlip().outX,
+ flipOutY: varFlip().outY,
+ // Scale
+ scaleInX: varScale().inX,
+ scaleInY: varScale().inY,
+ scaleOutX: varScale().outX,
+ scaleOutY: varScale().outY,
+ // Rotate
+ rotateIn: varRotate().in,
+ rotateOut: varRotate().out,
+ // Background
+ kenburnsTop: varBgKenburns().top,
+ kenburnsBottom: varBgKenburns().bottom,
+ kenburnsLeft: varBgKenburns().left,
+ kenburnsRight: varBgKenburns().right,
+ panTop: varBgPan().top,
+ panBottom: varBgPan().bottom,
+ panLeft: varBgPan().left,
+ panRight: varBgPan().right,
+ color2x: varBgColor(),
+ color3x: varBgColor({ colors: ['#19dcea', '#b22cff', '#ea2222'] }),
+ color4x: varBgColor({
+ colors: ['#19dcea', '#b22cff', '#ea2222', '#f5be10'],
+ }),
+ color5x: varBgColor({
+ colors: ['#19dcea', '#b22cff', '#ea2222', '#f5be10', '#3bd80d'],
+ }),
+ }[variant];
+}
diff --git a/template/src/sections/examples/animate-view/index.jsx b/template/src/sections/examples/animate-view/index.jsx
new file mode 100644
index 0000000..31a7332
--- /dev/null
+++ b/template/src/sections/examples/animate-view/index.jsx
@@ -0,0 +1,78 @@
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Tab from '@mui/material/Tab';
+import Tabs from '@mui/material/Tabs';
+import Container from '@mui/material/Container';
+
+import { paths } from 'src/routes/paths';
+
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import Inview from './inview';
+import OtherView from './other';
+import ScrollView from './scroll';
+import DialogView from './dialog';
+import BackgroundView from './background';
+
+// ----------------------------------------------------------------------
+
+const TABS = [
+ { value: 'inview', label: 'In View', component: },
+ { value: 'scroll', label: 'Scroll', component: },
+ { value: 'dialog', label: 'Dialog', component: },
+ { value: 'background', label: 'Background', component: },
+ { value: 'other', label: 'Other', component: },
+];
+
+// ----------------------------------------------------------------------
+
+export default function AnimateView() {
+ const [currentTab, setCurrentTab] = useState('inview');
+
+ const handleChangeTab = useCallback((event, newValue) => {
+ setCurrentTab(newValue);
+ }, []);
+
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+ {TABS.map((tab) => (
+
+ ))}
+
+
+ {TABS.map(
+ (tab) =>
+ tab.value === currentTab && (
+
+ {tab.component}
+
+ )
+ )}
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/animate-view/inview/container.jsx b/template/src/sections/examples/animate-view/inview/container.jsx
new file mode 100644
index 0000000..ab09a4a
--- /dev/null
+++ b/template/src/sections/examples/animate-view/inview/container.jsx
@@ -0,0 +1,80 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+
+import { _mock } from 'src/_mock';
+
+import { MotionContainer } from 'src/components/animate';
+
+import getVariant from '../get-variant';
+
+// ----------------------------------------------------------------------
+
+const TEXT = 'Zone';
+
+const IMG = [
+ _mock.image.cover(2),
+ _mock.image.cover(3),
+ _mock.image.cover(4),
+ _mock.image.cover(5),
+ _mock.image.cover(8),
+];
+
+export default function ContainerView({ isText, isMulti, selectVariant, ...other }) {
+ const items = isMulti ? IMG : IMG.slice(0, 1);
+
+ return (
+
+ {isText ? (
+
+ {TEXT.split('').map((letter, index) => (
+
+ {letter}
+
+ ))}
+
+ ) : (
+
+ {items.map((row, index) => (
+ theme.customShadows.z8,
+ }}
+ />
+ ))}
+
+ )}
+
+ );
+}
+
+ContainerView.propTypes = {
+ isMulti: PropTypes.bool,
+ isText: PropTypes.bool,
+ selectVariant: PropTypes.string,
+};
diff --git a/template/src/sections/examples/animate-view/inview/index.jsx b/template/src/sections/examples/animate-view/inview/index.jsx
new file mode 100644
index 0000000..726fa7e
--- /dev/null
+++ b/template/src/sections/examples/animate-view/inview/index.jsx
@@ -0,0 +1,129 @@
+import { useState, useCallback } from 'react';
+
+import Card from '@mui/material/Card';
+import Grid from '@mui/material/Unstable_Grid2';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Toolbar from './toolbar';
+import ContainerView from './container';
+import ControlPanel from '../control-panel';
+
+// ----------------------------------------------------------------------
+
+export default function Inview() {
+ const [count, setCount] = useState(0);
+
+ const multiChecked = useBoolean();
+
+ const textChecked = useBoolean();
+
+ const [selectVariant, setSelectVariant] = useState('slideInUp');
+
+ const handleRefresh = useCallback(() => {
+ setCount(count + 1);
+ }, [count]);
+
+ const handleChangeVariant = useCallback(
+ (event) => {
+ setCount(count + 1);
+ setSelectVariant(event.target.value);
+ },
+ [count]
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+const variantKey = [
+ {
+ type: 'slide in',
+ values: ['slideInUp', 'slideInDown', 'slideInLeft', 'slideInRight'],
+ },
+ {
+ type: 'slide out',
+ values: ['slideOutUp', 'slideOutDown', 'slideOutLeft', 'slideOutRight'],
+ },
+ {
+ type: 'fade in',
+ values: ['fadeIn', 'fadeInUp', 'fadeInDown', 'fadeInLeft', 'fadeInRight'],
+ },
+ {
+ type: 'fade out',
+ values: ['fadeOut', 'fadeOutUp', 'fadeOutDown', 'fadeOutLeft', 'fadeOutRight'],
+ },
+ {
+ type: 'zoom in',
+ values: ['zoomIn', 'zoomInUp', 'zoomInDown', 'zoomInLeft', 'zoomInRight'],
+ },
+ {
+ type: 'zoom out',
+ values: ['zoomOut', 'zoomOutUp', 'zoomOutDown', 'zoomOutLeft', 'zoomOutRight'],
+ },
+ {
+ type: 'bounce in',
+ values: ['bounceIn', 'bounceInUp', 'bounceInDown', 'bounceInLeft', 'bounceInRight'],
+ },
+ {
+ type: 'bounce out',
+ values: ['bounceOut', 'bounceOutUp', 'bounceOutDown', 'bounceOutLeft', 'bounceOutRight'],
+ },
+ {
+ type: 'flip in',
+ values: ['flipInX', 'flipInY'],
+ },
+ {
+ type: 'flip out',
+ values: ['flipOutX', 'flipOutY'],
+ },
+ {
+ type: 'scale in',
+ values: ['scaleInX', 'scaleInY'],
+ },
+ {
+ type: 'scale out',
+ values: ['scaleOutX', 'scaleOutY'],
+ },
+ {
+ type: 'rotate in',
+ values: ['rotateIn'],
+ },
+ {
+ type: 'rotate out',
+ values: ['rotateOut'],
+ },
+];
diff --git a/template/src/sections/examples/animate-view/inview/toolbar.jsx b/template/src/sections/examples/animate-view/inview/toolbar.jsx
new file mode 100644
index 0000000..f57f5a7
--- /dev/null
+++ b/template/src/sections/examples/animate-view/inview/toolbar.jsx
@@ -0,0 +1,57 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import Switch from '@mui/material/Switch';
+import IconButton from '@mui/material/IconButton';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function Toolbar({
+ isText,
+ isMulti,
+ onChangeText,
+ onChangeMulti,
+ onRefresh,
+ ...other
+}) {
+ return (
+
+ }
+ label="Text Object"
+ />
+
+
+
+ {!isText && (
+ }
+ label="Multi Item"
+ />
+ )}
+
+
+
+
+
+ );
+}
+
+Toolbar.propTypes = {
+ isMulti: PropTypes.bool,
+ isText: PropTypes.bool,
+ onChangeMulti: PropTypes.func,
+ onChangeText: PropTypes.func,
+ onRefresh: PropTypes.func,
+};
diff --git a/template/src/sections/examples/animate-view/other/buttons.jsx b/template/src/sections/examples/animate-view/other/buttons.jsx
new file mode 100644
index 0000000..168120d
--- /dev/null
+++ b/template/src/sections/examples/animate-view/other/buttons.jsx
@@ -0,0 +1,86 @@
+import { m } from 'framer-motion';
+
+import Fab from '@mui/material/Fab';
+import Stack from '@mui/material/Stack';
+import IconButton from '@mui/material/IconButton';
+
+import Iconify from 'src/components/iconify';
+import { varHover } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function Buttons() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/examples/animate-view/other/index.jsx b/template/src/sections/examples/animate-view/other/index.jsx
new file mode 100644
index 0000000..77500d8
--- /dev/null
+++ b/template/src/sections/examples/animate-view/other/index.jsx
@@ -0,0 +1,48 @@
+import { useState } from 'react';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import IconButton from '@mui/material/IconButton';
+import CardContent from '@mui/material/CardContent';
+
+import Iconify from 'src/components/iconify';
+
+import Logo from './logo';
+import Buttons from './buttons';
+import ComponentBlock from '../../component-block';
+
+// ----------------------------------------------------------------------
+
+export default function Other() {
+ const [count, setCount] = useState(0);
+
+ return (
+
+
+
+
+
+
+
+
+ setCount(count + 1)}
+ sx={{ position: 'absolute', right: 40, top: 40 }}
+ >
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/examples/animate-view/other/logo.jsx b/template/src/sections/examples/animate-view/other/logo.jsx
new file mode 100644
index 0000000..85820a8
--- /dev/null
+++ b/template/src/sections/examples/animate-view/other/logo.jsx
@@ -0,0 +1,42 @@
+import { m } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+import { useTheme } from '@mui/material/styles';
+
+import { varPath } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function Logo() {
+ const theme = useTheme();
+
+ const PRIMARY_MAIN = theme.palette.primary.main;
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/examples/animate-view/scroll/container.jsx b/template/src/sections/examples/animate-view/scroll/container.jsx
new file mode 100644
index 0000000..e225828
--- /dev/null
+++ b/template/src/sections/examples/animate-view/scroll/container.jsx
@@ -0,0 +1,60 @@
+import { useRef } from 'react';
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import Typography from '@mui/material/Typography';
+
+import Scrollbar from 'src/components/scrollbar';
+import { varContainer, MotionViewport } from 'src/components/animate';
+
+import getVariant from '../get-variant';
+
+// ----------------------------------------------------------------------
+
+export default function ContainerView({ selectVariant, ...other }) {
+ const scrollRef = useRef(null);
+
+ return (
+
+
+ {[...Array(40)].map((_, index) => (
+ theme.customShadows.z8,
+ }}
+ >
+ Item {index + 1}
+
+ ))}
+
+
+ );
+}
+
+ContainerView.propTypes = {
+ selectVariant: PropTypes.string,
+};
diff --git a/template/src/sections/examples/animate-view/scroll/index.jsx b/template/src/sections/examples/animate-view/scroll/index.jsx
new file mode 100644
index 0000000..58f55b8
--- /dev/null
+++ b/template/src/sections/examples/animate-view/scroll/index.jsx
@@ -0,0 +1,80 @@
+import { useState, useCallback } from 'react';
+
+import Card from '@mui/material/Card';
+import Grid from '@mui/material/Unstable_Grid2';
+
+import Toolbar from './toolbar';
+import ContainerView from './container';
+import ControlPanel from '../control-panel';
+
+// ----------------------------------------------------------------------
+
+export default function ScrollView() {
+ const [count, setCount] = useState(0);
+
+ const [selectVariant, setSelectVariant] = useState('slideInUp');
+
+ const handleChangeVariant = useCallback(
+ (event) => {
+ setCount(count + 1);
+ setSelectVariant(event.target.value);
+ },
+ [count]
+ );
+
+ return (
+
+
+
+ setCount(count + 1)} />
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+const variantKey = [
+ {
+ type: 'slide',
+ values: ['slideInUp', 'slideInDown', 'slideInLeft', 'slideInRight'],
+ },
+ {
+ type: 'fade',
+ values: ['fadeIn', 'fadeInUp', 'fadeInDown', 'fadeInLeft', 'fadeInRight'],
+ },
+ {
+ type: 'zoom',
+ values: ['zoomIn', 'zoomInUp', 'zoomInDown', 'zoomInLeft', 'zoomInRight'],
+ },
+ {
+ type: 'bounce',
+ values: ['bounceIn', 'bounceInUp', 'bounceInDown', 'bounceInLeft', 'bounceInRight'],
+ },
+ {
+ type: 'flip',
+ values: ['flipInX', 'flipInY'],
+ },
+ {
+ type: 'scale',
+ values: ['scaleInX', 'scaleInY'],
+ },
+ {
+ type: 'rotate',
+ values: ['rotateIn'],
+ },
+];
diff --git a/template/src/sections/examples/animate-view/scroll/toolbar.jsx b/template/src/sections/examples/animate-view/scroll/toolbar.jsx
new file mode 100644
index 0000000..70147e1
--- /dev/null
+++ b/template/src/sections/examples/animate-view/scroll/toolbar.jsx
@@ -0,0 +1,29 @@
+import PropTypes from 'prop-types';
+
+import Paper from '@mui/material/Paper';
+import IconButton from '@mui/material/IconButton';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function Toolbar({ onRefresh, ...other }) {
+ return (
+
+
+
+
+
+ );
+}
+
+Toolbar.propTypes = {
+ onRefresh: PropTypes.func,
+};
diff --git a/template/src/sections/examples/carousel-view/carousel-animation.jsx b/template/src/sections/examples/carousel-view/carousel-animation.jsx
new file mode 100644
index 0000000..74b2cd9
--- /dev/null
+++ b/template/src/sections/examples/carousel-view/carousel-animation.jsx
@@ -0,0 +1,117 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Paper from '@mui/material/Paper';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+import CardContent from '@mui/material/CardContent';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import { varFade, MotionContainer } from 'src/components/animate';
+import Carousel, { useCarousel, CarouselArrowIndex } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function CarouselAnimation({ data }) {
+ const carousel = useCarousel({
+ speed: 800,
+ autoplay: true,
+ });
+
+ return (
+
+
+ {data.map((item, index) => (
+
+ ))}
+
+
+
+
+ );
+}
+
+CarouselAnimation.propTypes = {
+ data: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function CarouselItem({ item, active }) {
+ const theme = useTheme();
+
+ const { coverUrl, title } = item;
+
+ const variants = theme.direction === 'rtl' ? varFade().inLeft : varFade().inRight;
+
+ return (
+
+
+
+
+
+
+
+
+ {item.title}
+
+
+
+
+
+ {item.description}
+
+
+
+
+
+ View More
+
+
+
+
+ );
+}
+
+CarouselItem.propTypes = {
+ active: PropTypes.bool,
+ item: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ description: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/examples/carousel-view/carousel-basic-1.jsx b/template/src/sections/examples/carousel-view/carousel-basic-1.jsx
new file mode 100644
index 0000000..b57377e
--- /dev/null
+++ b/template/src/sections/examples/carousel-view/carousel-basic-1.jsx
@@ -0,0 +1,35 @@
+import PropTypes from 'prop-types';
+
+import Card from '@mui/material/Card';
+
+import Image from 'src/components/image';
+import Carousel, { useCarousel, CarouselArrowIndex } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function CarouselBasic1({ data }) {
+ const carousel = useCarousel({
+ autoplay: true,
+ });
+
+ return (
+
+
+ {data.map((item) => (
+
+ ))}
+
+
+
+
+ );
+}
+
+CarouselBasic1.propTypes = {
+ data: PropTypes.array,
+};
diff --git a/template/src/sections/examples/carousel-view/carousel-basic-2.jsx b/template/src/sections/examples/carousel-view/carousel-basic-2.jsx
new file mode 100644
index 0000000..bdb800c
--- /dev/null
+++ b/template/src/sections/examples/carousel-view/carousel-basic-2.jsx
@@ -0,0 +1,53 @@
+import PropTypes from 'prop-types';
+
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+import CardContent from '@mui/material/CardContent';
+
+import Image from 'src/components/image';
+import Carousel, { useCarousel, CarouselArrowIndex } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function CarouselBasic2({ data }) {
+ const carousel = useCarousel({
+ fade: true,
+ autoplay: true,
+ initialSlide: 2,
+ });
+
+ return (
+
+
+ {data.map((item) => (
+
+
+
+
+
+ {item.title}
+
+
+
+ {item.description}
+
+
+
+ ))}
+
+
+
+
+ );
+}
+
+CarouselBasic2.propTypes = {
+ data: PropTypes.array,
+};
diff --git a/template/src/sections/examples/carousel-view/carousel-basic-3.jsx b/template/src/sections/examples/carousel-view/carousel-basic-3.jsx
new file mode 100644
index 0000000..5c127cb
--- /dev/null
+++ b/template/src/sections/examples/carousel-view/carousel-basic-3.jsx
@@ -0,0 +1,60 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import { useTheme } from '@mui/material/styles';
+
+import Image from 'src/components/image';
+import Carousel, { useCarousel, CarouselDots, CarouselArrows } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function CarouselBasic3({ data }) {
+ const theme = useTheme();
+
+ const carousel = useCarousel({
+ autoplay: true,
+ ...CarouselDots({
+ rounded: true,
+ sx: { mt: 3 },
+ }),
+ });
+
+ return (
+
+
+
+ {data.map((item) => (
+
+ ))}
+
+
+
+ );
+}
+
+CarouselBasic3.propTypes = {
+ data: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function CarouselItem({ item }) {
+ const { coverUrl, title } = item;
+
+ return ;
+}
+
+CarouselItem.propTypes = {
+ item: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/examples/carousel-view/carousel-basic-4.jsx b/template/src/sections/examples/carousel-view/carousel-basic-4.jsx
new file mode 100644
index 0000000..4f9c41f
--- /dev/null
+++ b/template/src/sections/examples/carousel-view/carousel-basic-4.jsx
@@ -0,0 +1,92 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import { alpha, styled } from '@mui/material/styles';
+
+import { bgBlur } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+const StyledContentItem = styled('div')(({ theme }) => ({
+ ...bgBlur({ color: theme.palette.grey[900] }),
+ bottom: 0,
+ zIndex: 9,
+ width: '100%',
+ display: 'flex',
+ position: 'absolute',
+ alignItems: 'center',
+ padding: theme.spacing(3),
+ borderBottomLeftRadius: 16,
+ borderBottomRightRadius: 16,
+ justifyContent: 'space-between',
+ flexDirection: theme.direction === 'rtl' ? 'row-reverse' : 'row',
+}));
+
+// ----------------------------------------------------------------------
+
+export default function CarouselBasic4({ data }) {
+ const carousel = useCarousel({
+ autoplay: true,
+ fade: true,
+ });
+
+ return (
+
+
+
+ {data.map((item) => (
+
+ ))}
+
+
+
+ );
+}
+
+CarouselBasic4.propTypes = {
+ data: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function CarouselItem({ item }) {
+ const { coverUrl, title } = item;
+
+ return (
+
+
+
+
+
+ {item.title}
+
+ {}}
+ sx={{
+ color: 'common.white',
+ '&:hover': {
+ bgcolor: (theme) =>
+ alpha(theme.palette.common.white, theme.palette.action.hoverOpacity),
+ },
+ }}
+ >
+
+
+
+
+ );
+}
+
+CarouselItem.propTypes = {
+ item: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/examples/carousel-view/carousel-center-mode.jsx b/template/src/sections/examples/carousel-view/carousel-center-mode.jsx
new file mode 100644
index 0000000..e9d0479
--- /dev/null
+++ b/template/src/sections/examples/carousel-view/carousel-center-mode.jsx
@@ -0,0 +1,128 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Paper from '@mui/material/Paper';
+import CardContent from '@mui/material/CardContent';
+import { alpha, useTheme } from '@mui/material/styles';
+
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import TextMaxLine from 'src/components/text-max-line';
+import Carousel, { useCarousel, CarouselArrows } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+export default function CarouselCenterMode({ data }) {
+ const carousel = useCarousel({
+ slidesToShow: 3,
+ centerMode: true,
+ centerPadding: '60px',
+ responsive: [
+ {
+ breakpoint: 1024,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: 600,
+ settings: { slidesToShow: 2 },
+ },
+ {
+ breakpoint: 480,
+ settings: { slidesToShow: 1, centerPadding: '0' },
+ },
+ ],
+ });
+
+ return (
+
+
+
+ {data.map((item) => (
+
+
+
+ ))}
+
+
+
+ );
+}
+
+CarouselCenterMode.propTypes = {
+ data: PropTypes.array,
+};
+
+// ----------------------------------------------------------------------
+
+function CarouselItem({ item }) {
+ const theme = useTheme();
+
+ const { coverUrl, title } = item;
+
+ return (
+
+
+
+
+
+ {title}
+
+
+
+ learn More
+
+
+
+
+ );
+}
+
+CarouselItem.propTypes = {
+ item: PropTypes.shape({
+ coverUrl: PropTypes.string,
+ title: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/examples/carousel-view/carousel-thumbnail.jsx b/template/src/sections/examples/carousel-view/carousel-thumbnail.jsx
new file mode 100644
index 0000000..7f9e184
--- /dev/null
+++ b/template/src/sections/examples/carousel-view/carousel-thumbnail.jsx
@@ -0,0 +1,160 @@
+import { useEffect } from 'react';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Avatar from '@mui/material/Avatar';
+import { alpha, styled } from '@mui/material/styles';
+
+import { bgGradient } from 'src/theme/css';
+
+import Image from 'src/components/image';
+import Carousel, { useCarousel, CarouselArrowIndex } from 'src/components/carousel';
+
+// ----------------------------------------------------------------------
+
+const THUMB_SIZE = 64;
+
+const StyledThumbnailsContainer = styled('div')(({ length, theme }) => ({
+ position: 'relative',
+ margin: theme.spacing(0, 'auto'),
+ '& .slick-slide': {
+ lineHeight: 0,
+ },
+
+ ...(length === 1 && {
+ maxWidth: THUMB_SIZE * 1 + 16,
+ }),
+
+ ...(length === 2 && {
+ maxWidth: THUMB_SIZE * 2 + 32,
+ }),
+
+ ...((length === 3 || length === 4) && {
+ maxWidth: THUMB_SIZE * 3 + 48,
+ }),
+
+ ...(length >= 5 && {
+ maxWidth: THUMB_SIZE * 6,
+ }),
+
+ ...(length > 3 && {
+ '&:before, &:after': {
+ ...bgGradient({
+ direction: 'to left',
+ startColor: `${alpha(theme.palette.background.default, 0)} 0%`,
+ endColor: `${theme.palette.background.default} 100%`,
+ }),
+ top: 0,
+ zIndex: 9,
+ content: "''",
+ height: '100%',
+ position: 'absolute',
+ width: (THUMB_SIZE * 2) / 3,
+ },
+ '&:after': {
+ right: 0,
+ transform: 'scaleX(-1)',
+ },
+ }),
+}));
+
+// ----------------------------------------------------------------------
+
+export default function CarouselThumbnail({ data }) {
+ const carouselLarge = useCarousel({
+ rtl: false,
+ draggable: false,
+ adaptiveHeight: true,
+ });
+
+ const carouselThumb = useCarousel({
+ rtl: false,
+ centerMode: true,
+ swipeToSlide: true,
+ focusOnSelect: true,
+ variableWidth: true,
+ centerPadding: '0px',
+ slidesToShow: data.length > 3 ? 3 : data.length,
+ });
+
+ useEffect(() => {
+ carouselLarge.onSetNav();
+ carouselThumb.onSetNav();
+ }, [carouselLarge, carouselThumb]);
+
+ const renderLargeImg = (
+
+
+ {data.map((item) => (
+
+ ))}
+
+
+
+
+ );
+
+ const renderThumbnails = (
+
+
+ {data.map((item, index) => (
+
+ `solid 2.5px ${theme.palette.primary.main}`,
+ }),
+ }}
+ />
+
+ ))}
+
+
+ );
+
+ return (
+ (theme.direction === 'rtl' ? 'right' : 'left'),
+ },
+ }}
+ >
+ {renderLargeImg}
+
+ {renderThumbnails}
+
+ );
+}
+
+CarouselThumbnail.propTypes = {
+ data: PropTypes.array,
+};
diff --git a/template/src/sections/examples/carousel-view/index.jsx b/template/src/sections/examples/carousel-view/index.jsx
new file mode 100644
index 0000000..a4ffa2c
--- /dev/null
+++ b/template/src/sections/examples/carousel-view/index.jsx
@@ -0,0 +1,124 @@
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import CardHeader from '@mui/material/CardHeader';
+import CardContent from '@mui/material/CardContent';
+
+import { paths } from 'src/routes/paths';
+
+import { _mock } from 'src/_mock';
+
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import CarouselBasic2 from './carousel-basic-2';
+import CarouselBasic3 from './carousel-basic-3';
+import CarouselBasic1 from './carousel-basic-1';
+import CarouselBasic4 from './carousel-basic-4';
+import CarouselAnimation from './carousel-animation';
+import CarouselThumbnail from './carousel-thumbnail';
+import CarouselCenterMode from './carousel-center-mode';
+
+// ----------------------------------------------------------------------
+
+const _carouselsExample = [...Array(20)].map((_, index) => ({
+ id: _mock.id(index),
+ title: _mock.postTitle(index),
+ coverUrl: _mock.image.cover(index),
+ description: _mock.description(index),
+}));
+
+// ----------------------------------------------------------------------
+
+export default function CarouselView() {
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/component-block.jsx b/template/src/sections/examples/component-block.jsx
new file mode 100644
index 0000000..f1e4e83
--- /dev/null
+++ b/template/src/sections/examples/component-block.jsx
@@ -0,0 +1,45 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import { alpha } from '@mui/material/styles';
+import CardHeader from '@mui/material/CardHeader';
+
+// ----------------------------------------------------------------------
+
+export default function ComponentBlock({ title, sx, children, ...other }) {
+ return (
+ alpha(theme.palette.grey[500], 0.04),
+ }}
+ >
+ {title && }
+
+
+ {children}
+
+
+ );
+}
+
+ComponentBlock.propTypes = {
+ children: PropTypes.node,
+ sx: PropTypes.object,
+ title: PropTypes.string,
+};
diff --git a/template/src/sections/examples/count-up-view.jsx b/template/src/sections/examples/count-up-view.jsx
new file mode 100644
index 0000000..e1759f0
--- /dev/null
+++ b/template/src/sections/examples/count-up-view.jsx
@@ -0,0 +1,73 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import CountUp from 'src/components/count-up';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+const SUMMARY = [
+ { name: 'Jobs', number: 2230000 },
+ { name: 'Successful Hiring', number: 500000 },
+ { name: 'Partners', number: 250 },
+ { name: 'Employee', number: 1560 },
+];
+
+// ----------------------------------------------------------------------
+
+export default function CountUpPageView() {
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+ {SUMMARY.map((value) => (
+
+
+ fShortenNumber(newValue)}
+ />
+
+
+ +
+
+
+
+
+ {value.name}
+
+
+ ))}
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/form-validation-view/index.jsx b/template/src/sections/examples/form-validation-view/index.jsx
new file mode 100644
index 0000000..589c86b
--- /dev/null
+++ b/template/src/sections/examples/form-validation-view/index.jsx
@@ -0,0 +1,61 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Switch from '@mui/material/Switch';
+import Divider from '@mui/material/Divider';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+import { paths } from 'src/routes/paths';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import ReactHookForm from './react-hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function FormValidationView() {
+ const debug = useBoolean(true);
+
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+ React Hook Form + Yup
+ }
+ label="Show Debug"
+ labelPlacement="start"
+ />
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/form-validation-view/react-hook-form.jsx b/template/src/sections/examples/form-validation-view/react-hook-form.jsx
new file mode 100644
index 0000000..d4dc25e
--- /dev/null
+++ b/template/src/sections/examples/form-validation-view/react-hook-form.jsx
@@ -0,0 +1,336 @@
+import PropTypes from 'prop-types';
+import { yupResolver } from '@hookform/resolvers/yup';
+import { useForm, Controller } from 'react-hook-form';
+
+import Stack from '@mui/material/Stack';
+import Divider from '@mui/material/Divider';
+import MenuItem from '@mui/material/MenuItem';
+import Backdrop from '@mui/material/Backdrop';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import LoadingButton from '@mui/lab/LoadingButton';
+import InputAdornment from '@mui/material/InputAdornment';
+import { DatePicker } from '@mui/x-date-pickers/DatePicker';
+import CircularProgress from '@mui/material/CircularProgress';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+import FormProvider, {
+ RHFSelect,
+ RHFSwitch,
+ RHFSlider,
+ RHFCheckbox,
+ RHFTextField,
+ RHFRadioGroup,
+ RHFMultiSelect,
+ RHFAutocomplete,
+ RHFMultiCheckbox,
+} from 'src/components/hook-form';
+
+import { FormSchema } from './schema';
+import ValuesPreview from './values-preview';
+
+// ----------------------------------------------------------------------
+
+const OPTIONS = [
+ { value: 'option 1', label: 'Option 1' },
+ { value: 'option 2', label: 'Option 2' },
+ { value: 'option 3', label: 'Option 3' },
+ { value: 'option 4', label: 'Option 4' },
+ { value: 'option 5', label: 'Option 5' },
+ { value: 'option 6', label: 'Option 6' },
+ { value: 'option 7', label: 'Option 7' },
+ { value: 'option 8', label: 'Option 8' },
+];
+
+export const defaultValues = {
+ age: 0,
+ email: '',
+ fullName: '',
+ //
+ editor: '',
+ switch: false,
+ radioGroup: '',
+ autocomplete: null,
+ //
+ password: '',
+ confirmPassword: '',
+ //
+ startDate: new Date(),
+ endDate: null,
+ //
+ singleSelect: '',
+ multiSelect: [],
+ //
+ checkbox: false,
+ multiCheckbox: [],
+ //
+ slider: 8,
+ sliderRange: [15, 80],
+};
+
+export default function ReactHookForm({ debug }) {
+ const passwordShow = useBoolean();
+
+ const methods = useForm({
+ resolver: yupResolver(FormSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ control,
+ setValue,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ await new Promise((resolve) => setTimeout(resolve, 3000));
+ console.log('DATA', data);
+ reset();
+ });
+
+ return (
+ <>
+ {isSubmitting && (
+ theme.zIndex.modal + 1 }}>
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setValue('age', Number(event.target.value), {
+ shouldValidate: true,
+ })
+ }
+ InputProps={{
+ type: 'number',
+ }}
+ />
+
+
+
+ (
+
+ )}
+ />
+
+ (
+
+ )}
+ />
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+ option.label}
+ isOptionEqualToValue={(option, value) => option.value === value.value}
+ renderOption={(props, option) => (
+
+ {option.label}
+
+ )}
+ />
+
+
+
+
+ None
+
+ {OPTIONS.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Submit to check
+
+
+
+
+
+ {debug && }
+
+ >
+ );
+}
+
+ReactHookForm.propTypes = {
+ debug: PropTypes.bool,
+};
+
+// ----------------------------------------------------------------------
+
+function Block({ label = 'RHFTextField', sx, children }) {
+ return (
+
+
+ {label}
+
+ {children}
+
+ );
+}
+
+Block.propTypes = {
+ children: PropTypes.node,
+ label: PropTypes.string,
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/examples/form-validation-view/schema.js b/template/src/sections/examples/form-validation-view/schema.js
new file mode 100644
index 0000000..734d13e
--- /dev/null
+++ b/template/src/sections/examples/form-validation-view/schema.js
@@ -0,0 +1,48 @@
+import * as Yup from 'yup';
+
+// ----------------------------------------------------------------------
+
+export const FormSchema = Yup.object().shape({
+ fullName: Yup.string()
+ .required('Full name is required')
+ .min(6, 'Mininum 6 characters')
+ .max(32, 'Maximum 32 characters'),
+ email: Yup.string().required('Email is required').email('Email must be a valid email address'),
+ age: Yup.number()
+ .required('Age is required')
+ .moreThan(18, 'Age must be between 18 and 100')
+ .lessThan(100, 'Age must be between 18 and 100'),
+ //
+ startDate: Yup.mixed().nullable().required('Start date is required'),
+ endDate: Yup.mixed()
+ .required('End date is required')
+ .test(
+ 'date-min',
+ 'End date must be later than start date',
+ (value, { parent }) => value.getTime() > parent.startDate.getTime()
+ ),
+ //
+ password: Yup.string()
+ .required('Password is required')
+ .min(6, 'Password should be of minimum 6 characters length'),
+ confirmPassword: Yup.string()
+ .required('Confirm password is required')
+ .oneOf([Yup.ref('password')], "Password's not match"),
+ //
+ slider: Yup.number().required('Slider is required').min(10, 'Mininum value is >= 10'),
+ sliderRange: Yup.mixed()
+ .required('Slider range is is required')
+ .test('min', 'Range must be between 20 and 80', (value) => value[0] >= 20)
+ .test('max', 'Range must be between 20 and 80', (value) => value[1] <= 80),
+ //
+ checkbox: Yup.boolean().oneOf([true], 'Checkbox is required'),
+ multiCheckbox: Yup.array().min(1, 'Choose at least one option'),
+ //
+ singleSelect: Yup.string().required('Single select is required'),
+ multiSelect: Yup.array().min(2, 'Must have at least 2 items'),
+ //
+ switch: Yup.boolean().oneOf([true], 'Switch is required'),
+ radioGroup: Yup.string().required('Choose at least one option'),
+ editor: Yup.string().required('Editor is required'),
+ autocomplete: Yup.mixed().nullable().required('Autocomplete is required'),
+});
diff --git a/template/src/sections/examples/form-validation-view/values-preview.jsx b/template/src/sections/examples/form-validation-view/values-preview.jsx
new file mode 100644
index 0000000..11d8d88
--- /dev/null
+++ b/template/src/sections/examples/form-validation-view/values-preview.jsx
@@ -0,0 +1,79 @@
+import { useFormContext } from 'react-hook-form';
+
+import Stack from '@mui/material/Stack';
+import Portal from '@mui/material/Portal';
+import Divider from '@mui/material/Divider';
+import { useTheme } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { bgBlur } from 'src/theme/css';
+
+// ----------------------------------------------------------------------
+
+export default function ValuesPreview() {
+ const theme = useTheme();
+
+ const mdUp = useResponsive('up', 'md');
+
+ const {
+ watch,
+ formState: { errors },
+ } = useFormContext();
+
+ const values = watch();
+
+ if (!mdUp) {
+ return null;
+ }
+
+ return (
+
+
+
+ Values
+
+
+ {Object.keys(values).map((value) => (
+
+
+ {value} :
+
+
+ {parseValue(values, value)}
+
+ ))}
+
+
+
+
+ Errors
+
+
+
+ {JSON.stringify(Object.keys(errors), null, 2)}
+
+
+
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function parseValue(values, value) {
+ return JSON.stringify(values[value]) || '---';
+}
diff --git a/template/src/sections/examples/icons-view.jsx b/template/src/sections/examples/icons-view.jsx
new file mode 100644
index 0000000..410ea66
--- /dev/null
+++ b/template/src/sections/examples/icons-view.jsx
@@ -0,0 +1,92 @@
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Tooltip from '@mui/material/Tooltip';
+import Container from '@mui/material/Container';
+
+import { paths } from 'src/routes/paths';
+
+import Iconify from 'src/components/iconify';
+import SvgColor from 'src/components/svg-color';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import ComponentBlock from './component-block';
+
+// ----------------------------------------------------------------------
+
+export default function IconsView() {
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+ https://mui.com/components/icons/#main-content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/image-view.jsx b/template/src/sections/examples/image-view.jsx
new file mode 100644
index 0000000..8e96380
--- /dev/null
+++ b/template/src/sections/examples/image-view.jsx
@@ -0,0 +1,94 @@
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import CardHeader from '@mui/material/CardHeader';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+
+import { _mock } from 'src/_mock';
+
+import Image from 'src/components/image';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+const RATIO = ['4/3', '3/4', '6/4', '4/6', '16/9', '9/16', '21/9', '9/21', '1/1'];
+
+const IMAGES = RATIO.map((ratio, index) => ({
+ ratio,
+ url: _mock.image.cover(index + 1),
+}));
+
+export default function ImageView() {
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+ {IMAGES.map((img) => (
+
+ ))}
+
+
+
+
+
+
+ {IMAGES.map((img) => (
+
+
+ {img.ratio}
+
+
+
+
+ ))}
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/label-view.jsx b/template/src/sections/examples/label-view.jsx
new file mode 100644
index 0000000..43f8638
--- /dev/null
+++ b/template/src/sections/examples/label-view.jsx
@@ -0,0 +1,116 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Tooltip from '@mui/material/Tooltip';
+import Container from '@mui/material/Container';
+
+import { paths } from 'src/routes/paths';
+
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+import ComponentBlock from './component-block';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['default', 'primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export default function LabelView() {
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+ {COLORS.map((color) => (
+
+
+ {color}
+
+
+ ))}
+
+
+
+ {COLORS.map((color) => (
+
+ {color}
+
+ ))}
+
+
+
+ {COLORS.map((color) => (
+
+ {color}
+
+ ))}
+
+
+
+ }
+ >
+ Start Icon
+
+
+ }
+ >
+ End Icon
+
+
+ }
+ >
+ Start Icon
+
+
+ }
+ >
+ End Icon
+
+
+ }>
+ Start Icon
+
+
+ }>
+ End Icon
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/lightbox-view.jsx b/template/src/sections/examples/lightbox-view.jsx
new file mode 100644
index 0000000..0169e17
--- /dev/null
+++ b/template/src/sections/examples/lightbox-view.jsx
@@ -0,0 +1,242 @@
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Switch from '@mui/material/Switch';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import FormLabel from '@mui/material/FormLabel';
+import FormControl from '@mui/material/FormControl';
+import FormControlLabel from '@mui/material/FormControlLabel';
+
+import { paths } from 'src/routes/paths';
+
+import { _mock } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Lightbox, { useLightbox } from 'src/components/lightbox';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+const images = [...Array(4)].map((_, index) => ({
+ src: _mock.image.cover(index + 1),
+ title: 'Flamingo',
+ description: 'Vicko Mozara \n Veliki zali, Dubravica, Croatia',
+}));
+
+const slides = [
+ ...images,
+ {
+ type: 'video',
+ width: 1280,
+ height: 720,
+ poster:
+ 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg',
+ sources: [
+ {
+ src: 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4',
+ type: 'video/mp4',
+ },
+ ],
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function LightboxView() {
+ const lightbox = useLightbox(slides);
+
+ const [state, setState] = useState({
+ disabledZoom: false,
+ disabledVideo: false,
+ disabledTotal: false,
+ disabledCaptions: false,
+ disabledSlideshow: false,
+ disabledThumbnails: false,
+ disabledFullscreen: false,
+ });
+
+ const handleChange = useCallback(
+ (event) => {
+ setState({
+ ...state,
+ [event.target.name]: event.target.checked,
+ });
+ },
+ [state]
+ );
+
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+ {slides.map((slide) => {
+ const thumbnail = slide.type === 'video' ? slide.poster : slide.src;
+
+ return (
+ lightbox.onOpen(`${thumbnail}`)}
+ sx={{
+ borderRadius: 1,
+ cursor: 'pointer',
+ }}
+ />
+ );
+ })}
+
+
+
+
+
+
+
+
+ Controls
+
+
+
+ }
+ label="Disabled Zoom"
+ />
+
+
+ }
+ label="Disabled Total"
+ />
+
+
+ }
+ label="Disabled Video"
+ />
+
+
+ }
+ label="Disabled Captions"
+ />
+
+
+ }
+ label="Disabled Slideshow"
+ />
+
+
+ }
+ label="Disabled Thumbnails"
+ />
+
+
+ }
+ label="Disabled Fullscreen"
+ />
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/markdown-view.jsx b/template/src/sections/examples/markdown-view.jsx
new file mode 100644
index 0000000..5983d02
--- /dev/null
+++ b/template/src/sections/examples/markdown-view.jsx
@@ -0,0 +1,116 @@
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Container from '@mui/material/Container';
+import CardContent from '@mui/material/CardContent';
+
+import { paths } from 'src/routes/paths';
+
+import Markdown from 'src/components/markdown';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+const content = `
+h1
+
+
+h2
+
+
+ Paragraph Lorem ipsum is placeholder text commonly used in the graphic, print, and publishing industries for previewing layouts and visual mockups
+
+
+
+ Link (https://www.google.com/)
+
+
+
+Lists
+
+
+
+
+
+
+
+
+
+
+A table:
+
+
+
+
+ Syntax
+ Description
+ Test Text
+
+
+
+
+ Header
+ Title
+ Here's this
+
+
+ Paragraph
+ Text
+ And more
+
+
+
+
+
+
+
+
+
+
+
+
+ A block quote with strikethrough and a URL: https://reactjs.org .
+`;
+
+export default function MarkdownView() {
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/mega-menu-view.jsx b/template/src/sections/examples/mega-menu-view.jsx
new file mode 100644
index 0000000..c0e8132
--- /dev/null
+++ b/template/src/sections/examples/mega-menu-view.jsx
@@ -0,0 +1,318 @@
+import { useEffect } from 'react';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import AppBar from '@mui/material/AppBar';
+import Button from '@mui/material/Button';
+import Drawer from '@mui/material/Drawer';
+import Toolbar from '@mui/material/Toolbar';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { usePathname } from 'src/routes/hooks';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _mock } from 'src/_mock';
+
+import Logo from 'src/components/logo';
+import Iconify from 'src/components/iconify';
+import Scrollbar from 'src/components/scrollbar';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+import {
+ MegaMenuMobile,
+ MegaMenuDesktopVertical,
+ MegaMenuDesktopHorizontal,
+} from 'src/components/mega-menu';
+
+// ----------------------------------------------------------------------
+
+export default function MegaMenuView() {
+ const pathname = usePathname();
+
+ const mobileOpen = useBoolean();
+
+ useEffect(() => {
+ if (mobileOpen) {
+ mobileOpen.onFalse();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname]);
+
+ const renderHorizontal = (
+ theme.customShadows.z8,
+ }}
+ >
+
+
+ Menu Horizon
+
+
+
+
+
+ );
+
+ const renderVertical = (
+
+
+
+ Menu Vertical
+
+
+
+
+
+
+
+
+
+ );
+
+ const renderMobile = (
+ <>
+ }
+ >
+ Menu Mobile
+
+
+
+
+
+
+
+
+
+ >
+ );
+
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+ {renderHorizontal}
+
+
+ {renderMobile}
+
+ {renderVertical}
+
+ >
+ );
+}
+
+// ----------------------------------------------------------------------
+
+const NAV_ITEMS = [
+ {
+ title: 'Item 1',
+ path: '#',
+ icon: ,
+ products: [...Array(10)].map((_, index) => ({
+ name: _mock.productName(index),
+ coverUrl: _mock.image.product(index),
+ path: '#',
+ })),
+ moreLink: {
+ title: 'More Categories',
+ path: '#',
+ },
+ tags: [
+ { title: 'Paper Cup', path: '#' },
+ { title: 'Lotion Pump', path: '#' },
+ { title: 'Brush Cutter', path: '#' },
+ { title: 'Display Rack', path: '#' },
+ { title: 'Glass Bottle', path: '#' },
+ ],
+ children: [
+ {
+ subheader: 'Other Machinery & Parts',
+ items: [
+ { title: 'Metallic Processing Machinery', path: '#' },
+ { title: 'Machinery for Food, Beverage & Cereal', path: '#' },
+ { title: 'Laser Equipment', path: '#' },
+ { title: 'Mould', path: '#' },
+ { title: 'Textile Machinery & Parts', path: '#' },
+ { title: 'Cutting & Fold-bend Machine', path: '#' },
+ { title: 'Paper Machinery', path: '#' },
+ { title: 'Rubber Machinery', path: '#' },
+ { title: 'Chemical Equipment & Machinery', path: '#' },
+ { title: 'Mixing Equipment', path: '#' },
+ { title: 'Machinery for Garment, Shoes & Accessories', path: '#' },
+ { title: 'Crushing & Culling Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Plastic & Woodworking',
+ items: [
+ { title: 'Plastic Machinery', path: '#' },
+ { title: 'Woodworking Machinery', path: '#' },
+ { title: 'Blow Molding Machine', path: '#' },
+ { title: 'Plastic Recycling Machine', path: '#' },
+ { title: 'Injection Molding Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Construction Machinery',
+ items: [
+ { title: 'Building Material Making Machinery', path: '#' },
+ { title: 'Lifting Equipment', path: '#' },
+ { title: 'Excavator', path: '#' },
+ { title: 'Concrete Machinery', path: '#' },
+ { title: 'Stone Processing Machinery', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Agriculture Machinery',
+ items: [
+ { title: 'Agriculture Machinery', path: '#' },
+ { title: 'Livestock MachineryFeed', path: '#' },
+ { title: 'Feed Processing Machinery', path: '#' },
+ { title: 'Tiller', path: '#' },
+ { title: 'Harvesting Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Machine Tools',
+ items: [
+ { title: 'CNC Machine Tools', path: '#' },
+ { title: 'Lathe', path: '#' },
+ { title: 'Grinding Machine ', path: '#' },
+ { title: 'Drilling Machine ', path: '#' },
+ { title: 'Milling Machine ', path: '#' },
+ ],
+ },
+ ],
+ },
+ {
+ title: 'Item 2',
+ path: '#',
+ icon: ,
+ children: [
+ {
+ subheader: 'Other Machinery & Parts',
+ items: [
+ { title: 'Metallic Processing Machinery', path: '#' },
+ { title: 'Machinery for Food, Beverage & Cereal', path: '#' },
+ { title: 'Laser Equipment', path: '#' },
+ { title: 'Mould', path: '#' },
+ { title: 'Textile Machinery & Parts', path: '#' },
+ { title: 'Cutting & Fold-bend Machine', path: '#' },
+ { title: 'Paper Machinery', path: '#' },
+ { title: 'Rubber Machinery', path: '#' },
+ { title: 'Chemical Equipment & Machinery', path: '#' },
+ { title: 'Mixing Equipment', path: '#' },
+ { title: 'Machinery for Garment, Shoes & Accessories', path: '#' },
+ { title: 'Crushing & Culling Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Plastic & Woodworking',
+ items: [
+ { title: 'Plastic Machinery', path: '#' },
+ { title: 'Woodworking Machinery', path: '#' },
+ { title: 'Blow Molding Machine', path: '#' },
+ { title: 'Plastic Recycling Machine', path: '#' },
+ { title: 'Injection Molding Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Construction Machinery',
+ items: [
+ { title: 'Building Material Making Machinery', path: '#' },
+ { title: 'Lifting Equipment', path: '#' },
+ { title: 'Excavator', path: '#' },
+ { title: 'Concrete Machinery', path: '#' },
+ { title: 'Stone Processing Machinery', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Agriculture Machinery',
+ items: [
+ { title: 'Agriculture Machinery', path: '#' },
+ { title: 'Livestock MachineryFeed', path: '#' },
+ { title: 'Feed Processing Machinery', path: '#' },
+ { title: 'Tiller', path: '#' },
+ { title: 'Harvesting Machine', path: '#' },
+ ],
+ },
+ {
+ subheader: 'Machine Tools',
+ items: [
+ { title: 'CNC Machine Tools', path: '#' },
+ { title: 'Lathe', path: '#' },
+ { title: 'Grinding Machine ', path: '#' },
+ { title: 'Drilling Machine ', path: '#' },
+ { title: 'Milling Machine ', path: '#' },
+ ],
+ },
+ ],
+ },
+ {
+ title: 'Item 3',
+ path: '#',
+ icon: ,
+ children: [
+ {
+ subheader: '',
+ items: [
+ { title: 'Metallic Processing Machinery', path: '#' },
+ { title: 'Machinery for Food, Beverage & Cereal', path: '#' },
+ { title: 'Laser Equipment', path: '#' },
+ { title: 'Mould', path: '#' },
+ { title: 'Textile Machinery & Parts', path: '#' },
+ { title: 'Cutting & Fold-bend Machine', path: '#' },
+ { title: 'Paper Machinery', path: '#' },
+ { title: 'Rubber Machinery', path: '#' },
+ { title: 'Chemical Equipment & Machinery', path: '#' },
+ { title: 'Mixing Equipment', path: '#' },
+ { title: 'Machinery for Garment, Shoes & Accessories', path: '#' },
+ { title: 'Crushing & Culling Machine', path: '#' },
+ ],
+ },
+ ],
+ },
+ {
+ title: 'Item 4',
+ path: 'https://www.google.com/',
+ icon: ,
+ },
+];
diff --git a/template/src/sections/examples/navigation-bar-view.jsx b/template/src/sections/examples/navigation-bar-view.jsx
new file mode 100644
index 0000000..6a255c8
--- /dev/null
+++ b/template/src/sections/examples/navigation-bar-view.jsx
@@ -0,0 +1,594 @@
+import PropTypes from 'prop-types';
+import isEqual from 'lodash.isequal';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import Badge from '@mui/material/Badge';
+import Stack from '@mui/material/Stack';
+import Switch from '@mui/material/Switch';
+import Drawer from '@mui/material/Drawer';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+import ToggleButton from '@mui/material/ToggleButton';
+import FormControlLabel from '@mui/material/FormControlLabel';
+import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
+
+import { paths } from 'src/routes/paths';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Logo from 'src/components/logo';
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+import { NavBasicMobile, NavBasicDesktop } from 'src/components/nav-basic';
+import {
+ NavSectionMini,
+ NavSectionVertical,
+ NavSectionHorizontal,
+} from 'src/components/nav-section';
+
+// ----------------------------------------------------------------------
+
+const defaultConfig = {
+ gap: 4,
+ icon: 24,
+ currentRole: 'admin',
+ rootItemHeight: 44,
+ subItemHeight: 36,
+ padding: '4px 8px 4px 12px',
+ radius: 8,
+ hiddenLabel: false,
+ hiddenSubheader: false,
+};
+
+export default function NavigationBarView() {
+ const mobileOpen = useBoolean();
+
+ const [config, setConfig] = useState(defaultConfig);
+
+ const canReset = !isEqual(defaultConfig, config);
+
+ const handleChangeConfig = useCallback((name, value) => {
+ setConfig((prevState) => ({
+ ...prevState,
+ [name]: value,
+ }));
+ }, []);
+
+ const handleReset = useCallback(() => {
+ setConfig(defaultConfig);
+ }, []);
+
+ const renderNavBasic = (
+ <>
+
+ Nav Basic
+ theme.customShadows.z20,
+ }}
+ >
+
+
+
+
+ theme.typography.fontSecondaryFamily,
+ '& .icon': {
+ /* push your styles */
+ },
+ '& .text-container': {},
+ '& .label': {},
+ '& .caption': {},
+ '& .arrow': {},
+ },
+ subItem: {
+ '& .icon': {},
+ '& .text-container': {},
+ '& .label': {},
+ '& .caption': {},
+ '& .arrow': {},
+ },
+ }}
+ />
+
+
+
+
+
+ theme.typography.fontSecondaryFamily,
+ '& .icon': {
+ /* push your styles */
+ },
+ '& .text-container': {},
+ '& .label': {},
+ '& .caption': {},
+ '& .arrow': {},
+ },
+ subItem: {
+ '& .icon': {},
+ '& .text-container': {},
+ '& .label': {},
+ '& .caption': {},
+ '& .arrow': {},
+ },
+ }}
+ />
+
+ >
+ );
+
+ const renderNavVertical = (
+
+ Nav Vertical
+
+ theme.customShadows.z20,
+ }}
+ slotProps={{
+ gap: config.gap,
+ currentRole: config.currentRole,
+ rootItem: {
+ padding: config.padding,
+ minHeight: config.rootItemHeight,
+ borderRadius: `${config.radius}px`,
+ '& .icon, .sub-icon': {
+ width: config.icon,
+ height: config.icon,
+ ...(!config.icon && { display: 'none' }),
+ },
+ ...(config.hiddenLabel && {
+ '& .label, .caption': {
+ display: 'none',
+ },
+ }),
+ },
+ subItem: {
+ padding: config.padding,
+ minHeight: config.subItemHeight,
+ borderRadius: `${config.radius}px`,
+ '& .icon, .sub-icon': {
+ width: config.icon,
+ height: config.icon,
+ ...(!config.icon && { display: 'none' }),
+ },
+ ...(config.hiddenLabel && {
+ '& .label, .caption': {
+ display: 'none',
+ },
+ }),
+ },
+ subheader: {
+ ...(config.hiddenSubheader && {
+ display: 'none',
+ }),
+ },
+ }}
+ />
+
+ );
+
+ const renderNavMini = (
+
+ Nav Mini
+
+ theme.customShadows.z20,
+ }}
+ />
+
+ );
+
+ const renderNavHorizontal = (
+
+ Nav Horizontal
+ theme.customShadows.z20,
+ }}
+ >
+
+
+
+ );
+
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+ alpha(theme.palette.grey[500], 0.04),
+ }}
+ >
+ {renderNavBasic}
+
+
+ alpha(theme.palette.grey[500], 0.04),
+ }}
+ >
+ {renderNavHorizontal}
+
+
+ {renderNavMini}
+
+ {renderNavVertical}
+
+
+
+
+
+ >
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function ControlsPanel({ config, onChangeConfig, canReset, onReset }) {
+ return (
+
+
+
+ ControlsPanel
+
+
+ {canReset && (
+
+
+
+
+
+ )}
+
+
+ {/* Gap */}
+
+ Gap
+ {
+ if (newValue !== null) {
+ onChangeConfig('gap', newValue);
+ }
+ }}
+ >
+ {[4, 8, 16, 40].map((i) => (
+
+ {i}
+
+ ))}
+
+
+
+ {/* Size */}
+
+ Icon
+ {
+ if (newValue !== null) {
+ onChangeConfig('icon', newValue);
+ }
+ }}
+ >
+ {[0, 16, 20, 24, 40].map((i) => (
+
+ {i}
+
+ ))}
+
+
+
+ {/* Radius */}
+
+ Radius
+ {
+ if (newValue !== null) {
+ onChangeConfig('radius', newValue);
+ }
+ }}
+ >
+ {[0, 8, 16, 40].map((i) => (
+
+ {i}
+
+ ))}
+
+
+
+ {/* Role */}
+
+ Role
+ {
+ if (newValue !== null) {
+ onChangeConfig('currentRole', newValue);
+ }
+ }}
+ >
+ {['admin', 'user'].map((i) => (
+
+ {i}
+
+ ))}
+
+
+
+ {/* Root Height */}
+
+ Item Root Height
+ {
+ if (newValue !== null) {
+ onChangeConfig('rootItemHeight', newValue);
+ }
+ }}
+ >
+ {[36, 44, 64, 80].map((i) => (
+
+ {i}
+
+ ))}
+
+
+
+ {/* Sub Height */}
+
+ Item Sub Height
+ {
+ if (newValue !== null) {
+ onChangeConfig('subItemHeight', newValue);
+ }
+ }}
+ >
+ {[36, 44, 64, 80].map((i) => (
+
+ {i}
+
+ ))}
+
+
+
+ {/* Padding */}
+ onChangeConfig('padding', event.target.value)}
+ />
+
+ onChangeConfig('hiddenLabel', !config.hiddenLabel)}
+ />
+ }
+ label="Hidden Label"
+ />
+
+ onChangeConfig('hiddenSubheader', !config.hiddenSubheader)}
+ />
+ }
+ label="Hidden Subheader"
+ />
+
+ );
+}
+
+ControlsPanel.propTypes = {
+ onReset: PropTypes.func,
+ canReset: PropTypes.bool,
+ config: PropTypes.object,
+ onChangeConfig: PropTypes.func,
+};
+
+// ----------------------------------------------------------------------
+
+const BASIC_NAV_ITEMS = [
+ { title: 'Home', path: '#' },
+ {
+ title: 'Page',
+ path: '#',
+ caption: 'This is the caption',
+ children: [
+ {
+ title: 'Page 1',
+ path: '#',
+ caption: 'This is the caption',
+ children: [
+ { title: 'Page 1.1', path: '#' },
+ { title: 'Page 1.2', path: '#' },
+ ],
+ },
+ {
+ title: 'Page 2',
+ path: '#',
+ children: [
+ { title: 'Page 2.1', path: '#' },
+ { title: 'Page 2.2', path: '#' },
+ {
+ title: 'Page 2.3',
+ path: '#',
+ children: [
+ { title: 'Page 2.3.1', path: '#' },
+ { title: 'Page 2.3.2', path: '#' },
+ { title: 'Page 2.3.3', path: '#' },
+ ],
+ },
+ ],
+ },
+ { title: 'Page 3', path: '#' },
+ ],
+ },
+ { title: 'Blog', path: '#' },
+ { title: 'About', path: '#' },
+ { title: 'Contact', path: '#' },
+ { title: 'External', path: 'https://www.google.com/' },
+];
+
+const NAV_ITEMS = [
+ {
+ subheader: 'Marketing',
+ items: [
+ {
+ title: 'Landing',
+ path: '#',
+ icon: ,
+ roles: ['admin'],
+ caption: 'Display only admin role',
+ },
+ {
+ title: 'Services',
+ path: '#',
+ icon: ,
+ roles: ['admin', 'user'],
+ },
+ {
+ title: 'Case Studies',
+ path: '#',
+ icon: ,
+ info: +32 ,
+ children: [
+ { title: 'Case Studies', path: '#' },
+ { title: 'Case Study', path: '#' },
+ ],
+ },
+ {
+ title: 'Blog',
+ path: '#',
+ icon: ,
+ children: [
+ { title: 'Blog Posts', path: '#' },
+ { title: 'Blog Post', path: '#' },
+ ],
+ },
+ ],
+ },
+ {
+ subheader: 'Travel',
+ items: [
+ {
+ title: 'About',
+ path: '#',
+ icon: ,
+ },
+ {
+ title: 'Contact',
+ path: '#',
+ icon: ,
+ },
+ {
+ title: 'Level',
+ path: '#',
+ icon: ,
+ children: [
+ { title: 'Level 2.1', path: '#' },
+ { title: 'Level 2.2', path: '#' },
+ {
+ title: 'Level 2.3',
+ path: '#',
+ children: [
+ { title: 'Level 3.1', path: '#' },
+ { title: 'Level 3.2', path: '#' },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+];
diff --git a/template/src/sections/examples/player-view.jsx b/template/src/sections/examples/player-view.jsx
new file mode 100644
index 0000000..fc1f3fa
--- /dev/null
+++ b/template/src/sections/examples/player-view.jsx
@@ -0,0 +1,60 @@
+import Fab from '@mui/material/Fab';
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+
+import { paths } from 'src/routes/paths';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _mock } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+import Player, { PlayerDialog } from 'src/components/player';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+export default function PlayerView() {
+ const videoOpen = useBoolean();
+
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+ Open with Dialog
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/scroll-progress-view.jsx b/template/src/sections/examples/scroll-progress-view.jsx
new file mode 100644
index 0000000..fcac299
--- /dev/null
+++ b/template/src/sections/examples/scroll-progress-view.jsx
@@ -0,0 +1,136 @@
+import { useRef } from 'react';
+import { useScroll } from 'framer-motion';
+
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Container from '@mui/material/Container';
+import CardHeader from '@mui/material/CardHeader';
+import CardContent from '@mui/material/CardContent';
+
+import { paths } from 'src/routes/paths';
+
+import ScrollProgress from 'src/components/scroll-progress';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+export default function ScrollProgressView() {
+ const containerRef = useRef(null);
+
+ const scrollDocument = useScroll();
+
+ const scrollContainer = useScroll({ container: containerRef });
+
+ return (
+ <>
+
+
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+ Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Quisque ut nisi.
+ Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Vestibulum eu
+ odio. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Cras ultricies mi eu
+ turpis hendrerit fringilla. Phasellus consectetuer vestibulum elit. Phasellus magna.
+ Nullam tincidunt adipiscing enim. Vestibulum volutpat pretium libero. Nullam quis ante.
+ Morbi mollis tellus ac sapien. Donec orci lectus, aliquam ut, faucibus non, euismod id,
+ nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac
+ turpis egestas. Fusce ac felis sit amet ligula pharetra condimentum. Morbi mattis
+ ullamcorper velit. Vivamus consectetuer hendrerit lacus. Nullam quis ante. Praesent
+ turpis. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a
+ pretium mi sem ut ipsum. Donec mi odio, faucibus at, scelerisque quis, convallis in,
+ nisi. Quisque ut nisi. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum
+ eget, diam. Vestibulum eu odio. Proin sapien ipsum, porta a, auctor quis, euismod ut,
+ mi. Cras ultricies mi eu turpis hendrerit fringilla. Phasellus consectetuer vestibulum
+ elit. Phasellus magna. Nullam tincidunt adipiscing enim. Vestibulum volutpat pretium
+ libero. Nullam quis ante. Morbi mollis tellus ac sapien. Donec orci lectus, aliquam ut,
+ faucibus non, euismod id, nulla. Pellentesque habitant morbi tristique senectus et netus
+ et malesuada fames ac turpis egestas. Fusce ac felis sit amet ligula pharetra
+ condimentum. Morbi mattis ullamcorper velit. Vivamus consectetuer hendrerit lacus.
+ Nullam quis ante. Praesent turpis. Praesent porttitor, nulla vitae posuere iaculis, arcu
+ nisl dignissim dolor, a pretium mi sem ut ipsum. Donec mi odio, faucibus at, scelerisque
+ quis, convallis in, nisi. Quisque ut nisi. Suspendisse nisl elit, rhoncus eget,
+ elementum ac, condimentum eget, diam. Vestibulum eu odio. Proin sapien ipsum, porta a,
+ auctor quis, euismod ut, mi. Cras ultricies mi eu turpis hendrerit fringilla. Phasellus
+ consectetuer vestibulum elit. Phasellus magna. Nullam tincidunt adipiscing enim.
+ Vestibulum volutpat pretium libero. Nullam quis ante. Morbi mollis tellus ac sapien.
+ Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla. Pellentesque habitant
+ morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce ac felis
+ sit amet ligula pharetra condimentum. Morbi mattis ullamcorper velit. Vivamus
+ consectetuer hendrerit lacus. Nullam quis ante. Praesent turpis. Praesent porttitor,
+ nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Donec
+ mi odio, faucibus at, scelerisque quis, convallis in, nisi. Quisque ut nisi. Suspendisse
+ nisl elit, rhoncus eget, elementum ac, condimentum eget, diam. Vestibulum eu odio. Proin
+ sapien ipsum, porta a, auctor quis, euismod ut, mi. Cras ultricies mi eu turpis
+ hendrerit fringilla. Phasellus consectetuer vestibulum elit. Phasellus magna. Nullam
+ tincidunt adipiscing enim. Vestibulum volutpat pretium libero. Nullam quis ante. Morbi
+ mollis tellus ac sapien. Donec orci lectus, aliquam ut, faucibus non, euismod id, nulla.
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis
+ egestas. Fusce ac felis sit amet ligula pharetra condimentum. Morbi mattis ullamcorper
+ velit. Vivamus consectetuer hendrerit lacus. Nullam quis ante. Praesent turpis. Praesent
+ porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi sem ut
+ ipsum. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Quisque ut
+ nisi. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam.
+ Vestibulum eu odio. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Cras
+ ultricies mi eu turpis hendrerit fringilla. Phasellus consectetuer vestibulum elit.
+ Phasellus magna. Nullam tincidunt adipiscing enim. Vestibulum volutpat pretium libero.
+ Nullam quis ante. Morbi mollis tellus ac sapien. Donec orci lectus, aliquam ut, faucibus
+ non, euismod id, nulla. Pellentesque habitant morbi tristique senectus et netus et
+ malesuada fames ac turpis egestas. Fusce ac felis sit amet ligula pharetra condimentum.
+ Morbi mattis ullamcorper velit. Vivamus consectetuer hendrerit lacus. Nullam quis ante.
+ Praesent turpis. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl dignissim
+ dolor, a pretium mi sem ut ipsum. Donec mi odio, faucibus at, scelerisque quis,
+ convallis in, nisi. Quisque ut nisi. Suspendisse nisl elit, rhoncus eget, elementum ac,
+ condimentum eget, diam. Vestibulum eu odio. Proin sapien ipsum, porta a, auctor quis,
+ euismod ut, mi. Cras ultricies mi eu turpis hendrerit fringilla. Phasellus consectetuer
+ vestibulum elit. Phasellus magna. Nullam tincidunt adipiscing enim. Vestibulum volutpat
+ pretium libero. Nullam quis ante. Morbi mollis tellus ac sapien. Donec orci lectus,
+ aliquam ut, faucibus non, euismod id, nulla. Pellentesque habitant morbi tristique
+ senectus et netus et malesuada fames ac turpis egestas. Fusce ac felis sit amet ligula
+ pharetra condimentum. Morbi mattis ullamcorper velit. Vivamus consectetuer hendrerit
+ lacus. Nullam quis ante. Praesent turpis. Praesent porttitor, nulla vitae posuere
+ iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum.
+
+
+
+
+ 👇 Scroll Down Document
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/scroll-view.jsx b/template/src/sections/examples/scroll-view.jsx
new file mode 100644
index 0000000..2823cc9
--- /dev/null
+++ b/template/src/sections/examples/scroll-view.jsx
@@ -0,0 +1,113 @@
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Container from '@mui/material/Container';
+import CardHeader from '@mui/material/CardHeader';
+import CardContent from '@mui/material/CardContent';
+
+import { paths } from 'src/routes/paths';
+
+import Scrollbar from 'src/components/scrollbar';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+export default function ScrollView() {
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+ Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Quisque ut nisi.
+ Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam.
+ Vestibulum eu odio. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Cras
+ ultricies mi eu turpis hendrerit fringilla. Phasellus consectetuer vestibulum elit.
+ Phasellus magna. Nullam tincidunt adipiscing enim. Vestibulum volutpat pretium
+ libero. Nullam quis ante. Morbi mollis tellus ac sapien. Donec orci lectus, aliquam
+ ut, faucibus non, euismod id, nulla. Pellentesque habitant morbi tristique senectus
+ et netus et malesuada fames ac turpis egestas. Fusce ac felis sit amet ligula
+ pharetra condimentum. Morbi mattis ullamcorper velit. Vivamus consectetuer hendrerit
+ lacus. Nullam quis ante. Praesent turpis. Praesent porttitor, nulla vitae posuere
+ iaculis, arcu nisl dignissim dolor, a pretium mi sem ut ipsum. Donec mi odio,
+ faucibus at, scelerisque quis, convallis in, nisi. Quisque ut nisi. Suspendisse nisl
+ elit, rhoncus eget, elementum ac, condimentum eget, diam. Vestibulum eu odio. Proin
+ sapien ipsum, porta a, auctor quis, euismod ut, mi. Cras ultricies mi eu turpis
+ hendrerit fringilla. Phasellus consectetuer vestibulum elit. Phasellus magna. Nullam
+ tincidunt adipiscing enim. Vestibulum volutpat pretium libero. Nullam quis ante.
+ Morbi mollis tellus ac sapien. Donec orci lectus, aliquam ut, faucibus non, euismod
+ id, nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada
+ fames ac turpis egestas. Fusce ac felis sit amet ligula pharetra condimentum. Morbi
+ mattis ullamcorper velit. Vivamus consectetuer hendrerit lacus. Nullam quis ante.
+ Praesent turpis. Praesent porttitor, nulla vitae posuere iaculis, arcu nisl
+ dignissim dolor, a pretium mi sem ut ipsum.
+
+
+
+
+
+
+
+
+
+ Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi. Quisque ut nisi.
+ Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum eget, diam.
+ Vestibulum eu odio. Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Cras
+ ultricies mi eu turpis hendrerit fringilla. Phasellus consectetuer vestibulum
+ elit. Phasellus magna. Nullam tincidunt adipiscing enim. Vestibulum volutpat
+ pretium libero. Nullam quis ante. Morbi mollis tellus ac sapien. Donec orci
+ lectus, aliquam ut, faucibus non, euismod id, nulla. Pellentesque habitant morbi
+ tristique senectus et netus et malesuada fames ac turpis egestas. Fusce ac felis
+ sit amet ligula pharetra condimentum. Morbi mattis ullamcorper velit. Vivamus
+ consectetuer hendrerit lacus. Nullam quis ante. Praesent turpis. Praesent
+ porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi
+ sem ut ipsum. Donec mi odio, faucibus at, scelerisque quis, convallis in, nisi.
+ Quisque ut nisi. Suspendisse nisl elit, rhoncus eget, elementum ac, condimentum
+ eget, diam. Vestibulum eu odio. Proin sapien ipsum, porta a, auctor quis, euismod
+ ut, mi. Cras ultricies mi eu turpis hendrerit fringilla. Phasellus consectetuer
+ vestibulum elit. Phasellus magna. Nullam tincidunt adipiscing enim. Vestibulum
+ volutpat pretium libero. Nullam quis ante. Morbi mollis tellus ac sapien. Donec
+ orci lectus, aliquam ut, faucibus non, euismod id, nulla. Pellentesque habitant
+ morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce ac
+ felis sit amet ligula pharetra condimentum. Morbi mattis ullamcorper velit.
+ Vivamus consectetuer hendrerit lacus. Nullam quis ante. Praesent turpis. Praesent
+ porttitor, nulla vitae posuere iaculis, arcu nisl dignissim dolor, a pretium mi
+ sem ut ipsum.
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/text-max-line-view.jsx b/template/src/sections/examples/text-max-line-view.jsx
new file mode 100644
index 0000000..8c10f68
--- /dev/null
+++ b/template/src/sections/examples/text-max-line-view.jsx
@@ -0,0 +1,112 @@
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Masonry from '@mui/lab/Masonry';
+import Container from '@mui/material/Container';
+import CardHeader from '@mui/material/CardHeader';
+import CardContent from '@mui/material/CardContent';
+
+import { paths } from 'src/routes/paths';
+
+import TextMaxLine from 'src/components/text-max-line';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+
+// ----------------------------------------------------------------------
+
+export default function TextMaxLineView() {
+ return (
+ <>
+ (theme.palette.mode === 'light' ? 'grey.200' : 'grey.800'),
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+ Donec posuere vulputate arcu. Fusce vulputate eleifend sapien. Phasellus magna.
+ Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Suspendisse faucibus, nunc
+ et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id
+ tortor.
+
+
+
+
+
+
+
+
+ Donec posuere vulputate arcu. Fusce vulputate eleifend sapien. Phasellus magna.
+ Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Suspendisse faucibus, nunc
+ et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id
+ tortor.
+
+
+
+
+
+
+
+
+ Donec posuere vulputate arcu. Fusce vulputate eleifend sapien. Phasellus magna.
+ Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Suspendisse faucibus, nunc
+ et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id
+ tortor.
+
+
+
+
+
+
+
+
+ Donec posuere vulputate arcu. Fusce vulputate eleifend sapien. Phasellus magna.
+ Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Suspendisse faucibus, nunc
+ et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id
+ tortor.
+
+
+
+
+
+
+
+
+ Donec posuere vulputate arcu. Fusce vulputate eleifend sapien. Phasellus magna.
+ Proin sapien ipsum, porta a, auctor quis, euismod ut, mi. Suspendisse faucibus, nunc
+ et pellentesque egestas, lacus ante convallis tellus, vitae iaculis lacus elit id
+ tortor.
+
+
+
+
+
+
+
+
+ Donec posuere vulputate arcu.
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/examples/view.jsx b/template/src/sections/examples/view.jsx
new file mode 100644
index 0000000..81ffb69
--- /dev/null
+++ b/template/src/sections/examples/view.jsx
@@ -0,0 +1,91 @@
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Paper from '@mui/material/Paper';
+import Divider from '@mui/material/Divider';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+
+// ----------------------------------------------------------------------
+
+const ITEMS = [
+ { title: 'Animate', path: paths.components.animate },
+ { title: 'Carousel', path: paths.components.carousel },
+ { title: 'CountUp', path: paths.components.countUp },
+ { title: 'Form Validation', path: paths.components.form },
+ { title: 'Icons', path: paths.components.icons },
+ { title: 'Image', path: paths.components.image },
+ { title: 'Label', path: paths.components.label },
+ { title: 'Lightbox', path: paths.components.lightbox },
+ { title: 'Markdown', path: paths.components.markdown },
+ { title: 'Mega Menu', path: paths.components.megaMenu },
+ { title: 'Navigation Bar', path: paths.components.navigation },
+ { title: 'Scroll', path: paths.components.scroll },
+ { title: 'Scroll Progress', path: paths.components.scrollProgress },
+ { title: 'Player', path: paths.components.player },
+ { title: 'Text Max Line', path: paths.components.textMaxLine },
+];
+
+// ----------------------------------------------------------------------
+
+export default function ComponentsView() {
+ return (
+
+
+ MUI Components
+
+
+
+ https://mui.com/components/
+
+
+
+
+
+ Extra Components
+
+
+
+ Extension components and 3rd party dependencies.
+
+
+
+ {ITEMS.map((item) => (
+
+ `0 0 0 2px ${theme.palette.text.primary}`,
+ },
+ }}
+ >
+ {item.title}
+
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/payment/payment-methods.jsx b/template/src/sections/payment/payment-methods.jsx
new file mode 100644
index 0000000..d04b084
--- /dev/null
+++ b/template/src/sections/payment/payment-methods.jsx
@@ -0,0 +1,185 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Radio from '@mui/material/Radio';
+import Button from '@mui/material/Button';
+import { alpha } from '@mui/material/styles';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel, { formControlLabelClasses } from '@mui/material/FormControlLabel';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+
+import PaymentNewCardForm from './payment-new-card-form';
+
+// ----------------------------------------------------------------------
+
+const PAYMENT_OPTIONS = [
+ {
+ label: 'Paypal',
+ value: 'paypal',
+ },
+ {
+ label: 'Credit / Debit',
+ value: 'creditcard',
+ },
+];
+
+const CARD_OPTIONS = [
+ {
+ value: 'visa1',
+ label: '**** **** **** 1212 - Jimmy Holland',
+ },
+ {
+ value: 'visa2',
+ label: '**** **** **** 2424 - Shawn Stokes',
+ },
+ {
+ value: 'mastercard',
+ label: '**** **** **** 4545 - Cole Armstrong',
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function PaymentMethods() {
+ const [method, setMethod] = useState('paypal');
+
+ const formOpen = useBoolean();
+
+ const handleChangeMethod = useCallback((event) => {
+ setMethod(event.target.value);
+ }, []);
+
+ return (
+ <>
+
+ Payment Method
+
+
+
+ {PAYMENT_OPTIONS.map((option) => (
+
+ ))}
+
+
+
+
+
+ >
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function OptionItem({ option, onOpen, selected, isCredit }) {
+ const { value, label } = option;
+
+ const renderLabel = (
+
+
+ {label}
+
+
+
+ {value === 'creditcard' ? (
+ <>
+ ,
+
+ >
+ ) : (
+
+ )}
+
+
+ );
+
+ return (
+ `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ ...(selected && {
+ boxShadow: (theme) => `0 0 0 2px ${theme.palette.text.primary}`,
+ }),
+ }}
+ >
+ }
+ sx={{ mx: 1 }}
+ />
+ }
+ label={renderLabel}
+ sx={{
+ m: 0,
+ py: 2,
+ pr: 2.5,
+ width: 1,
+ [`& .${formControlLabelClasses.label}`]: {
+ width: 1,
+ },
+ }}
+ />
+
+ {isCredit && (
+
+
+ {CARD_OPTIONS.map((card) => (
+
+ {card.label}
+
+ ))}
+
+
+ }
+ onClick={onOpen}
+ sx={{ my: 3 }}
+ >
+ Add new card
+
+
+ )}
+
+ );
+}
+
+OptionItem.propTypes = {
+ isCredit: PropTypes.bool,
+ onOpen: PropTypes.func,
+ option: PropTypes.shape({
+ label: PropTypes.string,
+ value: PropTypes.string,
+ }),
+ selected: PropTypes.bool,
+};
diff --git a/template/src/sections/payment/payment-new-card-form.jsx b/template/src/sections/payment/payment-new-card-form.jsx
new file mode 100644
index 0000000..0223cf5
--- /dev/null
+++ b/template/src/sections/payment/payment-new-card-form.jsx
@@ -0,0 +1,75 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import TextField from '@mui/material/TextField';
+import DialogTitle from '@mui/material/DialogTitle';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function PaymentNewCardForm({ onClose, ...other }) {
+ return (
+
+ Add new card
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Your transaction is secured with SSL encryption
+
+
+
+
+
+
+ Cancel
+
+
+
+ Add
+
+
+
+ );
+}
+
+PaymentNewCardForm.propTypes = {
+ onClose: PropTypes.func,
+};
diff --git a/template/src/sections/payment/payment-summary.jsx b/template/src/sections/payment/payment-summary.jsx
new file mode 100644
index 0000000..bf26af4
--- /dev/null
+++ b/template/src/sections/payment/payment-summary.jsx
@@ -0,0 +1,102 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Switch from '@mui/material/Switch';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function PaymentSummary({ sx, ...other }) {
+ return (
+
+
+ Summary
+
+
+
+
+
+ Subscription
+
+
+ PREMIUM
+
+
+
+
+ Billed Monthly
+
+
+
+
+
+ $
+
+ 9.99
+
+
+ /mo
+
+
+
+
+
+
+ Total Billed
+
+ $9.99*
+
+
+
+
+
+
+ * Plus applicable taxes
+
+
+
+ Upgrade My Plan
+
+
+
+
+
+ Secure credit card payment
+
+
+
+ This is a secure 128-bit SSL encrypted payment
+
+
+
+ );
+}
+
+PaymentSummary.propTypes = {
+ sx: PropTypes.object,
+};
diff --git a/template/src/sections/payment/view/payment-view.jsx b/template/src/sections/payment/view/payment-view.jsx
new file mode 100644
index 0000000..68e3b76
--- /dev/null
+++ b/template/src/sections/payment/view/payment-view.jsx
@@ -0,0 +1,77 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Grid from '@mui/material/Unstable_Grid2';
+import Container from '@mui/material/Container';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import PaymentSummary from '../payment-summary';
+import PaymentMethods from '../payment-methods';
+
+// ----------------------------------------------------------------------
+
+export default function PaymentView() {
+ const mdUp = useResponsive('up', 'md');
+
+ const renderBillingAddress = (
+
+ Billing Address
+
+
+
+
+
+
+
+
+ );
+
+ return (
+
+
+ {`Let's Finish Powering You Up!`}
+
+
+
+ Professional plan is right for you.
+
+
+
+
+ ({
+ md: `dashed 1px ${theme.palette.divider}`,
+ }),
+ }}
+ >
+ {renderBillingAddress}
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/template/src/sections/pricing/01/pricing-01-card.jsx b/template/src/sections/pricing/01/pricing-01-card.jsx
new file mode 100644
index 0000000..a01e4ac
--- /dev/null
+++ b/template/src/sections/pricing/01/pricing-01-card.jsx
@@ -0,0 +1,103 @@
+import PropTypes from 'prop-types';
+
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+
+import Label from 'src/components/label';
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function Pricing01Card({ plan }) {
+ const basicLicense = plan.license === 'Basic';
+
+ const starterLicense = plan.license === 'Starter';
+
+ const premiumLicense = plan.license === 'Premium';
+
+ return (
+ theme.customShadows.z8,
+ ...(starterLicense && {
+ py: 8,
+ boxShadow: (theme) => theme.customShadows.z24,
+ }),
+ }}
+ >
+ {starterLicense && (
+
+ POPULAR
+
+ )}
+
+
+
+ {plan.license}
+
+
+
+
+
+ {!basicLicense && (
+
+ $
+
+ )}
+
+
+ {plan.price}
+
+
+ {!basicLicense && (
+
+ /mo
+
+ )}
+
+
+
+ {plan.options.map((option) => (
+
+ {option.title}
+
+ ))}
+
+
+
+ {basicLicense && 'Current Plan'}
+ {starterLicense && 'Choose Starter'}
+ {premiumLicense && 'Choose Premium'}
+
+
+
+ );
+}
+
+Pricing01Card.propTypes = {
+ plan: PropTypes.shape({
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ license: PropTypes.string,
+ options: PropTypes.array,
+ price: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/pricing/02/pricing-02-content-desktop.jsx b/template/src/sections/pricing/02/pricing-02-content-desktop.jsx
new file mode 100644
index 0000000..9845154
--- /dev/null
+++ b/template/src/sections/pricing/02/pricing-02-content-desktop.jsx
@@ -0,0 +1,76 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function Pricing02ContentDesktop({ plan }) {
+ const startLicense = plan.license === 'Start';
+
+ const proLicense = plan.license === 'Pro';
+
+ const businessLicense = plan.license === 'Business';
+
+ return (
+
+ {plan.options.map((option) => (
+ `solid 1px ${theme.palette.divider}`,
+ ...(proLicense && {
+ bgcolor: 'background.neutral',
+ }),
+ }}
+ >
+ {option.disabled ? (
+ '-'
+ ) : (
+
+ )}
+
+ ))}
+
+
+
+ {startLicense && 'Start Free Trial'}
+
+ {proLicense && 'Choose Pro'}
+
+ {businessLicense && 'Contact Sale'}
+
+
+
+ );
+}
+
+Pricing02ContentDesktop.propTypes = {
+ plan: PropTypes.shape({
+ license: PropTypes.string,
+ options: PropTypes.array,
+ }),
+};
diff --git a/template/src/sections/pricing/02/pricing-02-content-mobile.jsx b/template/src/sections/pricing/02/pricing-02-content-mobile.jsx
new file mode 100644
index 0000000..423697f
--- /dev/null
+++ b/template/src/sections/pricing/02/pricing-02-content-mobile.jsx
@@ -0,0 +1,98 @@
+import PropTypes from 'prop-types';
+
+import Link from '@mui/material/Link';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Collapse from '@mui/material/Collapse';
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function Pricing02ContentMobile({ plan }) {
+ const contentOpen = useBoolean();
+
+ const startLicense = plan.license === 'Start';
+
+ const proLicense = plan.license === 'Pro';
+
+ const businessLicense = plan.license === 'Business';
+
+ return (
+
+
+
+ {contentOpen.value ? 'Hide' : 'Show'} all feature
+
+
+
+
+
+ {plan.options.map((option) => (
+
+
+ {option.title}
+
+
+
+
+ ))}
+
+
+
+
+
+ {startLicense && 'Start Free Trial'}
+ {proLicense && 'Choose Pro'}
+ {businessLicense && 'Contact Sale'}
+
+
+ );
+}
+
+Pricing02ContentMobile.propTypes = {
+ plan: PropTypes.shape({
+ license: PropTypes.string,
+ options: PropTypes.array,
+ }),
+};
diff --git a/template/src/sections/pricing/02/pricing-02-header.jsx b/template/src/sections/pricing/02/pricing-02-header.jsx
new file mode 100644
index 0000000..aef3437
--- /dev/null
+++ b/template/src/sections/pricing/02/pricing-02-header.jsx
@@ -0,0 +1,84 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Typography from '@mui/material/Typography';
+
+import Label from 'src/components/label';
+import Image from 'src/components/image';
+
+// ----------------------------------------------------------------------
+
+export default function Pricing02Header({ plan }) {
+ const startLicense = plan.license === 'Start';
+
+ const proLicense = plan.license === 'Pro';
+
+ return (
+
+ {proLicense && (
+
+ POPULAR
+
+ )}
+
+
+ {plan.license}
+
+
+
+ {!startLicense && (
+
+ $
+
+ )}
+
+
+ {plan.price}
+
+
+ {!startLicense && (
+
+ /mo
+
+ )}
+
+
+
+
+
+ {plan.caption}
+
+
+ );
+}
+
+Pricing02Header.propTypes = {
+ plan: PropTypes.shape({
+ caption: PropTypes.string,
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ license: PropTypes.string,
+ price: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/pricing/home/pricing-home-card.jsx b/template/src/sections/pricing/home/pricing-home-card.jsx
new file mode 100644
index 0000000..af28b35
--- /dev/null
+++ b/template/src/sections/pricing/home/pricing-home-card.jsx
@@ -0,0 +1,153 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Link from '@mui/material/Link';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Divider from '@mui/material/Divider';
+import Typography from '@mui/material/Typography';
+
+import { paths } from 'src/routes/paths';
+
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function PricingHomeCard({ plan }) {
+ const standardLicense = plan.license === 'Standard';
+
+ const plusLicense = plan.license === 'Plus';
+
+ const extendedLicense = plan.license === 'Extended';
+
+ return (
+ theme.customShadows.z8,
+ ...(plusLicense && {
+ py: 10,
+ boxShadow: (theme) => theme.customShadows.z24,
+ }),
+ }}
+ >
+ {plusLicense && (
+
+ POPULAR
+
+ )}
+
+
+
+
+ {plan.license}
+
+
+
+
+ $
+
+
+ {plan.price}
+
+
+
+
+ {standardLicense ? (
+
+ ) : (
+
+ {plan.icons.map((icon) => (
+
+ ))}
+
+ )}
+
+
+ {plan.commons.map((option) => (
+
+
+ {option}
+
+ ))}
+
+
+
+ {plan.options.map((option) => (
+
+
+ {option.title}
+
+ ))}
+
+
+
+
+ Choose Package
+
+
+
+ Read license
+
+
+
+
+
+ );
+}
+
+PricingHomeCard.propTypes = {
+ plan: PropTypes.shape({
+ commons: PropTypes.array,
+ icons: PropTypes.array,
+ license: PropTypes.string,
+ options: PropTypes.array,
+ price: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/pricing/home/pricing-home.jsx b/template/src/sections/pricing/home/pricing-home.jsx
new file mode 100644
index 0000000..568fe28
--- /dev/null
+++ b/template/src/sections/pricing/home/pricing-home.jsx
@@ -0,0 +1,72 @@
+import { m } from 'framer-motion';
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import { varFade, MotionViewport } from 'src/components/animate';
+
+import PricingHomeCard from './pricing-home-card';
+
+// ----------------------------------------------------------------------
+
+export default function PricingHome({ plans }) {
+ return (
+
+
+
+
+ pricing plans
+
+
+
+
+
+ The Right Plan
+ For Your Business
+
+
+
+
+
+ Choose the perfect plan for your needs. Always flexible to grow
+
+
+
+
+
+ {plans.map((plan) => (
+
+
+
+ ))}
+
+
+ );
+}
+
+PricingHome.propTypes = {
+ plans: PropTypes.array,
+};
diff --git a/template/src/sections/pricing/marketing/pricing-marketing-card.jsx b/template/src/sections/pricing/marketing/pricing-marketing-card.jsx
new file mode 100644
index 0000000..4430651
--- /dev/null
+++ b/template/src/sections/pricing/marketing/pricing-marketing-card.jsx
@@ -0,0 +1,87 @@
+import PropTypes from 'prop-types';
+
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+
+import Label from 'src/components/label';
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function PricingMarketingCard({ plan }) {
+ const basicLicense = plan.license === 'Basic';
+
+ const starterLicense = plan.license === 'Starter';
+
+ const premiumLicense = plan.license === 'Premium';
+
+ return (
+ ({ md: theme.customShadows.z8 }),
+ ...(starterLicense && {
+ boxShadow: (theme) => ({ md: theme.customShadows.z24 }),
+ }),
+ }}
+ >
+ {starterLicense && (
+
+ POPULAR
+
+ )}
+
+
+
+
+ {plan.license}
+
+
+
+ {`$${plan.price}`}
+
+ /mo
+
+
+
+
+
+
+
+
+ {plan.caption}
+
+
+
+ {plan.options.map((option) => (
+
+ {option}
+
+ ))}
+
+
+
+ Choose Package
+
+
+ );
+}
+
+PricingMarketingCard.propTypes = {
+ plan: PropTypes.shape({
+ caption: PropTypes.string,
+ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
+ license: PropTypes.string,
+ options: PropTypes.array,
+ price: PropTypes.string,
+ }),
+};
diff --git a/template/src/sections/pricing/marketing/pricing-marketing.jsx b/template/src/sections/pricing/marketing/pricing-marketing.jsx
new file mode 100644
index 0000000..a54f07d
--- /dev/null
+++ b/template/src/sections/pricing/marketing/pricing-marketing.jsx
@@ -0,0 +1,78 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Switch from '@mui/material/Switch';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+
+import PlanCard from './pricing-marketing-card';
+
+// ----------------------------------------------------------------------
+
+export default function PricingMarketing({ plans }) {
+ return (
+
+
+
+
+ Pricing
+
+
+ Check Our Pricing
+
+
+ Choose the perfect plan for your needs.
+ Always flexible to grow
+
+
+
+
+ MONTHLY
+
+
+
+ YEARLY (save 10%)
+
+
+
+
+ {plans.map((plan) => (
+
+ ))}
+
+
+ );
+}
+
+PricingMarketing.propTypes = {
+ plans: PropTypes.array,
+};
diff --git a/template/src/sections/pricing/view/pricing-01-view.jsx b/template/src/sections/pricing/view/pricing-01-view.jsx
new file mode 100644
index 0000000..3ecb1e1
--- /dev/null
+++ b/template/src/sections/pricing/view/pricing-01-view.jsx
@@ -0,0 +1,92 @@
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import { alpha } from '@mui/material/styles';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
+import ToggleButton, { toggleButtonClasses } from '@mui/material/ToggleButton';
+
+import { _pricing01 } from 'src/_mock';
+
+import PlanCard from '../01/pricing-01-card';
+
+// ----------------------------------------------------------------------
+
+export default function Pricing01View() {
+ const [subscription, setSubscription] = useState('monthly');
+
+ const handleChangeSubscription = useCallback((event, newValue) => {
+ if (newValue !== null) {
+ setSubscription(newValue);
+ }
+ }, []);
+
+ return (
+
+
+ Flexible plans for your
+ community's size and needs
+
+
+
+ Choose your plan and make modern online conversation magic
+
+
+
+ alpha(theme.palette.grey[500], 0.08),
+ [`& .${toggleButtonClasses.root}`]: {
+ m: 0,
+ typography: 'overline',
+ color: 'text.secondary',
+ '&:hover': {
+ bgcolor: 'transparent',
+ },
+ [`&.${toggleButtonClasses.selected}`]: {
+ bgcolor: 'text.primary',
+ color: (theme) => (theme.palette.mode === 'light' ? 'common.white' : 'grey.800'),
+ '&:hover': {
+ bgcolor: 'text.primary',
+ },
+ },
+ },
+ }}
+ >
+ MONTHLY
+ YEARLY (save 10%)
+
+
+
+
+ {_pricing01.map((plan) => (
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/pricing/view/pricing-02-view.jsx b/template/src/sections/pricing/view/pricing-02-view.jsx
new file mode 100644
index 0000000..de2ae91
--- /dev/null
+++ b/template/src/sections/pricing/view/pricing-02-view.jsx
@@ -0,0 +1,114 @@
+import Stack from '@mui/material/Stack';
+import Tooltip from '@mui/material/Tooltip';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import { _pricing02 } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import PlanHeader from '../02/pricing-02-header';
+import PlanContentMobile from '../02/pricing-02-content-mobile';
+import PlanContentDesktop from '../02/pricing-02-content-desktop';
+
+// ----------------------------------------------------------------------
+
+export default function Pricing02View() {
+ const mdUp = useResponsive('up', 'md');
+
+ return (
+
+
+ Flexible plans for your
+ community's size and needs
+
+
+
+ Choose your plan and make modern online conversation magic
+
+
+
+ {mdUp && (
+
+
+ Feature
+
+
+ )}
+
+ {_pricing02.map((plan) => (
+ ({ xs: theme.customShadows.z16, md: 0 }),
+ }}
+ >
+
+ {!mdUp && }
+
+ ))}
+
+
+ {mdUp && (
+
+ `solid 1px ${theme.palette.divider}`,
+ }}
+ >
+ {_pricing02[0].options.map((option) => (
+ `solid 1px ${theme.palette.divider}`,
+ }}
+ >
+ {option.title}
+
+
+
+
+
+
+
+ ))}
+
+
+ {_pricing02.map((plan) => (
+ ({
+ md: `solid 1px ${theme.palette.divider}`,
+ }),
+ }}
+ >
+
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/template/src/sections/review/common/review-new-form.jsx b/template/src/sections/review/common/review-new-form.jsx
new file mode 100644
index 0000000..cdc1be6
--- /dev/null
+++ b/template/src/sections/review/common/review-new-form.jsx
@@ -0,0 +1,112 @@
+import * as Yup from 'yup';
+import PropTypes from 'prop-types';
+import { useForm, Controller } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import Rating from '@mui/material/Rating';
+import Typography from '@mui/material/Typography';
+import LoadingButton from '@mui/lab/LoadingButton';
+import DialogTitle from '@mui/material/DialogTitle';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import FormHelperText from '@mui/material/FormHelperText';
+
+import FormProvider, { RHFTextField } from 'src/components/hook-form';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewNewForm({ onClose, ...other }) {
+ const defaultValues = {
+ rating: 0,
+ review: '',
+ name: '',
+ email: '',
+ };
+
+ const NewReviewSchema = Yup.object().shape({
+ name: Yup.string().required('Name is required'),
+ rating: Yup.number().min(1, 'Rating must be greater than or equal to 1'),
+ review: Yup.string().required('Review is required'),
+ email: Yup.string().required('Email is required').email('That is not an email'),
+ });
+
+ const methods = useForm({
+ resolver: yupResolver(NewReviewSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ control,
+ handleSubmit,
+ formState: { errors, isSubmitting },
+ } = methods;
+
+ const onSubmit = handleSubmit(async (data) => {
+ try {
+ await new Promise((resolve) => setTimeout(resolve, 500));
+ reset();
+ onClose();
+ console.log('DATA', data);
+ } catch (error) {
+ console.error(error);
+ }
+ });
+
+ return (
+
+
+ Review
+
+
+
+
+
+ Your rating:
+
+
+ (
+ {
+ field.onChange(newValue);
+ }}
+ />
+ )}
+ />
+
+ {!!errors.rating && {errors.rating?.message} }
+
+
+
+
+
+
+
+
+
+
+
+
+ Cancel
+
+
+
+ Post Review
+
+
+
+
+ );
+}
+
+ReviewNewForm.propTypes = {
+ onClose: PropTypes.func,
+};
diff --git a/template/src/sections/review/common/review-progress-item.jsx b/template/src/sections/review/common/review-progress-item.jsx
new file mode 100644
index 0000000..ae5b636
--- /dev/null
+++ b/template/src/sections/review/common/review-progress-item.jsx
@@ -0,0 +1,82 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Radio from '@mui/material/Radio';
+import { alpha } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+import LinearProgress from '@mui/material/LinearProgress';
+import FormControlLabel, { formControlLabelClasses } from '@mui/material/FormControlLabel';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewProgressItem({ rating, totals, index }) {
+ return (
+ }
+ label={
+
+
+
+ {5 - index}
+
+
+
+
+ alpha(theme.palette.grey[500], 0.12),
+ },
+ }}
+ />
+
+
+ {fShortenNumber(rating.number)}
+
+
+ }
+ sx={{
+ mx: 0,
+ '&:hover': { opacity: 0.48 },
+ [`& .${formControlLabelClasses.label}`]: {
+ width: 1,
+ },
+ }}
+ />
+ );
+}
+
+ReviewProgressItem.propTypes = {
+ index: PropTypes.number,
+ rating: PropTypes.shape({
+ number: PropTypes.number,
+ value: PropTypes.string,
+ }),
+ totals: PropTypes.number,
+};
diff --git a/template/src/sections/review/common/review-progress.jsx b/template/src/sections/review/common/review-progress.jsx
new file mode 100644
index 0000000..def1766
--- /dev/null
+++ b/template/src/sections/review/common/review-progress.jsx
@@ -0,0 +1,32 @@
+import Stack from '@mui/material/Stack';
+import RadioGroup from '@mui/material/RadioGroup';
+
+import ReviewProgressItem from './review-progress-item';
+
+// ----------------------------------------------------------------------
+
+const RATINGS = [
+ { value: '5start', number: 5212 },
+ { value: '4start', number: 2442 },
+ { value: '3start', number: 523 },
+ { value: '2start', number: 423 },
+ { value: '1start', number: 80 },
+];
+
+// ----------------------------------------------------------------------
+
+export default function ReviewProgress({ ...other }) {
+ const totals = RATINGS.map((rating) => rating.number).reduce(
+ (accumulator, curr) => accumulator + curr
+ );
+
+ return (
+
+
+ {RATINGS.map((rating, index) => (
+
+ ))}
+
+
+ );
+}
diff --git a/template/src/sections/review/ecommerce/review-ecommerce.jsx b/template/src/sections/review/ecommerce/review-ecommerce.jsx
new file mode 100644
index 0000000..a76edc1
--- /dev/null
+++ b/template/src/sections/review/ecommerce/review-ecommerce.jsx
@@ -0,0 +1,27 @@
+import Container from '@mui/material/Container';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _reviews } from 'src/_mock';
+
+import ReviewList from './review-list';
+import ReviewSummary from './review-summary';
+import ReviewNewForm from '../common/review-new-form';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewEcommerce() {
+ const formOpen = useBoolean();
+
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/review/ecommerce/review-item.jsx b/template/src/sections/review/ecommerce/review-item.jsx
new file mode 100644
index 0000000..cee44a9
--- /dev/null
+++ b/template/src/sections/review/ecommerce/review-item.jsx
@@ -0,0 +1,84 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Avatar from '@mui/material/Avatar';
+import Rating from '@mui/material/Rating';
+import Typography from '@mui/material/Typography';
+
+import { fDate } from 'src/utils/format-time';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewItem({ name, rating, message, createdAt, avatarUrl }) {
+ return (
+ `solid 1px ${theme.palette.divider}`,
+ }}
+ >
+
+
+
+
+
+ {name}
+
+ {createdAt && (
+
+ {fDate(createdAt)}
+
+ )}
+
+ {message}
+
+
+ Was this review helpful?
+
+
+ }>
+ Yes
+
+
+
+ }
+ >
+ No
+
+
+
+
+
+ );
+}
+
+ReviewItem.propTypes = {
+ name: PropTypes.string,
+ rating: PropTypes.number,
+ message: PropTypes.string,
+ avatarUrl: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+};
diff --git a/template/src/sections/review/ecommerce/review-list.jsx b/template/src/sections/review/ecommerce/review-list.jsx
new file mode 100644
index 0000000..7714c86
--- /dev/null
+++ b/template/src/sections/review/ecommerce/review-list.jsx
@@ -0,0 +1,42 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import ReviewItem from './review-item';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewList({ reviews }) {
+ return (
+
+ {reviews.map((review) => (
+
+ ))}
+
+
+
+ );
+}
+
+ReviewList.propTypes = {
+ reviews: PropTypes.array,
+};
diff --git a/template/src/sections/review/ecommerce/review-summary.jsx b/template/src/sections/review/ecommerce/review-summary.jsx
new file mode 100644
index 0000000..20e17dc
--- /dev/null
+++ b/template/src/sections/review/ecommerce/review-summary.jsx
@@ -0,0 +1,75 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Rating from '@mui/material/Rating';
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Iconify from 'src/components/iconify';
+
+import ReviewProgress from '../common/review-progress';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewSummary({ reviewNumber, ratingNumber, onOpenForm }) {
+ return (
+
+
+
+
+ Reviews
+
+
+ {ratingNumber}
+
+
+
+ {fShortenNumber(reviewNumber)} reviews
+
+
+
+ }
+ onClick={onOpenForm}
+ >
+ Write a Review
+
+
+
+
+
+
+
+
+
+ );
+}
+
+ReviewSummary.propTypes = {
+ onOpenForm: PropTypes.func,
+ ratingNumber: PropTypes.number,
+ reviewNumber: PropTypes.number,
+};
diff --git a/template/src/sections/review/elearning/review-elearning.jsx b/template/src/sections/review/elearning/review-elearning.jsx
new file mode 100644
index 0000000..daae03f
--- /dev/null
+++ b/template/src/sections/review/elearning/review-elearning.jsx
@@ -0,0 +1,47 @@
+import { useState, useCallback } from 'react';
+
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _reviews } from 'src/_mock';
+
+import ReviewList from './review-list';
+import ReviewSummary from './review-summary';
+import ReviewToolbar from './review-toolbar';
+import ReviewNewForm from '../common/review-new-form';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewElearning() {
+ const [sort, setSort] = useState('latest');
+
+ const formOpen = useBoolean();
+
+ const handleChangeSort = useCallback((event) => {
+ setSort(event.target.value);
+ }, []);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/review/elearning/review-item.jsx b/template/src/sections/review/elearning/review-item.jsx
new file mode 100644
index 0000000..4bd2e1c
--- /dev/null
+++ b/template/src/sections/review/elearning/review-item.jsx
@@ -0,0 +1,135 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Avatar from '@mui/material/Avatar';
+import Rating from '@mui/material/Rating';
+import Divider from '@mui/material/Divider';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { fDate } from 'src/utils/format-time';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const AVATAR_SIZE = 64;
+
+const WIDTH = `calc(100% - ${AVATAR_SIZE + 20}px)`;
+
+export default function ReviewItem({
+ name,
+ rating,
+ message,
+ tagUser,
+ createdAt,
+ hasReply,
+ avatarUrl,
+ helpful = 0,
+}) {
+ const openReply = useBoolean();
+
+ return (
+ <>
+
+
+
+
+
+ {name}
+ {!hasReply && }
+
+
+ {createdAt && (
+
+ {fDate(createdAt)}
+
+ )}
+
+
+ {tagUser && {`@${tagUser} `} }
+ {message}
+
+
+ {!hasReply && (
+
+ }>
+ Helpful ({helpful})
+
+
+
+
+
+ Reply
+
+
+ )}
+
+ {!hasReply && openReply.value && (
+
+ )}
+
+
+
+
+ >
+ );
+}
+
+ReviewItem.propTypes = {
+ name: PropTypes.string,
+ hasReply: PropTypes.bool,
+ rating: PropTypes.number,
+ helpful: PropTypes.number,
+ message: PropTypes.string,
+ tagUser: PropTypes.string,
+ avatarUrl: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+};
diff --git a/template/src/sections/review/elearning/review-list.jsx b/template/src/sections/review/elearning/review-list.jsx
new file mode 100644
index 0000000..050b2b5
--- /dev/null
+++ b/template/src/sections/review/elearning/review-list.jsx
@@ -0,0 +1,66 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import ReviewItem from './review-item';
+
+// ----------------------------------------------------------------------
+
+export default function Reviews({ reviews }) {
+ return (
+ <>
+ {reviews.map((review) => {
+ const { id, name, rating, helpful, message, createdAt, avatarUrl, replyComment, users } =
+ review;
+
+ const hasReply = !!replyComment.length;
+
+ return (
+
+
+ {hasReply &&
+ replyComment.map((reply) => {
+ const userReply = users.filter((user) => user.id === reply.userId)[0];
+
+ return (
+
+ );
+ })}
+
+ );
+ })}
+
+
+ >
+ );
+}
+
+Reviews.propTypes = {
+ reviews: PropTypes.array,
+};
diff --git a/template/src/sections/review/elearning/review-summary.jsx b/template/src/sections/review/elearning/review-summary.jsx
new file mode 100644
index 0000000..fb88b5b
--- /dev/null
+++ b/template/src/sections/review/elearning/review-summary.jsx
@@ -0,0 +1,54 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Button from '@mui/material/Button';
+import Rating from '@mui/material/Rating';
+import Typography from '@mui/material/Typography';
+import RadioGroup from '@mui/material/RadioGroup';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import Iconify from 'src/components/iconify';
+
+import ReviewProgress from '../common/review-progress';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewSummary({ reviewNumber, ratingNumber, onOpenForm }) {
+ return (
+
+
+
+ {ratingNumber}
+
+
+
+
+ {fShortenNumber(reviewNumber)} reviews
+
+
+
+
+
+
+
+
+ }
+ onClick={onOpenForm}
+ >
+ Write a Review
+
+
+
+ );
+}
+
+ReviewSummary.propTypes = {
+ onOpenForm: PropTypes.func,
+ ratingNumber: PropTypes.number,
+ reviewNumber: PropTypes.number,
+};
diff --git a/template/src/sections/review/elearning/review-toolbar.jsx b/template/src/sections/review/elearning/review-toolbar.jsx
new file mode 100644
index 0000000..ca272f3
--- /dev/null
+++ b/template/src/sections/review/elearning/review-toolbar.jsx
@@ -0,0 +1,44 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Select from '@mui/material/Select';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+
+// ----------------------------------------------------------------------
+
+const SORT_OPTIONS = [
+ { value: 'latest', label: 'Latest' },
+ { value: 'oldest', label: 'Oldest' },
+ { value: 'popular', label: 'Popular' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function ReviewToolbar({ sort, onChangeSort }) {
+ return (
+
+
+ Reviews
+
+
+
+
+
+ {SORT_OPTIONS.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+ );
+}
+
+ReviewToolbar.propTypes = {
+ onChangeSort: PropTypes.func,
+ sort: PropTypes.string,
+};
diff --git a/template/src/sections/review/travel/review-item.jsx b/template/src/sections/review/travel/review-item.jsx
new file mode 100644
index 0000000..31f2498
--- /dev/null
+++ b/template/src/sections/review/travel/review-item.jsx
@@ -0,0 +1,134 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Avatar from '@mui/material/Avatar';
+import Rating from '@mui/material/Rating';
+import Divider from '@mui/material/Divider';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { fDate } from 'src/utils/format-time';
+
+// ----------------------------------------------------------------------
+
+const AVATAR_SIZE = 48;
+
+const WIDTH = `calc(100% - ${AVATAR_SIZE + 20}px)`;
+
+export default function ReviewItem({
+ name,
+ rating,
+ message,
+ tagUser,
+ createdAt,
+ hasReply,
+ avatarUrl,
+ helpful = 0,
+}) {
+ const replyOpen = useBoolean();
+
+ return (
+ <>
+
+
+
+
+
+ {name}
+
+ {!hasReply && }
+
+
+ {createdAt && (
+
+ {fDate(createdAt)}
+
+ )}
+
+
+ {tagUser && {`@${tagUser} `} }
+ {message}
+
+
+ {!hasReply && (
+
+
+ Helpful ({helpful})
+
+
+
+
+
+ Reply
+
+
+ )}
+
+ {!hasReply && replyOpen && (
+
+ )}
+
+
+
+
+ >
+ );
+}
+
+ReviewItem.propTypes = {
+ name: PropTypes.string,
+ hasReply: PropTypes.bool,
+ rating: PropTypes.number,
+ helpful: PropTypes.number,
+ message: PropTypes.string,
+ tagUser: PropTypes.string,
+ avatarUrl: PropTypes.string,
+ createdAt: PropTypes.instanceOf(Date),
+};
diff --git a/template/src/sections/review/travel/review-list.jsx b/template/src/sections/review/travel/review-list.jsx
new file mode 100644
index 0000000..ea65970
--- /dev/null
+++ b/template/src/sections/review/travel/review-list.jsx
@@ -0,0 +1,67 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Pagination, { paginationClasses } from '@mui/material/Pagination';
+
+import ReviewItem from './review-item';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewList({ reviews }) {
+ return (
+ <>
+ {reviews.map((review) => {
+ const { id, name, rating, helpful, message, createdAt, avatarUrl, replyComment, users } =
+ review;
+
+ const hasReply = !!replyComment.length;
+
+ return (
+
+
+
+ {hasReply &&
+ replyComment.map((reply) => {
+ const userReply = users.filter((user) => user.id === reply.userId)[0];
+
+ return (
+
+ );
+ })}
+
+ );
+ })}
+
+
+ >
+ );
+}
+
+ReviewList.propTypes = {
+ reviews: PropTypes.array,
+};
diff --git a/template/src/sections/review/travel/review-toolbar.jsx b/template/src/sections/review/travel/review-toolbar.jsx
new file mode 100644
index 0000000..f8ddbe4
--- /dev/null
+++ b/template/src/sections/review/travel/review-toolbar.jsx
@@ -0,0 +1,63 @@
+import PropTypes from 'prop-types';
+
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import MenuItem from '@mui/material/MenuItem';
+import Typography from '@mui/material/Typography';
+import FormControl from '@mui/material/FormControl';
+import Select, { selectClasses } from '@mui/material/Select';
+
+// ----------------------------------------------------------------------
+
+const SORT_OPTIONS = [
+ { value: 'latest', label: 'Latest' },
+ { value: 'oldest', label: 'Oldest' },
+ { value: 'popular', label: 'Popular' },
+];
+
+// ----------------------------------------------------------------------
+
+export default function ReviewToolbar({ sort, totalReviews, onOpenReview, onChangeSort }) {
+ return (
+
+
+ {totalReviews} Reviews
+
+
+
+
+
+ {SORT_OPTIONS.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+ Write a Review
+
+
+
+ );
+}
+
+ReviewToolbar.propTypes = {
+ onChangeSort: PropTypes.func,
+ onOpenReview: PropTypes.func,
+ sort: PropTypes.string,
+ totalReviews: PropTypes.number,
+};
diff --git a/template/src/sections/review/travel/review-tour-guide-info.jsx b/template/src/sections/review/travel/review-tour-guide-info.jsx
new file mode 100644
index 0000000..751b07b
--- /dev/null
+++ b/template/src/sections/review/travel/review-tour-guide-info.jsx
@@ -0,0 +1,97 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Badge from '@mui/material/Badge';
+import Stack from '@mui/material/Stack';
+import Paper from '@mui/material/Paper';
+import Avatar from '@mui/material/Avatar';
+import Button from '@mui/material/Button';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+
+import { fShortenNumber } from 'src/utils/format-number';
+
+import { _socials } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ReviewTourGuideInfo({ tourGuide }) {
+ const { name, about, quotes, totalReviews, ratingNumber, verified, avatarUrl } = tourGuide;
+
+ return (
+
+
+
+
+
+ ) : null
+ }
+ >
+
+
+
+
+ {name}
+
+
+
+
+
+ {Number.isInteger(ratingNumber) ? `${ratingNumber}.0` : ratingNumber}
+
+
+
+ ({totalReviews ? fShortenNumber(totalReviews) : 0} reviews)
+
+
+
+
+
+ {about}
+
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+
+
+ {quotes}
+
+
+
+ Contact Tour Guide
+
+
+
+ );
+}
+
+ReviewTourGuideInfo.propTypes = {
+ tourGuide: PropTypes.shape({
+ about: PropTypes.string,
+ avatarUrl: PropTypes.string,
+ name: PropTypes.string,
+ quotes: PropTypes.string,
+ ratingNumber: PropTypes.number,
+ totalReviews: PropTypes.number,
+ verified: PropTypes.bool,
+ }),
+};
diff --git a/template/src/sections/review/travel/review-travel.jsx b/template/src/sections/review/travel/review-travel.jsx
new file mode 100644
index 0000000..b4e84bb
--- /dev/null
+++ b/template/src/sections/review/travel/review-travel.jsx
@@ -0,0 +1,52 @@
+import { useState, useCallback } from 'react';
+
+import Container from '@mui/material/Container';
+import Grid from '@mui/material/Unstable_Grid2';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _tours, _reviews } from 'src/_mock';
+
+import ReviewList from './review-list';
+import ReviewToolbar from './review-toolbar';
+import ReviewNewForm from '../common/review-new-form';
+import ReviewTourGuideInfo from './review-tour-guide-info';
+
+// ----------------------------------------------------------------------
+
+const _mockTour = _tours[0];
+
+export default function ReviewTravel() {
+ const [sort, setSort] = useState('latest');
+
+ const formOpen = useBoolean();
+
+ const handleChangeSort = useCallback((event) => {
+ setSort(event.target.value);
+ }, []);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/template/src/sections/status/view/coming-soon-view.jsx b/template/src/sections/status/view/coming-soon-view.jsx
new file mode 100644
index 0000000..17f50a7
--- /dev/null
+++ b/template/src/sections/status/view/coming-soon-view.jsx
@@ -0,0 +1,99 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import TextField from '@mui/material/TextField';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { useCountdown } from 'src/hooks/use-countdown';
+
+import { _socials } from 'src/_mock';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function ComingSoonView() {
+ const { days, hours, minutes, seconds } = useCountdown(new Date('07/07/2024 21:30'));
+
+ return (
+ <>
+
+ Coming Soon!
+
+
+
+ We are currently working hard on this page!
+
+
+
+
+ : }
+ sx={{ typography: 'h2' }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+ Notify
+
+
+ ),
+ }}
+ sx={{ my: 5 }}
+ />
+
+
+ {_socials.map((social) => (
+
+
+
+ ))}
+
+ >
+ );
+}
+
+// ----------------------------------------------------------------------
+
+function TimeBlock({ label, value }) {
+ return (
+
+ {value}
+ {label}
+
+ );
+}
+
+TimeBlock.propTypes = {
+ label: PropTypes.string,
+ value: PropTypes.string,
+};
diff --git a/template/src/sections/status/view/maintenance-view.jsx b/template/src/sections/status/view/maintenance-view.jsx
new file mode 100644
index 0000000..771144a
--- /dev/null
+++ b/template/src/sections/status/view/maintenance-view.jsx
@@ -0,0 +1,45 @@
+import { m } from 'framer-motion';
+
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+
+import { RouterLink } from 'src/routes/components';
+
+import Image from 'src/components/image';
+import { varBounce, MotionContainer } from 'src/components/animate';
+
+// ----------------------------------------------------------------------
+
+export default function MaintenanceView() {
+ return (
+
+
+
+ Website Currently Under Maintenance
+
+
+
+
+
+ We are currently working hard on this page!
+
+
+
+
+
+
+
+
+ Go to Home
+
+
+ );
+}
diff --git a/template/src/sections/support/support-content.jsx b/template/src/sections/support/support-content.jsx
new file mode 100644
index 0000000..e3762ea
--- /dev/null
+++ b/template/src/sections/support/support-content.jsx
@@ -0,0 +1,63 @@
+import PropTypes from 'prop-types';
+import { useState, useCallback } from 'react';
+
+import Box from '@mui/material/Box';
+import Accordion from '@mui/material/Accordion';
+import Typography from '@mui/material/Typography';
+import AccordionDetails from '@mui/material/AccordionDetails';
+import AccordionSummary, { accordionSummaryClasses } from '@mui/material/AccordionSummary';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function SupportContent({ contents }) {
+ const [expanded, setExpanded] = useState(false);
+
+ const handleChangeExpanded = useCallback(
+ (panel) => (event, isExpanded) => {
+ setExpanded(isExpanded ? panel : false);
+ },
+ []
+ );
+
+ return (
+
+ {contents.map((faq) => (
+
+
+
+ {faq.question}
+
+
+
+
+
+ {faq.answer}
+
+ ))}
+
+ );
+}
+
+SupportContent.propTypes = {
+ contents: PropTypes.array,
+};
diff --git a/template/src/sections/support/support-hero.jsx b/template/src/sections/support/support-hero.jsx
new file mode 100644
index 0000000..2203425
--- /dev/null
+++ b/template/src/sections/support/support-hero.jsx
@@ -0,0 +1,53 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import TextField from '@mui/material/TextField';
+import Typography from '@mui/material/Typography';
+import { alpha, useTheme } from '@mui/material/styles';
+import InputAdornment from '@mui/material/InputAdornment';
+
+import { bgGradient } from 'src/theme/css';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+export default function SupportHero() {
+ const theme = useTheme();
+
+ return (
+
+
+ Welcome to
+
+ {`ZONE `}
+
+ Support
+
+
+
+
+
+ ),
+ sx: { color: 'common.white' },
+ }}
+ sx={{ maxWidth: 366 }}
+ />
+
+ );
+}
diff --git a/template/src/sections/support/support-nav.jsx b/template/src/sections/support/support-nav.jsx
new file mode 100644
index 0000000..ee174a3
--- /dev/null
+++ b/template/src/sections/support/support-nav.jsx
@@ -0,0 +1,147 @@
+import PropTypes from 'prop-types';
+
+import Box from '@mui/material/Box';
+import Tabs from '@mui/material/Tabs';
+import Stack from '@mui/material/Stack';
+import Drawer from '@mui/material/Drawer';
+import { styled } from '@mui/material/styles';
+import Typography from '@mui/material/Typography';
+import Tab, { tabClasses } from '@mui/material/Tab';
+import CardActionArea from '@mui/material/CardActionArea';
+
+import { useResponsive } from 'src/hooks/use-responsive';
+
+import Image from 'src/components/image';
+import Iconify from 'src/components/iconify';
+import Scrollbar from 'src/components/scrollbar';
+
+// ----------------------------------------------------------------------
+
+const StyledButton = styled((props) => (
+
+
+
+))(({ theme }) => ({
+ ...theme.typography.subtitle2,
+ padding: theme.spacing(2),
+ borderRadius: theme.shape.borderRadius,
+ border: `solid 1px ${theme.palette.divider}`,
+}));
+
+// ----------------------------------------------------------------------
+
+export default function SupportNav({ topic, data, onChangeTopic, open, onClose }) {
+ const mdUp = useResponsive('up', 'md');
+
+ const renderContent = (
+
+
+ {data.map((item) => (
+
+ }
+ sx={{
+ height: 56,
+ typography: 'body2',
+ justifyContent: 'flex-start',
+ [`& .${tabClasses.selected}`]: {
+ typography: 'subtitle2',
+ },
+ }}
+ />
+ ))}
+
+
+
+
+ Do you still need help?
+
+
+
+ Always support whenever you need (24/7).
+
+
+
+
+
+ Email
+
+
+
+
+ Chat Now
+
+
+
+
+
+ {`Call `}
+
+ 552-917-1454
+
+
+
+
+
+
+ );
+
+ return mdUp ? (
+
+ {renderContent}
+
+ ) : (
+
+ {renderContent}
+
+ );
+}
+
+SupportNav.propTypes = {
+ data: PropTypes.array,
+ onChangeTopic: PropTypes.func,
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+ topic: PropTypes.string,
+};
diff --git a/template/src/sections/support/view/support-view.jsx b/template/src/sections/support/view/support-view.jsx
new file mode 100644
index 0000000..4791baa
--- /dev/null
+++ b/template/src/sections/support/view/support-view.jsx
@@ -0,0 +1,108 @@
+import { useState, useEffect, useCallback } from 'react';
+
+import Stack from '@mui/material/Stack';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import IconButton from '@mui/material/IconButton';
+
+import { useBoolean } from 'src/hooks/use-boolean';
+
+import { _faqsSupport } from 'src/_mock';
+
+import Iconify from 'src/components/iconify';
+
+import SupportNav from '../support-nav';
+import SupportHero from '../support-hero';
+import SupportContent from '../support-content';
+
+// ----------------------------------------------------------------------
+
+const TOPICS = [
+ {
+ title: 'Account',
+ icon: '/assets/icons/faq/ic_faq_account.svg',
+ content: ,
+ },
+ {
+ title: 'Payment',
+ icon: '/assets/icons/faq/ic_faq_payment.svg',
+ content: ,
+ },
+ {
+ title: 'Delivery',
+ icon: '/assets/icons/faq/ic_faq_delivery.svg',
+ content: ,
+ },
+ {
+ title: 'Product',
+ icon: '/assets/icons/faq/ic_faq_package.svg',
+ content: ,
+ },
+ {
+ title: 'Return & Refund',
+ icon: '/assets/icons/faq/ic_faq_refund.svg',
+ content: ,
+ },
+ {
+ title: 'Assurances',
+ icon: '/assets/icons/faq/ic_faq_assurances.svg',
+ content: ,
+ },
+];
+
+// ----------------------------------------------------------------------
+
+export default function SupportView() {
+ const [topic, setTopic] = useState('Payment');
+
+ const mobileOpen = useBoolean();
+
+ const handleChangeTopic = useCallback((event, newValue) => {
+ setTopic(newValue);
+ }, []);
+
+ useEffect(() => {
+ if (mobileOpen.value) {
+ mobileOpen.onFalse();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [topic]);
+
+ return (
+ <>
+
+
+ `solid 1px ${theme.palette.divider}`,
+ }}
+ >
+
+
+
+
+
+
+
+ Frequently Asked Questions
+
+
+
+
+
+ {TOPICS.map((item) => item.title === topic && {item.content}
)}
+
+
+ >
+ );
+}
diff --git a/template/src/theme/css.js b/template/src/theme/css.js
new file mode 100644
index 0000000..885f1d2
--- /dev/null
+++ b/template/src/theme/css.js
@@ -0,0 +1,152 @@
+import { alpha } from '@mui/material/styles';
+import { dividerClasses } from '@mui/material/Divider';
+import { checkboxClasses } from '@mui/material/Checkbox';
+import { menuItemClasses } from '@mui/material/MenuItem';
+import { autocompleteClasses } from '@mui/material/Autocomplete';
+
+// ----------------------------------------------------------------------
+
+export const paper = ({ theme, bgcolor, dropdown }) => ({
+ ...bgBlur({
+ blur: 20,
+ opacity: 0.9,
+ color: theme.palette.background.paper,
+ ...(!!bgcolor && {
+ color: bgcolor,
+ }),
+ }),
+ backgroundImage: 'url(/assets/cyan-blur.png), url(/assets/red-blur.png)',
+ backgroundRepeat: 'no-repeat, no-repeat',
+ backgroundPosition: 'top right, left bottom',
+ backgroundSize: '50%, 50%',
+ ...(theme.direction === 'rtl' && {
+ backgroundPosition: 'top left, right bottom',
+ }),
+ ...(dropdown && {
+ padding: theme.spacing(0.5),
+ boxShadow: theme.customShadows.dropdown,
+ borderRadius: theme.shape.borderRadius * 1.25,
+ }),
+});
+
+// ----------------------------------------------------------------------
+
+export const menuItem = (theme) => ({
+ ...theme.typography.body2,
+ padding: theme.spacing(0.75, 1),
+ borderRadius: theme.shape.borderRadius * 0.75,
+ '&:not(:last-of-type)': {
+ marginBottom: 4,
+ },
+ [`&.${menuItemClasses.selected}`]: {
+ fontWeight: theme.typography.fontWeightSemiBold,
+ backgroundColor: theme.palette.action.selected,
+ '&:hover': {
+ backgroundColor: theme.palette.action.hover,
+ },
+ },
+ [`& .${checkboxClasses.root}`]: {
+ padding: theme.spacing(0.5),
+ marginLeft: theme.spacing(-0.5),
+ marginRight: theme.spacing(0.5),
+ },
+ [`&.${autocompleteClasses.option}[aria-selected="true"]`]: {
+ backgroundColor: theme.palette.action.selected,
+ '&:hover': {
+ backgroundColor: theme.palette.action.hover,
+ },
+ },
+ [`&+.${dividerClasses.root}`]: {
+ margin: theme.spacing(0.5, 0),
+ },
+});
+
+// ----------------------------------------------------------------------
+
+export function bgBlur(props) {
+ const color = props?.color || '#000000';
+ const blur = props?.blur || 6;
+ const opacity = props?.opacity || 0.8;
+ const imgUrl = props?.imgUrl;
+
+ if (imgUrl) {
+ return {
+ position: 'relative',
+ backgroundImage: `url(${imgUrl})`,
+ '&:before': {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ zIndex: 9,
+ content: '""',
+ width: '100%',
+ height: '100%',
+ backdropFilter: `blur(${blur}px)`,
+ WebkitBackdropFilter: `blur(${blur}px)`,
+ backgroundColor: alpha(color, opacity),
+ },
+ };
+ }
+
+ return {
+ backdropFilter: `blur(${blur}px)`,
+ WebkitBackdropFilter: `blur(${blur}px)`,
+ backgroundColor: alpha(color, opacity),
+ };
+}
+
+// ----------------------------------------------------------------------
+
+export function bgGradient(props) {
+ const direction = props?.direction || 'to bottom';
+ const startColor = props?.startColor;
+ const endColor = props?.endColor;
+ const imgUrl = props?.imgUrl;
+ const color = props?.color;
+
+ if (imgUrl) {
+ return {
+ background: `linear-gradient(${direction}, ${startColor || color}, ${
+ endColor || color
+ }), url(${imgUrl})`,
+ backgroundSize: 'cover',
+ backgroundRepeat: 'no-repeat',
+ backgroundPosition: 'center center',
+ };
+ }
+
+ return {
+ background: `linear-gradient(${direction}, ${startColor}, ${endColor})`,
+ };
+}
+
+// ----------------------------------------------------------------------
+
+export function textGradient(value) {
+ return {
+ background: `-webkit-linear-gradient(${value})`,
+ WebkitBackgroundClip: 'text',
+ WebkitTextFillColor: 'transparent',
+ };
+}
+
+// ----------------------------------------------------------------------
+
+export const hideScroll = {
+ x: {
+ msOverflowStyle: 'none',
+ scrollbarWidth: 'none',
+ overflowX: 'scroll',
+ '&::-webkit-scrollbar': {
+ display: 'none',
+ },
+ },
+ y: {
+ msOverflowStyle: 'none',
+ scrollbarWidth: 'none',
+ overflowY: 'scroll',
+ '&::-webkit-scrollbar': {
+ display: 'none',
+ },
+ },
+};
diff --git a/template/src/theme/custom-shadows.js b/template/src/theme/custom-shadows.js
new file mode 100644
index 0000000..ebde5e2
--- /dev/null
+++ b/template/src/theme/custom-shadows.js
@@ -0,0 +1,32 @@
+import { alpha } from '@mui/material/styles';
+
+import { grey, info, error, common, primary, warning, success, secondary } from './palette';
+
+// ----------------------------------------------------------------------
+
+export function customShadows(mode) {
+ const color = mode === 'light' ? grey[500] : common.black;
+
+ const transparent = (opacity) => alpha(color, opacity);
+
+ return {
+ z1: `0 1px 2px 0 ${transparent(0.04)}`,
+ z4: `-4px 4px 12px 0 ${transparent(0.08)}`,
+ z8: `-8px 8px 24px -4px ${transparent(0.08)}`,
+ z12: `-12px 12px 36px -4px ${transparent(0.12)}`,
+ z16: `-16px 16px 48px -8px ${transparent(0.16)}`,
+ z20: `-20px 20px 60px -8px ${transparent(0.2)}`,
+ z24: `-24px 24px 72px -8px ${transparent(0.24)}`,
+ //
+ primary: `0 8px 16px 0 ${alpha(primary.main, 0.24)}`,
+ info: `0 8px 16px 0 ${alpha(info.main, 0.24)}`,
+ secondary: `0 8px 16px 0 ${alpha(secondary.main, 0.24)}`,
+ success: `0 8px 16px 0 ${alpha(success.main, 0.24)}`,
+ warning: `0 8px 16px 0 ${alpha(warning.main, 0.24)}`,
+ error: `0 8px 16px 0 ${alpha(error.main, 0.24)}`,
+ //
+ card: `0 0 2px 0 ${alpha(color, 0.2)}, 0 12px 24px -4px ${alpha(color, 0.12)}`,
+ dialog: `-40px 40px 80px -8px ${alpha(color, 0.24)}`,
+ dropdown: `0 0 2px 0 ${alpha(color, 0.24)}, -20px 20px 40px -4px ${alpha(color, 0.24)}`,
+ };
+}
diff --git a/template/src/theme/index.jsx b/template/src/theme/index.jsx
new file mode 100644
index 0000000..5eb65fb
--- /dev/null
+++ b/template/src/theme/index.jsx
@@ -0,0 +1,58 @@
+import { useMemo } from 'react';
+import PropTypes from 'prop-types';
+
+import CssBaseline from '@mui/material/CssBaseline';
+import { createTheme, ThemeProvider as MuiThemeProvider } from '@mui/material/styles';
+
+import { useSettingsContext } from 'src/components/settings';
+
+import { palette } from './palette';
+import { shadows } from './shadows';
+import { typography } from './typography';
+import RTL from './options/right-to-left';
+import { customShadows } from './custom-shadows';
+import { createPresets } from './options/presets';
+import { componentsOverrides } from './overrides';
+
+// ----------------------------------------------------------------------
+
+export default function ThemeProvider({ children }) {
+ const settings = useSettingsContext();
+
+ const presets = createPresets(settings.themeColorPresets);
+
+ const memoizedValue = useMemo(
+ () => ({
+ palette: {
+ ...palette(settings.themeMode),
+ ...presets.palette,
+ },
+ customShadows: {
+ ...customShadows(settings.themeMode),
+ ...presets.customShadows,
+ },
+ direction: settings.themeDirection,
+ shadows: shadows(settings.themeMode),
+ shape: { borderRadius: 8 },
+ typography,
+ }),
+ [settings.themeMode, settings.themeDirection, presets.palette, presets.customShadows]
+ );
+
+ const theme = createTheme(memoizedValue);
+
+ theme.components = componentsOverrides(theme);
+
+ return (
+
+
+
+ {children}
+
+
+ );
+}
+
+ThemeProvider.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/template/src/theme/options/presets.js b/template/src/theme/options/presets.js
new file mode 100644
index 0000000..92e73af
--- /dev/null
+++ b/template/src/theme/options/presets.js
@@ -0,0 +1,141 @@
+import { alpha } from '@mui/material/styles';
+
+import { grey, primary, secondary } from 'src/theme/palette';
+
+// ----------------------------------------------------------------------
+
+export function createPresets(preset) {
+ const { primary: primaryColor, secondary: secondaryColor } = getPrimary(preset);
+
+ const theme = {
+ palette: {
+ primary: primaryColor,
+ secondary: secondaryColor,
+ },
+ customShadows: {
+ primary: `0 8px 16px 0 ${alpha(`${primaryColor.main}`, 0.24)}`,
+ secondary: `0 8px 16px 0 ${alpha(`${secondaryColor.main}`, 0.24)}`,
+ },
+ };
+
+ return {
+ ...theme,
+ };
+}
+
+// ----------------------------------------------------------------------
+
+const preset01 = {
+ primary: {
+ lighter: '#FEE7E4',
+ light: '#FBAEB5',
+ main: '#F2779A',
+ dark: '#AE3B72',
+ darker: '#741655',
+ contrastText: '#FFFFFF',
+ },
+ secondary: {
+ lighter: '#CAFDEB',
+ light: '#61F4D9',
+ main: '#00DCDA',
+ dark: '#00849E',
+ darker: '#004569',
+ contrastText: '#FFFFFF',
+ },
+};
+
+const preset02 = {
+ primary: {
+ lighter: '#D0FCE0',
+ light: '#72F2B9',
+ main: '#1AD5A6',
+ dark: '#0D9991',
+ darker: '#045966',
+ contrastText: grey[800],
+ },
+ secondary: {
+ lighter: '#D6E5FD',
+ light: '#85A9F3',
+ main: '#3562D7',
+ dark: '#1A369A',
+ darker: '#0A1967',
+ contrastText: '#FFFFFF',
+ },
+};
+
+const preset03 = {
+ primary: {
+ lighter: '#CCF4FE',
+ light: '#68CDF9',
+ main: '#078DEE',
+ dark: '#0351AB',
+ darker: '#012972',
+ contrastText: '#FFFFFF',
+ },
+ secondary: {
+ lighter: '#FFF3D8',
+ light: '#FFD18B',
+ main: '#FFA03F',
+ dark: '#B75D1F',
+ darker: '#7A2D0C',
+ contrastText: grey[800],
+ },
+};
+
+const preset04 = {
+ primary: {
+ lighter: '#C8FAD6',
+ light: '#5BE49B',
+ main: '#00A76F',
+ dark: '#007867',
+ darker: '#004B50',
+ contrastText: '#FFFFFF',
+ },
+ secondary: {
+ lighter: '#FEEFD5',
+ light: '#FBC182',
+ main: '#F37F31',
+ dark: '#AE4318',
+ darker: '#741B09',
+ contrastText: '#FFFFFF',
+ },
+};
+
+const preset05 = {
+ primary: {
+ lighter: '#F9E9D1',
+ light: '#DBA573',
+ main: '#87431D',
+ dark: '#61210E',
+ darker: '#400C05',
+ contrastText: '#FFFFFF',
+ },
+ secondary: {
+ lighter: '#FCF0DA',
+ light: '#EEC18D',
+ main: '#C87941',
+ dark: '#904220',
+ darker: '#601B0C',
+ contrastText: '#FFFFFF',
+ },
+};
+
+export const presetOptions = [
+ { name: 'default', value: [primary.main, secondary.main] },
+ { name: 'preset01', value: [preset01.primary.main, preset01.secondary.main] },
+ { name: 'preset02', value: [preset02.primary.main, preset02.secondary.main] },
+ { name: 'preset03', value: [preset03.primary.main, preset03.secondary.main] },
+ { name: 'preset04', value: [preset04.primary.main, preset04.secondary.main] },
+ { name: 'preset05', value: [preset05.primary.main, preset05.secondary.main] },
+];
+
+export function getPrimary(preset) {
+ return {
+ default: { primary, secondary },
+ preset01,
+ preset02,
+ preset03,
+ preset04,
+ preset05,
+ }[preset];
+}
diff --git a/template/src/theme/options/right-to-left.jsx b/template/src/theme/options/right-to-left.jsx
new file mode 100644
index 0000000..93f3624
--- /dev/null
+++ b/template/src/theme/options/right-to-left.jsx
@@ -0,0 +1,31 @@
+import { useEffect } from 'react';
+import PropTypes from 'prop-types';
+import createCache from '@emotion/cache';
+import rtlPlugin from 'stylis-plugin-rtl';
+import { CacheProvider } from '@emotion/react';
+
+// ----------------------------------------------------------------------
+
+export default function RTL({ children, themeDirection }) {
+ useEffect(() => {
+ document.dir = themeDirection;
+ }, [themeDirection]);
+
+ const cacheRtl = createCache({
+ key: 'rtl',
+ prepend: true,
+ // https://github.com/styled-components/stylis-plugin-rtl/issues/35
+ stylisPlugins: [rtlPlugin],
+ });
+
+ if (themeDirection === 'rtl') {
+ return {children} ;
+ }
+
+ return <>{children}>;
+}
+
+RTL.propTypes = {
+ children: PropTypes.node,
+ themeDirection: PropTypes.string,
+};
diff --git a/template/src/theme/overrides/components/accordion.js b/template/src/theme/overrides/components/accordion.js
new file mode 100644
index 0000000..937f701
--- /dev/null
+++ b/template/src/theme/overrides/components/accordion.js
@@ -0,0 +1,43 @@
+import { accordionClasses } from '@mui/material/Accordion';
+import { typographyClasses } from '@mui/material/Typography';
+import { accordionSummaryClasses } from '@mui/material/AccordionSummary';
+
+// ----------------------------------------------------------------------
+
+export function accordion(theme) {
+ return {
+ MuiAccordion: {
+ styleOverrides: {
+ root: {
+ backgroundColor: 'transparent',
+ [`&.${accordionClasses.expanded}`]: {
+ boxShadow: theme.customShadows.z8,
+ borderRadius: theme.shape.borderRadius,
+ backgroundColor: theme.palette.background.paper,
+ },
+ [`&.${accordionClasses.disabled}`]: {
+ backgroundColor: 'transparent',
+ },
+ },
+ },
+ },
+ MuiAccordionSummary: {
+ styleOverrides: {
+ root: {
+ paddingLeft: theme.spacing(2),
+ paddingRight: theme.spacing(1),
+ [`&.${accordionSummaryClasses.disabled}`]: {
+ opacity: 1,
+ color: theme.palette.action.disabled,
+ [`& .${typographyClasses.root}`]: {
+ color: 'inherit',
+ },
+ },
+ },
+ expandIconWrapper: {
+ color: 'inherit',
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/alert.js b/template/src/theme/overrides/components/alert.js
new file mode 100644
index 0000000..8abbc16
--- /dev/null
+++ b/template/src/theme/overrides/components/alert.js
@@ -0,0 +1,68 @@
+import { alpha } from '@mui/material/styles';
+import { alertClasses } from '@mui/material/Alert';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export function alert(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ const rootStyles = (ownerState) => {
+ const standardVariant = ownerState.variant === 'standard';
+
+ const filledVariant = ownerState.variant === 'filled';
+
+ const outlinedVariant = ownerState.variant === 'outlined';
+
+ const colorStyle = COLORS.map((color) => ({
+ ...(ownerState.severity === color && {
+ // STANDARD
+ ...(standardVariant && {
+ color: theme.palette[color][lightMode ? 'darker' : 'lighter'],
+ backgroundColor: theme.palette[color][lightMode ? 'lighter' : 'darker'],
+ [`& .${alertClasses.icon}`]: {
+ color: theme.palette[color][lightMode ? 'main' : 'light'],
+ },
+ }),
+ // FILLED
+ ...(filledVariant && {
+ color: theme.palette[color].contrastText,
+ backgroundColor: theme.palette[color].main,
+ }),
+ // OUTLINED
+ ...(outlinedVariant && {
+ backgroundColor: alpha(theme.palette[color].main, 0.08),
+ color: theme.palette[color][lightMode ? 'dark' : 'light'],
+ border: `solid 1px ${alpha(theme.palette[color].main, 0.16)}`,
+ [`& .${alertClasses.icon}`]: {
+ color: theme.palette[color].main,
+ },
+ }),
+ }),
+ }));
+
+ return [...colorStyle];
+ };
+
+ return {
+ MuiAlert: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ icon: {
+ opacity: 1,
+ },
+ },
+ },
+ MuiAlertTitle: {
+ styleOverrides: {
+ root: {
+ marginBottom: theme.spacing(0.5),
+ fontWeight: theme.typography.fontWeightSemiBold,
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/appbar.js b/template/src/theme/overrides/components/appbar.js
new file mode 100644
index 0000000..c98f6a0
--- /dev/null
+++ b/template/src/theme/overrides/components/appbar.js
@@ -0,0 +1,13 @@
+// ----------------------------------------------------------------------
+
+export function appBar(theme) {
+ return {
+ MuiAppBar: {
+ styleOverrides: {
+ root: {
+ boxShadow: 'none',
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/autocomplete.js b/template/src/theme/overrides/components/autocomplete.js
new file mode 100644
index 0000000..876b7d9
--- /dev/null
+++ b/template/src/theme/overrides/components/autocomplete.js
@@ -0,0 +1,44 @@
+import { alpha } from '@mui/material/styles';
+import { svgIconClasses } from '@mui/material/SvgIcon';
+import { autocompleteClasses } from '@mui/material/Autocomplete';
+
+import { paper, menuItem } from '../../css';
+
+// ----------------------------------------------------------------------
+
+export function autocomplete(theme) {
+ return {
+ MuiAutocomplete: {
+ styleOverrides: {
+ root: {
+ [`& span.${autocompleteClasses.tag}`]: {
+ ...theme.typography.subtitle2,
+ height: 24,
+ minWidth: 24,
+ lineHeight: '24px',
+ textAlign: 'center',
+ padding: theme.spacing(0, 0.75),
+ color: theme.palette.text.secondary,
+ borderRadius: theme.shape.borderRadius,
+ backgroundColor: alpha(theme.palette.grey[500], 0.16),
+ },
+ },
+ paper: {
+ ...paper({ theme, dropdown: true }),
+ },
+ listbox: {
+ padding: 0,
+ [`& .${autocompleteClasses.option}`]: {
+ ...menuItem(theme),
+ },
+ },
+ endAdornment: {
+ [`& .${svgIconClasses.root}`]: {
+ width: 18,
+ height: 18,
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/avatar.js b/template/src/theme/overrides/components/avatar.js
new file mode 100644
index 0000000..98a0010
--- /dev/null
+++ b/template/src/theme/overrides/components/avatar.js
@@ -0,0 +1,103 @@
+import { alpha } from '@mui/material/styles';
+import { avatarGroupClasses } from '@mui/material/AvatarGroup';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['default', 'primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+const colorByName = (name) => {
+ const charAt = name.charAt(0).toLowerCase();
+
+ if (['a', 'c', 'f'].includes(charAt)) return 'primary';
+ if (['e', 'd', 'h'].includes(charAt)) return 'secondary';
+ if (['i', 'k', 'l'].includes(charAt)) return 'info';
+ if (['m', 'n', 'p'].includes(charAt)) return 'success';
+ if (['q', 's', 't'].includes(charAt)) return 'warning';
+ if (['v', 'x', 'y'].includes(charAt)) return 'error';
+ return 'default';
+};
+
+// ----------------------------------------------------------------------
+
+export function avatar(theme) {
+ return {
+ MuiAvatar: {
+ variants: COLORS.map((color) =>
+ color === 'default'
+ ? {
+ props: { color: 'default' },
+ style: {
+ color: theme.palette.text.secondary,
+ backgroundColor: alpha(theme.palette.grey[500], 0.24),
+ },
+ }
+ : {
+ props: { color },
+ style: {
+ color: theme.palette[color].contrastText,
+ backgroundColor: theme.palette[color].main,
+ },
+ }
+ ),
+
+ styleOverrides: {
+ rounded: {
+ borderRadius: theme.shape.borderRadius * 1.5,
+ },
+ colorDefault: ({ ownerState }) => {
+ const color = colorByName(`${ownerState.alt}`);
+
+ return {
+ ...(!!ownerState.alt && {
+ ...(color !== 'default'
+ ? {
+ color: theme.palette[color].contrastText,
+ backgroundColor: theme.palette[color].main,
+ }
+ : {
+ color: theme.palette.text.secondary,
+ backgroundColor: alpha(theme.palette.grey[500], 0.24),
+ }),
+ }),
+ };
+ },
+ },
+ },
+ MuiAvatarGroup: {
+ styleOverrides: {
+ root: ({ ownerState }) => ({
+ justifyContent: 'flex-end',
+ ...(ownerState.variant === 'compact' && {
+ width: 40,
+ height: 40,
+ position: 'relative',
+ [`& .${avatarGroupClasses.avatar}`]: {
+ margin: 0,
+ width: 28,
+ height: 28,
+ position: 'absolute',
+ '&:first-of-type': {
+ left: 0,
+ bottom: 0,
+ zIndex: 9,
+ },
+ '&:last-of-type': {
+ top: 0,
+ right: 0,
+ },
+ },
+ }),
+ }),
+ avatar: {
+ fontSize: 16,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ '&:first-of-type': {
+ fontSize: 12,
+ color: theme.palette.primary.dark,
+ backgroundColor: theme.palette.primary.lighter,
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/backdrop.js b/template/src/theme/overrides/components/backdrop.js
new file mode 100644
index 0000000..e25f5ba
--- /dev/null
+++ b/template/src/theme/overrides/components/backdrop.js
@@ -0,0 +1,18 @@
+import { alpha } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+export function backdrop(theme) {
+ return {
+ MuiBackdrop: {
+ styleOverrides: {
+ root: {
+ backgroundColor: alpha(theme.palette.grey[900], 0.8),
+ },
+ invisible: {
+ background: 'transparent',
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/badge.js b/template/src/theme/overrides/components/badge.js
new file mode 100644
index 0000000..dffc815
--- /dev/null
+++ b/template/src/theme/overrides/components/badge.js
@@ -0,0 +1,90 @@
+import { badgeClasses } from '@mui/material/Badge';
+
+// ----------------------------------------------------------------------
+
+export function badge(theme) {
+ return {
+ MuiBadge: {
+ styleOverrides: {
+ dot: {
+ borderRadius: '50%',
+ },
+ root: ({ ownerState }) => {
+ const alway = ownerState.variant === 'alway';
+
+ const online = ownerState.variant === 'online';
+
+ const busy = ownerState.variant === 'busy';
+
+ const offline = ownerState.variant === 'offline';
+
+ const invisible = ownerState.variant === 'invisible';
+
+ const baseStyles = {
+ [`&.${badgeClasses.invisible}`]: {
+ transform: 'unset',
+ },
+ width: 10,
+ zIndex: 9,
+ padding: 0,
+ height: 10,
+ minWidth: 'auto',
+ '&:before, &:after': {
+ content: "''",
+ borderRadius: 1,
+ backgroundColor: theme.palette.common.white,
+ },
+ };
+
+ return {
+ ...(online && {
+ [`& .${badgeClasses.badge}`]: {
+ ...baseStyles,
+ backgroundColor: theme.palette.success.main,
+ },
+ }),
+ ...(busy && {
+ [`& .${badgeClasses.badge}`]: {
+ ...baseStyles,
+ backgroundColor: theme.palette.error.main,
+ '&:before': { width: 6, height: 2 },
+ },
+ }),
+ ...(offline && {
+ [`& .${badgeClasses.badge}`]: {
+ ...baseStyles,
+ backgroundColor: theme.palette.text.disabled,
+ '&:before': {
+ width: 6,
+ height: 6,
+ borderRadius: '50%',
+ },
+ },
+ }),
+ ...(alway && {
+ [`& .${badgeClasses.badge}`]: {
+ ...baseStyles,
+ backgroundColor: theme.palette.warning.main,
+ '&:before': {
+ width: 2,
+ height: 4,
+ transform: 'translateX(1px) translateY(-1px)',
+ },
+ '&:after': {
+ width: 2,
+ height: 4,
+ transform: 'translateY(1px) rotate(125deg)',
+ },
+ },
+ }),
+ ...(invisible && {
+ [`& .${badgeClasses.badge}`]: {
+ display: 'none',
+ },
+ }),
+ };
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/breadcrumbs.js b/template/src/theme/overrides/components/breadcrumbs.js
new file mode 100644
index 0000000..6e93e19
--- /dev/null
+++ b/template/src/theme/overrides/components/breadcrumbs.js
@@ -0,0 +1,21 @@
+// ----------------------------------------------------------------------
+
+export function breadcrumbs(theme) {
+ return {
+ MuiBreadcrumbs: {
+ styleOverrides: {
+ separator: {
+ marginLeft: theme.spacing(2),
+ marginRight: theme.spacing(2),
+ },
+ li: {
+ display: 'inline-flex',
+ margin: theme.spacing(0.25, 0),
+ '& > *': {
+ ...theme.typography.body2,
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/button-group.js b/template/src/theme/overrides/components/button-group.js
new file mode 100644
index 0000000..b3ddc8c
--- /dev/null
+++ b/template/src/theme/overrides/components/button-group.js
@@ -0,0 +1,90 @@
+import { alpha } from '@mui/material/styles';
+import { buttonGroupClasses } from '@mui/material/ButtonGroup';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export function buttonGroup(theme) {
+ const rootStyles = (ownerState) => {
+ const inheritColor = ownerState.color === 'inherit';
+
+ const containedVariant = ownerState.variant === 'contained';
+
+ const outlinedVariant = ownerState.variant === 'outlined';
+
+ const textVariant = ownerState.variant === 'text';
+
+ const softVariant = ownerState.variant === 'soft';
+
+ const horizontalOrientation = ownerState.orientation === 'horizontal';
+
+ const verticalOrientation = ownerState.orientation === 'vertical';
+
+ const defaultStyle = {
+ [`& .${buttonGroupClasses.grouped}`]: {
+ '&:not(:last-of-type)': {
+ ...(!outlinedVariant && {
+ borderStyle: 'solid',
+ ...(inheritColor && {
+ borderColor: alpha(theme.palette.grey[500], 0.32),
+ }),
+ // HORIZONTAL
+ ...(horizontalOrientation && {
+ borderWidth: '0px 1px 0px 0px',
+ }),
+ // VERTICAL
+ ...(verticalOrientation && {
+ borderWidth: '0px 0px 1px 0px',
+ }),
+ }),
+ },
+ },
+ };
+
+ const colorStyle = COLORS.map((color) => ({
+ [`& .${buttonGroupClasses.grouped}`]: {
+ '&:not(:last-of-type)': {
+ ...(!outlinedVariant && {
+ ...(ownerState.color === color && {
+ // CONTAINED
+ ...(containedVariant && {
+ borderColor: alpha(theme.palette[color].dark, 0.48),
+ }),
+ // TEXT
+ ...(textVariant && {
+ borderColor: alpha(theme.palette[color].main, 0.48),
+ }),
+ // SOFT
+ ...(softVariant && {
+ borderColor: alpha(theme.palette[color].dark, 0.24),
+ }),
+ }),
+ }),
+ },
+ },
+ }));
+
+ const disabledState = {
+ [`& .${buttonGroupClasses.grouped}`]: {
+ [`&.${buttonGroupClasses.disabled}`]: {
+ '&:not(:last-of-type)': {
+ borderColor: theme.palette.action.disabledBackground,
+ },
+ },
+ },
+ };
+
+ return [defaultStyle, ...colorStyle, disabledState];
+ };
+
+ return {
+ MuiButtonGroup: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/button.js b/template/src/theme/overrides/components/button.js
new file mode 100644
index 0000000..fb7954d
--- /dev/null
+++ b/template/src/theme/overrides/components/button.js
@@ -0,0 +1,139 @@
+import { alpha } from '@mui/material/styles';
+import { buttonClasses } from '@mui/material/Button';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export function button(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ const rootStyles = (ownerState) => {
+ const inheritColor = ownerState.color === 'inherit';
+
+ const containedVariant = ownerState.variant === 'contained';
+
+ const outlinedVariant = ownerState.variant === 'outlined';
+
+ const textVariant = ownerState.variant === 'text';
+
+ const softVariant = ownerState.variant === 'soft';
+
+ const smallSize = ownerState.size === 'small';
+
+ const mediumSize = ownerState.size === 'medium';
+
+ const largeSize = ownerState.size === 'large';
+
+ const defaultStyle = {
+ ...(inheritColor && {
+ // CONTAINED
+ ...(containedVariant && {
+ color: lightMode ? theme.palette.common.white : theme.palette.grey[800],
+ backgroundColor: lightMode ? theme.palette.grey[800] : theme.palette.common.white,
+ '&:hover': {
+ backgroundColor: lightMode ? theme.palette.grey[700] : theme.palette.grey[400],
+ },
+ }),
+ // OUTLINED
+ ...(outlinedVariant && {
+ borderColor: alpha(theme.palette.grey[500], 0.32),
+ '&:hover': {
+ backgroundColor: theme.palette.action.hover,
+ },
+ }),
+ // TEXT
+ ...(textVariant && {
+ '&:hover': {
+ backgroundColor: theme.palette.action.hover,
+ },
+ }),
+ // SOFT
+ ...(softVariant && {
+ color: theme.palette.text.primary,
+ backgroundColor: alpha(theme.palette.grey[500], 0.08),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.grey[500], 0.24),
+ },
+ }),
+ }),
+ ...(outlinedVariant && {
+ '&:hover': {
+ borderColor: 'currentColor',
+ boxShadow: '0 0 0 0.5px currentColor',
+ },
+ }),
+ };
+
+ const colorStyle = COLORS.map((color) => ({
+ ...(ownerState.color === color && {
+ // CONTAINED
+ ...(containedVariant && {
+ '&:hover': {
+ boxShadow: theme.customShadows[color],
+ },
+ }),
+ // SOFT
+ ...(softVariant && {
+ color: theme.palette[color][lightMode ? 'dark' : 'light'],
+ backgroundColor: alpha(theme.palette[color].main, 0.16),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette[color].main, 0.32),
+ },
+ }),
+ }),
+ }));
+
+ const disabledState = {
+ [`&.${buttonClasses.disabled}`]: {
+ // SOFT
+ ...(softVariant && {
+ backgroundColor: theme.palette.action.disabledBackground,
+ }),
+ },
+ };
+
+ const size = {
+ ...(smallSize && {
+ height: 30,
+ fontSize: 13,
+ paddingLeft: 8,
+ paddingRight: 8,
+ ...(textVariant && {
+ paddingLeft: 4,
+ paddingRight: 4,
+ }),
+ }),
+ ...(mediumSize && {
+ paddingLeft: 12,
+ paddingRight: 12,
+ ...(textVariant && {
+ paddingLeft: 8,
+ paddingRight: 8,
+ }),
+ }),
+ ...(largeSize && {
+ height: 48,
+ fontSize: 15,
+ paddingLeft: 16,
+ paddingRight: 16,
+ ...(textVariant && {
+ paddingLeft: 10,
+ paddingRight: 10,
+ }),
+ }),
+ };
+
+ return [defaultStyle, ...colorStyle, disabledState, size];
+ };
+
+ return {
+ MuiButton: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/card.js b/template/src/theme/overrides/components/card.js
new file mode 100644
index 0000000..060f05f
--- /dev/null
+++ b/template/src/theme/overrides/components/card.js
@@ -0,0 +1,30 @@
+// ----------------------------------------------------------------------
+
+export function card(theme) {
+ return {
+ MuiCard: {
+ styleOverrides: {
+ root: {
+ position: 'relative',
+ boxShadow: theme.customShadows.card,
+ borderRadius: theme.shape.borderRadius * 2,
+ zIndex: 0, // Fix Safari overflow: hidden with border radius
+ },
+ },
+ },
+ MuiCardHeader: {
+ styleOverrides: {
+ root: {
+ padding: theme.spacing(3, 3, 0),
+ },
+ },
+ },
+ MuiCardContent: {
+ styleOverrides: {
+ root: {
+ padding: theme.spacing(3),
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/checkbox.js b/template/src/theme/overrides/components/checkbox.js
new file mode 100644
index 0000000..b408515
--- /dev/null
+++ b/template/src/theme/overrides/components/checkbox.js
@@ -0,0 +1,27 @@
+import { checkboxClasses } from '@mui/material/Checkbox';
+
+// ----------------------------------------------------------------------
+
+export function checkbox(theme) {
+ return {
+ MuiCheckbox: {
+ styleOverrides: {
+ root: ({ ownerState }) => {
+ const { color } = ownerState;
+
+ return {
+ padding: theme.spacing(1),
+ ...(color === 'default' && {
+ [`&.${checkboxClasses.checked}`]: {
+ color: theme.palette.text.primary,
+ },
+ }),
+ [`&.${checkboxClasses.disabled}`]: {
+ color: theme.palette.action.disabled,
+ },
+ };
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/chip.js b/template/src/theme/overrides/components/chip.js
new file mode 100644
index 0000000..7886a45
--- /dev/null
+++ b/template/src/theme/overrides/components/chip.js
@@ -0,0 +1,123 @@
+import { alpha } from '@mui/material/styles';
+import { chipClasses } from '@mui/material/Chip';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export function chip(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ const rootStyles = (ownerState) => {
+ const defaultColor = ownerState.color === 'default';
+
+ const filledVariant = ownerState.variant === 'filled';
+
+ const outlinedVariant = ownerState.variant === 'outlined';
+
+ const softVariant = ownerState.variant === 'soft';
+
+ const defaultStyle = {
+ [`& .${chipClasses.deleteIcon}`]: {
+ opacity: 0.48,
+ color: 'currentColor',
+ '&:hover': {
+ opacity: 1,
+ color: 'currentColor',
+ },
+ },
+
+ ...(defaultColor && {
+ [`& .${chipClasses.avatar}`]: {
+ color: theme.palette.text.primary,
+ },
+ // FILLED
+ ...(filledVariant && {
+ color: lightMode ? theme.palette.common.white : theme.palette.grey[800],
+ backgroundColor: theme.palette.text.primary,
+ '&:hover': {
+ backgroundColor: lightMode ? theme.palette.grey[700] : theme.palette.grey[100],
+ },
+ [`& .${chipClasses.icon}`]: {
+ color: lightMode ? theme.palette.common.white : theme.palette.grey[800],
+ },
+ }),
+ // OUTLINED
+ ...(outlinedVariant && {
+ border: `solid 1px ${alpha(theme.palette.grey[500], 0.32)}`,
+ }),
+ // SOFT
+ ...(softVariant && {
+ color: theme.palette.text.primary,
+ backgroundColor: alpha(theme.palette.grey[500], 0.16),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.grey[500], 0.32),
+ },
+ }),
+ }),
+ };
+
+ const colorStyle = COLORS.map((color) => ({
+ ...(ownerState.color === color && {
+ [`& .${chipClasses.avatar}`]: {
+ color: theme.palette[color].lighter,
+ backgroundColor: theme.palette[color].dark,
+ },
+ // SOFT
+ ...(softVariant && {
+ color: theme.palette[color][lightMode ? 'dark' : 'light'],
+ backgroundColor: alpha(theme.palette[color].main, 0.16),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette[color].main, 0.32),
+ },
+ }),
+ }),
+ }));
+
+ const disabledState = {
+ [`&.${chipClasses.disabled}`]: {
+ opacity: 1,
+ color: theme.palette.action.disabled,
+ [`& .${chipClasses.icon}`]: {
+ color: theme.palette.action.disabled,
+ },
+ [`& .${chipClasses.avatar}`]: {
+ color: theme.palette.action.disabled,
+ backgroundColor: theme.palette.action.disabledBackground,
+ },
+ // FILLED
+ ...(filledVariant && {
+ backgroundColor: theme.palette.action.disabledBackground,
+ }),
+ // OUTLINED
+ ...(outlinedVariant && {
+ borderColor: theme.palette.action.disabledBackground,
+ }),
+ // SOFT
+ ...(softVariant && {
+ backgroundColor: theme.palette.action.disabledBackground,
+ }),
+ },
+ };
+
+ return [
+ defaultStyle,
+ ...colorStyle,
+ disabledState,
+ {
+ fontWeight: 500,
+ borderRadius: theme.shape.borderRadius,
+ },
+ ];
+ };
+
+ return {
+ MuiChip: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/css-baseline.js b/template/src/theme/overrides/components/css-baseline.js
new file mode 100644
index 0000000..1d7cd70
--- /dev/null
+++ b/template/src/theme/overrides/components/css-baseline.js
@@ -0,0 +1,48 @@
+// ----------------------------------------------------------------------
+
+export function cssBaseline(theme) {
+ return {
+ MuiCssBaseline: {
+ styleOverrides: {
+ '*': {
+ boxSizing: 'border-box',
+ },
+ html: {
+ margin: 0,
+ padding: 0,
+ width: '100%',
+ height: '100%',
+ WebkitOverflowScrolling: 'touch',
+ },
+ body: {
+ margin: 0,
+ padding: 0,
+ width: '100%',
+ height: '100%',
+ },
+ '#root, #__next': {
+ width: '100%',
+ height: '100%',
+ },
+ input: {
+ '&[type=number]': {
+ MozAppearance: 'textfield',
+ '&::-webkit-outer-spin-button': {
+ margin: 0,
+ WebkitAppearance: 'none',
+ },
+ '&::-webkit-inner-spin-button': {
+ margin: 0,
+ WebkitAppearance: 'none',
+ },
+ },
+ },
+ img: {
+ maxWidth: '100%',
+ display: 'inline-block',
+ verticalAlign: 'bottom',
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/data-grid.js b/template/src/theme/overrides/components/data-grid.js
new file mode 100644
index 0000000..eab5829
--- /dev/null
+++ b/template/src/theme/overrides/components/data-grid.js
@@ -0,0 +1,152 @@
+import { alpha } from '@mui/material/styles';
+import { listClasses } from '@mui/material/List';
+import { paperClasses } from '@mui/material/Paper';
+import { buttonClasses } from '@mui/material/Button';
+import { iconButtonClasses } from '@mui/material/IconButton';
+import { inputLabelClasses } from '@mui/material/InputLabel';
+import { formControlClasses } from '@mui/material/FormControl';
+import { listItemIconClasses } from '@mui/material/ListItemIcon';
+import { circularProgressClasses } from '@mui/material/CircularProgress';
+
+import { paper } from '../../css';
+
+// ----------------------------------------------------------------------
+
+export function dataGrid(theme) {
+ const paperStyles = paper({ theme, dropdown: true });
+
+ return {
+ MuiDataGrid: {
+ styleOverrides: {
+ root: {
+ '--unstable_DataGrid-radius': 0,
+ '--unstable_DataGrid-headWeight': theme.typography.fontWeightSemiBold,
+ borderWidth: 0,
+ },
+ withBorderColor: {
+ borderColor: theme.palette.divider,
+ },
+ // Column
+ columnHeaders: {
+ borderBottom: 0,
+ },
+ columnHeader: {
+ fontSize: 14,
+ color: theme.palette.text.secondary,
+ backgroundColor: theme.palette.background.neutral,
+ '&--sorted': {
+ color: theme.palette.text.primary,
+ },
+ },
+ columnSeparator: {
+ color: theme.palette.divider,
+ },
+ // Row, Cell
+ cell: {
+ borderBottom: `1px dashed`,
+ '&--editing': {
+ boxShadow: 'none !important',
+ backgroundColor: `${alpha(theme.palette.primary.main, 0.08)} !important`,
+ },
+ },
+ // Toolbar
+ toolbarContainer: {
+ gap: theme.spacing(2),
+ padding: theme.spacing(2),
+ },
+ toolbarQuickFilter: {
+ padding: 0,
+ width: '100%',
+ [theme.breakpoints.up('md')]: {
+ width: 'unset',
+ },
+ },
+ // Paper
+ paper: {
+ ...paperStyles,
+ padding: 0,
+ },
+ menu: {
+ [`& .${paperClasses.root}`]: {
+ ...paperStyles,
+ minWidth: 140,
+ },
+ [`& .${listClasses.root}`]: {
+ padding: 0,
+ [`& .${listItemIconClasses.root}`]: {
+ minWidth: 0,
+ marginRight: theme.spacing(2),
+ },
+ },
+ },
+ // Icons
+ menuIcon: {
+ [`& .${iconButtonClasses.root}`]: {
+ margin: theme.spacing(0, 1),
+ padding: theme.spacing(0.25),
+ },
+ },
+ iconButtonContainer: {
+ [`& .${iconButtonClasses.root}`]: {
+ padding: theme.spacing(0.25),
+ marginLeft: theme.spacing(1),
+ },
+ },
+ // Footer
+ footerContainer: {
+ minHeight: 'auto',
+ borderTop: `1px dashed`,
+ },
+ selectedRowCount: {
+ display: 'none',
+ whiteSpace: 'nowrap',
+ },
+ overlay: {
+ [`& .${circularProgressClasses.root}`]: {
+ color: theme.palette.text.primary,
+ },
+ },
+ // Columns Panel
+ panelHeader: {
+ padding: theme.spacing(2, 2, 0, 2),
+ },
+ panelContent: {
+ padding: theme.spacing(1),
+ },
+ columnsPanelRow: {
+ margin: theme.spacing(0.5, 0),
+ },
+ panelFooter: {
+ display: 'none',
+ gap: theme.spacing(1),
+ padding: theme.spacing(2),
+ justifyContent: 'flex-end',
+ borderTop: `dashed 1px ${theme.palette.divider}`,
+ [`& .${buttonClasses.root}`]: {
+ padding: theme.spacing(0.5, 1.5),
+ '&:first-of-type': {
+ border: `solid 1px ${alpha(theme.palette.grey[500], 0.24)}`,
+ },
+ '&:last-of-type': {
+ color: theme.palette.background.paper,
+ backgroundColor: theme.palette.text.primary,
+ },
+ },
+ },
+ filterForm: {
+ alignItems: 'center',
+ gap: theme.spacing(1.5),
+ padding: theme.spacing(1),
+ },
+ filterFormValueInput: {
+ [`& .${formControlClasses.root}`]: {
+ width: '100%',
+ },
+ [`& .${inputLabelClasses.root}`]: {
+ transform: 'translate(14px, -9px) scale(0.75)',
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/date-picker.jsx b/template/src/theme/overrides/components/date-picker.jsx
new file mode 100644
index 0000000..999101d
--- /dev/null
+++ b/template/src/theme/overrides/components/date-picker.jsx
@@ -0,0 +1,83 @@
+import { buttonClasses } from '@mui/material/Button';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const dateList = [
+ 'DatePicker',
+ 'DateTimePicker',
+ 'StaticDatePicker',
+ 'DesktopDatePicker',
+ 'DesktopDateTimePicker',
+ //
+ 'MobileDatePicker',
+ 'MobileDateTimePicker',
+];
+
+const timeList = ['TimePicker', 'MobileTimePicker', 'StaticTimePicker', 'DesktopTimePicker'];
+
+const switchIcon = () => ;
+
+const leftIcon = () => ;
+
+const rightIcon = () => ;
+
+const calendarIcon = () => ;
+
+const clockIcon = () => ;
+
+const desktopTypes = dateList.reduce((result, currentValue) => {
+ result[`Mui${currentValue}`] = {
+ defaultProps: {
+ slots: {
+ openPickerIcon: calendarIcon,
+ leftArrowIcon: leftIcon,
+ rightArrowIcon: rightIcon,
+ switchViewIcon: switchIcon,
+ },
+ },
+ };
+
+ return result;
+}, {});
+
+const timeTypes = timeList.reduce((result, currentValue) => {
+ result[`Mui${currentValue}`] = {
+ defaultProps: {
+ slots: {
+ openPickerIcon: clockIcon,
+ rightArrowIcon: rightIcon,
+ switchViewIcon: switchIcon,
+ },
+ },
+ };
+
+ return result;
+}, {});
+
+export function datePicker(theme) {
+ return {
+ MuiPickersLayout: {
+ styleOverrides: {
+ root: {
+ '& .MuiPickersLayout-actionBar': {
+ [`& .${buttonClasses.root}:last-of-type`]: {
+ backgroundColor: theme.palette.text.primary,
+ color:
+ theme.palette.mode === 'light'
+ ? theme.palette.common.white
+ : theme.palette.grey[800],
+ },
+ },
+ },
+ },
+ },
+
+ // Date
+ ...desktopTypes,
+
+ // Time
+ ...timeTypes,
+ };
+}
diff --git a/template/src/theme/overrides/components/dialog.js b/template/src/theme/overrides/components/dialog.js
new file mode 100644
index 0000000..e04b9f6
--- /dev/null
+++ b/template/src/theme/overrides/components/dialog.js
@@ -0,0 +1,49 @@
+// ----------------------------------------------------------------------
+
+export function dialog(theme) {
+ return {
+ MuiDialog: {
+ styleOverrides: {
+ paper: ({ ownerState }) => ({
+ boxShadow: theme.customShadows.dialog,
+ borderRadius: theme.shape.borderRadius * 2,
+ ...(!ownerState.fullScreen && {
+ margin: theme.spacing(2),
+ }),
+ }),
+ paperFullScreen: {
+ borderRadius: 0,
+ },
+ },
+ },
+ MuiDialogTitle: {
+ styleOverrides: {
+ root: {
+ padding: theme.spacing(3),
+ },
+ },
+ },
+ MuiDialogContent: {
+ styleOverrides: {
+ root: {
+ padding: theme.spacing(0, 3),
+ },
+ dividers: {
+ borderTop: 0,
+ borderBottomStyle: 'dashed',
+ paddingBottom: theme.spacing(3),
+ },
+ },
+ },
+ MuiDialogActions: {
+ styleOverrides: {
+ root: {
+ padding: theme.spacing(3),
+ '& > :not(:first-of-type)': {
+ marginLeft: theme.spacing(1.5),
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/drawer.js b/template/src/theme/overrides/components/drawer.js
new file mode 100644
index 0000000..1d6ce0e
--- /dev/null
+++ b/template/src/theme/overrides/components/drawer.js
@@ -0,0 +1,36 @@
+import { alpha } from '@mui/material/styles';
+import { drawerClasses } from '@mui/material/Drawer';
+
+import { paper } from '../../css';
+
+// ----------------------------------------------------------------------
+
+export function drawer(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ return {
+ MuiDrawer: {
+ styleOverrides: {
+ root: ({ ownerState }) => ({
+ ...(ownerState.variant === 'temporary' && {
+ [`& .${drawerClasses.paper}`]: {
+ ...paper({ theme }),
+ ...(ownerState.anchor === 'left' && {
+ boxShadow: `40px 40px 80px -8px ${alpha(
+ lightMode ? theme.palette.grey[500] : theme.palette.common.black,
+ 0.24
+ )}`,
+ }),
+ ...(ownerState.anchor === 'right' && {
+ boxShadow: `-40px 40px 80px -8px ${alpha(
+ lightMode ? theme.palette.grey[500] : theme.palette.common.black,
+ 0.24
+ )}`,
+ }),
+ },
+ }),
+ }),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/fab.js b/template/src/theme/overrides/components/fab.js
new file mode 100644
index 0000000..49ef3bd
--- /dev/null
+++ b/template/src/theme/overrides/components/fab.js
@@ -0,0 +1,159 @@
+import { alpha } from '@mui/material/styles';
+import { fabClasses } from '@mui/material/Fab';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export function fab(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ const rootStyles = (ownerState) => {
+ const defaultColor = ownerState.color === 'default';
+
+ const inheritColor = ownerState.color === 'inherit';
+
+ const circularVariant = ownerState.variant === 'circular';
+
+ const extendedVariant = ownerState.variant === 'extended';
+
+ const outlinedVariant = ownerState.variant === 'outlined';
+
+ const outlinedExtendedVariant = ownerState.variant === 'outlinedExtended';
+
+ const softVariant = ownerState.variant === 'soft';
+
+ const softExtendedVariant = ownerState.variant === 'softExtended';
+
+ const defaultStyle = {
+ '&:hover, &:active': {
+ boxShadow: 'none',
+ },
+ // FILLED
+ ...((circularVariant || extendedVariant) && {
+ ...((defaultColor || inheritColor) && {
+ boxShadow: theme.customShadows.z8,
+ }),
+ ...(inheritColor && {
+ backgroundColor: theme.palette.text.primary,
+ color: lightMode ? theme.palette.common.white : theme.palette.grey[800],
+ '&:hover': {
+ backgroundColor: lightMode ? theme.palette.grey[700] : theme.palette.grey[400],
+ },
+ }),
+ }),
+ // OUTLINED
+ ...((outlinedVariant || outlinedExtendedVariant) && {
+ boxShadow: 'none',
+ backgroundColor: 'transparent',
+ ...((defaultColor || inheritColor) && {
+ border: `solid 1px ${alpha(theme.palette.grey[500], 0.32)}`,
+ }),
+ ...(defaultColor && {
+ ...(!lightMode && {
+ color: theme.palette.text.secondary,
+ }),
+ }),
+
+ '&:hover': {
+ borderColor: 'currentColor',
+ boxShadow: '0 0 0 0.5px currentColor',
+ backgroundColor: theme.palette.action.hover,
+ },
+ }),
+ // SOFT
+ ...((softVariant || softExtendedVariant) && {
+ boxShadow: 'none',
+ ...(defaultColor && {
+ color: theme.palette.grey[800],
+ backgroundColor: theme.palette.grey[300],
+ '&:hover': {
+ backgroundColor: theme.palette.grey[400],
+ },
+ }),
+ ...(inheritColor && {
+ backgroundColor: alpha(theme.palette.grey[500], 0.08),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.grey[500], 0.24),
+ },
+ }),
+ }),
+ };
+
+ const colorStyle = COLORS.map((color) => ({
+ ...(ownerState.color === color && {
+ // FILLED
+ ...((circularVariant || extendedVariant) && {
+ boxShadow: theme.customShadows[color],
+ '&:hover': {
+ backgroundColor: theme.palette[color].dark,
+ },
+ }),
+ // OUTLINED
+ ...((outlinedVariant || outlinedExtendedVariant) && {
+ color: theme.palette[color].main,
+ border: `solid 1px ${alpha(theme.palette[color].main, 0.48)}`,
+ '&:hover': {
+ backgroundColor: alpha(theme.palette[color].main, 0.08),
+ },
+ }),
+ // SOFT
+ ...((softVariant || softExtendedVariant) && {
+ color: theme.palette[color][lightMode ? 'dark' : 'light'],
+ backgroundColor: alpha(theme.palette[color].main, 0.16),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette[color].main, 0.32),
+ },
+ }),
+ }),
+ }));
+
+ const disabledState = {
+ [`&.${fabClasses.disabled}`]: {
+ ...((outlinedVariant || outlinedExtendedVariant) && {
+ backgroundColor: 'transparent',
+ border: `solid 1px ${theme.palette.action.disabledBackground}`,
+ }),
+ },
+ };
+
+ const size = {
+ ...((extendedVariant || outlinedExtendedVariant || softExtendedVariant) && {
+ width: 'auto',
+ '& svg': {
+ marginRight: theme.spacing(1),
+ },
+ ...(ownerState.size === 'small' && {
+ height: 34,
+ minHeight: 34,
+ borderRadius: 17,
+ padding: theme.spacing(0, 1),
+ }),
+ ...(ownerState.size === 'medium' && {
+ height: 40,
+ minHeight: 40,
+ borderRadius: 20,
+ padding: theme.spacing(0, 2),
+ }),
+ ...(ownerState.size === 'large' && {
+ height: 48,
+ minHeight: 48,
+ borderRadius: 24,
+ padding: theme.spacing(0, 2),
+ }),
+ }),
+ };
+
+ return [defaultStyle, ...colorStyle, disabledState, size];
+ };
+
+ return {
+ MuiFab: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/list.js b/template/src/theme/overrides/components/list.js
new file mode 100644
index 0000000..9808046
--- /dev/null
+++ b/template/src/theme/overrides/components/list.js
@@ -0,0 +1,33 @@
+// ----------------------------------------------------------------------
+
+export function list(theme) {
+ return {
+ MuiListItemIcon: {
+ styleOverrides: {
+ root: {
+ color: 'inherit',
+ minWidth: 'auto',
+ marginRight: theme.spacing(2),
+ },
+ },
+ },
+ MuiListItemAvatar: {
+ styleOverrides: {
+ root: {
+ minWidth: 'auto',
+ marginRight: theme.spacing(2),
+ },
+ },
+ },
+ MuiListItemText: {
+ styleOverrides: {
+ root: {
+ margin: 0,
+ },
+ multiline: {
+ margin: 0,
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/loading-button.js b/template/src/theme/overrides/components/loading-button.js
new file mode 100644
index 0000000..843320f
--- /dev/null
+++ b/template/src/theme/overrides/components/loading-button.js
@@ -0,0 +1,30 @@
+import { loadingButtonClasses } from '@mui/lab/LoadingButton';
+
+// ----------------------------------------------------------------------
+
+export function loadingButton(theme) {
+ return {
+ MuiLoadingButton: {
+ styleOverrides: {
+ root: ({ ownerState }) => ({
+ ...(ownerState.variant === 'soft' && {
+ [`& .${loadingButtonClasses.loadingIndicatorStart}`]: {
+ left: 10,
+ },
+ [`& .${loadingButtonClasses.loadingIndicatorEnd}`]: {
+ right: 14,
+ },
+ ...(ownerState.size === 'small' && {
+ [`& .${loadingButtonClasses.loadingIndicatorStart}`]: {
+ left: 10,
+ },
+ [`& .${loadingButtonClasses.loadingIndicatorEnd}`]: {
+ right: 10,
+ },
+ }),
+ }),
+ }),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/menu.js b/template/src/theme/overrides/components/menu.js
new file mode 100644
index 0000000..cd7f6ef
--- /dev/null
+++ b/template/src/theme/overrides/components/menu.js
@@ -0,0 +1,15 @@
+import { menuItem } from '../../css';
+
+// ----------------------------------------------------------------------
+
+export function menu(theme) {
+ return {
+ MuiMenuItem: {
+ styleOverrides: {
+ root: {
+ ...menuItem(theme),
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/pagination.js b/template/src/theme/overrides/components/pagination.js
new file mode 100644
index 0000000..028ed11
--- /dev/null
+++ b/template/src/theme/overrides/components/pagination.js
@@ -0,0 +1,77 @@
+import { alpha } from '@mui/material/styles';
+import { paginationItemClasses } from '@mui/material/PaginationItem';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export function pagination(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ const rootStyles = (ownerState) => {
+ const defaultColor = ownerState.color === 'standard';
+
+ const filledVariant = ownerState.variant === 'text';
+
+ const outlinedVariant = ownerState.variant === 'outlined';
+
+ const softVariant = ownerState.variant === 'soft';
+
+ const defaultStyle = {
+ [`& .${paginationItemClasses.root}`]: {
+ ...(outlinedVariant && {
+ borderColor: alpha(theme.palette.grey[500], 0.24),
+ }),
+
+ [`&.${paginationItemClasses.selected}`]: {
+ fontWeight: theme.typography.fontWeightSemiBold,
+ ...(outlinedVariant && {
+ borderColor: 'currentColor',
+ }),
+
+ ...(defaultColor && {
+ backgroundColor: alpha(theme.palette.grey[500], 0.08),
+ ...(filledVariant && {
+ color: lightMode ? theme.palette.common.white : theme.palette.grey[800],
+ backgroundColor: theme.palette.text.primary,
+ '&:hover': {
+ backgroundColor: lightMode ? theme.palette.grey[700] : theme.palette.grey[100],
+ },
+ }),
+ }),
+ },
+ },
+ };
+
+ const colorStyle = COLORS.map((color) => ({
+ ...(ownerState.color === color && {
+ [`& .${paginationItemClasses.root}`]: {
+ [`&.${paginationItemClasses.selected}`]: {
+ ...(ownerState.color === color && {
+ // SOFT
+ ...(softVariant && {
+ color: theme.palette[color][lightMode ? 'dark' : 'light'],
+ backgroundColor: alpha(theme.palette[color].main, 0.08),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette[color].main, 0.16),
+ },
+ }),
+ }),
+ },
+ },
+ }),
+ }));
+
+ return [defaultStyle, ...colorStyle];
+ };
+
+ return {
+ MuiPagination: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/paper.js b/template/src/theme/overrides/components/paper.js
new file mode 100644
index 0000000..2c6afd5
--- /dev/null
+++ b/template/src/theme/overrides/components/paper.js
@@ -0,0 +1,18 @@
+import { alpha } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+export function paper(theme) {
+ return {
+ MuiPaper: {
+ styleOverrides: {
+ root: {
+ backgroundImage: 'none',
+ },
+ outlined: {
+ borderColor: alpha(theme.palette.grey[500], 0.16),
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/popover.js b/template/src/theme/overrides/components/popover.js
new file mode 100644
index 0000000..4fdded9
--- /dev/null
+++ b/template/src/theme/overrides/components/popover.js
@@ -0,0 +1,21 @@
+import { listClasses } from '@mui/material/List';
+
+import { paper } from '../../css';
+
+// ----------------------------------------------------------------------
+
+export function popover(theme) {
+ return {
+ MuiPopover: {
+ styleOverrides: {
+ paper: {
+ ...paper({ theme, dropdown: true }),
+ [`& .${listClasses.root}`]: {
+ paddingTop: 0,
+ paddingBottom: 0,
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/progress.js b/template/src/theme/overrides/components/progress.js
new file mode 100644
index 0000000..8cb9c79
--- /dev/null
+++ b/template/src/theme/overrides/components/progress.js
@@ -0,0 +1,40 @@
+import { alpha } from '@mui/material/styles';
+import { linearProgressClasses } from '@mui/material/LinearProgress';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export function progress(theme) {
+ const rootStyles = (ownerState) => {
+ const bufferVariant = ownerState.variant === 'buffer';
+
+ const defaultStyle = {
+ borderRadius: 4,
+ [`& .${linearProgressClasses.bar}`]: {
+ borderRadius: 4,
+ },
+ ...(bufferVariant && {
+ backgroundColor: 'transparent',
+ }),
+ };
+
+ const colorStyle = COLORS.map((color) => ({
+ ...(ownerState.color === color && {
+ backgroundColor: alpha(theme.palette[color].main, 0.24),
+ }),
+ }));
+
+ return [defaultStyle, ...colorStyle];
+ };
+
+ return {
+ MuiLinearProgress: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/radio.js b/template/src/theme/overrides/components/radio.js
new file mode 100644
index 0000000..1ec1066
--- /dev/null
+++ b/template/src/theme/overrides/components/radio.js
@@ -0,0 +1,35 @@
+import { radioClasses } from '@mui/material/Radio';
+
+// ----------------------------------------------------------------------
+
+export function radio(theme) {
+ return {
+ // CHECKBOX, RADIO, SWITCH
+ MuiFormControlLabel: {
+ styleOverrides: {
+ label: {
+ ...theme.typography.body2,
+ },
+ },
+ },
+ MuiRadio: {
+ styleOverrides: {
+ root: ({ ownerState }) => {
+ const { color } = ownerState;
+
+ return {
+ padding: theme.spacing(1),
+ ...(color === 'default' && {
+ [`&.${radioClasses.checked}`]: {
+ color: theme.palette.text.primary,
+ },
+ }),
+ [`&.${radioClasses.disabled}`]: {
+ color: theme.palette.action.disabled,
+ },
+ };
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/rating.js b/template/src/theme/overrides/components/rating.js
new file mode 100644
index 0000000..d44cfc2
--- /dev/null
+++ b/template/src/theme/overrides/components/rating.js
@@ -0,0 +1,40 @@
+import { alpha } from '@mui/material/styles';
+import { ratingClasses } from '@mui/material/Rating';
+import { svgIconClasses } from '@mui/material/SvgIcon';
+
+// ----------------------------------------------------------------------
+
+export function rating(theme) {
+ return {
+ MuiRating: {
+ styleOverrides: {
+ root: {
+ [`&.${ratingClasses.disabled}`]: {
+ opacity: 0.48,
+ },
+ },
+ iconEmpty: {
+ color: alpha(theme.palette.grey[500], 0.48),
+ },
+ sizeSmall: {
+ [`& .${svgIconClasses.root}`]: {
+ width: 20,
+ height: 20,
+ },
+ },
+ sizeMedium: {
+ [`& .${svgIconClasses.root}`]: {
+ width: 24,
+ height: 24,
+ },
+ },
+ sizeLarge: {
+ [`& .${svgIconClasses.root}`]: {
+ width: 28,
+ height: 28,
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/select.js b/template/src/theme/overrides/components/select.js
new file mode 100644
index 0000000..efb361e
--- /dev/null
+++ b/template/src/theme/overrides/components/select.js
@@ -0,0 +1,26 @@
+// ----------------------------------------------------------------------
+
+export function select(theme) {
+ return {
+ MuiSelect: {
+ styleOverrides: {
+ icon: {
+ right: 10,
+ width: 18,
+ height: 18,
+ top: 'calc(50% - 9px)',
+ },
+ },
+ },
+ MuiNativeSelect: {
+ styleOverrides: {
+ icon: {
+ right: 10,
+ width: 18,
+ height: 18,
+ top: 'calc(50% - 9px)',
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/skeleton.js b/template/src/theme/overrides/components/skeleton.js
new file mode 100644
index 0000000..687c1a8
--- /dev/null
+++ b/template/src/theme/overrides/components/skeleton.js
@@ -0,0 +1,16 @@
+// ----------------------------------------------------------------------
+
+export function skeleton(theme) {
+ return {
+ MuiSkeleton: {
+ styleOverrides: {
+ root: {
+ backgroundColor: theme.palette.background.neutral,
+ },
+ rounded: {
+ borderRadius: theme.shape.borderRadius * 2,
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/slider.js b/template/src/theme/overrides/components/slider.js
new file mode 100644
index 0000000..ee3aff1
--- /dev/null
+++ b/template/src/theme/overrides/components/slider.js
@@ -0,0 +1,30 @@
+import { sliderClasses } from '@mui/material/Slider';
+
+// ----------------------------------------------------------------------
+
+export function slider(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ return {
+ MuiSlider: {
+ styleOverrides: {
+ root: {
+ [`&.${sliderClasses.disabled}`]: {
+ color: theme.palette.action.disabled,
+ },
+ },
+ rail: {
+ opacity: 0.32,
+ },
+ markLabel: {
+ fontSize: 13,
+ color: theme.palette.text.disabled,
+ },
+ valueLabel: {
+ borderRadius: 8,
+ backgroundColor: theme.palette.grey[lightMode ? 800 : 700],
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/stepper.js b/template/src/theme/overrides/components/stepper.js
new file mode 100644
index 0000000..40d419c
--- /dev/null
+++ b/template/src/theme/overrides/components/stepper.js
@@ -0,0 +1,13 @@
+// ----------------------------------------------------------------------
+
+export function stepper(theme) {
+ return {
+ MuiStepConnector: {
+ styleOverrides: {
+ line: {
+ borderColor: theme.palette.divider,
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/svg-icon.js b/template/src/theme/overrides/components/svg-icon.js
new file mode 100644
index 0000000..5d525e4
--- /dev/null
+++ b/template/src/theme/overrides/components/svg-icon.js
@@ -0,0 +1,15 @@
+// ----------------------------------------------------------------------
+
+export function svgIcon(theme) {
+ return {
+ MuiSvgIcon: {
+ styleOverrides: {
+ fontSizeLarge: {
+ width: 32,
+ height: 32,
+ fontSize: 'inherit',
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/switch.js b/template/src/theme/overrides/components/switch.js
new file mode 100644
index 0000000..9f5fd9d
--- /dev/null
+++ b/template/src/theme/overrides/components/switch.js
@@ -0,0 +1,80 @@
+import { alpha } from '@mui/material/styles';
+import { switchClasses } from '@mui/material/Switch';
+
+// ----------------------------------------------------------------------
+
+export function switches(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ const rootStyles = (ownerState) => {
+ const { color } = ownerState;
+
+ return {
+ width: 58,
+ height: 38,
+ padding: '9px 13px 9px 12px',
+ [`& .${switchClasses.thumb}`]: {
+ width: 14,
+ height: 14,
+ boxShadow: 'none',
+ color: theme.palette.common.white,
+ },
+ [`& .${switchClasses.track}`]: {
+ opacity: 1,
+ borderRadius: 14,
+ backgroundColor: alpha(theme.palette.grey[500], 0.48),
+ },
+ [`& .${switchClasses.switchBase}`]: {
+ left: 3,
+ padding: 12,
+ [`&.${switchClasses.checked}`]: {
+ transform: 'translateX(13px)',
+ [`& .${switchClasses.thumb}`]: {
+ ...(color === 'default' &&
+ !lightMode && {
+ color: theme.palette.grey[800],
+ }),
+ },
+ [`&+.${switchClasses.track}`]: {
+ opacity: 1,
+ ...(color === 'default' && {
+ backgroundColor: theme.palette.text.primary,
+ }),
+ },
+ },
+ [`&.${switchClasses.disabled}`]: {
+ [`& .${switchClasses.thumb}`]: {
+ opacity: lightMode ? 1 : 0.48,
+ },
+ [`&+.${switchClasses.track}`]: {
+ opacity: 0.48,
+ },
+ },
+ },
+ // Small
+ [`&.${switchClasses.sizeSmall}`]: {
+ padding: '4px 8px 4px 7px',
+ width: 40,
+ height: 24,
+ [`& .${switchClasses.thumb}`]: {
+ width: 10,
+ height: 10,
+ },
+ [`& .${switchClasses.switchBase}`]: {
+ padding: 7,
+ [`&.${switchClasses.checked}`]: {
+ transform: 'translateX(9px)',
+ },
+ },
+ },
+ };
+ };
+
+ return {
+ MuiSwitch: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/table.js b/template/src/theme/overrides/components/table.js
new file mode 100644
index 0000000..5381dbc
--- /dev/null
+++ b/template/src/theme/overrides/components/table.js
@@ -0,0 +1,79 @@
+import { alpha } from '@mui/material/styles';
+import { tableRowClasses } from '@mui/material/TableRow';
+import { tableCellClasses } from '@mui/material/TableCell';
+
+// ----------------------------------------------------------------------
+
+export function table(theme) {
+ return {
+ MuiTableContainer: {
+ styleOverrides: {
+ root: {
+ position: 'relative',
+ },
+ },
+ },
+ MuiTableRow: {
+ styleOverrides: {
+ root: {
+ [`&.${tableRowClasses.selected}`]: {
+ backgroundColor: alpha(theme.palette.primary.dark, 0.04),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.primary.dark, 0.08),
+ },
+ },
+ '&:last-of-type': {
+ [`& .${tableCellClasses.root}`]: {
+ borderColor: 'transparent',
+ },
+ },
+ },
+ },
+ },
+ MuiTableCell: {
+ styleOverrides: {
+ root: {
+ borderBottomStyle: 'dashed',
+ },
+ head: {
+ fontSize: 14,
+ color: theme.palette.text.secondary,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ backgroundColor: theme.palette.background.neutral,
+ },
+ stickyHeader: {
+ backgroundColor: theme.palette.background.paper,
+ backgroundImage: `linear-gradient(to bottom, ${theme.palette.background.neutral} 0%, ${theme.palette.background.neutral} 100%)`,
+ },
+ paddingCheckbox: {
+ paddingLeft: theme.spacing(1),
+ },
+ },
+ },
+ MuiTablePagination: {
+ styleOverrides: {
+ root: {
+ width: '100%',
+ },
+ toolbar: {
+ height: 64,
+ },
+ actions: {
+ marginRight: 8,
+ },
+ select: {
+ paddingLeft: 8,
+ '&:focus': {
+ borderRadius: theme.shape.borderRadius,
+ },
+ },
+ selectIcon: {
+ right: 4,
+ width: 16,
+ height: 16,
+ top: 'calc(50% - 8px)',
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/tabs.js b/template/src/theme/overrides/components/tabs.js
new file mode 100644
index 0000000..44da5a6
--- /dev/null
+++ b/template/src/theme/overrides/components/tabs.js
@@ -0,0 +1,39 @@
+import { tabClasses } from '@mui/material/Tab';
+
+// ----------------------------------------------------------------------
+
+export function tabs(theme) {
+ return {
+ MuiTabs: {
+ styleOverrides: {
+ indicator: {
+ backgroundColor: theme.palette.text.primary,
+ },
+ scrollButtons: {
+ width: 48,
+ borderRadius: '50%',
+ },
+ },
+ },
+ MuiTab: {
+ styleOverrides: {
+ root: {
+ padding: 0,
+ opacity: 1,
+ minWidth: 48,
+ minHeight: 48,
+ fontWeight: theme.typography.fontWeightSemiBold,
+ '&:not(:last-of-type)': {
+ marginRight: theme.spacing(3),
+ [theme.breakpoints.up('sm')]: {
+ marginRight: theme.spacing(5),
+ },
+ },
+ [`&:not(.${tabClasses.selected})`]: {
+ color: theme.palette.text.secondary,
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/textfield.js b/template/src/theme/overrides/components/textfield.js
new file mode 100644
index 0000000..a9d85ec
--- /dev/null
+++ b/template/src/theme/overrides/components/textfield.js
@@ -0,0 +1,146 @@
+import { alpha } from '@mui/material/styles';
+import { inputBaseClasses } from '@mui/material/InputBase';
+import { inputLabelClasses } from '@mui/material/InputLabel';
+import { filledInputClasses } from '@mui/material/FilledInput';
+import { outlinedInputClasses } from '@mui/material/OutlinedInput';
+
+// ----------------------------------------------------------------------
+
+export function textField(theme) {
+ const color = {
+ focused: theme.palette.text.primary,
+ active: theme.palette.text.secondary,
+ placeholder: theme.palette.text.disabled,
+ };
+
+ const font = {
+ label: theme.typography.body1,
+ value: theme.typography.body2,
+ };
+
+ return {
+ // HELPER
+ MuiFormHelperText: {
+ styleOverrides: {
+ root: {
+ marginTop: theme.spacing(1),
+ },
+ },
+ },
+
+ // LABEL
+ MuiFormLabel: {
+ styleOverrides: {
+ root: {
+ ...font.value,
+ color: color.placeholder,
+ [`&.${inputLabelClasses.shrink}`]: {
+ ...font.label,
+ fontWeight: 600,
+ color: color.active,
+ [`&.${inputLabelClasses.focused}`]: {
+ color: color.focused,
+ },
+ [`&.${inputLabelClasses.error}`]: {
+ color: theme.palette.error.main,
+ },
+ [`&.${inputLabelClasses.disabled}`]: {
+ color: theme.palette.text.disabled,
+ },
+ [`&.${inputLabelClasses.filled}`]: {
+ transform: 'translate(12px, 6px) scale(0.75)',
+ },
+ },
+ },
+ },
+ },
+
+ // BASE
+ MuiInputBase: {
+ styleOverrides: {
+ root: {
+ [`&.${inputBaseClasses.disabled}`]: {
+ '& svg': {
+ color: theme.palette.text.disabled,
+ },
+ },
+ },
+ input: {
+ ...font.value,
+ '&::placeholder': {
+ opacity: 1,
+ color: color.placeholder,
+ },
+ },
+ },
+ },
+
+ // STANDARD
+ MuiInput: {
+ styleOverrides: {
+ underline: {
+ '&:before': {
+ borderBottomColor: alpha(theme.palette.grey[500], 0.32),
+ },
+ '&:after': {
+ borderBottomColor: color.focused,
+ },
+ },
+ },
+ },
+
+ // OUTLINED
+ MuiOutlinedInput: {
+ styleOverrides: {
+ root: {
+ [`&.${outlinedInputClasses.focused}`]: {
+ [`& .${outlinedInputClasses.notchedOutline}`]: {
+ borderColor: color.focused,
+ },
+ },
+ [`&.${outlinedInputClasses.error}`]: {
+ [`& .${outlinedInputClasses.notchedOutline}`]: {
+ borderColor: theme.palette.error.main,
+ },
+ },
+ [`&.${outlinedInputClasses.disabled}`]: {
+ [`& .${outlinedInputClasses.notchedOutline}`]: {
+ borderColor: theme.palette.action.disabledBackground,
+ },
+ },
+ },
+ notchedOutline: {
+ borderColor: alpha(theme.palette.grey[500], 0.2),
+ transition: theme.transitions.create(['border-color'], {
+ duration: theme.transitions.duration.shortest,
+ }),
+ },
+ },
+ },
+
+ // FILLED
+ MuiFilledInput: {
+ styleOverrides: {
+ root: {
+ borderRadius: theme.shape.borderRadius,
+ backgroundColor: alpha(theme.palette.grey[500], 0.08),
+ '&:hover': {
+ backgroundColor: alpha(theme.palette.grey[500], 0.16),
+ },
+ [`&.${filledInputClasses.focused}`]: {
+ backgroundColor: alpha(theme.palette.grey[500], 0.16),
+ },
+ [`&.${filledInputClasses.error}`]: {
+ backgroundColor: alpha(theme.palette.error.main, 0.08),
+ [`&.${filledInputClasses.focused}`]: {
+ backgroundColor: alpha(theme.palette.error.main, 0.16),
+ },
+ },
+ [`&.${filledInputClasses.disabled}`]: {
+ backgroundColor: theme.palette.action.disabledBackground,
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/timeline.js b/template/src/theme/overrides/components/timeline.js
new file mode 100644
index 0000000..0518848
--- /dev/null
+++ b/template/src/theme/overrides/components/timeline.js
@@ -0,0 +1,20 @@
+// ----------------------------------------------------------------------
+
+export function timeline(theme) {
+ return {
+ MuiTimelineDot: {
+ styleOverrides: {
+ root: {
+ boxShadow: 'none',
+ },
+ },
+ },
+ MuiTimelineConnector: {
+ styleOverrides: {
+ root: {
+ backgroundColor: theme.palette.divider,
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/toggle-button.js b/template/src/theme/overrides/components/toggle-button.js
new file mode 100644
index 0000000..e318cce
--- /dev/null
+++ b/template/src/theme/overrides/components/toggle-button.js
@@ -0,0 +1,67 @@
+import { alpha } from '@mui/material/styles';
+import { toggleButtonClasses } from '@mui/material/ToggleButton';
+
+// ----------------------------------------------------------------------
+
+const COLORS = ['primary', 'secondary', 'info', 'success', 'warning', 'error'];
+
+// ----------------------------------------------------------------------
+
+export function toggleButton(theme) {
+ const rootStyles = (ownerState) => {
+ const defaultStyle = {
+ [`&.${toggleButtonClasses.selected}`]: {
+ borderColor: 'currentColor',
+ boxShadow: '0 0 0 0.5px currentColor',
+ },
+ };
+
+ const colorStyle = COLORS.map((color) => ({
+ ...(ownerState.color === color && {
+ '&:hover': {
+ borderColor: alpha(theme.palette[color].main, 0.48),
+ backgroundColor: alpha(theme.palette[color].main, theme.palette.action.hoverOpacity),
+ },
+ }),
+ }));
+
+ const disabledState = {
+ [`&.${toggleButtonClasses.disabled}`]: {
+ [`&.${toggleButtonClasses.selected}`]: {
+ color: theme.palette.action.disabled,
+ backgroundColor: theme.palette.action.selected,
+ borderColor: theme.palette.action.disabledBackground,
+ },
+ },
+ };
+
+ return [defaultStyle, ...colorStyle, disabledState];
+ };
+
+ return {
+ MuiToggleButton: {
+ styleOverrides: {
+ root: ({ ownerState }) => rootStyles(ownerState),
+ },
+ },
+ MuiToggleButtonGroup: {
+ styleOverrides: {
+ root: {
+ borderRadius: theme.shape.borderRadius,
+ backgroundColor: theme.palette.background.paper,
+ border: `solid 1px ${alpha(theme.palette.grey[500], 0.08)}`,
+ },
+ grouped: {
+ margin: 4,
+ [`&.${toggleButtonClasses.selected}`]: {
+ boxShadow: 'none',
+ },
+ '&:not(:first-of-type), &:not(:last-of-type)': {
+ borderRadius: theme.shape.borderRadius,
+ borderColor: 'transparent',
+ },
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/tooltip.js b/template/src/theme/overrides/components/tooltip.js
new file mode 100644
index 0000000..af00c57
--- /dev/null
+++ b/template/src/theme/overrides/components/tooltip.js
@@ -0,0 +1,18 @@
+// ----------------------------------------------------------------------
+
+export function tooltip(theme) {
+ const lightMode = theme.palette.mode === 'light';
+
+ return {
+ MuiTooltip: {
+ styleOverrides: {
+ tooltip: {
+ backgroundColor: theme.palette.grey[lightMode ? 800 : 700],
+ },
+ arrow: {
+ color: theme.palette.grey[lightMode ? 800 : 700],
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/tree-view.js b/template/src/theme/overrides/components/tree-view.js
new file mode 100644
index 0000000..0ce0893
--- /dev/null
+++ b/template/src/theme/overrides/components/tree-view.js
@@ -0,0 +1,16 @@
+// ----------------------------------------------------------------------
+
+export function treeView(theme) {
+ return {
+ MuiTreeItem: {
+ styleOverrides: {
+ label: {
+ ...theme.typography.body2,
+ },
+ iconContainer: {
+ width: 'auto',
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/components/typography.js b/template/src/theme/overrides/components/typography.js
new file mode 100644
index 0000000..0faea20
--- /dev/null
+++ b/template/src/theme/overrides/components/typography.js
@@ -0,0 +1,16 @@
+// ----------------------------------------------------------------------
+
+export function typography(theme) {
+ return {
+ MuiTypography: {
+ styleOverrides: {
+ paragraph: {
+ marginBottom: theme.spacing(2),
+ },
+ gutterBottom: {
+ marginBottom: theme.spacing(1),
+ },
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/default-props.jsx b/template/src/theme/overrides/default-props.jsx
new file mode 100644
index 0000000..6ddcfe6
--- /dev/null
+++ b/template/src/theme/overrides/default-props.jsx
@@ -0,0 +1,250 @@
+import SvgIcon from '@mui/material/SvgIcon';
+
+import Iconify from 'src/components/iconify';
+
+// ----------------------------------------------------------------------
+
+const ArrowDownIcon = (props) => (
+
+
+
+);
+
+const CheckboxIcon = (props) => (
+
+
+
+);
+
+const CheckboxCheckedIcon = (props) => (
+
+
+
+);
+
+const CheckboxIndeterminateIcon = (props) => (
+
+
+
+);
+
+const RadioIcon = (props) => (
+
+
+
+);
+
+const RadioCheckedIcon = (props) => (
+
+
+
+);
+
+const RatingIcon = (props) => (
+
+
+
+);
+
+const TreeViewCollapseIcon = (props) => (
+
+
+
+);
+
+const TreeViewExpandIcon = (props) => (
+
+
+
+);
+
+const TreeViewEndIcon = (props) => (
+
+
+
+);
+
+// ----------------------------------------------------------------------
+
+export function defaultProps(theme) {
+ return {
+ MuiAlert: {
+ defaultProps: {
+ iconMapping: {
+ error: ,
+ info: ,
+ success: ,
+ warning: ,
+ },
+ },
+ },
+ MuiStack: {
+ defaultProps: {
+ useFlexGap: true,
+ },
+ },
+ MuiAppBar: {
+ defaultProps: {
+ color: 'transparent',
+ },
+ },
+ MuiAvatarGroup: {
+ defaultProps: {
+ max: 4,
+ },
+ },
+ MuiButtonGroup: {
+ defaultProps: {
+ disableElevation: true,
+ },
+ },
+ MuiButton: {
+ defaultProps: {
+ color: 'inherit',
+ disableElevation: true,
+ },
+ },
+ MuiCardHeader: {
+ defaultProps: {
+ titleTypographyProps: { variant: 'h6' },
+ subheaderTypographyProps: {
+ variant: 'body2',
+ marginTop: theme.spacing(0.5),
+ },
+ },
+ },
+ MuiChip: {
+ defaultProps: {
+ deleteIcon: ,
+ },
+ },
+ MuiDialogActions: {
+ defaultProps: {
+ disableSpacing: true,
+ },
+ },
+ MuiFab: {
+ defaultProps: {
+ color: 'primary',
+ },
+ },
+ MuiLink: {
+ defaultProps: {
+ underline: 'hover',
+ },
+ },
+ MuiListItemText: {
+ defaultProps: {
+ primaryTypographyProps: {
+ typography: 'subtitle2',
+ },
+ secondaryTypographyProps: {
+ component: 'span',
+ },
+ },
+ },
+ MuiPaper: {
+ defaultProps: {
+ elevation: 0,
+ },
+ },
+ MuiSkeleton: {
+ defaultProps: {
+ animation: 'wave',
+ variant: 'rounded',
+ },
+ },
+ MuiFilledInput: {
+ defaultProps: {
+ disableUnderline: true,
+ },
+ },
+ MuiFormHelperText: {
+ defaultProps: {
+ component: 'div',
+ },
+ },
+ MuiTab: {
+ defaultProps: {
+ disableRipple: true,
+ iconPosition: 'start',
+ },
+ },
+ MuiTabs: {
+ defaultProps: {
+ textColor: 'inherit',
+ variant: 'scrollable',
+ allowScrollButtonsMobile: true,
+ },
+ },
+ MuiTablePagination: {
+ defaultProps: {
+ backIconButtonProps: {
+ size: 'small',
+ },
+ nextIconButtonProps: {
+ size: 'small',
+ },
+ },
+ },
+ MuiSlider: {
+ defaultProps: {
+ size: 'small',
+ },
+ },
+ MuiAutocomplete: {
+ defaultProps: {
+ popupIcon: ,
+ },
+ },
+ MuiSelect: {
+ defaultProps: {
+ IconComponent: ArrowDownIcon,
+ },
+ },
+ MuiNativeSelect: {
+ defaultProps: {
+ IconComponent: ArrowDownIcon,
+ },
+ },
+ MuiCheckbox: {
+ defaultProps: {
+ size: 'small',
+ icon: ,
+ checkedIcon: ,
+ indeterminateIcon: ,
+ },
+ },
+ MuiRadio: {
+ defaultProps: {
+ size: 'small',
+ icon: ,
+ checkedIcon: ,
+ },
+ },
+ MuiRating: {
+ defaultProps: {
+ emptyIcon: ,
+ icon: ,
+ },
+ },
+ MuiTreeView: {
+ defaultProps: {
+ defaultCollapseIcon: ,
+ defaultExpandIcon: ,
+ defaultEndIcon: ,
+ },
+ },
+ // Zone
+ MuiFormControl: {
+ defaultProps: {
+ variant: 'filled',
+ },
+ },
+ MuiTextField: {
+ defaultProps: {
+ variant: 'filled',
+ },
+ },
+ };
+}
diff --git a/template/src/theme/overrides/index.js b/template/src/theme/overrides/index.js
new file mode 100644
index 0000000..7ea2fd7
--- /dev/null
+++ b/template/src/theme/overrides/index.js
@@ -0,0 +1,98 @@
+import merge from 'lodash.merge';
+
+import { fab } from './components/fab';
+import { menu } from './components/menu';
+import { chip } from './components/chip';
+import { card } from './components/card';
+import { tabs } from './components/tabs';
+import { list } from './components/list';
+import { radio } from './components/radio';
+import { badge } from './components/badge';
+import { table } from './components/table';
+import { alert } from './components/alert';
+import { paper } from './components/paper';
+import { select } from './components/select';
+import { slider } from './components/slider';
+import { avatar } from './components/avatar';
+import { drawer } from './components/drawer';
+import { appBar } from './components/appbar';
+import { dialog } from './components/dialog';
+import { rating } from './components/rating';
+import { button } from './components/button';
+import { popover } from './components/popover';
+import { switches } from './components/switch';
+import { defaultProps } from './default-props';
+import { tooltip } from './components/tooltip';
+import { stepper } from './components/stepper';
+import { svgIcon } from './components/svg-icon';
+import { timeline } from './components/timeline';
+import { backdrop } from './components/backdrop';
+import { skeleton } from './components/skeleton';
+import { progress } from './components/progress';
+import { checkbox } from './components/checkbox';
+import { dataGrid } from './components/data-grid';
+import { treeView } from './components/tree-view';
+import { textField } from './components/textfield';
+import { accordion } from './components/accordion';
+import { typography } from './components/typography';
+import { pagination } from './components/pagination';
+import { datePicker } from './components/date-picker';
+import { breadcrumbs } from './components/breadcrumbs';
+import { cssBaseline } from './components/css-baseline';
+import { buttonGroup } from './components/button-group';
+import { autocomplete } from './components/autocomplete';
+import { toggleButton } from './components/toggle-button';
+import { loadingButton } from './components/loading-button';
+
+// ----------------------------------------------------------------------
+
+export function componentsOverrides(theme) {
+ const components = merge(
+ defaultProps(theme),
+ //
+ fab(theme),
+ tabs(theme),
+ chip(theme),
+ card(theme),
+ menu(theme),
+ list(theme),
+ badge(theme),
+ table(theme),
+ paper(theme),
+ alert(theme),
+ radio(theme),
+ select(theme),
+ button(theme),
+ rating(theme),
+ dialog(theme),
+ appBar(theme),
+ avatar(theme),
+ slider(theme),
+ drawer(theme),
+ stepper(theme),
+ tooltip(theme),
+ popover(theme),
+ svgIcon(theme),
+ switches(theme),
+ checkbox(theme),
+ dataGrid(theme),
+ skeleton(theme),
+ timeline(theme),
+ treeView(theme),
+ backdrop(theme),
+ progress(theme),
+ textField(theme),
+ accordion(theme),
+ typography(theme),
+ pagination(theme),
+ datePicker(theme),
+ buttonGroup(theme),
+ breadcrumbs(theme),
+ cssBaseline(theme),
+ autocomplete(theme),
+ toggleButton(theme),
+ loadingButton(theme)
+ );
+
+ return components;
+}
diff --git a/template/src/theme/palette.js b/template/src/theme/palette.js
new file mode 100644
index 0000000..6005cd9
--- /dev/null
+++ b/template/src/theme/palette.js
@@ -0,0 +1,144 @@
+import { alpha } from '@mui/material/styles';
+
+// ----------------------------------------------------------------------
+
+// SETUP COLORS
+
+export const grey = {
+ 0: '#FFFFFF',
+ 100: '#F9FAFB',
+ 200: '#F4F6F8',
+ 300: '#DFE3E8',
+ 400: '#C4CDD5',
+ 500: '#919EAB',
+ 600: '#637381',
+ 700: '#454F5B',
+ 800: '#212B36',
+ 900: '#161C24',
+};
+
+export const primary = {
+ lighter: '#FEE9D1',
+ light: '#FDAB76',
+ main: '#FA541C',
+ dark: '#B3200E',
+ darker: '#770508',
+ contrastText: '#FFFFFF',
+};
+
+export const secondary = {
+ lighter: '#E6DBFE',
+ light: '#B195FE',
+ main: '#754FFE',
+ dark: '#4027B6',
+ darker: '#1C0F79',
+ contrastText: '#FFFFFF',
+};
+
+export const info = {
+ lighter: '#CAFDF5',
+ light: '#61F3F3',
+ main: '#00B8D9',
+ dark: '#006C9C',
+ darker: '#003768',
+ contrastText: '#FFFFFF',
+};
+
+export const success = {
+ lighter: '#D8FBDE',
+ light: '#86E8AB',
+ main: '#36B37E',
+ dark: '#1B806A',
+ darker: '#0A5554',
+ contrastText: '#FFFFFF',
+};
+
+export const warning = {
+ lighter: '#FFF5CC',
+ light: '#FFD666',
+ main: '#FFAB00',
+ dark: '#B76E00',
+ darker: '#7A4100',
+ contrastText: grey[800],
+};
+
+export const error = {
+ lighter: '#FFE9D5',
+ light: '#FFAC82',
+ main: '#FF5630',
+ dark: '#B71D18',
+ darker: '#7A0916',
+ contrastText: '#FFFFFF',
+};
+
+export const common = {
+ black: '#000000',
+ white: '#FFFFFF',
+};
+
+export const action = {
+ hover: alpha(grey[500], 0.08),
+ selected: alpha(grey[500], 0.16),
+ disabled: alpha(grey[500], 0.8),
+ disabledBackground: alpha(grey[500], 0.24),
+ focus: alpha(grey[500], 0.24),
+ hoverOpacity: 0.08,
+ disabledOpacity: 0.48,
+};
+
+const base = {
+ primary,
+ secondary,
+ info,
+ success,
+ warning,
+ error,
+ grey,
+ common,
+ divider: alpha(grey[500], 0.2),
+ action,
+};
+
+// ----------------------------------------------------------------------
+
+export function palette(mode) {
+ const light = {
+ ...base,
+ mode: 'light',
+ text: {
+ primary: grey[800],
+ secondary: grey[600],
+ disabled: grey[500],
+ },
+ background: {
+ paper: '#FFFFFF',
+ default: '#FFFFFF',
+ neutral: grey[200],
+ },
+ action: {
+ ...base.action,
+ active: grey[600],
+ },
+ };
+
+ const dark = {
+ ...base,
+ mode: 'dark',
+ text: {
+ primary: '#FFFFFF',
+ secondary: grey[500],
+ disabled: grey[600],
+ },
+ background: {
+ paper: grey[800],
+ default: grey[900],
+ neutral: alpha(grey[500], 0.12),
+ },
+ action: {
+ ...base.action,
+ active: grey[500],
+ },
+ };
+
+ return mode === 'light' ? light : dark;
+}
diff --git a/template/src/theme/shadows.js b/template/src/theme/shadows.js
new file mode 100644
index 0000000..070c378
--- /dev/null
+++ b/template/src/theme/shadows.js
@@ -0,0 +1,41 @@
+import { alpha } from '@mui/material/styles';
+
+import { grey, common } from './palette';
+
+// ----------------------------------------------------------------------
+
+export function shadows(mode) {
+ const color = mode === 'light' ? grey[500] : common.black;
+
+ const transparent1 = alpha(color, 0.2);
+ const transparent2 = alpha(color, 0.14);
+ const transparent3 = alpha(color, 0.12);
+
+ return [
+ 'none',
+ `0px 2px 1px -1px ${transparent1},0px 1px 1px 0px ${transparent2},0px 1px 3px 0px ${transparent3}`,
+ `0px 3px 1px -2px ${transparent1},0px 2px 2px 0px ${transparent2},0px 1px 5px 0px ${transparent3}`,
+ `0px 3px 3px -2px ${transparent1},0px 3px 4px 0px ${transparent2},0px 1px 8px 0px ${transparent3}`,
+ `0px 2px 4px -1px ${transparent1},0px 4px 5px 0px ${transparent2},0px 1px 10px 0px ${transparent3}`,
+ `0px 3px 5px -1px ${transparent1},0px 5px 8px 0px ${transparent2},0px 1px 14px 0px ${transparent3}`,
+ `0px 3px 5px -1px ${transparent1},0px 6px 10px 0px ${transparent2},0px 1px 18px 0px ${transparent3}`,
+ `0px 4px 5px -2px ${transparent1},0px 7px 10px 1px ${transparent2},0px 2px 16px 1px ${transparent3}`,
+ `0px 5px 5px -3px ${transparent1},0px 8px 10px 1px ${transparent2},0px 3px 14px 2px ${transparent3}`,
+ `0px 5px 6px -3px ${transparent1},0px 9px 12px 1px ${transparent2},0px 3px 16px 2px ${transparent3}`,
+ `0px 6px 6px -3px ${transparent1},0px 10px 14px 1px ${transparent2},0px 4px 18px 3px ${transparent3}`,
+ `0px 6px 7px -4px ${transparent1},0px 11px 15px 1px ${transparent2},0px 4px 20px 3px ${transparent3}`,
+ `0px 7px 8px -4px ${transparent1},0px 12px 17px 2px ${transparent2},0px 5px 22px 4px ${transparent3}`,
+ `0px 7px 8px -4px ${transparent1},0px 13px 19px 2px ${transparent2},0px 5px 24px 4px ${transparent3}`,
+ `0px 7px 9px -4px ${transparent1},0px 14px 21px 2px ${transparent2},0px 5px 26px 4px ${transparent3}`,
+ `0px 8px 9px -5px ${transparent1},0px 15px 22px 2px ${transparent2},0px 6px 28px 5px ${transparent3}`,
+ `0px 8px 10px -5px ${transparent1},0px 16px 24px 2px ${transparent2},0px 6px 30px 5px ${transparent3}`,
+ `0px 8px 11px -5px ${transparent1},0px 17px 26px 2px ${transparent2},0px 6px 32px 5px ${transparent3}`,
+ `0px 9px 11px -5px ${transparent1},0px 18px 28px 2px ${transparent2},0px 7px 34px 6px ${transparent3}`,
+ `0px 9px 12px -6px ${transparent1},0px 19px 29px 2px ${transparent2},0px 7px 36px 6px ${transparent3}`,
+ `0px 10px 13px -6px ${transparent1},0px 20px 31px 3px ${transparent2},0px 8px 38px 7px ${transparent3}`,
+ `0px 10px 13px -6px ${transparent1},0px 21px 33px 3px ${transparent2},0px 8px 40px 7px ${transparent3}`,
+ `0px 10px 14px -6px ${transparent1},0px 22px 35px 3px ${transparent2},0px 8px 42px 7px ${transparent3}`,
+ `0px 11px 14px -7px ${transparent1},0px 23px 36px 3px ${transparent2},0px 9px 44px 8px ${transparent3}`,
+ `0px 11px 15px -7px ${transparent1},0px 24px 38px 3px ${transparent2},0px 9px 46px 8px ${transparent3}`,
+ ];
+}
diff --git a/template/src/theme/typography.js b/template/src/theme/typography.js
new file mode 100644
index 0000000..160fe85
--- /dev/null
+++ b/template/src/theme/typography.js
@@ -0,0 +1,113 @@
+// ----------------------------------------------------------------------
+
+export function remToPx(value) {
+ return Math.round(parseFloat(value) * 16);
+}
+
+export function pxToRem(value) {
+ return `${value / 16}rem`;
+}
+
+export function responsiveFontSizes({ sm, md, lg }) {
+ return {
+ '@media (min-width:600px)': {
+ fontSize: pxToRem(sm),
+ },
+ '@media (min-width:900px)': {
+ fontSize: pxToRem(md),
+ },
+ '@media (min-width:1200px)': {
+ fontSize: pxToRem(lg),
+ },
+ };
+}
+
+export const primaryFont = 'Public Sans, sans-serif';
+export const secondaryFont = 'Barlow, sans-serif';
+
+// ----------------------------------------------------------------------
+
+export const typography = {
+ fontFamily: primaryFont,
+ fontSecondaryFamily: secondaryFont,
+ fontWeightRegular: 400,
+ fontWeightMedium: 500,
+ fontWeightSemiBold: 600,
+ fontWeightBold: 700,
+ h1: {
+ fontWeight: 700,
+ lineHeight: 80 / 64,
+ fontSize: pxToRem(40),
+ fontFamily: secondaryFont,
+ ...responsiveFontSizes({ sm: 52, md: 58, lg: 64 }),
+ },
+ h2: {
+ fontWeight: 700,
+ lineHeight: 64 / 48,
+ fontSize: pxToRem(32),
+ fontFamily: secondaryFont,
+ ...responsiveFontSizes({ sm: 40, md: 44, lg: 48 }),
+ },
+ h3: {
+ fontWeight: 700,
+ lineHeight: 1.5,
+ fontSize: pxToRem(24),
+ fontFamily: secondaryFont,
+ ...responsiveFontSizes({ sm: 26, md: 30, lg: 32 }),
+ },
+ h4: {
+ fontWeight: 600,
+ lineHeight: 1.5,
+ fontSize: pxToRem(20),
+ fontFamily: secondaryFont,
+ ...responsiveFontSizes({ sm: 20, md: 24, lg: 24 }),
+ },
+ h5: {
+ fontWeight: 600,
+ lineHeight: 1.5,
+ fontSize: pxToRem(18),
+ fontFamily: secondaryFont,
+ ...responsiveFontSizes({ sm: 19, md: 20, lg: 20 }),
+ },
+ h6: {
+ fontWeight: 600,
+ lineHeight: 28 / 18,
+ fontSize: pxToRem(17),
+ fontFamily: secondaryFont,
+ ...responsiveFontSizes({ sm: 18, md: 18, lg: 18 }),
+ },
+ subtitle1: {
+ fontWeight: 600,
+ lineHeight: 1.5,
+ fontSize: pxToRem(16),
+ },
+ subtitle2: {
+ fontWeight: 600,
+ lineHeight: 22 / 14,
+ fontSize: pxToRem(14),
+ },
+ body1: {
+ lineHeight: 1.5,
+ fontSize: pxToRem(16),
+ },
+ body2: {
+ lineHeight: 22 / 14,
+ fontSize: pxToRem(14),
+ },
+ caption: {
+ lineHeight: 1.5,
+ fontSize: pxToRem(12),
+ },
+ overline: {
+ fontWeight: 700,
+ lineHeight: 1.5,
+ fontSize: pxToRem(12),
+ textTransform: 'uppercase',
+ },
+ button: {
+ fontWeight: 700,
+ lineHeight: 24 / 14,
+ fontSize: pxToRem(14),
+ textTransform: 'capitalize',
+ },
+};
diff --git a/template/src/utils/format-number.js b/template/src/utils/format-number.js
new file mode 100644
index 0000000..42c1346
--- /dev/null
+++ b/template/src/utils/format-number.js
@@ -0,0 +1,104 @@
+/*
+ * Locales code
+ * https://gist.github.com/raushankrjha/d1c7e35cf87e69aa8b4208a8171a8416
+ */
+
+function getLocaleCode() {
+ return {
+ code: 'en-US',
+ currency: 'USD',
+ };
+}
+
+// ----------------------------------------------------------------------
+
+export function fNumber(inputValue) {
+ const { code } = getLocaleCode();
+
+ if (!inputValue) return '';
+
+ const number = Number(inputValue);
+
+ const fm = new Intl.NumberFormat(code, {
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 2,
+ }).format(number);
+
+ return fm;
+}
+
+// ----------------------------------------------------------------------
+
+export function fCurrency(inputValue) {
+ const { code, currency } = getLocaleCode();
+
+ if (!inputValue) return '';
+
+ const number = Number(inputValue);
+
+ const fm = new Intl.NumberFormat(code, {
+ style: 'currency',
+ currency,
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 2,
+ }).format(number);
+
+ return fm;
+}
+
+// ----------------------------------------------------------------------
+
+export function fPercent(inputValue) {
+ const { code } = getLocaleCode();
+
+ if (!inputValue) return '';
+
+ const number = Number(inputValue) / 100;
+
+ const fm = new Intl.NumberFormat(code, {
+ style: 'percent',
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 1,
+ }).format(number);
+
+ return fm;
+}
+
+// ----------------------------------------------------------------------
+
+export function fShortenNumber(inputValue) {
+ const { code } = getLocaleCode();
+
+ if (!inputValue) return '';
+
+ const number = Number(inputValue);
+
+ const fm = new Intl.NumberFormat(code, {
+ notation: 'compact',
+ maximumFractionDigits: 2,
+ }).format(number);
+
+ return fm.replace(/[A-Z]/g, (match) => match.toLowerCase());
+}
+
+// ----------------------------------------------------------------------
+
+export function fData(inputValue) {
+ if (!inputValue) return '';
+
+ if (inputValue === 0) return '0 Bytes';
+
+ const units = ['bytes', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb', 'Eb', 'Zb', 'Yb'];
+
+ const decimal = 2;
+
+ const baseValue = 1024;
+
+ const number = Number(inputValue);
+
+ const index = Math.floor(Math.log(number) / Math.log(baseValue));
+
+ const fm = `${parseFloat((number / baseValue ** index).toFixed(decimal))} ${units[index]}`;
+
+ return fm;
+}
diff --git a/template/src/utils/format-time.js b/template/src/utils/format-time.js
new file mode 100644
index 0000000..16ea82a
--- /dev/null
+++ b/template/src/utils/format-time.js
@@ -0,0 +1,50 @@
+import { format, getTime, formatDistanceToNow } from 'date-fns';
+
+// ----------------------------------------------------------------------
+
+export function fDate(date, newFormat) {
+ const fm = newFormat || 'dd MMM yyyy';
+
+ return date ? format(new Date(date), fm) : '';
+}
+
+export function fTime(date, newFormat) {
+ const fm = newFormat || 'p';
+
+ return date ? format(new Date(date), fm) : '';
+}
+
+export function fDateTime(date, newFormat) {
+ const fm = newFormat || 'dd MMM yyyy p';
+
+ return date ? format(new Date(date), fm) : '';
+}
+
+export function fTimestamp(date) {
+ return date ? getTime(new Date(date)) : '';
+}
+
+export function fToNow(date) {
+ return date
+ ? formatDistanceToNow(new Date(date), {
+ addSuffix: true,
+ })
+ : '';
+}
+
+export function isBetween(inputDate, startDate, endDate) {
+ const date = new Date(inputDate);
+
+ const results =
+ new Date(date.toDateString()) >= new Date(startDate.toDateString()) &&
+ new Date(date.toDateString()) <= new Date(endDate.toDateString());
+
+ return results;
+}
+
+export function isAfter(startDate, endDate) {
+ const results =
+ startDate && endDate ? new Date(startDate).getTime() > new Date(endDate).getTime() : false;
+
+ return results;
+}
diff --git a/template/vercel.json b/template/vercel.json
new file mode 100644
index 0000000..408821b
--- /dev/null
+++ b/template/vercel.json
@@ -0,0 +1,8 @@
+{
+ "rewrites": [
+ {
+ "source": "/(.*)",
+ "destination": "/"
+ }
+ ]
+}
diff --git a/template/vite.config.js b/template/vite.config.js
new file mode 100644
index 0000000..6717f05
--- /dev/null
+++ b/template/vite.config.js
@@ -0,0 +1,38 @@
+import path from 'path';
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react-swc';
+import checker from 'vite-plugin-checker';
+
+// ----------------------------------------------------------------------
+
+export default defineConfig({
+ plugins: [
+ react(),
+ checker({
+ eslint: {
+ lintCommand: 'eslint "./src/**/*.{js,jsx,ts,tsx}"',
+ },
+ overlay: {
+ initialIsOpen: false,
+ },
+ }),
+ ],
+ resolve: {
+ alias: [
+ {
+ find: /^~(.+)/,
+ replacement: path.join(process.cwd(), 'node_modules/$1'),
+ },
+ {
+ find: /^src(.+)/,
+ replacement: path.join(process.cwd(), 'src/$1'),
+ },
+ ],
+ },
+ server: {
+ port: 3001,
+ },
+ preview: {
+ port: 3001,
+ },
+});
diff --git a/template/yarn.lock b/template/yarn.lock
new file mode 100644
index 0000000..a76e311
--- /dev/null
+++ b/template/yarn.lock
@@ -0,0 +1,3556 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@aashutoshrathi/word-wrap@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz"
+ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13":
+ version "7.23.5"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz"
+ integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
+ dependencies:
+ "@babel/highlight" "^7.23.4"
+ chalk "^2.4.2"
+
+"@babel/helper-module-imports@^7.16.7":
+ version "7.22.15"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz"
+ integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+ dependencies:
+ "@babel/types" "^7.22.15"
+
+"@babel/helper-string-parser@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz"
+ integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
+
+"@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+"@babel/highlight@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz"
+ integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+
+"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
+ version "7.23.5"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz"
+ integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/types@^7.22.15":
+ version "7.23.5"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz"
+ integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==
+ dependencies:
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
+"@emotion/babel-plugin@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz"
+ integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/serialize" "^1.1.2"
+ babel-plugin-macros "^3.1.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.2.0"
+
+"@emotion/cache@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz"
+ integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/sheet" "^1.2.2"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
+ stylis "4.2.0"
+
+"@emotion/hash@^0.9.1":
+ version "0.9.1"
+ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz"
+ integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
+
+"@emotion/is-prop-valid@^0.8.2":
+ version "0.8.8"
+ resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz"
+ integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==
+ dependencies:
+ "@emotion/memoize" "0.7.4"
+
+"@emotion/is-prop-valid@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz"
+ integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+
+"@emotion/memoize@0.7.4":
+ version "0.7.4"
+ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz"
+ integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
+
+"@emotion/memoize@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz"
+ integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
+
+"@emotion/react@^11.11.1", "@emotion/react@^11.5.0":
+ version "11.11.1"
+ resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz"
+ integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.11.0"
+ "@emotion/cache" "^11.11.0"
+ "@emotion/serialize" "^1.1.2"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
+ hoist-non-react-statics "^3.3.1"
+
+"@emotion/serialize@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz"
+ integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==
+ dependencies:
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/unitless" "^0.8.1"
+ "@emotion/utils" "^1.2.1"
+ csstype "^3.0.2"
+
+"@emotion/sheet@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz"
+ integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
+
+"@emotion/styled@^11.11.0", "@emotion/styled@^11.3.0":
+ version "11.11.0"
+ resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz"
+ integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.11.0"
+ "@emotion/is-prop-valid" "^1.2.1"
+ "@emotion/serialize" "^1.1.2"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+ "@emotion/utils" "^1.2.1"
+
+"@emotion/unitless@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz"
+ integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz"
+ integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
+
+"@emotion/utils@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz"
+ integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
+
+"@emotion/weak-memoize@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz"
+ integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
+
+"@esbuild/android-arm64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz#683794bdc3d27222d3eced7b74cad15979548031"
+ integrity sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==
+
+"@esbuild/android-arm@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.9.tgz#21a4de41f07b2af47401c601d64dfdefd056c595"
+ integrity sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==
+
+"@esbuild/android-x64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.9.tgz#e2d7674bc025ddc8699f0cc76cb97823bb63c252"
+ integrity sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==
+
+"@esbuild/darwin-arm64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz"
+ integrity sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==
+
+"@esbuild/darwin-x64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz#8a216c66dcf51addeeb843d8cfaeff712821d12b"
+ integrity sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==
+
+"@esbuild/freebsd-arm64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz#63d4f603e421252c3cd836b18d01545be7c6c440"
+ integrity sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==
+
+"@esbuild/freebsd-x64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz#a3db52595be65360eae4de1d1fa3c1afd942e1e4"
+ integrity sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==
+
+"@esbuild/linux-arm64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz#4ae5811ce9f8d7df5eb9edd9765ea9401a534f13"
+ integrity sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==
+
+"@esbuild/linux-arm@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz#9807e92cfd335f46326394805ad488e646e506f2"
+ integrity sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==
+
+"@esbuild/linux-ia32@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz#18892c10f3106652b16f9da88a0362dc95ed46c7"
+ integrity sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==
+
+"@esbuild/linux-loong64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz#dc2ebf9a125db0a1bba18c2bbfd4fbdcbcaf61c2"
+ integrity sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==
+
+"@esbuild/linux-mips64el@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz#4c2f7c5d901015e3faf1563c4a89a50776cb07fd"
+ integrity sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==
+
+"@esbuild/linux-ppc64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz#8385332713b4e7812869622163784a5633f76fc4"
+ integrity sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==
+
+"@esbuild/linux-riscv64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz#23f1db24fa761be311874f32036c06249aa20cba"
+ integrity sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==
+
+"@esbuild/linux-s390x@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz#2dffe497726b897c9f0109e774006e25b33b4fd0"
+ integrity sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==
+
+"@esbuild/linux-x64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz#ceb1d62cd830724ff5b218e5d3172a8bad59420e"
+ integrity sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==
+
+"@esbuild/netbsd-x64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz#0cbca65e9ef4d3fc41502d3e055e6f49479a8f18"
+ integrity sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==
+
+"@esbuild/openbsd-x64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz#1f57adfbee09c743292c6758a3642e875bcad1cf"
+ integrity sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==
+
+"@esbuild/sunos-x64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz#116be6adbd2c7479edeeb5f6ea0441002ab4cb9c"
+ integrity sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==
+
+"@esbuild/win32-arm64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz#2be22131ab18af4693fd737b161d1ef34de8ca9d"
+ integrity sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==
+
+"@esbuild/win32-ia32@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz#e10ead5a55789b167b4225d2469324538768af7c"
+ integrity sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==
+
+"@esbuild/win32-x64@0.19.9":
+ version "0.19.9"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz#b2da6219b603e3fa371a78f53f5361260d0c5585"
+ integrity sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.6.1":
+ version "4.10.0"
+ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz"
+ integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
+
+"@eslint/eslintrc@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz"
+ integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.6.0"
+ globals "^13.19.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@8.55.0":
+ version "8.55.0"
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz"
+ integrity sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==
+
+"@floating-ui/core@^1.4.2":
+ version "1.5.2"
+ resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz"
+ integrity sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==
+ dependencies:
+ "@floating-ui/utils" "^0.1.3"
+
+"@floating-ui/dom@^1.5.1":
+ version "1.5.3"
+ resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz"
+ integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==
+ dependencies:
+ "@floating-ui/core" "^1.4.2"
+ "@floating-ui/utils" "^0.1.3"
+
+"@floating-ui/react-dom@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz"
+ integrity sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==
+ dependencies:
+ "@floating-ui/dom" "^1.5.1"
+
+"@floating-ui/utils@^0.1.3":
+ version "0.1.6"
+ resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz"
+ integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==
+
+"@googlemaps/js-api-loader@^1.13.8":
+ version "1.16.2"
+ resolved "https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.2.tgz"
+ integrity sha512-psGw5u0QM6humao48Hn4lrChOM2/rA43ZCm3tKK9qQsEj1/VzqkCqnvGfEOshDbBQflydfaRovbKwZMF4AyqbA==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+
+"@hookform/resolvers@^3.3.2":
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.2.tgz"
+ integrity sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==
+
+"@humanwhocodes/config-array@^0.11.13":
+ version "0.11.13"
+ resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz"
+ integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==
+ dependencies:
+ "@humanwhocodes/object-schema" "^2.0.1"
+ debug "^4.1.1"
+ minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz"
+ integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==
+
+"@iconify/react@^4.1.1":
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/@iconify/react/-/react-4.1.1.tgz"
+ integrity sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==
+ dependencies:
+ "@iconify/types" "^2.0.0"
+
+"@iconify/types@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz"
+ integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==
+
+"@mapbox/point-geometry@^0.1.0":
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz"
+ integrity sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==
+
+"@mui/base@5.0.0-beta.26", "@mui/base@^5.0.0-beta.22":
+ version "5.0.0-beta.26"
+ resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.26.tgz"
+ integrity sha512-gPMRKC84VRw+tjqYoyBzyrBUqHQucMXdlBpYazHa5rCXrb91fYEQk5SqQ2U5kjxx9QxZxTBvWAmZ6DblIgaGhQ==
+ dependencies:
+ "@babel/runtime" "^7.23.4"
+ "@floating-ui/react-dom" "^2.0.4"
+ "@mui/types" "^7.2.10"
+ "@mui/utils" "^5.14.20"
+ "@popperjs/core" "^2.11.8"
+ clsx "^2.0.0"
+ prop-types "^15.8.1"
+
+"@mui/core-downloads-tracker@^5.14.20":
+ version "5.14.20"
+ resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.20.tgz"
+ integrity sha512-fXoGe8VOrIYajqALysFuyal1q1YmBARqJ3tmnWYDVl0scu8f6h6tZQbS2K8BY28QwkWNGyv4WRfuUkzN5HR3Ow==
+
+"@mui/lab@^5.0.0-alpha.155":
+ version "5.0.0-alpha.155"
+ resolved "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.155.tgz"
+ integrity sha512-9mE929QFToQnSghSwvcy3Yeg+Pkj2WnR6z9OP871JiqFDL80b6OaLg2qyUt4zTFhbiBwUyBTJQ9XFrkFIibLHw==
+ dependencies:
+ "@babel/runtime" "^7.23.4"
+ "@mui/base" "5.0.0-beta.26"
+ "@mui/system" "^5.14.20"
+ "@mui/types" "^7.2.10"
+ "@mui/utils" "^5.14.20"
+ clsx "^2.0.0"
+ prop-types "^15.8.1"
+
+"@mui/material@^5.0.0", "@mui/material@^5.14.20":
+ version "5.14.20"
+ resolved "https://registry.npmjs.org/@mui/material/-/material-5.14.20.tgz"
+ integrity sha512-SUcPZnN6e0h1AtrDktEl76Dsyo/7pyEUQ+SAVe9XhHg/iliA0b4Vo+Eg4HbNkELsMbpDsUF4WHp7rgflPG7qYQ==
+ dependencies:
+ "@babel/runtime" "^7.23.4"
+ "@mui/base" "5.0.0-beta.26"
+ "@mui/core-downloads-tracker" "^5.14.20"
+ "@mui/system" "^5.14.20"
+ "@mui/types" "^7.2.10"
+ "@mui/utils" "^5.14.20"
+ "@types/react-transition-group" "^4.4.9"
+ clsx "^2.0.0"
+ csstype "^3.1.2"
+ prop-types "^15.8.1"
+ react-is "^18.2.0"
+ react-transition-group "^4.4.5"
+
+"@mui/private-theming@^5.14.20":
+ version "5.14.20"
+ resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.20.tgz"
+ integrity sha512-WV560e1vhs2IHCh0pgUaWHznrcrVoW9+cDCahU1VTkuwPokWVvb71ccWQ1f8Y3tRBPPcNkU2dChkkRJChLmQlQ==
+ dependencies:
+ "@babel/runtime" "^7.23.4"
+ "@mui/utils" "^5.14.20"
+ prop-types "^15.8.1"
+
+"@mui/styled-engine@^5.14.19":
+ version "5.14.20"
+ resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.20.tgz"
+ integrity sha512-Vs4nGptd9wRslo9zeRkuWcZeIEp+oYbODy+fiZKqqr4CH1Gfi9fdP0Q1tGYk8OiJ2EPB/tZSAyOy62Hyp/iP7g==
+ dependencies:
+ "@babel/runtime" "^7.23.4"
+ "@emotion/cache" "^11.11.0"
+ csstype "^3.1.2"
+ prop-types "^15.8.1"
+
+"@mui/system@^5.14.20":
+ version "5.14.20"
+ resolved "https://registry.npmjs.org/@mui/system/-/system-5.14.20.tgz"
+ integrity sha512-jKOGtK4VfYZG5kdaryUHss4X6hzcfh0AihT8gmnkfqRtWP7xjY+vPaUhhuSeibE5sqA5wCtdY75z6ep9pxFnIg==
+ dependencies:
+ "@babel/runtime" "^7.23.4"
+ "@mui/private-theming" "^5.14.20"
+ "@mui/styled-engine" "^5.14.19"
+ "@mui/types" "^7.2.10"
+ "@mui/utils" "^5.14.20"
+ clsx "^2.0.0"
+ csstype "^3.1.2"
+ prop-types "^15.8.1"
+
+"@mui/types@^7.2.10":
+ version "7.2.10"
+ resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.10.tgz"
+ integrity sha512-wX1vbDC+lzF7FlhT6A3ffRZgEoKWPF8VqRoTu4lZwouFX2t90KyCMsgepMw5DxLak1BSp/KP86CmtZttikb/gQ==
+
+"@mui/utils@^5.14.16", "@mui/utils@^5.14.20":
+ version "5.14.20"
+ resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.20.tgz"
+ integrity sha512-Y6yL5MoFmtQml20DZnaaK1znrCEwG6/vRSzW8PKOTrzhyqKIql0FazZRUR7sA5EPASgiyKZfq0FPwISRXm5NdA==
+ dependencies:
+ "@babel/runtime" "^7.23.4"
+ "@types/prop-types" "^15.7.11"
+ prop-types "^15.8.1"
+ react-is "^18.2.0"
+
+"@mui/x-date-pickers@^6.18.4":
+ version "6.18.4"
+ resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.4.tgz"
+ integrity sha512-YqJ6lxZHBIt344B3bvRAVbdYSQz4dcmJQXGcfvJTn26VdKjpgzjAqwhlbQhbAt55audJOWzGB99ImuQuljDROA==
+ dependencies:
+ "@babel/runtime" "^7.23.2"
+ "@mui/base" "^5.0.0-beta.22"
+ "@mui/utils" "^5.14.16"
+ "@types/react-transition-group" "^4.4.8"
+ clsx "^2.0.0"
+ prop-types "^15.8.1"
+ react-transition-group "^4.4.5"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@pkgr/utils@^2.4.2":
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz"
+ integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==
+ dependencies:
+ cross-spawn "^7.0.3"
+ fast-glob "^3.3.0"
+ is-glob "^4.0.3"
+ open "^9.1.0"
+ picocolors "^1.0.0"
+ tslib "^2.6.0"
+
+"@popperjs/core@^2.11.8":
+ version "2.11.8"
+ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
+ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
+
+"@remix-run/router@1.13.1":
+ version "1.13.1"
+ resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz"
+ integrity sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==
+
+"@rollup/rollup-android-arm-eabi@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.7.0.tgz#c144935afdf83e3da0ddea4d903360f99f69c79a"
+ integrity sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==
+
+"@rollup/rollup-android-arm64@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.7.0.tgz#4e05031399a9c795612c9694827ec4ba55771bec"
+ integrity sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==
+
+"@rollup/rollup-darwin-arm64@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.7.0.tgz"
+ integrity sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==
+
+"@rollup/rollup-darwin-x64@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.7.0.tgz#484937c6b987bebaeccdae774977ad4bf7bcd940"
+ integrity sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.7.0.tgz#c495ba7aa13427aaeb4ea0864ab9c2a3d5aa9c09"
+ integrity sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==
+
+"@rollup/rollup-linux-arm64-gnu@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.7.0.tgz#0ef4ef25e83f610b56d94a5a1fffa27220d5224d"
+ integrity sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==
+
+"@rollup/rollup-linux-arm64-musl@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.7.0.tgz#d75add714d898cee4e4a5baeb2e30641e483b0e3"
+ integrity sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==
+
+"@rollup/rollup-linux-riscv64-gnu@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.7.0.tgz#b7ed4894b44a47f4145cce77175fe578d1379863"
+ integrity sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==
+
+"@rollup/rollup-linux-x64-gnu@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.7.0.tgz#bccd53f20de2c1b1e7024898dc5b69375a5abe4e"
+ integrity sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==
+
+"@rollup/rollup-linux-x64-musl@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.7.0.tgz#554315d4f252f9f324da587fbf5048aaaf1da12e"
+ integrity sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==
+
+"@rollup/rollup-win32-arm64-msvc@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.7.0.tgz#95902325d07919e25dff32be9428acbc1b889101"
+ integrity sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==
+
+"@rollup/rollup-win32-ia32-msvc@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.7.0.tgz#f9ca12cc03ebca191ff6b832785c5a5e1974cf55"
+ integrity sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==
+
+"@rollup/rollup-win32-x64-msvc@4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.7.0.tgz#1ad18d12c21d09a12d88c904647f1ea64123c32e"
+ integrity sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==
+
+"@swc/core-darwin-arm64@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.100.tgz"
+ integrity sha512-XVWFsKe6ei+SsDbwmsuRkYck1SXRpO60Hioa4hoLwR8fxbA9eVp6enZtMxzVVMBi8ej5seZ4HZQeAWepbukiBw==
+
+"@swc/core-darwin-x64@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.100.tgz#d84f5c0bb4603c252884d011a698ed7c634b1505"
+ integrity sha512-KF/MXrnH1nakm1wbt4XV8FS7kvqD9TGmVxeJ0U4bbvxXMvzeYUurzg3AJUTXYmXDhH/VXOYJE5N5RkwZZPs5iA==
+
+"@swc/core-linux-arm64-gnu@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.100.tgz#1ed4b92b373882d8f338c4e0a0aa64cdaa6106f1"
+ integrity sha512-p8hikNnAEJrw5vHCtKiFT4hdlQxk1V7vqPmvUDgL/qe2menQDK/i12tbz7/3BEQ4UqUPnvwpmVn2d19RdEMNxw==
+
+"@swc/core-linux-arm64-musl@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.100.tgz#9db560f7459e42e65ec02670d6a8316e7c850cfc"
+ integrity sha512-BWx/0EeY89WC4q3AaIaBSGfQxkYxIlS3mX19dwy2FWJs/O+fMvF9oLk/CyJPOZzbp+1DjGeeoGFuDYpiNO91JA==
+
+"@swc/core-linux-x64-gnu@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.100.tgz#228826ea48879bf1e73683fbef4373e3e762e424"
+ integrity sha512-XUdGu3dxAkjsahLYnm8WijPfKebo+jHgHphDxaW0ovI6sTdmEGFDew7QzKZRlbYL2jRkUuuKuDGvD6lO5frmhA==
+
+"@swc/core-linux-x64-musl@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.100.tgz#09a234dbbf625d071ecb663680e997a62d230d49"
+ integrity sha512-PhoXKf+f0OaNW/GCuXjJ0/KfK9EJX7z2gko+7nVnEA0p3aaPtbP6cq1Ubbl6CMoPL+Ci3gZ7nYumDqXNc3CtLQ==
+
+"@swc/core-win32-arm64-msvc@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.100.tgz#add1c82884c10a9054ed6a48f884097aa85c6d2b"
+ integrity sha512-PwLADZN6F9cXn4Jw52FeP/MCLVHm8vwouZZSOoOScDtihjY495SSjdPnlosMaRSR4wJQssGwiD/4MbpgQPqbAw==
+
+"@swc/core-win32-ia32-msvc@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.100.tgz#e0b6c5ae7f3250adeeb88dae83558d3f45148c56"
+ integrity sha512-0f6nicKSLlDKlyPRl2JEmkpBV4aeDfRQg6n8mPqgL7bliZIcDahG0ej+HxgNjZfS3e0yjDxsNRa6sAqWU2Z60A==
+
+"@swc/core-win32-x64-msvc@1.3.100":
+ version "1.3.100"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.100.tgz#34721dff151d7dcf165675f18aeed0a12264d88c"
+ integrity sha512-b7J0rPoMkRTa3XyUGt8PwCaIBuYWsL2DqbirrQKRESzgCvif5iNpqaM6kjIjI/5y5q1Ycv564CB51YDpiS8EtQ==
+
+"@swc/core@^1.3.96":
+ version "1.3.100"
+ resolved "https://registry.npmjs.org/@swc/core/-/core-1.3.100.tgz"
+ integrity sha512-7dKgTyxJjlrMwFZYb1auj3Xq0D8ZBe+5oeIgfMlRU05doXZypYJe0LAk0yjj3WdbwYzpF+T1PLxwTWizI0pckw==
+ dependencies:
+ "@swc/counter" "^0.1.1"
+ "@swc/types" "^0.1.5"
+ optionalDependencies:
+ "@swc/core-darwin-arm64" "1.3.100"
+ "@swc/core-darwin-x64" "1.3.100"
+ "@swc/core-linux-arm64-gnu" "1.3.100"
+ "@swc/core-linux-arm64-musl" "1.3.100"
+ "@swc/core-linux-x64-gnu" "1.3.100"
+ "@swc/core-linux-x64-musl" "1.3.100"
+ "@swc/core-win32-arm64-msvc" "1.3.100"
+ "@swc/core-win32-ia32-msvc" "1.3.100"
+ "@swc/core-win32-x64-msvc" "1.3.100"
+
+"@swc/counter@^0.1.1":
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz"
+ integrity sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==
+
+"@swc/types@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz"
+ integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==
+
+"@types/json-schema@^7.0.12":
+ version "7.0.15"
+ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
+"@types/lodash-es@^4.17.6":
+ version "4.17.12"
+ resolved "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz"
+ integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
+ dependencies:
+ "@types/lodash" "*"
+
+"@types/lodash@*":
+ version "4.14.202"
+ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz"
+ integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz"
+ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
+
+"@types/prop-types@*", "@types/prop-types@^15.7.11":
+ version "15.7.11"
+ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz"
+ integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==
+
+"@types/react-transition-group@^4.4.8", "@types/react-transition-group@^4.4.9":
+ version "4.4.10"
+ resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz"
+ integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react@*", "@types/react@^18.0.0":
+ version "18.2.43"
+ resolved "https://registry.npmjs.org/@types/react/-/react-18.2.43.tgz"
+ integrity sha512-nvOV01ZdBdd/KW6FahSbcNplt2jCJfyWdTos61RYHV+FVv5L/g9AOX1bmbVcWcLFL8+KHQfh1zVIQrud6ihyQA==
+ dependencies:
+ "@types/prop-types" "*"
+ "@types/scheduler" "*"
+ csstype "^3.0.2"
+
+"@types/scheduler@*":
+ version "0.16.8"
+ resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz"
+ integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==
+
+"@types/semver@^7.5.0":
+ version "7.5.6"
+ resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz"
+ integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==
+
+"@typescript-eslint/scope-manager@6.13.2":
+ version "6.13.2"
+ resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz"
+ integrity sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==
+ dependencies:
+ "@typescript-eslint/types" "6.13.2"
+ "@typescript-eslint/visitor-keys" "6.13.2"
+
+"@typescript-eslint/types@6.13.2":
+ version "6.13.2"
+ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz"
+ integrity sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==
+
+"@typescript-eslint/typescript-estree@6.13.2":
+ version "6.13.2"
+ resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz"
+ integrity sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==
+ dependencies:
+ "@typescript-eslint/types" "6.13.2"
+ "@typescript-eslint/visitor-keys" "6.13.2"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.5.4"
+ ts-api-utils "^1.0.1"
+
+"@typescript-eslint/utils@^6.13.0":
+ version "6.13.2"
+ resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz"
+ integrity sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@types/json-schema" "^7.0.12"
+ "@types/semver" "^7.5.0"
+ "@typescript-eslint/scope-manager" "6.13.2"
+ "@typescript-eslint/types" "6.13.2"
+ "@typescript-eslint/typescript-estree" "6.13.2"
+ semver "^7.5.4"
+
+"@typescript-eslint/visitor-keys@6.13.2":
+ version "6.13.2"
+ resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz"
+ integrity sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==
+ dependencies:
+ "@typescript-eslint/types" "6.13.2"
+ eslint-visitor-keys "^3.4.1"
+
+"@ungap/structured-clone@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz"
+ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
+"@vitejs/plugin-react-swc@^3.5.0":
+ version "3.5.0"
+ resolved "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.5.0.tgz"
+ integrity sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==
+ dependencies:
+ "@swc/core" "^1.3.96"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.9.0:
+ version "8.11.2"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz"
+ integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
+
+ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+aria-query@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz"
+ integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
+ dependencies:
+ dequal "^2.0.3"
+
+array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+array-includes@^3.1.6, array-includes@^3.1.7:
+ version "3.1.7"
+ resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz"
+ integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ get-intrinsic "^1.2.1"
+ is-string "^1.0.7"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array.prototype.findlastindex@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz"
+ integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+ get-intrinsic "^1.2.1"
+
+array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz"
+ integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz"
+ integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.tosorted@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz"
+ integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+ get-intrinsic "^1.2.1"
+
+arraybuffer.prototype.slice@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz"
+ integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ get-intrinsic "^1.2.1"
+ is-array-buffer "^3.0.2"
+ is-shared-array-buffer "^1.0.2"
+
+ast-types-flow@^0.0.8:
+ version "0.0.8"
+ resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz"
+ integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==
+
+asynciterator.prototype@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz"
+ integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==
+ dependencies:
+ has-symbols "^1.0.3"
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+axe-core@=4.7.0:
+ version "4.7.0"
+ resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz"
+ integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==
+
+axobject-query@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz"
+ integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==
+ dependencies:
+ dequal "^2.0.3"
+
+babel-plugin-macros@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz"
+ integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ cosmiconfig "^7.0.0"
+ resolve "^1.19.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+big-integer@^1.6.44:
+ version "1.6.52"
+ resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz"
+ integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bplist-parser@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz"
+ integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==
+ dependencies:
+ big-integer "^1.6.44"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.2, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+bundle-name@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz"
+ integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==
+ dependencies:
+ run-applescript "^5.0.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz"
+ integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
+ dependencies:
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.1"
+ set-function-length "^1.1.1"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+can-use-dom@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz"
+ integrity sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chokidar@^3.5.1:
+ version "3.5.3"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+classnames@^2.2.5:
+ version "2.3.2"
+ resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz"
+ integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
+
+clsx@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz"
+ integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+commander@^8.0.0:
+ version "8.3.0"
+ resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+confusing-browser-globals@^1.0.10:
+ version "1.0.11"
+ resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz"
+ integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==
+
+convert-source-map@^1.5.0:
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
+cosmiconfig@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz"
+ integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+countup.js@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.npmjs.org/countup.js/-/countup.js-2.8.0.tgz"
+ integrity sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ==
+
+cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+cssjanus@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/cssjanus/-/cssjanus-2.1.0.tgz"
+ integrity sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g==
+
+csstype@^3.0.2, csstype@^3.1.2:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+damerau-levenshtein@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz"
+ integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
+
+date-fns@^2.30.0:
+ version "2.30.0"
+ resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz"
+ integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@^4.0.0:
+ version "4.3.1"
+ resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
+default-browser-id@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz"
+ integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==
+ dependencies:
+ bplist-parser "^0.2.0"
+ untildify "^4.0.0"
+
+default-browser@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz"
+ integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==
+ dependencies:
+ bundle-name "^3.0.0"
+ default-browser-id "^3.0.0"
+ execa "^7.1.1"
+ titleize "^3.0.0"
+
+define-data-property@^1.0.1, define-data-property@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz"
+ integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
+ dependencies:
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+define-lazy-prop@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz"
+ integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
+
+define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+dequal@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"
+ integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-helpers@^5.0.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
+ integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ csstype "^3.0.2"
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+enquire.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz"
+ integrity sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.22.1:
+ version "1.22.3"
+ resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz"
+ integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ arraybuffer.prototype.slice "^1.0.2"
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.5"
+ es-set-tostringtag "^2.0.1"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.2"
+ get-symbol-description "^1.0.0"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+ internal-slot "^1.0.5"
+ is-array-buffer "^3.0.2"
+ is-callable "^1.2.7"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.12"
+ is-weakref "^1.0.2"
+ object-inspect "^1.13.1"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.5.1"
+ safe-array-concat "^1.0.1"
+ safe-regex-test "^1.0.0"
+ string.prototype.trim "^1.2.8"
+ string.prototype.trimend "^1.0.7"
+ string.prototype.trimstart "^1.0.7"
+ typed-array-buffer "^1.0.0"
+ typed-array-byte-length "^1.0.0"
+ typed-array-byte-offset "^1.0.0"
+ typed-array-length "^1.0.4"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.13"
+
+es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15:
+ version "1.0.15"
+ resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz"
+ integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==
+ dependencies:
+ asynciterator.prototype "^1.0.0"
+ call-bind "^1.0.2"
+ define-properties "^1.2.1"
+ es-abstract "^1.22.1"
+ es-set-tostringtag "^2.0.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.2.1"
+ globalthis "^1.0.3"
+ has-property-descriptors "^1.0.0"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.5"
+ iterator.prototype "^1.1.2"
+ safe-array-concat "^1.0.1"
+
+es-set-tostringtag@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz"
+ integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==
+ dependencies:
+ get-intrinsic "^1.2.2"
+ has-tostringtag "^1.0.0"
+ hasown "^2.0.0"
+
+es-shim-unscopables@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz"
+ integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+ dependencies:
+ hasown "^2.0.0"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+esbuild@^0.19.3:
+ version "0.19.9"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz"
+ integrity sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.19.9"
+ "@esbuild/android-arm64" "0.19.9"
+ "@esbuild/android-x64" "0.19.9"
+ "@esbuild/darwin-arm64" "0.19.9"
+ "@esbuild/darwin-x64" "0.19.9"
+ "@esbuild/freebsd-arm64" "0.19.9"
+ "@esbuild/freebsd-x64" "0.19.9"
+ "@esbuild/linux-arm" "0.19.9"
+ "@esbuild/linux-arm64" "0.19.9"
+ "@esbuild/linux-ia32" "0.19.9"
+ "@esbuild/linux-loong64" "0.19.9"
+ "@esbuild/linux-mips64el" "0.19.9"
+ "@esbuild/linux-ppc64" "0.19.9"
+ "@esbuild/linux-riscv64" "0.19.9"
+ "@esbuild/linux-s390x" "0.19.9"
+ "@esbuild/linux-x64" "0.19.9"
+ "@esbuild/netbsd-x64" "0.19.9"
+ "@esbuild/openbsd-x64" "0.19.9"
+ "@esbuild/sunos-x64" "0.19.9"
+ "@esbuild/win32-arm64" "0.19.9"
+ "@esbuild/win32-ia32" "0.19.9"
+ "@esbuild/win32-x64" "0.19.9"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-airbnb-base@^15.0.0:
+ version "15.0.0"
+ resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz"
+ integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==
+ dependencies:
+ confusing-browser-globals "^1.0.10"
+ object.assign "^4.1.2"
+ object.entries "^1.1.5"
+ semver "^6.3.0"
+
+eslint-config-airbnb@^19.0.4:
+ version "19.0.4"
+ resolved "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz"
+ integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==
+ dependencies:
+ eslint-config-airbnb-base "^15.0.0"
+ object.assign "^4.1.2"
+ object.entries "^1.1.5"
+
+eslint-config-prettier@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz"
+ integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
+
+eslint-import-resolver-alias@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz"
+ integrity sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==
+
+eslint-import-resolver-node@^0.3.9:
+ version "0.3.9"
+ resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz"
+ integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
+ dependencies:
+ debug "^3.2.7"
+ is-core-module "^2.13.0"
+ resolve "^1.22.4"
+
+eslint-module-utils@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz"
+ integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==
+ dependencies:
+ debug "^3.2.7"
+
+eslint-plugin-import@^2.29.0:
+ version "2.29.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz"
+ integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==
+ dependencies:
+ array-includes "^3.1.7"
+ array.prototype.findlastindex "^1.2.3"
+ array.prototype.flat "^1.3.2"
+ array.prototype.flatmap "^1.3.2"
+ debug "^3.2.7"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.9"
+ eslint-module-utils "^2.8.0"
+ hasown "^2.0.0"
+ is-core-module "^2.13.1"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.fromentries "^2.0.7"
+ object.groupby "^1.0.1"
+ object.values "^1.1.7"
+ semver "^6.3.1"
+ tsconfig-paths "^3.14.2"
+
+eslint-plugin-jsx-a11y@^6.8.0:
+ version "6.8.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz"
+ integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==
+ dependencies:
+ "@babel/runtime" "^7.23.2"
+ aria-query "^5.3.0"
+ array-includes "^3.1.7"
+ array.prototype.flatmap "^1.3.2"
+ ast-types-flow "^0.0.8"
+ axe-core "=4.7.0"
+ axobject-query "^3.2.1"
+ damerau-levenshtein "^1.0.8"
+ emoji-regex "^9.2.2"
+ es-iterator-helpers "^1.0.15"
+ hasown "^2.0.0"
+ jsx-ast-utils "^3.3.5"
+ language-tags "^1.0.9"
+ minimatch "^3.1.2"
+ object.entries "^1.1.7"
+ object.fromentries "^2.0.7"
+
+eslint-plugin-perfectionist@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-2.5.0.tgz"
+ integrity sha512-F6XXcq4mKKUe/SREoMGQqzgw6cgCgf3pFzkFfQVIGtqD1yXVpQjnhTepzhBeZfxZwgMzR9HO4yH4CUhIQ2WBcQ==
+ dependencies:
+ "@typescript-eslint/utils" "^6.13.0"
+ minimatch "^9.0.3"
+ natural-compare-lite "^1.4.0"
+
+eslint-plugin-prettier@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz"
+ integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==
+ dependencies:
+ prettier-linter-helpers "^1.0.0"
+ synckit "^0.8.5"
+
+eslint-plugin-react-hooks@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz"
+ integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
+
+eslint-plugin-react@^7.33.2:
+ version "7.33.2"
+ resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz"
+ integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==
+ dependencies:
+ array-includes "^3.1.6"
+ array.prototype.flatmap "^1.3.1"
+ array.prototype.tosorted "^1.1.1"
+ doctrine "^2.1.0"
+ es-iterator-helpers "^1.0.12"
+ estraverse "^5.3.0"
+ jsx-ast-utils "^2.4.1 || ^3.0.0"
+ minimatch "^3.1.2"
+ object.entries "^1.1.6"
+ object.fromentries "^2.0.6"
+ object.hasown "^1.1.2"
+ object.values "^1.1.6"
+ prop-types "^15.8.1"
+ resolve "^2.0.0-next.4"
+ semver "^6.3.1"
+ string.prototype.matchall "^4.0.8"
+
+eslint-plugin-unused-imports@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz"
+ integrity sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==
+ dependencies:
+ eslint-rule-composer "^0.3.0"
+
+eslint-rule-composer@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz"
+ integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
+
+eslint-scope@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz"
+ integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint@^8.55.0:
+ version "8.55.0"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz"
+ integrity sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.6.1"
+ "@eslint/eslintrc" "^2.1.4"
+ "@eslint/js" "8.55.0"
+ "@humanwhocodes/config-array" "^0.11.13"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ "@ungap/structured-clone" "^1.2.0"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.2.2"
+ eslint-visitor-keys "^3.4.3"
+ espree "^9.6.1"
+ esquery "^1.4.2"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ graphemer "^1.4.0"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ is-path-inside "^3.0.3"
+ js-yaml "^4.1.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+ strip-ansi "^6.0.1"
+ text-table "^0.2.0"
+
+espree@^9.6.0, espree@^9.6.1:
+ version "9.6.1"
+ resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz"
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+ dependencies:
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
+
+esquery@^1.4.2:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz"
+ integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+eventemitter3@^4.0.4:
+ version "4.0.7"
+ resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+execa@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz"
+ integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.1"
+ human-signals "^4.3.0"
+ is-stream "^3.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^5.1.0"
+ onetime "^6.0.0"
+ signal-exit "^3.0.7"
+ strip-final-newline "^3.0.0"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@^1.1.2:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz"
+ integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
+
+fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastq@^1.6.0:
+ version "1.15.0"
+ resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz"
+ integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
+ dependencies:
+ reusify "^1.0.4"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.3"
+ rimraf "^3.0.2"
+
+flatted@^3.2.9:
+ version "3.2.9"
+ resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz"
+ integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+framer-motion@^10.16.16:
+ version "10.16.16"
+ resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.16.tgz"
+ integrity sha512-je6j91rd7NmUX7L1XHouwJ4v3R+SO4umso2LUcgOct3rHZ0PajZ80ETYZTajzEXEl9DlKyzjyt4AvGQ+lrebOw==
+ dependencies:
+ tslib "^2.4.0"
+ optionalDependencies:
+ "@emotion/is-prop-valid" "^0.8.2"
+
+fs-extra@^11.1.0:
+ version "11.2.0"
+ resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz"
+ integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.1, function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz"
+ integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ functions-have-names "^1.2.3"
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz"
+ integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
+ dependencies:
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-stream@^6.0.0, get-stream@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@^7.1.3:
+ version "7.2.3"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^13.19.0:
+ version "13.23.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz"
+ integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==
+ dependencies:
+ type-fest "^0.20.2"
+
+globalthis@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz"
+ integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+google-map-react@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/google-map-react/-/google-map-react-2.2.1.tgz"
+ integrity sha512-Dg8aexf5rNSmywj0XKQ5m4RNzVcWwKEM2BGDj5aPChD0um8ZRjB5Upcb/yg/i0oG1aES29asQ5+6BHVgrK5xGA==
+ dependencies:
+ "@googlemaps/js-api-loader" "^1.13.8"
+ "@mapbox/point-geometry" "^0.1.0"
+ eventemitter3 "^4.0.4"
+ prop-types "^15.7.2"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.11"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz"
+ integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+hasown@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz"
+ integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
+ dependencies:
+ function-bind "^1.1.2"
+
+hoist-non-react-statics@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+human-signals@^4.3.0:
+ version "4.3.1"
+ resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz"
+ integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
+
+ignore@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz"
+ integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+internal-slot@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz"
+ integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+ hasown "^2.0.0"
+ side-channel "^1.0.4"
+
+invariant@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-async-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz"
+ integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.13.0, is-core-module@^2.13.1:
+ version "2.13.1"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz"
+ integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+ dependencies:
+ hasown "^2.0.0"
+
+is-date-object@^1.0.1, is-date-object@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-docker@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz"
+ integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-finalizationregistry@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz"
+ integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-generator-function@^1.0.10:
+ version "1.0.10"
+ resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz"
+ integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-inside-container@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz"
+ integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
+ dependencies:
+ is-docker "^3.0.0"
+
+is-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz"
+ integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-set@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz"
+ integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz"
+ integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9:
+ version "1.1.12"
+ resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz"
+ integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
+ dependencies:
+ which-typed-array "^1.1.11"
+
+is-weakmap@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz"
+ integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-weakset@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz"
+ integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+iterator.prototype@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz"
+ integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
+ dependencies:
+ define-properties "^1.2.1"
+ get-intrinsic "^1.2.1"
+ has-symbols "^1.0.3"
+ reflect.getprototypeof "^1.0.4"
+ set-function-name "^2.0.1"
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json2mq@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz"
+ integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==
+ dependencies:
+ string-convert "^0.2.0"
+
+json5@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz"
+ integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+ dependencies:
+ minimist "^1.2.0"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5:
+ version "3.3.5"
+ resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz"
+ integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==
+ dependencies:
+ array-includes "^3.1.6"
+ array.prototype.flat "^1.3.1"
+ object.assign "^4.1.4"
+ object.values "^1.1.6"
+
+keyv@^4.5.3:
+ version "4.5.4"
+ resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+language-subtag-registry@^0.3.20:
+ version "0.3.22"
+ resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz"
+ integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==
+
+language-tags@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz"
+ integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==
+ dependencies:
+ language-subtag-registry "^0.3.20"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+load-script@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz"
+ integrity sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash-es@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
+ integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.pick@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz"
+ integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==
+
+lodash.throttle@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz"
+ integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
+
+lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+memoize-one@^5.1.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz"
+ integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz"
+ integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+
+minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^9.0.3:
+ version "9.0.3"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz"
+ integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.2.0, minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+ms@2.1.2, ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+mui-one-time-password-input@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/mui-one-time-password-input/-/mui-one-time-password-input-2.0.1.tgz"
+ integrity sha512-VIp4bSHUpX2GK5VSzAoi8leRnZLcXUQ+T3mR+HHY8T/+31hfe3nR2OPPLHEB79Rp+91HWDaWkD6DQ7JMveX9gQ==
+ dependencies:
+ "@emotion/react" "^11.5.0"
+ "@emotion/styled" "^11.3.0"
+ "@mui/material" "^5.0.0"
+ "@types/react" "^18.0.0"
+ react "^18.0.0"
+ react-dom "^18.0.0"
+
+nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+natural-compare-lite@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz"
+ integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+npm-run-path@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz"
+ integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
+ dependencies:
+ path-key "^4.0.0"
+
+nprogress@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz"
+ integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==
+
+object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.13.1, object-inspect@^1.9.0:
+ version "1.13.1"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz"
+ integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.2, object.assign@^4.1.4:
+ version "4.1.5"
+ resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz"
+ integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+ dependencies:
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+object.entries@^1.1.5, object.entries@^1.1.6, object.entries@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz"
+ integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+object.fromentries@^2.0.6, object.fromentries@^2.0.7:
+ version "2.0.7"
+ resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz"
+ integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+object.groupby@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz"
+ integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ get-intrinsic "^1.2.1"
+
+object.hasown@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz"
+ integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==
+ dependencies:
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+object.values@^1.1.6, object.values@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz"
+ integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+onetime@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz"
+ integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
+ dependencies:
+ mimic-fn "^4.0.0"
+
+open@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.npmjs.org/open/-/open-9.1.0.tgz"
+ integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==
+ dependencies:
+ default-browser "^4.0.0"
+ define-lazy-prop "^3.0.0"
+ is-inside-container "^1.0.0"
+ is-wsl "^2.2.0"
+
+optionator@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz"
+ integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
+ dependencies:
+ "@aashutoshrathi/word-wrap" "^1.2.3"
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-key@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz"
+ integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+postcss@^8.4.32:
+ version "8.4.32"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz"
+ integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prettier-linter-helpers@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz"
+ integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+ dependencies:
+ fast-diff "^1.1.2"
+
+prettier@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz"
+ integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==
+
+prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+property-expr@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz"
+ integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==
+
+punycode@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+react-countup@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.npmjs.org/react-countup/-/react-countup-6.5.0.tgz"
+ integrity sha512-26JFHbUHsHxu8SetkJwWVIUEkaNnrj4P9msxNGC8tS4hGr1bngRzbwtJYOgXD2G/ItjaKJ3JfYKd85sw7qRVeA==
+ dependencies:
+ countup.js "^2.8.0"
+
+react-dom@^18.0.0, react-dom@^18.2.0:
+ version "18.2.0"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz"
+ integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
+ dependencies:
+ loose-envify "^1.1.0"
+ scheduler "^0.23.0"
+
+react-fast-compare@^3.0.1, react-fast-compare@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz"
+ integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==
+
+react-helmet-async@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.3.tgz"
+ integrity sha512-7/X3ehSCbjCaIljWa39Bb7F1Y2JWM23FN80kLozx2TdgzUmxKDSLN6qu06NG0Srzm8ljGOjgk7r7CXeEOx4MPw==
+ dependencies:
+ invariant "^2.2.4"
+ react-fast-compare "^3.2.2"
+ shallowequal "^1.1.0"
+
+react-hook-form@^7.48.2:
+ version "7.48.2"
+ resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.48.2.tgz"
+ integrity sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A==
+
+react-is@^16.13.1, react-is@^16.7.0:
+ version "16.13.1"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-is@^18.2.0:
+ version "18.2.0"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz"
+ integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
+
+react-lazy-load-image-component@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz"
+ integrity sha512-8KFkDTgjh+0+PVbH+cx0AgxLGbdTsxWMnxXzU5HEUztqewk9ufQAu8cstjZhyvtMIPsdMcPZfA0WAa7HtjQbBQ==
+ dependencies:
+ lodash.debounce "^4.0.8"
+ lodash.throttle "^4.1.1"
+
+react-player@^2.13.0:
+ version "2.13.0"
+ resolved "https://registry.npmjs.org/react-player/-/react-player-2.13.0.tgz"
+ integrity sha512-gkY7ZdbVFztlKFFhCPcnDrFQm+L399b8fhWsKatZ+b2wpKJwfUHBXQFMRxqYQGT0ic1/wQ7D7EZEWy7ZBqk2pw==
+ dependencies:
+ deepmerge "^4.0.0"
+ load-script "^1.0.0"
+ memoize-one "^5.1.1"
+ prop-types "^15.7.2"
+ react-fast-compare "^3.0.1"
+
+react-router-dom@^6.20.1:
+ version "6.20.1"
+ resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz"
+ integrity sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==
+ dependencies:
+ "@remix-run/router" "1.13.1"
+ react-router "6.20.1"
+
+react-router@6.20.1, react-router@^6.20.1:
+ version "6.20.1"
+ resolved "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz"
+ integrity sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==
+ dependencies:
+ "@remix-run/router" "1.13.1"
+
+react-slick@^0.29.0:
+ version "0.29.0"
+ resolved "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz"
+ integrity sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==
+ dependencies:
+ classnames "^2.2.5"
+ enquire.js "^2.1.6"
+ json2mq "^0.2.0"
+ lodash.debounce "^4.0.8"
+ resize-observer-polyfill "^1.5.0"
+
+react-transition-group@^4.4.5:
+ version "4.4.5"
+ resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
+ integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ dom-helpers "^5.0.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+
+react@^18.0.0, react@^18.2.0:
+ version "18.2.0"
+ resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
+ integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+reflect.getprototypeof@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz"
+ integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ get-intrinsic "^1.2.1"
+ globalthis "^1.0.3"
+ which-builtin-type "^1.1.3"
+
+regenerator-runtime@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz"
+ integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
+
+regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz"
+ integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ set-function-name "^2.0.0"
+
+resize-observer-polyfill@^1.5.0:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz"
+ integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.19.0, resolve@^1.22.4:
+ version "1.22.8"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^2.0.0-next.4:
+ version "2.0.0-next.5"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz"
+ integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rollup@^4.2.0:
+ version "4.7.0"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz"
+ integrity sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.7.0"
+ "@rollup/rollup-android-arm64" "4.7.0"
+ "@rollup/rollup-darwin-arm64" "4.7.0"
+ "@rollup/rollup-darwin-x64" "4.7.0"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.7.0"
+ "@rollup/rollup-linux-arm64-gnu" "4.7.0"
+ "@rollup/rollup-linux-arm64-musl" "4.7.0"
+ "@rollup/rollup-linux-riscv64-gnu" "4.7.0"
+ "@rollup/rollup-linux-x64-gnu" "4.7.0"
+ "@rollup/rollup-linux-x64-musl" "4.7.0"
+ "@rollup/rollup-win32-arm64-msvc" "4.7.0"
+ "@rollup/rollup-win32-ia32-msvc" "4.7.0"
+ "@rollup/rollup-win32-x64-msvc" "4.7.0"
+ fsevents "~2.3.2"
+
+run-applescript@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz"
+ integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==
+ dependencies:
+ execa "^5.0.0"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-array-concat@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz"
+ integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+ has-symbols "^1.0.3"
+ isarray "^2.0.5"
+
+safe-regex-test@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz"
+ integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ is-regex "^1.1.4"
+
+scheduler@^0.23.0:
+ version "0.23.0"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz"
+ integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
+ dependencies:
+ loose-envify "^1.1.0"
+
+semver@^6.3.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.4, semver@^7.5.0, semver@^7.5.4:
+ version "7.5.4"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+set-function-length@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz"
+ integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
+ dependencies:
+ define-data-property "^1.1.1"
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+set-function-name@^2.0.0, set-function-name@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz"
+ integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
+ dependencies:
+ define-data-property "^1.0.1"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.0"
+
+shallowequal@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz"
+ integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+signal-exit@^3.0.3, signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+simplebar-core@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.2.4.tgz"
+ integrity sha512-P+Sqshef4fq3++gQ82TgNYcgl3qZFSCP5jS2/8NMmw18oagXOijMzs1G+vm6RUY3oMvpwH3wGoqh9u6SyDjHfQ==
+ dependencies:
+ "@types/lodash-es" "^4.17.6"
+ can-use-dom "^0.1.0"
+ lodash "^4.17.21"
+ lodash-es "^4.17.21"
+
+simplebar-react@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.4.tgz"
+ integrity sha512-ogLN79e7JUm82wJChD7NSUB+4EHCFvDkjXpiu8hT1Alk7DnCekUWds61NXcsP9jC97KOgF5To/AVjYFbX0olgg==
+ dependencies:
+ simplebar-core "^1.2.4"
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slick-carousel@^1.8.1:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz"
+ integrity sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+string-convert@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz"
+ integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==
+
+string.prototype.matchall@^4.0.8:
+ version "4.0.10"
+ resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz"
+ integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ get-intrinsic "^1.2.1"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.5"
+ regexp.prototype.flags "^1.5.0"
+ set-function-name "^2.0.0"
+ side-channel "^1.0.4"
+
+string.prototype.trim@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz"
+ integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+string.prototype.trimend@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz"
+ integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+string.prototype.trimstart@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz"
+ integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-final-newline@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz"
+ integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+stylis-plugin-rtl@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz"
+ integrity sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==
+ dependencies:
+ cssjanus "^2.0.1"
+
+stylis@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz"
+ integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
+
+stylis@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz"
+ integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+synckit@^0.8.5:
+ version "0.8.6"
+ resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz"
+ integrity sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==
+ dependencies:
+ "@pkgr/utils" "^2.4.2"
+ tslib "^2.6.2"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+tiny-case@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz"
+ integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==
+
+tiny-invariant@^1.1.0:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz"
+ integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==
+
+titleize@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz"
+ integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toposort@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz"
+ integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==
+
+ts-api-utils@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz"
+ integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==
+
+tsconfig-paths@^3.14.2:
+ version "3.14.2"
+ resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz"
+ integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.2"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@^2.4.0, tslib@^2.6.0, tslib@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz"
+ integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz"
+ integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==
+
+typed-array-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz"
+ integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+ is-typed-array "^1.1.10"
+
+typed-array-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz"
+ integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ has-proto "^1.0.1"
+ is-typed-array "^1.1.10"
+
+typed-array-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz"
+ integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ has-proto "^1.0.1"
+ is-typed-array "^1.1.10"
+
+typed-array-length@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz"
+ integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ is-typed-array "^1.1.9"
+
+typescript@^5.3.3:
+ version "5.3.3"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz"
+ integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+untildify@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz"
+ integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+vite-plugin-checker@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.2.tgz"
+ integrity sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ ansi-escapes "^4.3.0"
+ chalk "^4.1.1"
+ chokidar "^3.5.1"
+ commander "^8.0.0"
+ fast-glob "^3.2.7"
+ fs-extra "^11.1.0"
+ lodash.debounce "^4.0.8"
+ lodash.pick "^4.4.0"
+ npm-run-path "^4.0.1"
+ semver "^7.5.0"
+ strip-ansi "^6.0.0"
+ tiny-invariant "^1.1.0"
+ vscode-languageclient "^7.0.0"
+ vscode-languageserver "^7.0.0"
+ vscode-languageserver-textdocument "^1.0.1"
+ vscode-uri "^3.0.2"
+
+vite@^5.0.7:
+ version "5.0.7"
+ resolved "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz"
+ integrity sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==
+ dependencies:
+ esbuild "^0.19.3"
+ postcss "^8.4.32"
+ rollup "^4.2.0"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+vscode-jsonrpc@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz"
+ integrity sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==
+
+vscode-languageclient@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz"
+ integrity sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==
+ dependencies:
+ minimatch "^3.0.4"
+ semver "^7.3.4"
+ vscode-languageserver-protocol "3.16.0"
+
+vscode-languageserver-protocol@3.16.0:
+ version "3.16.0"
+ resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz"
+ integrity sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==
+ dependencies:
+ vscode-jsonrpc "6.0.0"
+ vscode-languageserver-types "3.16.0"
+
+vscode-languageserver-textdocument@^1.0.1:
+ version "1.0.11"
+ resolved "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz"
+ integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==
+
+vscode-languageserver-types@3.16.0:
+ version "3.16.0"
+ resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz"
+ integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==
+
+vscode-languageserver@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz"
+ integrity sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==
+ dependencies:
+ vscode-languageserver-protocol "3.16.0"
+
+vscode-uri@^3.0.2:
+ version "3.0.8"
+ resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz"
+ integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-builtin-type@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz"
+ integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==
+ dependencies:
+ function.prototype.name "^1.1.5"
+ has-tostringtag "^1.0.0"
+ is-async-function "^2.0.0"
+ is-date-object "^1.0.5"
+ is-finalizationregistry "^1.0.2"
+ is-generator-function "^1.0.10"
+ is-regex "^1.1.4"
+ is-weakref "^1.0.2"
+ isarray "^2.0.5"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.1"
+ which-typed-array "^1.1.9"
+
+which-collection@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz"
+ integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+ dependencies:
+ is-map "^2.0.1"
+ is-set "^2.0.1"
+ is-weakmap "^2.0.1"
+ is-weakset "^2.0.1"
+
+which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9:
+ version "1.1.13"
+ resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz"
+ integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.4"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yet-another-react-lightbox@^3.15.6:
+ version "3.15.6"
+ resolved "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.15.6.tgz"
+ integrity sha512-he+WqKL5ZPk393oZQyadD347QqEPPr4fjqUVZKjIOeaIpbe9PHtwV4m8PjUzkbx3BISXasOqv0C/+cE1gBboXg==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+yup@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/yup/-/yup-1.3.2.tgz"
+ integrity sha512-6KCM971iQtJ+/KUaHdrhVr2LDkfhBtFPRnsG1P8F4q3uUVQ2RfEM9xekpha9aA4GXWJevjM10eDcPQ1FfWlmaQ==
+ dependencies:
+ property-expr "^2.0.5"
+ tiny-case "^1.0.3"
+ toposort "^2.0.2"
+ type-fest "^2.19.0"