Simple Developer portfolio
Tags: showdev, uidesign, webdev, frontend
Published: 2024-07-13 12:55:03

I created this simple developer portfolio page.

### Features
* Responsive.
* Tailwind css, for rapid development.
* Multi-theme (multiple choice colors), multi-mode (dark and light)
* Single section, multi tabbed

### Live site
You can view the live site here: [developers landing page](https://jrdev-port.netlify.app/)

### Screenshot

![Developers portfolio](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cnkh9slv9fg5xwi0wuis.png)


## Follow
[twitter](https://x.com/pauls_freeman)
[github](https://github.com/PaulleDemon)

### Source code

You can get the source code from [Github](https://github.com/PaulleDemon/landing-pages/blob/main/src/portfolio/jrdev)

I am also creating opensource landing pages, check out [free landing pages](https://github.com/PaulleDemon/landing-pages) 

```html
<!DOCTYPE html>
<html lang="en" data-theme="warning" data-mode="dark">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Jr dev</title>
    <meta name="description" content="">
    <link rel="shortcut icon" href="./assets/logo.png" type="image/x-icon">
    
    <!-- Open Graph / Facebook -->
    <meta property="og:title" content="Title of the project" />
    <meta property="og:description" content="" />
    <meta property="og:type" content="website" />
    <meta property="og:url" content="https://github.com/PaulleDemon" /> <!--Replace with the current website url-->
    <meta property="og:image" content="" />
  

    <!-- <link rel="stylesheet" href="../../tailwind-css/tailwind-runtime.css"> -->
    <link rel="stylesheet" href="./css/tailwind-build.css">
    <link rel="stylesheet" href="css/index.css">

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.11.3/font/bootstrap-icons.min.css" integrity="sha512-dPXYcDub/aeb08c63jRq/k6GaKccl256JQy/AnOq7CAnEZ9FzSL9wSbcZkMp4R26vBsMLFYH4kQ67/bbV8XaCQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />


</head>
<body class="lg:tw-h-[100vh] tw-w-full tw-bg-[#fff] dark:tw-bg-slate-800
             tw-flex tw-flex-col tw-text-black dark:tw-text-white">
    
    <main class="tw-w-full tw-h-full tw-overflow-hidden tw-flex max-lg:tw-flex-col">

        <section class="tw-w-[450px] max-lg:tw-w-full tw-h-full lg:tw-shadow-xl lg:dark:tw-shadow-gray-600 tw-gap-4
                        tw-flex tw-flex-col tw-p-4 tw-place-items-center">
            <!-- sidebar -->
            <div class="tw-w-[250px] tw-h-[250px] tw-overflow-hidden tw-rounded-full">
                <img src="./assets/images/people/man.jpg" 
                     class="tw-w-full tw-h-full tw-object-cover"   alt="man" srcset="">
            </div>
            
            <h1 class="tw-text-3xl tw-font-semibold">James mabe</h1>

            <p class="tw-text-justify tw-text-gray-800 dark:tw-text-gray-300 tw-mt-6 tw-max-w-[550px]">
                Lorem ipsum dolor sit amet consectetur, adipisicing elit. Dolores veritatis laboriosam obcaecati est minima pariatur dicta facilis, consequatur quod, hic nostrum qui voluptatibus laborum dolorum. Voluptates animi accusantium quos consequuntur!
            </p>

            <a href="https://tally.so/r/woO0Kx" class="btn-primary !tw-w-full
                                    hover:tw-scale-[1.02] tw-transition-transform   
                                    tw-duration-[0.3s] tw-max-w-[550px]
                                    ">
                Contact me
            </a>

            <div class="tw-flex tw-flex-col tw-gap-2 tw-mt-auto">
                
                <h3 class="tw-text-xl">News letter</h3>
                <form class="tw-flex tw-gap-2">
                    <input type="email" name="" placeholder="joe@mail.com"
                            class="input">
                    <button type="submit" class="btn-primary">Signup</button>
                </form>

            </div>

            <div class="tw-mt-5 tw-flex tw-gap-5 tw-text-2xl">

                <a href="http://github.com/PaulleDemon" class="link">
                    <i class="bi bi-github"></i>
                </a>
                <a href="http://twitter.com/pauls_freeman" class="link">
                    <i class="bi bi-twitter-x"></i>
                </a>
                <a href="http://www.youtube.com/@paultalkstech" class="link">
                    <i class="bi bi-youtube"></i>
                </a>
                <a href="mailto:paul@example.com" class="link">
                    <i class="bi bi-envelope-at-fill"></i>
                </a>
            </div>

        </section>

        <div class="tw-h-full tw-w-full tw-overflow-hidden">
            <header class="tw-relative tw-w-full lg:tw-h-[80px]
                            max-lg:tw-h-[150px]
                            tw-overflow-hidden tw-p-2 tw-flex max-lg:tw-flex-col">

                <!-- tabs section -->
                <div class="tw-absolute tw-top-4 tw-left-[50%] tw-translate-x-[-50%]  
                            tw-flex tw-p-1 tw-px-4 tw-rounded-md tw-gap-4 
                            tw-border-2 tw-border-primary max-md:tw-w-full
                            md:tw-w-fit tw-overflow-x-auto tw-h-[60px]">
                    <button class="tab-btn tab-active" onclick="openTab(event, 'about')">About</button>
                    <button class="tab-btn" onclick="openTab(event, 'skills')">Skills</button>
                    <button class="tab-btn" onclick="openTab(event, 'experience')">Experience</button>
                    <button class="tab-btn" onclick="openTab(event, 'call')">Schedule call</button>
                </div>
                
                <div class="tw-ml-auto tw-m-2 max-lg:tw-mt-auto tw-flex tw-gap-2  tw-place-items-center">
                    <select onchange="switchTheme()" id="theme-selector" 
                            class="input !tw-h-fit !tw-p-1 tw-text-black dark:tw-text-white ">
                        <option value="primary">Primary</option>
                        <option value="warning" selected>warning</option>
                        <option value="success">success</option>
                    </select>

                    <button class="tw-w-[30px]" onclick="toggleMode()">
                        <i class="bi bi-sun-fill" id="toggle-mode-icon"></i>
                    </button>
                </div>
            </header>

            <!-- tab contents -->
            <div>
                <section class="tab-content tw-w-full tw-h-full
                                    max-lg:tw-p-4 
                                    tw-flex tw-flex-col tw-overflow-hidden tw-relative"
                                    data-tab-name="about"
                                    >
                        
                    <div class="tw-w-full tw-h-full tw-p-[5%]
                                tw-place-content-center
                                tw-gap-6 max-xl:tw-place-items-center
                                tw-flex max-lg:tw-flex-col">

                        <div class="tw-flex tw-flex-col tw-place-content-center">
                            <div class="tw-text-6xl max-lg:tw-text-4xl tw-font-semibold 
                                        tw-leading-[80px]
                                        max-md:tw-leading-snug " 
                                        >
                                Hi 👋,
                                <br>
                                I am 
                                <span class="tw-text-primary">
                                    James mabe
                                </span>
                            </div>  
                            <div class="tw-mt-4 tw-max-w-[450px] tw-text-justify tw-p-2 max-lg:tw-max-w-full">
                                Lorem ipsum, dolor sit amet consectetur adipisicing elit. Enim velit odit necessitatibus sint eos 
                                cumque illo harum, quam facilis iste. Accusamus quisquam earum repellendus excepturi 
                                nobis veniam vitae assumenda error.
                            </div>
                            
                            <div class="tw-mt-4 tw-flex 
                                        tw-overflow-hidden tw-gap-4 
                                        tw-p-2
                                        tw-place-content-end ">
                                <a href="https://github.com/PaulleDemon" 
                                        class="btn-primary  
                                            !tw-text-primary
                                            !tw-bg-[#c8cbf984]
                                            tw-duration-[0.3s]
                                            hover:tw-scale-x-[1.03]
                                            tw-transition-transform
                                            "
                                            >
                                    <span>Projects</span>
                                </a>
                                <a class="btn-primary
                                            tw-duration-[0.3s]
                                            hover:tw-scale-x-[1.03]
                                            tw-transition-transform
                                            "
                                            href="https://tally.so/r/woO0Kx"
                                            >
                                    Contact
                                </a>  
                                  
                            </div>

                        </div>

                    </div>
                    
                </section>

                <section class="tab-content tw-w-full tw-h-full
                                    max-lg:tw-p-4 
                                    tw-hidden
                                    tw-flex tw-flex-col 
                                    tw-overflow-hidden tw-relative"
                                    data-tab-name="skills"
                                    >
                        
                    <div class="tw-w-full tw-h-full tw-p-[5%]
                                tw-place-content-center
                                tw-gap-6 max-xl:tw-place-items-center
                                tw-flex tw-flex-wrap tw-px-[25%] max-lg:tw-px-[10%] max-md:tw-px-2">

                        <div class="tw-w-[150px] tw-h-[150px] tw-bg-white tw-shadow-xl tw-rounded-lg
                                    tw-border-primary tw-border-2 
                                    tw-flex tw-place-content-center tw-items-center">
                            <div>
                                <img src="./assets/images/icons/html5.png" 
                                    alt="html5" srcset="" class="tw-object-contain">
                            </div>
                        </div>

                        <div class="tw-w-[150px] tw-h-[150px] tw-bg-white tw-shadow-xl tw-rounded-lg
                                    tw-border-primary tw-border-2 
                                    tw-flex tw-place-content-center tw-items-center">
                            <div>
                                <img src="./assets/images/icons/django.png" 
                                    alt="html5" srcset="" class="tw-object-contain">
                            </div>
                        </div>
                        <div class="tw-w-[150px] tw-h-[150px] tw-bg-white tw-shadow-xl tw-rounded-lg
                                    tw-border-primary tw-border-2 
                                    tw-flex tw-place-content-center tw-items-center">
                            <div>
                                <img src="./assets/images/icons/reactjs.png" 
                                    alt="react js" srcset="" class="tw-object-contain">
                            </div>
                        </div>

                        <div class="tw-w-[150px] tw-h-[150px] tw-bg-white tw-shadow-xl tw-rounded-lg
                                    tw-border-primary tw-border-2 
                                    tw-flex tw-place-content-center tw-items-center">
                            <div>
                                <img src="./assets/images/icons/tailwind.png" 
                                    alt="react js" srcset="" class="tw-object-contain">
                            </div>
                        </div>

                        <div class="tw-w-[150px] tw-h-[150px] tw-bg-white tw-shadow-xl tw-rounded-lg
                                    tw-border-primary tw-border-2 
                                    tw-flex tw-place-content-center tw-items-center">
                            <div>
                                <img src="./assets/images/icons/aws.png" 
                                    alt="aws" srcset="" class="tw-object-contain">
                            </div>
                        </div>

                    </div>
                    
                </section>

                <section class="tab-content tw-w-full tw-h-full
                                    max-lg:tw-p-4 
                                    tw-hidden
                                    tw-flex tw-flex-col 
                                    tw-overflow-hidden tw-relative"
                                    data-tab-name="experience"
                                    >
                        
                    <div class="tw-w-full tw-h-full tw-p-[5%]
                                tw-place-content-center
                                tw-gap-6 max-xl:tw-place-items-center
                                tw-flex tw-flex-wrap tw-px-[25%] max-md:tw-px-1">

                        <div>

                        </div>

                        <div class="tw-flex tw-flex-col tw-gap-5 timeline">
                            
                            <div class="tw-relative tw-mb-8 timeline-container">
                                <div class="tw-flex tw-flex-col tw-gap-2 tw-max-w-[550px] 
                                            max-lg:tw-max-w-[320px] tw-p-1">
                                    <h3 class="tw-text-3xl">Apple</h3>
                                    <p class="tw-text-gray-500 dark:tw-text-gray-200">2023 - current</p>
                                    <p class="">
                                        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempora accusantium rem modi deleniti praesentium pariatur cum aliquid ullam aperiam ut!
                                    </p>
                                </div>
                            </div>
                            
                            <div class="tw-relative tw-mb-8 timeline-container">
                                <div class="tw-flex tw-flex-col tw-gap-2 tw-max-w-[550px] 
                                            max-lg:tw-max-w-[320px] tw-p-1">
                                    <h3 class="tw-text-3xl">IBM</h3>
                                    <p class="tw-text-gray-500 dark:tw-text-gray-200">2020 - 2023</p>
                                    <p class="">
                                        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempora accusantium rem modi deleniti praesentium pariatur cum aliquid ullam aperiam ut!
                                    </p>
                                </div>
                            </div>
                            
                            <div class="tw-relative tw-mb-8 timeline-container">
                                <div class="tw-flex tw-flex-col tw-gap-2 tw-max-w-[550px] 
                                            max-lg:tw-max-w-[320px] tw-p-1">
                                    <h3 class="tw-text-3xl">Google</h3>
                                    <p class="tw-text-gray-500 dark:tw-text-gray-200">2018 - 2020</p>
                                    <p class="">
                                        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempora accusantium rem modi deleniti praesentium pariatur cum aliquid ullam aperiam ut!
                                    </p>
                                </div>
                            </div>
                        </div>

                    </div>
                    
                </section>

                <section class="tab-content tw-w-full tw-h-full
                                    max-lg:tw-p-2 
                                    tw-hidden
                                    tw-flex tw-flex-col 
                                    tw-overflow-hidden tw-relative"
                                    data-tab-name="call"
                                    >
                        
                    <div class="tw-w-full tw-h-full tw-p-4
                                tw-place-content-center
                                tw-gap-6 max-xl:tw-place-items-center
                                tw-flex tw-flex-wrap">

                                <iframe src="https://koalendar.com/e/meet-with-paul-about-webdesign?embed=true" width="100%" height="800px" frameborder="0"></iframe>

                    </div>
                    
                </section>

            </div>
            
            <footer class="tw-flex max-md:tw-flex-col tw-w-full tw-p-[5%]
                            tw-px-[10%] tw-place-content-around tw-gap-3 
                            tw-text-black
                            tw-mt-auto
                            ">
            </footer>
        </div>
    </mai>
</body>

<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.0/gsap.min.js" integrity="sha512-B1lby8cGcAUU3GR+Fd809/ZxgHbfwJMp0jLTVfHiArTuUt++VqSlJpaJvhNtRf3NERaxDNmmxkdx2o+aHd4bvw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.0/ScrollTrigger.min.js" integrity="sha512-AY2+JxnBETJ0wcXnLPCcZJIJx0eimyhz3OJ55k2Jx4RtYC+XdIi2VtJQ+tP3BaTst4otlGG1TtPJ9fKrAUnRdQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


<script src="./index.js"></script>

</html>
```

**CSS**

```css
@tailwind base;
@tailwind components;
@tailwind utilities;


@layer base {
    
    html[data-theme='primary'] {
      --color-primary: #155eef;
      --color-secondary: #c8cbf984;

      --color-btn-text: #fff;
    }
  
    html[data-theme='warning'] {
        --color-primary: #ffc934;
        --color-secondary: #c8cbf984;
        
      --color-btn-text: #000;
    }

    html[data-theme='success'] {
        --color-primary: #0aab1f;
        --color-secondary: #c8cbf984;
        
        --color-btn-text: #fff;

    }
}


@layer components{

    .btn-primary {
        @apply tw-bg-primary tw-text-buttonFg tw-py-[10px] tw-px-[15px] tw-cursor-pointer 
                tw-flex tw-justify-center tw-items-center tw-w-max tw-rounded-md;
    }

    .btn-primary:disabled{
        cursor: default;
    }

    .input{
        padding: 10px;
        background-color: transparent;
        border-radius: 6px;
        outline: none;
        min-width: 100px;
        border: 2px solid #818080;
        transition: border 0.3s;
    }

    .input:active, .input:focus, .input:focus-within{
        border: 2px solid var(--input-hover-bd-color);
        @apply tw-border-primary tw-border-2 tw-border-solid
    }

    .link{
        transition: color 0.5s;
    }
    
    .link:hover{
        @apply tw-text-primary;
    }


    .tab-btn{
        padding: 10px 15px;
        transition: background-color 0.3s, color 0.3s;
        border-radius: 6px;
        min-width: fit-content;
    }

    .tab-btn:hover{
        @apply tw-text-primary tw-bg-[#bebeff59];
    }

    .tab-active, .tab-active:hover{
        @apply tw-bg-primary tw-text-buttonFg;
    }
    
    select option {
        color: #000; /* Default color for light mode */
    }
    
    .timeline {
        position: relative;
        padding-left: 2rem;
    }

    .timeline-dot {
        position: absolute;
        left: 0;
        top: 50%;
        width: 1rem;
        height: 1rem;
        background-color: #3b82f6; /* Tailwind blue-500 */
        border-radius: 50%;
    }

    .timeline::before{
        @apply tw-bg-primary tw-absolute tw-top-0;
        content: '';
        height: 100%;
        width: 2px;
    }
    
    .timeline-container {
        padding: 10px 40px;
        position: relative;
        background-color: inherit;
    }
      
      /* The circles on the timeline */
    .timeline-container::after {

        @apply tw-border-primary tw-border-4 tw-border-solid tw-bg-white tw-rounded-full;
        content: '';
        position: absolute;
        width: 25px;
        height: 25px;
        top: 15px;
        left: -12px;
        z-index: 1;
    }
    

}
```