Compare commits

...

3 Commits

  1. 16
      index.html
  2. 90
      package-lock.json
  3. 5
      package.json
  4. BIN
      public/robot-logo.png
  5. BIN
      src/assets/images/robot-logo.png
  6. 1
      src/assets/react.svg
  7. 228
      src/pages/Animated.tsx
  8. 2
      src/pages/Home.tsx
  9. 10
      src/shared/components/Footer.tsx
  10. 83
      src/shared/components/Header.tsx
  11. 85
      src/shared/components/animated/Introduction.tsx
  12. 22
      src/shared/components/animated/MysteriousText.tsx
  13. 21
      src/shared/components/home/AboutSection.tsx
  14. 122
      src/shared/components/home/FirstSection.tsx
  15. 50
      src/shared/components/home/RoadMap.tsx
  16. 63
      src/shared/components/home/TokenomicsSection.tsx
  17. 12
      src/shared/providers/RouterProviderComponent.tsx
  18. 1
      tailwind.config.cjs

@ -1,23 +1,21 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/robot-logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>SGPT</title> <title>SGPT</title>
<link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link <link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300;400;500;600;700&display=swap"
href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
rel="stylesheet" <link href="https://fonts.googleapis.com/css2?family=Sen:wght@400;700&display=swap" rel="stylesheet" />
/>
<link
href="https://fonts.googleapis.com/css2?family=Sen:wght@400;700&display=swap"
rel="stylesheet"
/>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
<script type="module" src="/src/main.tsx"></script> <script type="module" src="/src/main.tsx"></script>
</body> </body>
</html> </html>

90
package-lock.json generated

