diff --git a/package-lock.json b/package-lock.json index 8a7e8a6..2b44a8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,9 @@ "name": "para", "version": "0.1.0", "dependencies": { + "gsap": "^3.12.5", "next": "14.2.3", + "next-google-fonts": "^2.2.0", "react": "^18", "react-dom": "^18" }, @@ -2249,6 +2251,11 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/gsap": { + "version": "3.12.5", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.5.tgz", + "integrity": "sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==" + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3112,6 +3119,17 @@ } } }, + "node_modules/next-google-fonts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/next-google-fonts/-/next-google-fonts-2.2.0.tgz", + "integrity": "sha512-TCtNp+uu0vof2X8Xfptfw96Unc3zsUekBY2l4g2mGAX+U8QO/yfAaEioGhFCwU05M8NbMgwP5C8V40Vtwp87iQ==", + "deprecated": "As of Next.js 10.2, Google Fonts are automatically optimized! For more info, see https://github.com/joe-bell/next-google-fonts", + "peerDependencies": { + "next": ">= 10.0.7", + "react": ">= 17.0.1", + "react-dom": ">= 17.0.1" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", diff --git a/package.json b/package.json index 51e6002..f81ff97 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,16 @@ "lint": "next lint" }, "dependencies": { + "gsap": "^3.12.5", + "next": "14.2.3", + "next-google-fonts": "^2.2.0", "react": "^18", - "react-dom": "^18", - "next": "14.2.3" + "react-dom": "^18" }, "devDependencies": { - "postcss": "^8", - "tailwindcss": "^3.4.1", "eslint": "^8", - "eslint-config-next": "14.2.3" + "eslint-config-next": "14.2.3", + "postcss": "^8", + "tailwindcss": "^3.4.1" } } diff --git a/src/app/components/Content.jsx b/src/app/components/Content.jsx new file mode 100644 index 0000000..39c1d9e --- /dev/null +++ b/src/app/components/Content.jsx @@ -0,0 +1,60 @@ +'use client'; +import styles from '../page.module.css' +import { useRef, useEffect } from 'react'; +import { ScrollTrigger } from 'gsap/ScrollTrigger'; +import gsap from 'gsap'; + +const phrase = "In Willowbrook, a boy named Ezra dreamed big. Despite humble beginnings, he devoured books, fueled by curiosity. With grit, he conquered obstacles, turning challenges into stepping stones. When opportunity came, he seized it, embarking on a journey to success. Against all odds, the small-town boy emerged triumphant, a beacon of determination and self-belief." + +export default function Cont() { + + let refs = useRef([]); + const body = useRef(null); + const container = useRef(null); + + useEffect( () => { + gsap.registerPlugin(ScrollTrigger); + createAnimation(); + }, []) + + const createAnimation = () => { + gsap.to(refs.current, { + scrollTrigger: { + trigger: container.current, + scrub: true, + start: `top`, + end: `+=${window.innerHeight / 2.5}`, + }, + opacity: 1, + ease: "none", + stagger: 0.1 + }) + } + + const splitWords = (phrase) => { + let body = []; + phrase.split(" ").forEach( (word, i) => { + const letters = splitLetters(word); + body.push(

{letters}

) + }) + return body + } + + const splitLetters = (word) => { + let letters = [] + word.split("").forEach( (letter, i) => { + letters.push( {refs.current.push(el)}}>{letter}) + }) + return letters; + } + + return ( +
+
+ { + splitWords(phrase) + } +
+
+ ) +} \ No newline at end of file diff --git a/src/app/components/Footer.jsx b/src/app/components/Footer.jsx new file mode 100644 index 0000000..b1a11c1 --- /dev/null +++ b/src/app/components/Footer.jsx @@ -0,0 +1,54 @@ +import '../globals.css'; +import { trapBold } from './fonts'; +import { Open_Sans, Syne } from 'next/font/google'; +import React, { useEffect, useState } from 'react'; + +const inter = Open_Sans({ subsets: ['latin'] }) + +const thankyouList = [ + "thank you", + "gracias", + "धन्यवाद", + "merci", + "danke", + "ありがとう", + "谢谢", + "Спасибо", + "شكراً", + "감사합니다", +]; + +export default function Footer() { + const [currthank, setCurrThank] = useState(thankyouList[0]); + + useEffect(() => { + const intervalId = setInterval(() => { + const currentIndex = thankyouList.indexOf(currthank); + const nextIndex = (currentIndex + 1) % thankyouList.length; + setCurrThank(thankyouList[nextIndex]); + }, 1500); + + return () => { + clearInterval(intervalId); + }; + }, [currthank]); + + return ( + <> +
+
+

+ {currthank === "شكراً" && "!"} {currthank}{" "} + {currthank != "شكراً" && "!"} +

+
+
+
+
+
+

@{new Date().getFullYear()} mystory. all rights reserved.

+
+
+ + ); +}; \ No newline at end of file diff --git a/src/app/components/Header.jsx b/src/app/components/Header.jsx new file mode 100644 index 0000000..770424c --- /dev/null +++ b/src/app/components/Header.jsx @@ -0,0 +1,18 @@ +import React from 'react'; +import '../globals.css'; +import { trapBold } from './fonts'; + +export default function Header() { + return ( + <> +
+
+

mystory

+
+
+
+

A way to share stories anonymously.

+
+ + ); +}; \ No newline at end of file diff --git a/src/app/components/fonts/Trap-Bold.otf b/src/app/components/fonts/Trap-Bold.otf new file mode 100644 index 0000000..87f2446 Binary files /dev/null and b/src/app/components/fonts/Trap-Bold.otf differ diff --git a/src/app/components/fonts/index.jsx b/src/app/components/fonts/index.jsx new file mode 100644 index 0000000..e4428eb --- /dev/null +++ b/src/app/components/fonts/index.jsx @@ -0,0 +1,6 @@ +import localFont from "next/font/local"; + +export const trapBold = localFont({ + src: "./Trap-Bold.otf", + display: "swap", +}); \ No newline at end of file diff --git a/src/app/favicon.ico b/src/app/favicon.ico index 718d6fe..a4f4de8 100644 Binary files a/src/app/favicon.ico and b/src/app/favicon.ico differ diff --git a/src/app/globals.css b/src/app/globals.css index 875c01e..f787a38 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,3 +1,5 @@ +@import url('https://fonts.googleapis.com/css2?family=Syne:wght@400..800&display=swap'); + @tailwind base; @tailwind components; @tailwind utilities; @@ -17,13 +19,7 @@ } body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); + background-color: #191919; } @layer utilities { diff --git a/src/app/layout.js b/src/app/layout.js index 9aef1df..6462b57 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -1,12 +1,34 @@ -import { Inter } from "next/font/google"; -import "./globals.css"; +import './globals.css'; +import { Inter } from 'next/font/google'; -const inter = Inter({ subsets: ["latin"] }); +const inter = Inter({ subsets: ['latin'] }) export const metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; + title: 'mystory | share your stories anonymously', + description: 'a place to share stories anonymously and connect with like minded people.', + keywords: [ + "Anonymous", + "Story Writing", + "Creative Writing", + "Anonymous Stories", + "Writing Community", + "Online Writing Platform", + "Narrative Writing", + "Anonymous Authorship", + "Story Sharing", + "Collaborative Writing", + "Creative Expression", + "Writing Prompt", + "User-generated Content", + "Community Stories", + "Anonymous Contributions", + "Narrative Community", + "Anonymous Feedback", + "Writing Forum", + "Anonymous Platform", + "Story Exchange", + ], +} export default function RootLayout({ children }) { return ( @@ -14,4 +36,4 @@ export default function RootLayout({ children }) { {children} ); -} +}; \ No newline at end of file diff --git a/src/app/page.js b/src/app/page.js index c9b26e0..3b9b87a 100644 --- a/src/app/page.js +++ b/src/app/page.js @@ -1,113 +1,14 @@ -import Image from "next/image"; +"use client"; +import Content from "./components/Content"; +import Header from "./components/Header"; +import Footer from "./components/Footer"; export default function Home() { return ( -
-
-

