├── .eslintrc.json ├── .gitignore ├── LICENSE.md ├── README.md ├── components ├── Layout.js ├── ReusableStyles.js ├── Seo.js ├── WebLinks.js └── icons │ └── index.js ├── data ├── BioData.js └── LinksData.js ├── next-seo.config.js ├── next.config.js ├── package.json ├── pages ├── _app.js ├── _document.js ├── api │ └── hello.js └── index.js ├── public ├── 3dicons.png ├── avatar.png ├── behance.svg ├── bg.png ├── bmc.png ├── designletter.png ├── doc.png ├── dribbble.svg ├── facebook.svg ├── favicon.ico ├── figma.svg ├── foundation.svg ├── g-bg.svg ├── github-fill.svg ├── github.svg ├── gumroad.png ├── hive.svg ├── illlustrations.png ├── insta.svg ├── ios.svg ├── linkedin.svg ├── mastodon.svg ├── medium.svg ├── moon.svg ├── new-up.svg ├── newproduct.png ├── noflash.js ├── opensea.svg ├── pinterest.svg ├── post.svg ├── preview.jpg ├── product-hunt.svg ├── rarible.svg ├── realvjy-gradient.svg ├── realvjy.svg ├── showtime.svg ├── tiktok.svg ├── title.svg ├── twitter.svg ├── use.png ├── vercel.svg ├── vijay-verma.svg ├── vjy.png ├── web.svg └── youtube.svg ├── styles ├── GlobalStyle.js ├── global.css └── theme.config.js └── yarn.lock /.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 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | 21 | # debug 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # local env files 27 | .env.local 28 | .env.development.local 29 | .env.test.local 30 | .env.production.local 31 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 vijay verma (realvjy) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nxt Lnk 2 | 3 | **Custom bio links for creatives who love coding. Made this first to use for my own weblinks vjy.me/lnk** 4 | 5 | A perfect custom alternative for linktree, bio and other shortner platform. Check live version here [nxtlnk.xyz](https://nxtlnk.xyz) 6 | 7 | Pull requests are always welcome. In case you want inspiration or new features on what to add, check out the issues for feature requests. 8 | 9 | Coffee fuels coding ☕️ 10 | 11 | Buy Me A Coffee 12 | 13 | **Table of Contents** 14 | 15 | 16 | - [Usage](#usage) 17 | - [Quick Start](#quick-start) 18 | - [Manual Setup](#manual-setup) 19 | - [Getting Started](#getting-started) 20 | - [Images](#images) 21 | - [Update Bio](#update-bio) 22 | - [Add/Update](#update-bio) 23 | - [Enable/Disable](#update-bio) 24 | - [Featured Banner](#update-bio) 25 | - [Update Links](#update-links) 26 | - [Enable/Disable](#update-links) 27 | - [Add/Update](#update-links) 28 | - [Frontend](#frontend) 29 | - [SEO](#seo) 30 | - [Google Analytics](#google-analytics) 31 | - [Custom Domain](#custom-domain) 32 | - [Favicon](#favicon) 33 | - [Contributors](#contributors) 34 | 35 | 36 | ## Usage 37 | `nxt-lnk` template used to create your custom bio link and self-host on Vercel or Netlify using your own domain. Need little understanding of code :) ☕ 38 | 39 | Usually, you don't need to worry a lot about coding if you're just updating information in `BioData.js` and `LinkData.js`. To deep dive know more [Next.js](https://nextjs.org/docs) and [React](https://reactjs.org/docs/getting-started.html) official documentaion. 40 | 41 | For customization used [styled components](https://styled-components.com/). If you want to customize styling you can [learn more here](https://styled-components.com/docs). 42 | 43 | **Template auto support dark-mode depending on system cofig.** 44 | 45 | ## Quick Start 46 | [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/import/git?s=https://github.com/realvjy/nxt-lnk) [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/realvjy/nxt-lnk) 47 | 48 | 49 | ## Manual Setup 50 | Run the following command to create a new project with this template: 51 | ```bash 52 | yarn create next-app your-app-name -e https://github.com/realvjy/nxt-lnk 53 | # or 54 | npx create-next-app your-app-name -e https://github.com/realvjy/nxt-lnk 55 | ``` 56 | 57 | ## Getting Started 58 | 59 | Use any editor to work on editing. I use [vscode](https://code.visualstudio.com/) 60 | 61 | First, run the development server: 62 | ```bash 63 | npm run dev 64 | # or 65 | yarn dev 66 | ``` 67 | 68 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 69 | 70 | **Important files to edit or update info** 71 | `data/BioData.js` All basic info update here 72 | `data/LinksData.js` Contain all the links 73 | `Components/WebLinks.js` UI and stylesheet 74 | `Components/icons/index.js` Contain all SVG icon compo 75 | 76 | You can start editing the page by modifying `data/BioData.js` and `data/LinksData.js`. The page auto-updates as you edit the file. 77 | 78 | 79 | 80 | ## Images 81 | All images stored inside `public` folder of the project. 82 | 83 | ## Update Bio 84 | **Example from** `BioData.js` : 85 | ```jsx 86 | const bioData = [ 87 | { 88 | name: 'vijay verma', 89 | username: '@realvjy', 90 | url: 'https://vjy.me', 91 | titleImg: true, 92 | avatar: '/avatar.png', 93 | nftAvatar: true, 94 | description: 'A short description/bio about you goes here', 95 | subdesc: 'This is secondary description. If you do not need, you can remove it', 96 | newProductUrl: 'https://vjy.me/lnk', 97 | newProduct: true, 98 | }, 99 | ]; 100 | 101 | export default bioData; 102 | ``` 103 | **Avatar** 104 | Just replace `avatar.png`. 200x200px will be good. 105 | 106 | **Hex/NFT avatar view** 107 | `nftAvatar: true` enable hex shape on avatar image. 108 | `nftAvatar: false` made it in oval shape. 109 | 110 | **Title** 111 | By default `titleImg: true` and it look for `title.svg`. Replace svg with logo **logo**. Make sure to use `title.svg ` name. 112 | 113 | **Featured banner** 114 | `newProductUrl` and `newProduct` used for getting featured banner. You can replace the image `newproduct.png` with any design you like. 115 | 116 | `newProduct: true` show banner. Default is `true` make it false to hide. 117 | 118 | 119 | ## Update Links 120 | **Example from** `LinksData.js` : 121 | ```jsx 122 | const webLinks = [ 123 | // All social profile 124 | { 125 | title: 'Twitter', 126 | url: 'https://twitter.com/realvjy', 127 | type: 'social', 128 | icon: '/twitter.svg', 129 | on: true 130 | }, 131 | ... 132 | ... 133 | 134 | { 135 | title: 'Instagram', 136 | url: 'https://instagram.com/realvjy', 137 | type: 'social', 138 | icon: '/insta.svg', 139 | on: true 140 | } 141 | ]; 142 | export default webLinks; 143 | ``` 144 | **Enable/Disable Social Media** 145 | Find `type: social` and change `on:true|false` 146 | 147 | | Title | on (default) | 148 | | --------- | -------- | 149 | | `Twitter` | `true` | 150 | | `Instagram` | `true` | 151 | | `Dribbble` | `false` | 152 | | `Medium` | `false` | 153 | | `Github` | `true` | 154 | | `Youtube` | `false` | 155 | | `Behance` | `true` | 156 | | `Figma` | `true` | 157 | | `Linkedin` | `false` | 158 | | `Mastodon` | `false` | 159 | | `Hive Social` | `false` | 160 | | `Post.news` | `false` | 161 | 162 | Setting `on: true` show the social icon. 163 | The social media icons are arranged in a single row at the top of the page below description. If you want to use as list, chagne type to `type: 'other'` 164 | 165 | **Add new Social Media link** 166 | create a new block by copying this 167 | ```jsx 168 | { 169 | title: 'Social Name', 170 | url: 'https://link.com/whateverurl', 171 | type: 'social', 172 | icon: '/newiconname.svg', 173 | on: true 174 | } 175 | ``` 176 | Update all info and make sure to add a `newiconname.svg` file in [public](#images) folder. 177 | Then you have to add new section to frontend `components/WebLinks.js` 178 | 179 | ## Frontend 180 | All frontend customization done inside `components/WebLinks.js`. If you wante to update and add new section just look this file and update according to your need. 181 | 182 | **Update section** 183 | 184 | Look for Section codes. Like if you want to change `install` type to `featured` Update the `type: 'featured'` in `LinkData.js` then update all `install` related code in `WebLinks.js` to `featured` 185 | 186 | ```js 187 | // Collect all links filter by type - social, project, nft and other etc= 188 | // get data for install section 189 | const install = allLinks.filter((el) => { 190 | return el.type === "install" && el.on 191 | }); 192 | 193 | ... 194 | ... 195 | 196 | {/* Featured Section */ } 197 | 198 |

