├── .eslintrc.json ├── .gitignore ├── README.md ├── app ├── compact │ └── page.jsx ├── components │ ├── Footer.jsx │ ├── Header.jsx │ ├── InfiniteMovingCards.jsx │ ├── InfoIcon.jsx │ ├── InvalidCardIcon.jsx │ ├── LinkCompact.jsx │ ├── LinkRounded.jsx │ ├── Links.jsx │ ├── Location.jsx │ ├── Message.jsx │ ├── MonitorMobileIcon.jsx │ ├── Photos.jsx │ ├── Services.jsx │ ├── ShieldSecurityIcon.jsx │ ├── Stars.jsx │ ├── Store.jsx │ ├── Stories.jsx │ ├── Story.jsx │ ├── StoryThumbnail.jsx │ ├── Testimonials.jsx │ └── YutubeLink.jsx ├── favicon.ico ├── globals.css ├── influencer │ └── page.jsx ├── layout.js ├── page.js ├── podcast │ └── page.jsx ├── rounded │ └── page.jsx ├── standard │ ├── StandardLink.jsx │ └── layout.jsx ├── writer │ └── page.jsx └── youtuber │ └── page.jsx ├── data.js ├── jsconfig.json ├── next.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── font │ ├── Interegular.otf │ ├── Interlight.otf │ └── Intermedium.otf ├── images │ ├── cry.jpg │ ├── f.jpg │ ├── img1.jpg │ ├── img10.jpg │ ├── img11.jpg │ ├── img3.jpg │ ├── img4.jpg │ ├── img4.png │ ├── img5.jpg │ ├── img6.jpg │ ├── img7.jpg │ ├── img8.jpg │ ├── img9.jpg │ ├── mapp.webp │ ├── mappp.webp │ └── yellow.jpg ├── next.svg ├── vercel.svg └── videos │ └── yutube.mp4 └── tailwind.config.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 37 | -------------------------------------------------------------------------------- /app/compact/page.jsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import React, { useRef, useState } from "react"; 4 | 5 | import Link from "next/link"; 6 | import { usePathname } from "next/navigation"; 7 | import { AnimatePresence, motion, useScroll } from "framer-motion"; 8 | import { 9 | PiArrowSquareOutThin, 10 | PiXCircleLight, 11 | PiFacebookLogoLight, 12 | PiLinkedinLogoLight, 13 | PiLinkLight, 14 | PiGlobe, 15 | } from "react-icons/pi"; 16 | 17 | import { FcCheckmark } from "react-icons/fc"; 18 | import { FaAngleRight, FaTwitter } from "react-icons/fa"; 19 | import { RiVerifiedBadgeFill } from "react-icons/ri"; 20 | import { TbBrandYoutubeFilled, TbCopy } from "react-icons/tb"; 21 | // import Links from "./Links"; 22 | import { BsTwitterX, BsThreads, BsWhatsapp, BsMessenger } from "react-icons/bs"; 23 | import { LiaFlagUsaSolid } from "react-icons/lia"; 24 | 25 | import Stories from "@/app/components/Stories"; 26 | // import stories from "../../data"; 27 | import Stars from "@/app/components/Stars"; 28 | import Location from "@/app/components/Location"; 29 | import Services from "@/app/components/Services"; 30 | import Store from "@/app/components/Store"; 31 | import Message from "@/app/components/Message"; 32 | import Links from "../components/Links"; 33 | 34 | import { Accordion, AccordionItem } from "@nextui-org/react"; 35 | 36 | const inviteUrl = `hey@josephhjamess46@gmail.com`; 37 | 38 | import { MonitorMobileIcon } from "../components/MonitorMobileIcon"; 39 | import { ShieldSecurityIcon } from "../components/ShieldSecurityIcon"; 40 | import { InfoIcon } from "../components/InfoIcon"; 41 | import { InvalidCardIcon } from "../components/InvalidCardIcon"; 42 | import Testimonials from "../components/Testimonials"; 43 | import Photos from "../components/Photos"; 44 | import Footer from "../components/Footer"; 45 | import LinkCompact from "@/app/components/LinkCompact"; 46 | 47 | import YouTube from "react-youtube"; 48 | import Image from "next/image"; 49 | 50 | function Compact() { 51 | const [copied, setCopied] = useState(false); 52 | const [open, setOpen] = useState(false); 53 | const [dialog, setDialog] = useState(false); 54 | 55 | const ref = useRef(null); 56 | 57 | const path = usePathname(); 58 | 59 | const itemClasses = { 60 | base: "py-0 w-full", 61 | title: "font-normal text-medium", 62 | trigger: 63 | "px-2 py-0 data-[hover=true]:bg-default-100 rounded-lg h-14 flex items-center", 64 | indicator: "text-medium", 65 | content: "text-small px-2", 66 | }; 67 | 68 | const options = { 69 | playerVars: { 70 | autoplay: 1, 71 | controls: 1, 72 | }, 73 | }; 74 | 75 | const onReady = (e) => { 76 | e.target.pauseVideo(); 77 | }; 78 | 79 | const defaultContent = 80 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."; 81 | 82 | useScroll({ 83 | target: ref, 84 | offset: ["0 1", "1.33 1"], 85 | }); 86 | 87 | const onCopy = () => { 88 | navigator.clipboard.writeText(inviteUrl); 89 | setCopied(true); 90 | 91 | setTimeout(() => { 92 | setCopied(false); 93 | }, 1000); 94 | }; 95 | 96 | const links = [ 97 | { 98 | iconFirst: , 99 | name: "Share on Facebook", 100 | 101 | lastIcon: , 102 | }, 103 | { 104 | iconFirst: , 105 | name: "Share on LinkedIn", 106 | lastIcon: , 107 | }, 108 | { 109 | iconFirst: , 110 | name: "Share on X", 111 | lastIcon: , 112 | }, 113 | { 114 | iconFirst: , 115 | name: "Share on Threads", 116 | lastIcon: , 117 | }, 118 | { 119 | iconFirst: , 120 | name: "Share on Whatsapp", 121 | lastIcon: , 122 | }, 123 | { 124 | iconFirst: , 125 | name: "Share on Messanger", 126 | lastIcon: , 127 | }, 128 | { 129 | iconFirst: , 130 | name: "hey@josephhjamess46@gmail.com", 131 | stri: "Copy", 132 | lastIcon: , 133 | }, 134 | ]; 135 | 136 | // let copiedd = "hey@josephhjamess46@gmail.com"; 137 | 138 | // console.log(links.at(-1).stri); 139 | 140 | return ( 141 | <> 142 | {path === "/compact" && ""} 143 | 144 |
145 |
146 | 153 |
154 |
155 | 156 |
157 |
158 |
159 |
160 |

