diff --git a/public/author1.png b/public/author1.png new file mode 100644 index 0000000..a155b09 Binary files /dev/null and b/public/author1.png differ diff --git a/public/author1.svg b/public/author1.svg new file mode 100644 index 0000000..10fa69c --- /dev/null +++ b/public/author1.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/headerEllipse.svg b/public/headerEllipse.svg new file mode 100644 index 0000000..474fb26 --- /dev/null +++ b/public/headerEllipse.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/1.png b/public/images/1.png new file mode 100644 index 0000000..2cc09fe Binary files /dev/null and b/public/images/1.png differ diff --git a/public/images/2.png b/public/images/2.png new file mode 100644 index 0000000..a189f61 Binary files /dev/null and b/public/images/2.png differ diff --git a/public/images/4.png b/public/images/4.png new file mode 100644 index 0000000..976747f Binary files /dev/null and b/public/images/4.png differ diff --git a/public/images/5.png b/public/images/5.png new file mode 100644 index 0000000..b746b38 Binary files /dev/null and b/public/images/5.png differ diff --git a/public/images/ImageLogo.png b/public/images/ImageLogo.png new file mode 100644 index 0000000..c439c22 Binary files /dev/null and b/public/images/ImageLogo.png differ diff --git a/public/images/author1.png b/public/images/author1.png new file mode 100644 index 0000000..a155b09 Binary files /dev/null and b/public/images/author1.png differ diff --git a/public/images/footerimage.png b/public/images/footerimage.png new file mode 100644 index 0000000..13cb4dd Binary files /dev/null and b/public/images/footerimage.png differ diff --git a/public/images/image.png b/public/images/image.png new file mode 100644 index 0000000..92642df Binary files /dev/null and b/public/images/image.png differ diff --git a/public/owners.svg b/public/owners.svg new file mode 100644 index 0000000..0aa9904 --- /dev/null +++ b/public/owners.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/starknet.svg b/public/starknet.svg new file mode 100644 index 0000000..2ded6a9 --- /dev/null +++ b/public/starknet.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/user.svg b/public/user.svg new file mode 100644 index 0000000..6f63da7 --- /dev/null +++ b/public/user.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/app/_components/BookCard.tsx b/src/app/_components/BookCard.tsx new file mode 100644 index 0000000..db2457a --- /dev/null +++ b/src/app/_components/BookCard.tsx @@ -0,0 +1,54 @@ +import { cn } from "@/lib/utils"; +import Image from "next/image"; + +type BookCardProps = { + id?: string | number + title: string; + author: string; + price: string | number; + imageUrl: string; + rating: string | number; + verified?: boolean; + nft?: boolean; +}; + +export default function BookCard({ book, className }: { className?: string, book: BookCardProps }) { + const { imageUrl, title, author, price, rating, verified, nft } = book + + return
+
+ {title} + {nft && ( +
+ NFT +
+ )} +
+

{title}

+
+

By {author}

+ {verified && ( +
+ Verified Author +
+ )} +
+
+

${price}

+
+ + {rating} +
+
+
+} diff --git a/src/app/_components/CustomLink.tsx b/src/app/_components/CustomLink.tsx new file mode 100644 index 0000000..c34594a --- /dev/null +++ b/src/app/_components/CustomLink.tsx @@ -0,0 +1,28 @@ +"use client" + +import { usePathname, useRouter } from 'next/navigation' +import React, { ReactNode } from 'react' + +export default function CustomLink({ children, classname, route }: { route: string, classname: string, children: ReactNode }) { + + const navigate = useRouter() + const pathname = usePathname() + const presentPath = pathname.split("/").at(-1) + + + const handleClick = () => { + if (!presentPath) return + + if (pathname.split("/").length === 3) { + navigate.push(pathname + "/" + route) + } else { + navigate.push(pathname.replace(presentPath, route)) + } + } + + return ( + + ) +} diff --git a/src/app/how-it-works/_components/Footer.tsx b/src/app/_components/Footer.tsx similarity index 80% rename from src/app/how-it-works/_components/Footer.tsx rename to src/app/_components/Footer.tsx index 672f0c6..f1394e5 100644 --- a/src/app/how-it-works/_components/Footer.tsx +++ b/src/app/_components/Footer.tsx @@ -1,7 +1,7 @@ +import Logo from "@/app/_components/Logo"; import Link from "next/link"; import { BiLogoLinkedin, BiLogoTelegram } from "react-icons/bi"; import { FaXTwitter } from "react-icons/fa6"; -import Logo from "./Logo"; export interface IFooterLinks { link: string; @@ -9,12 +9,10 @@ export interface IFooterLinks { } const FooterLink: IFooterLinks[] = [ - { link: "Explore", href: "/explore" }, { link: "Home", href: "/" }, { link: "Books", href: "/books" }, { link: "How It Works", href: "/how-it-works" }, { link: "About", href: "/about-us" }, - { link: "Legal", href: "/legal" }, { link: "Privacy Policy", href: "/privacy-policy" }, { link: "Terms Of Service", href: "/terms-of-service" }, ]; @@ -43,8 +41,15 @@ export default function Footer() { -
- {FooterLink.map(({ link, href }, index) => {link})} +
+
+

Explore

+

Legal

+
+
diff --git a/src/app/_components/LazyLoadText.tsx b/src/app/_components/LazyLoadText.tsx new file mode 100644 index 0000000..e17a896 --- /dev/null +++ b/src/app/_components/LazyLoadText.tsx @@ -0,0 +1,39 @@ +import { useState, useEffect, useRef } from "react"; + +interface LazyLoadTextProps { + text: string; +} + +export default function LazyLoadText({ text }: LazyLoadTextProps) { + const [isVisible, setIsVisible] = useState(false); + const textRef = useRef(null); + + useEffect(() => { + const observer = new IntersectionObserver(([entry]) => { + if (entry.isIntersecting) { + setIsVisible(true); + observer.disconnect(); + } + }); + + if (textRef.current) { + observer.observe(textRef.current); + } + + return () => { + if (observer) observer.disconnect(); + }; + }, []); + + return ( +
+ {isVisible ? ( +

{text}

+ ) : ( +

+ Loading review... +

+ )} +
+ ); +} \ No newline at end of file diff --git a/src/app/_components/Loader.tsx b/src/app/_components/Loader.tsx new file mode 100644 index 0000000..e8a3d61 --- /dev/null +++ b/src/app/_components/Loader.tsx @@ -0,0 +1,5 @@ +export default function Loader() { + return ( +
+ ) +} diff --git a/src/app/how-it-works/_components/Logo.tsx b/src/app/_components/Logo.tsx similarity index 100% rename from src/app/how-it-works/_components/Logo.tsx rename to src/app/_components/Logo.tsx diff --git a/src/app/_components/Navbar.tsx b/src/app/_components/Navbar.tsx new file mode 100644 index 0000000..9704366 --- /dev/null +++ b/src/app/_components/Navbar.tsx @@ -0,0 +1,57 @@ +"use client" + +import Logo from "@/app/_components/Logo"; +import { ReactNode, useState } from "react"; +import Button from "../how-it-works/_components/Button"; +import NavLink from "../how-it-works/_components/NavLink"; +import NavMenuButton from "../how-it-works/_components/NavMenuButton"; +import NavSearchBar from "../how-it-works/_components/NavSearchBar"; +import PopupModal from "./PopupModal"; + +interface ILink { + link: string; + href: string; +} + +interface NavbarProps { + children?: ReactNode; +} + +const links: ILink[] = [ + { link: "Home", href: "/" }, + { link: "Books", href: "/books" }, + { link: "How It Works", href: "/how-it-works" }, + { link: "About ChainLib", href: "/about-us" }, +]; + + +function Navbar({ children }: NavbarProps) { + const [isVisible, setIsVisible] = useState(false) + return ( + <> + + + + ) +} + +export default Navbar \ No newline at end of file diff --git a/src/app/_components/PageDetail.tsx b/src/app/_components/PageDetail.tsx new file mode 100644 index 0000000..5fa2b8d --- /dev/null +++ b/src/app/_components/PageDetail.tsx @@ -0,0 +1,20 @@ +import { ChevronLeft } from 'lucide-react' +import { useRouter } from 'next/navigation' +import React from 'react' + +export default function PageDetail({ title, children }: { title: string, children?: React.ReactNode }) { + const router = useRouter() + const onClick = () => { + router.back() + } + + return ( +
+
+ +

{title}

+
+ {children} +
+ ) +} diff --git a/src/app/_components/PopupModal.tsx b/src/app/_components/PopupModal.tsx new file mode 100644 index 0000000..745c13a --- /dev/null +++ b/src/app/_components/PopupModal.tsx @@ -0,0 +1,70 @@ +"use client"; + +import { cn } from '@/lib/utils'; +import Image from 'next/image'; +import Link from 'next/link'; +import { useEffect } from 'react'; +import { FiX } from 'react-icons/fi'; + +export default function PopupModal({ isVisible, setIsVisible }: { isVisible: boolean; setIsVisible: (x: boolean) => void }) { + const handleClose = () => { + setIsVisible(false); + }; + + // When modal is open, prevent body scrolling + useEffect(() => { + if (isVisible) { + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'unset'; + } + return () => { + if (isVisible) { + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'unset'; + } + }; + }, [isVisible]); + + if (!isVisible) return null; + + return ( +
+
e.stopPropagation()} + > + + +
+

How Would you Like to Sign Up

+

+ Choose your role to get started +

+ +
+ +
+ Signup as a reader +
+ As Reader + + +
+ Signup as a reader +
+ As Writer + +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/app/_components/SearchBar.tsx b/src/app/_components/SearchBar.tsx new file mode 100644 index 0000000..945eb94 --- /dev/null +++ b/src/app/_components/SearchBar.tsx @@ -0,0 +1,46 @@ +"use client"; + +import { useOutsideClick } from '@/hooks/useOutsideClick'; +import { cn } from '@/lib/utils'; +import { Ref, useState } from 'react'; +import { BiSolidSearch } from 'react-icons/bi'; + +interface SearchBarProps { + placeholder?: string; + onSearch?: (query: string) => void; +} + +function SearchBar({ placeholder = "Search...", onSearch }: SearchBarProps) { + const [query, setQuery] = useState(''); + const [showInput, setShowInput] = useState(false) + + const searchRef = useOutsideClick(() => setShowInput(false)) as Ref + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (onSearch) { + onSearch(query); + } + }; + + return ( +
setShowInput(true)}> + + +
+ setQuery(e.target.value)} + type="text" + value={query} + className="w-full group placeholder:text-neutral-300 text-body-large text-neutral-900 font-light outline-none md:text-body-18px-large" + placeholder={placeholder} + autoFocus={showInput} /> +
+ + ); +} + +export default SearchBar diff --git a/src/app/_components/TextReveal.tsx b/src/app/_components/TextReveal.tsx new file mode 100644 index 0000000..1d53e86 --- /dev/null +++ b/src/app/_components/TextReveal.tsx @@ -0,0 +1,49 @@ +"use client" + +import { cn } from "@/lib/utils"; +import { motion, useInView } from "framer-motion"; +import { useRef } from "react"; + +interface ITextReveal { + styles?: string; + children: string +} + +const SlideUp = { + initial: { + y: "200%", + }, + open: (i: number) => ({ + y: "0%", + transition: { duration: 0.6, delay: 0.01 * i }, + }), + closed: { + y: "200%", + transition: { duration: 0.6, ease: [0.76, 0, 0.24, 1] }, + }, +}; + +export default function TextReveal({ + styles, + children +}: ITextReveal) { + const textRef = useRef(null) + const inView = useInView(textRef, { amount: 0.8, once: true, }) + return ( + <> + {children.split(" ").map((word: string, index: number) => + + {word} + + )} + + ); +} diff --git a/src/app/_components/Vision.tsx b/src/app/_components/Vision.tsx new file mode 100644 index 0000000..d41a984 --- /dev/null +++ b/src/app/_components/Vision.tsx @@ -0,0 +1,29 @@ +"use client" + +import { motion } from "framer-motion" + +export default function Vision() { + return ( + <> + + Building More +
+ Than an e-Library +
+ + A decentralized world where stories live on-chain and creators stay in control. Powered by StarkNet, our platform gives writers the freedom to publish without intermediaries and gives readers direct access to original, verifiable content they can truly own. + + ) +} diff --git a/src/app/_components/backButton.tsx b/src/app/_components/backButton.tsx new file mode 100644 index 0000000..7209dca --- /dev/null +++ b/src/app/_components/backButton.tsx @@ -0,0 +1,26 @@ +"use client" + +import { ArrowLeft } from "lucide-react"; +import { useRouter, useSearchParams } from "next/navigation"; + +export default function BackButton({ type }: { type?: string }) { + const navigate = useRouter() + const searchParams = useSearchParams() + + const handleBack = () => { + const step = Number(searchParams.get("step")) ?? 1 + if (type === "auth" && step > 1) { + const params = new URLSearchParams(searchParams); + params.set("step", (step - 1).toString()); + } + navigate.back() + }; + return ( + ) +} diff --git a/src/app/_components/ui/Authors.tsx b/src/app/_components/ui/Authors.tsx new file mode 100644 index 0000000..1258635 --- /dev/null +++ b/src/app/_components/ui/Authors.tsx @@ -0,0 +1,101 @@ +"use client"; + +import { motion } from 'framer-motion'; +import Image from 'next/image'; +import React from 'react'; + +type AuthorCardProps = { + name: string; + image: string; + verified?: boolean; +}; + +const AuthorCard = ({ name, image, verified = false }: AuthorCardProps) => ( + +
+ + {`Author + +
+
+
+

{name}

+ {verified && ( + + + + + + + )} +
+
+); + +export default function TopAuthorsSection() { + const authors = [ + { + name: "Elizabeth Joe", + image: "/Eliazerbert.png", + verified: true + }, + { + name: "Alex Paul", + image: "/alex.png", + verified: true + }, + { + name: "Samson Tersoor", + image: "/samson.png", + verified: true + }, + { + name: "Vamika Maya", + image: "/maya.png", + verified: true + }, + { + name: "Faith Musa", + image: "/faith.png", + verified: true + } + ]; + + return ( +
+
+

Top Authors For This Week

+

This week`'`s most-read and most-loved authors don`'`t miss their latest work

+
+ +
+ {authors.map((author, index) => ( + + ))} +
+
+ ); +} \ No newline at end of file diff --git a/src/app/_components/ui/Banner.tsx b/src/app/_components/ui/Banner.tsx new file mode 100644 index 0000000..ac695ba --- /dev/null +++ b/src/app/_components/ui/Banner.tsx @@ -0,0 +1,77 @@ +"use client"; + +import { motion } from "framer-motion"; +import React from "react"; + +const categories = [ + [ + { label: "Fiction", color: "bg-yellow-100" }, + { label: "Fact Books", color: "bg-blue-200" }, + { label: "Fantasy", color: "bg-green-200" }, + ], + [ + { label: "Humor & Science", color: "bg-blue-300" }, + { label: "Picture", color: "bg-blue-100" }, + { label: "Reference", color: "bg-yellow-200" }, + { label: "Science", color: "bg-red-200" }, + ], + [ + { label: "Science Book", color: "bg-green-100" }, + { label: "Non-Fiction", color: "bg-blue-400" }, + { label: "Adventure", color: "bg-red-300" }, + ], +]; + +export default function BookCategories() { + return ( +
+
+ +

+ Publish and Read +
+ Multiple Type of Books +

+
+
+ + +
+ {categories.map((row, rowIndex) => ( + + {row.map((cat, catIndex) => ( + + {cat.label} + + ))} + + ))} +
+
+ ); +} diff --git a/src/app/_components/ui/BookSection.tsx b/src/app/_components/ui/BookSection.tsx new file mode 100644 index 0000000..0f22eb4 --- /dev/null +++ b/src/app/_components/ui/BookSection.tsx @@ -0,0 +1,79 @@ +"use client"; + +import BookCard from "@/app/_components/BookCard"; +import Link from "next/link"; +// import PaginationIndicator from "@/components/landingpage/PageIndicator"; +// import "keen-slider/keen-slider.min.css"; +// import { useKeenSlider } from "keen-slider/react"; +// import { useState } from "react"; + +type Book = { + title: string; + author: string; + imageUrl: string; + price: string | number; + rating: string | number; + verified?: boolean; + nft?: boolean; +}; + + +type BookSectionProps = { + title: string; + description: string; + link?: string; + books: Book[]; +}; + +export default function BookSection({ title, description, books, link }: BookSectionProps) { + // const [currentSlide, setCurrentSlide] = useState(0); + + // const [sliderRef] = useKeenSlider({ + // loop: true, + // slides: { + // perView: 4, + // spacing: 16, + // }, + // breakpoints: { + // "(max-width: 768px)": { + // slides: { + // perView: 3, + // spacing: 12, + // }, + // }, + // }, + // slideChanged(slider) { + // setCurrentSlide(slider.track.details.rel); + // }, + // created(slider) { + // setInterval(() => { + // slider.next(); + // }, 4000); + // }, + // }); + + return ( +
+
+
+

{title}

+

{description}

+
+ + View All + + + + +
+ +
+ {books.map((book, index) => ( + + ))} +
+ + {/* */} +
+ ); +} diff --git a/src/app/_components/ui/Community.tsx b/src/app/_components/ui/Community.tsx new file mode 100644 index 0000000..c3bfc05 --- /dev/null +++ b/src/app/_components/ui/Community.tsx @@ -0,0 +1,112 @@ +"use client"; + +import { motion } from "framer-motion"; +import Image from "next/image"; +import { useState } from "react"; + +export default function CommunitySection() { + const [isHovered, setIsHovered] = useState(false); + + return ( +
+
+ + Join Our Community
of Book Lovers +
+ + setIsHovered(true)} + onHoverEnd={() => setIsHovered(false)} + > + + Join Community → + + + + +
+

Our Community

+ +
+ {["/Ellipse 3.png", "/Ellipse 4.png", "/Ellipse 5.png", "/Ellipse 6.png"].map((src, index) => ( + + User + + ))} +
+
+ +
+ + 40k+ + + + Book lovers Joined + +
+
+
+ + + + Book Lovers + + +
+ ); +} \ No newline at end of file diff --git a/src/app/_components/ui/Hero.tsx b/src/app/_components/ui/Hero.tsx new file mode 100644 index 0000000..d9f97b1 --- /dev/null +++ b/src/app/_components/ui/Hero.tsx @@ -0,0 +1,86 @@ +"use client"; + +import { motion } from "framer-motion"; +import Image from "next/image"; +import Link from "next/link"; +import { useEffect } from "react"; + +const peopleImages = [ + { id: 1, src: "/hero1.png", alt: "Person 1" }, + { id: 2, src: "/hero2.png", alt: "Person 2" }, + { id: 3, src: "/hero3.png", alt: "Person 3" }, + { id: 4, src: "/hero4.png", alt: "Person 4" }, + { id: 5, src: "/hero5.png", alt: "Person 5" }, +]; + +export default function Hero() { + + useEffect(() => { + window.addEventListener("load", () => window.resizeTo(window.innerWidth, window.innerHeight)) + + return () => { + window.removeEventListener("load", () => window.resizeTo(window.innerWidth, window.innerHeight)) + } + }, []) + + + return ( +
+ + + A Decentralized Library for the
Future of Digital Publishing +
+ +
+ {peopleImages.map((person, index) => ( + + {person.alt} + + ))} +
+ + + Own your stories, engage your readers, and earn from
your content with blockchain transparency. +
+ + + + Get Started + + + +
+ ); +} diff --git a/src/app/_components/ui/Modal.tsx b/src/app/_components/ui/Modal.tsx new file mode 100644 index 0000000..47bd347 --- /dev/null +++ b/src/app/_components/ui/Modal.tsx @@ -0,0 +1,100 @@ +// import { cloneElement, createContext, useContext, useState } from "react"; +// import { createPortal } from "react-dom"; +// import { HiXMark } from "react-icons/hi2"; +// import styled from "styled-components"; +// import { useOutsideClick } from "../hooks/useOutsideClick"; + +// const StyledModal = styled.div` +// position: fixed; +// top: 50%; +// left: 50%; +// transform: translate(-50%, -50%); +// background-color: var(--color-grey-0); +// border-radius: var(--border-radius-lg); +// box-shadow: var(--shadow-lg); +// padding: 3.2rem 4rem; +// transition: all 0.5s; +// `; + +// const Overlay = styled.div` +// position: fixed; +// top: 0; +// left: 0; +// width: 100%; +// height: 100vh; +// background-color: var(--backdrop-color); +// backdrop-filter: blur(4px); +// z-index: 1000; +// transition: all 0.5s; +// `; + +// const Button = styled.button` +// background: none; +// border: none; +// padding: 0.4rem; +// border-radius: var(--border-radius-sm); +// transform: translateX(0.8rem); +// transition: all 0.2s; +// position: absolute; +// top: 1.2rem; +// right: 1.9rem; + +// &:hover { +// background-color: var(--color-grey-100); +// } + +// & svg { +// width: 2.4rem; +// height: 2.4rem; +// /* Sometimes we need both */ +// /* fill: var(--color-grey-500); +// stroke: var(--color-grey-500); */ +// color: var(--color-grey-500); +// } +// `; + +// const ModalContext = createContext(); + +// function Modal({ children }) { +// const [openName, setOpenName] = useState(""); + +// const close = () => setOpenName(""); +// const open = setOpenName; + +// return ( +// +// {children} +// +// ); +// } + +// function Open({ children, opens: opensWindowName }) { +// const { open } = useContext(ModalContext); + +// return cloneElement(children, { onClick: () => open(opensWindowName) }); +// } + +// function Window({ children, name }) { +// const { openName, close } = useContext(ModalContext); +// const ref = useOutsideClick(close); + +// if (name !== openName) return null; + +// return createPortal( +// +// +// + +//
{cloneElement(children, { onCloseModal: close })}
+//
+//
, +// document.body +// ); +// } + +// Modal.Open = Open; +// Modal.Window = Window; + +// export default Modal; diff --git a/src/app/_components/ui/Nft.tsx b/src/app/_components/ui/Nft.tsx new file mode 100644 index 0000000..a462ccd --- /dev/null +++ b/src/app/_components/ui/Nft.tsx @@ -0,0 +1,28 @@ +import BookSection from "@/app/_components/ui/BookSection"; +import { newReleases, nftEditions, trendingBooksHome } from "@/data"; + +export default function ELibraryDisplay() { + return ( +
+ + + + +
+ +
+
+ ); +} diff --git a/src/app/_components/ui/PageIndicator.tsx b/src/app/_components/ui/PageIndicator.tsx new file mode 100644 index 0000000..c822629 --- /dev/null +++ b/src/app/_components/ui/PageIndicator.tsx @@ -0,0 +1,20 @@ +type PaginationIndicatorProps = { + current: number; + total:number; +} + +export default function PaginationIndicator({ current, total } : PaginationIndicatorProps ) { + return ( +
+ {[...Array(total)].map((_, index) => ( +
+ ))} +
+ ); + } + \ No newline at end of file diff --git a/src/app/_components/ui/Partners.tsx b/src/app/_components/ui/Partners.tsx new file mode 100644 index 0000000..8eaf869 --- /dev/null +++ b/src/app/_components/ui/Partners.tsx @@ -0,0 +1,20 @@ +export default function PartnersSection() { + return ( +
+

+ Our Partners +

+ +

+ Powering the future of decentralized reading with the support of trusted
innovators and collaborators. +

+ +
+ Ethereum + Starknet + Only Dust + Ethereum +
+
+ ); + } \ No newline at end of file diff --git a/src/app/_components/ui/Tagline.tsx b/src/app/_components/ui/Tagline.tsx new file mode 100644 index 0000000..e745d48 --- /dev/null +++ b/src/app/_components/ui/Tagline.tsx @@ -0,0 +1,115 @@ +"use client"; + +import { motion } from "framer-motion"; +import Image from 'next/image'; +import { FaLock } from "react-icons/fa"; +import Vision from "../Vision"; + +export default function DecentralizedELibrary() { + return ( +
+
+ +
+ +
+ +
+ Decentralized Publishing +
+
+

Decentralized Publishing

+

+ Publish your work directly on the blockchain uncensorable, permanent, and fully yours. +

+
+
+ +
+ +
+ Earn Without Intermediaries +
+
+

Earn Without Intermediaries

+

+ Get paid instantly and transparently. No third parties, no hidden cuts +

+
+
+ + +
+
+ +
+
+
+

Secure Ownership

+

+ Your content and earnings are protected with blockchain-backed security +

+
+
+
+ +
+ +
+ Global Audience Reach +
+
+

Global Audience Reach

+

+ Connect with readers worldwide, anytime, without platform limits +

+
+
+ + +
+ Own What You Read +
+
+

Own What You Read

+

+ Books become digital collectibles read, collect, and showcase your favorites. +

+
+
+
+
+ +
+ ); +} diff --git a/src/app/about-us/_components/ImageSlider.tsx b/src/app/about-us/_components/ImageSlider.tsx new file mode 100644 index 0000000..033aa0a --- /dev/null +++ b/src/app/about-us/_components/ImageSlider.tsx @@ -0,0 +1,59 @@ +"use client" +import { motion } from "framer-motion" +import Image from "next/image" +import { useState } from "react" + +export default function ImageSlider() { + const [showSlider, setShowSlider] = useState(false) + + return ( + + setShowSlider(true), + }} viewport={{ once: true }} initial={{ height: 0 }} className="size-full inset-0 relative"> + + {/* Duplicate image for seamless loop */} +
+ Diverse community of readers and writers +
+
+ +
+
+
+
+ ) +} diff --git a/src/app/about-us/page.tsx b/src/app/about-us/page.tsx index cbc745d..6dce713 100644 --- a/src/app/about-us/page.tsx +++ b/src/app/about-us/page.tsx @@ -1,637 +1,365 @@ -"use client"; +import CommunitySection from '@/app/_components/ui/Community'; +import Footer from '../_components/Footer'; +import Navbar from '../_components/Navbar'; +import TextReveal from '../_components/TextReveal'; +import ImageSlider from './_components/ImageSlider'; -import Image from "next/image"; -import Link from "next/link"; -import Image2 from "@/assets/Images/image.png"; -import Image3 from "@/assets/Images/footerimage.png"; -import Image4 from "@/assets/Images/ImageLogo.png"; -import Imagetiny1 from "@/assets/Images/1.png"; -import Imagetiny2 from "@/assets/Images/2.png"; -import Imagetiny4 from "@/assets/Images/4.png"; -import Imagetiny5 from "@/assets/Images/5.png"; +export default function page() { + return ( + <> + +
+ {/* Hero Section */} -export default function About() { - return ( -
-
- {/* Hero Section */} -
-
-
-

- Empowering Stories, -
- Decentralized Freedom. -

-
-
-
- -
-
-
- Diverse community of readers and writers -
-
-
- - {/* What is Chainlib */} -
-
-
-
-

- - What is Chainlib? - -

+
+

+ Empowering Stories, +
+ Decentralized Freedom. +

+
-

- Chainlib is a new marketplace built on the Polygon blockchain, - where authors can publish books and readers can support them - directly. We eliminate middlemen, ensure fair compensation, - and provide a platform where creativity thrives and readers - discover unique voices. -

-
-
-

- - Why Chainlib Exists? - -

-

- We believe creators deserve fair pay for their publications. - ChainLib empowers authors to earn more from their work and - give readers direct access to their favorite writers. By using - blockchain technology, we've created a transparent and - decentralized way of supporting literary creation and - readership. -

-
-
-
-
+ {/* People Image Banner */} + - {/* What Makes Us Different Section - Updated to match image */} -
-
-
-
-

- What Makes Us Different -

-
+ {/* What is Chainlib */} +
+
+
+

+ + What is Chainlib? + +

-
-
- {/* Decentralized Storage Feature */} -
-
-
- - - - - -
-
-
-

- Decentralized Storage -

-

- Books live on IPFS, never locked behind servers. -

-
-
+

+ + Chainlib is a new marketplace built on the Polygon blockchain, where authors can publish books and readers can support them directly. We eliminate middlemen, ensure fair compensation, and provide a platform where creativity thrives and readers discover unique voices. + +

- {/* NFT Publishing Feature */} -
-
-
- - - - - -
+
+
+

+ + Why Chainlib Exists? + +

+

+ + We believe creators deserve fair pay for their publications. ChainLib empowers authors to earn more from their work and give readers direct access to their favorite writers. By using blockchain technology, we have created a transparent and decentralized way of supporting literary creation and readership. + +

+
-
-

- NFT Publishing -

-

- Every published work is a tradable asset, linked to a - tokenbound account.{" "} -

-
-
+
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-

- Smart Contracts -

-

- Royalties, rights, and revenue handled transparently and - automatically. -

+ {/* What Makes Us Different Section - Updated to match image */} +
+
+

+ What Makes Us Different +

-
- {/* Reader Rewards Feature */} -
-
-
- - - - - - - -
-
-
-

- Reader Rewards -

-

- Read, review, and grow your rank in our engaged reading - community. -

-
-
-
-
-
-
-
+
+
+ {/* Decentralized Storage Feature */} +
+
+
+ + + + + +
+
+
+

+ Decentralized Storage +

+

+ + Books live on IPFS, never locked behind servers. + +

+
+
- {/* Join Our Community */} -
-
-
-
-

- Join Our Community of Book Lovers -

- + {/* NFT Publishing Feature */} +
+
+
+ + + + + +
+
+
+

+ NFT Publishing +

+

+ + Every published work is a tradable asset, linked to a + tokenbound account. + +

+
+
-
-
-
- Community of readers -
-
- Community of readers -
-
- Community of readers -
-
- Community of readers -
+ {/* Smart Contracts Feature */} +
+
+
+ + {/* */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

+ Smart Contracts +

+

+ + Royalties, rights, and revenue handled transparently and + automatically. + +

+
+
-
- Community of readers + {/* Reader Rewards Feature */} +
+
+
+ + + + + + + +
+
+
+

+ Reader Rewards +

+

+ + Read, review, and grow your rank in our engaged reading + community. + +

+
+
+
-
-
-

- Our Community -

-

- 40k+ active members -

-
-
-
- -
- Community of readers -
-
-
-
-
- - {/* Footer */} - -
-
-
- {/* Logo and social icons */} -
-
-
- Logo -
- ChainLib -
- - -
+ -
-
-

- Explore -

-
    -
  • - - Home - -
  • -
  • - - Books - -
  • -
  • - - How It Works - -
  • -
  • - - About - -
  • -
-
-
-

- Legal -

-
    -
  • - - Privacy Policy - -
  • -
  • - - Terms of Service - -
  • -
-
-
-
+ {/* Join Our Community */} + + -
-

- © {new Date().getFullYear()} ChainLib. All rights reserved. -

-
-
-
-
- ); +