{install[0].type}

199 | { 200 | install.map((i) => { 201 | return ( 202 | 203 | 204 | {i.title} 205 | 206 | 207 | ) 208 | }) 209 | } 210 |
211 | {/* End Featured Section */ } 212 | ``` 213 | **Add New section** 214 | 215 | Add new section with specific `type` in `Linkdata.js`. Then copy `LinkSection` Code to create new section in `WebLinks.js` file. Make sure to create get data of that section as well. 216 | 217 | ## SEO 218 | Already added `next-seo`. All you have to do is `update next-seo.config.js` file. Make sure to add direct link of `preview.jpg`file, like - `https://vjy.me/preview.jpg`. 219 | 220 | ## Google Analytics 221 | In Vercel, you can set this by going to your project, then Settings and finally [Environments Variables](https://vercel.com/docs/concepts/projects/environment-variables). To get GA 4 code `G-ZXX0000XXX` follow [these steps ](https://support.google.com/analytics/answer/9304153?hl=en) 222 | 223 | 224 | 225 | 226 | ## Custom Domain 227 | By default vercel give you a subdomain with your project name like - [nxtlnk.vercel.app](https:nxtlnk.vercel.app). But you can add own domain. 228 | 229 | Vercel/Netlify give you option to add any domain to the deployed project like [vjy.me/lnk](https://vjy.me/lnk) or [nxtlnk.xyz](https://nxtlnk.xyz). All you have to do is follow official [Vercel documentaion](https://vercel.com/docs/concepts/projects/domains/add-a-domain) or [Netlify Documentaion](https://www.netlify.com/blog/2021/12/20/how-to-add-custom-domains-to-netlify-sites/) 230 | 231 | ## Favicon 232 | Create a `favicon.ico` file and place inside `public` folder. I use [favicon.io](https://favicon.io/favicon-converter/) 233 | 234 | ## Contributors 235 | Created by [realvjy](https://twitter.com/realvjy). You are always welcome to share your feedback on twitter or any social media platform. 236 | 237 | If you want to contribute. Just create a pull request. 238 | -------------------------------------------------------------------------------- /components/Layout.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import ReactDOM from 'react-dom'; 3 | 4 | 5 | 6 | export default function Layout({ children }) { 7 | return ( 8 |
9 | {children} 10 |
11 | ) 12 | } 13 | 14 | const Main = styled.main` 15 | min-height: 100vh; 16 | background: url('/bg.png') no-repeat; 17 | background-size: 100%; 18 | background-position: -50vh 10%; 19 | background-attachment: fixed; 20 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 21 | background-size: 250%; 22 | background-position: -50vh 30vh; 23 | } 24 | `; 25 | -------------------------------------------------------------------------------- /components/ReusableStyles.js: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import styled from "styled-components"; 3 | 4 | export const Container = styled.div` 5 | position: relative; 6 | align-items: center; 7 | justify-content: center; 8 | width: 650px; 9 | margin: 0 auto; 10 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 11 | width: 100%; 12 | } 13 | `; 14 | 15 | export const Wrapper = styled.div` 16 | display: flex; 17 | flex-direction: column; 18 | `; 19 | 20 | 21 | export const Button = styled.button` 22 | ` 23 | 24 | export const LinkButton = styled.a` 25 | display: flex; 26 | align-items: center; 27 | color: var(--white); 28 | text-decoration: none; 29 | color: inherit; 30 | cursor: pointer; 31 | outline: none; 32 | line-height: 20px; 33 | p{ 34 | line-height: 24px; 35 | font-size: 20px; 36 | font-weight: 700; 37 | text-transform: uppercase; 38 | font-style: normal; 39 | border-top-left-radius: 16px; 40 | border-bottom-left-radius: 16px; 41 | background: var(--lfg-sky-200); 42 | border: 2px solid var(--lfg-sky-200); 43 | } 44 | div{ 45 | line-height: 0; 46 | border-top-right-radius: 16px; 47 | border-bottom-right-radius: 16px; 48 | border: 2px solid var(--lfg-sky-200); 49 | background: var(--lfg-sky-300); 50 | } 51 | ` 52 | 53 | export const Tag = styled.div` 54 | font-size: 16px; 55 | font-weight: 700; 56 | line-height: 20px; 57 | padding: 4px 12px; 58 | border-radius: 14px; 59 | display: inline-flex; 60 | border: 1px solid var(--black); 61 | 62 | &.red{ 63 | background: var(--red); 64 | } 65 | &.blue{ 66 | background: var(--blue); 67 | } 68 | &.yellow{ 69 | background: var(--yellow); 70 | } 71 | ` 72 | 73 | export const StyledLink = styled.a` 74 | line-height: normal; 75 | cursor: pointer; 76 | color: ${({ theme }) => theme.text.primary}; 77 | ` 78 | 79 | export const IssueGrid = styled.div` 80 | display: grid; 81 | grid-template-columns: repeat(2, 1fr); 82 | grid-gap: 40px; 83 | cursor: pointer; 84 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 85 | grid-template-columns: repeat(1, 1fr); 86 | padding: 20px; 87 | } 88 | ` 89 | 90 | export const ButtonLink = styled.a` 91 | font-size: 24px; 92 | display: inline-flex; 93 | line-height: normal; 94 | padding: 16px 32px; 95 | border-style: none; 96 | outline: none; 97 | cursor: pointer; 98 | border-radius: 36px; 99 | background: rgb(228, 232, 236); 100 | background: linear-gradient(262.31deg, #06F1F8 1.86%, #2F8FFF 27.73%, #FF3382 68.97%, #FFBD6F 99.88%); 101 | transition: all .3s; 102 | position: relative; 103 | 104 | 105 | ` -------------------------------------------------------------------------------- /components/Seo.js: -------------------------------------------------------------------------------- 1 | import { NextSeo } from 'next-seo'; 2 | import seoData from '../next-seo.config'; 3 | 4 | export default function Seo({ page }) { 5 | const { title, excerpt, slug, coverImage } = page; 6 | return ( 7 | <> 8 | 58 | 59 | ); 60 | } -------------------------------------------------------------------------------- /components/WebLinks.js: -------------------------------------------------------------------------------- 1 | // Weblinks Page Sections 2 | // created by @realvjy 3 | // date: 29 Jul, 2022 4 | 5 | import Image from "next/image"; 6 | import styled from "styled-components"; 7 | import { Button, ButtonLink, Container, StyledLink } from "./ReusableStyles"; 8 | import Link from "next/link"; 9 | import { ChevronRightIcon, HexIcon, HomeIcon, TwitterIcon, NewUp, OvalIcon } from './icons'; 10 | import allLinks from "../data/LinksData"; 11 | import bioData from "../data/BioData"; 12 | 13 | 14 | 15 | const Links = () => { 16 | 17 | // all user info from bioData 18 | const name = bioData[0].name; 19 | const url = bioData[0].url; 20 | const username = bioData[0].username; 21 | const titleImg = bioData[0].titleImg; 22 | const avatarImg = bioData[0].avatar; 23 | const description = bioData[0].description; 24 | const descShow = bioData[0].descShow; 25 | const subdesc = bioData[0].subdesc; 26 | const subdescShow = bioData[0].subdescShow; 27 | const footerText = bioData[0].footerText; 28 | const author = bioData[0].author; 29 | const authorURL = bioData[0].authorURL; 30 | const titleImage = "/title.svg"; 31 | 32 | // Check what class to use oval or hex for avatar 33 | const avatarShape = bioData[0].nftAvatar ? `nft-clipped` : `oval-clipped` 34 | 35 | 36 | // Description and subdescription goes here 37 | const descriptionText = descShow ? description : `Write your own fall back text if description not in BioData.js or remove me/leave blank` 38 | const subdescText = subdescShow ? subdesc : `Write your own if you want or just remove me/leave blank` 39 | 40 | 41 | const newProduct = bioData[0].newProduct; // checking for newProduct flag true false 42 | const newProductUrl = bioData[0].newProductUrl; // get product url if available 43 | 44 | 45 | 46 | // Collect all links filter by type - social, project, nft and other etc= 47 | // get data for social section 48 | const social = allLinks.filter((el) => { 49 | return el.type === "social" && el.on 50 | }); 51 | 52 | // Get data for install section 53 | const install = allLinks.filter((el) => { 54 | return el.type === "install" && el.on 55 | }); 56 | 57 | // Get data for nfts 58 | const nfts = allLinks.filter((el) => { 59 | return el.type === "nft" && el.on 60 | }); 61 | 62 | // Get data for other section 63 | const others = allLinks.filter((el) => { 64 | return el.type === "other" && el.on 65 | }); 66 | 67 | return ( 68 | 69 | 70 | 71 | 72 | 73 | 74 | {/* Avatar svg hex or oval if nftAvatar=true will convert to hex */} 75 | 76 | 77 |
78 |
79 | 83 |
84 |
85 | 86 | {/* Using titleimg flag to use image as title or text */} 87 | {titleImg ? 88 | <img src={titleImage} className="handle" /> : 89 | <h1>{name}</h1> 90 | } 91 | {/* if your remove username from data it will not appear */} 92 | { 93 | username ? <h3><a href={`${url}`}>{username}</a></h3> : '' 94 | } 95 | 96 |
97 | 98 | {/* Bio Section */} 99 | 100 | {description &&

{descriptionText}

} 101 | {subdesc &&

{subdescText}

} 102 |
103 | {/* End Bio Section */} 104 | 105 | {/* Weblinks started */} 106 | 107 | {/* Social Icon */} 108 | 109 |
110 | { 111 | social.map((i) => { 112 | return ( 113 | 114 | 115 | 116 | 117 | 118 | ) 119 | }) 120 | } 121 |
122 |
123 | {/* Social Icon */} 124 | 125 | {/* Install Section */} 126 | { 127 | install.length > 0 ? 128 | 129 |

{install[0].type}

130 | { 131 | install.map((i) => { 132 | return ( 133 | 134 | 135 | {i.title} 136 | 137 | 138 | ) 139 | }) 140 | } 141 |
: '' 142 | } 143 | {/* End Install Section */} 144 | 145 | {/* NFT Section */} 146 | { 147 | nfts.length > 0 ? 148 | 149 |

{nfts[0].type}s

150 | { 151 | nfts.map((i) => { 152 | return ( 153 | 154 | 155 | {i.title} 156 | 157 | 158 | ) 159 | }) 160 | } 161 |
162 | : '' 163 | } 164 | {/* End NFT Section */} 165 | 166 | {/* Other Section */} 167 | { 168 | others.length > 0 ? 169 | 170 |

{others[0].type}

171 | {/* BioData.js > newProduct == true */} 172 | {/* New Section will render once newProduct == true */} 173 | {(newProduct) ? 174 | 175 | 179 | 180 | : '' 181 | } 182 | {/* End Biodata.js, You can move this section anywhere */} 183 | { 184 | others.map((i) => { 185 | return ( 186 | 187 | 188 | {i.title} 189 | 190 | 191 | ) 192 | }) 193 | } 194 |
: '' 195 | } 196 | {/* End Other Section */} 197 | 198 |
199 | {/* End Weblinks */} 200 |
201 | 202 | 203 |