161 | Paul wyete 162 | 163 |

164 |
165 |

Est. 1699

166 | 167 |

United Kingdom, Europe

168 | 169 |

He/Him

170 |
171 |
172 |
173 |

174 | Paul wyete is a skateboarder, software designer and content 175 | creator based in England. 176 |

177 | 178 |
179 |
180 | 181 |

Paulwyete.com

182 |
183 |
184 |
185 |
186 | {path === "/compact" && } 187 | {/* */} 188 |
189 |
190 |
191 | 198 |
199 |

200 | Ultra 201 |

202 |
203 | 204 | 207 |
208 | 209 |
210 | 217 |
218 |

219 | Graino Gradients 220 |

221 |
222 | 223 | 226 |
227 |
228 | 235 |
236 |

237 | AR & Design 238 |

239 |
240 | 241 | 244 |
245 |
246 | 288 | } 293 | title="Latest Post" 294 | > 295 |
296 |
297 | 304 | 305 |
306 |
307 |

308 | JoScript Joe 309 |

310 | 311 |
312 | 313 |
314 | @joe 315 | 316 | 319 |
320 |
321 |
322 |
323 |

324 | Propting in AI = The new writing 325 |

326 |
327 |

10:39 PM

328 | 329 |

Jul 23, 2023

330 |
331 |
332 |
333 |
334 | 335 | } 339 | className="text-white bg-[#161616] rounded-xl mt-2 px-3 hover:bg-neutral-800 duration-150 ease-out cursor-pointer" 340 | title="Latest Video" 341 | > 342 | 349 | 350 | } 355 | title="Latest Photos" 356 | > 357 | 358 | 359 | } 364 | subtitle="Store" 365 | > 366 | 367 | 368 | } 373 | subtitle="Latest played" 374 | > 375 | {/* */} 376 | {/* Music */} 377 | 378 | } 383 | subtitle="Services" 384 | > 385 | 386 | 387 | } 392 | subtitle="Testimonials" 393 | > 394 | 395 | 396 | } 401 | subtitle="Where I'm based" 402 | > 403 | 404 | 405 | } 410 | subtitle="Leave a message" 411 | > 412 | 413 | 414 |
415 |
; 416 |
417 |
418 |
419 | 420 | 431 |
432 |
433 |

Share this profile

