{"id":2281,"date":"2022-01-26T09:00:59","date_gmt":"2022-01-26T09:00:59","guid":{"rendered":"https:\/\/lvboard.infostore.in.ua\/?p=2281"},"modified":"2022-01-26T09:00:59","modified_gmt":"2022-01-26T09:00:59","slug":"how-to-build-a-portfolio-site-with-next-js-and-tailwindcss","status":"publish","type":"post","link":"https:\/\/lvboard.infostore.in.ua\/?p=2281","title":{"rendered":"How to Build a Portfolio Site with Next.js and TailwindCSS"},"content":{"rendered":"\n<p>If you&#8217;re a web developer, it&#8217;s important for you to have a personal portfolio website \u2013 especially when you&#8217;re applying for jobs.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>If you have a nice online portfolio site, you&#8217;ll have a better chance of getting attention from recruiters than if you don&#8217;t.<\/p>\n\n\n\n<p>Instead of sending your CV and asking a recruiter to have a look, a portfolio website can help you stand out by directly showcasing your skills, projects, education, and your personal brand.<\/p>\n\n\n\n<p>You can use your portfolio to showcase your projects, your education, share re-usable code snippets with the world, provide helpful resources, and write your own blogs. There are countless things that you can do with your own website.<\/p>\n\n\n\n<p>I built a template that you can use to create, edit, and deploy your own portfolio website for free on the internet in no time. And if you want to build your own version from scratch, I&#8217;ll show you how in this article.<\/p>\n\n\n\n<p>So let&#8217;s dive in \u2013 I&#8217;ll show you what technology I used, how I structured the portfolio, and I&#8217;ll break it down by section so you can see how each part works.<\/p>\n\n\n\n<h2 id=\"techstack\">Tech Stack<\/h2>\n\n\n\n<p>Let&#8217;s talk about the tech stack I used to build this template:<\/p>\n\n\n\n<ul><li><strong>Next.js<\/strong> &#8211; a React framework used for building blazing-fast websites along with server-side rendering, which makes it easier for people to find your site on the internet.<\/li><li><strong>tailwindcss<\/strong> &#8211; a CSS framework to that lets you quickly prototype and style your web applications.<\/li><li><strong>Rough Notation<\/strong> &#8211; a styling library used in the Hero section, great for highlighting important text on your webpage.<\/li><\/ul>\n\n\n\n<p>Why <code>Next.js<\/code>? Because it is a React framework with <code>Server-Side Rendering<\/code>, which is good for SEO (Good for us if we get found on Google, right?).<\/p>\n\n\n\n<p>Also, Next.js helps us build blazing-fast websites along with benefits such as Image optimization.<\/p>\n\n\n\n<p>Why <code>tailwindcss<\/code>? Because TailwindCSS is a framework which reduces a lot of styling efforts. It has low level CSS classes that you can directly embed into the HTML code.<\/p>\n\n\n\n<p>Not only that, it comes with amazing support for responsiveness. For example <code>&lt;div className=\"text-sm md:text-xl\"&gt;&lt;\/div&gt;<\/code> signifies that text will be <code>small<\/code> on smaller screens and <code>xl<\/code> on medium to large screens.<\/p>\n\n\n\n<p>Finally, we are going to deploy the application on <strong>Vercel<\/strong>. Vercel gives us an easy way to deploy our application with CI\/CD. The code is pushed to a remote GitHub repository and with every push, it&#8217;s deployed.<\/p>\n\n\n\n<h2 id=\"portfoliositefeatures\">Portfolio Site Features<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/2021\/08\/websitegif-1.gif\" alt=\"websitegif-1\"\/><\/figure>\n\n\n\n<p>The website includes what I consider to be the absolute minimum you should have in your portfolio website, along with some extra features that are cool to have.<\/p>\n\n\n\n<ul><li><code>Dark Mode<\/code> &#8211; Comes with dark mode support. Toggle the mode button to switch between dark and light mode.<\/li><li><code>Built with Next.js<\/code> &#8211; The website is built with Next.js which comes with awesome features out of the box like Image Optimization and SEO support.<\/li><li><code>Customizable styling<\/code> &#8211; Using TailwindCSS, I built this website in such a way that you can customize primary colors and change the look of your website according to your needs.<\/li><li><code>Custom Meta Component<\/code> &#8211; Every page is wrapped with a Meta Component tag which you can use to provide meta information for every separate page that you create.<\/li><li><code>Responsive Design<\/code> &#8211; Pages look beautiful on all the devices &#8211; desktop, tablet, and mobile.<\/li><\/ul>\n\n\n\n<h2 id=\"portfoliopageswellbuild\">Portfolio Pages We&#8217;ll Build<\/h2>\n\n\n\n<p>We are going to include all the necessary pages you should have in your portfolio website, such as:<\/p>\n\n\n\n<ul><li><code>Homepage<\/code> &#8211; A landing page for the visitor. This is what they&#8217;ll see when they land on your website.<\/li><li><code>About<\/code> &#8211; A brief intro that includes what you do, your technical skills, and your social links.<\/li><li><code>Experience<\/code> &#8211; A history of your work, your personal projects that you&#8217;ve undertaken, and your relevant projects.<\/li><li><code>Projects<\/code> &#8211; A grid of all the projects you have built.<\/li><li><code>Contact<\/code> &#8211; A form where the recruiter \/ end-user can reach out to you.<\/li><\/ul>\n\n\n\n<h2 id=\"components-and-layouts\">Components and Layouts<\/h2>\n\n\n\n<p>The entire website is divided into components \u2013 small chunks of reusable code that you can use anywhere on the webpage. The folder structure is quite simple and self explanatory:<\/p>\n\n\n\n<ul><li><code>components<\/code> is where all the components live, like the hero section, navbar, and layouts.<\/li><li><code>public<\/code> is where all your static assets go, like images, fonts, and\/or any external script for generating dynamic sitemaps.<\/li><li><code>styles<\/code> is where your global styling lives. We will integrate Tailwind&#8217;s base library here.<\/li><li><code>pages<\/code> is where all your routes live, and it&#8217;s one of the best features of Next.js. Just create a new file in the <code>pages<\/code> folder and it&#8217;ll serve as a new route.<\/li><\/ul>\n\n\n\n<h3 id=\"container-block\">Container Block<\/h3>\n\n\n\n<p><code>&lt;ContainerBlock \/&gt;<\/code> is the parent of all the components. It provides a way for the user to have custom meta tags for every page. I designed the layout so that it accepts props as <code>children<\/code> and provides a <code>Navbar<\/code>, <code>&lt;meta&gt;<\/code> tags, and <code>Footer<\/code> for every page.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React from \"react\";\nimport Head from \"next\/head\";\nimport { useRouter } from \"next\/router\";\nimport Navbar from \".\/Navbar\";\nimport Footer from \".\/Footer\";\n\nexport default function ContainerBlock({ children, ...customMeta }) {\n  const router = useRouter();\n\n  const meta = {\n    title: \"Manu Arora - Developer, Writer, Creator and YouTuber\",\n    description: `I've been developing websites for 5 years straight. Get in touch with me to know more.`,\n    image: \"\/avatar.png\",\n    type: \"website\",\n    ...customMeta,\n  };\n  return (\n    &lt;div&gt;\n      &lt;Head&gt;\n        &lt;title&gt;{meta.title}&lt;\/title&gt;\n        &lt;meta name=\"robots\" content=\"follow, index\" \/&gt;\n        &lt;meta content={meta.description} name=\"description\" \/&gt;\n        &lt;meta\n          property=\"og:url\"\n          content={`https:\/\/yourwebsite.com${router.asPath}`}\n        \/&gt;\n        &lt;link\n          rel=\"canonical\"\n          href={`https:\/\/yourwebsite.com${router.asPath}`}\n        \/&gt;\n        &lt;meta property=\"og:type\" content={meta.type} \/&gt;\n        &lt;meta property=\"og:site_name\" content=\"Manu Arora\" \/&gt;\n        &lt;meta property=\"og:description\" content={meta.description} \/&gt;\n        &lt;meta property=\"og:title\" content={meta.title} \/&gt;\n        &lt;meta property=\"og:image\" content={meta.image} \/&gt;\n        &lt;meta name=\"twitter:card\" content=\"summary_large_image\" \/&gt;\n        &lt;meta name=\"twitter:site\" content=\"@mannupaaji\" \/&gt;\n        &lt;meta name=\"twitter:title\" content={meta.title} \/&gt;\n        &lt;meta name=\"twitter:description\" content={meta.description} \/&gt;\n        &lt;meta name=\"twitter:image\" content={meta.image} \/&gt;\n        {meta.date &amp;&amp; (\n          &lt;meta property=\"article:published_time\" content={meta.date} \/&gt;\n        )}\n      &lt;\/Head&gt;\n      &lt;main className=\"dark:bg-gray-800 w-full\"&gt;\n        &lt;Navbar \/&gt;\n        &lt;div&gt;{children}&lt;\/div&gt;\n        &lt;Footer \/&gt;\n      &lt;\/main&gt;\n    &lt;\/div&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<p>After creating <code>ContainerBlock.js<\/code>, you can simply wrap your page component in a <code>ContainerBlock<\/code> tag, providing meta tags for <code>title<\/code>, <code>description<\/code>, and <code>image<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import Head from \"next\/head\";\nimport styles from \"..\/styles\/Home.module.css\";\nimport ContainerBlock from \"..\/components\/ContainerBlock\";\nimport FavouriteProjects from \"..\/components\/FavouriteProjects\";\nimport LatestCode from \"..\/components\/LatestCode\";\nimport Hero from \"..\/components\/Hero\";\n\nexport default function Home() {\n  return (\n    &lt;ContainerBlock\n      title=\"Manu Arora - Developer, Writer, Creator\"\n      description=\"Building a template with Next.js and Tailwindcss - for FreeCodeCamp users.\"\n    &gt;\n      &lt;Hero \/&gt;\n      &lt;FavouriteProjects \/&gt;\n      &lt;LatestCode \/&gt;\n    &lt;\/ContainerBlock&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<h2 id=\"how-to-enable-dark-mode\">How to Enable Dark Mode<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/2021\/08\/Screenshot-2021-08-18-at-9.09.35-AM.png\" alt=\"Screenshot-2021-08-18-at-9.09.35-AM\"\/><\/figure>\n\n\n\n<p>Dark mode support is provided by a <code>npm<\/code> package called <code>next-themes<\/code>. The aim is to wrap the parent container with a provider <code>ThemeProvider<\/code> through which the <code>theme<\/code> is available to the children at all times.<\/p>\n\n\n\n<p><strong>_app.js<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import \"..\/styles\/globals.css\";\nimport { ThemeProvider } from \"next-themes\";\n\nfunction MyApp({ Component, pageProps }) {\n  return (\n    &lt;ThemeProvider defaultTheme=\"light\" attribute=\"class\"&gt;\n      &lt;Component {...pageProps} \/&gt;\n    &lt;\/ThemeProvider&gt;\n  );\n}\n\nexport default MyApp;\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/2021\/08\/Copy-of-Untitled--6--1.png\" alt=\"Copy-of-Untitled--6--1\"\/><\/figure>\n\n\n\n<p>To toggle the theme between light mode and dark mode, we need a button. You can reuse this button anywhere in the application, but we are going to integrate it in the <code>Navbar<\/code> so it&#8217;s available for the end user at all times.<\/p>\n\n\n\n<p><strong>Navbar.js<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React, { useEffect, useState } from \"react\";\nimport Link from \"next\/link\";\nimport { useTheme } from \"next-themes\";\nimport { useRouter } from \"next\/router\";\n\nexport default function Navbar() {\n  const router = useRouter();\n  console.log(router.asPath);\n  const { theme, setTheme } = useTheme();\n  const &#91;mounted, setMounted] = useState(false);\n\n  useEffect(() =&gt; {\n    setMounted(true);\n  }, &#91;]);\n\n  return (\n    &lt;div className=\"max-w-6xl  mx-auto px-4 py-10 md:py-20\"&gt;\n      &lt;div className=\"flex  md:flex-row justify-between items-center\"&gt;\n        {\/* Logo \/ Home \/ Text *\/}\n\t\t \/\/ Rest of the code\n          &lt;button\n            aria-label=\"Toggle Dark Mode\"\n            type=\"button\"\n            className=\"w-10 h-10 p-3 rounded focus:outline-none\"\n            onClick={() =&gt; setTheme(theme === \"dark\" ? \"light\" : \"dark\")}\n          &gt;\n            {mounted &amp;&amp; (\n              &lt;svg\n                xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n                viewBox=\"0 0 24 24\"\n                fill=\"currentColor\"\n                stroke=\"currentColor\"\n                className=\"w-4 h-4 text-yellow-500 dark:text-yellow-500\"\n              &gt;\n                {theme === \"dark\" ? (\n                  &lt;path\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                    strokeWidth={2}\n                    d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"\n                  \/&gt;\n                ) : (\n                  &lt;path\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                    strokeWidth={2}\n                    d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\n                  \/&gt;\n                )}\n              &lt;\/svg&gt;\n            )}\n          &lt;\/button&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n     \/\/Rest of the code\n  );\n}<\/code><\/pre>\n\n\n\n<p>Once the button is clicked, the theme changes. Pretty cool, right? ?<\/p>\n\n\n\n<h2 id=\"how-to-build-the-hero-section\">How to Build the Hero Section<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/2021\/08\/hero.png\" alt=\"hero\"\/><\/figure>\n\n\n\n<p>The hero section lets you grab people&#8217;s attention. If you do it right, it can help you land your first job.<\/p>\n\n\n\n<p>I&#8217;ve used <code>react-rough-notation<\/code>, a library that dynamically highlights text with different colors and delays.<\/p>\n\n\n\n<p>The good thing about this effect is that the end-user immediately pays attention to the text that&#8217;s highlighted. You can put your best foot forward here and tell them WHO you are and WHAT you do.<\/p>\n\n\n\n<p>The code for <code>rough-notation<\/code> is simple: we wrap the text to be highlighted in <code>&lt;RoughNotationGroup&gt;<\/code> and <code>&lt;RoughNotation&gt;<\/code> tags with additional parameters such as colors and delays.<\/p>\n\n\n\n<p>Here, I&#8217;ll create a custom component called <code>RainbowHighlight<\/code> which takes in a color and highlights the text enclosed which can be used everywhere.<\/p>\n\n\n\n<p><strong>RainbowHighlight.js<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React from \"react\";\nimport { RoughNotation } from \"react-rough-notation\";\n\nexport const RainbowHighlight = ({ color, children }) =&gt; {\n  \/\/ Change the animation duration depending on length of text we're animating (speed = distance \/ time)\n  const animationDuration = Math.floor(30 * children.length);\n\n  return (\n    &lt;RoughNotation\n      type=\"highlight\"\n      multiline={true}\n      padding={&#91;0, 2]}\n      iterations={1}\n      animationDuration={animationDuration}\n      color={color}\n    &gt;\n      {children}\n    &lt;\/RoughNotation&gt;\n  );\n};\n<\/code><\/pre>\n\n\n\n<p><strong>Hero.js<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React from \"react\";\nimport { RoughNotation, RoughNotationGroup } from \"react-rough-notation\";\nimport { RainbowHighlight } from \".\/RainbowHighlight\";\n\nexport default function Hero() {\n  const colors = &#91;\"#F59E0B\", \"#84CC16\", \"#10B981\", \"#3B82F6\"];\n  return (\n    &lt;div className=\"flex flex-row justify-center items-start overflow-hidden\"&gt;\n      {\/* Text container *\/}\n\n      &lt;div className=\"w-full md:w-1\/2 mx-auto text-center md:text-left lg:p-20\"&gt;\n        &lt;RoughNotationGroup show={true}&gt;\n          &lt;RainbowHighlight color={colors&#91;0]}&gt;\n            &lt;h1 className=\"text-4xl md:text-8xl font-bold text-gray-700 dark:text-gray-200 my-2\"&gt;\n              Developer.\n            &lt;\/h1&gt;\n          &lt;\/RainbowHighlight&gt;\n       &lt;RoughNotationGroup&gt;\n     &lt;\/div&gt;\n     ....\n     ....\n     ....\n   );\n<\/code><\/pre>\n\n\n\n<h2 id=\"how-to-fetch-the-latest-repositories-from-github\">How to Fetch the Latest Repositories From GitHub<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/2021\/08\/Screenshot-2021-08-18-at-9.09.35-AM-1.png\" alt=\"Screenshot-2021-08-18-at-9.09.35-AM-1\"\/><\/figure>\n\n\n\n<p>Fetching repositories with the <a href=\"https:\/\/docs.github.com\/en\/rest\">GitHub API<\/a> is quite easy.<\/p>\n\n\n\n<p>The GitHub API comes with a provision to fetch the repositories with descending <code>updated_time<\/code> field, so that we get the latest repositories.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> const res = await axios.get(\n      `https:\/\/api.github.com\/search\/repositories?q=user:${username}+sort:author-date-asc`\n    );<\/code><\/pre>\n\n\n\n<p>Once we fetch the latest repository, we <code>splice<\/code> the array to only take into account the most recent 6 repositories.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let repos = res.data.items;\n    let latestSixRepos = repos.splice(0, 6);\n    return latestSixRepos;<\/code><\/pre>\n\n\n\n<p>So the entire function looks like this:<\/p>\n\n\n\n<p><strong>getLatestRepos.js<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import axios from \"axios\";\n\nconst getLatestRepos = async (data) =&gt; {\n  console.log(\"data\", data);\n  try {\n    const username = data.githubUsername;\n\n    const res = await axios.get(\n      `https:\/\/api.github.com\/search\/repositories?q=user:${username}+sort:author-date-asc`\n    );\n\n    let repos = res.data.items;\n    let latestSixRepos = repos.splice(0, 6);\n    return latestSixRepos;\n  } catch (err) {\n    console.log(err);\n  }\n};\n\nexport default getLatestRepos;\n<\/code><\/pre>\n\n\n\n<p>Once the data is fetched from the function, we can then use it inside of our React Component <code>&lt;GetReposCard \/&gt;<\/code> and pass the parameters accordingly.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-6xl mx-auto px-10 lg:-mt-10 gap-y-20\"&gt;\n        {\/* Single github Repo *\/}\n\n        {repos &amp;&amp;\n          repos.map((latestRepo, idx) =&gt; (\n            &lt;GithubRepoCard latestRepo={latestRepo} key=\"idx\" \/&gt;\n          ))}\n      &lt;\/div&gt;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>const GithubRepoCard = ({ latestRepo }) =&gt; {\n  return (\n    &lt;div className=\"github-repo\"&gt;\n      &lt;h1 className=\"font-semibold text-xl dark:text-gray-200 text-gray-700\"&gt;\n        {latestRepo.name}\n      &lt;\/h1&gt;\n      &lt;p className=\"text-base font-normal my-4 text-gray-500\"&gt;\n        {latestRepo.description}\n      &lt;\/p&gt;\n      &lt;a\n        href={latestRepo.clone_url}\n        className=\"font-semibold group flex flex-row space-x-2 w-full items-center\"\n      &gt;\n        &lt;p&gt;View Repository &lt;\/p&gt;\n        &lt;div className=\"transform  group-hover:translate-x-2 transition duration-300\"&gt;\n          &amp;rarr;\n        &lt;\/div&gt;\n      &lt;\/a&gt;\n    &lt;\/div&gt;\n  );\n};\n<\/code><\/pre>\n\n\n\n<p>There is a small problem here \u2013 the GitHub API provides only a limited number of calls per IP address.<\/p>\n\n\n\n<p>To resolve this issue, one can create a GitHub application and generate <code>Auth Tokens<\/code>, which we can embed with the GitHub API request and you&#8217;ll get more requests per IP address. You can <a href=\"https:\/\/docs.github.com\/en\/rest\/overview\/resources-in-the-rest-api#rate-limiting\">read the documentation here<\/a> for more info about it.<\/p>\n\n\n\n<h2 id=\"how-to-include-projects-in-your-portfolio\">How to Include Projects in Your Portfolio<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/2021\/08\/projects.png\" alt=\"projects\"\/><\/figure>\n\n\n\n<p>I&#8217;ve kept the projects section as simple as possible with a huge image area, because the recruiter \/ end-user is most interested in seeing what you&#8217;ve done. If it looks good, you already have an edge.<\/p>\n\n\n\n<p>I&#8217;ve divided the page into Tailwind <code>grids<\/code> of two columns, which breaks on mobile screens into 1 column.<\/p>\n\n\n\n<p>The image container contains a header text that displays the project&#8217;s name and a number at the bottom.<\/p>\n\n\n\n<p>The hover animations on the images are subtle. The image scales slowly to gather the user&#8217;s attention. On click, it takes the user to the live website \/ GitHub repository of the project.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  \nimport React from \"react\";\n\nexport default function Projects() {\n  return (\n    &lt;section className=\"bg-white dark:bg-gray-800\"&gt;\n      &lt;div className=\"max-w-6xl mx-auto h-48 bg-white dark:bg-gray-800\"&gt;\n        &lt;h1 className=\" text-5xl md:text-9xl font-bold py-20 text-center md:text-left\"&gt;\n          Projects\n        &lt;\/h1&gt;\n      &lt;\/div&gt;\n      {\/* Grid starts here *\/}\n      &lt;div className=\"bg-&#91;#F1F1F1] dark:bg-gray-900\"&gt;\n        &lt;div className=\"max-w-6xl mx-auto grid grid-cols-1 md:grid-cols-2 gap-8 py-20 pb-40\"&gt;\n          {\/* Single card *\/}\n          &lt;a\n            href=\"https:\/\/tailwindmasterkit.com\"\n            className=\"w-full block shadow-2xl\"\n          &gt;\n            &lt;div className=\"relative overflow-hidden\"&gt;\n              &lt;img\n                src=\"\/tmk.jpg\"\n                alt=\"portfolio\"\n                className=\"transform hover:scale-125 transition duration-2000 ease-out\"\n              \/&gt;\n              &lt;h1 className=\"absolute top-10 left-10 text-gray-50 font-bold text-xl bg-red-500 rounded-md px-2\"&gt;\n                Tailwind Master Kit\n              &lt;\/h1&gt;\n              &lt;h1 className=\"absolute bottom-10 left-10 text-gray-50 font-bold text-xl\"&gt;\n                01\n              &lt;\/h1&gt;\n            &lt;\/div&gt;\n          &lt;\/a&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n    &lt;\/section&gt;\n    ...\n    ...\n    ...\n  );\n<\/code><\/pre>\n\n\n\n<h2 id=\"how-to-build-the-contact-page\">How to Build the Contact Page<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/2021\/08\/contact.png\" alt=\"contact\"\/><\/figure>\n\n\n\n<p>I took the contact section directly from the <a href=\"http:\/\/tailwindmasterkit.com\">Tailwind Master Kit<\/a>, which is a components and templates marketplace for Tailwind web app projects. I didn&#8217;t want spend more time styling a contact form myself and used some help.<\/p>\n\n\n\n<p>The component is absolutely free and you can embed it into Tailwind related websites easily.<\/p>\n\n\n\n<p><strong>Contact.js<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React from \"react\";\n\nexport default function Contact() {\n  return (\n    &lt;section&gt;\n      &lt;div className=\"max-w-6xl mx-auto h-48 bg-white dark:bg-gray-800 antialiased\"&gt;\n        &lt;h1 className=\" text-5xl md:text-9xl font-bold py-20 text-center md:text-left\"&gt;\n          Contact\n        &lt;\/h1&gt;\n      &lt;\/div&gt;\n      &lt;div className=\"relative z-10 rounded-md shadow-md bg-&#91;#02044A] p-4 md:p-10 lg:p-20 max-w-6xl mx-auto mb-20 -mt-4\"&gt;\n        &lt;div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\"&gt;\n          &lt;div className=\"md:ml-4\"&gt;\n            &lt;header className=\"\"&gt;\n              &lt;h1 className=\"text-gray-50 font-semibold text-2xl\"&gt;\n                Get in touch, let's talk.\n              &lt;\/h1&gt;\n              &lt;p className=\"font-light text-base text-gray-200 mt-2\"&gt;\n                Fill in the details and I'll get back to you as soon as I can.\n              &lt;\/p&gt;\n            &lt;\/header&gt;\n            &lt;div className=\"icons-container inline-flex flex-col my-20\"&gt;\n              &lt;div className=\"flex flex-row items-center space-x-6 rounded-md border border-&#91;#02044A] hover:border hover:border-blue-500 p-4\"&gt;\n                \n                &lt;p className=\"text-gray-50 font-light text-sm\"&gt;\n                  +91 9987384723\n                &lt;\/p&gt;\n              &lt;\/div&gt;\n              &lt;div className=\"flex flex-row items-center space-x-6 rounded-md border border-&#91;#02044A] hover:border hover:border-blue-500 p-4\"&gt;\n                ....\n                ....\n                &lt;p className=\"text-gray-50 font-light text-sm\"&gt;\n                  contact@yourwebsite.com\n                &lt;\/p&gt;\n              &lt;\/div&gt;\n              &lt;div className=\"flex flex-row items-center space-x-6 rounded-md border border-&#91;#02044A] hover:border hover:border-blue-500 p-4\"&gt;\n                ....\n                ....\n          &lt;form className=\"form rounded-lg bg-white p-4 flex flex-col\"&gt;\n            &lt;label htmlFor=\"name\" className=\"text-sm text-gray-600 mx-4\"&gt;\n              {\" \"}\n              Your Name\n            &lt;\/label&gt;\n            &lt;input\n              type=\"text\"\n              className=\"font-light rounded-md border focus:outline-none py-2 mt-2 px-1 mx-4 focus:ring-2 focus:border-none ring-blue-500\"\n              name=\"name\"\n            \/&gt;\n            &lt;label htmlFor=\"email\" className=\"text-sm text-gray-600 mx-4 mt-4\"&gt;\n              Email\n            &lt;\/label&gt;\n            &lt;input\n              type=\"text\"\n              className=\"font-light rounded-md border focus:outline-none py-2 mt-2 px-1 mx-4 focus:ring-2 focus:border-none ring-blue-500\"\n              name=\"email\"\n            \/&gt;\n            &lt;button\n              type=\"submit\"\n              className=\"bg-blue-500 rounded-md w-1\/2 mx-4 mt-8 py-2 text-gray-50 text-xs font-bold\"\n            &gt;\n              Send Message\n            &lt;\/button&gt;\n          &lt;\/form&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n    &lt;\/section&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<h2 id=\"howtodeploytheportfolio\">How to Deploy the Portfolio<\/h2>\n\n\n\n<p>Deploying the application is fairly simple and just takes 8 simple steps.<\/p>\n\n\n\n<ol><li>Clone the repository<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/manuarora700\/simple-developer-portfolio-website\n<\/code><\/pre>\n\n\n\n<ol start=\"2\"><li>Install dependencies<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install\n<\/code><\/pre>\n\n\n\n<ol start=\"3\"><li>Start the local development server<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>npm run dev\n<\/code><\/pre>\n\n\n\n<ol start=\"4\"><li>Make modifications to the website. You should include all your projects, education, social links, and Meta information.<\/li><li>Push the code to your remote repository<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>git add *\ngit commit -m \"add changes to the cloned repo\"\ngit push\n<\/code><\/pre>\n\n\n\n<ol start=\"6\"><li>Create a Vercel account (or login to your Vercel account)<\/li><li>Add the newly created GitHub repository with the changes pushed and Vercel will automatically deploy it for you on a link.<\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/www.freecodecamp.org\/news\/content\/images\/2021\/08\/vercel.png\" alt=\"vercel\"\/><\/figure>\n\n\n\n<ol start=\"8\"><li>Once the site is live, share the test link with your friends or add it in your r\u00e9sum\u00e9. You can also go ahead and connect a custom domain to make it more professional.<\/li><\/ol>\n\n\n\n<h2 id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>This portfolio site will give a recruiter or visitor everything they&#8217;re looking for if they want to learn more about you and your work. The goal of your portfolio should be to showcase your skills in the best way possible.<\/p>\n\n\n\n<p>Also, we&#8217;ve built the site with <code>Next.js<\/code>, which shows that you&#8217;re comfortable with React and its frameworks. (Recruiters are looking for you! ?)<\/p>\n\n\n\n<p>The website uses <code>tailwindcss<\/code> for styling, which shows that you can work with a CSS framework and cut down on styling time.<\/p>\n\n\n\n<p>The components are granular and each serves its own purpose. The folder structure is simple and easy to understand.<\/p>\n\n\n\n<p>You can customize the website in any way you like &#8211; I&#8217;ve open sourced it and the code is linked to the GitHub repo below.<\/p>\n\n\n\n<p>My <a href=\"https:\/\/manuarora.in\">personal website<\/a> has helped me land interviews at big tech companies and it is one of the main reasons I&#8217;ve been able to get a job (along with practicing on freeCodeCamp and learning how to code).<\/p>\n\n\n\n<p>I really enjoyed building this website. If you liked it, leave a star on the GitHub repo and help spread the word. \u2b50\ufe0f<\/p>\n\n\n\n<h4 id=\"source-code-and-live-demo\">Source Code and Live Demo<\/h4>\n\n\n\n<p><a href=\"https:\/\/github.com\/manuarora700\/simple-developer-portfolio-website\">Source Code<\/a><br><a href=\"https:\/\/simple-developer-portfolio-website.vercel.app\/\">Live Demo<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you&#8217;re a web developer, it&#8217;s important for you to have a personal portfolio website \u2013 especially when you&#8217;re applying for jobs.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[30],"tags":[161,189],"_links":{"self":[{"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/posts\/2281"}],"collection":[{"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2281"}],"version-history":[{"count":1,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/posts\/2281\/revisions"}],"predecessor-version":[{"id":2282,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=\/wp\/v2\/posts\/2281\/revisions\/2282"}],"wp:attachment":[{"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lvboard.infostore.in.ua\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}