{footerText} {author}

204 |
205 |
206 | 207 |
208 |
209 | 210 | ) 211 | }; 212 | 213 | export default Links; 214 | 215 | const LinkWrapper = styled(Container)` 216 | ` 217 | const LinkContainer = styled.div` 218 | min-height: 100vh; 219 | display: flex; 220 | flex-direction: column; 221 | justify-content: space-between; 222 | align-items: center; 223 | text-align: center; 224 | padding: 24px; 225 | ` 226 | 227 | const LinkHeader = styled.div` 228 | display: flex; 229 | flex-direction: column; 230 | align-items: center; 231 | margin-top: 60px; 232 | margin-bottom: 12px; 233 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 234 | margin-top: 20px; 235 | } 236 | ` 237 | 238 | const Avatar = styled.div` 239 | height: 90px; 240 | width: 90px; 241 | position: relative; 242 | margin-bottom: 12px; 243 | ` 244 | 245 | const AvatarWrap = styled.div` 246 | height: 100%; 247 | width: 100%; 248 | filter: drop-shadow(0px 1px 2px var(--avatar-shadow)); 249 | img{ 250 | height: calc(100% - 6px); 251 | width: calc(100% - 6px); 252 | } 253 | .avatar-border{ 254 | height: 100%; 255 | width: 100%; 256 | position: absolute; 257 | background: ${({ theme }) => theme.bg.primary}; 258 | } 259 | .avatar-fill{ 260 | height: calc(100% - 6px); 261 | width: calc(100% - 6px); 262 | position: absolute; 263 | background: ${({ theme }) => theme.bg.primary}; 264 | } 265 | ` 266 | 267 | const Title = styled.div` 268 | display: flex; 269 | flex-direction: column; 270 | align-items: center; 271 | h1{ 272 | font-size: 38px; 273 | font-weight: 700; 274 | 275 | letter-spacing: -2px; 276 | background: linear-gradient(90deg, #4AB1F1 5.71%, #566CEC 33.77%, #D749AF 61.82%, #FF7C51 91.21%); 277 | -webkit-background-clip: text; 278 | -webkit-text-fill-color: transparent; 279 | background-clip: text; 280 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 281 | font-size: 32px; 282 | } 283 | } 284 | h3{ 285 | margin-top:6px; 286 | font-size: 18px; 287 | font-weight: 500; 288 | letter-spacing: -.7px; 289 | color: ${({ theme }) => theme.text.secondary}; 290 | opacity: .5; 291 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 292 | font-size: 15px; 293 | margin-top:2px; 294 | } 295 | } 296 | 297 | 298 | .name{ 299 | margin-top: 8px; 300 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 301 | width: 140px; 302 | } 303 | } 304 | .handle{ 305 | height: 32px; 306 | margin-top: 6px; 307 | margin-bottom: 6px; 308 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 309 | height: 26px; 310 | } 311 | } 312 | ` 313 | 314 | const LinkBio = styled.div` 315 | display: flex; 316 | flex-direction: column; 317 | h1{ 318 | font-size: 22px; 319 | line-height: 30px; 320 | font-weight: 500; 321 | letter-spacing: -0.6px; 322 | padding: 0 20px; 323 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 324 | font-size: 18px; 325 | line-height: 26px; 326 | padding: 0 8px; 327 | 328 | } 329 | vertical-align: middle; 330 | span{ 331 | font-size: 12px; 332 | vertical-align: bottom; 333 | line-height: 30px; 334 | color: ${({ theme }) => theme.text.secondary}; 335 | margin: 0 2px; 336 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 337 | font-size: 10px; 338 | line-height: 20px; 339 | } 340 | } 341 | } 342 | h4{ 343 | font-size: 18px; 344 | letter-spacing: -.5px; 345 | margin: 10px 0; 346 | color: ${({ theme }) => theme.text.secondary}; 347 | font-weight: 500; 348 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 349 | font-size: 15px; 350 | padding: 0 20px; 351 | line-height: 24px; 352 | } 353 | a{ 354 | font-weight: 700; 355 | opacity: .7; 356 | &:hover{ 357 | opacity: 1; 358 | } 359 | } 360 | } 361 | 362 | ` 363 | 364 | const TopPart = styled.div` 365 | 366 | ` 367 | 368 | 369 | 370 | const BottomPart = styled.div` 371 | margin-bottom: 40px; 372 | 373 | ` 374 | const LinkFoot = styled.div` 375 | h4{ 376 | color: ${({ theme }) => theme.text.secondary}; 377 | line-height: 32px; 378 | letter-spacing: -.2px; 379 | font-size: 16px; 380 | font-weight: 500; 381 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 382 | font-size: 12px; 383 | } 384 | span{ 385 | font-size: 10px; 386 | vertical-align: bottom; 387 | line-height: 32px; 388 | margin: 0 2px; 389 | opacity: .6; 390 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 391 | font-size: 8px; 392 | } 393 | } 394 | } 395 | ` 396 | 397 | const WebLinkWrap = styled.div` 398 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 399 | padding: 0 12px; 400 | } 401 | ` 402 | 403 | 404 | const LinkSection = styled.div` 405 | padding: 12px 0; 406 | display: flex; 407 | margin: 0 auto; 408 | max-width: 400px; 409 | flex-direction: column; 410 | &.social{ 411 | max-width: max-content; 412 | padding: 0; 413 | margin-bottom: 18px; 414 | } 415 | .iconsonly{ 416 | display: flex; 417 | justify-content: center; 418 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 419 | flex-wrap: wrap; 420 | } 421 | } 422 | h3{ 423 | font-size: 12px; 424 | text-transform: uppercase; 425 | letter-spacing: 4px; 426 | margin-bottom: 4px; 427 | color: ${({ theme }) => theme.text.secondary}; 428 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 429 | font-size: 11px; 430 | } 431 | } 432 | ` 433 | 434 | const LinkBox = styled.div` 435 | padding: 18px 20px; 436 | border-radius: 12px; 437 | margin: 8px 18px; 438 | border: 1px solid ${({ theme }) => theme.bg.secondary}; 439 | flex-direction: row; 440 | display: flex; 441 | align-items: center; 442 | justify-content: space-between; 443 | cursor: pointer; 444 | font-size: 16px; 445 | font-weight: 600; 446 | letter-spacing: -.5px; 447 | position: relative; 448 | text-align: center; 449 | 450 | &::before{ 451 | content: ""; 452 | border-radius: 12px; 453 | display: block; 454 | position: absolute; 455 | z-index: -1; 456 | inset: -2px; 457 | opacity: 0; 458 | transform: scale(0.8); 459 | } 460 | &:hover{ 461 | transition: all 333ms ease 0s; 462 | border-color: transparent; 463 | &::before{ 464 | opacity: 1; 465 | background: ${({ theme }) => theme.bg.hover}; 466 | transition: all 333ms ease 0s; 467 | transform: scale(1); 468 | } 469 | } 470 | .new-up{ 471 | transform: scale(.8); 472 | opacity: .7; 473 | } 474 | 475 | &.socialIcon{ 476 | padding: 16px; 477 | border-radius: 50%; 478 | border: none; 479 | margin: 4px; 480 | img{ 481 | height: 24px; 482 | } 483 | 484 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 485 | padding: 10px; 486 | margin: 2px; 487 | img{ 488 | height: 20px; 489 | } 490 | } 491 | } 492 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 493 | padding: 12px 16px; 494 | font-size: 16px; 495 | } 496 | ` 497 | const LinkTitle = styled.div` 498 | display: flex; 499 | font-size: 18px; 500 | align-items: center; 501 | @media screen and (max-width: ${({ theme }) => theme.deviceSize.tablet}) { 502 | font-size: 14px; 503 | } 504 | img{ 505 | height: 20px; 506 | margin-right: 10px; 507 | } 508 | ` 509 | 510 | const NewSection = styled.div` 511 | display: flex; 512 | align-items: center; 513 | padding: 16px 20px; 514 | img{ 515 | width: 100%; 516 | border: 1px solid ${({ theme }) => theme.bg.secondary}; 517 | border-radius: 12px; 518 | cursor: pointer; 519 | &:hover{ 520 | transform: scale(1.01); 521 | } 522 | } 523 | ` -------------------------------------------------------------------------------- /components/icons/index.js: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | 3 | export const TwitterIcon = (props) => ( 4 | 11 | 15 | 16 | ); 17 | 18 | export const DiscordIcon = (props) => ( 19 | 26 | 30 | 31 | ); 32 | 33 | export const PlusIcon = (props) => ( 34 | 46 | 47 | 48 | ); 49 | 50 | export const HomeIcon = (props) => ( 51 | 63 | 64 | 65 | 66 | ); 67 | 68 | export const ChevronRightIcon = (props) => ( 69 | 80 | 81 | 82 | ); 83 | 84 | export const PassIcon = (props) => ( 85 | 93 | 94 | 95 | 96 | ); 97 | 98 | export const HexIcon = (props) => ( 99 | 108 | 109 | 110 | 111 | 112 | ); 113 | 114 | export const OvalIcon = (props) => ( 115 | 124 | 125 | 126 | 127 | 128 | ); 129 | 130 | export const NewUp = (props) => ( 131 | 139 | 140 | 141 | 142 | ); 143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /data/BioData.js: -------------------------------------------------------------------------------- 1 | // date: 1 Aug, 2022 2 | const bioData = [ 3 | { 4 | name: 'nxt lnk', 5 | username: 'nxtlnk.vercel.app', 6 | url: 'https://nxtlnk.vercel.app', 7 | titleImg: true, 8 | avatar: '/avatar.png', 9 | nftAvatar: true, 10 | description: 'Custom bio links for creatives who love coding. Made this first to use for my own weblinks vjy.me/lnk. ', 11 | descShow: true, 12 | subdesc: 'Use this template and deploy on vercel for free', 13 | subdescShow: true, 14 | newProductUrl: 'https://3dicons.co', 15 | newProduct: true, 16 | author: 'realvjy', 17 | authorURL: 'https://twitter.com/realvjy', 18 | footerText: 'made by' 19 | }, 20 | ]; 21 | 22 | export default bioData; 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /data/LinksData.js: -------------------------------------------------------------------------------- 1 | // date 29-Jul, 2022 2 | const webLinks = [ 3 | // All social profile 4 | { 5 | title: 'Twitter', 6 | url: 'https://twitter.com/realvjy', 7 | type: 'social', 8 | icon: '/twitter.svg', 9 | on: true 10 | }, 11 | { 12 | title: 'Instagram', 13 | url: 'https://instagram.com/realvjy', 14 | type: 'social', 15 | icon: '/insta.svg', 16 | on: true 17 | }, 18 | { 19 | title: 'Dribbble', 20 | url: 'https://dribbble.com/realvjy', 21 | type: 'social', 22 | icon: '/dribbble.svg', 23 | on: false 24 | }, 25 | { 26 | title: 'Medium', 27 | url: 'https://medium.com/@realvjy', 28 | type: 'social', 29 | icon: '/medium.svg', 30 | on: false 31 | }, 32 | { 33 | title: 'Github', 34 | url: 'https://github.com/realvjy', 35 | type: 'social', 36 | icon: '/github.svg', 37 | on: true 38 | }, 39 | { 40 | title: 'Youtube', 41 | url: 'https://youtube.com/realvjy', 42 | type: 'social', 43 | icon: '/youtube.svg', 44 | on: false 45 | }, 46 | { 47 | title: 'Figma', 48 | url: 'https://figma.com/@realvjy', 49 | type: 'social', 50 | icon: '/figma.svg', 51 | on: true 52 | }, 53 | { 54 | title: 'Behance', 55 | url: 'https://behance.net/realvjy', 56 | type: 'social', 57 | icon: '/behance.svg', 58 | on: false 59 | }, 60 | { 61 | title: 'Linkedin', 62 | url: 'https://www.linkedin.com/in/realvjy/', 63 | type: 'social', 64 | icon: '/linkedin.svg', 65 | on: false 66 | }, 67 | { 68 | title: 'Mastodon', 69 | url: 'https://mastodon.online/@realvjy', 70 | type: 'social', 71 | icon: '/mastodon.svg', 72 | on: true 73 | }, 74 | { 75 | title: 'Hive Social', 76 | url: 'https://www.hivesocial.app/?@realvjy', 77 | type: 'social', 78 | icon: '/hive.svg', 79 | on: false 80 | }, 81 | { 82 | title: 'Post', 83 | url: 'https://www.post.news/realvjy', 84 | type: 'social', 85 | icon: '/post.svg', 86 | on: false 87 | }, 88 | { 89 | title: 'foundation', 90 | url: 'https://vjy.me', 91 | type: 'nft', 92 | icon: '/foundation.svg', 93 | on: false 94 | }, 95 | { 96 | title: 'opensea', 97 | url: 'https://vjy.me', 98 | type: 'nft', 99 | icon: '/opensea.svg', 100 | on: false 101 | }, 102 | { 103 | title: 'new collection', 104 | url: 'https://vjy.me', 105 | type: 'nft', 106 | icon: '/opensea.svg', 107 | on: false 108 | }, 109 | // Install section 110 | { 111 | title: 'Use this template', 112 | url: 'https://github.com/realvjy/nxt-lnk/generate', 113 | type: 'install', 114 | icon: '/use.png', 115 | on: true 116 | }, 117 | { 118 | title: 'Deploy on Vercel', 119 | url: 'https://vercel.com/import/git?s=https://github.com/realvjy/nxt-lnk', 120 | type: 'install', 121 | icon: '/vercel.svg', 122 | on: true 123 | }, 124 | { 125 | title: 'Documentation', 126 | url: 'https://github.com/realvjy/nxt-lnk#nxt-lnk', 127 | type: 'install', 128 | icon: '/doc.png', 129 | on: true 130 | }, 131 | { 132 | title: 'Github', 133 | url: 'https://github.com/realvjy/nxt-lnk', 134 | type: 'install', 135 | icon: '/github-fill.svg', 136 | on: true 137 | }, 138 | 139 | { 140 | title: 'Buy Me a Coffee', 141 | url: 'https://www.buymeacoffee.com/realvjy', 142 | type: 'other', 143 | icon: '/bmc.png', 144 | on: true 145 | }, 146 | 147 | { 148 | title: 'link demo', 149 | url: 'https://vjy.me/lnk', 150 | type: 'other', 151 | icon: '/vjy.png', 152 | on: true 153 | }, 154 | 155 | { 156 | title: 'maker website', 157 | url: 'https://vjy.me', 158 | type: 'other', 159 | icon: '/vjy.png', 160 | on: true 161 | }, 162 | ]; 163 | 164 | export default webLinks; 165 | 166 | 167 | -------------------------------------------------------------------------------- /next-seo.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | openGraph: { 3 | type: 'website', 4 | locale: 'en_IE', 5 | title: 'next lnks by realvjy', 6 | url: 'https://vjy.me', 7 | description: 'Custom bio links for creatives who love coding. Made this first to use for my own weblinks vjy.me/lnk.', 8 | locale: 'en_EN', 9 | keywords: 'designer, product designer, illustrator, indian designer, vijay verma, realvjy, illlustrations, indian illustrator, ui designer india, sushi design system, zomato designer, 3dicons, uiprint, vijay realvjy, indian ui designer, design india, overlayz, nft art', 10 | images: [ 11 | { 12 | width: 1200, 13 | height: 630, 14 | url: `https://vjy.me/preview.jpg`, 15 | }, 16 | ], 17 | site_name: 'realvjy', 18 | }, 19 | twitter: { 20 | handle: '@realvjy', 21 | site: 'vjy.me', 22 | cardType: 'summary_large_image', 23 | }, 24 | }; -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | swcMinify: true, 5 | compiler: { 6 | // ssr and displayName are configured by default 7 | styledComponents: true, 8 | }, 9 | optimizeFonts: false, async rewrites() { 10 | return [ 11 | { 12 | source: '/(links|lnk|l)', 13 | destination: '/', 14 | }, 15 | ] 16 | }, 17 | } 18 | 19 | module.exports = nextConfig 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "realvjy", 3 | "version": "5.0.0", 4 | "description": "Design Wizard", 5 | "author": "realvjy", 6 | "license": "MIT", 7 | "private": true, 8 | "scripts": { 9 | "dev": "next dev", 10 | "build": "next build", 11 | "start": "next start" 12 | }, 13 | "dependencies": { 14 | "@react-three/fiber": "^8.2.1", 15 | "next": "^12.2.4", 16 | "next-seo": "^5.5.0", 17 | "nextjs-google-analytics": "^2.0.0", 18 | "react": "18.2.0", 19 | "react-dom": "18.2.0", 20 | "react-fast-marquee": "^1.3.2", 21 | "react-mailchimp-subscribe": "^2.1.3", 22 | "react-particles-js": "^3.6.0", 23 | "styled-components": "^5.3.5", 24 | "three": "^0.142.0", 25 | "use-dark-mode": "^2.3.1", 26 | "use-window-size": "^0.0.1" 27 | }, 28 | "devDependencies": { 29 | "eslint": "8.19.0", 30 | "eslint-config-next": "12.2.2", 31 | "prettier": "^2.7.1" 32 | } 33 | } -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react" 2 | import useDarkMode from "use-dark-mode" 3 | import Head from "next/head"; 4 | import { ThemeProvider } from "styled-components"; 5 | import Layout from "../components/Layout"; 6 | import GlobalStyle from "../styles/GlobalStyle"; 7 | import { darkTheme, lightTheme } from "../styles/theme.config"; 8 | import { GoogleAnalytics } from "nextjs-google-analytics"; 9 | import { DefaultSeo } from 'next-seo'; 10 | import SEO from '../next-seo.config'; 11 | 12 | function MyApp({ Component, pageProps }) { 13 | const darkMode = useDarkMode(false, { storageKey: null, onChange: null }) 14 | const [isMounted, setIsMounted] = useState(false) 15 | 16 | // const [theme, setTheme] = useState(lightTheme) 17 | const theme = darkMode.value ? darkTheme : lightTheme; 18 | 19 | useEffect(() => { 20 | setIsMounted(true); 21 | }, []) 22 | 23 | return ( 24 | <> 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 58 | {isMounted && } 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | export default MyApp -------------------------------------------------------------------------------- /pages/_document.js: -------------------------------------------------------------------------------- 1 | import Document, { Html, Head, Main, NextScript } from "next/document"; 2 | import { ServerStyleSheet } from "styled-components"; 3 | 4 | export default class MyDocument extends Document { 5 | static async getInitialProps(ctx) { 6 | const sheet = new ServerStyleSheet(); 7 | const originalRenderPage = ctx.renderPage; 8 | 9 | try { 10 | ctx.renderPage = () => 11 | originalRenderPage({ 12 | enhanceApp: (App) => (props) => 13 | sheet.collectStyles(), 14 | }); 15 | 16 | const initialProps = await Document.getInitialProps(ctx); 17 | return { 18 | ...initialProps, 19 | styles: ( 20 | <> 21 | {initialProps.styles} 22 | {sheet.getStyleElement()} 23 | 24 | ), 25 | }; 26 | } finally { 27 | sheet.seal(); 28 | } 29 | } 30 | 31 | render() { 32 | return ( 33 | 34 | 35 | 36 | 41 | 45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | ); 54 | } 55 | } -------------------------------------------------------------------------------- /pages/api/hello.js: -------------------------------------------------------------------------------- 1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction 2 | 3 | export default function handler(req, res) { 4 | res.status(200).json({ name: 'John Doe' }) 5 | } 6 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import WebLinks from '../components/WebLinks'; 2 | import Seo from '../components/Seo'; 3 | import seoData from '../next-seo.config'; 4 | 5 | 6 | export default function Home() { 7 | const page = { 8 | title: seoData.openGraph.title, 9 | excerpt: 'home', 10 | slug: '/', 11 | coverImage: 'https://vjy.me/preview.jpg' 12 | }; 13 | return ( 14 | <> 15 | 16 | 17 | 18 | ) 19 | } 20 | 21 | -------------------------------------------------------------------------------- /public/3dicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/3dicons.png -------------------------------------------------------------------------------- /public/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/avatar.png -------------------------------------------------------------------------------- /public/behance.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/bg.png -------------------------------------------------------------------------------- /public/bmc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/bmc.png -------------------------------------------------------------------------------- /public/designletter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/designletter.png -------------------------------------------------------------------------------- /public/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/doc.png -------------------------------------------------------------------------------- /public/dribbble.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/facebook.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | f-vv459 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/favicon.ico -------------------------------------------------------------------------------- /public/figma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/foundation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/g-bg.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 | -------------------------------------------------------------------------------- /public/github-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/gumroad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/gumroad.png -------------------------------------------------------------------------------- /public/hive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/illlustrations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/illlustrations.png -------------------------------------------------------------------------------- /public/insta.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/ios.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/linkedin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/mastodon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/medium.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/moon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/new-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/newproduct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/newproduct.png -------------------------------------------------------------------------------- /public/noflash.js: -------------------------------------------------------------------------------- 1 | // Insert this script in your index.html right after the tag. 2 | // This will help to prevent a flash if dark mode is the default. 3 | 4 | (function () { 5 | // Change these if you use something different in your hook. 6 | var storageKey = 'darkMode'; 7 | var classNameDark = 'dark-mode'; 8 | var classNameLight = 'light-mode'; 9 | 10 | function setClassOnDocumentBody(darkMode) { 11 | document.body.classList.add(darkMode ? classNameDark : classNameLight); 12 | document.body.classList.remove(darkMode ? classNameLight : classNameDark); 13 | } 14 | 15 | var preferDarkQuery = '(prefers-color-scheme: dark)'; 16 | var mql = window.matchMedia(preferDarkQuery); 17 | var supportsColorSchemeQuery = mql.media === preferDarkQuery; 18 | var localStorageTheme = null; 19 | try { 20 | localStorageTheme = localStorage.getItem(storageKey); 21 | } catch (err) { } 22 | var localStorageExists = localStorageTheme !== null; 23 | if (localStorageExists) { 24 | localStorageTheme = JSON.parse(localStorageTheme); 25 | } 26 | 27 | // Determine the source of truth 28 | if (localStorageExists) { 29 | // source of truth from localStorage 30 | setClassOnDocumentBody(localStorageTheme); 31 | } else if (supportsColorSchemeQuery) { 32 | // source of truth from system 33 | setClassOnDocumentBody(mql.matches); 34 | localStorage.setItem(storageKey, mql.matches); 35 | } else { 36 | // source of truth from document.body 37 | var isDarkMode = document.body.classList.contains(classNameDark); 38 | localStorage.setItem(storageKey, JSON.stringify(isDarkMode)); 39 | } 40 | })(); -------------------------------------------------------------------------------- /public/opensea.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/pinterest.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/post.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/preview.jpg -------------------------------------------------------------------------------- /public/product-hunt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/rarible.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/realvjy-gradient.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/realvjy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/showtime.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/tiktok.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/title.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/use.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/use.png -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/vijay-verma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/vjy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realvjy/nxt-lnk/50887c8add14438eab0bb174102f45932797bbb6/public/vjy.png -------------------------------------------------------------------------------- /public/web.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/youtube.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /styles/GlobalStyle.js: -------------------------------------------------------------------------------- 1 | import { createGlobalStyle } from "styled-components"; 2 | 3 | const GlobalStyle = createGlobalStyle` 4 | body.dark-mode { 5 | --img: invert(1); 6 | --avatar-shadow: rgba(28,22,47,.3); 7 | } 8 | 9 | body.light-mode { 10 | --img: invert(0); 11 | --avatar-shadow: rgba(48,52,77,.1); 12 | } 13 | 14 | * { 15 | --bg-light-yellow: #F2F2EE; 16 | --bg-light-blue: #EDF2FF; 17 | --bg-light-red: #F2EEEE; 18 | 19 | --light-yellow: #FFF6C5; 20 | --yellow: #F8C231; 21 | 22 | --light-red: #FFC5EC; 23 | --red: #FF6969; 24 | --pink: #ED81FF; 25 | --light-pink: #FFE9FA; 26 | 27 | --blue: #00A3FF; 28 | --light-blue: #B7F2FF; 29 | 30 | --white: #FFFFFF; 31 | --white20: #ecedee; 32 | --black: #11181C; 33 | --light-gray: #858585; 34 | --gray: #687076; 35 | --light-black: rgba(0,0,0,.05); 36 | --light-white: rgba(255,255,255,.03); 37 | 38 | margin: 0; 39 | padding: 0; 40 | border: 0; 41 | list-style: none; 42 | text-decoration: none; 43 | box-sizing: border-box; 44 | line-height: normal; 45 | transition: all .1s ease; 46 | 47 | 48 | } 49 | 50 | html{ 51 | scroll-behavior: smooth; 52 | } 53 | body { 54 | font-family: 'Inter', sans-serif; 55 | background: ${({ theme }) => theme.bg.primary}; 56 | color: ${({ theme }) => theme.text.primary}; 57 | text-rendering: optimizeLegibility; 58 | -webkit-font-smoothing: antialiased; 59 | 60 | } 61 | 62 | a{ 63 | color: ${({ theme }) => theme.text.primary}; 64 | } 65 | 66 | .main{ 67 | min-height: 100vh; 68 | 69 | } 70 | .toast-container { 71 | border-radius: 12px; 72 | font-size: 14px; 73 | font-weight: 600; 74 | } 75 | .container{ 76 | display: flex; 77 | align-items: center; 78 | justify-content: center; 79 | margin: 0 auto; 80 | 81 | } 82 | 83 | .nft-clipped{ 84 | clip-path: url(#hex); 85 | position: absolute; 86 | top: 50%; 87 | left: 50%; 88 | transform: translate(-50%, -50%); 89 | } 90 | 91 | .oval-clipped{ 92 | clip-path: url(#oval); 93 | position: absolute; 94 | top: 50%; 95 | left: 50%; 96 | transform: translate(-50%, -50%); 97 | } 98 | 99 | 100 | `; 101 | 102 | export default GlobalStyle; -------------------------------------------------------------------------------- /styles/global.css: -------------------------------------------------------------------------------- 1 | html{ 2 | scroll-behavior: smooth; 3 | } -------------------------------------------------------------------------------- /styles/theme.config.js: -------------------------------------------------------------------------------- 1 | import GlobalStyle from "./GlobalStyle" 2 | 3 | GlobalStyle 4 | const light = { 5 | bg: { 6 | primary: `var(--white)`, 7 | secondary: `var(--light-black)`, 8 | tertiary: 'rgba(0,0,0,0.03)', 9 | border: "#EAEAEA", 10 | inset: '#e2e4e8', 11 | input: 'rgba(65,67,78,0.12)', 12 | hover: 'linear-gradient(270deg, #FFF7FB 0%, #F4F8FF 100%);', 13 | }, 14 | text: { 15 | primary: `var(--black)`, 16 | secondary: 'rgba(0,0,0,0.5)', 17 | tertiary: '#646464', 18 | quarternary: '#9194a1', 19 | placeholder: 'rgba(82,85,96,0.5)', 20 | onPrimary: '#ffffff', 21 | }, 22 | img: { 23 | filter: 'invert(0)' 24 | }, 25 | 26 | } 27 | 28 | const dark = { 29 | bg: { 30 | primary: `var(--black)`, 31 | secondary: `var(--light-white)`, 32 | tertiary: 'rgba(255,255,255,0.03)', 33 | border: "#EAEAEA", 34 | inset: '#111111', 35 | input: 'rgba(191,193,201,0.12)', 36 | hover: 'linear-gradient(270deg, #131628 0%, #27141C 100%);', 37 | }, 38 | text: { 39 | primary: `var(--white20)`, 40 | secondary: 'rgba(255,255,255,0.3)', 41 | tertiary: '#a9abb6', 42 | quarternary: '#6c6f7e', 43 | placeholder: 'rgba(145,148,161,0.5)', 44 | onPrimary: '#050505', 45 | }, 46 | img: { 47 | filter: 'invert(1)' 48 | }, 49 | // ... 50 | } 51 | 52 | const defaultTheme = { 53 | fontSizes: [ 54 | '14px', // 0 55 | '16px', // 1 56 | '18px', // 2 57 | '22px', // 3 58 | '26px', // 4 59 | '32px', // 5 60 | '40px', // 6 61 | ], 62 | fontWeights: { 63 | body: 400, 64 | subheading: 500, 65 | link: 600, 66 | bold: 700, 67 | heading: 800, 68 | }, 69 | lineHeights: { 70 | body: 1.5, 71 | heading: 1.3, 72 | code: 1.6, 73 | }, 74 | deviceSize: { 75 | mobileS: '320px', 76 | mobileM: '375px', 77 | mobileL: '425px', 78 | tablet: '768px', 79 | laptop: '1024px', 80 | laptopL: '1440px', 81 | desktop: '2560px' 82 | }, 83 | // ... 84 | } 85 | 86 | export const lightTheme = { ...defaultTheme, ...light } 87 | export const darkTheme = { ...defaultTheme, ...dark } --------------------------------------------------------------------------------