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.
Files changed (75) hide show
  1. package/.babelrc +14 -0
  2. package/.env +2 -0
  3. package/LICENSE +21 -0
  4. package/README.md +72 -0
  5. package/build-prod/favicon.ico +0 -0
  6. package/build-prod/index.html +1 -0
  7. package/build-prod/logo192.png +0 -0
  8. package/build-prod/logo512.png +0 -0
  9. package/build-prod/manifest.json +25 -0
  10. package/build-prod/robots.txt +3 -0
  11. package/build-prod/static/css/3-9b9bcf0b9b877caf80c6.css +1 -0
  12. package/build-prod/static/css/41-1bd05b5a5a70ee2fc084.css +1 -0
  13. package/build-prod/static/css/573-7b8794ea227293d474c9.css +1 -0
  14. package/build-prod/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
  15. package/build-prod/static/js/3-cde9f071488e7a433907.js +1 -0
  16. package/build-prod/static/js/41-e973a17863e1084774d7.js +1 -0
  17. package/build-prod/static/js/573-21fb9ccdf567d99f4539.js +1 -0
  18. package/build-prod/static/js/main-cc87f2505014acdf4863.js +1 -0
  19. package/build-prod/static/media/52f06bb716d4ecad087a.png +0 -0
  20. package/build-prod/static/media/adeaead125c45715106d.svg +1 -0
  21. package/build-prod/style.css +1 -0
  22. package/build-prod-ssr/3.ssr.prod.js +1 -0
  23. package/build-prod-ssr/41.ssr.prod.js +1 -0
  24. package/build-prod-ssr/573.ssr.prod.js +1 -0
  25. package/build-prod-ssr/ssr.prod.js +1 -0
  26. package/build-prod-ssr/static/css/3-9b9bcf0b9b877caf80c6.css +1 -0
  27. package/build-prod-ssr/static/css/41-1bd05b5a5a70ee2fc084.css +1 -0
  28. package/build-prod-ssr/static/css/573-7b8794ea227293d474c9.css +1 -0
  29. package/build-prod-ssr/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
  30. package/build-prod-ssr/static/media/52f06bb716d4ecad087a.png +0 -0
  31. package/build-prod-ssr/static/media/adeaead125c45715106d.svg +1 -0
  32. package/build-prod-static/favicon.ico +0 -0
  33. package/build-prod-static/index.html +1 -0
  34. package/build-prod-static/logo192.png +0 -0
  35. package/build-prod-static/logo512.png +0 -0
  36. package/build-prod-static/manifest.json +25 -0
  37. package/build-prod-static/robots.txt +3 -0
  38. package/build-prod-static/static/css/23-1bd05b5a5a70ee2fc084.css +1 -0
  39. package/build-prod-static/static/css/303-9b9bcf0b9b877caf80c6.css +1 -0
  40. package/build-prod-static/static/css/636-7b8794ea227293d474c9.css +1 -0
  41. package/build-prod-static/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
  42. package/build-prod-static/static/js/23-8e7dbd8910931f545fd9.js +1 -0
  43. package/build-prod-static/static/js/303-1db8abbd7d266bdc27c7.js +1 -0
  44. package/build-prod-static/static/js/636-8a26bc803f853c7ddf82.js +1 -0
  45. package/build-prod-static/static/js/main-709b08b8e9e528bab63c.js +1 -0
  46. package/build-prod-static/static/media/52f06bb716d4ecad087a.png +0 -0
  47. package/build-prod-static/static/media/adeaead125c45715106d.svg +1 -0
  48. package/build-prod-static/style.css +1 -0
  49. package/install.js +91 -0
  50. package/package.json +72 -0
  51. package/server.js +20 -0
  52. package/src/ARoutes/AFRoutes.js +11 -0
  53. package/src/App.js +28 -0
  54. package/src/Assets/images/afront.png +0 -0
  55. package/src/Assets/images/arrow-right.svg +1 -0
  56. package/src/Components/Background/MeshGradient.js +18 -0
  57. package/src/Components/Footer/Footer.js +108 -0
  58. package/src/Components/Header/Header.js +151 -0
  59. package/src/LoadingFallback.js +13 -0
  60. package/src/PageNotFound.js +20 -0
  61. package/src/Pages/Home.js +43 -0
  62. package/src/Pages/Support.js +68 -0
  63. package/src/Routes/ARoutes.js +25 -0
  64. package/src/Static/appStatic.js +26 -0
  65. package/src/Static/indexStatic.js +10 -0
  66. package/src/Style/App.module.css +11 -0
  67. package/src/Style/MeshGradient.module.css +130 -0
  68. package/src/Style/PageNotFound.module.css +37 -0
  69. package/src/Style/Style.module.css +685 -0
  70. package/src/Style/Support.module.css +185 -0
  71. package/src/index.js +29 -0
  72. package/webpack.build-prod.js +110 -0
  73. package/webpack.dev.js +87 -0
  74. package/webpack.prod.js +120 -0
  75. 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;