434 | 435 |
setOpen(false)}> 436 | 437 |
438 |
439 | 440 |
441 | {links.map((link, indx) => ( 442 |
449 |
450 | {link.iconFirst} 451 |

457 | {link.name} 458 |

459 |
460 | {indx === links.length - 1 ? ( 461 | 465 | {copied ? "Copied" : link.stri} 466 | 467 | 468 | {copied ? ( 469 | 479 | 480 | 481 | ) : ( 482 | 492 | 493 | 494 | )} 495 | 496 | 497 | ) : ( 498 | link.lastIcon 499 | )} 500 |
501 | ))} 502 |
503 |
504 |
505 | 516 |
517 |
518 |
setDialog(false)} 521 | > 522 | 523 |
524 | 531 |
532 |

533 | Subscribe to JoScript 534 |

535 |

536 | Stay up to date with everything important 537 |

538 | 539 |
540 | 547 | 550 |
551 |
552 |
553 | 554 | ); 555 | } 556 | 557 | export default Compact; 558 | -------------------------------------------------------------------------------- /app/components/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | function Footer() { 4 | return ( 5 |
6 |
7 |
8 | © {new Date().getFullYear()} 9 | Portfolio by @Joscript 10 |
11 |
12 |

13 | Purchase Courses 14 |

15 | 16 |

17 | Become a Team 18 |

19 |
20 |
21 |
22 | ); 23 | } 24 | 25 | export default Footer; 26 | -------------------------------------------------------------------------------- /app/components/InfiniteMovingCards.jsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import Image from "next/image"; 4 | import React, { useEffect, useState } from "react"; 5 | 6 | import { twMerge } from "tailwind-merge"; 7 | 8 | export const InfiniteMovingCardsPreview = () => { 9 | return ( 10 |
11 | 12 |
13 | ); 14 | }; 15 | 16 | export const InfiniteMovingCards = ({ 17 | direction = "left", 18 | speed = "normal", 19 | pauseOnHover = true, 20 | }) => { 21 | // const testimonials = [ 22 | // { 23 | // quote: 24 | // "It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair.", 25 | // name: "Charles Dickens", 26 | // title: "A Tale of Two Cities", 27 | // }, 28 | // { 29 | // quote: 30 | // "To be, or not to be, that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take Arms against a Sea of troubles, And by opposing end them: to die, to sleep.", 31 | // name: "William Shakespeare", 32 | // title: "Hamlet", 33 | // }, 34 | // { 35 | // quote: "All that we see or seem is but a dream within a dream.", 36 | // name: "Edgar Allan Poe", 37 | // title: "A Dream Within a Dream", 38 | // }, 39 | // { 40 | // quote: 41 | // "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.", 42 | // name: "Jane Austen", 43 | // title: "Pride and Prejudice", 44 | // }, 45 | // { 46 | // quote: 47 | // "Call me Ishmael. Some years ago—never mind how long precisely—having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world.", 48 | // name: "Herman Melville", 49 | // title: "Moby-Dick", 50 | // }, 51 | // ]; 52 | const testimonials = [ 53 | "/images/img1.jpg", 54 | "/images/img3.jpg", 55 | "/images/img4.jpg", 56 | "/images/img5.jpg", 57 | "/images/img6.jpg", 58 | "/images/img7.jpg", 59 | "/images/img8.jpg", 60 | "/images/img9.jpg", 61 | "/images/img10.jpg", 62 | ]; 63 | 64 | const containerRef = React.useRef(null); 65 | const scrollerRef = React.useRef(null); 66 | 67 | useEffect(() => { 68 | addAnimation(); 69 | }, [addAnimation]); 70 | 71 | const [start, setStart] = useState(false); 72 | 73 | function addAnimation() { 74 | if (containerRef.current && scrollerRef.current) { 75 | const scrollerContent = Array.from(scrollerRef.current.children); 76 | 77 | scrollerContent.forEach((item) => { 78 | const duplicatedItem = item.cloneNode(true); 79 | if (scrollerRef.current) { 80 | scrollerRef.current.appendChild(duplicatedItem); 81 | } 82 | }); 83 | 84 | getDirection(); 85 | getSpeed(); 86 | setStart(true); 87 | } 88 | } 89 | const getDirection = () => { 90 | if (containerRef.current) { 91 | if (direction === "left") { 92 | containerRef.current.style.setProperty( 93 | "--animation-direction", 94 | "forwards" 95 | ); 96 | } else { 97 | containerRef.current.style.setProperty( 98 | "--animation-direction", 99 | "reverse" 100 | ); 101 | } 102 | } 103 | }; 104 | const getSpeed = () => { 105 | if (containerRef.current) { 106 | if (speed === "fast") { 107 | containerRef.current.style.setProperty("--animation-duration", "20s"); 108 | } else if ((speed = "normal")) { 109 | containerRef.current.style.setProperty("--animation-duration", "45s"); 110 | } else { 111 | containerRef.current.style.setProperty("--animation-duration", "80s"); 112 | } 113 | } 114 | }; 115 | return ( 116 |
122 |
    130 | {testimonials.map((testimonial, idx) => ( 131 |
  • 135 | 142 |
  • 143 | ))} 144 |
145 |
146 | ); 147 | }; 148 | -------------------------------------------------------------------------------- /app/components/InfoIcon.jsx: -------------------------------------------------------------------------------- 1 | export const InfoIcon = (props) => ( 2 | 34 | ); 35 | -------------------------------------------------------------------------------- /app/components/InvalidCardIcon.jsx: -------------------------------------------------------------------------------- 1 | export const InvalidCardIcon = (props) => ( 2 | 55 | ); 56 | -------------------------------------------------------------------------------- /app/components/LinkCompact.jsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import React from "react"; 3 | 4 | import { 5 | PiDribbbleLogoThin, 6 | PiFigmaLogoThin, 7 | PiGithubLogoThin, 8 | PiInstagramLogoThin, 9 | PiLinkedinLogoLight, 10 | PiYoutubeLogoThin, 11 | } from "react-icons/pi"; 12 | import { BsTwitterX } from "react-icons/bs"; 13 | import { SiEthereum } from "react-icons/si"; 14 | 15 | function Links() { 16 | return ( 17 |
18 | 22 | 23 | 24 | 28 | 29 | 30 | 34 | 35 | 36 | 40 | 41 | 42 | 46 | 47 | 48 | 52 | 53 | 54 | 58 | 59 | 60 | 64 | 65 | 66 |
67 | ); 68 | } 69 | 70 | export default Links; 71 | -------------------------------------------------------------------------------- /app/components/LinkRounded.jsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import React from "react"; 3 | 4 | import { 5 | PiDribbbleLogoThin, 6 | PiFigmaLogoThin, 7 | PiGithubLogoThin, 8 | PiInstagramLogoThin, 9 | PiLinkedinLogoLight, 10 | PiYoutubeLogoThin, 11 | } from "react-icons/pi"; 12 | import { BsTwitterX } from "react-icons/bs"; 13 | import { SiEthereum } from "react-icons/si"; 14 | 15 | function Links() { 16 | return ( 17 |
18 | 22 | 23 | 24 | 28 | 29 | 30 | 34 | 35 | 36 | 40 | 41 | 42 | 46 | 47 | 48 | 52 | 53 | 54 | 58 | 59 | 60 | 64 | 65 | 66 |
67 | ); 68 | } 69 | 70 | export default Links; 71 | -------------------------------------------------------------------------------- /app/components/Links.jsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import React from "react"; 3 | 4 | import { 5 | PiDribbbleLogoThin, 6 | PiFigmaLogoThin, 7 | PiGithubLogoThin, 8 | PiInstagramLogoThin, 9 | PiLinkedinLogoLight, 10 | PiYoutubeLogoThin, 11 | } from "react-icons/pi"; 12 | import { BsTwitterX } from "react-icons/bs"; 13 | import { SiEthereum } from "react-icons/si"; 14 | 15 | function Links() { 16 | return ( 17 |
18 | 22 | 23 | @Joscript 24 | 25 | 29 | 30 | @Joscript 31 | 32 | 36 | 37 | /Joscript 38 | 39 | 43 | 44 | /Joscript 45 | 46 | 50 | 51 | @Joscript 52 | 53 | 57 | 58 | /Joscript 59 | 60 | 64 | 65 | @Joscript 66 | 67 | 71 | 72 | @Joscript 73 | 74 |
75 | ); 76 | } 77 | 78 | export default Links; 79 | -------------------------------------------------------------------------------- /app/components/Location.jsx: -------------------------------------------------------------------------------- 1 | import Image from "next/image"; 2 | import { usePathname } from "next/navigation"; 3 | 4 | import Link from "next/link"; 5 | import React from "react"; 6 | import { LiaFlagUsaSolid } from "react-icons/lia"; 7 | 8 | function Location() { 9 | const path = usePathname(); 10 | 11 | return ( 12 |
13 |
14 |
15 |
16 |

17 | {path === "/youtuber" ? "Currently in" : "My Location "} 18 |

19 | 23 | 24 | USA 25 | 26 |
27 |
28 | 29 |
30 | 40 |
41 |
42 |
43 | ); 44 | } 45 | 46 | export default Location; 47 | -------------------------------------------------------------------------------- /app/components/Message.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import { usePathname } from "next/navigation"; 4 | 5 | function Message() { 6 | const path = usePathname(); 7 | return ( 8 |
9 |
10 |

11 | {path === "/" ? "Leave a Message" : "Submit a question"} 12 |

13 | 14 |
15 | 22 | 29 |