diff --git a/src/App.tsx b/src/App.tsx index 5bcc66c..2a1cce2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import RouterProviderComponent from "./shared/providers/RouterProviderComponent"; function App() { diff --git a/src/i18n/en/qna.json b/src/i18n/en/qna.json new file mode 100644 index 0000000..d86defb --- /dev/null +++ b/src/i18n/en/qna.json @@ -0,0 +1,115 @@ +{ + "data": [ + { + "id": 1, + "title": "What is Fight Out?", + "bgcolor": "bg-[#CC99FF]", + "contents": [ + { + "id": 1, + "content": "Fight Out is changing the blueprint for metaverses. At its heart, Fight Out is a gaming platform that rewards users for competing and winning in a variety of contest modes. A player's ability to compete and how much they are rewarded is determined in part by their avatar’s attributes. Stats are increased through the Fight Out app by training in real -life.", + "bgcolor": "bg-[#9999FF]" + }, + { + "id": 2, + "content": "Fight Out is changing the blueprint for metaverses. At its heart, Fight Out is a gaming platform that rewards users for competing and winning in a variety of contest modes. A player's ability to compete and how much they are rewarded is determined in part by their avatar’s attributes. Stats are increased through the Fight Out app by training in real -life.", + "bgcolor": "bg-[#6699FF]" + }, + { + "id": 3, + "content": "Fight Out is changing the blueprint for metaverses. At its heart, Fight Out is a gaming platform that rewards users for competing and winning in a variety of contest modes. A player's ability to compete and how much they are rewarded is determined in part by their avatar’s attributes. Stats are increased through the Fight Out app by training in real -life.", + "bgcolor": "bg-[#3399FF]" + }, + { + "id": 4, + "content": "Fight Out is changing the blueprint for metaverses. At its heart, Fight Out is a gaming platform that rewards users for competing and winning in a variety of contest modes. A player's ability to compete and how much they are rewarded is determined in part by their avatar’s attributes. Stats are increased through the Fight Out app by training in real -life.", + "bgcolor": "bg-[#0099FF]" + } + ] + }, + { + "id": 2, + "title": "Abcd", + "bgcolor": "bg-[#CC66FF]", + + "contents": [ + { + "id": 1, + "bgcolor": "bg-[#9966FF]", + "content": "ádasffjk12" + }, + { + "id": 2, + "bgcolor": "bg-[#6666FF]", + "content": "ádasffj1k" + }, + { + "id": 3, + "bgcolor": "bg-[#3366FF]", + "content": "ádasffj12k" + }, + { + "id": 4, + "bgcolor": "bg-[#0066FF]", + "content": "ádasffj123k" + } + ] + }, + { + "id": 3, + "title": "Abcd", + "bgcolor": "bg-[#CC66FF]", + + "contents": [ + { + "id": 1, + "bgcolor": "bg-[#9966FF]", + "content": "ádasffjk12" + }, + { + "id": 2, + "bgcolor": "bg-[#6666FF]", + "content": "ádasffj1k" + }, + { + "id": 3, + "bgcolor": "bg-[#3366FF]", + "content": "ádasffj12k" + }, + { + "id": 4, + "bgcolor": "bg-[#0066FF]", + "content": "ádasffj123k" + } + ] + }, + { + "id": 4, + "title": "Abcd", + "bgcolor": "bg-[#CC66FF]", + + "contents": [ + { + "id": 1, + "bgcolor": "bg-[#9966FF]", + "content": "ádasffjk12" + }, + { + "id": 2, + "bgcolor": "bg-[#6666FF]", + "content": "ádasffj1k" + }, + { + "id": 3, + "bgcolor": "bg-[#3366FF]", + "content": "ádasffj12k" + }, + { + "id": 4, + "bgcolor": "bg-[#0066FF]", + "content": "ádasffj123k" + } + ] + } + ] +} diff --git a/src/i18n/en/roadmap.json b/src/i18n/en/roadmap.json new file mode 100644 index 0000000..abfb529 --- /dev/null +++ b/src/i18n/en/roadmap.json @@ -0,0 +1,57 @@ +{ + "array": [ + { + "phase": "Phase 1", + "listTitle": [ + "Development of CEO Ideology", + "Website Development and Release", + "Whitepaper Launch", + "Subscription Presale", + "Marketing Partners Advisory Board Formed" + ] + }, + { + "phase": "Phase 2", + "listTitle": [ + "CEO DEX Token Launch", + "Massive Marketing Campaign", + "Real Time Suprise Buybacks", + "NFT Staking and APR Staking Launch", + "5 Million Marketcap Milestone CoinGecko Listing" + ] + }, + { + "phase": "Phase 3", + "listTitle": [ + "Swap Development and Launch", + "Merchandise Launch", + "Tier 1 CEX Listings", + "CEO Bridge to ETH, Arbitrium and Polygon", + "10 Million MarketCap Milestone", + "CEOAI Bot Creator and integration with AI." + ] + }, + { + "phase": "Phase 4", + "listTitle": [ + "Swap Development and Launch", + "Merchandise Launch", + "Tier 1 CEX Listings", + "CEO Bridge to ETH, Arbitrium and Polygon", + "10 Million MarketCap Milestone", + "CEOAI Bot Creator and integration with AI." + ] + }, + { + "phase": "Phase 5", + "listTitle": [ + "Swap Development and Launch", + "Merchandise Launch", + "Tier 1 CEX Listings", + "CEO Bridge to ETH, Arbitrium and Polygon", + "10 Million MarketCap Milestone", + "CEOAI Bot Creator and integration with AI." + ] + } + ] +} diff --git a/src/i18n/i18n.ts b/src/i18n/i18n.ts index 6b37f92..3cb22b8 100644 --- a/src/i18n/i18n.ts +++ b/src/i18n/i18n.ts @@ -1,18 +1,30 @@ import i18n from "i18next"; import { useTranslation, initReactI18next } from "react-i18next"; -import FirstSection_EN from "./en/firstSection.json" -import FirstSection_VI from "./vi/firstSection.json" +import FirstSection_EN from "./en/firstSection.json"; +import FirstSection_VI from "./vi/firstSection.json"; +import AboutSection_EN from "./en/aboutSection.json"; +import AboutSection_VI from "./vi/aboutSection.json"; +import RoadMap_EN from "./en/roadmap.json"; +import RoadMap_VI from "./vi/roadmap.json"; +import QnA_EN from "./en/qna.json"; +import QnA_VI from "./vi/qna.json"; + export const locales = { - en: 'English', - vi: 'Việt Nam' -} + en: "English", + vi: "Việt Nam", +}; export const resources = { en: { - firstSection: FirstSection_EN + firstSection: FirstSection_EN, + aboutSection: AboutSection_EN, + roadmap: RoadMap_EN, + qna: QnA_EN, }, vi: { - firstSection: FirstSection_VI - + firstSection: FirstSection_VI, + aboutSection: AboutSection_VI, + roadmap: RoadMap_VI, + qna: QnA_VI, }, }; i18n.use(initReactI18next).init({ diff --git a/src/i18n/vi/aboutSection.json b/src/i18n/vi/aboutSection.json index 33830ad..736a508 100644 --- a/src/i18n/vi/aboutSection.json +++ b/src/i18n/vi/aboutSection.json @@ -1,7 +1,6 @@ { - "title1": "SGPT là gì?", - "title2": "Giải pháp SGPT ", - "content1": "SGPT Token là mã thông báo bổ sung được tạo trên nền tảng chuỗi khối để cung cấp nền tảng cho các doanh nghiệp vừa và nhỏ (SMBs) tạo và quản lý hệ thống hỏi đáp nội bộ. SGPT token sẽ được sử dụng để thực hiện các giao dịch trên nền tảng và cung cấp lợi ích cho các thành viên của hệ thống hỏi đáp nội bộ. SGPT token cũng sẽ được sử dụng để thưởng cho các thành viên có đóng góp tích cực cho hệ thống.", - "content2": "SGPT Token là một giải pháp cho các vấn đề liên quan đến phương thức thanh toán truyền thống cho các dịch vụ chatbot trò chuyện. Mã thông báo được xây dựng trên công nghệ chuỗi khối, đảm bảo rằng các giao dịch diễn ra nhanh chóng, an toàn và minh bạch. Hơn nữa, việc sử dụng SGPT Token giúp loại bỏ nhu cầu về các phương thức thanh toán truyền thống, thường tốn kém và bất tiện." - -} \ No newline at end of file + "title1": "SGPT là gì?", + "title2": "Giải pháp SGPT ", + "content1": "SGPT Token là một mã thông báo bổ sung được tạo trên nền tảng chuỗi khối để cung cấp nền tảng cho các doanh nghiệp vừa và nhỏ (SMBs) tạo và quản lý hệ thống hỏi đáp nội bộ. SGPT Token sẽ được sử dụng để thực hiện các giao dịch trên nền tảng và cung cấp lợi ích cho các thành viên của hệ thống hỏi đáp nội bộ. SGPT Token cũng sẽ được sử dụng để thưởng cho các thành viên có đóng góp tích cực cho hệ thống.", + "content2": "SGPT Token là một giải pháp cho các vấn đề liên quan đến phương thức thanh toán truyền thống cho các dịch vụ chatbot trò chuyện. Mã thông báo được xây dựng trên công nghệ chuỗi khối, đảm bảo rằng các giao dịch diễn ra nhanh chóng, an toàn và minh bạch. Hơn nữa, việc sử dụng SGPT Token giúp loại bỏ nhu cầu về các phương thức thanh toán truyền thống, thường tốn kém và bất tiện." +} diff --git a/src/i18n/vi/qna.json b/src/i18n/vi/qna.json new file mode 100644 index 0000000..13672dc --- /dev/null +++ b/src/i18n/vi/qna.json @@ -0,0 +1,115 @@ +{ + "data": [ + { + "id": 1, + "title": "Fight Out là gì?", + "bgcolor": "bg-[#CC99FF]", + "contents": [ + { + "id": 1, + "content": "Fight Out đang thay đổi kế hoạch chi tiết cho metaverse. Về bản chất, Fight Out là một nền tảng trò chơi thưởng cho người dùng khi thi đấu và giành chiến thắng trong nhiều chế độ thi đấu. Khả năng cạnh tranh của người chơi và số tiền họ được thưởng được xác định một phần bởi các thuộc tính của hình đại diện của họ. Chỉ số được tăng lên thông qua ứng dụng Fight Out bằng cách luyện tập ngoài đời thực.", + "bgcolor": "bg-[#9999FF]" + }, + { + "id": 2, + "content": "Fight Out đang thay đổi kế hoạch chi tiết cho metaverse. Về bản chất, Fight Out là một nền tảng trò chơi thưởng cho người dùng khi thi đấu và giành chiến thắng trong nhiều chế độ thi đấu. Khả năng cạnh tranh của người chơi và số tiền họ được thưởng được xác định một phần bởi các thuộc tính của hình đại diện của họ. Chỉ số được tăng lên thông qua ứng dụng Fight Out bằng cách luyện tập ngoài đời thực.", + "bgcolor": "bg-[#6699FF]" + }, + { + "id": 3, + "content": "Fight Out đang thay đổi kế hoạch chi tiết cho metaverse. Về bản chất, Fight Out là một nền tảng trò chơi thưởng cho người dùng khi thi đấu và giành chiến thắng trong nhiều chế độ thi đấu. Khả năng cạnh tranh của người chơi và số tiền họ được thưởng được xác định một phần bởi các thuộc tính của hình đại diện của họ. Chỉ số được tăng lên thông qua ứng dụng Fight Out bằng cách luyện tập ngoài đời thực.", + "bgcolor": "bg-[#3399FF]" + }, + { + "id": 4, + "content": "Fight Out đang thay đổi kế hoạch chi tiết cho metaverse. Về bản chất, Fight Out là một nền tảng trò chơi thưởng cho người dùng khi thi đấu và giành chiến thắng trong nhiều chế độ thi đấu. Khả năng cạnh tranh của người chơi và số tiền họ được thưởng được xác định một phần bởi các thuộc tính của hình đại diện của họ. Chỉ số được tăng lên thông qua ứng dụng Fight Out bằng cách luyện tập ngoài đời thực.", + "bgcolor": "bg-[#0099FF]" + } + ] + }, + { + "id": 2, + "title": "Abcd", + "bgcolor": "bg-[#CC66FF]", + + "contents": [ + { + "id": 1, + "bgcolor": "bg-[#9966FF]", + "content": "ádasffjk12" + }, + { + "id": 2, + "bgcolor": "bg-[#6666FF]", + "content": "ádasffj1k" + }, + { + "id": 3, + "bgcolor": "bg-[#3366FF]", + "content": "ádasffj12k" + }, + { + "id": 4, + "bgcolor": "bg-[#0066FF]", + "content": "ádasffj123k" + } + ] + }, + { + "id": 3, + "title": "Abcd", + "bgcolor": "bg-[#CC66FF]", + + "contents": [ + { + "id": 1, + "bgcolor": "bg-[#9966FF]", + "content": "ádasffjk12" + }, + { + "id": 2, + "bgcolor": "bg-[#6666FF]", + "content": "ádasffj1k" + }, + { + "id": 3, + "bgcolor": "bg-[#3366FF]", + "content": "ádasffj12k" + }, + { + "id": 4, + "bgcolor": "bg-[#0066FF]", + "content": "ádasffj123k" + } + ] + }, + { + "id": 4, + "title": "Abcd", + "bgcolor": "bg-[#CC66FF]", + + "contents": [ + { + "id": 1, + "bgcolor": "bg-[#9966FF]", + "content": "ádasffjk12" + }, + { + "id": 2, + "bgcolor": "bg-[#6666FF]", + "content": "ádasffj1k" + }, + { + "id": 3, + "bgcolor": "bg-[#3366FF]", + "content": "ádasffj12k" + }, + { + "id": 4, + "bgcolor": "bg-[#0066FF]", + "content": "ádasffj123k" + } + ] + } + ] +} diff --git a/src/i18n/vi/roadmap.json b/src/i18n/vi/roadmap.json new file mode 100644 index 0000000..588db6c --- /dev/null +++ b/src/i18n/vi/roadmap.json @@ -0,0 +1,35 @@ +{ + "array": [ + { + "phase": "Giai đoạn 1", + "listTitle": [ + "Sự phát triển của tư tưởng CEO", + "Phát triển và phát hành trang web", + "Ra mắt Whitepaper", + "Đăng ký bán trước", + "Ban cố vấn đối tác tiếp thị được thành lập" + ] + }, + { + "phase": "Giai đoạn 2", + "listTitle": [ + "CEO DEX ra mắt Token", + "Chiến dịch tiếp thị lớn", + "Mua lại theo thời gian thực", + "Ra mắt NFT Staking và APR Staking", + "Cột mốc 5 triệu vốn hóa thị trường niêm yết CoinGecko" + ] + }, + { + "phase": "Giai đoạn 3", + "listTitle": [ + "Phát triển và triển khai hoán đổi", + "Ra mắt Merchandise", + "Tier 1 CEX Listings", + "Cầu nối CEO tới ETH, Arbitrium và Polygon", + "Cột mốc vốn hóa thị trường 10 triệu", + "CEOAI Bot Creator và tích hợp với AI." + ] + } + ] +} diff --git a/src/shared/components/Header.tsx b/src/shared/components/Header.tsx index 4b1e4bb..8e96940 100644 --- a/src/shared/components/Header.tsx +++ b/src/shared/components/Header.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from "react"; -import {useTranslation } from "react-i18next"; +import { useTranslation } from "react-i18next"; import Button from "./Button"; import robotLogo from "../../assets/images/robot-logo.png"; import { BsNewspaper, BsGithub } from "react-icons/bs"; @@ -37,10 +37,8 @@ const Header = (props: Props) => { const [isOpenMenu, setIsOpenMenu] = React.useState(false); const [isMobile, setIsMobile] = React.useState(false); const { i18n } = useTranslation(); - const currentLanguage = locales[i18n.language as keyof typeof locales ] - const languages = Object.keys(resources) - console.log(Object.keys(resources)); - console.log(currentLanguage); + const currentLanguage = locales[i18n.language as keyof typeof locales]; + const languages = Object.keys(resources); React.useEffect(() => { // check is mobile if (window.innerWidth <= 768) { @@ -68,6 +66,7 @@ const Header = (props: Props) => { const element = document.getElementById(section); if (element) { element.scrollIntoView({ behavior: "smooth" }); + setIsOpenMenu(!isOpenMenu); } }; const backToHome = () => { @@ -81,14 +80,14 @@ const Header = (props: Props) => { const pdf = Whitepaper; window.open(pdf); }; - const changeLanguage = (lng: string)=>{ - i18n.changeLanguage(lng) - } + const changeLanguage = (lng: string) => { + i18n.changeLanguage(lng); + }; return ( <> {isScrolled ? (
- {item.name} -
-+ {item.name} +
++
{item.name}
+
Whitepaper
+
Audit
diff --git a/src/shared/components/animated/QnASection.css b/src/shared/components/animated/QnASection.css index dfa07e7..3c9f2c3 100644 --- a/src/shared/components/animated/QnASection.css +++ b/src/shared/components/animated/QnASection.css @@ -7,13 +7,11 @@ transform: rotate(180deg); } -.listItem__QnA{ +.listItem__QnA { max-height: 0; overflow: hidden; - transition: all 1.5s ease; + transition: all 1.5s ease-in-out; } -.listItem__QnA-active{ - max-height: 100vh; +.listItem__QnA-active { + max-height: 150vh; } - - diff --git a/src/shared/components/animated/RoadmadAnimation.tsx b/src/shared/components/animated/RoadmadAnimation.tsx new file mode 100644 index 0000000..5c0e2a8 --- /dev/null +++ b/src/shared/components/animated/RoadmadAnimation.tsx @@ -0,0 +1,51 @@ +function qs(selector: any, all = false) { + return all + ? document.querySelectorAll(selector) + : document.querySelector(selector); +} + +const sections = qs(".section", true); +const timeline = qs(".timeline"); +const line = qs(".line"); +line.style.bottom = `calc(100% - 20px)`; +let prevScrollY = window.scrollY; +let up, down; +let full = false; +let set = 0; +const targetY = window.innerHeight * 0.8; + +function scrollHandler(e?: any) { + const { scrollY } = window; + up = scrollY < prevScrollY; + down = !up; + const timelineRect = timeline.getBoundingClientRect(); + const lineRect = line.getBoundingClientRect(); // const lineHeight = lineRect.bottom - lineRect.top; + + const dist = targetY - timelineRect.top; + console.log(dist); + + if (down && !full) { + set = Math.max(set, dist); + line.style.bottom = `calc(100% - ${set}px)`; + } + + if (dist > timeline.offsetHeight + 50 && !full) { + full = true; + line.style.bottom = `-50px`; + } + + sections.forEach((item: any) => { + // console.log(item); + const rect = item.getBoundingClientRect(); // console.log(rect); + + if (rect.top + item.offsetHeight / 5 < targetY) { + item.classList.add("show-me"); + } + }); // console.log(up, down); + + prevScrollY = window.scrollY; +} + +scrollHandler(); +line.style.display = "block"; +window.addEventListener("scroll", scrollHandler); diff --git a/src/shared/components/animated/TypingText.tsx b/src/shared/components/animated/TypingText.tsx index d2a5275..1566ee0 100644 --- a/src/shared/components/animated/TypingText.tsx +++ b/src/shared/components/animated/TypingText.tsx @@ -18,11 +18,11 @@ const TypingText = ({ children, ...props }: Props) => { const timeoutId = setTimeout(() => { setTypedText(text.slice(0, typedText.length + 1)); - }, 70); + }, 50); return () => clearTimeout(timeoutId); }, [text, typedText]); - return
-
{/*
- {t('content')} -
+{t("content")}
{listItem}
-//{item.description}
-//