@ -8,14 +8,15 @@
"name": "spgt-landing-page", "name": "spgt-landing-page",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@react-spring/parallax": "^9.7.1",
"@react-spring/web": "^9.7.1",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"match-sorter": "^6.3.1", "match-sorter": "^6.3.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-icons": "^4.7.1", "react-icons": "^4.7.1",
"react-router-dom": "^6.8.2", "react-router-dom": "^6.8.2",
"sort-by": "^0.0.2", "sort-by": "^0.0.2"
"tailwindcss-brand-colors": "^0.3.3"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "^18.0.27", "@types/react": "^18.0.27",
@ -427,6 +428,86 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/@react-spring/animated": {
"version": "9.7.1",
"resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.1.tgz",
"integrity": "sha512-EX5KAD9y7sD43TnLeTNG1MgUVpuRO1YaSJRPawHNRgUWYfILge3s85anny4S4eTJGpdp5OoFV2kx9fsfeo0qsw==",
"dependencies": {
"@react-spring/shared": "~9.7.1",
"@react-spring/types": "~9.7.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@react-spring/core": {
"version": "9.7.1",
"resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.1.tgz",
"integrity": "sha512-8K9/FaRn5VvMa24mbwYxwkALnAAyMRdmQXrARZLcBW2vxLJ6uw9Cy3d06Z8M12kEqF2bDlccaCSDsn2bSz+Q4A==",
"dependencies": {
"@react-spring/animated": "~9.7.1",
"@react-spring/rafz": "~9.7.1",
"@react-spring/shared": "~9.7.1",
"@react-spring/types": "~9.7.1"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/react-spring/donate"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@react-spring/parallax": {
"version": "9.7.1",
"resolved": "https://registry.npmjs.org/@react-spring/parallax/-/parallax-9.7.1.tgz",
"integrity": "sha512-1wBgDYaewB8CHdMWa2O3C2Cfvq2mt+neQLZz3+zHTH0CRUlbzC8Hsm78BCDiK8I1QzpLCtgwvv2rYAJchQuZ1A==",
"dependencies": {
"@react-spring/shared": "~9.7.1",
"@react-spring/web": "~9.7.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@react-spring/rafz": {
"version": "9.7.1",
"resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.1.tgz",
"integrity": "sha512-JSsrRfbEJvuE3w/uvU3mCTuWwpQcBXkwoW14lBgzK9XJhuxmscGo59AgJUpFkGOiGAVXFBGB+nEXtSinFsopgw=="
},
"node_modules/@react-spring/shared": {
"version": "9.7.1",
"resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.1.tgz",
"integrity": "sha512-R2kZ+VOO6IBeIAYTIA3C1XZ0ZVg/dDP5FKtWaY8k5akMer9iqf5H9BU0jyt3Qtxn0qQY7whQdf6MTcWtKeaawg==",
"dependencies": {
"@react-spring/rafz": "~9.7.1",
"@react-spring/types": "~9.7.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@react-spring/types": {
"version": "9.7.1",
"resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.1.tgz",
"integrity": "sha512-yBcyfKUeZv9wf/ZFrQszvhSPuDx6Py6yMJzpMnS+zxcZmhXPeOCKZSHwqrUz1WxvuRckUhlgb7eNI/x5e1e8CA=="
},
"node_modules/@react-spring/web": {
"version": "9.7.1",
"resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.1.tgz",
"integrity": "sha512-6uUE5MyKqdrJnIJqlDN/AXf3i8PjOQzUuT26nkpsYxUGOk7c+vZVPcfrExLSoKzTb9kF0i66DcqzO5fXz/Z1AA==",
"dependencies": {
"@react-spring/animated": "~9.7.1",
"@react-spring/core": "~9.7.1",
"@react-spring/shared": "~9.7.1",
"@react-spring/types": "~9.7.1"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@remix-run/router": { "node_modules/@remix-run/router": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.3.tgz", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.3.tgz",
@ -1521,11 +1602,6 @@
"postcss": "^8.0.9" "postcss": "^8.0.9"
} }
}, },
"node_modules/tailwindcss-brand-colors": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss-brand-colors/-/tailwindcss-brand-colors-0.3.3.tgz",
"integrity": "sha512-qNgt9e3q/1cF31jzQO5SRTfgJehqNKulgQx/ePpQgvxh8W5ATHzttW5MEOEZa6uyL4z92bk1YFHU2g6WfE9j6Q=="
},
"node_modules/tailwindcss/node_modules/postcss-import": { "node_modules/tailwindcss/node_modules/postcss-import": {
"version": "14.1.0", "version": "14.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",

@ -9,14 +9,15 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@react-spring/parallax": "^9.7.1",
"@react-spring/web": "^9.7.1",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"match-sorter": "^6.3.1", "match-sorter": "^6.3.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-icons": "^4.7.1", "react-icons": "^4.7.1",
"react-router-dom": "^6.8.2", "react-router-dom": "^6.8.2",
"sort-by": "^0.0.2", "sort-by": "^0.0.2"
"tailwindcss-brand-colors": "^0.3.3"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "^18.0.27", "@types/react": "^18.0.27",

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@ -0,0 +1,228 @@
import {
IParallax,
IParallaxLayer,
Parallax,
ParallaxLayer,
} from "@react-spring/parallax";
import { useScroll } from "@react-spring/web";
import React, { useEffect } from "react";
import { useRef } from "react";
import Introduction from "../shared/components/animated/Introduction";
import Footer from "../shared/components/Footer";
import Header from "../shared/components/Header";
import AboutSection from "../shared/components/home/AboutSection";
import RoadMap from "../shared/components/home/RoadMap";
import TokenomicsSection from "../shared/components/home/TokenomicsSection";
// Little helpers ...
const url = (name: string, wrap = false) =>
`${
wrap ? "url(" : ""
}https://awv3node-homepage.surge.sh/build/assets/${name}.svg${
wrap ? ")" : ""
}`;
function Animated() {
const parallax = useRef<IParallax>(null!);
const [isScrolled, setIsScrolled] = React.useState(false);
const onScroll = () => {
if (parallax.current.container.current.scrollTop > 0) {
setIsScrolled(true);
} else {
setIsScrolled(false);
}
};
useEffect(() => {
if (!parallax.current || !parallax.current.container) return;
parallax.current.container.current.onscroll = onScroll;
});
return (
<div className="w-full min-h-screen bg-[#253237]">
<Parallax ref={parallax} pages={4.2}>
<ParallaxLayer
sticky={{ start: 0, end: 4 }}
style={{ height: "fit-content" }}
>
<Header />
</ParallaxLayer>
<ParallaxLayer
offset={1}
speed={1}
style={{ backgroundColor: "#133955" }}
/>
<ParallaxLayer
offset={2}
speed={1}
style={{ backgroundColor: "#3A7575" }}
/>
<ParallaxLayer
offset={0}
speed={0}
factor={4}
style={{
backgroundImage: url("stars", true),
backgroundSize: "cover",
}}
/>
<ParallaxLayer offset={1} speed={0.8} style={{ opacity: 0.1 }}>
<img
src={url("cloud")}
style={{ display: "block", width: "20%", marginLeft: "55%" }}
/>
<img
src={url("cloud")}
style={{ display: "block", width: "10%", marginLeft: "15%" }}
/>
</ParallaxLayer>
<ParallaxLayer offset={1.75} speed={0.5} style={{ opacity: 0.1 }}>
<img
src={url("cloud")}
style={{ display: "block", width: "20%", marginLeft: "70%" }}
/>
<img
src={url("cloud")}
style={{ display: "block", width: "20%", marginLeft: "40%" }}
/>
</ParallaxLayer>
<ParallaxLayer offset={1} speed={0.2} style={{ opacity: 0.2 }}>
<img
src={url("cloud")}
style={{ display: "block", width: "10%", marginLeft: "10%" }}
/>
<img
src={url("cloud")}
style={{ display: "block", width: "20%", marginLeft: "75%" }}
/>
</ParallaxLayer>
<ParallaxLayer offset={1.6} speed={-0.1} style={{ opacity: 0.4 }}>
<img
src={url("cloud")}
style={{ display: "block", width: "20%", marginLeft: "60%" }}
/>
<img
src={url("cloud")}
style={{ display: "block", width: "25%", marginLeft: "30%" }}
/>
<img
src={url("cloud")}
style={{ display: "block", width: "10%", marginLeft: "80%" }}
/>
</ParallaxLayer>
<ParallaxLayer offset={2.6} speed={0.4} style={{ opacity: 0.6 }}>
<img
src={url("cloud")}
style={{ display: "block", width: "20%", marginLeft: "5%" }}
/>
<img
src={url("cloud")}
style={{ display: "block", width: "15%", marginLeft: "75%" }}
/>
</ParallaxLayer>
<ParallaxLayer
offset={2.5}
speed={-0.4}
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
pointerEvents: "none",
}}
></ParallaxLayer>
{/* <ParallaxLayer
offset={2}
speed={-0.3}
style={{
backgroundSize: "80%",
backgroundPosition: "center",
backgroundImage: url("clients", true),
}}
/> */}
{/* section 1 */}
<ParallaxLayer
offset={0}
speed={0.1}
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
id="section1"
onClick={() => parallax.current.scrollTo(1)}
onScroll={(e) => {
console.log("e", e);
}}
>
<Introduction />
</ParallaxLayer>
<ParallaxLayer
offset={1}
speed={0.1}
onClick={() => parallax.current.scrollTo(2)}
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
>
<AboutSection />
</ParallaxLayer>
<ParallaxLayer
offset={2}
speed={-0}
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
onClick={() => parallax.current.scrollTo(3)}
>
<RoadMap />
</ParallaxLayer>
<ParallaxLayer
offset={3}
speed={-0}
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
onClick={() => parallax.current.scrollTo(0)}
>
<TokenomicsSection />
</ParallaxLayer>
<ParallaxLayer
offset={4}
speed={-0}
style={{
display: "flex",
alignItems: "start",
justifyContent: "center",
backgroundColor: "#000000",
}}
onClick={() => parallax.current.scrollTo(0)}
>
<Footer />
</ParallaxLayer>
</Parallax>
</div>
);
}
export default Animated;

@ -7,7 +7,7 @@ type Props = {};
const Home = (props: Props) => { const Home = (props: Props) => {
return ( return (
<div className="flex flex-col gap-20"> <div className="flex flex-col gap-20 bg-[#253237]">
<FirstSection /> <FirstSection />
<AboutSection /> <AboutSection />
<RoadMap /> <RoadMap />

@ -4,7 +4,7 @@ type Props = {};
const Footer = (props: Props) => { const Footer = (props: Props) => {
return ( return (
<div className="container mx-auto flex justify-between text-white py-12"> <div className="container mx-auto md: px-4 flex flex-col gap-4 items-center md:flex-row justify-between text-white py-12">
<div className="md:w-1/4 flex gap-2 items-center"> <div className="md:w-1/4 flex gap-2 items-center">
<div className="bg-white rounded-full overflow-hidden p-1"> <div className="bg-white rounded-full overflow-hidden p-1">
<img <img
@ -22,10 +22,10 @@ const Footer = (props: Props) => {
</div> </div>
<div className="md:w-2/5 flex justify-between items-center"> <div className="md:w-2/5 flex justify-between items-center">
<p>NFT Systems</p> <p className="text-center">NFT Systems</p>
<p>Team</p> <p className="text-center">Team</p>
<p>Privacy Policy</p> <p className="text-center">Privacy Policy</p>
<p>Terms & Conditions</p> <p className="text-center">Terms & Conditions</p>
</div> </div>
</div> </div>
); );

@ -1,6 +1,6 @@
import React from "react"; import React, { useEffect } from "react";
import Button from "./Button"; import Button from "./Button";
import robotLogo from "../../assets/images/logo-robot.png"; import robotLogo from "../../assets/images/robot-logo.png";
import { BsNewspaper, BsGithub } from "react-icons/bs"; import { BsNewspaper, BsGithub } from "react-icons/bs";
import Whitepaper from "../../assets/Whitepaper.pdf"; import Whitepaper from "../../assets/Whitepaper.pdf";
type Props = {}; type Props = {};
@ -17,21 +17,33 @@ const menuItems = [
id: "about", id: "about",
}, },
{ {
name: "Tokenomics", name: "Roadmap",
path: "", path: "",
id: "tokenomics", id: "roadmap",
}, },
{ {
name: "Roadmap", name: "Tokenomics",
path: "", path: "",
id: "roadmap", id: "tokenomics",
}, },
]; ];
const Header = (props: Props) => { const Header = (props: Props) => {
const [isScrolled, setIsScrolled] = React.useState(false); const [isScrolled, setIsScrolled] = React.useState(false);
const [isOpenMenu, setIsOpenMenu] = React.useState(false);
const [isMobile, setIsMobile] = React.useState(false);
React.useEffect(() => { React.useEffect(() => {
// check is mobile
if (window.innerWidth <= 768) {
setIsMobile(true);
} else {
setIsMobile(false);
}
if (window.innerWidth <= 1024) {
setIsScrolled(true);
} else {
window.addEventListener("scroll", () => { window.addEventListener("scroll", () => {
if (window.scrollY > 0) { if (window.scrollY > 0) {
setIsScrolled(true); setIsScrolled(true);
@ -39,6 +51,7 @@ const Header = (props: Props) => {
setIsScrolled(false); setIsScrolled(false);
} }
}); });
}
}, []); }, []);
const jumpToSection = (section: string) => { const jumpToSection = (section: string) => {
@ -60,10 +73,10 @@ const Header = (props: Props) => {
<div className="fixed w-full z-30 p-1 transition-all duration-150 bg-gray-800"> <div className="fixed w-full z-30 p-1 transition-all duration-150 bg-gray-800">
<div className="container mx-auto flex justify-between items-center"> <div className="container mx-auto flex justify-between items-center">
<div className="flex gap-2 items-center"> <div className="flex gap-2 items-center">
<div className="bg-white rounded-full overflow-hidden p-1"> <div className="bg-white w-8 rounded-full overflow-hidden p-1">
<img <img
src={robotLogo} src={robotLogo}
className="w-6 transition-all duration-150 rounded-full" className="w-full transition-all duration-150 rounded-full"
alt="" alt=""
/> />
</div> </div>
@ -72,6 +85,18 @@ const Header = (props: Props) => {
</h4> </h4>
</div> </div>
{
// Mobile menu
isMobile ? (
<div
className="flex flex-col items-center gap-1 px-2 py-1 cursor-pointer"
onClick={() => setIsOpenMenu(!isOpenMenu)}
>
<div className="w-6 h-1 bg-white rounded-full"></div>
<div className="w-6 h-1 bg-white rounded-full"></div>
<div className="w-6 h-1 bg-white rounded-full"></div>
</div>
) : (
<div className="flex gap-10 items-center"> <div className="flex gap-10 items-center">
<ul className="flex gap-10"> <ul className="flex gap-10">
{menuItems.map((item) => ( {menuItems.map((item) => (
@ -102,16 +127,54 @@ const Header = (props: Props) => {
</Button> </Button>
</div> </div>
</div> </div>
)
}
{
// Mobile menu
isMobile && isOpenMenu ? (
<div className="fixed top-11 right-5 p-4 bg-gray-800 z-40 rounded-xl">
<div className="flex flex-col items-center justify-center h-full">
<ul className="flex flex-col gap-3">
{menuItems.map((item) => (
<li
className="inline-block"
key={item.path}
onClick={() => jumpToSection(item.id)}
>
<p className="text-white text-md transition-all duration-150 cursor-pointer">
{item.name}
</p>
</li>
))}
<li
className="inline-block"
onClick={() => openLocalPdf()}
>
<p className="text-white text-md transition-all duration-150 cursor-pointer">
Whitepaper
</p>
</li>
<li className="inline-block">
<p className="text-white text-md transition-all duration-150 cursor-pointer">
Audit
</p>
</li>
</ul>
</div>
</div>
) : null
}
</div> </div>
</div> </div>
) : ( ) : (
<div className="fixed z-30 w-full p-5 transition-all duration-150"> <div className="fixed z-30 w-full p-5 transition-all duration-150">
<div className="container mx-auto flex justify-between items-center"> <div className="container mx-auto flex justify-between items-center">
<div className="flex gap-2 items-center"> <div className="flex gap-2 items-center">
<div className="bg-white rounded-full overflow-hidden p-1"> <div className="bg-white w-12 rounded-full overflow-hidden p-1">
<img <img
src={robotLogo} src={robotLogo}
className="w-10 transition-all duration-150 rounded-full" className="w-full transition-all duration-150 rounded-full"
alt="" alt=""
/> />
</div> </div>

@ -0,0 +1,85 @@
import { useEffect } from "react";
import {
BsDiscord,
BsFacebook,
BsInstagram,
BsTelegram,
BsTwitter,
} from "react-icons/bs";
import Button from "../Button";
import MysteriousText from "./MysteriousText";
type Props = {};
const Introduction = (props: Props) => {
// create animate when user scroll to this section
useEffect(() => {
const section = document.getElementById("section1");
if (section) {
section.addEventListener("scroll", () => {
console.log("scroll");
});
}
}, []);
return (
<div
className="flex flex-col gap-10 items-center text-white p-10 lg:p-0 lg:w-3/4 max-w-4xl"
id="section1"
>
<h4 className="lg:text-8xl md:text-7xl font-extrabold text-transparent bg-clip-text bg-gradient-to-r from-purple-400 to-pink-600">
<MysteriousText>
A digital currency payment for SGPT chat bot services
</MysteriousText>
</h4>
<p className="w-full font-body text-transparent bg-clip-text bg-gradient-to-r from-sky-400 to-purple-300">
<MysteriousText>
The SGPT Token is a digital currency designed to facilitate payments
for services provided by the SGPT chat bot. The chat bot is a powerful
tool that utilizes artificial intelligence to communicate with users
and provide valuable information and services.
</MysteriousText>
</p>
<div className="flex flex-col justify-center mt-[15vh] z-50">
<h2 className="text-3xl mb-4 font-bold text-center">
Join Our Community
</h2>
<div className="flex flex-wrap gap-4">
<Button bgColor="bg-telegram">
<div className="flex items-center gap-2">
<BsTelegram size={18} />
Telegram
</div>
</Button>
<Button bgColor="bg-discord">
<div className="flex items-center gap-2">
<BsDiscord size={18} />
Discord
</div>
</Button>
<Button bgColor="bg-facebook">
<div className="flex items-center gap-2">
<BsFacebook size={18} />
Facebook
</div>
</Button>
<Button bgColor="bg-twitter">
<div className="flex items-center gap-2">
<BsTwitter size={18} />
Twitter
</div>
</Button>
<Button bgColor="bg-instagram">
<div className="flex items-center gap-2">
<BsInstagram size={18} />
Instagram
</div>
</Button>
</div>
</div>
</div>
);
};
export default Introduction;

@ -0,0 +1,22 @@
import { useSpring, animated } from "@react-spring/web";
import React from "react";
type Props = {
children: string;
};
const MysteriousText = ({ children, ...props }: Props) => {
const animation = (i: any) =>
useSpring({ opacity: 1, from: { opacity: 0 }, delay: Math.random() * 500 });
return (
<>
{children.split("").map((item, index) => (
<animated.span key={index} style={animation(index)} {...props}>
{item}
</animated.span>
))}
</>
);
};
export default MysteriousText;

@ -1,5 +1,6 @@
import React from "react"; import React from "react";
import aboutImage from "../../../assets/images/robot32.png"; import aboutImage from "../../../assets/images/robot32.png";
import MysteriousText from "../animated/MysteriousText";
type Props = {}; type Props = {};
const AboutSection = (props: Props) => { const AboutSection = (props: Props) => {
@ -11,23 +12,29 @@ const AboutSection = (props: Props) => {
<div <div
className="container mx-auto text-white py-20 flex relative" className="container mx-auto text-white py-20 flex relative"
id="about" id="about"
style={{
backgroundImage: `url(https://awv3node-homepage.surge.sh/build/assets/stars.svg)}`,
}}
> >
<div className="flex flex-col justify-center gap-10 lg:w-1/2 w-full px-8"> <div className="flex flex-col justify-center gap-10 lg:w-1/2 w-full px-8">
<div className="flex flex-col gap-4"> <div className="flex flex-col gap-4">
<h4 className="text-5xl uppercase font-bold">What is SGPT?</h4> <h4 className="text-5xl uppercase font-bold">What is SGPT?</h4>
<p className="text-gray-300 md:w-4/5 text-lg"> <p className="text-gray-100 md:w-4/5 text-lg">
<MysteriousText>
SGPT Token is a complementary token created on the blockchain SGPT Token is a complementary token created on the blockchain
platform to provide a platform for small and medium-sized businesses platform to provide a platform for small and medium-sized
(SMBs) to create and manage an internal Q&A system. SGPT Token will businesses (SMBs) to create and manage an internal Q&A system.
be used to conduct transactions on the platform and provide benefits SGPT Token will be used to conduct transactions on the platform
to members of the internal Q&A system. SGPT Token will also be used and provide benefits to members of the internal Q&A system. SGPT
to reward members who make positive contributions to the system. Token will also be used to reward members who make positive
contributions to the system.
</MysteriousText>
</p> </p>
</div> </div>
<div className="flex flex-col gap-4"> <div className="flex flex-col gap-4">
<h4 className="text-5xl uppercase font-bold">SGPT Solution</h4> <h4 className="text-5xl uppercase font-bold">SGPT Solution</h4>
<p className="text-gray-300 md:w-4/5 text-lg"> <p className="text-gray-100 md:w-4/5 text-lg">
The SGPT Token is a solution to the problems associated with The SGPT Token is a solution to the problems associated with
traditional payment methods for chat bot services. The token is traditional payment methods for chat bot services. The token is
built on blockchain technology, which ensures that transactions are built on blockchain technology, which ensures that transactions are

@ -11,6 +11,40 @@ import {
} from "react-icons/bs"; } from "react-icons/bs";
import { MdContentCopy } from "react-icons/md"; import { MdContentCopy } from "react-icons/md";
import { useSprings, useSpring, animated } from "@react-spring/web";
const socials = [
{
name: "Telegram",
icon: <BsTelegram />,
link: "https://twitter.com/SGPT_SmartAi",
background: "bg-[#2ca5e0]",
},
{
name: "Twitter",
icon: <BsTwitter />,
link: "https://twitter.com/SGPT_SmartAi",
background: "bg-[#1da1f2]",
},
{
name: "Discord",
icon: <BsDiscord />,
link: "https://discord.com/invite/NNHV8JHBhk",
background: "bg-[#7289da]",
},
{
name: "Facebook",
icon: <BsFacebook />,
link: "https://www.facebook.com/SGPTSmartAi",
background: "bg-[#3b5998]",
},
{
name: "Instagram",
icon: <BsInstagram />,
link: "https://www.instagram.com/sgpt_smartai/",
background: "bg-[#e1306c]",
},
];
const FirstSection = () => { const FirstSection = () => {
const address = "0x3c97331438e90680a17c35905ffc2b8ef760f844"; const address = "0x3c97331438e90680a17c35905ffc2b8ef760f844";
@ -21,10 +55,16 @@ const FirstSection = () => {
const copyToClipboard = (address: string) => { const copyToClipboard = (address: string) => {
navigator.clipboard.writeText(address); navigator.clipboard.writeText(address);
}; };
const springs = useSpring({
from: { opacity: 0 },
to: { opacity: 1 },
});
return ( return (
<div <animated.div
className="min-h-screen flex bg-cover bg-center bg-no-repeat relative" className="lg:min-h-screen px-10 lg:px-0 flex bg-cover bg-center bg-no-repeat relative"
id="home" id="home"
style={springs}
> >
<div <div
style={{ backgroundImage: `url(${robotBgr})` }} style={{ backgroundImage: `url(${robotBgr})` }}
@ -32,12 +72,12 @@ const FirstSection = () => {
></div> ></div>
<div className="absolute top-0 left-0 w-full h-full bg-black opacity-60"></div> <div className="absolute top-0 left-0 w-full h-full bg-black opacity-60"></div>
<div className="container flex mx-auto min-h-[70vh] text-white z-20 mt-20"> <div className="container flex mx-auto min-h-[70vh] text-white z-20 mt-20">
<div className="md:w-4/5 flex flex-col justify-center lg:pb-48 gap-14 pb-20 z-50"> <div className="lg:w-4/5 flex flex-col justify-center lg:pb-48 gap-14 pb-20 z-50">
<div className="flex flex-col gap-10"> <div className="flex flex-col gap-10">
<h4 className="w-3/4 lg:text-8xl text-7xl font-bold"> <h4 className="lg:w-3/4 lg:text-8xl md:text-7xl text-5xl font-bold">
A digital currency payment for SGPT chat bot services. A digital currency payment for SGPT chat bot services
</h4> </h4>
<p className="lg:w-2/3 font-body"> <p className="lg:w-2/3 w-full font-body">
The SGPT Token is a digital currency designed to facilitate The SGPT Token is a digital currency designed to facilitate
payments for services provided by the SGPT chat bot. The chat bot payments for services provided by the SGPT chat bot. The chat bot
is a powerful tool that utilizes artificial intelligence to is a powerful tool that utilizes artificial intelligence to
@ -48,41 +88,23 @@ const FirstSection = () => {
<div> <div>
<h2 className="text-3xl mb-4 font-bold">Join Our Community</h2> <h2 className="text-3xl mb-4 font-bold">Join Our Community</h2>
<div className="flex w-2/3 flex-wrap gap-4"> <div className="flex lg:w-2/3 flex-wrap gap-4">
<Button bgColor="bg-telegram"> {socials.map((social) => (
<div className="flex items-center gap-2"> <Button
<BsTelegram size={18} /> bgColor={social.background}
Telegram key={social.name}
</div> onClick={() => window.open(social.link, "_blank")}
</Button> >
<Button bgColor="bg-discord">
<div className="flex items-center gap-2">
<BsDiscord size={18} />
Discord
</div>
</Button>
<Button bgColor="bg-facebook">
<div className="flex items-center gap-2">
<BsFacebook size={18} />
Facebook
</div>
</Button>
<Button bgColor="bg-twitter">
<div className="flex items-center gap-2">
<BsTwitter size={18} />
Twitter
</div>
</Button>
<Button bgColor="bg-instagram">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<BsInstagram size={18} /> {social.icon}
Instagram {social.name}
</div> </div>
</Button> </Button>
))}
</div> </div>
</div> </div>
</div> </div>
<div className="md:w-1/5 flex justify-center items-center relative"> <div className="lg:w-1/5 hidden lg:flex justify-center items-center relative">
<img <img
src={robotImage2} src={robotImage2}
className="object-cover absolute -left-40 border-4 backdrop-blur-sm shadow-2xl shadow-cyan-300 border-cyan-500 rounded-full w-full aspect-square" className="object-cover absolute -left-40 border-4 backdrop-blur-sm shadow-2xl shadow-cyan-300 border-cyan-500 rounded-full w-full aspect-square"
@ -99,35 +121,7 @@ const FirstSection = () => {
<div className="absolute w-10 aspect-square bg-[radial-gradient(ellipse_at_bottom,_var(--tw-gradient-stops))] from-sky-400 to-indigo-900 blur-sm rounded-full bottom-56 right-10"></div> <div className="absolute w-10 aspect-square bg-[radial-gradient(ellipse_at_bottom,_var(--tw-gradient-stops))] from-sky-400 to-indigo-900 blur-sm rounded-full bottom-56 right-10"></div>
</div> </div>
</div> </div>
{/* <div className="w-full h-full bg-black absolute opacity-75 z-10"></div> */} </animated.div>
<div className="absolute z-50 rounded-full border-2 p-7 overflow-hidden text-white flex gap-4 items-center bottom-10 left-1/2 -translate-x-1/2 max-w-4xl min-h-[80px] mx-auto container">
<div className="w-1/3 flex items-center gap-3 justify-center font-semibold">
<p>{truncateAddress(address)}</p>
<button
className="hover:cursor-pointer bg-white/50 text-white rounded-full p-2"
onClick={() => copyToClipboard(address)}
type="button"
>
<MdContentCopy size={18} />
</button>
</div>
<div className="w-1/3 flex justify-center items-center gap-3 font-semibold">
<p>{truncateAddress(address)}</p>
<button
className="hover:cursor-pointer bg-white/50 text-white rounded-full p-2"
onClick={() => copyToClipboard(address)}
type="button"
>
<MdContentCopy size={18} />
</button>
</div>
<div className="w-1/3 flex justify-center font-semibold">
Audited By
</div>
</div>
</div>
); );
}; };

@ -1,4 +1,5 @@
import React from "react"; import { useSpring, animated } from "@react-spring/web";
import React, { useEffect, useRef, useState } from "react";
import { VscDebugBreakpointLog } from "react-icons/vsc"; import { VscDebugBreakpointLog } from "react-icons/vsc";
type Props = {}; type Props = {};
@ -40,16 +41,53 @@ const roadMapData = [
]; ];
const RoadMap = (props: Props) => { const RoadMap = (props: Props) => {
const [isVisible, setIsVisible] = useState(false);
useEffect(() => {
const section = document.querySelector(".animate-on-scroll");
const observer = new IntersectionObserver(
([entry]) => {
setIsVisible(entry.isIntersecting);
},
{ threshold: 0.5 }
);
if (!section) {
return;
}
observer.observe(section);
return () => {
observer.unobserve(section);
};
}, []);
useEffect(() => {
console.log("isVisible", isVisible);
}, [isVisible]);
const styles = useSpring({
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(100px)",
config: {
duration: 500,
},
});
return ( return (
<div className="container mx-auto text-white md:min-h-[60vh]" id="roadmap"> <div
className="container mx-auto text-white md:min-h-[60vh] animate-on-scroll py-20"
id="roadmap"
>
<h1 className="text-5xl font-bold text-center">RoadMap</h1> <h1 className="text-5xl font-bold text-center">RoadMap</h1>
<div className="flex gap-10 mt-20 justify-center"> <div className="flex flex-col lg:flex-row gap-10 mt-20 justify-center px-10 lg:px-0">
{roadMapData.map((item, index) => { {roadMapData.map((item, index) => {
return ( return (
<div <animated.div
key={index} key={index}
className="w-1/4 bg-[conic-gradient(at_left,_var(--tw-gradient-stops))] from-orange-400 to-rose-400 rounded-lg min-h-[250px] p-5" className="lg:w-1/4 bg-[#E24666] rounded-lg min-h-[250px] p-5"
style={styles}
> >
<h4 className="text-center text-3xl text-gray-100 font-semibold mb-6"> <h4 className="text-center text-3xl text-gray-100 font-semibold mb-6">
{item.phase} {item.phase}
@ -64,7 +102,7 @@ const RoadMap = (props: Props) => {
); );
})} })}
</ol> </ol>
</div> </animated.div>
); );
})} })}
</div> </div>

@ -1,3 +1,5 @@
import { useSpring, animated } from "@react-spring/web";
import { useEffect, useState } from "react";
import tokenomicChart from "../../../assets/images/tokenomic-chart.png"; import tokenomicChart from "../../../assets/images/tokenomic-chart.png";
type Props = {}; type Props = {};
@ -46,25 +48,68 @@ const tokenomics = [
]; ];
const TokenomicsSection = (props: Props) => { const TokenomicsSection = (props: Props) => {
const [isVisible, setIsVisible] = useState(true);
useEffect(() => {
const section = document.querySelector("#tokenomics");
const observer = new IntersectionObserver(
([entry]) => {
setIsVisible(entry.isIntersecting);
},
{ threshold: 0.5 }
);
if (!section) {
return;
}
observer.observe(section);
return () => {
observer.unobserve(section);
};
}, []);
useEffect(() => {
console.log("isVisible", isVisible);
}, [isVisible]);
const styles = useSpring({
opacity: isVisible ? 1 : 0,
from: {
opacity: 0,
transform: "translateY(100px)",
},
to: {
opacity: isVisible ? 1 : 0,
transform: "translateY(0px)",
},
config: {
duration: 500,
},
});
return ( return (
<div className="w-full bg-white py-24" id="tokenomics"> <div className="w-full py-24" id="tokenomics">
<div className="container mx-auto"> <div className="container mx-auto">
<h1 className="text-5xl font-bold text-center text-black mb-20"> <h1 className="text-5xl text-white font-bold text-center mb-20">
Tokenomics Tokenomics
</h1> </h1>
<div className="w-full flex flex-col md:flex-row"> <div className="w-full flex flex-col gap-4 lg:flex-row">
<div className="md:w-1/2"> <div className="lg:w-1/2 flex justify-center">
<img src={tokenomicChart} alt="" /> <img src={tokenomicChart} alt="" className="rounded-3xl w-[80%]" />
</div> </div>
<div className="md:w-1/2"> <div className="lg:w-1/2">
<ul className="flex flex-col items-end justify-center h-full gap-3 px-3"> <ul className="flex flex-col items-end justify-center h-full gap-3 px-3">
{tokenomics.map((item, index) => { {tokenomics.map((item, index) => {
return ( return (
<li <animated.li
key={index} key={index}
className={`text-center w-full md:w-2/3 bg-slate-200 py-3 relative`} className={`text-center w-full lg:w-2/3 bg-slate-200 py-3 relative`}
style={{
...styles,
}}
> >
<div <div
className={`absolute h-full top-0 w-2 ${item.color}`} className={`absolute h-full top-0 w-2 ${item.color}`}
@ -73,7 +118,7 @@ const TokenomicsSection = (props: Props) => {
{item.title} {item.title}
</h4> </h4>
<p className="text-gray-500">{item.description}</p> <p className="text-gray-500">{item.description}</p>
</li> </animated.li>
); );
})} })}
</ul> </ul>

@ -1,4 +1,5 @@
import { createBrowserRouter, RouterProvider } from "react-router-dom"; import { createBrowserRouter, RouterProvider } from "react-router-dom";
import Animated from "../../pages/Animated";
import Home from "../../pages/Home"; import Home from "../../pages/Home";
import HomeLayout from "../components/layouts/HomeLayout"; import HomeLayout from "../components/layouts/HomeLayout";
@ -6,7 +7,16 @@ const router = createBrowserRouter([
{ {
path: "/", path: "/",
element: <HomeLayout />, element: <HomeLayout />,
children: [{ path: "", element: <Home /> }], children: [
{
path: "animated",
element: <Animated />,
},
{
path: "",
element: <Home />,
},
],
}, },
]); ]);
const RouterProviderComponent = () => { const RouterProviderComponent = () => {

@ -14,6 +14,5 @@ module.exports = {
tailwindcss: {}, tailwindcss: {},
autoprefixer: {}, autoprefixer: {},
}, },
require("tailwindcss-brand-colors"),
], ],
}; };

Loading…
Cancel
Save