├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── custom.md │ └── feature_request.md └── workflows │ └── codeql-analysis.yml ├── .gitignore ├── .prettierrc.json ├── README.md ├── components ├── buttonlist.js ├── cover-image.js ├── date.js ├── footer.js ├── layout.js ├── markdown-styles.module.css ├── meta.js ├── more-stories.js ├── navbar.js ├── navbutton.js ├── othersection.js ├── page-layout.js ├── post-body.js ├── post-header.js ├── post-preview.js ├── project-preview.js ├── projectlist.js ├── read-time.js ├── social-icons.js ├── writing-preview.js └── writinglist.js ├── jsconfig.json ├── lib ├── api.js ├── constants.js └── markdownToHtml.js ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── _app.js ├── _document.js ├── about.js ├── api │ ├── exit-preview.js │ └── preview.js ├── freelance.js ├── index.js ├── playground.js ├── thoughtboard.js ├── work │ └── [slug].js ├── writings.js └── writings │ └── [slug].js ├── postcss.config.js ├── public ├── Shreyas_Gupta_Design_Resume-compressed.pdf ├── android-icon-144x144.png ├── android-icon-192x192.png ├── android-icon-36x36.png ├── android-icon-48x48.png ├── android-icon-72x72.png ├── android-icon-96x96.png ├── apple-icon-114x114.png ├── apple-icon-120x120.png ├── apple-icon-144x144.png ├── apple-icon-152x152.png ├── apple-icon-180x180.png ├── apple-icon-57x57.png ├── apple-icon-60x60.png ├── apple-icon-72x72.png ├── apple-icon-76x76.png ├── apple-icon-precomposed.png ├── apple-icon.png ├── browserconfig.xml ├── dark-logo.svg ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon-96x96.png ├── favicon.ico ├── fonts │ ├── Inter-Black.woff2 │ ├── Inter-Bold.woff2 │ ├── Inter-Light.woff2 │ ├── Inter-Medium.woff2 │ ├── Inter-Regular.woff2 │ ├── Inter-SemiBold.woff2 │ ├── Inter-Thin.woff2 │ ├── Rubik-Black.woff2 │ ├── Rubik-Bold.woff2 │ ├── Rubik-Light.woff2 │ ├── Rubik-Medium.woff2 │ ├── Rubik-Regular.woff2 │ └── Rubik-SemiBold.woff2 ├── images │ ├── Instagram-nu.png │ ├── atlan.png │ ├── donut.png │ ├── figma-file-search.png │ ├── icons.png │ ├── includepeople.jpeg │ ├── install_button@2x.png │ ├── logorender1.png │ ├── lowpolyearth.png │ ├── notion.png │ ├── pie-long.png │ ├── pie-long.svg │ ├── pie.png │ ├── pie.svg │ ├── playground.png │ ├── sustain-long.svg │ ├── sustain.svg │ ├── technology-together.png │ ├── tedx.png │ ├── tools-long.png │ ├── tools.png │ ├── whistle.png │ └── zomato.png ├── letterboxd.svg ├── logo.svg ├── ms-icon-144x144.png ├── ms-icon-150x150.png ├── ms-icon-310x310.png ├── ms-icon-70x70.png ├── robots.txt └── safari-pinned-tab.svg ├── stylelint.config.js ├── styles └── index.css └── tailwind.config.js /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '35 1 * * 4' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 37 | # Learn more: 38 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 39 | 40 | steps: 41 | - name: Checkout repository 42 | uses: actions/checkout@v2 43 | 44 | # Initializes the CodeQL tools for scanning. 45 | - name: Initialize CodeQL 46 | uses: github/codeql-action/init@v1 47 | with: 48 | languages: ${{ matrix.language }} 49 | # If you wish to specify custom queries, you can do so here or in a config file. 50 | # By default, queries listed here will override any specified in a config file. 51 | # Prefix the list here with "+" to use these queries and those in the config file. 52 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 53 | 54 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 55 | # If this step fails, then you should remove it and run the build manually (see below) 56 | - name: Autobuild 57 | uses: github/codeql-action/autobuild@v1 58 | 59 | # ℹ️ Command-line programs to run using the OS shell. 60 | # 📚 https://git.io/JvXDl 61 | 62 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 63 | # and modify them (or add more) to build your code if your project 64 | # uses a compiled language 65 | 66 | #- run: | 67 | # make bootstrap 68 | # make release 69 | 70 | - name: Perform CodeQL Analysis 71 | uses: github/codeql-action/analyze@v1 72 | -------------------------------------------------------------------------------- /.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 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "tabWidth": 2, 4 | "semi": false, 5 | "singleQuote": true, 6 | "quoteProps": "preserve", 7 | "htmlWhitespaceSensitivity": "ignore" 8 | } 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Source Code for Personal Blog and Portfolio 2 | 3 | This is my playground for testing new features and learning the best web dev practices out there. It contains my portfolio projects, writings and experiments. Designers, feel free to reach out to me for help with building your online portfolios. I will be moving away from this soon and adopting a Framer website for ease of use. 4 | 5 | * Built using [Next.js](https://nextjs.org) 6 | * Deployed on [Vercel](https://vercel.com) 7 | * Styled using [Tailwind CSS v3.2](https://tailwindcss.com) 8 | * Content managed using [Cosmic.js CMS](https://www.cosmicjs.com) 9 | 10 | TODO 11 | * Use `next/font` with self-hosted Inter from Google Fonts 12 | * Become markdown native and move away from Cosmic CMS 13 | 14 | As I am using a CMS, without setting up a mock cosmicJS account, you won't be able to deploy and run the code. I will create a mock cosmic account when I get time. 15 | 16 | 17 | -------------------------------------------------------------------------------- /components/buttonlist.js: -------------------------------------------------------------------------------- 1 | const navButtons = [ 2 | { 3 | label: 'Portfolio', 4 | path: '/', 5 | }, 6 | { 7 | label: 'Writings', 8 | path: '/writings', 9 | }, 10 | ] 11 | 12 | export default navButtons 13 | -------------------------------------------------------------------------------- /components/cover-image.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import Image from "next/image" 3 | 4 | export default function CoverImage({ title, url, slug }) { 5 | const image = ( 6 | {`Cover 16 | ) 17 | return ( 18 |
19 | {slug ? ( 20 | 21 | {image} 22 | 23 | ) : ( 24 | image 25 | )} 26 |
27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /components/date.js: -------------------------------------------------------------------------------- 1 | import { parseISO, format } from 'date-fns' 2 | 3 | //parse cosmic post metadata into desired format 4 | export default function Date({ dateString }) { 5 | const date = parseISO(dateString) 6 | const formatedDate = format(date, 'd LLL, yyyy') 7 | return ( 8 |
9 | 10 |
11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /components/footer.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import SocialLinks from './social-icons' 3 | 4 | export default function Footer({ contentArea }) { 5 | //dark mode link styling for footer 6 | function LinkStyleTag(linkText, link) { 7 | return ( 8 | 14 | {linkText} 15 | 16 | ) 17 | } 18 | 19 | return ( 20 |
25 | 42 |
43 | ) 44 | } 45 | -------------------------------------------------------------------------------- /components/layout.js: -------------------------------------------------------------------------------- 1 | import Footer from './footer' 2 | import Meta from './meta' 3 | import Buttonlist from './buttonlist' 4 | import Navbar from './navbar' 5 | 6 | export default function Layout({ preview, children }) { 7 | return ( 8 |
9 | 10 | 11 |
12 |
{children}
13 |
14 | 18 |
20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /components/markdown-styles.module.css: -------------------------------------------------------------------------------- 1 | .markdown { 2 | @apply content-center leading-relaxed; 3 | 4 | p { 5 | @apply mb-4; 6 | } 7 | strong { 8 | @apply font-semibold text-white; 9 | } 10 | 11 | code { 12 | font-size: 0.85em; 13 | background-color: #484848; 14 | border-radius: 4px; 15 | padding: 0.2em 0.4em; 16 | } 17 | 18 | /* Lists */ 19 | ul, 20 | ol { 21 | @apply my-3 lg:pl-0; 22 | } 23 | 24 | ol { 25 | @apply list-decimal; 26 | } 27 | ul { 28 | @apply list-disc; 29 | } 30 | li { 31 | @apply mb-3 ml-8; 32 | p, 33 | ul, 34 | ol { 35 | @apply mb-0; 36 | } 37 | } 38 | 39 | /* Blockquote */ 40 | blockquote > p { 41 | @apply p-6 my-6; 42 | } 43 | 44 | /* Headings */ 45 | h2, 46 | h3, 47 | h4 { 48 | @apply mt-12 mb-2 font-semibold leading-snug tracking-tight; 49 | } 50 | h2 { 51 | @apply text-2xl; 52 | } 53 | h3 { 54 | @apply text-xl; 55 | } 56 | h4 { 57 | @apply text-lg; 58 | } 59 | h5 { 60 | @apply mb-2 text-base font-semibold leading-snug tracking-tight text-gray-400; 61 | } 62 | 63 | /* Links */ 64 | a { 65 | @apply transition-opacity duration-300 ease-in-out text-dark-mode-link-blue; 66 | } 67 | a:hover { 68 | border-bottom: 1.5px solid #06c; 69 | } 70 | img { 71 | @apply my-6; 72 | } 73 | } 74 | 75 | /* Responsive Design */ 76 | @screen md { 77 | .markdown { 78 | p, 79 | h2, 80 | h3, 81 | h4, 82 | h5, 83 | li, 84 | ul, 85 | ol { 86 | @apply max-w-2xl mx-auto; 87 | } 88 | li { 89 | @apply ml-8; 90 | } 91 | } 92 | } 93 | @screen lg { 94 | .markdown { 95 | p, 96 | h2, 97 | h3, 98 | h4, 99 | h5, 100 | li, 101 | ul, 102 | ol { 103 | @apply max-w-3xl mx-auto; 104 | } 105 | p > img { 106 | @apply content-center max-w-3xl mx-auto rounded-lg; 107 | } 108 | li { 109 | @apply ml-8; 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /components/meta.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head' 2 | import Script from 'next/script' 3 | export default function Meta() { 4 | return ( 5 | 6 | 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /components/more-stories.js: -------------------------------------------------------------------------------- 1 | import PostPreview from './post-preview' 2 | 3 | export default function MoreStories({ posts }) { 4 | return ( 5 |
6 |
7 |

8 | Read More 9 |

10 |
11 |
12 | {posts.map((post) => ( 13 | 22 | ))} 23 |
24 |
25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /components/navbar.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import NavButton from '@/components/navbutton' 3 | import Link from 'next/link' 4 | import Image from 'next/image' 5 | 6 | function Navbar({ navButtons }) { 7 | return ( 8 | <> 9 |
10 | 65 |
66 | 67 | ) 68 | } 69 | export default Navbar 70 | -------------------------------------------------------------------------------- /components/navbutton.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import { withRouter } from 'next/router' //withRouter adds the router prop to the const 3 | 4 | //use the router prop to get the pathname, split it on '/' and style the link by giving it a classname which matches the base path (/writing, /portfolio) 5 | const NavButton = (props) => ( 6 | 7 |
14 | {props.label} 15 |
16 | 17 | ) 18 | 19 | export default withRouter(NavButton) 20 | -------------------------------------------------------------------------------- /components/othersection.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import Image from 'next/head' 3 | export default function OtherSection() { 4 | return ( 5 |
6 | 7 |
8 |
9 | Cover image for playground section 16 |
17 |
18 | Freelancing 19 |
20 |
21 | 22 | 23 | 24 |
25 |
26 | Cover image for playground section 33 |
34 |
35 | Podcasts 36 |
37 |
38 | 39 | 40 | 41 |
42 |
43 | Cover image for playground section 50 |
51 |
52 | playground 53 |
54 |
55 | 56 |
57 | ) 58 | } 59 | -------------------------------------------------------------------------------- /components/page-layout.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react' 2 | import Navbar from '@/components/navbar' 3 | import Buttonlist from '@/components/buttonlist' 4 | import Meta from './meta' 5 | import Footer from '@/components/footer' 6 | 7 | export default function Layout({ children }) { 8 | // create scroll-based progressbar for articles 9 | const [scroll, setScroll] = useState(0) 10 | 11 | useEffect(() => { 12 | let progressBarHandler = () => { 13 | const totalScroll = document.documentElement.scrollTop 14 | const windowHeight = 15 | document.documentElement.scrollHeight - 16 | document.documentElement.clientHeight 17 | const scroll = `${totalScroll / windowHeight}` 18 | 19 | setScroll(scroll) 20 | } 21 | 22 | window.addEventListener('scroll', progressBarHandler) 23 | 24 | return () => window.removeEventListener('scroll', progressBarHandler) 25 | }) 26 | return ( 27 | <> 28 |
29 |
30 |
31 |
35 |
36 |
37 | 38 |
39 | 40 |
41 |
42 |
{children}
43 |
44 |
45 |
46 |
47 |
48 | 49 | ) 50 | } 51 | -------------------------------------------------------------------------------- /components/post-body.js: -------------------------------------------------------------------------------- 1 | import markdownStyles from './markdown-styles.module.css' 2 | 3 | export default function PostBody({ content }) { 4 | return ( 5 |
6 |
10 |
11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /components/post-header.js: -------------------------------------------------------------------------------- 1 | import Date from './date' 2 | import React from 'react' 3 | import CoverImage from './cover-image' 4 | import ReadingTime from './read-time' 5 | export default function PostHeader({ 6 | title, 7 | coverImage, 8 | date, 9 | excerpt, 10 | content, 11 | }) { 12 | const timeLink = `https://s2.svgbox.net/materialui.svg?ic=circle&color=fff` 13 | 14 | return ( 15 | <> 16 |
17 |
18 |
19 | 20 |
21 | 22 |
23 |
24 | 25 |
26 |
27 |
28 |

{title}

29 |
30 |

31 | {excerpt} 32 |

33 |
34 |
35 |
36 | 37 |
38 | 39 | ) 40 | } 41 | -------------------------------------------------------------------------------- /components/post-preview.js: -------------------------------------------------------------------------------- 1 | import Date from './date' 2 | import Link from 'next/link' 3 | 4 | export default function PostPreview({ 5 | title, 6 | coverImage, 7 | date, 8 | excerpt, 9 | slug, 10 | }) { 11 | return ( 12 | 13 |
14 |

15 | {title} 16 |

17 |

18 | {excerpt} 19 |

20 |
21 | 22 |
23 |
24 | 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /components/project-preview.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import Image from "next/image" 3 | 4 | export default function ProjectPreview({ title, coverImage, excerpt, slug }) { 5 | return ( 6 | 7 |
8 |
9 | {`Cover 19 |
20 | {/*
21 |

22 | {title} 23 |

24 |

25 | {excerpt} 26 |

27 |
*/} 28 |
29 | 30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /components/projectlist.js: -------------------------------------------------------------------------------- 1 | import ProjectPreview from './project-preview' 2 | export default function MoreStories({ posts }) { 3 | return ( 4 |
5 |
6 | {posts.map((post) => ( 7 | 15 | ))} 16 |
17 |
18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /components/read-time.js: -------------------------------------------------------------------------------- 1 | const readingTime = require('reading-time') 2 | 3 | export default function readTime({ content }) { 4 | const stats = readingTime(content) 5 | return stats.text 6 | } 7 | -------------------------------------------------------------------------------- /components/social-icons.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | export default function Index() { 3 | var linkList = [ 4 | 'https://www.linkedin.com/in/shreyas-gupta/', 5 | 'https://dribbble.com/shreyasgupta', 6 | 'https://github.com/GLaDO8', 7 | 'https://www.instagram.com/wutamelonshrey/', 8 | 'https://twitter.com/wutamelonshrey', 9 | ] 10 | var iconList = ['linkedin', 'dribbble', 'github', 'instagram', 'twitter'] 11 | 12 | function iconLinkGenerator(name, link) { 13 | return ( 14 | 15 | {name} 21 | 22 | ) 23 | } 24 | return ( 25 |
26 | {linkList.map((link, index) => iconLinkGenerator(iconList[index], link))} 27 | 32 | {'letterboxd'} 38 | 39 |
40 | ) 41 | } 42 | -------------------------------------------------------------------------------- /components/writing-preview.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | export default function writingPreview({ title, udate, excerpt, slug }) { 3 | return ( 4 | <> 5 | 6 |
7 |
8 |

9 | {title} 10 |

11 |

{excerpt}

12 |

{udate}

13 |
14 |
15 | 16 | 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /components/writinglist.js: -------------------------------------------------------------------------------- 1 | import WritingPreview from './writing-preview' 2 | 3 | export default function WritingsList({ posts }) { 4 | return ( 5 |
6 |
7 | {posts.map((post) => ( 8 | 16 | ))} 17 |
18 |
19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/components/*": ["components/*"], 6 | "@/lib/*": ["lib/*"], 7 | "@/styles/*": ["styles/*"] 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/api.js: -------------------------------------------------------------------------------- 1 | import { createBucketClient } from '@cosmicjs/sdk' 2 | 3 | //read env variables 4 | const BUCKET_SLUG = process.env.COSMIC_BUCKET_SLUG 5 | const READ_KEY = process.env.COSMIC_READ_KEY 6 | 7 | const cosmic = createBucketClient({ 8 | bucketSlug: BUCKET_SLUG, 9 | readKey: READ_KEY, 10 | }) 11 | 12 | const is404 = (error) => /not found/i.test(error.message) 13 | 14 | export async function getPreviewPostBySlug(slug) { 15 | try { 16 | const posts = await cosmic.objects 17 | .findOne({ 18 | 'type': 'posts', 19 | 'slug': slug, 20 | }) 21 | .props(['slug']) 22 | return posts['object'] 23 | } catch (error) { 24 | if (is404(error)) return 25 | throw error 26 | } 27 | } 28 | 29 | export async function getAllPostsWithSlug() { 30 | try { 31 | const posts = await cosmic.objects 32 | .find({ 33 | 'type': 'posts', 34 | '$and': [ 35 | { 36 | 'metadata.id': 'post', 37 | }, 38 | ], 39 | }) 40 | .props(['slug']) 41 | return posts['objects'] 42 | } catch (error) { 43 | console.log(is404(error)) 44 | } 45 | } 46 | export async function getAllProjectsWithSlug() { 47 | try { 48 | const posts = await cosmic.objects 49 | .find({ 50 | 'type': 'posts', 51 | '$and': [ 52 | { 53 | 'metadata.id': 'project', 54 | }, 55 | ], 56 | }) 57 | .props(['slug']) 58 | return posts['objects'] 59 | } catch (error) { 60 | console.log(is404(error)) 61 | } 62 | } 63 | 64 | export async function getAllProjectsForHome() { 65 | try { 66 | const posts = await cosmic.objects 67 | .find({ 68 | 'type': 'posts', 69 | '$and': [ 70 | { 71 | 'metadata.id': 'project', 72 | }, 73 | ], 74 | }) 75 | .props(['slug', 'title', 'metadata', 'created_at', 'udate']) 76 | return posts['objects'] 77 | } catch (error) { 78 | console.log(is404(error)) 79 | } 80 | } 81 | 82 | export async function getAllPosts() { 83 | try { 84 | const posts = await cosmic.objects 85 | .find({ 86 | 'type': 'posts', 87 | '$and': [ 88 | { 89 | 'metadata.id': 'post', 90 | }, 91 | ], 92 | }) 93 | .props(['slug', 'title', 'metadata', 'created_at']) 94 | return posts['objects'] 95 | } catch (error) { 96 | console.log(is404(error)) 97 | } 98 | } 99 | 100 | export async function getSinglePost(slug) { 101 | try { 102 | const post = await cosmic.objects 103 | .findOne({ 104 | 'type': 'posts', 105 | 'slug': slug, 106 | }) 107 | .props(['slug', 'title', 'metadata', 'created_at']) 108 | return post['object'] 109 | } catch (error) { 110 | console.log(is404(error)) 111 | } 112 | } 113 | 114 | export async function getSingleProject(slug) { 115 | try { 116 | const post = await cosmic.objects 117 | .findOne({ 118 | 'type': 'posts', 119 | 'slug': slug, 120 | '$and': [ 121 | { 122 | 'metadata.id': 'project', 123 | }, 124 | ], 125 | }) 126 | .props(['slug', 'title', 'metadata', 'created_at']) 127 | return post['object'] 128 | } catch (error) { 129 | console.log(is404(error)) 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /lib/constants.js: -------------------------------------------------------------------------------- 1 | //image URLs for section link previews 2 | export const HOME_OG_IMAGE_URL = 3 | 'https://imgix.cosmicjs.com/1538cfc0-4e5a-11eb-95ad-ff9bb4c24645-home-image.png' 4 | export const WRITING_OG_IMAGE_URL = 5 | 'https://imgix.cosmicjs.com/90250320-4e5a-11eb-95ad-ff9bb4c24645-writings-image.png' 6 | -------------------------------------------------------------------------------- /lib/markdownToHtml.js: -------------------------------------------------------------------------------- 1 | export default async function markdownToHtml(markdown) { 2 | var md = require('markdown-it')({ html: true }) 3 | .use(require('markdown-it-footnote')) 4 | .use(require('markdown-it-anchor')) 5 | // .use(require('markdown-it-table-of-contents')) 6 | 7 | // Remember old renderer, if overridden, or proxy to default renderer 8 | var defaultRender = 9 | md.renderer.rules.link_open || 10 | function (tokens, idx, options, env, self) { 11 | return self.renderToken(tokens, idx, options) 12 | } 13 | 14 | //rules for adding 'noopener' and '_blank' attributes to all markdown tags 15 | md.renderer.rules.link_open = function (tokens, idx, options, env, self) { 16 | // If you are sure other plugins can't add `target` - drop check below 17 | var aIndex = tokens[idx].attrIndex('target') 18 | var relIndex = tokens[idx].attrIndex('rel') 19 | 20 | if (aIndex < 0) { 21 | tokens[idx].attrPush(['target', '_blank']) // add new attribute 22 | } else { 23 | tokens[idx].attrs[aIndex][1] = '_blank' // replace value of existing attr 24 | } 25 | 26 | if (relIndex < 0) { 27 | tokens[idx].attrPush(['rel', 'noopener']) 28 | } else { 29 | tokens[idx].attrs[relIndex][1] = 'noopener' // replace value of existing attr 30 | } 31 | 32 | // pass token to default renderer. 33 | return defaultRender(tokens, idx, options, env, self) 34 | } 35 | 36 | //footnote styling 37 | md.renderer.rules.footnote_block_open = () => 38 | '

Footnotes

\n' + 39 | '
\n' + 40 | '
    \n' 41 | var result = md.render(markdown) 42 | return result.toString() 43 | } 44 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | // next.config.js 2 | module.exports = { 3 | images: { 4 | remotePatterns: [ 5 | { 6 | protocol: 'https', 7 | hostname: 'imgix.cosmicjs.com', 8 | port: '', 9 | }, 10 | ], 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-portfolio", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "dev": "next", 6 | "lint": "next lint", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "@cosmicjs/sdk": "^1.0.11", 12 | "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e", 13 | "@vercel/analytics": "^0.1.3", 14 | "@vercel/speed-insights": "^1.0.10", 15 | "date-fns": "2.14.0", 16 | "dotenv": "^16.0.3", 17 | "eslint-config-next": "^14.2.1", 18 | "markdown-it": "^12.3.2", 19 | "markdown-it-anchor": "^6.0.1", 20 | "markdown-it-footnote": "^3.0.2", 21 | "next": "^14.2.1", 22 | "react": "^18.2.0", 23 | "react-dom": "^18.2.0", 24 | "react-imgix": "^9.0.2", 25 | "reading-time": "^1.2.1" 26 | }, 27 | "devDependencies": { 28 | "autoprefixer": "^10.4.2", 29 | "postcss": "^8.4.6", 30 | "postcss-flexbugs-fixes": "^4.2.1", 31 | "postcss-preset-env": "^6.7.0", 32 | "tailwindcss": "^3.2.1" 33 | }, 34 | "license": "MIT" 35 | } 36 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import '@/styles/index.css' 2 | import { Analytics } from '@vercel/analytics/react' 3 | import { SpeedInsights } from '@vercel/speed-insights/next' 4 | 5 | function MyApp({ Component, pageProps }) { 6 | return ( 7 | <> 8 | 9 | 10 | 11 | 12 | ) 13 | } 14 | 15 | export default MyApp 16 | -------------------------------------------------------------------------------- /pages/_document.js: -------------------------------------------------------------------------------- 1 | import Document, { Html, Head, Main, NextScript } from 'next/document' 2 | 3 | export default class MyDocument extends Document { 4 | render() { 5 | return ( 6 | 7 | 8 | 13 | 18 | 23 | 28 | 33 | 38 | 43 | 48 | 53 | 59 | 65 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 |
    87 | 88 | 89 | 90 | ) 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /pages/about.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import Layout from '@/components/layout' 3 | import Head from 'next/head' 4 | export default function Index() { 5 | const rightArrowLink = `https://s.svgbox.net/hero-solid.svg?ic=arrow-right&fill=fff` 6 | 7 | return ( 8 | <> 9 | 10 | 11 | About 12 | 13 | 14 | 15 |

    About

    16 |
    17 |

    18 | I am a Product Designer and Researcher with a knack 19 | for building things. Currently finishing up my Master's Thesis with 20 | the HCI Division of Gothenburg University and IIIT Bangalore. I’m 21 | currently studying at{' '} 22 | 28 | IIIT Bangalore 29 | {' '} 30 | , India and doing my master's thesis under the supervision of{' '} 31 | 37 | Dr. Mattias Rost 38 | {' '} 39 | from the{' '} 40 | 46 | HCI Division 47 | {' '} 48 | of Gothenburg University and{' '} 49 | 55 | Dr. Bidisha Chaudhuri 56 | 57 | . Previously I interned with GE Healthcare as a Data Scientist in 58 | their services department to optimise the recovery and refurbishment 59 | of CT and MRI machines. I was also the Organiser for 60 | TEDxIIITBangalore’s very first TEDx event, along with my colleague 61 | Tejas Kotha. 62 |

    63 |
    64 |

    65 | When I’m not working, I tinker around and make art, click photos or 66 | write about things at the intersection of Psychology, Design, Tech 67 | and Business. You will usually find me in the kitchen trying out all 68 | those youtube recipes. I occasionally take up freelance work as a 69 | side hustle. 70 |

    71 |
    72 |

    73 | Feel free to get in touch with me for freelance work, questions or a 74 | quick chat. I’m active on Twitter and strive to maintain inbox zero 75 | :) 76 |

    77 |
    78 |
    79 | 83 | 94 | 95 |
    96 | 97 | 98 | ) 99 | } 100 | -------------------------------------------------------------------------------- /pages/api/exit-preview.js: -------------------------------------------------------------------------------- 1 | export default async function exit(_, res) { 2 | // Exit the current user from "Preview Mode". This function accepts no args. 3 | res.clearPreviewData() 4 | 5 | // Redirect the user back to the index page. 6 | res.writeHead(307, { Location: '/' }) 7 | res.end() 8 | } 9 | -------------------------------------------------------------------------------- /pages/api/preview.js: -------------------------------------------------------------------------------- 1 | import { getPreviewPostBySlug } from '@/lib/api' 2 | 3 | export default async function preview(req, res) { 4 | // Check the secret and next parameters 5 | // This secret should only be known to this API route and the CMS 6 | if ( 7 | req.query.secret !== process.env.COSMIC_PREVIEW_SECRET || 8 | !req.query.slug 9 | ) { 10 | return res.status(401).json({ message: 'Invalid token' }) 11 | } 12 | 13 | // Fetch the headless CMS to check if the provided `slug` exists 14 | const post = await getPreviewPostBySlug(req.query.slug) 15 | 16 | // If the slug doesn't exist prevent preview mode from being enabled 17 | if (!post) { 18 | return res.status(401).json({ message: 'Invalid slug' }) 19 | } 20 | 21 | // Enable Preview Mode by setting the cookies 22 | res.setPreviewData({}) 23 | 24 | // Redirect to the path from the fetched post 25 | // We don't redirect to req.query.slug as that might lead to open redirect vulnerabilities 26 | res.writeHead(307, { Location: `/posts/${post.slug}` }) 27 | res.end() 28 | } 29 | -------------------------------------------------------------------------------- /pages/freelance.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head' 2 | import Layout from './../components/layout' 3 | 4 | export default function Freelance() { 5 | return ( 6 | <> 7 | 8 | 9 | Freelance Work 10 | 14 | 18 | 19 |

    Freelance Work

    20 |
    21 | 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head' 2 | import React, { useState } from 'react' 3 | import Link from 'next/link' 4 | import Image from "next/image" 5 | import ProjectList from '@/components/projectlist' 6 | import WritingList from '@/components/writinglist' 7 | import { getAllPosts, getAllProjectsForHome } from '@/lib/api' 8 | import { HOME_OG_IMAGE_URL } from '@/lib/constants' 9 | import Layout from '@/components/layout' 10 | 11 | export default function Index({ allPosts, allWork }) { 12 | const shortAboutText = ( 13 |

    14 | Hi, I'm Shrey, a design engineer who loves building tools for 15 | productivity. Currently helping sales teams with conversational 16 | intelligence at {darkModeLinkStyleTag('Clari', 'https://clari.com/')}, 17 | also experimenting with LLMs on the side. 18 |
    19 |
    20 | In the past, I helped build the SQL Editor and establish design processes 21 | at {darkModeLinkStyleTag('Atlan', 'https://atlan.com/')}. I've also built 22 | tools to study technology use in families. I have two cats, love talking 23 | about sustainable lifestyles, a huge fan of{' '} 24 | {darkModeLinkStyleTag( 25 | 'Khruangbin', 26 | 'https://www.youtube.com/watch?v=q4xKvHANqjk', 27 | )}{' '} 28 | and a lifelong stan of the{' '} 29 | {darkModeLinkStyleTag( 30 | 'Mass Effect universe', 31 | 'https://en.wikipedia.org/wiki/Mass_Effect', 32 | )} 33 | . 34 |

    35 | ) 36 | 37 | const longAboutText = ( 38 |
    39 |

    40 | Hi, I'm Shrey, a design engineer who loves building tools for 41 | productivity. Currently building design systems and helping sales teams 42 | with conversational intelligence at{' '} 43 | {darkModeLinkStyleTag('Clari', 'https://clari.com/')}. 44 |
    45 |
    46 | At my alma mater{' '} 47 | {darkModeLinkStyleTag('IIIT Bangalore', 'https://www.iiitb.ac.in/')}, I 48 | studied electronics, then explored to data science for a while which 49 | landed me an internship at{' '} 50 | {darkModeLinkStyleTag('GE Healthcare', 'https://www.gehealthcare.in/')} 51 | 's data team in the services department. The work was great, we were 52 | building a process for the services team to optimise the sales of 53 | refurbished equipment, which has high demand in third world countries. 54 | But I wanted to study human behaviour and learn design. 55 |
    56 |
    57 | During this time, I also took courses like Human-computer interaction, 58 | qualitative research methods and the Web and the Mind. These courses 59 | made me gravitate towards HCI and product design, and I started working 60 | with the HCI department at the{' '} 61 | {darkModeLinkStyleTag( 62 | 'University of Gothenburg', 63 | 'https://www.gu.se/en', 64 | )} 65 | . There, I built methodologies and tools to better study technology use 66 | in families as part of my masters thesis under{' '} 67 | {darkModeLinkStyleTag( 68 | 'Prof. Mattias Rost', 69 | 'https://www.gu.se/en/about/find-staff/mattiasrost', 70 | )} 71 | . 72 |
    73 |
    74 | Before Clari, I helped build processes and the SQL Editor at{' '} 75 | {darkModeLinkStyleTag('Atlan', 'https://atlan.com/')}. I have two cats, 76 | Ginger and Loki. I also advocate leading a sustainable lifestyle, love 77 | composting and mushroom cultivation. I'm a huge fan of{' '} 78 | {darkModeLinkStyleTag( 79 | 'Khruangbin', 80 | 'https://www.youtube.com/watch?v=q4xKvHANqjk', 81 | )}{' '} 82 | and a lifelong stan of the{' '} 83 | {darkModeLinkStyleTag( 84 | 'Mass Effect universe', 85 | 'https://en.wikipedia.org/wiki/Mass_Effect', 86 | )} 87 | . 88 |

    89 |
    90 | ) 91 | const [aboutType, setAboutType] = useState('short') 92 | function aboutToggle(aboutType) { 93 | if (aboutType === 'short') { 94 | setAboutType('long') 95 | } else { 96 | setAboutType('short') 97 | } 98 | } 99 | const twitterSvgTagLink = `https://s2.svgbox.net/social.svg?ic=twitter&color=000` 100 | 101 | //dark mode link styling for links 102 | function darkModeLinkStyleTag(linkText, link) { 103 | return ( 104 | 110 | {linkText} 111 | 112 | ) 113 | } 114 | return <> 115 | 116 | 117 | 118 | 119 | 120 | 121 | 125 | 126 | 127 | 128 | 132 | 136 | shreyas.design 137 | 138 | 139 | 140 |
    141 |
    {aboutType === 'short' ? shortAboutText : longAboutText}
    142 |
    143 | 144 | 155 | 156 | 162 |
    163 |
    164 | 165 |
    166 |
    My Work
    167 |
    168 |
    169 | {/* Atlan Casestudy */} 170 | 194 | 198 |
    199 | Pie for Pi-hole, a raycast extension 211 |
    212 |
    213 | 237 | {/* whistle case study */} 238 | 239 | 240 | {/* Notion Marketplace */} 241 | 264 | 265 | 269 |
    270 | Guide to leading a sustainable lifestyle in india 282 |
    283 |
    284 | 285 | 289 |
    290 | Article about tools I use 301 |
    302 |
    303 |
    304 | {/* second column */} 305 | 354 |
    355 |
    356 | 357 |
    358 |
    Writings
    359 | 360 |
    361 |
    362 | ; 363 | } 364 | 365 | export async function getStaticProps() { 366 | const allPosts = await getAllPosts() 367 | const allWork = await getAllProjectsForHome() 368 | return { 369 | props: { allPosts, allWork }, 370 | } 371 | } 372 | -------------------------------------------------------------------------------- /pages/playground.js: -------------------------------------------------------------------------------- 1 | import Image from "next/image" 2 | import Layout from '@/components/layout' 3 | import Head from 'next/head' 4 | export default function Index() { 5 | return <> 6 | 7 | 8 | Playground 9 | 13 | 17 | 18 |

    Playground

    19 |
    20 |
    21 |
    22 | Neumorphic Concept art for Instagram 32 |
    33 |
    34 | 35 |
    36 |
    37 | Various icons designed with 3D realism in mind 47 |
    48 |
    49 | 50 |
    51 |
    52 | {' '} 53 | 3D Donut made in Blender 63 |
    64 |
    65 | 66 |
    67 |
    68 |
    69 | low ploygon count vector earth 79 |
    80 |
    81 | 91 |
    92 |
    93 | 94 | {/*

    */} 95 |
    96 |
    97 |
    98 | ; 99 | } 100 | -------------------------------------------------------------------------------- /pages/thoughtboard.js: -------------------------------------------------------------------------------- 1 | import PageLayout from '@/components/page-layout' 2 | 3 | export default function MasonryGridTwitter() { 4 | return ( 5 | 6 |
    Thoughtboard
    7 |
    8 | ) 9 | } 10 | -------------------------------------------------------------------------------- /pages/work/[slug].js: -------------------------------------------------------------------------------- 1 | import { useRouter } from 'next/router' 2 | import ErrorPage from 'next/error' 3 | import PostBody from '@/components/post-body' 4 | import PostHeader from '@/components/post-header' 5 | import PageLayout from '@/components/page-layout' 6 | import { getAllProjectsWithSlug, getSingleProject } from '@/lib/api' 7 | import Head from 'next/head' 8 | import markdownToHtml from '@/lib/markdownToHtml' 9 | 10 | export default function Post({ post, morePosts, preview }) { 11 | const router = useRouter() 12 | if (!router.isFallback && !post?.slug) { 13 | return 14 | } 15 | return ( 16 | 17 | {router.isFallback ? ( 18 |

    19 | Loading… 20 |

    21 | ) : ( 22 | <> 23 |
    24 | 25 | {post.title} 26 | 30 | 31 | 32 | 33 | 34 | 35 | 39 | 43 | 44 | 51 | 52 |
    53 |
    54 | 58 |
    59 | 60 | {/* {morePosts.length > 0 && } */} 61 | 62 | )} 63 |
    64 | ) 65 | } 66 | export async function getStaticProps({ params, preview = null }) { 67 | const data = await getSingleProject(params.slug) 68 | 69 | const content = await markdownToHtml(data.metadata?.content || '') 70 | const markdown = data.metadata?.content || '' 71 | return { 72 | props: { 73 | preview, 74 | post: { 75 | ...data, 76 | content, 77 | markdown, 78 | }, 79 | morePosts: data.morePosts || [], 80 | }, 81 | } 82 | } 83 | 84 | export async function getStaticPaths() { 85 | const allPosts = (await getAllProjectsWithSlug()) || [] 86 | return { 87 | paths: allPosts.map((post) => `/work/${post.slug}`), 88 | fallback: true, 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /pages/writings.js: -------------------------------------------------------------------------------- 1 | import WritingList from '@/components/writinglist' 2 | import Layout from '@/components/layout' 3 | import { getAllPosts } from '@/lib/api' 4 | import { WRITING_OG_IMAGE_URL } from '@/lib/constants' 5 | import Head from 'next/head' 6 | 7 | export default function Index({ allPosts }) { 8 | return ( 9 | <> 10 | 11 | 12 | Writings 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 24 | 25 | 26 |

    Writings

    27 | 28 |
    29 | 30 | ) 31 | } 32 | 33 | export async function getStaticProps() { 34 | const allPosts = (await getAllPosts()) || [] 35 | return { 36 | props: { allPosts }, 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /pages/writings/[slug].js: -------------------------------------------------------------------------------- 1 | import { useRouter } from 'next/router' 2 | import ErrorPage from 'next/error' 3 | import PostBody from '@/components/post-body' 4 | import PostHeader from '@/components/post-header' 5 | import PageLayout from '@/components/page-layout' 6 | import { getAllPostsWithSlug, getSinglePost } from '@/lib/api' 7 | 8 | import Head from 'next/head' 9 | import markdownToHtml from '@/lib/markdownToHtml' 10 | 11 | export default function Post({ post, preview }) { 12 | const router = useRouter() 13 | if (!router.isFallback && !post?.slug) { 14 | return 15 | } 16 | 17 | return ( 18 | 19 | {router.isFallback ? ( 20 |

    Loading…

    21 | ) : ( 22 | <> 23 |
    24 | 25 | {post.title} 26 | 30 | 31 | 32 | 33 | 34 | 35 | 39 | 43 | 44 | 51 | 52 |
    53 |
    54 | 58 |
    59 | 60 | {/* {morePosts.length > 0 && } */} 61 | 62 | )} 63 |
    64 | ) 65 | } 66 | 67 | export async function getStaticProps({ params, preview = null }) { 68 | const data = await getSinglePost(params.slug) 69 | const content = await markdownToHtml(data.metadata?.content || '') 70 | const markdown = data.metadata?.content || '' 71 | return { 72 | props: { 73 | preview, 74 | post: { 75 | ...data, 76 | content, 77 | markdown, 78 | }, 79 | morePosts: data.morePosts || [], 80 | }, 81 | } 82 | } 83 | 84 | export async function getStaticPaths() { 85 | const allPosts = (await getAllPostsWithSlug()) || [] 86 | return { 87 | paths: allPosts.map((post) => `/writings/${post.slug}`), 88 | fallback: true, 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | 'tailwindcss/nesting', 4 | 'tailwindcss', 5 | 'postcss-flexbugs-fixes', 6 | [ 7 | 'postcss-preset-env', 8 | { 9 | autoprefixer: { 10 | flexbox: 'no-2009', 11 | }, 12 | stage: 3, 13 | features: { 14 | 'custom-properties': false, 15 | }, 16 | }, 17 | ], 18 | ], 19 | } 20 | -------------------------------------------------------------------------------- /public/Shreyas_Gupta_Design_Resume-compressed.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/Shreyas_Gupta_Design_Resume-compressed.pdf -------------------------------------------------------------------------------- /public/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/android-icon-144x144.png -------------------------------------------------------------------------------- /public/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/android-icon-192x192.png -------------------------------------------------------------------------------- /public/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/android-icon-36x36.png -------------------------------------------------------------------------------- /public/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/android-icon-48x48.png -------------------------------------------------------------------------------- /public/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/android-icon-72x72.png -------------------------------------------------------------------------------- /public/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/android-icon-96x96.png -------------------------------------------------------------------------------- /public/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-114x114.png -------------------------------------------------------------------------------- /public/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-120x120.png -------------------------------------------------------------------------------- /public/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-144x144.png -------------------------------------------------------------------------------- /public/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-180x180.png -------------------------------------------------------------------------------- /public/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-57x57.png -------------------------------------------------------------------------------- /public/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-60x60.png -------------------------------------------------------------------------------- /public/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-72x72.png -------------------------------------------------------------------------------- /public/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-76x76.png -------------------------------------------------------------------------------- /public/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon-precomposed.png -------------------------------------------------------------------------------- /public/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/apple-icon.png -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /public/dark-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | vectorLogo 4 | 5 | 6 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/favicon-96x96.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Inter-Black.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Inter-Bold.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Inter-Light.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Inter-Medium.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Inter-Regular.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Inter-Thin.woff2 -------------------------------------------------------------------------------- /public/fonts/Rubik-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Rubik-Black.woff2 -------------------------------------------------------------------------------- /public/fonts/Rubik-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Rubik-Bold.woff2 -------------------------------------------------------------------------------- /public/fonts/Rubik-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Rubik-Light.woff2 -------------------------------------------------------------------------------- /public/fonts/Rubik-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Rubik-Medium.woff2 -------------------------------------------------------------------------------- /public/fonts/Rubik-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Rubik-Regular.woff2 -------------------------------------------------------------------------------- /public/fonts/Rubik-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/fonts/Rubik-SemiBold.woff2 -------------------------------------------------------------------------------- /public/images/Instagram-nu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/Instagram-nu.png -------------------------------------------------------------------------------- /public/images/atlan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/atlan.png -------------------------------------------------------------------------------- /public/images/donut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/donut.png -------------------------------------------------------------------------------- /public/images/figma-file-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/figma-file-search.png -------------------------------------------------------------------------------- /public/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/icons.png -------------------------------------------------------------------------------- /public/images/includepeople.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/includepeople.jpeg -------------------------------------------------------------------------------- /public/images/install_button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/install_button@2x.png -------------------------------------------------------------------------------- /public/images/logorender1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/logorender1.png -------------------------------------------------------------------------------- /public/images/lowpolyearth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/lowpolyearth.png -------------------------------------------------------------------------------- /public/images/notion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/notion.png -------------------------------------------------------------------------------- /public/images/pie-long.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/pie-long.png -------------------------------------------------------------------------------- /public/images/pie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/pie.png -------------------------------------------------------------------------------- /public/images/playground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/playground.png -------------------------------------------------------------------------------- /public/images/sustain-long.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /public/images/sustain.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /public/images/technology-together.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/technology-together.png -------------------------------------------------------------------------------- /public/images/tedx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/tedx.png -------------------------------------------------------------------------------- /public/images/tools-long.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/tools-long.png -------------------------------------------------------------------------------- /public/images/tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/tools.png -------------------------------------------------------------------------------- /public/images/whistle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/whistle.png -------------------------------------------------------------------------------- /public/images/zomato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/images/zomato.png -------------------------------------------------------------------------------- /public/letterboxd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | letterboxd-decal-dots-neg-mono 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /public/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Shreyas Gupta Logo 4 | 5 | 6 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/ms-icon-150x150.png -------------------------------------------------------------------------------- /public/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/ms-icon-310x310.png -------------------------------------------------------------------------------- /public/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GLaDO8/nextjs-portfolio/b231f36766633d18e0178acda44d7a1d29113e7b/public/ms-icon-70x70.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent:* 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Group@3x 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | "at-rule-no-unknown": [ 4 | true, 5 | { 6 | ignoreAtRules: [ 7 | "tailwind", 8 | "apply", 9 | "variants", 10 | "responsive", 11 | "screen", 12 | ], 13 | }, 14 | ], 15 | "declaration-block-trailing-semicolon": null, 16 | "no-descending-specificity": null, 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /styles/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | /* font family declaration */ 7 | 8 | html, 9 | body { 10 | color: #cfcfcf; 11 | background: #131313; 12 | } 13 | 14 | /* .dark, 15 | .dark body { 16 | color: #fff; 17 | background: #232323; 18 | } */ 19 | 20 | @font-face { 21 | font-family: 'Rubik'; 22 | /* src: url('/fonts/Rubik-Black.woff2') format('woff2'); */ 23 | src: url('/fonts/Inter-Black.woff2') format('woff2'); 24 | font-weight: 900; 25 | font-display: swap; 26 | } 27 | @font-face { 28 | font-family: 'Rubik'; 29 | /* src: url('/fonts/Rubik-Bold.woff2') format('woff2'); */ 30 | src: url('/fonts/Inter-Bold.woff2') format('woff2'); 31 | 32 | font-weight: 700; 33 | font-display: swap; 34 | } 35 | @font-face { 36 | font-family: 'Rubik'; 37 | /* src: url('/fonts/Rubik-SemiBold.woff2') format('woff2'); */ 38 | src: url('/fonts/Inter-SemiBold.woff2') format('woff2'); 39 | 40 | font-weight: 600; 41 | font-display: swap; 42 | } 43 | @font-face { 44 | font-family: 'Rubik'; 45 | /* src: url('/fonts/Rubik-Medium.woff2') format('woff2'); */ 46 | src: url('/fonts/Inter-Medium.woff2') format('woff2'); 47 | 48 | font-weight: 500; 49 | font-display: swap; 50 | } 51 | @font-face { 52 | font-family: 'Rubik'; 53 | /* src: url('/fonts/Rubik-Regular.woff2') format('woff2'); */ 54 | src: url('/fonts/Inter-Regular.woff2') format('woff2'); 55 | 56 | font-weight: 400; 57 | font-display: swap; 58 | } 59 | 60 | @font-face { 61 | font-family: 'Rubik'; 62 | /* src: url('/fonts/Rubik-Light.woff2') format('woff2'); */ 63 | src: url('/fonts/Inter-Light.woff2') format('woff2'); 64 | 65 | font-weight: 300; 66 | font-display: swap; 67 | } 68 | 69 | /* Dark Mode Markdown Styling */ 70 | /* p { 71 | @apply text-stone-800 dark:text-white; 72 | } */ 73 | p, 74 | li > p, 75 | li > ul, 76 | li > ol, 77 | ol, 78 | ul, 79 | li { 80 | @apply font-thin md:text-lg text-type-grey; 81 | } 82 | b { 83 | @apply font-semibold; 84 | } 85 | 86 | blockquote > p { 87 | @apply text-gray-900 bg-gray-100 dark:bg-dark-mode-blockquote-gray dark:text-white rounded-xl; 88 | } 89 | /* section > ol > li > p { 90 | @apply text-black dark:text-white; 91 | } */ 92 | } 93 | @layer components { 94 | /* CSS sitewide styling classes */ 95 | .page-title-design { 96 | @apply my-16 text-2xl font-bold leading-tight tracking-tighter font-title md:text-5xl lg:text-6xl md:leading-none; 97 | } 98 | .section-title-design { 99 | @apply max-w-3xl mt-16 mb-4 text-2xl font-medium leading-snug tracking-tight; 100 | } 101 | .page-para-design { 102 | @apply my-4 text-base leading-relaxed cursor-pointer lg:text-lg; 103 | } 104 | .menu-btn-lg { 105 | @apply inline-block px-2 py-4 text-base font-normal leading-none transition duration-300 ease-in-out text-grey-secondary lg:px-4 hover:text-white; 106 | } 107 | .menu-btn-lg-active { 108 | @apply font-medium text-white; 109 | } 110 | .social-icons { 111 | @apply h-5 mr-4 transition duration-300 ease-in-out lg:h-6 lg:mr-5 hover:scale-125; 112 | } 113 | 114 | .link-styling-dark { 115 | @apply text-white hover:bg-opacity-80; 116 | } 117 | .home-page-title { 118 | @apply w-auto pr-8 mx-auto mb-4 text-base font-medium; 119 | } 120 | } 121 | 122 | @layer utilities { 123 | .lazy-renderer { 124 | content-visibility: auto; 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: [ 3 | './components/**/*.js', 4 | './components/*.js', 5 | './pages/**/*.js', 6 | './pages/*.js', 7 | ], 8 | theme: { 9 | fontFamily: { 10 | title: [ 11 | 'Rubik', 12 | '-apple-system', 13 | 'BlinkMacSystemFont', 14 | 'Segoe UI', 15 | 'Roboto', 16 | 'Oxygen', 17 | 'Ubuntu', 18 | ], 19 | sans: [ 20 | 'Rubik', 21 | '-apple-system', 22 | 'BlinkMacSystemFont', 23 | 'Segoe UI', 24 | 'Roboto', 25 | 'Oxygen', 26 | 'Ubuntu', 27 | ], 28 | }, 29 | minWidth: { 30 | '1/2': '50%', 31 | }, 32 | extend: { 33 | colors: { 34 | 'type-grey': '#cfcfcf', 35 | 'dark-mode-link-blue': '#4CBFFF', 36 | 'grey-secondary': '#8f8f8f', 37 | 'dark-mode-blockquote-gray': '#363636', 38 | }, 39 | spacing: { 40 | 28: '7rem', 41 | }, 42 | 43 | lineHeight: { 44 | tight: 1.2, 45 | }, 46 | // fontWeight: { 'preview-desc': '350' }, 47 | fontSize: { 48 | 'base': '1.2rem', 49 | 'lg': '1.3rem', 50 | 'xl': '1.4rem', 51 | '2xl': '1.8rem', 52 | '5xl': '2.5rem', 53 | '6xl': '3.5rem', 54 | '7xl': '4rem', 55 | '8xl': '6.25rem', 56 | }, 57 | maxWidth: { 58 | '2xl': '44rem', 59 | '3xl': '50rem', 60 | }, 61 | boxShadow: { 62 | small: '0 5px 10px rgba(0, 0, 0, 0.12)', 63 | medium: '0 8px 30px rgba(0, 0, 0, 0.12)', 64 | }, 65 | }, 66 | }, 67 | } 68 | --------------------------------------------------------------------------------