afront 1.0.22 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +13 -13
- package/.env +1 -1
- package/LICENSE +21 -21
- package/README.md +94 -94
- package/build-prod/index.html +1 -1
- package/build-prod/manifest.json +25 -25
- package/build-prod/offline.html +1023 -1023
- package/build-prod/robots.txt +3 -3
- package/build-prod-static/index.html +1 -1
- package/build-prod-static/manifest.json +25 -25
- package/build-prod-static/offline.html +1023 -1023
- package/build-prod-static/robots.txt +3 -3
- package/install.js +415 -415
- package/package.json +102 -95
- package/server.js +40 -40
- package/src/ARoutes/AFRoutes.js +28 -28
- package/src/Api/api.config.js +266 -266
- package/src/Api/login.service.js +44 -44
- package/src/App.js +28 -28
- package/src/Components/Background/MeshGradient.js +18 -18
- package/src/Components/Footer/Footer.js +108 -108
- package/src/Components/Header/Header.js +149 -149
- package/src/Components/Loading/LoadingIndicator.js +12 -12
- package/src/Components/Loading/LoadingIndicator.module.css +34 -34
- package/src/Components/Loading/LoadingSpinner.js +27 -27
- package/src/Components/Loading/LoadingSpinner.module.css +100 -100
- package/src/Components/RequireAuth.js +29 -29
- package/src/LoadingFallback.js +13 -13
- package/src/PageNotFound.js +19 -19
- package/src/Pages/Home.js +50 -50
- package/src/Pages/Signup.js +230 -230
- package/src/Pages/Support.js +68 -68
- package/src/Routes/ARoutes.js +66 -66
- package/src/Routes/ARoutesStatic.js +83 -83
- package/src/Static/appStatic.js +16 -16
- package/src/Static/indexStatic.js +13 -13
- package/src/Style/App.module.css +11 -11
- package/src/Style/MeshGradient.module.css +130 -130
- package/src/Style/PageNotFound.module.css +37 -37
- package/src/Style/Style.module.css +686 -686
- package/src/Style/Support.module.css +185 -185
- package/src/Utils/LoadingContext.js +5 -5
- package/src/index.js +25 -25
- package/webpack.build-prod.js +141 -140
- package/webpack.dev.js +127 -127
- package/webpack.prod.js +148 -147
- package/webpack.ssr.prod.js +97 -97
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import * as styles from "./LoadingSpinner.module.css";
|
|
3
|
-
|
|
4
|
-
const LoadingSpinner = ({ size }) => {
|
|
5
|
-
const scaleFactor = size / 80;
|
|
6
|
-
return (
|
|
7
|
-
<div
|
|
8
|
-
style={{ transform: `scale(${scaleFactor})` }}
|
|
9
|
-
className={styles.ldsSpinner}
|
|
10
|
-
>
|
|
11
|
-
<div></div>
|
|
12
|
-
<div></div>
|
|
13
|
-
<div></div>
|
|
14
|
-
<div></div>
|
|
15
|
-
<div></div>
|
|
16
|
-
<div></div>
|
|
17
|
-
<div></div>
|
|
18
|
-
<div></div>
|
|
19
|
-
<div></div>
|
|
20
|
-
<div></div>
|
|
21
|
-
<div></div>
|
|
22
|
-
<div></div>
|
|
23
|
-
</div>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export default LoadingSpinner;
|
|
1
|
+
import React from "react";
|
|
2
|
+
import * as styles from "./LoadingSpinner.module.css";
|
|
3
|
+
|
|
4
|
+
const LoadingSpinner = ({ size }) => {
|
|
5
|
+
const scaleFactor = size / 80;
|
|
6
|
+
return (
|
|
7
|
+
<div
|
|
8
|
+
style={{ transform: `scale(${scaleFactor})` }}
|
|
9
|
+
className={styles.ldsSpinner}
|
|
10
|
+
>
|
|
11
|
+
<div></div>
|
|
12
|
+
<div></div>
|
|
13
|
+
<div></div>
|
|
14
|
+
<div></div>
|
|
15
|
+
<div></div>
|
|
16
|
+
<div></div>
|
|
17
|
+
<div></div>
|
|
18
|
+
<div></div>
|
|
19
|
+
<div></div>
|
|
20
|
+
<div></div>
|
|
21
|
+
<div></div>
|
|
22
|
+
<div></div>
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default LoadingSpinner;
|
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
.ldsSpinner,
|
|
2
|
-
.ldsSpinner div,
|
|
3
|
-
.ldsSpinner div:after {
|
|
4
|
-
box-sizing: border-box;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
.ldsSpinner {
|
|
8
|
-
color: currentColor;
|
|
9
|
-
display: inline-block;
|
|
10
|
-
position: relative;
|
|
11
|
-
width: 80px;
|
|
12
|
-
height: 80px;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.ldsSpinner div {
|
|
16
|
-
transform-origin: 40px 40px;
|
|
17
|
-
animation: ldsSpinner 1.2s linear infinite;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.ldsSpinner div:after {
|
|
21
|
-
content: " ";
|
|
22
|
-
display: block;
|
|
23
|
-
position: absolute;
|
|
24
|
-
top: 3.2px;
|
|
25
|
-
left: 36.8px;
|
|
26
|
-
width: 6.4px;
|
|
27
|
-
height: 17.6px;
|
|
28
|
-
border-radius: 20%;
|
|
29
|
-
background: currentColor;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.ldsSpinner div:nth-child(1) {
|
|
33
|
-
transform: rotate(0deg);
|
|
34
|
-
animation-delay: -1.1s;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.ldsSpinner div:nth-child(2) {
|
|
38
|
-
transform: rotate(30deg);
|
|
39
|
-
animation-delay: -1s;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
.ldsSpinner div:nth-child(3) {
|
|
43
|
-
transform: rotate(60deg);
|
|
44
|
-
animation-delay: -0.9s;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.ldsSpinner div:nth-child(4) {
|
|
48
|
-
transform: rotate(90deg);
|
|
49
|
-
animation-delay: -0.8s;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.ldsSpinner div:nth-child(5) {
|
|
53
|
-
transform: rotate(120deg);
|
|
54
|
-
animation-delay: -0.7s;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.ldsSpinner div:nth-child(6) {
|
|
58
|
-
transform: rotate(150deg);
|
|
59
|
-
animation-delay: -0.6s;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.ldsSpinner div:nth-child(7) {
|
|
63
|
-
transform: rotate(180deg);
|
|
64
|
-
animation-delay: -0.5s;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.ldsSpinner div:nth-child(8) {
|
|
68
|
-
transform: rotate(210deg);
|
|
69
|
-
animation-delay: -0.4s;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
.ldsSpinner div:nth-child(9) {
|
|
73
|
-
transform: rotate(240deg);
|
|
74
|
-
animation-delay: -0.3s;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
.ldsSpinner div:nth-child(10) {
|
|
78
|
-
transform: rotate(270deg);
|
|
79
|
-
animation-delay: -0.2s;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
.ldsSpinner div:nth-child(11) {
|
|
83
|
-
transform: rotate(300deg);
|
|
84
|
-
animation-delay: -0.1s;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.ldsSpinner div:nth-child(12) {
|
|
88
|
-
transform: rotate(330deg);
|
|
89
|
-
animation-delay: 0s;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
@keyframes ldsSpinner {
|
|
93
|
-
0% {
|
|
94
|
-
opacity: 1;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
100% {
|
|
98
|
-
opacity: 0;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
1
|
+
.ldsSpinner,
|
|
2
|
+
.ldsSpinner div,
|
|
3
|
+
.ldsSpinner div:after {
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.ldsSpinner {
|
|
8
|
+
color: currentColor;
|
|
9
|
+
display: inline-block;
|
|
10
|
+
position: relative;
|
|
11
|
+
width: 80px;
|
|
12
|
+
height: 80px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.ldsSpinner div {
|
|
16
|
+
transform-origin: 40px 40px;
|
|
17
|
+
animation: ldsSpinner 1.2s linear infinite;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.ldsSpinner div:after {
|
|
21
|
+
content: " ";
|
|
22
|
+
display: block;
|
|
23
|
+
position: absolute;
|
|
24
|
+
top: 3.2px;
|
|
25
|
+
left: 36.8px;
|
|
26
|
+
width: 6.4px;
|
|
27
|
+
height: 17.6px;
|
|
28
|
+
border-radius: 20%;
|
|
29
|
+
background: currentColor;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.ldsSpinner div:nth-child(1) {
|
|
33
|
+
transform: rotate(0deg);
|
|
34
|
+
animation-delay: -1.1s;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.ldsSpinner div:nth-child(2) {
|
|
38
|
+
transform: rotate(30deg);
|
|
39
|
+
animation-delay: -1s;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.ldsSpinner div:nth-child(3) {
|
|
43
|
+
transform: rotate(60deg);
|
|
44
|
+
animation-delay: -0.9s;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.ldsSpinner div:nth-child(4) {
|
|
48
|
+
transform: rotate(90deg);
|
|
49
|
+
animation-delay: -0.8s;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.ldsSpinner div:nth-child(5) {
|
|
53
|
+
transform: rotate(120deg);
|
|
54
|
+
animation-delay: -0.7s;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.ldsSpinner div:nth-child(6) {
|
|
58
|
+
transform: rotate(150deg);
|
|
59
|
+
animation-delay: -0.6s;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.ldsSpinner div:nth-child(7) {
|
|
63
|
+
transform: rotate(180deg);
|
|
64
|
+
animation-delay: -0.5s;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.ldsSpinner div:nth-child(8) {
|
|
68
|
+
transform: rotate(210deg);
|
|
69
|
+
animation-delay: -0.4s;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.ldsSpinner div:nth-child(9) {
|
|
73
|
+
transform: rotate(240deg);
|
|
74
|
+
animation-delay: -0.3s;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.ldsSpinner div:nth-child(10) {
|
|
78
|
+
transform: rotate(270deg);
|
|
79
|
+
animation-delay: -0.2s;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.ldsSpinner div:nth-child(11) {
|
|
83
|
+
transform: rotate(300deg);
|
|
84
|
+
animation-delay: -0.1s;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.ldsSpinner div:nth-child(12) {
|
|
88
|
+
transform: rotate(330deg);
|
|
89
|
+
animation-delay: 0s;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@keyframes ldsSpinner {
|
|
93
|
+
0% {
|
|
94
|
+
opacity: 1;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
100% {
|
|
98
|
+
opacity: 0;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import React, { useEffect, useState } from "react";
|
|
2
|
-
import { Navigate, Outlet, useLocation } from "react-router";
|
|
3
|
-
import auth from "../Api/login.service";
|
|
4
|
-
|
|
5
|
-
export default function RequireAuth({ children }) {
|
|
6
|
-
const location = useLocation();
|
|
7
|
-
const [status, setStatus] = useState("checking");
|
|
8
|
-
|
|
9
|
-
useEffect(() => {
|
|
10
|
-
let mounted = true;
|
|
11
|
-
(async () => {
|
|
12
|
-
try {
|
|
13
|
-
const res = await auth.getCurrentUser();
|
|
14
|
-
if (mounted && res?.data?.user) setStatus("authed");
|
|
15
|
-
else if (mounted) setStatus("unauth");
|
|
16
|
-
} catch (e) {
|
|
17
|
-
if (mounted) setStatus("unauth");
|
|
18
|
-
}
|
|
19
|
-
})();
|
|
20
|
-
return () => {
|
|
21
|
-
mounted = false;
|
|
22
|
-
};
|
|
23
|
-
}, []);
|
|
24
|
-
|
|
25
|
-
if (status === "checking") return null;
|
|
26
|
-
if (status === "unauth")
|
|
27
|
-
return <Navigate to="/login" state={{ from: location }} replace />;
|
|
28
|
-
// If children are provided, render them; otherwise render nested routes via Outlet
|
|
29
|
-
return children ? children : <Outlet />;
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { Navigate, Outlet, useLocation } from "react-router";
|
|
3
|
+
import auth from "../Api/login.service";
|
|
4
|
+
|
|
5
|
+
export default function RequireAuth({ children }) {
|
|
6
|
+
const location = useLocation();
|
|
7
|
+
const [status, setStatus] = useState("checking");
|
|
8
|
+
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
let mounted = true;
|
|
11
|
+
(async () => {
|
|
12
|
+
try {
|
|
13
|
+
const res = await auth.getCurrentUser();
|
|
14
|
+
if (mounted && res?.data?.user) setStatus("authed");
|
|
15
|
+
else if (mounted) setStatus("unauth");
|
|
16
|
+
} catch (e) {
|
|
17
|
+
if (mounted) setStatus("unauth");
|
|
18
|
+
}
|
|
19
|
+
})();
|
|
20
|
+
return () => {
|
|
21
|
+
mounted = false;
|
|
22
|
+
};
|
|
23
|
+
}, []);
|
|
24
|
+
|
|
25
|
+
if (status === "checking") return null;
|
|
26
|
+
if (status === "unauth")
|
|
27
|
+
return <Navigate to="/login" state={{ from: location }} replace />;
|
|
28
|
+
// If children are provided, render them; otherwise render nested routes via Outlet
|
|
29
|
+
return children ? children : <Outlet />;
|
|
30
30
|
}
|
package/src/LoadingFallback.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import * as appStyles from "./Style/App.module.css";
|
|
3
|
-
import logo from "../dev/logo512.png";
|
|
4
|
-
|
|
5
|
-
const LoadingFallback = () => {
|
|
6
|
-
return (
|
|
7
|
-
<div className={appStyles.loadingContainer}>
|
|
8
|
-
<img src={logo} alt="Loading..." className={appStyles.loadingLogo} />
|
|
9
|
-
</div>
|
|
10
|
-
);
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export default LoadingFallback;
|
|
1
|
+
import React from "react";
|
|
2
|
+
import * as appStyles from "./Style/App.module.css";
|
|
3
|
+
import logo from "../dev/logo512.png";
|
|
4
|
+
|
|
5
|
+
const LoadingFallback = () => {
|
|
6
|
+
return (
|
|
7
|
+
<div className={appStyles.loadingContainer}>
|
|
8
|
+
<img src={logo} alt="Loading..." className={appStyles.loadingLogo} />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default LoadingFallback;
|
package/src/PageNotFound.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import * as styles from "./Style/PageNotFound.module.css";
|
|
3
|
-
|
|
4
|
-
const PageNotFound = () => {
|
|
5
|
-
return (
|
|
6
|
-
<div className={styles.pageNotFoundContainer}>
|
|
7
|
-
<h2 className={styles.heading}>
|
|
8
|
-
Oops! The page you're looking for doesn't exist.
|
|
9
|
-
</h2>
|
|
10
|
-
<p className={styles.subText}>
|
|
11
|
-
It seems you’ve taken a wrong turn. Let’s get you back on track!
|
|
12
|
-
</p>
|
|
13
|
-
<a href="/" className={styles.homeLink}>
|
|
14
|
-
Go to Homepage
|
|
15
|
-
</a>
|
|
16
|
-
</div>
|
|
17
|
-
);
|
|
18
|
-
};
|
|
19
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
import * as styles from "./Style/PageNotFound.module.css";
|
|
3
|
+
|
|
4
|
+
const PageNotFound = () => {
|
|
5
|
+
return (
|
|
6
|
+
<div className={styles.pageNotFoundContainer}>
|
|
7
|
+
<h2 className={styles.heading}>
|
|
8
|
+
Oops! The page you're looking for doesn't exist.
|
|
9
|
+
</h2>
|
|
10
|
+
<p className={styles.subText}>
|
|
11
|
+
It seems you’ve taken a wrong turn. Let’s get you back on track!
|
|
12
|
+
</p>
|
|
13
|
+
<a href="/" className={styles.homeLink}>
|
|
14
|
+
Go to Homepage
|
|
15
|
+
</a>
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
20
|
export default PageNotFound;
|
package/src/Pages/Home.js
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import MeshGradient from "../Components/Background/MeshGradient";
|
|
3
|
-
import tensorlabLogo from "../Assets/images/afront.png";
|
|
4
|
-
import arrowright from "../Assets/images/arrow-right.svg";
|
|
5
|
-
import HeadTags from "asggen-headtags";
|
|
6
|
-
import * as styles from "../Style/Style.module.css";
|
|
7
|
-
|
|
8
|
-
const Home = ({ context }) => {
|
|
9
|
-
const title = "AFront by Asggen Inc.";
|
|
10
|
-
const description = "Home for all AFront products and services.";
|
|
11
|
-
const keywords = "Home, Afront, help";
|
|
12
|
-
HeadTags({ title, description, keywords, context });
|
|
13
|
-
|
|
14
|
-
return (
|
|
15
|
-
<MeshGradient>
|
|
16
|
-
<main>
|
|
17
|
-
<section className={styles.section}>
|
|
18
|
-
<div className={`${styles.container} ${styles.bannerColumn}`}>
|
|
19
|
-
<img
|
|
20
|
-
className={styles.bannerImage}
|
|
21
|
-
src={tensorlabLogo}
|
|
22
|
-
alt="banner"
|
|
23
|
-
/>
|
|
24
|
-
<div className={styles.bannerInner}>
|
|
25
|
-
<h1 className={styles.headingXl}>
|
|
26
|
-
Empower Your Front-End with AFront
|
|
27
|
-
</h1>
|
|
28
|
-
<p className={styles.paragraph}>
|
|
29
|
-
AFront streamlines front-end development with robust tools and
|
|
30
|
-
<b> seamless server-side rendering (SSSR)</b>. Build dynamic,
|
|
31
|
-
high-performance web experiences effortlessly.
|
|
32
|
-
</p>
|
|
33
|
-
<div>
|
|
34
|
-
<a
|
|
35
|
-
href="/"
|
|
36
|
-
className={`${styles.btnDarken} ${styles.menuBlock}`}
|
|
37
|
-
>
|
|
38
|
-
Get Started{" "}
|
|
39
|
-
<img className={styles.btnDarkenArrow} src={arrowright} />
|
|
40
|
-
</a>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
</section>
|
|
45
|
-
</main>
|
|
46
|
-
</MeshGradient>
|
|
47
|
-
);
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
export default Home;
|
|
1
|
+
import React from "react";
|
|
2
|
+
import MeshGradient from "../Components/Background/MeshGradient";
|
|
3
|
+
import tensorlabLogo from "../Assets/images/afront.png";
|
|
4
|
+
import arrowright from "../Assets/images/arrow-right.svg";
|
|
5
|
+
import HeadTags from "asggen-headtags";
|
|
6
|
+
import * as styles from "../Style/Style.module.css";
|
|
7
|
+
|
|
8
|
+
const Home = ({ context }) => {
|
|
9
|
+
const title = "AFront by Asggen Inc.";
|
|
10
|
+
const description = "Home for all AFront products and services.";
|
|
11
|
+
const keywords = "Home, Afront, help";
|
|
12
|
+
HeadTags({ title, description, keywords, context });
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<MeshGradient>
|
|
16
|
+
<main>
|
|
17
|
+
<section className={styles.section}>
|
|
18
|
+
<div className={`${styles.container} ${styles.bannerColumn}`}>
|
|
19
|
+
<img
|
|
20
|
+
className={styles.bannerImage}
|
|
21
|
+
src={tensorlabLogo}
|
|
22
|
+
alt="banner"
|
|
23
|
+
/>
|
|
24
|
+
<div className={styles.bannerInner}>
|
|
25
|
+
<h1 className={styles.headingXl}>
|
|
26
|
+
Empower Your Front-End with AFront
|
|
27
|
+
</h1>
|
|
28
|
+
<p className={styles.paragraph}>
|
|
29
|
+
AFront streamlines front-end development with robust tools and
|
|
30
|
+
<b> seamless server-side rendering (SSSR)</b>. Build dynamic,
|
|
31
|
+
high-performance web experiences effortlessly.
|
|
32
|
+
</p>
|
|
33
|
+
<div>
|
|
34
|
+
<a
|
|
35
|
+
href="/"
|
|
36
|
+
className={`${styles.btnDarken} ${styles.menuBlock}`}
|
|
37
|
+
>
|
|
38
|
+
Get Started{" "}
|
|
39
|
+
<img className={styles.btnDarkenArrow} src={arrowright} />
|
|
40
|
+
</a>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</section>
|
|
45
|
+
</main>
|
|
46
|
+
</MeshGradient>
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export default Home;
|