afront 1.0.2
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 +14 -0
- package/.env +2 -0
- package/LICENSE +21 -0
- package/README.md +72 -0
- package/build-prod/favicon.ico +0 -0
- package/build-prod/index.html +1 -0
- package/build-prod/logo192.png +0 -0
- package/build-prod/logo512.png +0 -0
- package/build-prod/manifest.json +25 -0
- package/build-prod/robots.txt +3 -0
- package/build-prod/static/css/3-9b9bcf0b9b877caf80c6.css +1 -0
- package/build-prod/static/css/41-1bd05b5a5a70ee2fc084.css +1 -0
- package/build-prod/static/css/573-7b8794ea227293d474c9.css +1 -0
- package/build-prod/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
- package/build-prod/static/js/3-cde9f071488e7a433907.js +1 -0
- package/build-prod/static/js/41-e973a17863e1084774d7.js +1 -0
- package/build-prod/static/js/573-21fb9ccdf567d99f4539.js +1 -0
- package/build-prod/static/js/main-cc87f2505014acdf4863.js +1 -0
- package/build-prod/static/media/52f06bb716d4ecad087a.png +0 -0
- package/build-prod/static/media/adeaead125c45715106d.svg +1 -0
- package/build-prod/style.css +1 -0
- package/build-prod-ssr/3.ssr.prod.js +1 -0
- package/build-prod-ssr/41.ssr.prod.js +1 -0
- package/build-prod-ssr/573.ssr.prod.js +1 -0
- package/build-prod-ssr/ssr.prod.js +1 -0
- package/build-prod-ssr/static/css/3-9b9bcf0b9b877caf80c6.css +1 -0
- package/build-prod-ssr/static/css/41-1bd05b5a5a70ee2fc084.css +1 -0
- package/build-prod-ssr/static/css/573-7b8794ea227293d474c9.css +1 -0
- package/build-prod-ssr/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
- package/build-prod-ssr/static/media/52f06bb716d4ecad087a.png +0 -0
- package/build-prod-ssr/static/media/adeaead125c45715106d.svg +1 -0
- package/build-prod-static/favicon.ico +0 -0
- package/build-prod-static/index.html +1 -0
- package/build-prod-static/logo192.png +0 -0
- package/build-prod-static/logo512.png +0 -0
- package/build-prod-static/manifest.json +25 -0
- package/build-prod-static/robots.txt +3 -0
- package/build-prod-static/static/css/23-1bd05b5a5a70ee2fc084.css +1 -0
- package/build-prod-static/static/css/303-9b9bcf0b9b877caf80c6.css +1 -0
- package/build-prod-static/static/css/636-7b8794ea227293d474c9.css +1 -0
- package/build-prod-static/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
- package/build-prod-static/static/js/23-8e7dbd8910931f545fd9.js +1 -0
- package/build-prod-static/static/js/303-1db8abbd7d266bdc27c7.js +1 -0
- package/build-prod-static/static/js/636-8a26bc803f853c7ddf82.js +1 -0
- package/build-prod-static/static/js/main-709b08b8e9e528bab63c.js +1 -0
- package/build-prod-static/static/media/52f06bb716d4ecad087a.png +0 -0
- package/build-prod-static/static/media/adeaead125c45715106d.svg +1 -0
- package/build-prod-static/style.css +1 -0
- package/install.js +91 -0
- package/package.json +72 -0
- package/server.js +20 -0
- package/src/ARoutes/AFRoutes.js +11 -0
- package/src/App.js +28 -0
- package/src/Assets/images/afront.png +0 -0
- package/src/Assets/images/arrow-right.svg +1 -0
- package/src/Components/Background/MeshGradient.js +18 -0
- package/src/Components/Footer/Footer.js +108 -0
- package/src/Components/Header/Header.js +151 -0
- package/src/LoadingFallback.js +13 -0
- package/src/PageNotFound.js +20 -0
- package/src/Pages/Home.js +43 -0
- package/src/Pages/Support.js +68 -0
- package/src/Routes/ARoutes.js +25 -0
- package/src/Static/appStatic.js +26 -0
- package/src/Static/indexStatic.js +10 -0
- package/src/Style/App.module.css +11 -0
- package/src/Style/MeshGradient.module.css +130 -0
- package/src/Style/PageNotFound.module.css +37 -0
- package/src/Style/Style.module.css +685 -0
- package/src/Style/Support.module.css +185 -0
- package/src/index.js +29 -0
- package/webpack.build-prod.js +110 -0
- package/webpack.dev.js +87 -0
- package/webpack.prod.js +120 -0
- package/webpack.ssr.prod.js +86 -0
package/install.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const https = require('https');
|
|
4
|
+
const { exec } = require('child_process');
|
|
5
|
+
const tmp = require('tmp');
|
|
6
|
+
const extract = require('extract-zip');
|
|
7
|
+
|
|
8
|
+
// Configuration
|
|
9
|
+
const GITHUB_ZIP_URL = 'https://github.com/Asggen/afront/archive/refs/tags/v1.0.2.zip'; // Updated URL
|
|
10
|
+
const DEFAULT_DEST_DIR = path.join(process.cwd(), 'extracted-folder');
|
|
11
|
+
|
|
12
|
+
// Download file from GitHub
|
|
13
|
+
const downloadFile = (url, destination) => {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const file = fs.createWriteStream(destination);
|
|
16
|
+
https.get(url, (response) => {
|
|
17
|
+
response.pipe(file);
|
|
18
|
+
file.on('finish', () => {
|
|
19
|
+
file.close(resolve);
|
|
20
|
+
});
|
|
21
|
+
}).on('error', (err) => {
|
|
22
|
+
fs.unlink(destination, () => reject(err));
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Extract zip file
|
|
28
|
+
const extractZip = (zipPath, extractTo) => {
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
extract(zipPath, { dir: extractTo }, (err) => {
|
|
31
|
+
if (err) reject(err);
|
|
32
|
+
else resolve();
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Run npm install
|
|
38
|
+
const runNpmInstall = (directory) => {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
exec('npm install', { cwd: directory }, (err, stdout, stderr) => {
|
|
41
|
+
if (err) {
|
|
42
|
+
console.error('Error running npm install:', stderr);
|
|
43
|
+
reject(err);
|
|
44
|
+
} else {
|
|
45
|
+
console.log('npm install output:', stdout);
|
|
46
|
+
resolve();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// Main function
|
|
53
|
+
const main = async () => {
|
|
54
|
+
try {
|
|
55
|
+
// Create a temporary directory
|
|
56
|
+
const tmpDir = tmp.dirSync({ unsafeCleanup: true });
|
|
57
|
+
const zipPath = path.join(tmpDir.name, 'archive.zip');
|
|
58
|
+
const destDir = process.argv[2] || DEFAULT_DEST_DIR;
|
|
59
|
+
|
|
60
|
+
console.log('Downloading zip file...');
|
|
61
|
+
await downloadFile(GITHUB_ZIP_URL, zipPath);
|
|
62
|
+
console.log('Downloaded successfully.');
|
|
63
|
+
|
|
64
|
+
console.log('Extracting zip file...');
|
|
65
|
+
await extractZip(zipPath, tmpDir.name);
|
|
66
|
+
console.log('Extraction complete.');
|
|
67
|
+
|
|
68
|
+
// Determine the extracted folder name
|
|
69
|
+
const extractedFolderName = fs.readdirSync(tmpDir.name)[0];
|
|
70
|
+
const extractedFolderPath = path.join(tmpDir.name, extractedFolderName);
|
|
71
|
+
|
|
72
|
+
// Move extracted contents to the destination directory
|
|
73
|
+
fs.readdirSync(extractedFolderPath).forEach((file) => {
|
|
74
|
+
fs.renameSync(path.join(extractedFolderPath, file), path.join(destDir, file));
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
console.log(`Files have been extracted to ${destDir}`);
|
|
78
|
+
|
|
79
|
+
// Run npm install in the destination directory
|
|
80
|
+
console.log('Running npm install...');
|
|
81
|
+
await runNpmInstall(destDir);
|
|
82
|
+
console.log('npm install completed.');
|
|
83
|
+
|
|
84
|
+
// Clean up
|
|
85
|
+
tmpDir.removeCallback();
|
|
86
|
+
} catch (err) {
|
|
87
|
+
console.error('Error:', err);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
main();
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "afront",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "AFront is a front-end JavaScript library designed to create seamless server-side rendered (SSSR) websites.",
|
|
5
|
+
"main": "webpack.dev.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "webpack --config webpack.prod.js",
|
|
8
|
+
"build:ssr": "webpack --config webpack.ssr.prod.js",
|
|
9
|
+
"build:alt": "webpack --config webpack.build-prod.js",
|
|
10
|
+
"prod:ssr": "node build-prod-ssr/ssr.prod.js",
|
|
11
|
+
"start": "webpack serve --config webpack.dev.js",
|
|
12
|
+
"static": "node server.js"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"afront",
|
|
16
|
+
"ssr",
|
|
17
|
+
"web"
|
|
18
|
+
],
|
|
19
|
+
"author": "imarksea - Piyush Nishad",
|
|
20
|
+
"files": [
|
|
21
|
+
"install.js",
|
|
22
|
+
"server.js",
|
|
23
|
+
"webpack.build-prod.js",
|
|
24
|
+
"webpack.dev.js",
|
|
25
|
+
"webpack.prod.js",
|
|
26
|
+
"webpack.ssr.prod.js",
|
|
27
|
+
".babelrc",
|
|
28
|
+
".env",
|
|
29
|
+
"src/**/*",
|
|
30
|
+
"build-prod/**/*",
|
|
31
|
+
"build-prod-static/**/*",
|
|
32
|
+
"build-prod-ssr/**/*"
|
|
33
|
+
],
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"asggen-headtags": "^1.0.3",
|
|
37
|
+
"babel-plugin-css-modules-transform": "^1.6.2",
|
|
38
|
+
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
39
|
+
"copy-webpack-plugin": "^12.0.2",
|
|
40
|
+
"dotenv": "^16.4.5",
|
|
41
|
+
"fs-extra": "^11.2.0",
|
|
42
|
+
"ignore-styles": "^5.0.1",
|
|
43
|
+
"react-router-dom": "^6.26.0",
|
|
44
|
+
"readline-sync": "^1.4.10",
|
|
45
|
+
"styled-components": "^6.1.12",
|
|
46
|
+
"terser-webpack-plugin": "^5.3.10"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@babel/cli": "^7.24.8",
|
|
50
|
+
"@babel/core": "^7.25.2",
|
|
51
|
+
"@babel/preset-env": "^7.25.3",
|
|
52
|
+
"@babel/preset-react": "^7.24.7",
|
|
53
|
+
"@babel/register": "^7.24.6",
|
|
54
|
+
"babel-loader": "^9.1.3",
|
|
55
|
+
"css-loader": "^7.1.1",
|
|
56
|
+
"css-minimizer-webpack-plugin": "^7.0.0",
|
|
57
|
+
"express": "^4.19.2",
|
|
58
|
+
"html-webpack-plugin": "^5.6.0",
|
|
59
|
+
"ignore-styles": "^5.0.1",
|
|
60
|
+
"mini-css-extract-plugin": "^2.9.0",
|
|
61
|
+
"react": "^18.3.1",
|
|
62
|
+
"react-dom": "^18.3.1",
|
|
63
|
+
"style-loader": "^4.0.0",
|
|
64
|
+
"webpack": "^5.91.0",
|
|
65
|
+
"webpack-cli": "^5.1.4",
|
|
66
|
+
"webpack-dev-server": "^5.0.4",
|
|
67
|
+
"webpack-node-externals": "^3.0.0"
|
|
68
|
+
},
|
|
69
|
+
"bin": {
|
|
70
|
+
"afront": "./install.js"
|
|
71
|
+
}
|
|
72
|
+
}
|
package/server.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const express = require("express");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
require("dotenv").config();
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
const PORT = process.env.PORT;
|
|
7
|
+
const HOST = process.env.HOST;
|
|
8
|
+
|
|
9
|
+
// Serve static files from the build-prod-static directory
|
|
10
|
+
app.use(express.static(path.join(__dirname, "build-prod-static")));
|
|
11
|
+
|
|
12
|
+
// Serve index.html for all other routes (except static files)
|
|
13
|
+
app.get("*", (req, res) => {
|
|
14
|
+
const indexPath = path.join(__dirname, "build-prod-static", "index.html");
|
|
15
|
+
res.sendFile(indexPath);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
app.listen(PORT, HOST, () => {
|
|
19
|
+
console.log(`Server is running on http://${HOST}:${PORT}`);
|
|
20
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { lazy } from "react";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
const routes = [
|
|
5
|
+
{ path: "/", element: lazy(() => import("../Pages/Home.js")) },
|
|
6
|
+
{ path: "/support", element: lazy(() => import("../Pages/Support.js")) },
|
|
7
|
+
{ path: "/*", element: lazy(() => import("../PageNotFound.js")) }, // Page Not Found route
|
|
8
|
+
// Add More Pages
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
export default routes;
|
package/src/App.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ARoutes from "./Routes/ARoutes";
|
|
3
|
+
import Header from "./Components/Header/Header.js";
|
|
4
|
+
import Footer from "./Components/Footer/Footer.js";
|
|
5
|
+
|
|
6
|
+
const isProduction = process.env.NODE_ENV === "production";
|
|
7
|
+
|
|
8
|
+
const Tail = () => (
|
|
9
|
+
<asggen
|
|
10
|
+
style={{ display: "none" }}
|
|
11
|
+
dangerouslySetInnerHTML={{
|
|
12
|
+
__html: `Rendering Asggen DOM...</asggen></asggenapp></body></html>`,
|
|
13
|
+
}}
|
|
14
|
+
/>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
function App({ context }) {
|
|
18
|
+
return (
|
|
19
|
+
<>
|
|
20
|
+
<Header />
|
|
21
|
+
<ARoutes context={context} />
|
|
22
|
+
<Footer />
|
|
23
|
+
{isProduction ? <Tail /> : null}
|
|
24
|
+
</>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default App;
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" ?><svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" fill="#ffffff"><path d="m11.293 17.293 1.414 1.414L19.414 12l-6.707-6.707-1.414 1.414L15.586 11H6v2h9.586z"/></svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import * as styles from "../../Style/MeshGradient.module.css";
|
|
3
|
+
|
|
4
|
+
const MeshGradient = ({ children }) => {
|
|
5
|
+
return (
|
|
6
|
+
<div className={styles.gradientWrap}>
|
|
7
|
+
<div className={styles.meshgradient}>
|
|
8
|
+
<div className={`${styles.color} ${styles.c1}`}></div>
|
|
9
|
+
<div className={`${styles.color} ${styles.c2}`}></div>
|
|
10
|
+
<div className={`${styles.color} ${styles.c3}`}></div>
|
|
11
|
+
<div className={`${styles.color} ${styles.c4}`}></div>
|
|
12
|
+
</div>
|
|
13
|
+
{children}
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default MeshGradient;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import * as styles from "../../Style/Style.module.css";
|
|
3
|
+
|
|
4
|
+
const Footer = () => {
|
|
5
|
+
return (
|
|
6
|
+
<footer className={styles.footer}>
|
|
7
|
+
<div className={styles.footerContainer}>
|
|
8
|
+
<div className={styles.footerBrand}>
|
|
9
|
+
<a href="/" className={styles.footerLogo}>
|
|
10
|
+
AFront
|
|
11
|
+
</a>
|
|
12
|
+
<p className={styles.footerDescription}>
|
|
13
|
+
Empowering front-end development with cutting-edge tools and
|
|
14
|
+
services.
|
|
15
|
+
</p>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div className={styles.footerLinks}>
|
|
19
|
+
<div className={styles.linkColumn}>
|
|
20
|
+
<h4 className={styles.footerTitle}>Company</h4>
|
|
21
|
+
<ul className={styles.linkList}>
|
|
22
|
+
<li>
|
|
23
|
+
<a href="/about" className={styles.link}>
|
|
24
|
+
About Us
|
|
25
|
+
</a>
|
|
26
|
+
</li>
|
|
27
|
+
<li>
|
|
28
|
+
<a href="/careers" className={styles.link}>
|
|
29
|
+
Careers
|
|
30
|
+
</a>
|
|
31
|
+
</li>
|
|
32
|
+
<li>
|
|
33
|
+
<a href="/contact" className={styles.link}>
|
|
34
|
+
Contact Us
|
|
35
|
+
</a>
|
|
36
|
+
</li>
|
|
37
|
+
</ul>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div className={styles.linkColumn}>
|
|
41
|
+
<h4 className={styles.footerTitle}>Resources</h4>
|
|
42
|
+
<ul className={styles.linkList}>
|
|
43
|
+
<li>
|
|
44
|
+
<a href="/blog" className={styles.link}>
|
|
45
|
+
Blog
|
|
46
|
+
</a>
|
|
47
|
+
</li>
|
|
48
|
+
<li>
|
|
49
|
+
<a href="/docs" className={styles.link}>
|
|
50
|
+
Documentation
|
|
51
|
+
</a>
|
|
52
|
+
</li>
|
|
53
|
+
<li>
|
|
54
|
+
<a href="/community" className={styles.link}>
|
|
55
|
+
Community
|
|
56
|
+
</a>
|
|
57
|
+
</li>
|
|
58
|
+
</ul>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div className={styles.linkColumn}>
|
|
62
|
+
<h4 className={styles.footerTitle}>Products</h4>
|
|
63
|
+
<ul className={styles.linkList}>
|
|
64
|
+
<li>
|
|
65
|
+
<a href="/features" className={styles.link}>
|
|
66
|
+
Features
|
|
67
|
+
</a>
|
|
68
|
+
</li>
|
|
69
|
+
<li>
|
|
70
|
+
<a href="/pricing" className={styles.link}>
|
|
71
|
+
Pricing
|
|
72
|
+
</a>
|
|
73
|
+
</li>
|
|
74
|
+
<li>
|
|
75
|
+
<a href="/support" className={styles.link}>
|
|
76
|
+
Support
|
|
77
|
+
</a>
|
|
78
|
+
</li>
|
|
79
|
+
</ul>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div className={styles.footerBottom}>
|
|
85
|
+
<p className={styles.footerCopy}>
|
|
86
|
+
© {new Date().getFullYear()} AFront by Asggen Inc. All rights
|
|
87
|
+
reserved.
|
|
88
|
+
</p>
|
|
89
|
+
<div className={styles.socialLinks}>
|
|
90
|
+
<a href="https://twitter.com" className={styles.socialLink}>
|
|
91
|
+
Twitter
|
|
92
|
+
</a>
|
|
93
|
+
<a href="https://facebook.com" className={styles.socialLink}>
|
|
94
|
+
Facebook
|
|
95
|
+
</a>
|
|
96
|
+
<a
|
|
97
|
+
href="https://www.linkedin.com/showcase/asggenchat/"
|
|
98
|
+
className={styles.socialLink}
|
|
99
|
+
>
|
|
100
|
+
LinkedIn
|
|
101
|
+
</a>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</footer>
|
|
105
|
+
);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export default Footer;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import React, { useState, useEffect } from "react";
|
|
2
|
+
import * as styles from "../../Style/Style.module.css";
|
|
3
|
+
|
|
4
|
+
const Header = () => {
|
|
5
|
+
const [isBurgerActive, setBurgerActive] = useState(false);
|
|
6
|
+
const [isScrolled, setScrolled] = useState(false);
|
|
7
|
+
|
|
8
|
+
// Toggle burger and menu
|
|
9
|
+
const toggleMenu = () => {
|
|
10
|
+
setBurgerActive(!isBurgerActive);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// Handle click on menu links
|
|
14
|
+
const closeMenu = () => {
|
|
15
|
+
setBurgerActive(false);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// Change header background on scrolling
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const handleScroll = () => {
|
|
21
|
+
setScrolled(window.scrollY >= 5);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
window.addEventListener("scroll", handleScroll);
|
|
25
|
+
|
|
26
|
+
return () => {
|
|
27
|
+
window.removeEventListener("scroll", handleScroll);
|
|
28
|
+
};
|
|
29
|
+
}, []);
|
|
30
|
+
|
|
31
|
+
// Fixed Navbar Menu on Window Resize
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
const handleResize = () => {
|
|
34
|
+
if (window.innerWidth > 768 && isBurgerActive) {
|
|
35
|
+
setBurgerActive(false);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
window.addEventListener("resize", handleResize);
|
|
40
|
+
|
|
41
|
+
return () => {
|
|
42
|
+
window.removeEventListener("resize", handleResize);
|
|
43
|
+
};
|
|
44
|
+
}, [isBurgerActive]);
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (isBurgerActive) {
|
|
48
|
+
document.body.style.overflow = "hidden";
|
|
49
|
+
} else {
|
|
50
|
+
document.body.style.overflow = "auto";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return () => {
|
|
54
|
+
document.body.style.overflow = "auto"; // Reset to default on unmount
|
|
55
|
+
};
|
|
56
|
+
}, [isBurgerActive]);
|
|
57
|
+
return (
|
|
58
|
+
<header
|
|
59
|
+
className={`header ${
|
|
60
|
+
isBurgerActive ? "off-scroll" : `${isScrolled ? "on-scroll" : ""}`
|
|
61
|
+
} `}
|
|
62
|
+
id="header"
|
|
63
|
+
>
|
|
64
|
+
<nav className="navbar container">
|
|
65
|
+
<a href="/" className="brand">
|
|
66
|
+
AFront
|
|
67
|
+
</a>
|
|
68
|
+
<div
|
|
69
|
+
className={`burger ${isBurgerActive ? "is-active" : ""}`}
|
|
70
|
+
id="burger"
|
|
71
|
+
onClick={toggleMenu}
|
|
72
|
+
>
|
|
73
|
+
<span className="burger-line"></span>
|
|
74
|
+
<span className="burger-line"></span>
|
|
75
|
+
<span className="burger-line"></span>
|
|
76
|
+
</div>
|
|
77
|
+
<div
|
|
78
|
+
className={`menu ${isBurgerActive ? "is-active " : "is-inactive"}`}
|
|
79
|
+
id="menu"
|
|
80
|
+
>
|
|
81
|
+
<ul className="menu-inner">
|
|
82
|
+
<li className="menu-item">
|
|
83
|
+
<a
|
|
84
|
+
href="#"
|
|
85
|
+
className={`menu-link ${
|
|
86
|
+
isBurgerActive ? "menu-link-mobile" : ""
|
|
87
|
+
}`}
|
|
88
|
+
onClick={closeMenu}
|
|
89
|
+
>
|
|
90
|
+
Learn
|
|
91
|
+
</a>
|
|
92
|
+
</li>
|
|
93
|
+
<li className="menu-item">
|
|
94
|
+
<a
|
|
95
|
+
href="#"
|
|
96
|
+
className={`menu-link ${
|
|
97
|
+
isBurgerActive ? "menu-link-mobile" : ""
|
|
98
|
+
}`}
|
|
99
|
+
onClick={closeMenu}
|
|
100
|
+
>
|
|
101
|
+
Feature
|
|
102
|
+
</a>
|
|
103
|
+
</li>
|
|
104
|
+
<li className="menu-item">
|
|
105
|
+
<a
|
|
106
|
+
href="#"
|
|
107
|
+
className={`menu-link ${
|
|
108
|
+
isBurgerActive ? "menu-link-mobile" : ""
|
|
109
|
+
}`}
|
|
110
|
+
onClick={closeMenu}
|
|
111
|
+
>
|
|
112
|
+
Blog
|
|
113
|
+
</a>
|
|
114
|
+
</li>
|
|
115
|
+
<li className="menu-item">
|
|
116
|
+
<a
|
|
117
|
+
href="/support"
|
|
118
|
+
className={`menu-link ${
|
|
119
|
+
isBurgerActive ? "menu-link-mobile" : ""
|
|
120
|
+
}`}
|
|
121
|
+
onClick={closeMenu}
|
|
122
|
+
>
|
|
123
|
+
Support
|
|
124
|
+
</a>
|
|
125
|
+
</li>
|
|
126
|
+
{isBurgerActive && (
|
|
127
|
+
<>
|
|
128
|
+
<li className="menu-item">
|
|
129
|
+
<a
|
|
130
|
+
href="#"
|
|
131
|
+
className={`menu-link ${
|
|
132
|
+
isBurgerActive ? "menu-link-mobile" : ""
|
|
133
|
+
}`}
|
|
134
|
+
onClick={closeMenu}
|
|
135
|
+
>
|
|
136
|
+
demo
|
|
137
|
+
</a>
|
|
138
|
+
</li>
|
|
139
|
+
</>
|
|
140
|
+
)}
|
|
141
|
+
</ul>
|
|
142
|
+
</div>
|
|
143
|
+
<a href="/" className="menu-block">
|
|
144
|
+
Get Started
|
|
145
|
+
</a>
|
|
146
|
+
</nav>
|
|
147
|
+
</header>
|
|
148
|
+
);
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
export default Header;
|
|
@@ -0,0 +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;
|
|
@@ -0,0 +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
|
+
|
|
20
|
+
export default PageNotFound;
|
|
@@ -0,0 +1,43 @@
|
|
|
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 className="main">
|
|
17
|
+
<section className="section banner banner-section">
|
|
18
|
+
<div className="container banner-column">
|
|
19
|
+
<img className="banner-image" src={tensorlabLogo} alt="banner" />
|
|
20
|
+
<div className="banner-inner">
|
|
21
|
+
<h1 className="heading-xl">
|
|
22
|
+
Empower Your Front-End with AFront
|
|
23
|
+
</h1>
|
|
24
|
+
<p className="paragraph">
|
|
25
|
+
AFront streamlines front-end development with robust tools and
|
|
26
|
+
<b> seamless server-side rendering (SSSR)</b>. Build dynamic,
|
|
27
|
+
high-performance web experiences effortlessly.
|
|
28
|
+
</p>
|
|
29
|
+
<div className="btn-darken-block">
|
|
30
|
+
<a href="/" className="btn-darken menu-block">
|
|
31
|
+
Get Started{" "}
|
|
32
|
+
<img className="btn-darken-arrow" src={arrowright} />
|
|
33
|
+
</a>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</section>
|
|
38
|
+
</main>
|
|
39
|
+
</MeshGradient>
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export default Home;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import HeadTags from "asggen-headtags";
|
|
3
|
+
import * as styles from "../Style/Support.module.css";
|
|
4
|
+
import MeshGradient from "../Components/Background/MeshGradient";
|
|
5
|
+
|
|
6
|
+
const Support = ({ context }) => {
|
|
7
|
+
const title = "Support - AFront";
|
|
8
|
+
const description =
|
|
9
|
+
"Get support for AFront, a front-end JavaScript library for seamless server-side rendering.";
|
|
10
|
+
const keywords = "support, AFront, server-side rendering, JavaScript";
|
|
11
|
+
HeadTags({ title, description, keywords, context });
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<MeshGradient>
|
|
15
|
+
<div className={styles.supportContainer}>
|
|
16
|
+
<h1 className={styles.supportTitle}>Need Assistance?</h1>
|
|
17
|
+
<p className={styles.supportDescription}>
|
|
18
|
+
AFront is a cutting-edge front-end JavaScript library designed for
|
|
19
|
+
seamless server-side rendering (SSR). We're committed to providing you
|
|
20
|
+
with top-notch support to ensure your experience is smooth and
|
|
21
|
+
productive.
|
|
22
|
+
</p>
|
|
23
|
+
<div className={styles.supportContent}>
|
|
24
|
+
<div className={styles.supportCard}>
|
|
25
|
+
<h2 className={styles.supportCardTitle}>Technical Assistance</h2>
|
|
26
|
+
<p className={styles.supportCardContent}>
|
|
27
|
+
Our dedicated technical support team is available around the clock
|
|
28
|
+
to resolve any issues you may face with AFront. Connect with us
|
|
29
|
+
through email or our support portal for prompt assistance.
|
|
30
|
+
</p>
|
|
31
|
+
</div>
|
|
32
|
+
<div className={styles.supportCard}>
|
|
33
|
+
<h2 className={styles.supportCardTitle}>Product Information</h2>
|
|
34
|
+
<p className={styles.supportCardContent}>
|
|
35
|
+
Curious about AFront’s capabilities? Reach out to our sales team
|
|
36
|
+
for detailed insights on features, benefits, and how our library
|
|
37
|
+
can enhance your web development projects.
|
|
38
|
+
</p>
|
|
39
|
+
</div>
|
|
40
|
+
<div className={styles.supportCard}>
|
|
41
|
+
<h2 className={styles.supportCardTitle}>Community and Forums</h2>
|
|
42
|
+
<p className={styles.supportCardContent}>
|
|
43
|
+
Join our vibrant community forums to discuss AFront with fellow
|
|
44
|
+
developers, exchange tips, and troubleshoot common issues
|
|
45
|
+
collaboratively.
|
|
46
|
+
</p>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
<div className={styles.supportFAQ}>
|
|
50
|
+
<h2 className={styles.supportCardTitle}>
|
|
51
|
+
Frequently Asked Questions
|
|
52
|
+
</h2>
|
|
53
|
+
<ul className={styles.faqList}>
|
|
54
|
+
<li>What is AFront and how does it work?</li>
|
|
55
|
+
<li>How do I get started with AFront?</li>
|
|
56
|
+
<li>Where can I find documentation and tutorials?</li>
|
|
57
|
+
<li>How can I report a bug or request a feature?</li>
|
|
58
|
+
</ul>
|
|
59
|
+
</div>
|
|
60
|
+
<a href="/" className={styles.footerLink}>
|
|
61
|
+
Back to Homepage
|
|
62
|
+
</a>
|
|
63
|
+
</div>
|
|
64
|
+
</MeshGradient>
|
|
65
|
+
);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export default Support;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React, { Suspense } from "react";
|
|
2
|
+
import { Route, Routes } from "react-router-dom";
|
|
3
|
+
import routes from "../ARoutes/AFRoutes.js";
|
|
4
|
+
import LoadingFallback from "../LoadingFallback.js";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
const ARoutes = ({ context }) => {
|
|
8
|
+
return (
|
|
9
|
+
<Suspense fallback={<LoadingFallback />}>
|
|
10
|
+
<Routes>
|
|
11
|
+
{/* Pages Routes */}
|
|
12
|
+
{routes.map(({ path, element: Element }, index) => (
|
|
13
|
+
<Route
|
|
14
|
+
key={index}
|
|
15
|
+
path={path}
|
|
16
|
+
element={<Element context={context} />}
|
|
17
|
+
/>
|
|
18
|
+
))}
|
|
19
|
+
{/* Pages Routes */}
|
|
20
|
+
</Routes>
|
|
21
|
+
</Suspense>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default ARoutes;
|