├── .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 |
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 |
205 |
206 |
207 |
208 |
209 |
210 |
217 |
218 |
219 | Graino Gradients
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
235 |
236 |
237 | AR & Design
238 |
239 |
240 |
241 |
242 |
243 |
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 |
317 | Follow
318 |
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 |
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 |
12 |
19 |
26 |
33 |
34 | );
35 |
--------------------------------------------------------------------------------
/app/components/InvalidCardIcon.jsx:
--------------------------------------------------------------------------------
1 | export const InvalidCardIcon = (props) => (
2 |
12 |
19 |
26 |
33 |
40 |
47 |
54 |
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 |
41 |
42 |
43 | );
44 | }
45 |
46 | export default Message;
47 |
--------------------------------------------------------------------------------
/app/components/MonitorMobileIcon.jsx:
--------------------------------------------------------------------------------
1 | export const MonitorMobileIcon = (props) => (
2 |
12 |
19 |
26 |
33 |
40 |
47 |
54 |
55 | );
56 |
--------------------------------------------------------------------------------
/app/components/Photos.jsx:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 | import Link from "next/link";
3 | import React from "react";
4 | import { PiInstagramLogoThin } from "react-icons/pi";
5 |
6 | function Photos() {
7 | return (
8 |
9 |
10 |
11 |
12 |
Latest Photos
13 |
17 |
18 |
@Joscript
19 |
20 |
21 |
22 |
23 |
24 |
31 |
32 |
33 |
34 | );
35 | }
36 |
37 | export default Photos;
38 |
--------------------------------------------------------------------------------
/app/components/Services.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { PiCheckLight, PiLaptop, PiRecycleLight } from "react-icons/pi";
3 |
4 | function Services() {
5 | return (
6 |
7 |
8 |
11 |
12 | {/* Services */}
13 |
14 |
15 |
16 |
17 |
20 |
21 |
Design co-pilot
22 |
23 | Fixed rate of
24 |
25 |
26 | $5,999
27 |
28 |
29 | /Month
30 |
31 |
32 |
33 |
Unlimited revisions
34 |
35 |
36 |
37 |
High quality design
38 |
39 |
40 |
41 |
No calls or meetings
42 |
43 |
44 |
45 |
Simple fixed monthly fee
46 |
47 |
48 |
49 |
Pause or cancel anytime
50 |
51 |
52 |
53 | Subscribe
54 |
55 |
56 |
57 |
60 |
61 |
Landing page
62 |
63 | Starting at
64 |
65 |
66 | $1,999
67 |
68 |
69 | 2-4 weeks delivery
70 |
71 |
75 |
79 |
80 |
81 |
Highly converting
82 |
83 |
84 |
85 |
Subtle animations
86 |
87 |
88 |
89 |
Optimized page speed
90 |
91 |
92 |
93 | Schedule call
94 |
95 |
96 |
97 |
100 |
101 |
Multi-page website
102 |
103 | Starting at
104 |
105 |
106 | $3,999
107 |
108 |
109 | 3-5 weeks delivery
110 |
111 |
112 |
113 |
Multiple pages (10 max)
114 |
115 |
116 |
117 |
SEO-ready
118 |
119 |
120 |
121 |
CMS-ready
122 |
123 |
124 |
125 |
Subtle animations
126 |
127 |
128 |
129 |
Optimized page speed
130 |
131 |
132 |
133 | Subscribe
134 |
135 |
136 |
137 |
138 |
139 |
140 | );
141 | }
142 |
143 | export default Services;
144 |
--------------------------------------------------------------------------------
/app/components/ShieldSecurityIcon.jsx:
--------------------------------------------------------------------------------
1 | export const ShieldSecurityIcon = (props) => (
2 |
12 |
19 |
27 |
35 |
36 | );
37 |
--------------------------------------------------------------------------------
/app/components/Stars.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { PiStarFill } from "react-icons/pi";
3 |
4 | function Stars({ num }) {
5 | function getLength() {
6 | let arr = [];
7 |
8 | for (let i = 0; i < num; i++) {
9 | arr.push( );
10 | }
11 | return arr;
12 | }
13 | return {getLength()}
;
14 | }
15 |
16 | export default Stars;
17 |
--------------------------------------------------------------------------------
/app/components/Store.jsx:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 | import Link from "next/link";
3 | import React from "react";
4 | import { PiInstagramLogoThin } from "react-icons/pi";
5 |
6 | function Store() {
7 | return (
8 |
9 |
10 |
11 |
12 |
Store
13 |
17 |
18 |
@JoStore
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
33 |
34 |
Hoodie
35 |
$80
36 |
37 |
38 |
45 |
46 |
Hoodie
47 |
$80
48 |
49 |
50 |
57 |
58 |
Hoodie
59 |
$80
60 |
61 |
62 |
63 |
64 |
65 | );
66 | }
67 |
68 | export default Store;
69 |
--------------------------------------------------------------------------------
/app/components/Stories.jsx:
--------------------------------------------------------------------------------
1 | import { useRef, useEffect, useCallback, useState } from "react";
2 | import Story from "./Story";
3 | import StoryThumbnail from "./StoryThumbnail";
4 |
5 | import { AnimatePresence, motion } from "framer-motion";
6 |
7 | const Stories = ({ stories }) => {
8 | const [activeStoryIndex, setActiveStoryIndex] = useState(null);
9 | const activeStory = stories[activeStoryIndex];
10 | const isModalOpenRef = useRef(false);
11 |
12 | const handleKeyPress = useCallback((e) => {
13 | if (e.key === "Escape") {
14 | handleModalClose();
15 | }
16 | }, []);
17 |
18 | const handleModalOpen = (index) => {
19 | isModalOpenRef.current = true;
20 | setActiveStoryIndex(index);
21 | window.addEventListener("keyup", handleKeyPress);
22 | };
23 |
24 | const handleModalClose = () => {
25 | setActiveStoryIndex(null);
26 | };
27 |
28 | useEffect(() => {
29 | // Close the modal when reaching the beginning or end of the list
30 | if (activeStoryIndex < 0 || activeStoryIndex >= stories.length) {
31 | handleModalClose();
32 | }
33 | }, [activeStoryIndex, stories.length]);
34 |
35 | useEffect(() => {
36 | if (!activeStory && isModalOpenRef.current) {
37 | isModalOpenRef.current = false;
38 | window.removeEventListener("keyup", handleKeyPress);
39 | }
40 | }, [activeStory, handleKeyPress]);
41 |
42 | useEffect(() => {
43 | // Remove event on unmount
44 | return () => {
45 | window.removeEventListener("keyup", handleKeyPress);
46 | };
47 | }, [handleKeyPress]);
48 |
49 | return (
50 |
51 | {!activeStory ? (
52 | stories.map((story, index) => (
53 |
60 | ))
61 | ) : (
62 |
63 |
78 |
79 | setActiveStoryIndex(activeStoryIndex - 1)}
82 | goToNextStory={() => setActiveStoryIndex(activeStoryIndex + 1)}
83 | handleCloseClick={handleModalClose}
84 | />
85 |
86 |
87 |
88 | )}
89 |
90 | );
91 | };
92 |
93 | export default Stories;
94 |
--------------------------------------------------------------------------------
/app/components/Story.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import cn from "classnames";
3 |
4 | import { IoMdClose } from "react-icons/io";
5 | import { GrNext, GrPrevious } from "react-icons/gr";
6 | import Image from "next/image";
7 |
8 | const Story = ({ story, goToPrevStory, goToNextStory, handleCloseClick }) => {
9 | const [currentSlideIndex, setCurrentSlideIndex] = useState(0);
10 | const { slides, timer = 4000, thumbnail, username } = story;
11 | const currentSlide = slides[currentSlideIndex];
12 | const slideCount = slides.length;
13 |
14 | // Set the CSS animation timing equal to the value in the story props
15 | useEffect(() => {
16 | document.documentElement.style.setProperty(
17 | "--animation-timing",
18 | `${timer}ms`
19 | );
20 | }, [timer]);
21 |
22 | useEffect(() => {
23 | let interval;
24 |
25 | // Change slides on an interval
26 | interval = setInterval(() => {
27 | if (currentSlideIndex < slideCount - 1) {
28 | setCurrentSlideIndex(currentSlideIndex + 1);
29 | } else if (currentSlideIndex === slideCount - 1) {
30 | setCurrentSlideIndex(0);
31 | goToNextStory();
32 | }
33 | }, timer);
34 |
35 | return () => {
36 | clearInterval(interval);
37 | };
38 | }, [goToNextStory, currentSlideIndex, slideCount, timer]);
39 |
40 | const handlePrevClick = () => {
41 | const newIndex = currentSlideIndex - 1;
42 |
43 | if (newIndex < 0) {
44 | setCurrentSlideIndex(0);
45 | goToPrevStory();
46 | } else {
47 | setCurrentSlideIndex(newIndex);
48 | }
49 | };
50 |
51 | const handleNextClick = () => {
52 | const newIndex = currentSlideIndex + 1;
53 |
54 | if (newIndex === slideCount) {
55 | setCurrentSlideIndex(0);
56 | goToNextStory();
57 | } else {
58 | setCurrentSlideIndex(newIndex);
59 | }
60 | };
61 |
62 | return (
63 | <>
64 |
65 |
66 |
67 |
71 |
72 |
73 |
74 | Close
75 |
76 |
77 |
78 |
79 |
86 |
87 |
88 | {slides.map((slide, index) => (
89 | index,
93 | active: currentSlideIndex === index,
94 | })}
95 | />
96 | ))}
97 |
98 |
99 |
100 |
107 |
108 | {username}
109 |
110 |
111 |
112 | {currentSlide.text}
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | >
126 | );
127 | };
128 |
129 | export default Story;
130 |
--------------------------------------------------------------------------------
/app/components/StoryThumbnail.jsx:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 |
3 | const StoryThumbnail = ({ thumbnail, index, setActiveStory, user }) => (
4 | setActiveStory(index)}
7 | >
8 |
15 |
16 | {user}
17 |
18 |
19 | );
20 |
21 | export default StoryThumbnail;
22 |
--------------------------------------------------------------------------------
/app/components/Testimonials.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Stars from "./Stars";
3 | import Image from "next/image";
4 |
5 | function Testimonials() {
6 | return (
7 |
8 |
9 |
12 |
13 |
14 |
15 |
16 |
17 | Lincoln’s design expertise elevated our product to new heights.
18 | A perfect blend of aesthetics and usability. Working with him
19 | was a delight!
20 |
21 |
28 |
JoScript
29 |
30 | Founder, Beta
31 |
32 |
33 |
34 |
35 |
36 | Lincoln’s design expertise elevated our product to new heights.
37 | A perfect blend of aesthetics and usability. Working with him
38 | was a delight!
39 |
40 |
47 |
JoScript
48 |
49 | Founder, Beta
50 |
51 |
52 |
53 |
54 |
55 | Lincoln’s design expertise elevated our product to new heights.
56 | A perfect blend of aesthetics and usability. Working with him
57 | was a delight!
58 |
59 |
66 |
JoScript
67 |
68 | Founder, Beta
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 | );
77 | }
78 |
79 | export default Testimonials;
80 |
--------------------------------------------------------------------------------
/app/components/YutubeLink.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 | PiTiktokLogoThin,
11 | PiYoutubeLogoThin,
12 | } from "react-icons/pi";
13 | import { BsTwitterX } from "react-icons/bs";
14 | import { SiEthereum } from "react-icons/si";
15 |
16 | function Links() {
17 | return (
18 |
19 |
23 |
24 |
@Joscript
25 |
26 |
27 |
31 |
32 |
Joscript
33 |
34 |
35 |
39 |
40 |
@Joscript
41 |
42 |
43 |
47 |
48 |
@Joscript
49 |
50 |
51 | );
52 | }
53 |
54 | export default Links;
55 |
--------------------------------------------------------------------------------
/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/app/favicon.ico
--------------------------------------------------------------------------------
/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | @font-face {
6 | font-family: Interegular;
7 | src: url("../public//font//Interegular.otf");
8 | }
9 | @font-face {
10 | font-family: Interlight;
11 | src: url("../public//font//Interlight.otf");
12 | }
13 | @font-face {
14 | font-family: Intermedium;
15 | src: url("../public//font//Intermedium.otf");
16 | }
17 |
18 | @layer base {
19 | body {
20 | @apply bg-[#111111] transition-all ease-in duration-200;
21 | }
22 | }
23 |
24 | :root {
25 | --width: 640px;
26 | --animation-timing: 4s;
27 | --primary: #118ab2;
28 | --white: #fff;
29 |
30 | --button-size: 40px;
31 | }
32 |
33 | /* img {
34 | vertical-align: middle;
35 | } */
36 |
37 | button {
38 | border: none;
39 | background: none;
40 | cursor: pointer;
41 | padding: 0;
42 | }
43 |
44 | /* .thumbnail span {
45 | display: block;
46 | margin-top: 10px;
47 | font-weight: 700;
48 | } */
49 |
50 | .close {
51 | position: fixed;
52 | top: 10px;
53 | right: 10px;
54 | z-index: 101;
55 | }
56 |
57 | .close svg {
58 | fill: var(--white);
59 | height: 40px;
60 | width: 40px;
61 | }
62 |
63 | .indicator {
64 | display: block;
65 | width: 100%;
66 | height: 2px;
67 | border-radius: 12px;
68 | background: #ccc;
69 | position: relative;
70 | overflow: hidden;
71 | }
72 |
73 | .indicator.active {
74 | transition: transform 1s ease;
75 | }
76 |
77 | .indicator.complete {
78 | background: var(--primary);
79 | }
80 |
81 | .indicator.active::before {
82 | content: "";
83 | width: 100%;
84 | height: 100%;
85 | position: absolute;
86 | background: rgb(150, 150, 150);
87 | animation: fill var(--animation-timing) ease;
88 | }
89 |
90 | @keyframes fill {
91 | from {
92 | transform: translateX(-100%);
93 | }
94 |
95 | to {
96 | transform: translateX(0%);
97 | }
98 | }
99 |
100 | /* .slide {
101 | min-height: 550px;
102 | position: relative;
103 | } */
104 |
105 | /* .user-info span {
106 | color: var(--white);
107 | font-weight: 700;
108 | } */
109 |
110 | .prev-next {
111 | position: absolute;
112 | top: calc(50% - var(--button-size) / 2);
113 | left: 5px;
114 | right: 5px;
115 | }
116 |
117 | .prev-next button {
118 | position: absolute;
119 | background: var(--white);
120 | height: var(--button-size);
121 | width: var(--button-size);
122 | border-radius: 50%;
123 | display: flex;
124 | justify-content: center;
125 | align-items: center;
126 | opacity: 0.7;
127 | }
128 |
129 | .prev-next button:first-child {
130 | left: 0;
131 | }
132 |
133 | .prev-next button:last-child {
134 | right: 0;
135 | }
136 |
137 | /* Slight repositioning of the elements on mobile */
138 | @media screen and (min-width: 520px) {
139 | .prev-next {
140 | left: -50px;
141 | right: -50px;
142 | }
143 | }
144 |
--------------------------------------------------------------------------------
/app/influencer/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { useRef, useState, useEffect } from "react";
4 |
5 | import Link from "next/link";
6 | import { AnimatePresence, motion, useScroll } from "framer-motion";
7 | import {
8 | PiGlobeSimpleThin,
9 | PiUploadThin,
10 | PiXCircleLight,
11 | PiFacebookLogoLight,
12 | PiLinkedinLogoLight,
13 | PiLinkLight,
14 | PiInstagramLogoThin,
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 { TbCopy } from "react-icons/tb";
21 | import YutubeLink from "@/app/components/YutubeLink";
22 | import {
23 | BsTwitterX,
24 | BsThreads,
25 | BsWhatsapp,
26 | BsMessenger,
27 | BsPeople,
28 | } from "react-icons/bs";
29 |
30 | import { cn } from "@nextui-org/react";
31 | import { SiBeatport } from "react-icons/si";
32 |
33 | import Location from "@/app/components/Location";
34 | import Footer from "@/app/components/Footer";
35 | import Message from "../components/Message";
36 | import { InfiniteMovingCards } from "../components/InfiniteMovingCards";
37 | import Store from "../components/Store";
38 | import Image from "next/image";
39 |
40 | const inviteUrl = `Sam@dev.com`;
41 | const inviteUrl2 = `SGREEN30`;
42 |
43 | function Header({ value }) {
44 | const [copied, setCopied] = useState(false);
45 | const [copied2, setCopied2] = useState(false);
46 | const [open, setOpen] = useState(false);
47 | const [dialog, setDialog] = useState(false);
48 |
49 | const ref = useRef(null);
50 |
51 | const { scrollYProgress } = useScroll({
52 | target: ref,
53 | offset: ["0 0", "1 0"],
54 | });
55 |
56 | const onCopy = () => {
57 | navigator.clipboard.writeText(inviteUrl);
58 | setCopied(true);
59 |
60 | setTimeout(() => {
61 | setCopied(false);
62 | }, 1000);
63 | };
64 | const onCopy2 = () => {
65 | navigator.clipboard.writeText(inviteUrl2);
66 | setCopied2(true);
67 |
68 | setTimeout(() => {
69 | setCopied2(false);
70 | }, 1000);
71 | };
72 |
73 | const links = [
74 | {
75 | iconFirst: ,
76 | name: "Share on Facebook",
77 |
78 | lastIcon: ,
79 | },
80 | {
81 | iconFirst: ,
82 | name: "Share on LinkedIn",
83 | lastIcon: ,
84 | },
85 | {
86 | iconFirst: ,
87 | name: "Share on X",
88 | lastIcon: ,
89 | },
90 | {
91 | iconFirst: ,
92 | name: "Share on Threads",
93 | lastIcon: ,
94 | },
95 | {
96 | iconFirst: ,
97 | name: "Share on Whatsapp",
98 | lastIcon: ,
99 | },
100 | {
101 | iconFirst: ,
102 | name: "Share on Messanger",
103 | lastIcon: ,
104 | },
105 | {
106 | iconFirst: ,
107 | name: "josephhjamess46@gmail.com",
108 | stri: "Copy",
109 | lastIcon: ,
110 | },
111 | ];
112 |
113 | const options = {
114 | playerVars: {
115 | autoplay: 1,
116 | controls: 1,
117 | },
118 | };
119 |
120 | const onReady = (e) => {
121 | e.target.pauseVideo();
122 | };
123 |
124 | return (
125 | <>
126 |
136 |
137 |
144 |
Jane Doe
145 |
setOpen(true)}
147 | className="w-9 h-9 rounded-lg bg-neutral-700 text-neutral-300 flex items-center justify-center"
148 | >
149 |
150 |
151 |
152 |
153 |
154 |
161 |
162 |
163 |
174 |
175 |
176 |
177 |
178 |
179 |
180 | Jane Doe
181 |
182 |
183 |
184 |
Est. 1999
185 |
186 |
New York, NY
187 |
188 |
He/Him
189 |
190 |
191 |
192 |
193 | Sam Brown is a travel vlogger, content creator and small
194 | business owner based in New York.
195 |
196 |
197 |
198 |
202 |
203 |
Janedoe.com
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 | {/* Latest Post */}
213 |
214 |
215 |
216 |
Latest Post
217 |
221 |
222 |
@Joscript
223 |
224 |
225 |
226 |
227 |
228 |
229 |
236 |
237 |
238 |
239 |
240 | Sammy Brown
241 |
242 |
243 |
244 |
245 |
246 | @Sahmy
247 |
248 |
249 | Follow
250 |
251 |
252 |
253 |
254 |
255 |
256 | We Live again, do subscribe
257 |
258 |
265 |
266 |
10:39 PM
267 |
268 |
Jul 23, 2023
269 |
270 |
271 |
272 |
273 | {/* Store */}
274 |
275 |
276 | {/* Community */}
277 |
278 |
279 |
280 |
281 | Join my community
282 |
283 |
287 |
288 |
Joscript
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 | {/* Shop dicount */}
297 |
298 |
299 |
300 |
Get 20% off
301 |
305 |
306 |
@Joscript
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 | SGREEN30
315 |
316 |
317 | Use this code in my store{" "}
318 |
319 |
320 | {/* code to copy */}
321 |
322 |
326 |
327 | {copied2 ? "copied" : "Copy"}
328 |
329 |
330 | {copied2 ? (
331 |
341 |
342 |
343 | ) : (
344 |
354 |
355 |
356 | )}
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 | {/* Message */}
365 |
366 |
367 |
368 |
369 |
370 |
371 |
382 |
383 |
384 |
Share this profile
385 |
386 |
setOpen(false)}>
387 |
388 |
389 |
390 |
391 |
392 | {links.map((link, indx) => (
393 |
400 |
401 | {link.iconFirst}
402 |
407 | {link.name}
408 |
409 |
410 | {indx === links.length - 1 ? (
411 |
415 | {copied ? "Copied" : link.stri}
416 |
417 |
418 | {copied ? (
419 |
429 |
430 |
431 | ) : (
432 |
442 |
443 |
444 | )}
445 |
446 |
447 | ) : (
448 | link.lastIcon
449 | )}
450 |
451 | ))}
452 |
453 |
454 |
455 | {/* divide */}
456 |
467 |
468 |
469 |
setDialog(false)}
472 | >
473 |
474 |
475 |
482 |
483 |
484 | Subscribe to Sammy
485 |
486 |
487 | Stay up to date with everything important
488 |
489 |
490 |
491 |
492 |
499 |
500 | Subscribe
501 |
502 |
503 |
504 |
505 |
506 | >
507 | );
508 | }
509 |
510 | export default Header;
511 |
--------------------------------------------------------------------------------
/app/layout.js:
--------------------------------------------------------------------------------
1 | // import { Inter } from 'next/font/google'
2 | import "./globals.css";
3 | import StandardLink from "./standard/StandardLink";
4 |
5 | // const inter = Inter({ subsets: ['latin'] })
6 |
7 | export const metadata = {
8 | title: "My portfolio",
9 | description: "Get to kno more about me",
10 | };
11 |
12 | export default function RootLayout({ children }) {
13 | return (
14 |
15 |
16 |
17 | {children}
18 |
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/app/page.js:
--------------------------------------------------------------------------------
1 | "use client";
2 | import Header from "@/app/components/Header";
3 |
4 | export default function Home() {
5 | return (
6 |
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/app/podcast/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { useRef, useState, useEffect } from "react";
4 |
5 | import Link from "next/link";
6 | import { AnimatePresence, motion, useScroll } from "framer-motion";
7 | import {
8 | PiBellSimple,
9 | PiGlobeSimpleThin,
10 | PiUploadThin,
11 | PiArrowSquareOutThin,
12 | PiXCircleLight,
13 | PiFacebookLogoLight,
14 | PiLinkedinLogoLight,
15 | PiLinkLight,
16 | PiInstagramLogoThin,
17 | PiCalendar,
18 | } from "react-icons/pi";
19 |
20 | import { FcCheckmark } from "react-icons/fc";
21 | import { FaAngleRight, FaTwitter } from "react-icons/fa";
22 | import { RiVerifiedBadgeFill } from "react-icons/ri";
23 | import { TbBrandYoutubeFilled, TbCopy } from "react-icons/tb";
24 | import YutubeLink from "@/app/components/YutubeLink";
25 | import {
26 | BsTwitterX,
27 | BsThreads,
28 | BsWhatsapp,
29 | BsMessenger,
30 | BsPeople,
31 | BsYoutube,
32 | BsSpotify,
33 | BsFileMusic,
34 | } from "react-icons/bs";
35 | // import { LiaFlagUsaSolid } from "react-icons/lia";
36 | import YouTube from "react-youtube";
37 | import { Spotify } from "react-spotify-embed";
38 |
39 | import Stories from "@/app/components/Stories";
40 | import stories from "../../data";
41 | // import Stars from "./Stars";
42 | import Location from "@/app/components/Location";
43 | // import Services from "./Services";
44 | // import Store from "./Store";
45 | // import Message from "./Message";
46 | import Footer from "@/app/components/Footer";
47 | import Message from "../components/Message";
48 | import { cn } from "@nextui-org/react";
49 |
50 | import CountUp from "react-countup";
51 | import { InfiniteMovingCards } from "../components/InfiniteMovingCards";
52 | import {
53 | SiApplepodcasts,
54 | SiGooglepodcasts,
55 | SiOvercast,
56 | SiPocketcasts,
57 | } from "react-icons/si";
58 | import Image from "next/image";
59 |
60 | const inviteUrl = `Sam@dev.com`;
61 |
62 | function Header({ value }) {
63 | const [copied, setCopied] = useState(false);
64 | const [open, setOpen] = useState(false);
65 | const [dialog, setDialog] = useState(false);
66 |
67 | const ref = useRef(null);
68 |
69 | const { scrollYProgress } = useScroll({
70 | target: ref,
71 | offset: ["0 0", "1 0"],
72 | });
73 |
74 | const onCopy = () => {
75 | navigator.clipboard.writeText(inviteUrl);
76 | setCopied(true);
77 |
78 | setTimeout(() => {
79 | setCopied(false);
80 | }, 1000);
81 | };
82 |
83 | const links = [
84 | {
85 | iconFirst: ,
86 | name: "Share on Facebook",
87 |
88 | lastIcon: ,
89 | },
90 | {
91 | iconFirst: ,
92 | name: "Share on LinkedIn",
93 | lastIcon: ,
94 | },
95 | {
96 | iconFirst: ,
97 | name: "Share on X",
98 | lastIcon: ,
99 | },
100 | {
101 | iconFirst: ,
102 | name: "Share on Threads",
103 | lastIcon: ,
104 | },
105 | {
106 | iconFirst: ,
107 | name: "Share on Whatsapp",
108 | lastIcon: ,
109 | },
110 | {
111 | iconFirst: ,
112 | name: "Share on Messanger",
113 | lastIcon: ,
114 | },
115 | {
116 | iconFirst: ,
117 | name: "Sammy@gmail.com",
118 | stri: "Copy",
119 | lastIcon: ,
120 | },
121 | ];
122 |
123 | const options = {
124 | playerVars: {
125 | autoplay: 1,
126 | controls: 1,
127 | },
128 | };
129 |
130 | const onReady = (e) => {
131 | e.target.pauseVideo();
132 | };
133 |
134 | // let copiedd = "hey@josephhjamess46@gmail.com";
135 |
136 | // console.log(links.at(-1).stri);
137 |
138 | return (
139 | <>
140 |
150 |
151 |
158 |
Joscript Podcast
159 |
setOpen(true)}
161 | className="w-9 h-9 rounded-lg bg-neutral-700 text-neutral-300 flex items-center justify-center"
162 | >
163 |
164 |
165 |
166 |
167 |
168 |
175 |
176 |
177 |
188 |
189 |
190 |
191 |
192 |
193 |
194 | Joscript Pod
195 |
196 |
197 |
200 |
201 |
202 |
203 | Join JoScript and Sammy Smith as they explore untold narratives,
204 | hidden meanings, and fascinating connections that shape our
205 | world.tent creator and small business owner based in New York.
206 |
207 |
208 |
209 |
213 |
214 |
JoScriptdev.com
215 |
216 |
217 |
218 |
219 | {" "}
220 | New Videos every week
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 | Listen on
233 |
234 |
Spotify
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 | Listen on
243 |
244 |
Apple Podcast
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 | Listen on
253 |
254 |
Youtube
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 | Listen on
263 |
264 |
Pocket Cast
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 | Listen on
273 |
274 |
Overcast
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 | Listen on
283 |
284 |
Google Podcast
285 |
286 |
287 |
288 |
289 |
290 |
setOpen(true)}
292 | className="w-10 h-10 rounded-lg bg-slate-50 flex items-center justify-center"
293 | >
294 |
295 |
296 |
300 |
301 | {copied ? "copied" : "Sammy@gmail.com"}
302 |
303 |
304 | {copied ? (
305 |
315 |
316 |
317 | ) : (
318 |
328 |
329 |
330 | )}
331 |
332 |
333 |
setDialog(true)}
335 | className="w-10 h-10 rounded-lg bg-slate-50 flex items-center justify-center"
336 | >
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
Stats
348 |
352 |
353 |
@Joscript
354 |
355 |
356 |
357 |
358 |
365 |
366 |
367 | {/* Your host */}
368 |
369 |
370 |
373 |
374 |
375 |
376 |
383 |
384 |
385 |
JoScript
386 |
387 |
388 | Co-host of Joscript{" "}
389 |
390 |
391 |
392 |
393 |
394 |
401 |
402 |
403 |
Real Estate
404 |
405 |
406 | Co-host of Joscript and Real Estate
407 |
408 |
409 |
410 |
411 |
412 |
413 | {/* Tweet */}
414 |
415 |
416 |
417 |
418 |
Latest Post
419 |
423 |
424 |
@Joscript
425 |
426 |
427 |
428 |
429 |
430 |
431 |
438 |
439 |
440 |
441 |
442 | JoScript Joe
443 |
444 |
445 |
446 |
447 |
448 | @joe
449 |
450 |
451 | Follow
452 |
453 |
454 |
455 |
456 |
457 |
458 | We’re joined in the studio by Miss Ella who is a marine
459 | biologist and An Author of best selling book. Episode airing
460 | soon.
461 |
462 |
469 |
470 |
10:39 PM
471 |
472 |
Jul 23, 2023
473 |
474 |
475 |
476 |
477 |
478 | {/* featured video */}
479 |
480 |
481 |
482 |
Latest episode
483 |
487 |
488 |
@Joscript
489 |
490 |
491 |
492 |
493 |
497 |
498 |
499 | {/* Your community */}
500 |
501 |
502 |
503 |
504 |
505 | Support me on Patreon
506 |
507 |
511 |
512 |
Joscript
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 | {/* E[isodes] */}
521 |
522 |
523 |
524 |
525 | Most popular episodes
526 |
527 |
531 |
532 |
@Joscript
533 |
534 |
535 |
536 |
537 |
541 |
545 |
549 |
550 |
551 | {/* Message */}
552 |
553 |
554 |
555 |
556 |
557 |
558 |
569 |
570 |
571 |
Share this profile
572 |
573 |
setOpen(false)}>
574 |
575 |
576 |
577 |
578 |
579 | {links.map((link, indx) => (
580 |
587 |
588 | {link.iconFirst}
589 |
595 | {link.name}
596 |
597 |
598 | {indx === links.length - 1 ? (
599 |
603 | {copied ? "Copied" : link.stri}
604 |
605 |
606 | {copied ? (
607 |
617 |
618 |
619 | ) : (
620 |
630 |
631 |
632 | )}
633 |
634 |
635 | ) : (
636 | link.lastIcon
637 | )}
638 |
639 | ))}
640 |
641 |
642 |
643 | {/* divide */}
644 |
655 |
656 |
657 |
setDialog(false)}
660 | >
661 |
662 |
663 |
670 |
671 |
672 | Don't miss new episodes
673 |
674 |
675 | Subscribe to our email list, and stay up to date when there ' s
676 | a new episode of the Between The Lines Podcast
677 |
678 |
679 |
680 |
681 |
688 |
689 | Subscribe
690 |
691 |
692 |
693 |
694 |
695 | >
696 | );
697 | }
698 |
699 | export default Header;
700 |
--------------------------------------------------------------------------------
/app/rounded/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 | PiInstagramLogoThin,
15 | PiRecycleLight,
16 | PiCheckLight,
17 | PiLaptop,
18 | PiGlobe,
19 | PiYoutubeLogoLight,
20 | PiCaretDownLight,
21 | PiMusicNotesThin,
22 | PiShoppingCart,
23 | PiImageThin,
24 | PiImagesThin,
25 | } from "react-icons/pi";
26 |
27 | import { FcCheckmark } from "react-icons/fc";
28 | import { FaAngleRight, FaTwitter } from "react-icons/fa";
29 | import { RiVerifiedBadgeFill } from "react-icons/ri";
30 | import { TbBrandYoutubeFilled, TbCopy } from "react-icons/tb";
31 | // import Links from "./Links";
32 | import { BsTwitterX, BsThreads, BsWhatsapp, BsMessenger } from "react-icons/bs";
33 | import { LiaFlagUsaSolid } from "react-icons/lia";
34 |
35 | import Stories from "@/app/components/Stories";
36 | // import stories from "../../data";
37 | import Stars from "@/app/components/Stars";
38 | import Location from "@/app/components/Location";
39 | import Services from "@/app/components/Services";
40 | import Store from "@/app/components/Store";
41 | import Message from "@/app/components/Message";
42 | import Links from "../components/Links";
43 |
44 | import { Accordion, AccordionItem } from "@nextui-org/react";
45 |
46 | const inviteUrl = `hey@josephhjamess46@gmail.com`;
47 |
48 | import { MonitorMobileIcon } from "../components/MonitorMobileIcon";
49 | import { ShieldSecurityIcon } from "../components/ShieldSecurityIcon";
50 | import { InfoIcon } from "../components/InfoIcon";
51 | import { InvalidCardIcon } from "../components/InvalidCardIcon";
52 | import Testimonials from "../components/Testimonials";
53 | import Photos from "../components/Photos";
54 | import Footer from "../components/Footer";
55 | import LinkRounded from "@/app/components/LinkRounded";
56 |
57 | import YouTube from "react-youtube";
58 | import Image from "next/image";
59 |
60 | function Rounded() {
61 | const [copied, setCopied] = useState(false);
62 | const [open, setOpen] = useState(false);
63 | const [dialog, setDialog] = useState(false);
64 |
65 | const ref = useRef(null);
66 |
67 | const path = usePathname();
68 |
69 | const itemClasses = {
70 | base: "py-0 w-full",
71 | title: "font-normal text-medium",
72 | trigger:
73 | "px-2 py-0 data-[hover=true]:bg-default-100 rounded-md h-14 flex items-center",
74 | indicator: "text-medium",
75 | content: "text-small px-2",
76 | };
77 |
78 | const options = {
79 | playerVars: {
80 | autoplay: 1,
81 | controls: 1,
82 | },
83 | };
84 |
85 | const onReady = (e) => {
86 | e.target.pauseVideo();
87 | };
88 |
89 | useScroll({
90 | target: ref,
91 | offset: ["0 1", "1.33 1"],
92 | });
93 |
94 | const onCopy = () => {
95 | navigator.clipboard.writeText(inviteUrl);
96 | setCopied(true);
97 |
98 | setTimeout(() => {
99 | setCopied(false);
100 | }, 1000);
101 | };
102 |
103 | const links = [
104 | {
105 | iconFirst: ,
106 | name: "Share on Facebook",
107 |
108 | lastIcon: ,
109 | },
110 | {
111 | iconFirst: ,
112 | name: "Share on LinkedIn",
113 | lastIcon: ,
114 | },
115 | {
116 | iconFirst: ,
117 | name: "Share on X",
118 | lastIcon: ,
119 | },
120 | {
121 | iconFirst: ,
122 | name: "Share on Threads",
123 | lastIcon: ,
124 | },
125 | {
126 | iconFirst: ,
127 | name: "Share on Whatsapp",
128 | lastIcon: ,
129 | },
130 | {
131 | iconFirst: ,
132 | name: "Share on Messanger",
133 | lastIcon: ,
134 | },
135 | {
136 | iconFirst: ,
137 | name: "hey@josephhjamess46@gmail.com",
138 | stri: "Copy",
139 | lastIcon: ,
140 | },
141 | ];
142 |
143 | // let copiedd = "hey@josephhjamess46@gmail.com";
144 |
145 | // console.log(links.at(-1).stri);
146 |
147 | return (
148 | <>
149 | {path === "/rounded" && ""}
150 |
151 |
162 |
163 |
164 |
165 |
166 |
167 |
168 | JoScript Joe
169 |
170 |
171 |
172 |
Est. 1999
173 |
174 |
Auckland, NZ
175 |
176 |
He/Him
177 |
178 |
179 |
180 |
181 | Joscript is a software designer and content creator based in New
182 | Zealand.
183 |
184 |
185 |
186 |
187 |
188 |
189 | {" "}
190 | JoScriptdev.com
191 |
192 |
193 |
194 |
195 |
{path === "/rounded" && }
196 |
197 |
198 |
205 |
206 |
207 | Ultra
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
223 |
224 |
225 | Grainy Gradients
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
241 |
242 |
243 | AR & Design
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
294 | }
300 | title="Latest Post"
301 | >
302 |
303 |
304 |
311 |
312 |
313 |
314 |
315 | JoScript Joe
316 |
317 |
318 |
319 |
320 |
321 | @joe
322 |
323 |
324 | Follow
325 |
326 |
327 |
328 |
329 |
330 |
331 | Propting in AI = The new writing
332 |
333 |
334 |
10:39 PM
335 |
336 |
Jul 23, 2023
337 |
338 |
339 |
340 |
341 |
342 | }
346 | className="text-white bg-[#161616] rounded-md mt-2 px-3 hover:bg-neutral-800 duration-150 ease-out cursor-pointer"
347 | title="Latest Video"
348 | >
349 |
356 |
357 | }
362 | // startContent={ }
363 | title="Latest Photos"
364 | >
365 |
366 |
367 | }
372 | subtitle="Store"
373 | >
374 |
375 |
376 | }
381 | subtitle="Latest played"
382 | >
383 | {/* */}
384 | {/* Music */}
385 |
386 | }
391 | subtitle="Services"
392 | >
393 |
394 |
395 | }
400 | subtitle="Testimonials"
401 | >
402 |
403 |
404 | }
409 | subtitle="Where I'm based"
410 | >
411 |
412 |
413 | }
418 | subtitle="Leave a message"
419 | >
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
438 |
439 |
440 |
Share this profile
441 |
442 |
setOpen(false)}>
443 |
444 |
445 |
446 |
447 |
448 | {links.map((link, indx) => (
449 |
456 |
457 | {link.iconFirst}
458 |
464 | {link.name}
465 |
466 |
467 | {indx === links.length - 1 ? (
468 |
472 | {copied ? "Copied" : link.stri}
473 |
474 |
475 | {copied ? (
476 |
486 |
487 |
488 | ) : (
489 |
499 |
500 |
501 | )}
502 |
503 |
504 | ) : (
505 | link.lastIcon
506 | )}
507 |
508 | ))}
509 |
510 |
511 |
512 |
523 |
524 |
525 |
setDialog(false)}
528 | >
529 |
530 |
531 |
538 |
539 |
540 | Subscribe to JoScript
541 |
542 |
543 | Stay up to date with everything important
544 |
545 |
546 |
547 |
554 |
555 | Subscribe
556 |
557 |
558 |
559 |
560 | >
561 | );
562 | }
563 |
564 | export default Rounded;
565 |
--------------------------------------------------------------------------------
/app/standard/StandardLink.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import Link from "next/link";
4 | import React, { useState } from "react";
5 |
6 | import { motion } from "framer-motion";
7 |
8 | import { PiCaretDoubleUp } from "react-icons/pi";
9 | import { IoMdClose } from "react-icons/io";
10 | import cn from "classnames";
11 | import { usePathname } from "next/navigation";
12 |
13 | function StandardLink() {
14 | const [dialog, setDialog] = useState(false);
15 | const [dialog2, setDialog2] = useState(false);
16 | const path = usePathname();
17 | return (
18 |
19 |
20 |
21 |
setDialog(true)}
23 | className="flex items-center bg-neutral-900 w-40 rounded-xl h-14 px-2 justify-between cursor-pointer"
24 | >
25 |
26 |
27 | Style
28 |
29 |
30 | {path === "/detailed"
31 | ? "Detailed"
32 | : path === "/compact"
33 | ? "compact"
34 | : path === "/rounded"
35 | ? "rounded"
36 | : "detailed"}
37 |
38 |
39 |
40 |
41 |
42 |
43 |
54 |
55 |
56 |
57 | Style
58 |
59 |
60 |
61 | setDialog(false)} href={"/"}>
62 |
73 | Detailed
74 |
75 |
76 |
77 | setDialog(false)} href={"/compact"}>
78 |
89 | Compact
90 |
91 |
92 | setDialog(false)} href={"/rounded"}>
93 |
104 | Rounded
105 |
106 |
107 |
108 |
109 |
110 | setDialog(false)}
113 | >
114 |
115 |
116 |
117 | Close
118 |
119 |
120 |
121 |
122 |
123 | {/* Dilog 2 */}
124 |
125 |
setDialog2(true)}
127 | className="flex items-center bg-neutral-900 md:w-40 rounded-xl h-14 px-2 justify-between cursor-pointer"
128 | >
129 |
130 |
131 | Profile
132 |
133 |
134 | {path === "/"
135 | ? "General"
136 | : path === "/youtuber"
137 | ? "Youtuber"
138 | : path === "/indie-maker"
139 | ? "Indie Maker"
140 | : path === "/influencer"
141 | ? "Influencer"
142 | : path === "/podcast"
143 | ? "Podcast"
144 | : path === "/writer"
145 | ? "Writer"
146 | : "General"}
147 |
148 |
149 |
150 |
151 |
152 |
153 | {/* Dialog 2 */}
154 |
165 |
166 |
167 |
168 | Profile
169 |
170 |
171 |
172 | setDialog2(false)} href={"/"}>
173 |
184 | General
185 |
186 |
187 |
188 | setDialog2(false)} href={"/youtuber"}>
189 |
200 | YouTubeber
201 |
202 |
203 | setDialog2(false)} href={"/indie-maker"}>
204 |
215 | Indie Maker
216 |
217 |
218 | setDialog2(false)} href={"/influencer"}>
219 |
230 | Influencer
231 |
232 |
233 | setDialog2(false)} href={"/podcast"}>
234 |
245 | Podcast
246 |
247 |
248 | setDialog2(false)} href={"/writer"}>
249 |
260 | Writer
261 |
262 |
263 |
264 |
265 |
266 | setDialog2(false)}
269 | >
270 |
271 |
272 |
273 | Close
274 |
275 |
276 |
277 |
278 |
279 |
280 | );
281 | }
282 |
283 | export default StandardLink;
284 |
--------------------------------------------------------------------------------
/app/standard/layout.jsx:
--------------------------------------------------------------------------------
1 | // const inter = Inter({ subsets: ['latin'] })
2 |
3 | import StandardLink from "./StandardLink";
4 |
5 | export const metadata = {
6 | title: "My portfolio footer style",
7 | description: "Always visible",
8 | };
9 |
10 | export default function RootLayout({ children }) {
11 | return (
12 |
13 |
14 |
15 | {children}
16 |
17 |
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/app/writer/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { useRef, useState } from "react";
4 |
5 | import Link from "next/link";
6 | import { AnimatePresence, motion, useScroll } from "framer-motion";
7 | import {
8 | PiGlobeSimpleThin,
9 | PiUploadThin,
10 | PiXCircleLight,
11 | PiFacebookLogoLight,
12 | PiLinkedinLogoLight,
13 | PiLinkLight,
14 | PiCalendar,
15 | PiReadCvLogoLight,
16 | } from "react-icons/pi";
17 |
18 | import { FcCheckmark } from "react-icons/fc";
19 | import { FaAngleRight, FaTwitter } from "react-icons/fa";
20 | import { RiVerifiedBadgeFill } from "react-icons/ri";
21 | import { TbBrandYoutubeFilled, TbCopy } from "react-icons/tb";
22 | import YutubeLink from "@/app/components/YutubeLink";
23 | import {
24 | BsTwitterX,
25 | BsThreads,
26 | BsWhatsapp,
27 | BsMessenger,
28 | BsPeople,
29 | } from "react-icons/bs";
30 | import YouTube from "react-youtube";
31 |
32 | import Footer from "@/app/components/Footer";
33 | import Message from "../components/Message";
34 | import { cn } from "@nextui-org/react";
35 |
36 | import CountUp from "react-countup";
37 | import { InfiniteMovingCards } from "../components/InfiniteMovingCards";
38 | import Image from "next/image";
39 |
40 | const inviteUrl = `Franca@dev.com`;
41 |
42 | function Header({ value }) {
43 | const [copied, setCopied] = useState(false);
44 | const [open, setOpen] = useState(false);
45 | const [dialog, setDialog] = useState(false);
46 |
47 | const ref = useRef(null);
48 |
49 | const { scrollYProgress } = useScroll({
50 | target: ref,
51 | offset: ["0 0", "1 0"],
52 | });
53 |
54 | const onCopy = () => {
55 | navigator.clipboard.writeText(inviteUrl);
56 | setCopied(true);
57 |
58 | setTimeout(() => {
59 | setCopied(false);
60 | }, 1000);
61 | };
62 |
63 | const links = [
64 | {
65 | iconFirst: ,
66 | name: "Share on Facebook",
67 |
68 | lastIcon: ,
69 | },
70 | {
71 | iconFirst: ,
72 | name: "Share on LinkedIn",
73 | lastIcon: ,
74 | },
75 | {
76 | iconFirst: ,
77 | name: "Share on X",
78 | lastIcon: ,
79 | },
80 | {
81 | iconFirst: ,
82 | name: "Share on Threads",
83 | lastIcon: ,
84 | },
85 | {
86 | iconFirst: ,
87 | name: "Share on Whatsapp",
88 | lastIcon: ,
89 | },
90 | {
91 | iconFirst: ,
92 | name: "Share on Messanger",
93 | lastIcon: ,
94 | },
95 | {
96 | iconFirst: ,
97 | name: "josephhjamess46@gmail.com",
98 | stri: "Copy",
99 | lastIcon: ,
100 | },
101 | ];
102 |
103 | const options = {
104 | playerVars: {
105 | autoplay: 1,
106 | controls: 1,
107 | },
108 | };
109 |
110 | const onReady = (e) => {
111 | e.target.pauseVideo();
112 | };
113 |
114 | // let copiedd = "hey@josephhjamess46@gmail.com";
115 |
116 | // console.log(links.at(-1).stri);
117 |
118 | return (
119 | <>
120 |
130 |
131 |
138 |
Franca
139 |
setOpen(true)}
141 | className="w-9 h-9 rounded-lg bg-neutral-700 text-neutral-300 flex items-center justify-center"
142 | >
143 |
144 |
145 |
146 |
147 |
148 |
157 |
158 |
159 |
170 |
171 |
172 |
173 |
174 |
175 |
176 | Franca
177 |
178 |
179 |
180 |
Est. 1999
181 |
182 |
Syney, AUS
183 |
184 |
He/Him
185 |
186 |
187 |
188 |
189 | Franca is a newsletter writer, podcaster and essayist based in
190 | Austin, Texas.
191 |
192 |
193 |
194 |
198 |
199 |
Franca.com
200 |
201 |
202 |
203 |
204 |
205 | {" "}
206 | Newsletter every Friday
207 |
208 |
209 |
210 |
211 |
212 |
213 | Subscribe to my newsletter
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
Stats
224 |
228 |
229 |
@Joscript
230 |
231 |
232 |
233 |
234 |
235 |
239 |
240 |
244 |
Weekly readers
245 |
246 |
247 |
248 | {/* Lates Post */}
249 |
250 |
251 |
252 |
Latest Post
253 |
257 |
258 |
@Joscript
259 |
260 |
261 |
262 |
263 |
264 |
265 |
272 |
273 |
274 |
275 |
276 | JoScript Joe
277 |
278 |
279 |
280 |
281 |
282 | @joe
283 |
284 |
285 | Follow
286 |
287 |
288 |
289 |
290 |
291 |
292 | Just published a new issue of my newsletter!
293 |
294 |
295 |
10:39 PM
296 |
297 |
Jul 23, 2023
298 |
299 |
300 |
301 |
302 |
303 | {/* Video Stats */}
304 |
305 |
306 |
307 |
Stats
308 |
312 |
313 |
@Joscript
314 |
315 |
316 |
317 |
318 |
325 |
326 |
327 | {/* featured video */}
328 |
329 |
330 |
331 |
332 | Most popular issues
333 |
334 |
338 |
339 |
/Joscript
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 | Issue #10 — DEC 3, 2022
348 |
349 |
350 | Unleashing the Power of Community
351 |
352 |
353 | Building Strong Connections for Business Success
354 |
355 |
356 |
357 |
358 |
359 |
360 | Issue #15 — Dec 3 2021
361 |
362 |
363 | Navigating the Real Estate Market
364 |
365 |
366 | insights and Strategies for Buyers and Sellers
367 |
368 |
369 |
370 |
371 |
372 | {/* Community */}
373 |
374 |
375 |
376 |
377 | Join my community
378 |
379 |
383 |
384 |
Joscript
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
409 |
410 |
411 |
Share this profile
412 |
413 |
setOpen(false)}>
414 |
415 |
416 |
417 |
418 |
419 | {links.map((link, indx) => (
420 |
427 |
428 | {link.iconFirst}
429 |
435 | {link.name}
436 |
437 |
438 | {indx === links.length - 1 ? (
439 |
443 | {copied ? "Copied" : link.stri}
444 |
445 |
446 | {copied ? (
447 |
457 |
458 |
459 | ) : (
460 |
470 |
471 |
472 | )}
473 |
474 |
475 | ) : (
476 | link.lastIcon
477 | )}
478 |
479 | ))}
480 |
481 |
482 |
483 | {/* divide */}
484 |
495 |
496 |
497 |
setDialog(false)}
500 | >
501 |
502 |
503 |
510 |
511 |
512 | Subscribe to Franca
513 |
514 |
515 | Stay up to date with everything important
516 |
517 |
518 |
519 |
520 |
527 |
528 | Subscribe
529 |
530 |
531 |
532 |
533 |
534 | >
535 | );
536 | }
537 |
538 | export default Header;
539 |
--------------------------------------------------------------------------------
/app/youtuber/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { useRef, useState, useEffect } from "react";
4 |
5 | import Link from "next/link";
6 | import { AnimatePresence, motion, useScroll } from "framer-motion";
7 | import {
8 | PiBellSimple,
9 | PiGlobeSimpleThin,
10 | PiUploadThin,
11 | PiArrowSquareOutThin,
12 | PiXCircleLight,
13 | PiFacebookLogoLight,
14 | PiLinkedinLogoLight,
15 | PiLinkLight,
16 | PiInstagramLogoThin,
17 | PiCalendar,
18 | } from "react-icons/pi";
19 |
20 | import { FcCheckmark } from "react-icons/fc";
21 | import { FaAngleRight, FaTwitter } from "react-icons/fa";
22 | import { RiVerifiedBadgeFill } from "react-icons/ri";
23 | import { TbBrandYoutubeFilled, TbCopy } from "react-icons/tb";
24 | import YutubeLink from "@/app/components/YutubeLink";
25 | import {
26 | BsTwitterX,
27 | BsThreads,
28 | BsWhatsapp,
29 | BsMessenger,
30 | BsPeople,
31 | BsYoutube,
32 | } from "react-icons/bs";
33 | // import { LiaFlagUsaSolid } from "react-icons/lia";
34 | import YouTube from "react-youtube";
35 | import { Spotify } from "react-spotify-embed";
36 |
37 | import Stories from "@/app/components/Stories";
38 | import stories from "../../data";
39 | // import Stars from "./Stars";
40 | import Location from "@/app/components/Location";
41 | // import Services from "./Services";
42 | // import Store from "./Store";
43 | // import Message from "./Message";
44 | import Footer from "@/app/components/Footer";
45 | import Message from "../components/Message";
46 | import { cn } from "@nextui-org/react";
47 |
48 | import CountUp from "react-countup";
49 | import { InfiniteMovingCards } from "../components/InfiniteMovingCards";
50 | import Image from "next/image";
51 |
52 | const inviteUrl = `Sam@dev.com`;
53 |
54 | function Header({ value }) {
55 | const [copied, setCopied] = useState(false);
56 | const [open, setOpen] = useState(false);
57 | const [dialog, setDialog] = useState(false);
58 |
59 | const ref = useRef(null);
60 |
61 | const { scrollYProgress } = useScroll({
62 | target: ref,
63 | offset: ["0 0", "1 0"],
64 | });
65 |
66 | const onCopy = () => {
67 | navigator.clipboard.writeText(inviteUrl);
68 | setCopied(true);
69 |
70 | setTimeout(() => {
71 | setCopied(false);
72 | }, 1000);
73 | };
74 |
75 | const links = [
76 | {
77 | iconFirst: ,
78 | name: "Share on Facebook",
79 |
80 | lastIcon: ,
81 | },
82 | {
83 | iconFirst: ,
84 | name: "Share on LinkedIn",
85 | lastIcon: ,
86 | },
87 | {
88 | iconFirst: ,
89 | name: "Share on X",
90 | lastIcon: ,
91 | },
92 | {
93 | iconFirst: ,
94 | name: "Share on Threads",
95 | lastIcon: ,
96 | },
97 | {
98 | iconFirst: ,
99 | name: "Share on Whatsapp",
100 | lastIcon: ,
101 | },
102 | {
103 | iconFirst: ,
104 | name: "Share on Messanger",
105 | lastIcon: ,
106 | },
107 | {
108 | iconFirst: ,
109 | name: "josephhjamess46@gmail.com",
110 | stri: "Copy",
111 | lastIcon: ,
112 | },
113 | ];
114 |
115 | const options = {
116 | playerVars: {
117 | autoplay: 1,
118 | controls: 1,
119 | },
120 | };
121 |
122 | const onReady = (e) => {
123 | e.target.pauseVideo();
124 | };
125 |
126 | // let copiedd = "hey@josephhjamess46@gmail.com";
127 |
128 | // console.log(links.at(-1).stri);
129 |
130 | return (
131 | <>
132 |
142 |
143 |
150 |
Sammy Brown
151 |
setOpen(true)}
153 | className="w-9 h-9 rounded-lg bg-neutral-700 text-neutral-300 flex items-center justify-center"
154 | >
155 |
156 |
157 |
158 |
159 |
160 |
168 |
169 |
170 |
181 |
182 |
183 |
184 |
185 |
186 |
187 | Sammy Brown
188 |
189 |
190 |
191 |
Est. 1999
192 |
193 |
New York, NY
194 |
195 |
He/Him
196 |
197 |
198 |
199 |
200 | Sam Brown is a travel vlogger, content creator and small
201 | business owner based in New York.
202 |
203 |
204 |
205 |
209 |
210 |
Sam.com
211 |
212 |
213 |
214 |
215 | {" "}
216 | New Videos every week
217 |
218 |
219 |
220 |
221 |
222 |
setOpen(true)}
224 | className="w-10 h-10 rounded-lg bg-slate-50 flex items-center justify-center"
225 | >
226 |
227 |
228 |
232 |
233 | {copied ? "copied" : "Sammy@gmail.com"}
234 |
235 |
236 | {copied ? (
237 |
247 |
248 |
249 | ) : (
250 |
260 |
261 |
262 | )}
263 |
264 |
265 |
setDialog(true)}
267 | className="w-10 h-10 rounded-lg bg-slate-50 flex items-center justify-center"
268 | >
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
Stats
282 |
286 |
287 |
@Joscript
288 |
289 |
290 |
291 |
292 |
293 |
294 |
298 |
Subscribers
299 |
300 |
304 |
311 |
312 |
313 |
314 |
315 |
316 |
Stats
317 |
321 |
322 |
@Joscript
323 |
324 |
325 |
326 |
327 |
334 |
335 |
336 |
337 |
338 |
339 | Join my community
340 |
341 |
345 |
346 |
Joscript
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
Latest Post
357 |
361 |
362 |
@Joscript
363 |
364 |
365 |
366 |
367 |
368 |
369 |
376 |
377 |
378 |
379 |
380 | JoScript Joe
381 |
382 |
383 |
384 |
385 |
386 | @joe
387 |
388 |
389 | Follow
390 |
391 |
392 |
393 |
394 |
395 |
396 | Stepping into the new season with a mix of earth colors and
397 | bold steps
398 |
399 |
400 |
10:39 PM
401 |
402 |
Jul 23, 2023
403 |
404 |
405 |
406 |
407 | {/* featured video */}
408 |
409 |
410 |
411 |
Featured videos
412 |
416 |
417 |
@Joscript
418 |
419 |
420 |
421 |
422 |
423 |
424 |
431 |
432 |
433 | 12:06
434 |
435 |
436 |
437 |
438 |
439 | Immersing in the Vibrant Flavors of Mexico
440 |
441 |
442 |
1.3m views
443 |
444 |
5 weeks ago
445 |
446 |
447 |
448 |
449 |
450 |
457 |
458 |
459 | 18:00
460 |
461 |
462 |
463 |
464 |
465 | Discovering the Pacific Coastline of California
466 |
467 |
468 |
922k views
469 |
470 |
1 year ago
471 |
472 |
473 |
474 |
475 |
476 |
483 |
484 |
485 | 12:06
486 |
487 |
488 |
489 |
490 |
491 | 12 things you need to know before visiting Iceland and New
492 | York
493 |
494 |
495 |
1.9m views
496 |
497 |
5 months ago
498 |
499 |
500 |
501 |
502 |
506 |
507 |
508 |
509 |
510 |
My channels
511 |
515 |
516 |
@Joscript
517 |
518 |
519 |
520 |
521 |
522 |
523 |
530 |
531 |
532 |
JoScript
533 |
534 |
2m subscribers
535 |
536 |
18 videos
537 |
538 |
539 |
540 |
541 |
542 |
549 |
550 |
551 |
Real Estate
552 |
553 |
219m subscribers
554 |
555 |
1 videos
556 |
557 |
558 |
559 |
560 | {/* Latest photos */}
561 | {/* Store */}
562 | {/* Services */}
563 | {/*
*/}
564 | {/* Location */}
565 |
566 | {/* Message */}
567 |
568 |
569 |
570 |
571 |
572 |
573 |
584 |
585 |
586 |
Share this profile
587 |
588 |
setOpen(false)}>
589 |
590 |
591 |
592 |
593 |
594 | {links.map((link, indx) => (
595 |
602 |
603 | {link.iconFirst}
604 |
610 | {link.name}
611 |
612 |
613 | {indx === links.length - 1 ? (
614 |
618 | {copied ? "Copied" : link.stri}
619 |
620 |
621 | {copied ? (
622 |
632 |
633 |
634 | ) : (
635 |
645 |
646 |
647 | )}
648 |
649 |
650 | ) : (
651 | link.lastIcon
652 | )}
653 |
654 | ))}
655 |
656 |
657 |
658 | {/* divide */}
659 |
670 |
671 |
672 |
setDialog(false)}
675 | >
676 |
677 |
678 |
685 |
686 |
687 | Subscribe to Sammy
688 |
689 |
690 | Stay up to date with everything important
691 |
692 |
693 |
694 |
695 |
702 |
703 | Subscribe
704 |
705 |
706 |
707 |
708 |
709 | >
710 | );
711 | }
712 |
713 | export default Header;
714 |
--------------------------------------------------------------------------------
/data.js:
--------------------------------------------------------------------------------
1 | // import thumb1 from "./images/thumb-1.jpg";
2 | // import thumb2 from "./images/thumb-2.jpg";
3 | // import thumb3 from "./images/thumb-3.jpg";
4 | // import story1 from "./images/story-1.jpg";
5 | // import story2 from "./images/story-2.jpg";
6 | // import story3 from "./images/story-3.jpg";
7 | // import story4 from "./images/story-4.jpg";
8 | // import story5 from "./images/story-5.jpg";
9 | // import story6 from "./images/story-6.jpg";
10 | // import story7 from "./images/story-7.jpg";
11 |
12 | export default [
13 | {
14 | username: "Board",
15 | thumbnail: {
16 | src: "/images/yellow.jpg",
17 | alt: "thumb 1",
18 | },
19 | slides: [
20 | {
21 | text: "My wife and i in Ibizza",
22 | image: "/images/img4.jpg",
23 | },
24 | {
25 | text: "My wife photoshoot",
26 | image: "/images/img5.jpg",
27 | },
28 | {
29 | text: "Days in the oak",
30 | image: "/images/img6.jpg",
31 | },
32 | {
33 | text: "Webly Stadium is lit ",
34 | image: "/images/img7.jpg",
35 | },
36 | {
37 | text: "Up and gratefull",
38 | image: "/images/img8.jpg",
39 | },
40 | ],
41 | timer: 4000,
42 | },
43 | {
44 | username: "Travel",
45 | thumbnail: {
46 | src: "/images/img1.jpg",
47 | alt: "thumb 2",
48 | },
49 | slides: [
50 | {
51 | text: "Say my name in the dark",
52 | image: "/images/f.jpg",
53 | },
54 | {
55 | text: "Secrets are poison",
56 | image: "/images/img6.jpg",
57 | },
58 | ],
59 | timer: 4000,
60 | },
61 | {
62 | username: "Happy",
63 | thumbnail: {
64 | src: "/images/img11.jpg",
65 | alt: "thumb 3",
66 | },
67 | slides: [
68 | {
69 | text: "Take the bull by the bulls",
70 | image: "/images/f.jpg",
71 | },
72 | ],
73 | timer: 4000,
74 | },
75 | {
76 | username: "Toys",
77 | thumbnail: {
78 | src: "/images/img10.jpg",
79 | alt: "thumb 3",
80 | },
81 | slides: [
82 | {
83 | text: "Thabanda",
84 | image: "/images/f.jpg",
85 | },
86 | ],
87 | timer: 4000,
88 | },
89 | {
90 | username: "Friends",
91 | thumbnail: {
92 | src: "/images/img9.jpg",
93 | alt: "thumb 3",
94 | },
95 | slides: [
96 | {
97 | text: "Nice try Boris Johnson",
98 | image: "/images/f.jpg",
99 | },
100 | ],
101 | timer: 4000,
102 | },
103 | ];
104 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "paths": {
4 | "@/*": ["./*"]
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {}
3 |
4 | module.exports = nextConfig
5 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dribbble",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@nextui-org/react": "^2.2.9",
13 | "classnames": "^2.3.2",
14 | "framer-motion": "^10.16.12",
15 | "mini-svg-data-uri": "^1.4.4",
16 | "next": "14.0.3",
17 | "next-tailwindcss-defaulttheme": "^1.1.10",
18 | "react": "^18",
19 | "react-countup": "^6.5.0",
20 | "react-dom": "^18",
21 | "react-icons": "^4.12.0",
22 | "react-spotify-embed": "^2.0.3",
23 | "react-youtube": "^10.1.0",
24 | "tailwind-colors": "^1.1.0",
25 | "tailwind-merge": "^2.1.0"
26 | },
27 | "devDependencies": {
28 | "autoprefixer": "^10.0.1",
29 | "eslint": "^8",
30 | "eslint-config-next": "14.0.3",
31 | "postcss": "^8",
32 | "tailwindcss": "^3.3.0"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/font/Interegular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/font/Interegular.otf
--------------------------------------------------------------------------------
/public/font/Interlight.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/font/Interlight.otf
--------------------------------------------------------------------------------
/public/font/Intermedium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/font/Intermedium.otf
--------------------------------------------------------------------------------
/public/images/cry.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/cry.jpg
--------------------------------------------------------------------------------
/public/images/f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/f.jpg
--------------------------------------------------------------------------------
/public/images/img1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img1.jpg
--------------------------------------------------------------------------------
/public/images/img10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img10.jpg
--------------------------------------------------------------------------------
/public/images/img11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img11.jpg
--------------------------------------------------------------------------------
/public/images/img3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img3.jpg
--------------------------------------------------------------------------------
/public/images/img4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img4.jpg
--------------------------------------------------------------------------------
/public/images/img4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img4.png
--------------------------------------------------------------------------------
/public/images/img5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img5.jpg
--------------------------------------------------------------------------------
/public/images/img6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img6.jpg
--------------------------------------------------------------------------------
/public/images/img7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img7.jpg
--------------------------------------------------------------------------------
/public/images/img8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img8.jpg
--------------------------------------------------------------------------------
/public/images/img9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/img9.jpg
--------------------------------------------------------------------------------
/public/images/mapp.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/mapp.webp
--------------------------------------------------------------------------------
/public/images/mappp.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/mappp.webp
--------------------------------------------------------------------------------
/public/images/yellow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/images/yellow.jpg
--------------------------------------------------------------------------------
/public/next.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/videos/yutube.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Joscriptt/multiphaceportfolio/5babb9581969a02ea1eaf35c16bfbe217a5dd9b5/public/videos/yutube.mp4
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | const defaultTheme = require("tailwindcss/defaultTheme");
2 |
3 | const colors = require("tailwindcss/colors");
4 | const svgToDataUri = require("mini-svg-data-uri");
5 | const {
6 | default: flattenColorPalette,
7 | } = require("tailwindcss/lib/util/flattenColorPalette");
8 |
9 | /** @type {import('tailwindcss').Config} */
10 | module.exports = {
11 | content: [
12 | "./pages/**/*.{js,ts,jsx,tsx}",
13 | "./components/**/*.{js,ts,jsx,tsx}",
14 | "./app/**/*.{js,ts,jsx,tsx}",
15 | ],
16 | theme: {
17 | extend: {
18 | animation: {
19 | scroll:
20 | "scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite",
21 | },
22 | keyframes: {
23 | scroll: {
24 | to: {
25 | transform: "translate(calc(-50% - 0.5rem))",
26 | },
27 | },
28 | },
29 | },
30 |
31 | fontFamily: {
32 | Interegular: "Interegular",
33 | Interlight: "Interlight",
34 | Intermedium: "Intermedium",
35 | },
36 | },
37 | plugins: [
38 | addVariablesForColors, // required for using colors like var(--gray-200)
39 | ],
40 | };
41 |
42 | // This plugin adds each Tailwind color as a global CSS variable, e.g. var(--gray-200).
43 | function addVariablesForColors({ addBase, theme }) {
44 | let allColors = flattenColorPalette(theme("colors"));
45 | let newVars = Object.fromEntries(
46 | Object.entries(allColors).map(([key, val]) => [`--${key}`, val])
47 | );
48 |
49 | addBase({
50 | ":root": newVars,
51 | });
52 | }
53 |
--------------------------------------------------------------------------------