- Get started by editing  - src/app/page.js -

-
- - By{" "} - Vercel Logo - -
-
- -
- Next.js Logo -
- -
- -

- Docs{" "} - - -> - -

-

- Find in-depth information about Next.js features and API. -

-
- - -

- Learn{" "} - - -> - -

-

- Learn about Next.js in an interactive course with quizzes! -

-
- - -

- Templates{" "} - - -> - -

-

- Explore starter templates for Next.js. -

-
- - -

- Deploy{" "} - - -> - -

-

- Instantly deploy your Next.js site to a shareable URL with Vercel. -

-
-
+
+
+ +
); -} +} \ No newline at end of file diff --git a/src/app/page.module.css b/src/app/page.module.css new file mode 100644 index 0000000..27f5f7b --- /dev/null +++ b/src/app/page.module.css @@ -0,0 +1,33 @@ +.main { + display: flex; + height: 100vh; + align-items: flex-end; + justify-content: center; + margin-bottom: 100vh; + color: rgb(211, 211, 211); +} + +@media (max-width: 768px) { + .main { + height: 80vh; + margin-bottom: 80vh; + padding-bottom: 10vh; + } +} + +.body { + width: 90%; + display: flex; + flex-wrap: wrap; +} + +.body p { + font-size: 3.5vw; + margin: 0px; + margin-right: 1.5vw; + font-weight: 700; +} + +.body span { + opacity: 0.2; +} diff --git a/tailwind.config.js b/tailwind.config.js index 7980350..89191ff 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -12,6 +12,9 @@ module.exports = { "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", }, + fontFamily: { + 'Syne': '"Syne", Helvetica, Arial, sans-serif', + }, }, }, plugins: [],