Skip to main content PA contour map - dark PA contour map - light

Hi! I'm Jeremy KatlicJK

PHP

index.php

                                                    <?php
require('variables.php');
?>

<!doctype html>
<html lang="en" class="loading-screen full-motion <?php echo IsMobileDevice(); ?>">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Creator/Designer: Jeremy Katlic (Web and Software Developer)
                                    Portfolio Website: showcasing my ability, passion, experience, and creativity">
    <title>Jeremy Katlic | Developer</title>
    <link rel="shortcut icon" href="images/pizza.svg" />

    <!-- Fonts: -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400;1,700&family=Pacifico&family=Permanent+Marker&family=Poppins:ital,wght@0,400;0,600;0,800;1,400;1,600;1,800&display=swap" rel="stylesheet">
    <link id="hljs-theme" rel="stylesheet" href=""> <!-- this will load in the JS when we can determine the sites theme -->


    <!-- CSS Backbone -->
    <link rel="stylesheet" type="text/css" href="css/modules.css" />
    <link rel="stylesheet" type="text/css" href="css/main.css" />

    <!-- just some google analytics stuff -->
</head>


<body>
    <a href="#main-content" class="skip-to-main">Skip to main content</a>
    
    <!-- 
            Making it an img rather than a background-image to make the animating and styling a little bit easier 
            https://buntinglabs.com/tools/download-topo-map-contour-lines -->
    <img class="page-bg" fetchpriority="high" src="images/page-bg.svg" alt="PA contour map - dark" />
    <img class="page-bg for-dark-mode" src="images/page-bg-white.svg" loading="lazy" alt="PA contour map - light" />

    <!-- Main Page Header -->
    <header id="main-header">
        <!-- Name -->
        <section id="logo-badge">
            <div>
                <h1><span class="label">Hi! I'm </span><strong class="main-name"><span>Jeremy Katlic</span></strong><strong class="sticky-name">JK</strong></h1>
            </div>
        </section>

        <!-- Main Menu - all page links and toggles -->
        <section id="main-menu">
            <nav id="main-menu-panel" class="menu-panel hidden" aria-hidden="true" role="menu">
                <ul>
                    <?php
                    foreach ($menu_controls as $title => $settings) {
                        $item = "<li>";

                        if ($settings['type'] == 'link') { //Links
                            $item .= '<a class="' . $settings['class'] . '" href="' . $settings['url'] . '" target="_blank" tabindex="-1" role="menuitem"';

                            if (isset($settings['extra_attr'])) {
                                $item .= ' ' . $settings['extra_attr'];
                            }

                            $item .= '><i class="' . $settings['icon'] . '"></i><span class="label">' . $title . '</span></a>';
                        } else { //Buttons
                            $item .= '<button class="' . $settings['class'] . '" aria-label="' . $settings['aria_label'] . '" tabindex="-1" role="menuitem"';

                            if (isset($settings['extra_attr'])) {
                                $item .= ' ' . $settings['extra_attr'];
                            }

                            $item .= '><i class="' . $settings['icon'] . '"></i>';

                            if (isset($settings['toggle_icon'])) {
                                $item .= '<i class="toggle-icon ' . $settings['toggle_icon'] . '"></i>';
                            }

                            $item .= '<span class="label">' . $title . '</span></button>';
                        }

                        echo $item .= '</li>';
                    }
                    ?>
                </ul>

                <button class="close-trigger" tabindex="-1" aria-expanded="true" aria-controls="main-menu-panel" aria-label="Close the main menu"><i class="icon-close"></i><span class="for-a11y">Close the Menu</span></button>
            </nav>

            <button id="menu-toggle" aria-expanded="false" aria-controls="main-menu-panel" aria-label="Toggle the main menu"><i class="control-icon"><span class="bar-1"></span><span class="bar-2"></span><span class="bar-3"></span><span class="bar-4"></span></i> <span class="for-a11y">Toggle Menu</span></button>
        </section>
    </header>

    <!-- Code View - a look at the code from the site, since it's not going up on a public git repo -->
    <section id="code-view">
        <div id="code-view-tabs">
            <?php //these aren't pulling live-code, this way we can remove some important information where necessary, and to obfuscate the live directory structure a little
            BuildCodePanel('code-view/php', 'php');
            BuildCodePanel('code-view/sass', 'scss');
            BuildCodePanel('code-view/css', 'css');
            BuildCodePanel('code-view/js', 'js');
            ?>
        </div>
    </section>


    <!-- Main Page Content - Welcome and Portfolio -->
    <main id="main-content">
        <!-- Welcome Panel and Statement -->
        <section id="welcome-panel">
            <div id="welcome-title">

                <!-- Image -->
                <div class="bg-image">
                    <img fetchpriority="high" src="images/welcome-bg.jpeg" alt="View of Raystown Dam in PA" />
                </div>

                <!-- Welcome Message -->
                <div class="title-box">
                    <span class="title-shadow" role="presentation">Welcome!</span>
                    <h2 class="title">Welcome!</h2>
                </div>
            </div>

            <!-- Welcome Statement -->
            <div class="statement">
                <p>With over a decade of experience in web development, I've had the opportunity to work on a variety of projects across different industries and technologies. My focus is on developing web solutions that are not just functional, but also intuitive, inclusive, and genuinely impactful for both clients and users.</p>
                <p>These are a few of my favorite projects from the past few years that I've been fortunate enough to help bring to life. Created in partnership with skilled teams and designers, they represent my ongoing commitment to building thoughtful and impactful digital experiences.</p>

                <!-- <div id="personal-hobbies-ticker"></div> -->
            </div>
        </section>

        <!-- Portfolio Projects -->
        <section id="portfolio-work">
            <?php
            foreach ($portfolio_work as $name => $content) {
                $item = '<section id="' . preg_replace('/\s+/', '-', strtolower($name)) . '-project" class="project ' . ((isset($content['award']) && $content['award'][0]) ? 'won-award' : '')  . '">
                                        <figure class="project-card" data-x="' . $content['animation']['x'] . '" data-y="' . $content['animation']['y'] . '" data-scale="' . $content['animation']['scale'] . '" data-start="' . $content['animation']['start'] . '" data-rotate="' . $content['animation']['rotateStart'] . '">';

                //Main Link
                $item .= '<a class="project-link" href="' . $content['url']  . '" target="_blank">';

                //Image
                $item .= '<div class="project-image"><img src="' . $content['img'] . '" loading="lazy" alt="Screenshot of ' . $name . '\'s homepage - built while at Finalsite" /></div>';

                //Title/text
                $item .= '<figcaption class="project-info">
                                <h2 class="project-title">' . $name . '</h2>
                                <p class="project-location">' . $content['location'] . '</p>
                                <p class="project-role"><strong>Role:</strong> ' . $content['role'] . '</p>
                            </figcaption>
                ';

                $item .= '</a>';

                //Award Link
                if(isset($content['award']) && $content['award'][0]) {
                    $item .= '<a class="project-award" href="' . $content['award'][1] . '" target="_blank"><span class="for-a11y">Award Won</span></a>';
                }

                echo $item .= '</figure></section>';
            }
            ?>
        </section>
    </main>


    <!-- Main Page Footer -->
    <footer id="main-footer">
        <!-- Legal Disclaimer -->
        <div id="disclaimer">
            <p><?php echo $disclaimer; ?></p>
        </div>

        <!-- Code Stack for the Site -->
        <section id="site-information">
            <div id="site-stack">
                <ul>
                    <?php
                    foreach ($site_stack as $resource) {
                        $item = "<li>";

                        $item .= '<p class="' . $resource[1] . '" title="' . $resource[0] . '"><span class="for-a11y">' . $resource[0] . '</span></p>';

                        echo $item .= '</li>';
                    }
                    ?>
                </ul>
            </div>

            <!-- Legal Copyright Notice -->
            <div id="copyright">
                <small><?php echo $copyright; ?></small>
            </div>
        </section>

        <!-- Here to make DOM change happen with less overhead -->
        <div id="mobile-disclaimer">
            <p><?php echo $disclaimer; ?></p>
        </div>
    </footer>


    <!-- 
            The JS Backbone
        -->
    <!-- jQuery-->
    <script
        src="https://code.jquery.com/jquery-3.7.1.min.js"
        integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
        crossorigin="anonymous"></script>

    <!-- GSAP - https://gsap.com 
            Supported by Webflow.
            Maintained by GSAP -->
    <script src="https://cdn.jsdelivr.net/npm/gsap@3.13/dist/gsap.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/gsap@3.13/dist/ScrollTrigger.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/Flip.min.js"></script>

    <!-- Highlight.js - https://highlightjs.org
            BSD 3-Clause License
            Copyright (c) 2006, Ivan Sagalaev.
            All rights reserved. -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/languages/php.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/languages/javascript.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/languages/scss.min.js"></script>

    <!-- W3C for basic a11y ui -->
    <script src="w3c/tabs.js"></script>

    <!--
        Jeremy Katlic Copyright 2025
            If you're reading this then here's a little peek at another project of mine I'm still working on (www.e46project.com) - while it's not on the website, the car is running and racing I'm just behind on updating and building the site out currently.
            
            Thanks for taking a deeper look :)
            
            P.S. I love easter eggs.. sooo good luck hunting haha-->
    <script src="js/main.js" type="text/javascript"></script>
</body>

</html>

variables.php

                                                    <?php // PHP Setup variables and objects - will be required

    $copyright = "©Jeremy Katlic";

    $disclaimer = "All projects shown here were created in collaboration with agencies, designers, and development teams. Screenshots and links are provided for the sole purpose of demonstrating professional experience. Trademarks and content belong to their respective owners. This website was independently developed by Jeremy Katlic, who expressly retain all copyrights, trademarks, and other intellectual property rights pertaining to their original work.";


    // Menu Controls - in the header - 'Title' => ['icon', 'type', opt: 'toggled-icon' or 'url', opt: 'extra attributes'/'aria-label']
    $menu_controls = array(
        'Dark Mode' => array(
            'type' => 'toggle',
            'class' => 'dark-mode-toggle',
            'icon' => 'icon-sun', 
            'toggle_icon' => 'icon-moon',
            'aria_label' => 'Toggle the light/dark mode of the site',
        ),
        'Reduce Animations' => array(
            'type' => 'toggle',
            'class' => 'motion-toggle animate-mode',
            'icon' => 'icon-water',
            'aria_label' => 'Reduce the motion and animations on the page'
        ),
        'EM' => array( // email-link, doing a minor JS obfuscation to prevent some scrapers - link info will be set in the JS
            'type' => 'link',
            'class' => 'em-link',
            'icon' => 'icon-envelope-open-text', 
            'url' => '#'
        ),
        'LinkedIn' => array(
            'type' => 'link',
            'class' => 'linkedin-link',
            'icon' => 'icon-linkedin',
            'url' => '//www.linkedin.com/in/jeremy-katlic-9983476b'
        ),
        'Resume' => array(
            'type' => 'link',
            'class' => 'resume-link',
            'icon' => 'icon-file-pdf', 
            'url' => '',
            'extra_attr' => 'download="Jeremy-Katlic-Resume"'
        ),
        'Code View' => array(
            'type' => 'button',
            'class' => 'code-view-toggle',
            'icon' => 'icon-file-code',
            'toggle_icon' => 'icon-window-restore',
            'aria_label' => 'Swap the main page content to show the code for the site'
        )
    );



    // Portfolio Items - [name of item => [location, tag, link, image, animation([x, y, scale, start, rotate]), ?award[bool, url]]] - 8-10 max
    $portfolio_work = array(
        'Canterbury School' => array(
            'location' => 'New Milford, Connecticut',
            'role' => 'Front End Developer',
            'url' => 'https://www.cbury.org/', 
            'img' => '/images/cbury-screen.jpeg',
            'animation' => array( //1
                'x' => -100,
                'y' => -33,
                'scale' => 0.3,
                'start' => "top 92%",
                'rotateStart' => -15
            ),
            'award' => array(true, 'https://enter.amcpros.com/marcom/entry/canterbury-school/')
        ),
        'Gould Academy' => array(
            'location' => 'Bethel, Maine',
            'role' => 'Front End Developer ',
            'url' =>  'https://www.gouldacademy.org/', 
            'img' => '/images/gould-screen.jpeg',
            'animation' => array( //2
                'x' => 102,
                'y' => 20,
                'scale' => 0.69,
                'start' => "top 92%",
                'rotateStart' => 16
            )
        ),
        'Tallulah Falls School' => array(
            'location' => 'Tallulah Falls, Georgia',
            'role' => 'Front End Developer',
            'url' => 'https://www.tallulahfalls.org/', 
            'img' => '/images/tallulah-screen.jpeg',
            'animation' => array( //3
                'x' => -45,
                'y' => 55,
                'scale' => 1.3,
                'start' => "top 70%",
                'rotateStart' => -10,
                'rotateEnd' => 3
            )
        ),
        'Marin Country Day School' => array(
            'location' => 'Corte Madera, California',
            'role' => 'Front End Developer',
            'url' => 'https://www.mcds.org/', 
            'img' => '/images/marin-screen.jpeg',
            'animation' => array( //4
                'x' => -40,
                'y' => 45,
                'scale' => 1.18,
                'start' => "top 70%",
                'rotateStart' => -12
            )
        ),
        'North Cobb Christian School' => array(
            'location' => 'Kennesaw, Georgia',
            'role' => 'Front End Developer',
            'url' => 'https://www.ncchristian.org/', 
            'img' => '/images/north-cobb-screen.jpeg',
            'animation' => array( //5
                'x' => 45,
                'y' => 50,
                'scale' => 1.33,
                'start' => "top 70%",
                'rotateStart' => 14
            ),
            'award' => array(true, 'https://daveyawards.com/winners-area/gallery/?event=1095&award=99&type=61&search=finalsite&id=618166')
        ),
        'Gwinnett County Public Schools' => array(
            'location' => 'Suwanee, Georgia',
            'role' => 'Front End Developer',
            'url' => 'https://www.gcpsk12.org/', 
            'img' => '/images/gwinnett-screen.jpeg',
            'animation' => array( //8
                'x' => 1,
                'y' =>  34,
                'scale' => 1.2,
                'start' => "top 70%",
                'rotateStart' => -4.7
            ),
            'award' => array(true,  'https://www.iacaward.org/iac/winner/18812/finalsite-wins-2024-iac-award-for-gwinnett-county-public-schools.html')
        ),
        'Saint Ignatius High School' => array(
            'location' => 'Cleveland, Ohio',
            'role' => 'Front End Developer',
            'url' => 'https://www.ignatius.edu/', 
            'img' => '/images/saint-ignatius-screen.jpeg',
            'animation' => array( //6
                'x' => 45,
                'y' => 33,
                'scale' => 1.2,
                'start' => "top 70%",
                'rotateStart' => 11
            ),
            'award' => array(true, 'https://museaward.com/winner-info.php?id=235675')
        ),
        'Catherine Cook School' => array(
            'location' => 'Chicago, Illinois',
            'role' => 'Font End Developer',
            'url' => 'https://www.catherinecookschool.org/', 
            'img' => '/images/catherine-cook-screen.jpeg',
            'animation' => array( //7
                'x' => -28,
                'y' =>  30,
                'scale' => 1.18,
                'start' => "top 70%",
                'rotateStart' => -4.2
            )
        ),
        'Orangewood Christian School' => array(
            'location' => 'Maitland, Florida',
            'role' => 'Front End Developer',
            'url' => 'https://www.orangewoodchristian.org/', 
            'img' => '/images/orangewood-screen.jpeg',
            'animation' => array( //8
                'x' => 1,
                'y' =>  30,
                'scale' => 1.25,
                'start' => "top 70%",
                'rotateStart' => 4.7
            ),
            'award' => array(true, 'https://enter.amcpros.com/hermes/entry/orangewood-christian-school/')
        )
    );

    

    //Site Stack - in the footer - [name, icon]
    $site_stack = array(
        array('PHP', 'icon-php'),
        // array('NodeJs', 'fa-brand node-js'), future update
        array('HTML', 'icon-html5'),
        array('Sass', 'icon-sass'),
        array('JS', 'icon-js-square'),
        array('Font Awesome', 'icon-font-awesome-flag'),
        array('Accessibility', 'icon-universal-access'),
        array('Myself', 'icon-ghost')
    );




    ///
    /// Functions
    //
    
    // Will detect for iOS and Android
    function IsMobileDevice () {
        $userAgent = $_SERVER['HTTP_USER_AGENT'];
        $classString = '';

        $isAndroid = stripos($userAgent, 'Android') !== false;
        $isIOS = (stripos($userAgent, 'iPhone') !== false || stripos($userAgent, 'iPad') !== false || stripos($userAgent, 'iPod') !== false);

        if($isAndroid || $isIOS){
            $classString = 'is-mobile-device ';

            if ($isAndroid) { 
                $classString .= 'is-android';
            }else{
                $classString .= 'is-ios';
            }
        }

        return $classString;
    }

    // Just lets us choose how we want to display labels and text for some of the coding languages - can be expanded to work with other strings if needed
    function SanitizeFileType ($type) {
        switch ($type) {
            case 'php': 
                $name = 'PHP';
                break;

            case 'js':
                $name = 'JavaScript';
                break;

            case 'css':
                $name = 'CSS';
                break;

            case 'scss':
                $name = 'Sass';
                break;
            
            default:
                $name = $type;
                break;
        }

        return $name;
    }

    // This will open each code directory and add their files to the page with all of the necessary information and attributes.
    function BuildCodePanel ($folder_path, $file_type) {
        if (is_dir($folder_path)) {
            $code_directory = new DirectoryIterator($folder_path);
            $files = []; // using this so we can sort
            $code_panel = '<div id="' . $file_type . '-files" class="code-files ' . $file_type . '" aria-labelledby="' . $file_type . '-trigger" data-file-type="' . $file_type . '" tabindex="-1">
                                <h2 class="code-type-header">' . SanitizeFileType($file_type) . '</h2>';

            foreach ($code_directory as $fileinfo) {
                if ($fileinfo->isDot()) continue;  // skip '.' and '..'
                if ($fileinfo->isFile() && $fileinfo->isReadable()) {
                    $files[] = new SplFileInfo($fileinfo->getPathname()); //just to be safe, store the data rather than a reference
                }
            }
            
            // Sort the array by filename
            usort($files, function ($a, $b) {
                return strcmp($a->getFilename(), $b->getFilename());
            });

            foreach ($files as $fileinfo) {
                $code = file_get_contents($folder_path . '/' . $fileinfo->getFilename());

                if ($code !== false) {
                    $sanitized_basename = ltrim($fileinfo->getBasename('.' . $file_type), '_') . '-' . $file_type;
                    $code_panel .= '<section id="' . $sanitized_basename . '-file" class="code-file" aria-labelledby="' . $sanitized_basename . '-trigger" data-file-name="' . $sanitized_basename . '" tabindex="-1">
                                        <h3 class="file-name">' . $fileinfo->getFilename() . '</h3>
                                        <div class="code-box">
                                            <div id="' . $sanitized_basename . '-code" class="zoom-box">
                                                <button class="zoom-toggle" aria-expanded="false" aria-controls="' . $sanitized_basename . '-code" aria-haspopup="true" aria-label="Make this code panel fullscreen" title="Toggle Fullscreen"><i class="icon-expand"></i><span class="for-a11y">Toggle Fullscreen</span></button>
                                                <pre class="file-' . $sanitized_basename . '">
                                                    <code>';
                    
                    $code_panel .= htmlspecialchars($code) . '</code></pre></div></div></section>';
                }
            }

            echo $code_panel .= '</div>';
        }
    }

?>

Sass

_global.scss

                                                    @use "./variables" as *;

///
/// Global Styles
/// 
html,
body{
    overflow-x: hidden;
}
html {
    background: #fff; //contrasts against the $light-bg as best we can - contrast not needed for a11y just styling
    font-family: $font-family-1;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;

    &.prevent-scrolling{
        overflow: hidden;
    }
    &.forced-prevent-scrolling{
        overflow: hidden !important;
    }
}

body {
    margin: 0;
    font-size: rem(16);
    line-height: 1.3;
    color: $light-txt;
}

section,
div{
    box-sizing: border-box;
}

button {
    color: $light-txt;
    cursor: pointer;
}

.for-a11y{
    @include hidden-a11y;
}

img,
figure{
    max-width: 100%;
    height: auto;
}


//a11y skip-link
.skip-to-main {
    position: absolute;
    left: -200vw;
    top: auto;
    width: 1px;
    height: 1px;
    overflow: hidden;
    z-index: 30;

    &:focus{
        left: 20px;
        top: 20px;
        width: auto;
        height: auto;
        padding: 20px;
        background: $light-bg;
        font-size: rem(17);
        color: $light-txt;
    }
}

_variables.scss

                                                    /******
    This contains global variables/mixins/etc.
***/

///
/// Colors
$light-bg: #FBFBFB;
$light-txt: #131313;
$dark-bg: #1F1F1F;
$dark-txt: #F9F9F9;
$accent-1: #F44A1F;
$accent-2: #007A8E;


///
/// Text
$body-font-size-base: 16; //applied as a px
$body-font-size: $body-font-size-base * 1px;
$font-family-1: "Lato", sans-serif; //main body, general
$font-family-2: "Pacifico", cursive; //copy-right, fancy-text
$font-family-3: "Poppins", sans-serif; //Trying to match a font from the 'Hello! My name is:' stickers but not be too ugly
$font-family-4: "Permanent Marker", cursive; //Trying to mimic the handwriting on one of those same stickers
$icon-family: 'jk-icons';


///
/// Icons
$icon-moon: unquote('"\\e901"');
$icon-envelope-open-text: unquote('"\\e902"');
$icon-award: unquote('"\\e900"');
$icon-compress: unquote('"\\e903"');
$icon-file-pdf: unquote('"\\e904"');
$icon-ghost: unquote('"\\e905"');
$icon-sun: unquote('"\\e906"');
$icon-linkedin: unquote('"\\e907"');
$icon-sass: unquote('"\\e908"');
$icon-html5: unquote('"\\e909"');
$icon-hand-lizard: unquote('"\\e90a"');
$icon-hand-spock: unquote('"\\e90b"');
$icon-file-code: unquote('"\\e90c"');
$icon-js-square: unquote('"\\e90d"');
$icon-expand: unquote('"\\e90e"');
$icon-water: unquote('"\\e90f"');
$icon-php: unquote('"\\e910"');
$icon-hand: unquote('"\\e911"');
$icon-font-awesome-flag: unquote('"\\e912"');
$icon-hand-rock: unquote('"\\e913"');
$icon-universal-access: unquote('"\\e914"');
$icon-hand-scissors: unquote('"\\e915"');
$icon-window-restore: unquote('"\\e916"');
$icon-close: unquote('"\\e917"');


///
/// Styles
$body-padding: 20px;
$general-box-shadow: 0 4px 5px rgba(#000, 0.1);
$general-border-style: solid 2px $accent-2;


///
/// Breakpoints - tested down to 320px
$bp-small-desktop: 1280px;
$bp-tablet: 1024px;
$bp-mobile: 600px;
$bp-small-mobile: 370px;




///
/// Functions/Mixins
/// 

/// Convert a px value to a rem value - basically just for font-size a11y
@function rem($px) {
    @return calc($px / $body-font-size-base) * 1rem;
}

/// Hides content for screen readers/no-styles only
@mixin hidden-a11y() {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(100%);
    white-space: nowrap;
    pointer-events: none;
}

/// Create the text-outline effect
@mixin text-outline($color: #fff) {
    text-shadow: -1px -1px 0 $color,// top-left
                0px -1px 0 $color, // top
                1px -1px 0 $color, // top-right
                -1px 0px 0 $color, // left
                1px 0px 0 $color, // right
                -1px 1px 0 $color, // bottom-left
                0px 1px 0 $color, // bottom
                1px 1px 0 $color; // bottom-right
}

// Create a simple max-width @meda 
@mixin maxBreakpoint ($width) {
    @media (max-width: #{($width - 1px)}) {
        @content;
    }
}

// Create a simple min-width @meda 
@mixin minBreakpoint ($width) {
    @media (min-width: $width) {
        @content;
    }
}

code-view.scss

                                                    @use './variables' as *;

/****
    Contains all of the styles for the code-view
***/
#code-view{
    position: fixed;
    top: 0;
    left: 0;
    transform: translate(0, -100dvh);
    pointer-events: none;
    visibility: hidden;
    
    > div{
        height: 100%;
    }

    [role="tab"]:focus-visible{
        outline-offset: 3px; //helps with a11y - especially for light-mode where the button is already a shade of blue
    }
    

    .code-type-header,
    .file-name {
        @include hidden-a11y; //didn't end up using them, but they can still be helpful
    }

    ///
    /// Main Tabs
    /// 
    // Structure
    #code-view-tabs{
        width: 100dvw;
        height: calc(70dvh - 60px);
        padding: 40px 40px 30px;

        > [role="tablist"]{
            display: inline-flex;
            flex-wrap: wrap;
            padding: 20px 30px;
            background: rgba($light-bg, 0.001);
            backdrop-filter: blur(3px);
            border-radius: 2px;
            border: solid 1px rgba($light-txt, 0.5);
            box-shadow: $general-box-shadow;

            [role="tab"]{
                position: relative;
                margin: 6px 12px 6px 0;
                padding: 6px 10px;
                background: transparent;
                border: solid 2px rgba($accent-2, 0.8);
                border-radius: 3px;
                perspective: 600px;

                font-weight: 600;
                font-size: rem(17);
                line-height: 1;
                overflow: hidden;
                transition: color 0.4s ease 0s;

                &::before,
                &::after{
                    content: '';
                    position: absolute;
                }
                &::before{
                    top: 0;
                    right: 0;
                    bottom: 0;
                    left: 0;
                    background: $accent-2;
                    transform-style: preserve-3d;
                    transform: rotate3d(0, 1, 1, -180deg) scale(0.5);
                    transform-origin: 25% left;
                    opacity: 0;
                    border-radius: 50px;
                    transition: all 0.55s ease 0s, opacity 0.3s ease 0.25s;
                }
                &::after{
                    right: -1px;
                    bottom: -8px;
                    height: 20px;
                    width: 8px;
                    background: $light-bg;
                    transform: translate(0, 12px) rotate(45deg);
                    transition: all 0.33s ease 0s;
                }
                span{
                    position: relative;
                }

                &[aria-selected="true"]{
                    color: $dark-txt;
                    transition-duration: 0.63;

                    &::before{
                        transform: none;
                        transform-origin: 20% 40%;
                        opacity: 1;
                        border-radius: 0;
                        transition: all 0.6s ease 0s, opacity 0.2s ease 0s;
                    }
                    &::after{
                        transform: translate(0, 0) rotate(45deg);
                        transition: all 0.33s ease 0.6s;
                    }
                }
            }
        }
    }
    // Panels
    .code-files.is-hidden,
    .code-file.is-hidden{
        display: none;
    }


    ///
    /// File Tabs
    /// 
    // Structure
    .code-files{
        padding-top: 20px;

        > [role="tablist"] {
            margin-top: 8px;

            [role="tab"] {
                position: relative;
                margin: 0 -1px -1px 0;
                padding: 8px 18px;
                background: transparent;
                backdrop-filter: blur(2px);
                border: solid 1px rgba($light-txt, 0.4);

                font-family: $font-family-3;
                font-size: rem(15);
                line-height: 1.2;
                box-sizing: border-box;
                transition: all 0.4s ease 0s;

                &::before{
                    content: '';
                    position: absolute;
                    top: 100%;
                    right: 0;
                    bottom: 0;
                    left: 0;
                    background: $accent-2;
                    transition: all 0.4s ease 0s;
                }

                span{
                    position: relative;
                }

                &[aria-selected="true"]{
                    color: $light-bg;

                    &::before{
                        top: 0;
                    }
                }
            }
        }
    }

    ///Panels
    .code-files,
    .code-file,
    .code-box,
    .zoom-box{
        height: 100%;
    }
    .code-file {
        padding: 30px;
        border-radius: 0 2px 2px 2px;
        background: rgba($light-bg, 0.02);
        backdrop-filter: blur(3px);
        border: solid 1px rgba($light-txt, 0.5);

    }
    .code-box {
        border: solid 1px rgba($light-txt, 0.2);
        box-sizing: border-box;
    }


    ///
    /// Code Zoom Feature
    .zoom-toggle{
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        background: transparent;
        border: transparent;
        
        border-radius: 100%;
        font-size: rem(14);
        line-height: 1;

        &::before{
            content: '';
            position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            background: rgba($light-bg, 0.2);
            backdrop-filter: blur(2px);
            border: solid 1px rgba($light-txt, 0.2);
            border-radius: 100%;
            transition: all 0.4s ease 0s;
        }

        i{
            position: relative;
        }

        &:hover,
        &:focus-visible{
            &::before {
                transform: scale(1.12);
            }
        }
        &[aria-expanded="true"]{
            i::before{
                content: '\e903';
            }
        }
    }
    .zoom-box{
        position: relative;

        &::after {
            content: '';
            position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            box-shadow: inset 0 0 3px rgba($light-txt, 0.2);
            pointer-events: none;
        }
        &.full-screen{
            position: fixed;
            top: 0;
            left: 0;
            width: 100dvw;
            height: 100dvh;
            z-index: 20;
        }
    }

    &.full-screen-showing {
        z-index: 21;

        .code-file{
            backdrop-filter: none;
        }

        pre {
            height: 100%;
        }

        code {
            min-height: 100%;
        }
    }


    ///
    /// General code styling
    pre {
        max-height: 100%;
        margin: 0;
        overflow: auto;
    }
    code {
        margin-top: -1.7em;
        padding: 30px 30px 40px;
        font-family: monospace;
        font-size: rem(14);
        box-sizing: border-box;
    }
}


///
/// Active animation
/// 
.show-code-view{
    //Setup the transitions
    #code-view{
        transition: all 0.7s ease 0s, z-index 0s ease 0s;
        visibility: visible;
        pointer-events: auto;
    }

    #logo-badge{
        transition: all 0.5s ease 0s;
    }

    #main-content{
        perspective: 1800px;
        pointer-events: none;
    }
    #welcome-panel{
        &::before{
            content: '';
            position: absolute;
            top: 150px;
            right: 8px;
            bottom: 0;
            left: 8px;
            box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1);
            border-radius: 50px;
            transition: all 0.6s ease 0.1s;
        }

        transition: all 0.8s ease 0.2s;
    }


    //Apply the styles
    &.animate{
        #code-view{
            transform: none;
            transition: all 0.7s ease 0.2s, z-index 0s ease 0.8s;
            // z-index: 2;
        }

        #logo-badge{
            transform: translate(-150%, 0);
        }

        #welcome-panel{
            pointer-events: none;
            transform-origin: center 102%;
            transform: rotate3d(1, 0, 0, 11.5deg);
            
            &::before{
                top: 15px;
                right: 15px;
                left: 15px;
                box-shadow: 0 30px 40px rgba(0, 0, 0, 0.69);
                transition: all 0.6s ease 0.2s;
            }
        }
    }
}


///
/// Breakpoints
/// 

// Tablet
@include maxBreakpoint($bp-tablet) {
    .show-code-view{
        &.animate{
            #welcome-panel{
                transform: rotate3d(1, 0, 0, 16deg);
            }
        }
    }
}

// Mobile
@include maxBreakpoint($bp-mobile) {
    #code-view{
        #code-view-tabs{
            padding: 10px 20px 30px;

            > [role="tablist"]{
                margin-right: 75px;
                padding: 18px 20px;

                [role="tab"]{
                    margin: 4px 8px 4px 0;
                    font-size: rem(15);
                }
            }
        }

        .code-files{
            > [role="tablist"]{
                [role="tab"]{
                    padding: 8px 16px;
                    font-size: rem(14);
                }
            }
        }

        .code-file{
            padding: 20px;
        }

        code{
            font-size: rem(13);
        }
    }
    .show-code-view {
        &.animate {
            #welcome-panel {
                transform: rotate3d(1, 0, 0, 24deg);
            }
        }
    }
}

@include maxBreakpoint($bp-small-mobile) {
    #code-view{
        #code-view-tabs{
            height: calc(95dvh - 40px);

            > [role="tablist"]{
                [role="tab"]{
                    font-size: rem(14);
                }
            }
        }

        .code-files{
            max-height: 85%;
            overflow: auto;

            > [role="tablist"]{
                [role="tab"]{
                    padding: 8px 15px;
                    font-size: rem(13);
                }
            }
        }
    }
    .show-code-view {
        &.animate {
            #welcome-panel {
                transform: rotate3d(1, 0, 0, 24deg);
            }
        }
    }
}

features.scss

                                                    @use './variables' as *;

///
/// Contains: Loading Screen, Dark Mode, Reduce Motion
/// 


/****
    Loading Screen
***/
//Animation for the logo-badge shadow animation
@keyframes stickerShadow {
    0% {
        transform: scale(0.33) translate(12%, 20%);
        opacity: 0.82;
        filter: blur(30px);
    }

    80% {
        transform: scale(0.9) translate(0%, 0%);
        opacity: 0.69;
        filter: blur(12px);
    }

    100% {
        transform: scale(0.9) translate(0%, 0%);
        opacity: 0.2;
        filter: blur(4px);
    }
}
//Animation for the logo-badge animation
@keyframes placeSticker {
    from {
        transform: perspective(800px) rotateX(80deg) rotateY(-50deg) scale(1.23);
        // box-shadow: $general-box-shadow;
    }

    to {
        transform: perspective(800px) rotateX(0deg) rotateY(0deg) scale(1);
        // box-shadow: $general-box-shadow;
    }
}

.loading-screen.full-motion {
    /// Setup the transitions, and any base styles - if needed this can stagger out so we apply the transitions after the base-styles so we don't see animations ahead of time
    #menu-toggle {
        transform: translate(20vw, 0);
        transition: all 0.5s ease 0s;
    }
    #menu-panel {
        opacity: 0;
    }
    #logo-badge {
        opacity: 0;
        transition: opacity 0.2s ease 0s;

        >div {
            box-shadow: 0 0 transparent;
            backface-visibility: hidden;
            transform-origin: top left;
            transform: perspective(800px) rotateX(80deg) rotateY(-50deg) scale(1.23);
        }

        h1 {
            strong span {
                clip-path: inset(0 105% 0 0);
                transition: all 0.9s ease 0s;
            }
        }
    }

    #welcome-panel{
        .bg-image{
            transform: scale(0.6) translate(0, 120dvh);
            transition: all 1s ease 0s;
        }

        .title{
            clip-path: inset(0 100% 0 0);
            transition: all 0.85s ease 0s;
        }
        .title-shadow {
            opacity: 0;
            transition: all 0.9s ease 0s;
        }
    }


    ///
    /// Stage 1 - header elements show
    &.stage-1 {
        #menu-toggle {
            transform: none;
            transition-delay: 0.75s;
        }
        #menu-panel {
            opacity: 1;
        }

        #logo-badge {
            opacity: 1;

            &::before {
                animation: stickerShadow 0.64s ease-out forwards;
            }

            >div {
                box-shadow: $general-box-shadow;
                animation: placeSticker 0.7s ease-out forwards;
                transition-delay: 0.4s;
            }

            h1 {
                strong span {
                    clip-path: inset(-30px -30px);
                    transition-delay: 0.85s;
                }
            }
        }
    }

    ///
    /// Stage 2 - welcome message shows, and background fills the window
    &.stage-2{
        #welcome-panel {
            .bg-image {
                transform: scale(1);
                transition-delay: 0.25s;
            }

            .title {
                clip-path: inset(-10px);
            }
            .title-shadow{
                opacity: 1;
                transition-delay: 0.3s;
            }
        }
    }
}



/****
    Dark Mode
***/ 
.dark-mode{
    &,
    body{
        background: #424242;
        color: $dark-txt;
    }
    .page-bg{
        opacity: 0;
        z-index: -1;
        
        &.for-dark-mode{
            opacity: 0.07;
            z-index: 0;
        }
    }

    ///
    /// Header
    #logo-badge{
        > div{
            background: $dark-bg;
            color: $dark-txt;
        }

        h1{
            strong.main-name::before{
                background: $accent-2;
            }
        }
    }


    ///
    /// Menu
    #menu-toggle{
        &::before{
            background: $dark-bg;
        }
        .control-icon span{
            background: $dark-txt;
        }
    }

    #main-menu-panel{
        background: $dark-bg;

        a,
        button{
            color: $dark-txt;
        }

        button{
            &.motion-toggle i::after{
                background: $dark-txt;
            }
        }
        a{
            &.linkedin-link{
                color: $dark-txt;
            }
        }
    }


    ///
    /// Welcome Panel
    #welcome-panel{
        .bg-image{
            background: #000;
        }
        .title{
            color: $dark-txt;
            @include text-outline(#000);
        }
        .statement{
            background: $dark-bg;
            color: $dark-txt;
        }
    }


    ///
    /// Portfolio Panel
    #portfolio-work{
        .project{
            .project-card{
                border-color: $dark-bg;
                background: $dark-bg;
            }
            
            a{
                color: $dark-txt;
            }
            .project-role strong{
                color: $accent-1;
            }

            .project-award{
                &::before{
                    color: $accent-1;
                }
            }
        }
    }


    ///
    /// Footer
    #main-footer{
        background: $dark-bg;
    }

    #site-stack {
        p {
            transition: color 0.5s ease 0s;

            &.icon-php {
                color: #B0B3D6;
            }

            // &.icon-html5 {
            //     color: #F16529;
            // }

            // &.icon-sass {
            //     font-size: rem(26);
            //     color: #CD669A;
            // }

            &.icon-js-square {
                color: #F0DB4F;
            }

            // &.icon-font-awesome-flag {
            //     color: #538DD7;
            // }

            &.icon-universal-access {
                color: #F9F9F9;
            }

            &.icon-ghost {
                color: #ABABAB;
            }
        }
    }


    ///
    /// Code View
    /// 
    #code-view{
        #code-view-tabs {
            >[role="tablist"] {
                background: rgba($dark-bg, 0.008);
        
                [role="tab"] {
                    background: transparent;
                    border-color: rgba($dark-bg, 0.8);
                    color: $dark-txt;

                    &::before{
                        background: $dark-bg;
                    }
                    &::after {
                        background: $dark-txt;
                    }

                    &[aria-selected="true"] {
                    }
                }
            }

            .zoom-toggle{
                color: $dark-txt;
            }
        }

        .code-files {
            > [role="tablist"] {
                [role="tab"] {
                    border-color: rgba($dark-bg, 0.7);
                    color: $dark-txt;

                    &::before {
                        background: $dark-bg;
                    }

                    &[aria-selected="true"] {
                        
                    }
                }
            }
        }
        .code-file{
            background: rgba($dark-bg, 0.015);
            border-color: rgba($dark-bg, 0.7)
        }

    }


    ///
    /// Breakpoints
    @include maxBreakpoint($bp-tablet) {
        #main-menu-panel {
            a,
            button {
                .label{
                    color: $dark-txt;
                }
            }
        }
    }
}


/****
    Reduced Motion Mode
***/
.reduce-motion{
    .page-bg{
        display: none;
    }


    /// 
    /// Profile
    #welcome-panel{
        margin-bottom: 80px;

        .title-shadow{
            transform: translate(calc(-50% - 10px), calc(-50% + 10px)) !important;
        }
        .statement{
            margin-top: -70px;
        }
    }

    #portfolio-work{
        display: flex;
        flex-wrap: wrap;
        margin: 0 80px;
        padding-top: 0;
        padding-bottom: 60px;

        .project{
            width: calc(50% - 40px);
            margin: 0 20px;
            padding: 0 0 40px;
            transform: none !important;
            
            .project-card{
                max-height: auto;
                height: auto;
                aspect-ratio: unset;
                transform: none !important;

                .project-image{
                    max-height: 420px;
                    aspect-ratio: 7/5;
                }
            }
        }
    }


    ///
    /// Code View
    #code-view{
        #code-view-tabs{
            > [role="tablist"]{

                [role="tab"]{
                    &::before{
                        border-radius: 0;
                        transform: none !important;
                    }
                }
            }
        }

        .code-files > [role="tablist"]{
            [role="tab"]{
                &::before{
                    top: 0;
                    opacity: 0;
                }

                &[aria-selected="true"]::before{
                    opacity: 1;
                }
            }
        }
    }
    &.show-code-view{
        #code-view{
            transition: all 0.3s ease 0s !important;
        }
        #main-content{
            transition: all 0.3s ease 0s;
        }
        #welcome-panel{
            transform: none;
        }

        &.animate{
            #main-content{
                padding-top: 85dvh;
            }
        }
    }


    ///
    /// Breakpoints
    /// 

    // Small Desktop
    @include minBreakpoint($bp-small-desktop) {
        #portfolio-work{
            .project {
                width: calc(33.333% - 40px);
            }
        }
    }

    // Mobile
    @include maxBreakpoint($bp-mobile) {
        #portfolio-work {
            .project {
                width: 100%;
                margin: 0;
                padding-bottom: 10px;

                .project-award{
                    position: relative;
                    right: auto;
                    bottom: auto;
                }
            }
        }
    }
}

header.scss

                                                    @use './variables' as *;

///
/// Main Header
/// 
#main-header{
    display: flex;
    justify-content: space-between;
    align-items: center;
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    padding: 30px;
    background: transparent;

    > section{
        z-index: 10;
    }
}



///
/// Logo
/// 
#logo-badge{
    position: relative;
    
    &::before {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background: rgba(0, 0, 0, 0.2);
        filter: blur(16px);
        opacity: 0.8;
        transform: scale(0.33) translate(20%, 20%);
        transform-origin: top left;
        pointer-events: none;
    }
    > div{
        position: relative;
        padding: 29px 30px;
        background: $light-bg;
        box-shadow: 0 0 transparent;
        color: $light-txt;
        border-radius: 2px;
        box-shadow: $general-box-shadow;
        transition: box-shadow 0.45s ease 0s, background 0.4s ease 0s;
    }

    h1{
        margin: 0;
        font-family: $font-family-3;
        font-size: rem(32);
        font-weight: 400;
        line-height: 1;
        transition: color 0.4s ease 0s;
        
        strong{
            position: relative;
            font-family: $font-family-4;
            font-size: rem(42);
            font-weight: 400;
            
            &.main-name{

                &::before{
                    content: '';
                    position: absolute;
                    right: 5px;
                    bottom: 11px;
                    left: 3px;
                    height: 2px;
                    background: $accent-1;
                    transform: skew(10px);
                    transition: background 0.4s ease 0s;
                }

                span{
                    position: relative;
                }
            }
            &.sticky-name{
                display: none;
            }
        }
    }
}



///
/// Main Menu
/// 

//Main Container
#main-menu{
    position: relative;
}

//Menu Open Trigger
#menu-toggle{
    position: relative;
    width: 69px;
    height: 69px;
    background: transparent;
    border: none;
    border-radius: 2px; //leaving this here for focus states
    z-index: 1;
    transition: all 0.4s ease 0s;
    
    &::before{
        content: '';
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        background: $light-bg;
        border-radius: 2px;
        box-shadow: $general-box-shadow;
        transition: all 0.4s ease 0s;
    }

    .control-icon{
        display: inline-block;
        position: relative;
        // width: 30px;
        // height: 25px;

        span{
            display: block;
            width: 30px;
            height: 4px;
            margin: 3px 0;
            border-radius: 10px;
            background: $light-txt;
            transition: all 0.4s ease 0s;

            &.bar-1,
            &.bar-3{
                width: 20px;
                margin-left: auto;
            }
        }
    }
    
    &:hover,
    &:focus-visible,
    &[aria-expanded="true"]{
        &::before{
            box-shadow: -0.7px 3.94px 5px rgba(#000, 0.1); //based on -10deg or rotation
            transform: rotate(-10deg) scale(1.01);
        }

        .control-icon{
            span{
                &.bar-1,
                &.bar-3{
                    width: 30px;
                }
                &.bar-2,
                &.bar-4{
                    width: 20px;
                }
            }
        }
    }

    &[aria-expanded="true"]{
        transform: scale(0.7);
        transition-delay: 0.25s;

        &::before{
            box-shadow: -4px 0 5px rgba(#000, 0.1);
            transform: rotate(-90deg) scale(1.01);
        }
    }
}

// Menu Panel
$menu-offset: 60vw;
#main-menu-panel{
    display: flex;
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    padding: 4px 16px 4px 18px;
    background: $light-bg;
    border-radius: 2px;
    box-shadow: $general-box-shadow;
    transform: translate($menu-offset, 0);
    transition: background-color 0.4s ease 0s;
    z-index: 0;

    animation: menu-slide-out 0.8s forwards;
    

    @keyframes menu-slide-in {
            0% {
                transform: translate($menu-offset, 0);
                z-index: 0;
            }
    
            50% {
                transform: translate(-75px, 0);
                z-index: 0;
            }
    
            51% {
                transform: translate(-75px, 0);
                z-index: 2;
            }
    
            100% {
                transform: translate(0, 0);
                z-index: 2;
            }
    }

    @keyframes menu-slide-out {
        0% {
            transform: translate(0, 0);
            z-index: 2;
        }

        25% {
            transform: translate(-75px, 0);
            z-index: 2;
        }

        26% {
            transform: translate(-75px, 0);
            z-index: 0;
        }

        100% {
            transform: translate($menu-offset, 0);
            z-index: 0;
        }
    }

    &.hidden{ //this hides it while the slide-out animation is applied
        visibility: hidden;
    }

    /// Visible State
    &[aria-hidden="false"]{
        animation: menu-slide-in 0.8s forwards;

        ul::after{
            clip-path: inset(0);
            transition-delay: 0.6s;
        }
    }

    ul{
        display: flex;
        align-items: center;
        position: relative;
        height: 100%;
        margin: 0;
        padding: 0 30px 0 0;
        list-style: none;

        &::after{
            content: '';
            position: absolute;
            top: calc(50% - 10px);
            right: 13px;
            width: 1px;
            height: 21px;
            background: #bbb;
            clip-path: inset(50% 0);
            transition: all 0.4s ease 0s;
        }
        > li{
            padding: 0 9px;
        }
    }

    ///
    /// Menu Items
    button,
    a{
        display: flex;
        align-items: center;
        justify-content: center;
        position: relative;
        min-height: 32px;
        padding: 0;
        background: transparent;
        border: none;

        font-size: rem(28);
        text-decoration: none;
        color: $light-txt;
        transition: color 0.4s ease 0s;

        i{
            transition: transform 0.4s ease 0s;
        }

        .label{
            display: block;
            position: absolute;
            top: calc(100% + 10px);
            padding: 4px 10px;
            background: #f1f1f1;
            border-radius: 4px;

            font-family: $font-family-1;
            font-size: rem(13) !important;
            color: #000;
            letter-spacing: 0.45px;
            line-height: 1;
            pointer-events: none;
            white-space: nowrap;
            word-break: break-word;

            opacity: 0;
            transform: translate(0, -11px);
            transition: all 0.4s ease 0s;

            &::before{
                content: '';
                position: absolute;
                left: calc(50% - 9px);
                bottom: calc(100% - 4px);
                width: 0px;
                height: 0px;
                border-style: solid;
                border-width: 0 9px 0 9px;
                border-color: transparent transparent #f1f1f1 transparent;
                transform: rotate(0deg);
                transition: all 0.4s ease 0s;
            }
        }

        &:hover,
        &:focus-visible{
            color: $accent-2;

            .label{
                transform: none;
                opacity: 1;

                &::before{
                    border-width: 0 9px 10px 9px;
                }
            }
        }
    }

    // Menu Toggles
    button{
        i,
        i::before{
            transition: all 0.84s ease 0s;
        }
        i::before{
            display: inline-block;
        }
        .toggle-icon{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            opacity: 0;

        }

        &.dark-mode-toggle{
            font-size: rem(25);

            i{
                display: block;
                clip-path: inset(-2px);
            }

            &.dark-mode{
                i{
                    opacity: 0;
                }
                .toggle-icon{
                    opacity: 1;
                }
            }

            &:hover,
            &:focus-visible{
                i{
                    color: $accent-1;

                    &::before{
                        transform: translate(0, 50%);
                        transition-duration: 1.1s;
                    }
                }
                &.dark-mode{
                    i{
                        color: $dark-txt;
                    }
                }
            }
        }
        &.motion-toggle{
            @keyframes shake {
                10%,
                90% {
                    transform: translate3d(-0.8%, 0, 0);
                    /* Move slightly left */
                }
        
                20%,
                80% {
                    transform: translate3d(1.75%, 0, 0);
                    /* Move slightly right */
                }
        
                30%,
                50%,
                70% {
                    transform: translate3d(-1%, 0, 0);
                    /* Move further left */
                }
        
                40%,
                60% {
                    transform: translate3d(2.5%, 0, 0);
                    /* Move further right */
                }
            }

            i{
                position: relative;

                &::after{
                    content: '';
                    position: absolute;
                    top: -4px;
                    bottom: -4px;
                    left: 50%;
                    width: 3px;
                    background: $light-txt;
                    opacity: 1;
                    transform: rotate(-45deg);
                    clip-path: inset(0);
                    transition: all 0.4s ease 0s;
                }
            }
            &.animate-mode{
                i::after{
                    clip-path: inset(50% 0);
                }
            }

            &:hover,
            &:focus-visible{
                i::before{
                    animation: shake 0.82s cubic-bezier(.36, .07, .19, .97) both;
                    transform: translate3d(0, 0, 0);
                    /* Improves performance by promoting element to its own layer */
                    backface-visibility: hidden;
                    /* Prevents a slight flicker at the end in some browsers */
                    perspective: 1000px;
                    /* Needed for backface-visibility to work */
                }
            }
        }
        &.code-view-toggle{
            &:hover,
            &:focus-visible{
                i:not(.toggle-icon){
                    transform: scale(1.05) translate(2px, 4px) rotate(3deg);
                }
                .toggle-icon{
                    transform: scale(1.05) translate(-51%, -55%) rotate(-3deg)
                }
            }
            &[aria-expanded="true"] {
                i {
                    opacity: 0;
                }
        
                .toggle-icon {
                    opacity: 1;
                }
            }
        }
    }

    // Menu Links
    a{
        &.linkedin-link{
            font-size: rem(31);

            &:hover,
            &:focus-visible{
                color: #0077B5;

                i{
                    transform: scale(1.04) rotate(2.5deg);
                }
            }
        }
        &.em-link,
        &.resume-link{
            &:hover,
            &:focus-visible{
                i{
                    transform: scale(1.05) translate(0, -3px);
                }
            }
        }
    }

    /// Close Trigger
    .close-trigger{
        font-size: rem(25);
        line-height: 1;
    }
}



///
/// Breakpoints for everything above
/// 

/// Tablet
@include maxBreakpoint($bp-tablet) {
    #logo-badge{
        > div{
            padding: 27px 30px 36px;
        }
        .label{
            font-size: rem(28);
        }
        .main-name{
            font-size: rem(37);
        }
    }

    $mobile-menu-offset: -110vh;
    #main-menu-panel{
        //panel
        top: 0;
        right: 0;
        bottom: auto;
        left: 0;
        flex-direction: column;
        padding: 15px 4px 10px;
        transform: translate(0, $mobile-menu-offset);
        animation: mobile-menu-slide-out 0.8s forwards;


        @keyframes mobile-menu-slide-in {
            0% {
                transform: translate(0, $mobile-menu-offset);
                z-index: 0;
            }

            50% {
                transform: translate(0, 75px);
                z-index: 0;
            }

            51% {
                transform: translate(0, 75px);
                z-index: 2;
            }

            100% {
                transform: translate(0, 0);
                z-index: 2;
            }
        }

        @keyframes mobile-menu-slide-out {
            0% {
                transform: translate(0, 0);
                z-index: 2;
            }

            25% {
                transform: translate(0, 75px);
                z-index: 2;
            }

            26% {
                transform: translate(0, 75px);
                z-index: 0;
            }

            100% {
                transform: translate(0, $mobile-menu-offset);
                z-index: 0;
            }
        }

        &::after {
            content: '';
            position: absolute;
            top: 59px;
            right: calc(50% - 10px);
            width: 20px;
            height: 1px;
            background: #bbb;
            clip-path: inset(0 50%);
            transition: all 0.4s ease 0s;
        }

        &[aria-hidden="false"] {
            animation: mobile-menu-slide-in 0.8s forwards;

            &::after{
                clip-path: inset(0);
                transition-delay: 0.6s;
            }
        }

        ul {
            order: 2;
            flex-direction: column;
            width: 100%;
            height: auto;
            max-height: calc(100dvh - 180px);
            margin-top: -9px;
            padding: 0;
            overflow: auto;

            &::after {
                display: none;
            }

            > li {
                margin: 9px 0;
                padding: 0;
            }
        }

        button,
        a {
            flex-direction: column;
            font-size: rem(28);

            i{
                font-size: rem(22);
            }
            .label {
                position: relative;
                top: 0;
                padding: 4px 0 0;
                background: transparent;
                font-size: rem(12) !important;
                letter-spacing: 0.3px;
                color: $light-txt;
                white-space: normal;
                transform: none;
                opacity: 1;

                &::before{
                    display: none;
                }
            }
        }

        button{
            .toggle-icon{
                top: 0;
                transform: translate(-50%, 0);
            }
        }

        .close-trigger {
            margin-bottom: 28px;
            order: 1;
            font-size: rem(20);
            transform: rotate(-90deg);

            i{
                font-size: inherit;
            }
        }
    }
}

///Mobile
@include maxBreakpoint($bp-mobile) {
    #logo-badge {
        > div {
            padding: 13px 22px 16px;
        }

        h1{
            display: flex;
            align-items: center;

            strong.main-name {
                font-size: rem(21);
        
                &::before {
                    bottom: 1px;
                }
            }
        }

        .label {
            margin-right: 4px;
            font-size: rem(14);
        }
    }


    #menu-toggle {
        width: 50px;
        height: 50px;

        .control-icon {
            display: inline-block;
            position: relative;

            span {
                width: 27px;
                height: 3px;
                // margin: 3px 0;

                &.bar-1,
                &.bar-3 {
                    width: 17px;
                }
            }
        }

        &:hover,
        &:focus-visible,
        &[aria-expanded="true"] {
            .control-icon {
                span {

                    &.bar-1,
                    &.bar-3 {
                        width: 27px;
                    }

                    &.bar-2,
                    &.bar-4 {
                        width: 17px;
                    }
                }
            }
        }
    }

    #main-menu-panel{
        right: -4px;
        left: -4px;

        ul{

            a,
            button{
                i{
                    font-size: rem(18);
                }
            }
        }

        .close-trigger{
            font-size: rem(19);
        }
    }
}

@include maxBreakpoint($bp-small-mobile) {
    #main-header{
        padding: 20px;
    }

    #logo-badge {
        h1 {
            strong.main-name {
                font-size: rem(18);

                &::before {
                    bottom: 1px;
                }
            }
        }

        .label {
            margin-right: 4px;
            font-size: rem(13);
        }
    }

    #main-menu-panel{
        button,
        a {
            font-size: rem(20);
    
            i {
                font-size: rem(18);
            }
        }
    }
}

profile.scss

                                                    @use './variables' as *;

/****
    Contains all of the styles for the page
***/
@keyframes fade-in-body { // used below in body{}
    0%,
    50% {
        opacity: 0;
    }
    100% {
        opacity: 1;
    }
}
body{
    position: relative;
    
    //this is a hacky kind of attempt to hide content while the body loads - rather than using JS and removing a class this should have less points of failure and minimal impact
    opacity: 0;
    animation: fade-in-body 0.3s ease-out 0.2s forwards;
}
#main-content{
    overflow: hidden;
}

///
/// Main Page Background - there are a light and dark version of this
.page-bg{
    position: fixed;
    top: 0;
    left: 0;
    width: calc(100% + 90px);
    max-width: none;
    height: calc(100% + 190px);
    object-fit: cover;
    object-position: center;
    opacity: 0.08;
    z-index: 0;
    transition: opacity 0.4s ease 0s;
    
    &.for-dark-mode{
        opacity: 0;
        z-index: -1;
    }
}


///
/// Welcome Message
#welcome-panel{
    position: relative;
    padding-top: 100dvh;
    margin-bottom: 20dvh;

    // Welcome Image
    .bg-image{
        position: absolute;
        top: 0;
        left: 0;
        height: calc(100dvh - 20px);
        width: calc(100dvw - 20px);
        margin: 10px;
        overflow: hidden;
        background-color: rgba(83, 57, 57, 0.12);
        pointer-events: none;

        &::after{
            content: '';
            position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            // background: rgba(0,0,0,0.5);
            background: linear-gradient(to bottom, rgba($dark-bg, 0) 0%, rgba($dark-bg, 0) 22%, rgba($dark-bg, 0.85) 50%, rgba($dark-bg, 0.05) 85%, rgba($dark-bg, 0.05) 100%);
            opacity: 0.1;
        }
        img{
            width: 100%;
            height: 100%;
            object-fit: cover;
            object-position: center;
            mix-blend-mode: screen;
        }
    }

    // Welcome Title
    .title-box{
        position: absolute;
        top: 50dvh;
        left: 50%;
        transform: translateX(-50%);
    }
    .title,
    .title-shadow{
        position: relative;
        margin: 0;
        font-family: $font-family-2;
        font-weight: 400;
        font-size: rem(90);
        line-height: 1;
        color: $light-txt;
        @include text-outline;

    }
    .title-shadow{ //this adds some fun to the welcome header
        position: absolute;
        top: 50%;
        left: 50%;
        // background: linear-gradient(45deg, $accent-1, $dark-bg, $accent-2); - for even more fun haha
        background: #0f0f0f;
        font-size: em(1.3);
        text-shadow: none;
        white-space: nowrap;
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;

        opacity: 0.2;
        transform: translate(-50%, -50%);
        pointer-events: none;
    }

    // Welcome Statement
    .statement{
        position: relative;
        max-width: 1000px;
        width: 60%;
        margin: 0 auto;
        padding: 42px 45px;
        border-radius: 8px;
        background: $light-bg;
        box-shadow: $general-box-shadow;

        font-size: rem(22);
        line-height: 1.25;
        letter-spacing: 0.3px;

        > *{
            // color: inherit;
        }
    }
}


///
/// Portfolio Work
#portfolio-work{
    padding-top: 20px;
    margin: 0 20vw 130px;
    padding-bottom: 200px;

    // Trying to control the UI layers
    .pin-spacer,
    .project{
        pointer-events: none; //the .project-card gets the focus
    }

    ///
    /// Project Cards
    .project{
        position: relative;
        padding: 60px 0;
        margin: 0 auto;
        max-width: 900px;

        h2,
        p,
        span {
            margin: 0;
        }
        
        .project-card{
            position: relative;
            max-width: 100%;
            margin-right: auto;
            margin-left: auto;
            background: $light-bg;
            border: solid 35px $light-bg;
            box-shadow: 1px 4px 5px rgba($light-txt, 0.1);
            transition: border 0.4s ease 0s, background-color 0.4s ease 0s;
            pointer-events: auto;
        }
        
        .project-link {
            display: block;
            height: 100%;
            line-height: 0;
            color: $light-txt;
            text-decoration: none;
            transition: color 0.4s ease 0s;

            &:hover,
            &:focus-visible {
                .project-image img {
                    transform: scale(1.25);
                    filter: grayscale(0);
                    transition: transform 15s ease 0s, filter 2s ease 0s;
                }
            }
        }

        .project-image {
            position: relative;
            margin: 0;
            width: 100%;
            max-height: 70vh;
            aspect-ratio: 7/5;
            background: $light-bg;
            padding: 3px;
            overflow: hidden;

            &::after {
                content: '';
                position: absolute;
                top: 0;
                right: 0;
                bottom: 0;
                left: 0;
                box-shadow: inset 0 0 3px rgba($light-txt, 0.2);
            }

            img {
                width: 100%;
                height: 100%;
                object-fit: cover;
                object-position: center;
                filter: grayscale(0.6);
                transition: transform 2s ease 0s, filter 1s ease 0s;
            }
        }

        .project-info{
            padding: 20px 0 35px;
            line-height: 1.1;
        }

        .project-title{
            font-family: $font-family-4;
            letter-spacing: 1px;
        }

        .project-location{
            margin-top: 2px;
        }

        .project-role {
            margin-top: 8px;
            font-size: rem(13);
            font-weight: 600;
            
            strong{
                color: $accent-2;
                letter-spacing: 0.6px;
                transition: color 0.4s ease 0s;
            }
            span{
                font-weight: 400;
                letter-spacing: 0.4px;
            }
        }

        .project-award{
            display: flex;
            align-items: center;
            justify-content: center;
            position: absolute;
            bottom: 10px;
            right: 5px;
            width: 40px;
            height: 40px;
            text-decoration: none;
            transform: rotate(13deg);

            &::before{
                content: '\e900';
                display: block;
                font-family: $icon-family;
                font-size: 26px;
                color: #EFBF04;
                text-shadow: 1px 1px #00000042;
                opacity: 0.8;
                transition: all 0.4s ease 0s;
            }

            &:hover,
            &:focus-visible{
                &::before{
                    transform: scale(1.2) rotate(5deg);
                }
            }
        }
    }
}


///
/// Breakpoints for everything above
/// 

// Small Desktop
@include maxBreakpoint($bp-small-desktop) {
    #welcome-panel {
        margin-bottom: 17dvh;
    }

    #portfolio-work {
        padding-top: 30px;
    }
}

// Tablet
@include maxBreakpoint($bp-tablet) {
    #welcome-panel{
        margin-bottom: 12dvh;

        .title,
        .title-shadow{
            font-size: rem(69);
        }

        .statement {
            padding: 30px 35px;
            font-size: rem(16);
        }
    }

    #portfolio-work{
        margin: 0 10vw 100px;
        padding-top: 0;
        padding-bottom: 150px;
    
        .project{
            .project-card{
                height: auto;
                aspect-ratio: unset;
            }

            .project-image{
                max-height: 60dvh;
            }
        }
    }
}

// Mobile
.is-mobile-device {

    //captures iOS and Android devices specifically
    #portfolio-work {
        .project {
            .project-image {
                img {
                    filter: none;
                }
            }

            .zoom-box {
                display: flex;
                width: 100%; //weird fix for iOS
            }
        }
    }
}

@include maxBreakpoint($bp-mobile) {
    #welcome-panel {
        margin-bottom: 10dvh;

        .title,
        .title-shadow {
            font-size: rem(46);
        }

        .statement {
            width: 90%;
            padding: 22px 33px;
            font-size: rem(15);
            line-height: 1.4;
        }
    }

    #portfolio-work{
        margin: 0 8dvw 20px;
        padding-top: 0;
        padding-bottom: 30px;

        .project{
            .project-card{
                border-width: 26px;
            }

            .project-image{
                max-height: 40dvh;
            }

            .project-info{
                padding-bottom: 20px;
            }

            .project-title{
                font-size: 19px;
                font-weight: 400;
            }
            .project-location{
                font-size: rem(14);
            }

            .project-award{
                margin-left: auto;
            }
        }
    }
}

@include maxBreakpoint($bp-small-mobile) {
    #welcome-panel{
        .statement{
            font-size: rem(13);
        }
    }
}

CSS

main.css

                                                    /******
    This contains global variables/mixins/etc.
***/
html,
body {
  overflow-x: hidden;
}

html {
  background: #fff;
  font-family: "Lato", sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
html.prevent-scrolling {
  overflow: hidden;
}
html.forced-prevent-scrolling {
  overflow: hidden !important;
}

body {
  margin: 0;
  font-size: 1rem;
  line-height: 1.3;
  color: #131313;
}

section,
div {
  box-sizing: border-box;
}

button {
  color: #131313;
  cursor: pointer;
}

.for-a11y {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(100%);
  white-space: nowrap;
  pointer-events: none;
}

img,
figure {
  max-width: 100%;
  height: auto;
}

.skip-to-main {
  position: absolute;
  left: -200vw;
  top: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
  z-index: 30;
}
.skip-to-main:focus {
  left: 20px;
  top: 20px;
  width: auto;
  height: auto;
  padding: 20px;
  background: #FBFBFB;
  font-size: 1.0625rem;
  color: #131313;
}

/****
    Contains all of the styles for the page
***/
@keyframes fade-in-body {
  0%, 50% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
body {
  position: relative;
  opacity: 0;
  animation: fade-in-body 0.3s ease-out 0.2s forwards;
}

#main-content {
  overflow: hidden;
}

.page-bg {
  position: fixed;
  top: 0;
  left: 0;
  width: calc(100% + 90px);
  max-width: none;
  height: calc(100% + 190px);
  object-fit: cover;
  object-position: center;
  opacity: 0.08;
  z-index: 0;
  transition: opacity 0.4s ease 0s;
}
.page-bg.for-dark-mode {
  opacity: 0;
  z-index: -1;
}

#welcome-panel {
  position: relative;
  padding-top: 100dvh;
  margin-bottom: 20dvh;
}
#welcome-panel .bg-image {
  position: absolute;
  top: 0;
  left: 0;
  height: calc(100dvh - 20px);
  width: calc(100dvw - 20px);
  margin: 10px;
  overflow: hidden;
  background-color: rgba(83, 57, 57, 0.12);
  pointer-events: none;
}
#welcome-panel .bg-image::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: linear-gradient(to bottom, rgba(31, 31, 31, 0) 0%, rgba(31, 31, 31, 0) 22%, rgba(31, 31, 31, 0.85) 50%, rgba(31, 31, 31, 0.05) 85%, rgba(31, 31, 31, 0.05) 100%);
  opacity: 0.1;
}
#welcome-panel .bg-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  mix-blend-mode: screen;
}
#welcome-panel .title-box {
  position: absolute;
  top: 50dvh;
  left: 50%;
  transform: translateX(-50%);
}
#welcome-panel .title,
#welcome-panel .title-shadow {
  position: relative;
  margin: 0;
  font-family: "Pacifico", cursive;
  font-weight: 400;
  font-size: 5.625rem;
  line-height: 1;
  color: #131313;
  text-shadow: -1px -1px 0 #fff, 0px -1px 0 #fff, 1px -1px 0 #fff, -1px 0px 0 #fff, 1px 0px 0 #fff, -1px 1px 0 #fff, 0px 1px 0 #fff, 1px 1px 0 #fff;
}
#welcome-panel .title-shadow {
  position: absolute;
  top: 50%;
  left: 50%;
  background: #0f0f0f;
  font-size: em(1.3);
  text-shadow: none;
  white-space: nowrap;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  opacity: 0.2;
  transform: translate(-50%, -50%);
  pointer-events: none;
}
#welcome-panel .statement {
  position: relative;
  max-width: 1000px;
  width: 60%;
  margin: 0 auto;
  padding: 42px 45px;
  border-radius: 8px;
  background: #FBFBFB;
  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.1);
  font-size: 1.375rem;
  line-height: 1.25;
  letter-spacing: 0.3px;
}
#portfolio-work {
  padding-top: 20px;
  margin: 0 20vw 130px;
  padding-bottom: 200px;
}
#portfolio-work .pin-spacer,
#portfolio-work .project {
  pointer-events: none;
}
#portfolio-work .project {
  position: relative;
  padding: 60px 0;
  margin: 0 auto;
  max-width: 900px;
}
#portfolio-work .project h2,
#portfolio-work .project p,
#portfolio-work .project span {
  margin: 0;
}
#portfolio-work .project .project-card {
  position: relative;
  max-width: 100%;
  margin-right: auto;
  margin-left: auto;
  background: #FBFBFB;
  border: solid 35px #FBFBFB;
  box-shadow: 1px 4px 5px rgba(19, 19, 19, 0.1);
  transition: border 0.4s ease 0s, background-color 0.4s ease 0s;
  pointer-events: auto;
}
#portfolio-work .project .project-link {
  display: block;
  height: 100%;
  line-height: 0;
  color: #131313;
  text-decoration: none;
  transition: color 0.4s ease 0s;
}
#portfolio-work .project .project-link:hover .project-image img, #portfolio-work .project .project-link:focus-visible .project-image img {
  transform: scale(1.25);
  filter: grayscale(0);
  transition: transform 15s ease 0s, filter 2s ease 0s;
}
#portfolio-work .project .project-image {
  position: relative;
  margin: 0;
  width: 100%;
  max-height: 70vh;
  aspect-ratio: 7/5;
  background: #FBFBFB;
  padding: 3px;
  overflow: hidden;
}
#portfolio-work .project .project-image::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  box-shadow: inset 0 0 3px rgba(19, 19, 19, 0.2);
}
#portfolio-work .project .project-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  filter: grayscale(0.6);
  transition: transform 2s ease 0s, filter 1s ease 0s;
}
#portfolio-work .project .project-info {
  padding: 20px 0 35px;
  line-height: 1.1;
}
#portfolio-work .project .project-title {
  font-family: "Permanent Marker", cursive;
  letter-spacing: 1px;
}
#portfolio-work .project .project-location {
  margin-top: 2px;
}
#portfolio-work .project .project-role {
  margin-top: 8px;
  font-size: 0.8125rem;
  font-weight: 600;
}
#portfolio-work .project .project-role strong {
  color: #007A8E;
  letter-spacing: 0.6px;
  transition: color 0.4s ease 0s;
}
#portfolio-work .project .project-role span {
  font-weight: 400;
  letter-spacing: 0.4px;
}
#portfolio-work .project .project-award {
  display: flex;
  align-items: center;
  justify-content: center;
  position: absolute;
  bottom: 10px;
  right: 5px;
  width: 40px;
  height: 40px;
  text-decoration: none;
  transform: rotate(13deg);
}
#portfolio-work .project .project-award::before {
  content: "\e900";
  display: block;
  font-family: "jk-icons";
  font-size: 26px;
  color: #EFBF04;
  text-shadow: 1px 1px rgba(0, 0, 0, 0.2588235294);
  opacity: 0.8;
  transition: all 0.4s ease 0s;
}
#portfolio-work .project .project-award:hover::before, #portfolio-work .project .project-award:focus-visible::before {
  transform: scale(1.2) rotate(5deg);
}

@media (max-width: 1279px) {
  #welcome-panel {
    margin-bottom: 17dvh;
  }
  #portfolio-work {
    padding-top: 30px;
  }
}
@media (max-width: 1023px) {
  #welcome-panel {
    margin-bottom: 12dvh;
  }
  #welcome-panel .title,
  #welcome-panel .title-shadow {
    font-size: 4.3125rem;
  }
  #welcome-panel .statement {
    padding: 30px 35px;
    font-size: 1rem;
  }
  #portfolio-work {
    margin: 0 10vw 100px;
    padding-top: 0;
    padding-bottom: 150px;
  }
  #portfolio-work .project .project-card {
    height: auto;
    aspect-ratio: unset;
  }
  #portfolio-work .project .project-image {
    max-height: 60dvh;
  }
}
.is-mobile-device #portfolio-work .project .project-image img {
  filter: none;
}
.is-mobile-device #portfolio-work .project .zoom-box {
  display: flex;
  width: 100%;
}

@media (max-width: 599px) {
  #welcome-panel {
    margin-bottom: 10dvh;
  }
  #welcome-panel .title,
  #welcome-panel .title-shadow {
    font-size: 2.875rem;
  }
  #welcome-panel .statement {
    width: 90%;
    padding: 22px 33px;
    font-size: 0.9375rem;
    line-height: 1.4;
  }
  #portfolio-work {
    margin: 0 8dvw 20px;
    padding-top: 0;
    padding-bottom: 30px;
  }
  #portfolio-work .project .project-card {
    border-width: 26px;
  }
  #portfolio-work .project .project-image {
    max-height: 40dvh;
  }
  #portfolio-work .project .project-info {
    padding-bottom: 20px;
  }
  #portfolio-work .project .project-title {
    font-size: 19px;
    font-weight: 400;
  }
  #portfolio-work .project .project-location {
    font-size: 0.875rem;
  }
  #portfolio-work .project .project-award {
    margin-left: auto;
  }
}
@media (max-width: 369px) {
  #welcome-panel .statement {
    font-size: 0.8125rem;
  }
}
#main-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  padding: 30px;
  background: transparent;
}
#main-header > section {
  z-index: 10;
}

#logo-badge {
  position: relative;
}
#logo-badge::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.2);
  filter: blur(16px);
  opacity: 0.8;
  transform: scale(0.33) translate(20%, 20%);
  transform-origin: top left;
  pointer-events: none;
}
#logo-badge > div {
  position: relative;
  padding: 29px 30px;
  background: #FBFBFB;
  box-shadow: 0 0 transparent;
  color: #131313;
  border-radius: 2px;
  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.1);
  transition: box-shadow 0.45s ease 0s, background 0.4s ease 0s;
}
#logo-badge h1 {
  margin: 0;
  font-family: "Poppins", sans-serif;
  font-size: 2rem;
  font-weight: 400;
  line-height: 1;
  transition: color 0.4s ease 0s;
}
#logo-badge h1 strong {
  position: relative;
  font-family: "Permanent Marker", cursive;
  font-size: 2.625rem;
  font-weight: 400;
}
#logo-badge h1 strong.main-name::before {
  content: "";
  position: absolute;
  right: 5px;
  bottom: 11px;
  left: 3px;
  height: 2px;
  background: #F44A1F;
  transform: skew(10px);
  transition: background 0.4s ease 0s;
}
#logo-badge h1 strong.main-name span {
  position: relative;
}
#logo-badge h1 strong.sticky-name {
  display: none;
}

#main-menu {
  position: relative;
}

#menu-toggle {
  position: relative;
  width: 69px;
  height: 69px;
  background: transparent;
  border: none;
  border-radius: 2px;
  z-index: 1;
  transition: all 0.4s ease 0s;
}
#menu-toggle::before {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: #FBFBFB;
  border-radius: 2px;
  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.1);
  transition: all 0.4s ease 0s;
}
#menu-toggle .control-icon {
  display: inline-block;
  position: relative;
}
#menu-toggle .control-icon span {
  display: block;
  width: 30px;
  height: 4px;
  margin: 3px 0;
  border-radius: 10px;
  background: #131313;
  transition: all 0.4s ease 0s;
}
#menu-toggle .control-icon span.bar-1, #menu-toggle .control-icon span.bar-3 {
  width: 20px;
  margin-left: auto;
}
#menu-toggle:hover::before, #menu-toggle:focus-visible::before, #menu-toggle[aria-expanded=true]::before {
  box-shadow: -0.7px 3.94px 5px rgba(0, 0, 0, 0.1);
  transform: rotate(-10deg) scale(1.01);
}
#menu-toggle:hover .control-icon span.bar-1, #menu-toggle:hover .control-icon span.bar-3, #menu-toggle:focus-visible .control-icon span.bar-1, #menu-toggle:focus-visible .control-icon span.bar-3, #menu-toggle[aria-expanded=true] .control-icon span.bar-1, #menu-toggle[aria-expanded=true] .control-icon span.bar-3 {
  width: 30px;
}
#menu-toggle:hover .control-icon span.bar-2, #menu-toggle:hover .control-icon span.bar-4, #menu-toggle:focus-visible .control-icon span.bar-2, #menu-toggle:focus-visible .control-icon span.bar-4, #menu-toggle[aria-expanded=true] .control-icon span.bar-2, #menu-toggle[aria-expanded=true] .control-icon span.bar-4 {
  width: 20px;
}
#menu-toggle[aria-expanded=true] {
  transform: scale(0.7);
  transition-delay: 0.25s;
}
#menu-toggle[aria-expanded=true]::before {
  box-shadow: -4px 0 5px rgba(0, 0, 0, 0.1);
  transform: rotate(-90deg) scale(1.01);
}

#main-menu-panel {
  display: flex;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  padding: 4px 16px 4px 18px;
  background: #FBFBFB;
  border-radius: 2px;
  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.1);
  transform: translate(60vw, 0);
  transition: background-color 0.4s ease 0s;
  z-index: 0;
  animation: menu-slide-out 0.8s forwards;
}
@keyframes menu-slide-in {
  0% {
    transform: translate(60vw, 0);
    z-index: 0;
  }
  50% {
    transform: translate(-75px, 0);
    z-index: 0;
  }
  51% {
    transform: translate(-75px, 0);
    z-index: 2;
  }
  100% {
    transform: translate(0, 0);
    z-index: 2;
  }
}
@keyframes menu-slide-out {
  0% {
    transform: translate(0, 0);
    z-index: 2;
  }
  25% {
    transform: translate(-75px, 0);
    z-index: 2;
  }
  26% {
    transform: translate(-75px, 0);
    z-index: 0;
  }
  100% {
    transform: translate(60vw, 0);
    z-index: 0;
  }
}
#main-menu-panel.hidden {
  visibility: hidden;
}
#main-menu-panel[aria-hidden=false] {
  animation: menu-slide-in 0.8s forwards;
}
#main-menu-panel[aria-hidden=false] ul::after {
  clip-path: inset(0);
  transition-delay: 0.6s;
}
#main-menu-panel ul {
  display: flex;
  align-items: center;
  position: relative;
  height: 100%;
  margin: 0;
  padding: 0 30px 0 0;
  list-style: none;
}
#main-menu-panel ul::after {
  content: "";
  position: absolute;
  top: calc(50% - 10px);
  right: 13px;
  width: 1px;
  height: 21px;
  background: #bbb;
  clip-path: inset(50% 0);
  transition: all 0.4s ease 0s;
}
#main-menu-panel ul > li {
  padding: 0 9px;
}
#main-menu-panel button,
#main-menu-panel a {
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  min-height: 32px;
  padding: 0;
  background: transparent;
  border: none;
  font-size: 1.75rem;
  text-decoration: none;
  color: #131313;
  transition: color 0.4s ease 0s;
}
#main-menu-panel button i,
#main-menu-panel a i {
  transition: transform 0.4s ease 0s;
}
#main-menu-panel button .label,
#main-menu-panel a .label {
  display: block;
  position: absolute;
  top: calc(100% + 10px);
  padding: 4px 10px;
  background: #f1f1f1;
  border-radius: 4px;
  font-family: "Lato", sans-serif;
  font-size: 0.8125rem !important;
  color: #000;
  letter-spacing: 0.45px;
  line-height: 1;
  pointer-events: none;
  white-space: nowrap;
  word-break: break-word;
  opacity: 0;
  transform: translate(0, -11px);
  transition: all 0.4s ease 0s;
}
#main-menu-panel button .label::before,
#main-menu-panel a .label::before {
  content: "";
  position: absolute;
  left: calc(50% - 9px);
  bottom: calc(100% - 4px);
  width: 0px;
  height: 0px;
  border-style: solid;
  border-width: 0 9px 0 9px;
  border-color: transparent transparent #f1f1f1 transparent;
  transform: rotate(0deg);
  transition: all 0.4s ease 0s;
}
#main-menu-panel button:hover, #main-menu-panel button:focus-visible,
#main-menu-panel a:hover,
#main-menu-panel a:focus-visible {
  color: #007A8E;
}
#main-menu-panel button:hover .label, #main-menu-panel button:focus-visible .label,
#main-menu-panel a:hover .label,
#main-menu-panel a:focus-visible .label {
  transform: none;
  opacity: 1;
}
#main-menu-panel button:hover .label::before, #main-menu-panel button:focus-visible .label::before,
#main-menu-panel a:hover .label::before,
#main-menu-panel a:focus-visible .label::before {
  border-width: 0 9px 10px 9px;
}
#main-menu-panel button i,
#main-menu-panel button i::before {
  transition: all 0.84s ease 0s;
}
#main-menu-panel button i::before {
  display: inline-block;
}
#main-menu-panel button .toggle-icon {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  opacity: 0;
}
#main-menu-panel button.dark-mode-toggle {
  font-size: 1.5625rem;
}
#main-menu-panel button.dark-mode-toggle i {
  display: block;
  clip-path: inset(-2px);
}
#main-menu-panel button.dark-mode-toggle.dark-mode i {
  opacity: 0;
}
#main-menu-panel button.dark-mode-toggle.dark-mode .toggle-icon {
  opacity: 1;
}
#main-menu-panel button.dark-mode-toggle:hover i, #main-menu-panel button.dark-mode-toggle:focus-visible i {
  color: #F44A1F;
}
#main-menu-panel button.dark-mode-toggle:hover i::before, #main-menu-panel button.dark-mode-toggle:focus-visible i::before {
  transform: translate(0, 50%);
  transition-duration: 1.1s;
}
#main-menu-panel button.dark-mode-toggle:hover.dark-mode i, #main-menu-panel button.dark-mode-toggle:focus-visible.dark-mode i {
  color: #F9F9F9;
}
@keyframes shake {
  10%, 90% {
    transform: translate3d(-0.8%, 0, 0);
    /* Move slightly left */
  }
  20%, 80% {
    transform: translate3d(1.75%, 0, 0);
    /* Move slightly right */
  }
  30%, 50%, 70% {
    transform: translate3d(-1%, 0, 0);
    /* Move further left */
  }
  40%, 60% {
    transform: translate3d(2.5%, 0, 0);
    /* Move further right */
  }
}
#main-menu-panel button.motion-toggle i {
  position: relative;
}
#main-menu-panel button.motion-toggle i::after {
  content: "";
  position: absolute;
  top: -4px;
  bottom: -4px;
  left: 50%;
  width: 3px;
  background: #131313;
  opacity: 1;
  transform: rotate(-45deg);
  clip-path: inset(0);
  transition: all 0.4s ease 0s;
}
#main-menu-panel button.motion-toggle.animate-mode i::after {
  clip-path: inset(50% 0);
}
#main-menu-panel button.motion-toggle:hover i::before, #main-menu-panel button.motion-toggle:focus-visible i::before {
  animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
  transform: translate3d(0, 0, 0);
  /* Improves performance by promoting element to its own layer */
  backface-visibility: hidden;
  /* Prevents a slight flicker at the end in some browsers */
  perspective: 1000px;
  /* Needed for backface-visibility to work */
}
#main-menu-panel button.code-view-toggle:hover i:not(.toggle-icon), #main-menu-panel button.code-view-toggle:focus-visible i:not(.toggle-icon) {
  transform: scale(1.05) translate(2px, 4px) rotate(3deg);
}
#main-menu-panel button.code-view-toggle:hover .toggle-icon, #main-menu-panel button.code-view-toggle:focus-visible .toggle-icon {
  transform: scale(1.05) translate(-51%, -55%) rotate(-3deg);
}
#main-menu-panel button.code-view-toggle[aria-expanded=true] i {
  opacity: 0;
}
#main-menu-panel button.code-view-toggle[aria-expanded=true] .toggle-icon {
  opacity: 1;
}
#main-menu-panel a.linkedin-link {
  font-size: 1.9375rem;
}
#main-menu-panel a.linkedin-link:hover, #main-menu-panel a.linkedin-link:focus-visible {
  color: #0077B5;
}
#main-menu-panel a.linkedin-link:hover i, #main-menu-panel a.linkedin-link:focus-visible i {
  transform: scale(1.04) rotate(2.5deg);
}
#main-menu-panel a.em-link:hover i, #main-menu-panel a.em-link:focus-visible i, #main-menu-panel a.resume-link:hover i, #main-menu-panel a.resume-link:focus-visible i {
  transform: scale(1.05) translate(0, -3px);
}
#main-menu-panel .close-trigger {
  font-size: 1.5625rem;
  line-height: 1;
}

@media (max-width: 1023px) {
  #logo-badge > div {
    padding: 27px 30px 36px;
  }
  #logo-badge .label {
    font-size: 1.75rem;
  }
  #logo-badge .main-name {
    font-size: 2.3125rem;
  }
  #main-menu-panel {
    top: 0;
    right: 0;
    bottom: auto;
    left: 0;
    flex-direction: column;
    padding: 15px 4px 10px;
    transform: translate(0, -110vh);
    animation: mobile-menu-slide-out 0.8s forwards;
  }
  @keyframes mobile-menu-slide-in {
    0% {
      transform: translate(0, -110vh);
      z-index: 0;
    }
    50% {
      transform: translate(0, 75px);
      z-index: 0;
    }
    51% {
      transform: translate(0, 75px);
      z-index: 2;
    }
    100% {
      transform: translate(0, 0);
      z-index: 2;
    }
  }
  @keyframes mobile-menu-slide-out {
    0% {
      transform: translate(0, 0);
      z-index: 2;
    }
    25% {
      transform: translate(0, 75px);
      z-index: 2;
    }
    26% {
      transform: translate(0, 75px);
      z-index: 0;
    }
    100% {
      transform: translate(0, -110vh);
      z-index: 0;
    }
  }
  #main-menu-panel::after {
    content: "";
    position: absolute;
    top: 59px;
    right: calc(50% - 10px);
    width: 20px;
    height: 1px;
    background: #bbb;
    clip-path: inset(0 50%);
    transition: all 0.4s ease 0s;
  }
  #main-menu-panel[aria-hidden=false] {
    animation: mobile-menu-slide-in 0.8s forwards;
  }
  #main-menu-panel[aria-hidden=false]::after {
    clip-path: inset(0);
    transition-delay: 0.6s;
  }
  #main-menu-panel ul {
    order: 2;
    flex-direction: column;
    width: 100%;
    height: auto;
    max-height: calc(100dvh - 180px);
    margin-top: -9px;
    padding: 0;
    overflow: auto;
  }
  #main-menu-panel ul::after {
    display: none;
  }
  #main-menu-panel ul > li {
    margin: 9px 0;
    padding: 0;
  }
  #main-menu-panel button,
  #main-menu-panel a {
    flex-direction: column;
    font-size: 1.75rem;
  }
  #main-menu-panel button i,
  #main-menu-panel a i {
    font-size: 1.375rem;
  }
  #main-menu-panel button .label,
  #main-menu-panel a .label {
    position: relative;
    top: 0;
    padding: 4px 0 0;
    background: transparent;
    font-size: 0.75rem !important;
    letter-spacing: 0.3px;
    color: #131313;
    white-space: normal;
    transform: none;
    opacity: 1;
  }
  #main-menu-panel button .label::before,
  #main-menu-panel a .label::before {
    display: none;
  }
  #main-menu-panel button .toggle-icon {
    top: 0;
    transform: translate(-50%, 0);
  }
  #main-menu-panel .close-trigger {
    margin-bottom: 28px;
    order: 1;
    font-size: 1.25rem;
    transform: rotate(-90deg);
  }
  #main-menu-panel .close-trigger i {
    font-size: inherit;
  }
}
@media (max-width: 599px) {
  #logo-badge > div {
    padding: 13px 22px 16px;
  }
  #logo-badge h1 {
    display: flex;
    align-items: center;
  }
  #logo-badge h1 strong.main-name {
    font-size: 1.3125rem;
  }
  #logo-badge h1 strong.main-name::before {
    bottom: 1px;
  }
  #logo-badge .label {
    margin-right: 4px;
    font-size: 0.875rem;
  }
  #menu-toggle {
    width: 50px;
    height: 50px;
  }
  #menu-toggle .control-icon {
    display: inline-block;
    position: relative;
  }
  #menu-toggle .control-icon span {
    width: 27px;
    height: 3px;
  }
  #menu-toggle .control-icon span.bar-1, #menu-toggle .control-icon span.bar-3 {
    width: 17px;
  }
  #menu-toggle:hover .control-icon span.bar-1, #menu-toggle:hover .control-icon span.bar-3, #menu-toggle:focus-visible .control-icon span.bar-1, #menu-toggle:focus-visible .control-icon span.bar-3, #menu-toggle[aria-expanded=true] .control-icon span.bar-1, #menu-toggle[aria-expanded=true] .control-icon span.bar-3 {
    width: 27px;
  }
  #menu-toggle:hover .control-icon span.bar-2, #menu-toggle:hover .control-icon span.bar-4, #menu-toggle:focus-visible .control-icon span.bar-2, #menu-toggle:focus-visible .control-icon span.bar-4, #menu-toggle[aria-expanded=true] .control-icon span.bar-2, #menu-toggle[aria-expanded=true] .control-icon span.bar-4 {
    width: 17px;
  }
  #main-menu-panel {
    right: -4px;
    left: -4px;
  }
  #main-menu-panel ul a i,
  #main-menu-panel ul button i {
    font-size: 1.125rem;
  }
  #main-menu-panel .close-trigger {
    font-size: 1.1875rem;
  }
}
@media (max-width: 369px) {
  #main-header {
    padding: 20px;
  }
  #logo-badge h1 strong.main-name {
    font-size: 1.125rem;
  }
  #logo-badge h1 strong.main-name::before {
    bottom: 1px;
  }
  #logo-badge .label {
    margin-right: 4px;
    font-size: 0.8125rem;
  }
  #main-menu-panel button,
  #main-menu-panel a {
    font-size: 1.25rem;
  }
  #main-menu-panel button i,
  #main-menu-panel a i {
    font-size: 1.125rem;
  }
}
#main-footer {
  position: relative;
  padding: 27px 42px;
  background: #FBFBFB;
  overflow: hidden;
  transition: background-color 0.5s ease 0s;
}

#site-information {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
}

#site-stack ul {
  display: flex;
  align-items: center;
  list-style: none;
  margin: 0;
  padding: 0;
}
#site-stack ul > li {
  margin: 0 15px 0 0;
}
#site-stack p {
  margin: 0;
  font-size: 1.75rem;
  line-height: 1;
  transition: color 0.5s ease 0s;
}
#site-stack p.icon-php {
  color: #474A8A;
}
#site-stack p.icon-html5 {
  color: #F16529;
}
#site-stack p.icon-sass {
  font-size: 1.625rem;
  color: #CD669A;
}
#site-stack p.icon-js-square {
  font-size: 1.625rem;
  color: #323330;
}
#site-stack p.icon-font-awesome-flag {
  font-size: 1.25rem;
  color: #538DD7;
}
#site-stack p.icon-universal-access {
  font-size: 1.5625rem;
  color: #000;
}
#site-stack p.icon-ghost {
  font-size: 1.375rem;
  color: #737373;
}

#copyright {
  flex-shrink: 0;
  font-family: "Pacifico", cursive;
  font-size: 1.1875rem;
  letter-spacing: 0.8px;
  transition: color 0.5s ease 0s;
}

#disclaimer,
#mobile-disclaimer {
  max-width: 900px;
  margin: 0 0 30px auto;
  font-size: 0.75rem;
  font-style: italic;
  line-height: 1.4;
  letter-spacing: 0.5px;
  text-align: right;
  overflow: hidden;
}
#disclaimer p,
#mobile-disclaimer p {
  margin: 0;
}

#mobile-disclaimer {
  display: none;
}

.full-motion #main-footer {
  box-shadow: 0 0 6px rgba(19, 19, 19, 0.05);
}
.full-motion #main-footer #site-stack p,
.full-motion #main-footer #copyright,
.full-motion #main-footer #disclaimer p {
  transition: all 0.5s ease 0s;
}
.full-motion #main-footer:not(.in-view) #site-stack p {
  transform: translate(0, 20dvh);
}
.full-motion #main-footer:not(.in-view) #copyright {
  transform: translate(20vw, 0);
}
.full-motion #main-footer:not(.in-view) #disclaimer p {
  transform: translate(0, 120%);
}
.full-motion #main-footer.in-view #site-stack li:nth-child(1) p {
  transition-delay: 0.05s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(2) p {
  transition-delay: 0.1s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(3) p {
  transition-delay: 0.15s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(4) p {
  transition-delay: 0.2s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(5) p {
  transition-delay: 0.25s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(6) p {
  transition-delay: 0.3s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(7) p {
  transition-delay: 0.35s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(8) p {
  transition-delay: 0.4s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(9) p {
  transition-delay: 0.45s;
}
.full-motion #main-footer.in-view #site-stack li:nth-child(10) p {
  transition-delay: 0.5s;
}

@media (max-width: 1023px) {
  #main-footer {
    padding-right: 30px;
    padding-left: 30px;
  }
}
@media (max-width: 599px) {
  #site-information {
    flex-direction: column;
    justify-content: center;
    align-items: center;
  }
  #site-stack {
    margin-bottom: 20px;
    overflow: hidden;
  }
  #site-stack ul > li {
    margin: 0 8px;
  }
  #copyright {
    margin-left: -10px;
  }
  #disclaimer {
    display: none;
  }
  #mobile-disclaimer {
    display: block;
    margin-top: 26px;
    margin-bottom: 0;
    text-align: center;
    line-height: 1.5;
  }
}
@media (max-width: 369px) {
  #main-footer {
    padding-right: 22px;
    padding-left: 22px;
  }
  #site-stack ul {
    justify-content: center;
    flex-wrap: wrap;
  }
  #site-stack ul > li {
    margin-bottom: 4px;
  }
  #site-stack p {
    font-size: 1.25rem;
  }
}
/****
    Contains all of the styles for the code-view
***/
#code-view {
  position: fixed;
  top: 0;
  left: 0;
  transform: translate(0, -100dvh);
  pointer-events: none;
  visibility: hidden;
}
#code-view > div {
  height: 100%;
}
#code-view [role=tab]:focus-visible {
  outline-offset: 3px;
}
#code-view .code-type-header,
#code-view .file-name {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(100%);
  white-space: nowrap;
  pointer-events: none;
}
#code-view #code-view-tabs {
  width: 100dvw;
  height: calc(70dvh - 60px);
  padding: 40px 40px 30px;
}
#code-view #code-view-tabs > [role=tablist] {
  display: inline-flex;
  flex-wrap: wrap;
  padding: 20px 30px;
  background: rgba(251, 251, 251, 0.001);
  backdrop-filter: blur(3px);
  border-radius: 2px;
  border: solid 1px rgba(19, 19, 19, 0.5);
  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.1);
}
#code-view #code-view-tabs > [role=tablist] [role=tab] {
  position: relative;
  margin: 6px 12px 6px 0;
  padding: 6px 10px;
  background: transparent;
  border: solid 2px rgba(0, 122, 142, 0.8);
  border-radius: 3px;
  perspective: 600px;
  font-weight: 600;
  font-size: 1.0625rem;
  line-height: 1;
  overflow: hidden;
  transition: color 0.4s ease 0s;
}
#code-view #code-view-tabs > [role=tablist] [role=tab]::before, #code-view #code-view-tabs > [role=tablist] [role=tab]::after {
  content: "";
  position: absolute;
}
#code-view #code-view-tabs > [role=tablist] [role=tab]::before {
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: #007A8E;
  transform-style: preserve-3d;
  transform: rotate3d(0, 1, 1, -180deg) scale(0.5);
  transform-origin: 25% left;
  opacity: 0;
  border-radius: 50px;
  transition: all 0.55s ease 0s, opacity 0.3s ease 0.25s;
}
#code-view #code-view-tabs > [role=tablist] [role=tab]::after {
  right: -1px;
  bottom: -8px;
  height: 20px;
  width: 8px;
  background: #FBFBFB;
  transform: translate(0, 12px) rotate(45deg);
  transition: all 0.33s ease 0s;
}
#code-view #code-view-tabs > [role=tablist] [role=tab] span {
  position: relative;
}
#code-view #code-view-tabs > [role=tablist] [role=tab][aria-selected=true] {
  color: #F9F9F9;
  transition-duration: 0.63;
}
#code-view #code-view-tabs > [role=tablist] [role=tab][aria-selected=true]::before {
  transform: none;
  transform-origin: 20% 40%;
  opacity: 1;
  border-radius: 0;
  transition: all 0.6s ease 0s, opacity 0.2s ease 0s;
}
#code-view #code-view-tabs > [role=tablist] [role=tab][aria-selected=true]::after {
  transform: translate(0, 0) rotate(45deg);
  transition: all 0.33s ease 0.6s;
}
#code-view .code-files.is-hidden,
#code-view .code-file.is-hidden {
  display: none;
}
#code-view .code-files {
  padding-top: 20px;
}
#code-view .code-files > [role=tablist] {
  margin-top: 8px;
}
#code-view .code-files > [role=tablist] [role=tab] {
  position: relative;
  margin: 0 -1px -1px 0;
  padding: 8px 18px;
  background: transparent;
  backdrop-filter: blur(2px);
  border: solid 1px rgba(19, 19, 19, 0.4);
  font-family: "Poppins", sans-serif;
  font-size: 0.9375rem;
  line-height: 1.2;
  box-sizing: border-box;
  transition: all 0.4s ease 0s;
}
#code-view .code-files > [role=tablist] [role=tab]::before {
  content: "";
  position: absolute;
  top: 100%;
  right: 0;
  bottom: 0;
  left: 0;
  background: #007A8E;
  transition: all 0.4s ease 0s;
}
#code-view .code-files > [role=tablist] [role=tab] span {
  position: relative;
}
#code-view .code-files > [role=tablist] [role=tab][aria-selected=true] {
  color: #FBFBFB;
}
#code-view .code-files > [role=tablist] [role=tab][aria-selected=true]::before {
  top: 0;
}
#code-view .code-files,
#code-view .code-file,
#code-view .code-box,
#code-view .zoom-box {
  height: 100%;
}
#code-view .code-file {
  padding: 30px;
  border-radius: 0 2px 2px 2px;
  background: rgba(251, 251, 251, 0.02);
  backdrop-filter: blur(3px);
  border: solid 1px rgba(19, 19, 19, 0.5);
}
#code-view .code-box {
  border: solid 1px rgba(19, 19, 19, 0.2);
  box-sizing: border-box;
}
#code-view .zoom-toggle {
  position: absolute;
  top: 20px;
  right: 20px;
  width: 40px;
  height: 40px;
  background: transparent;
  border: transparent;
  border-radius: 100%;
  font-size: 0.875rem;
  line-height: 1;
}
#code-view .zoom-toggle::before {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: rgba(251, 251, 251, 0.2);
  backdrop-filter: blur(2px);
  border: solid 1px rgba(19, 19, 19, 0.2);
  border-radius: 100%;
  transition: all 0.4s ease 0s;
}
#code-view .zoom-toggle i {
  position: relative;
}
#code-view .zoom-toggle:hover::before, #code-view .zoom-toggle:focus-visible::before {
  transform: scale(1.12);
}
#code-view .zoom-toggle[aria-expanded=true] i::before {
  content: "\e903";
}
#code-view .zoom-box {
  position: relative;
}
#code-view .zoom-box::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  box-shadow: inset 0 0 3px rgba(19, 19, 19, 0.2);
  pointer-events: none;
}
#code-view .zoom-box.full-screen {
  position: fixed;
  top: 0;
  left: 0;
  width: 100dvw;
  height: 100dvh;
  z-index: 20;
}
#code-view.full-screen-showing {
  z-index: 21;
}
#code-view.full-screen-showing .code-file {
  backdrop-filter: none;
}
#code-view.full-screen-showing pre {
  height: 100%;
}
#code-view.full-screen-showing code {
  min-height: 100%;
}
#code-view pre {
  max-height: 100%;
  margin: 0;
  overflow: auto;
}
#code-view code {
  margin-top: -1.7em;
  padding: 30px 30px 40px;
  font-family: monospace;
  font-size: 0.875rem;
  box-sizing: border-box;
}

.show-code-view #code-view {
  transition: all 0.7s ease 0s, z-index 0s ease 0s;
  visibility: visible;
  pointer-events: auto;
}
.show-code-view #logo-badge {
  transition: all 0.5s ease 0s;
}
.show-code-view #main-content {
  perspective: 1800px;
  pointer-events: none;
}
.show-code-view #welcome-panel {
  transition: all 0.8s ease 0.2s;
}
.show-code-view #welcome-panel::before {
  content: "";
  position: absolute;
  top: 150px;
  right: 8px;
  bottom: 0;
  left: 8px;
  box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1);
  border-radius: 50px;
  transition: all 0.6s ease 0.1s;
}
.show-code-view.animate #code-view {
  transform: none;
  transition: all 0.7s ease 0.2s, z-index 0s ease 0.8s;
}
.show-code-view.animate #logo-badge {
  transform: translate(-150%, 0);
}
.show-code-view.animate #welcome-panel {
  pointer-events: none;
  transform-origin: center 102%;
  transform: rotate3d(1, 0, 0, 11.5deg);
}
.show-code-view.animate #welcome-panel::before {
  top: 15px;
  right: 15px;
  left: 15px;
  box-shadow: 0 30px 40px rgba(0, 0, 0, 0.69);
  transition: all 0.6s ease 0.2s;
}

@media (max-width: 1023px) {
  .show-code-view.animate #welcome-panel {
    transform: rotate3d(1, 0, 0, 16deg);
  }
}
@media (max-width: 599px) {
  #code-view #code-view-tabs {
    padding: 10px 20px 30px;
  }
  #code-view #code-view-tabs > [role=tablist] {
    margin-right: 75px;
    padding: 18px 20px;
  }
  #code-view #code-view-tabs > [role=tablist] [role=tab] {
    margin: 4px 8px 4px 0;
    font-size: 0.9375rem;
  }
  #code-view .code-files > [role=tablist] [role=tab] {
    padding: 8px 16px;
    font-size: 0.875rem;
  }
  #code-view .code-file {
    padding: 20px;
  }
  #code-view code {
    font-size: 0.8125rem;
  }
  .show-code-view.animate #welcome-panel {
    transform: rotate3d(1, 0, 0, 24deg);
  }
}
@media (max-width: 369px) {
  #code-view #code-view-tabs {
    height: calc(95dvh - 40px);
  }
  #code-view #code-view-tabs > [role=tablist] [role=tab] {
    font-size: 0.875rem;
  }
  #code-view .code-files {
    max-height: 85%;
    overflow: auto;
  }
  #code-view .code-files > [role=tablist] [role=tab] {
    padding: 8px 15px;
    font-size: 0.8125rem;
  }
  .show-code-view.animate #welcome-panel {
    transform: rotate3d(1, 0, 0, 24deg);
  }
}
/****
    Loading Screen
***/
@keyframes stickerShadow {
  0% {
    transform: scale(0.33) translate(12%, 20%);
    opacity: 0.82;
    filter: blur(30px);
  }
  80% {
    transform: scale(0.9) translate(0%, 0%);
    opacity: 0.69;
    filter: blur(12px);
  }
  100% {
    transform: scale(0.9) translate(0%, 0%);
    opacity: 0.2;
    filter: blur(4px);
  }
}
@keyframes placeSticker {
  from {
    transform: perspective(800px) rotateX(80deg) rotateY(-50deg) scale(1.23);
  }
  to {
    transform: perspective(800px) rotateX(0deg) rotateY(0deg) scale(1);
  }
}
.loading-screen.full-motion #menu-toggle {
  transform: translate(20vw, 0);
  transition: all 0.5s ease 0s;
}
.loading-screen.full-motion #menu-panel {
  opacity: 0;
}
.loading-screen.full-motion #logo-badge {
  opacity: 0;
  transition: opacity 0.2s ease 0s;
}
.loading-screen.full-motion #logo-badge > div {
  box-shadow: 0 0 transparent;
  backface-visibility: hidden;
  transform-origin: top left;
  transform: perspective(800px) rotateX(80deg) rotateY(-50deg) scale(1.23);
}
.loading-screen.full-motion #logo-badge h1 strong span {
  clip-path: inset(0 105% 0 0);
  transition: all 0.9s ease 0s;
}
.loading-screen.full-motion #welcome-panel .bg-image {
  transform: scale(0.6) translate(0, 120dvh);
  transition: all 1s ease 0s;
}
.loading-screen.full-motion #welcome-panel .title {
  clip-path: inset(0 100% 0 0);
  transition: all 0.85s ease 0s;
}
.loading-screen.full-motion #welcome-panel .title-shadow {
  opacity: 0;
  transition: all 0.9s ease 0s;
}
.loading-screen.full-motion.stage-1 #menu-toggle {
  transform: none;
  transition-delay: 0.75s;
}
.loading-screen.full-motion.stage-1 #menu-panel {
  opacity: 1;
}
.loading-screen.full-motion.stage-1 #logo-badge {
  opacity: 1;
}
.loading-screen.full-motion.stage-1 #logo-badge::before {
  animation: stickerShadow 0.64s ease-out forwards;
}
.loading-screen.full-motion.stage-1 #logo-badge > div {
  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.1);
  animation: placeSticker 0.7s ease-out forwards;
  transition-delay: 0.4s;
}
.loading-screen.full-motion.stage-1 #logo-badge h1 strong span {
  clip-path: inset(-30px -30px);
  transition-delay: 0.85s;
}
.loading-screen.full-motion.stage-2 #welcome-panel .bg-image {
  transform: scale(1);
  transition-delay: 0.25s;
}
.loading-screen.full-motion.stage-2 #welcome-panel .title {
  clip-path: inset(-10px);
}
.loading-screen.full-motion.stage-2 #welcome-panel .title-shadow {
  opacity: 1;
  transition-delay: 0.3s;
}

/****
    Dark Mode
***/
.dark-mode,
.dark-mode body {
  background: #424242;
  color: #F9F9F9;
}
.dark-mode .page-bg {
  opacity: 0;
  z-index: -1;
}
.dark-mode .page-bg.for-dark-mode {
  opacity: 0.07;
  z-index: 0;
}
.dark-mode #logo-badge > div {
  background: #1F1F1F;
  color: #F9F9F9;
}
.dark-mode #logo-badge h1 strong.main-name::before {
  background: #007A8E;
}
.dark-mode #menu-toggle::before {
  background: #1F1F1F;
}
.dark-mode #menu-toggle .control-icon span {
  background: #F9F9F9;
}
.dark-mode #main-menu-panel {
  background: #1F1F1F;
}
.dark-mode #main-menu-panel a,
.dark-mode #main-menu-panel button {
  color: #F9F9F9;
}
.dark-mode #main-menu-panel button.motion-toggle i::after {
  background: #F9F9F9;
}
.dark-mode #main-menu-panel a.linkedin-link {
  color: #F9F9F9;
}
.dark-mode #welcome-panel .bg-image {
  background: #000;
}
.dark-mode #welcome-panel .title {
  color: #F9F9F9;
  text-shadow: -1px -1px 0 #000, 0px -1px 0 #000, 1px -1px 0 #000, -1px 0px 0 #000, 1px 0px 0 #000, -1px 1px 0 #000, 0px 1px 0 #000, 1px 1px 0 #000;
}
.dark-mode #welcome-panel .statement {
  background: #1F1F1F;
  color: #F9F9F9;
}
.dark-mode #portfolio-work .project .project-card {
  border-color: #1F1F1F;
  background: #1F1F1F;
}
.dark-mode #portfolio-work .project a {
  color: #F9F9F9;
}
.dark-mode #portfolio-work .project .project-role strong {
  color: #F44A1F;
}
.dark-mode #portfolio-work .project .project-award::before {
  color: #F44A1F;
}
.dark-mode #main-footer {
  background: #1F1F1F;
}
.dark-mode #site-stack p {
  transition: color 0.5s ease 0s;
}
.dark-mode #site-stack p.icon-php {
  color: #B0B3D6;
}
.dark-mode #site-stack p.icon-js-square {
  color: #F0DB4F;
}
.dark-mode #site-stack p.icon-universal-access {
  color: #F9F9F9;
}
.dark-mode #site-stack p.icon-ghost {
  color: #ABABAB;
}
.dark-mode #code-view #code-view-tabs > [role=tablist] {
  background: rgba(31, 31, 31, 0.008);
}
.dark-mode #code-view #code-view-tabs > [role=tablist] [role=tab] {
  background: transparent;
  border-color: rgba(31, 31, 31, 0.8);
  color: #F9F9F9;
}
.dark-mode #code-view #code-view-tabs > [role=tablist] [role=tab]::before {
  background: #1F1F1F;
}
.dark-mode #code-view #code-view-tabs > [role=tablist] [role=tab]::after {
  background: #F9F9F9;
}
.dark-mode #code-view #code-view-tabs .zoom-toggle {
  color: #F9F9F9;
}
.dark-mode #code-view .code-files > [role=tablist] [role=tab] {
  border-color: rgba(31, 31, 31, 0.7);
  color: #F9F9F9;
}
.dark-mode #code-view .code-files > [role=tablist] [role=tab]::before {
  background: #1F1F1F;
}
.dark-mode #code-view .code-file {
  background: rgba(31, 31, 31, 0.015);
  border-color: rgba(31, 31, 31, 0.7);
}
@media (max-width: 1023px) {
  .dark-mode #main-menu-panel a .label,
  .dark-mode #main-menu-panel button .label {
    color: #F9F9F9;
  }
}

/****
    Reduced Motion Mode
***/
.reduce-motion .page-bg {
  display: none;
}
.reduce-motion #welcome-panel {
  margin-bottom: 80px;
}
.reduce-motion #welcome-panel .title-shadow {
  transform: translate(calc(-50% - 10px), calc(-50% + 10px)) !important;
}
.reduce-motion #welcome-panel .statement {
  margin-top: -70px;
}
.reduce-motion #portfolio-work {
  display: flex;
  flex-wrap: wrap;
  margin: 0 80px;
  padding-top: 0;
  padding-bottom: 60px;
}
.reduce-motion #portfolio-work .project {
  width: calc(50% - 40px);
  margin: 0 20px;
  padding: 0 0 40px;
  transform: none !important;
}
.reduce-motion #portfolio-work .project .project-card {
  max-height: auto;
  height: auto;
  aspect-ratio: unset;
  transform: none !important;
}
.reduce-motion #portfolio-work .project .project-card .project-image {
  max-height: 420px;
  aspect-ratio: 7/5;
}
.reduce-motion #code-view #code-view-tabs > [role=tablist] [role=tab]::before {
  border-radius: 0;
  transform: none !important;
}
.reduce-motion #code-view .code-files > [role=tablist] [role=tab]::before {
  top: 0;
  opacity: 0;
}
.reduce-motion #code-view .code-files > [role=tablist] [role=tab][aria-selected=true]::before {
  opacity: 1;
}
.reduce-motion.show-code-view #code-view {
  transition: all 0.3s ease 0s !important;
}
.reduce-motion.show-code-view #main-content {
  transition: all 0.3s ease 0s;
}
.reduce-motion.show-code-view #welcome-panel {
  transform: none;
}
.reduce-motion.show-code-view.animate #main-content {
  padding-top: 85dvh;
}
@media (min-width: 1280px) {
  .reduce-motion #portfolio-work .project {
    width: calc(33.333% - 40px);
  }
}
@media (max-width: 599px) {
  .reduce-motion #portfolio-work .project {
    width: 100%;
    margin: 0;
    padding-bottom: 10px;
  }
  .reduce-motion #portfolio-work .project .project-award {
    position: relative;
    right: auto;
    bottom: auto;
  }
}

JavaScript

main.js

                                                    gsap.registerPlugin(ScrollTrigger);
gsap.registerPlugin(Flip);


/// Adds :focusable - based on jQuery UI
$.extend($.expr[':'], {
    focusable: function (elem) {
        const $el = $(elem);

        if (!$el.is(':visible') || $el.is(':disabled')) return false;

        const nodeName = elem.nodeName.toLowerCase();
        const tabIndex = $el.attr('tabindex');
        const hasTabIndex = !isNaN(tabIndex) && parseInt(tabIndex, 10) >= 0;

        const focusableElements = /^(input|select|textarea|button|object)$/;

        return (
            focusableElements.test(nodeName) ||
            (nodeName === 'a' && $el.attr('href')) ||
            hasTabIndex ||
            $el.is('[contenteditable]')
        );
    }
});

//Adjust GSAP scrub value for mobile
const animationScrub = (document.getElementsByClassName('is-mobile-device').length) ? 1.2 : true;


// The Main Site Object
const PROFILE = {
    animationsBackboneState: true, //this is used to check if the user as chosen to reduce the page animations

    init () {
        this.motionToggle(); //this runs first because it can have an effect on animations for everything
        this.darkMode();
        this.mainMenu();
        this.generalPageAnimations();
        this.projects();
        this.codeView();
        this.footer();
        
        this.loadingScreen();
        // welcomePanel - runs after the loading-screen so the loading-screen styles don't impact the calculations


        ///
        /// Manage the Animation Backbone - breakpoints, img loads, user preference, etc.
        $(window).on('load', (e) => {
            ScrollTrigger.refresh();
        });

        $(window).on('resize', (e) => {
            ScrollTrigger.refresh();
        });

        if (!PROFILE.animationsBackboneState) {
            PROFILE.SetAnimationBackboneState(false);
        }
    },

    //Return a random number between a range
    GetRandomNumber (min, max) {
        return Math.random() * (max - min) + min;
    },
    //Cookie management
    GetCookie (name){
        let nameP = encodeURIComponent(name) + "=";
        let ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            let c = ca[i]
            while (c.charAt(0) === ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameP) === 0) return decodeURIComponent(c.substring(nameP.length, c.length));
        }
        return null
    },
    SetCookie (name, value) {
        document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + ";path=/";
    },
    //User Options
    SetCodeTheme (isDark) {
        //Will let us toggle between the different Highlight.js themes - there isn't a href predefined, so we only load a file once in theory
        const linkElem = document.getElementById("hljs-theme");
        const themes = {
            light: 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css',
            dark: 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css'
        };

        if (linkElem) {
            if(isDark) {
                linkElem.href = themes.dark;
            } else {
                linkElem.href = themes.light;
            }
        }
    },
    SetAnimationBackboneState (state) {
        PROFILE.animationsBackboneState = state;

        if(!state){
            document.documentElement.classList.add('reduce-motion');
            document.documentElement.classList.remove('full-motion');
            ScrollTrigger.getAll().forEach(trigger => trigger.disable());
        } else {
            document.documentElement.classList.remove('reduce-motion');
            document.documentElement.classList.add('full-motion');
            ScrollTrigger.getAll().forEach(trigger => trigger.enable());
            ScrollTrigger.refresh();
        }
    },


    /// Loading Screen
    loadingScreen () {
        //Check that we are using a loading screen, and that the user hasn't reduced the motion
        if ($('html').hasClass('loading-screen') && $('html').hasClass('full-motion')) {
            //try to keep the user at the top for the loading animation - it can look broken otherwise
            window.scrollTo(0, 0);
            $(window).on('beforeunload', () => {
                window.scrollTo(0, 0);
            }); 

            //stops the user from being able to scroll while we are animating - this is a bit dirty, but we can't run the GSAP animations until the sizing and position of the welcome-panel image is done
            $('html').addClass('prevent-scrolling');

            setTimeout(() => {
                $('html').addClass('stage-1'); //Stage 1 - header elements show

                setTimeout(() => {
                    $('html').addClass('stage-2'); //Stage 2 - welcome message shows, and background fills the window

                    //Cleanup
                    setTimeout(() => {
                        $('html').removeClass('prevent-scrolling loading-screen stage-1 stage-2');
                        PROFILE.welcomePanel();//running this here so it doesn't conflict with the positioning during the loading screen
                        ScrollTrigger.refresh(); //update all of the GSAP to be safe
                    }, 570);
                }, 1250);
            }, 500);
        } else {
            //The user has chosen a simpler path - reward them with +1 page access speed
            $('html').removeClass('loading-screen');
            PROFILE.welcomePanel();
        }
    },


    /// Main Menu
    mainMenu () {
        //Link obfuscation technique
        const user = 'hello.world';
        const domain = 'jeremykatlic.dev';
        const el = $('.em-link');
        el.each((i, link) => {
            link.href = 'mailto:' + user + '@' + domain;
            $(link).attr('aria-label', 'Email: ' + user + '@' + domain);
            $('.label', link).html('Email')
        });

        //**
        // Main Menu 
        // */
        const menuPanel = $('#main-menu-panel');
        const menuOpenTrigger = $('#main-menu #menu-toggle');
        const menuCloseTrigger = $('.close-trigger', menuPanel);

        //this is placed in the html so that the animation can be set in the CSS without it being visible to the user
        setTimeout(() => {
            menuPanel.removeClass('hidden');
        }, 800);

        /// Events
        $('#main-menu-panel').on('keydown', (e) => { //escape check
            if (e.key == 'Escape') {
                menuCloseTrigger.trigger('click');
            }
        });

        menuOpenTrigger.on('click', (e) => {
            const trigger = $(e.currentTarget);
            const panel = $('#' + trigger.attr('aria-controls'));

            trigger.attr('aria-expanded', true);
            panel.attr('aria-hidden', false);

            $(':focusable', panel).attr('tabindex', 0);
            $(':focusable', panel).first()[0].focus({ preventScroll: true });
        });

        menuCloseTrigger
            .on('click', (e) => {
                const trigger = $(e.currentTarget);
                const panel = $('#' + trigger.attr('aria-controls'));

                trigger.attr('aria-expanded', false);
                menuOpenTrigger.attr('aria-expanded', false).focus();
                $(':focusable', panel).attr('tabindex', -1);
                panel.attr('aria-hidden', 'true');
            })
            .on('keydown', (e) => { //menu trap
                if (!e.shiftKey && e.key == 'Tab') {
                    e.preventDefault();
                    $('#' + e.currentTarget.getAttribute('aria-controls') + ' :focusable').first().focus();
                }
            });

        //menu trap
        $(':focusable', menuPanel).first().on('keydown', (e) => { 
            if (e.shiftKey && e.key == 'Tab') {
                e.preventDefault();

                menuCloseTrigger.focus();
            }
        });
    },


    /// General Page Animations
    generalPageAnimations() {
        //A11y skip-link
        $('.skip-to-main').on('click', (e) => {
            e.preventDefault();
            //scroll the user to the first main content block on the page
            $('#welcome-panel .statement')[0].scrollIntoView({ behavior: 'smooth', block: 'center' });
            $('#welcome-panel .statement').focus();
        });

        ///Add a little parallax to the page background
        gsap.to($('.page-bg'), {
            top: -190,
            left: -90,

            scrollTrigger: {
                trigger: $('body'),
                start: "top top",
                end: "bottom bottom",
                scrub: animationScrub,
                invalidateOnRefresh: true,
                // markers: true
            }
        });
    },


    /// Welcome Panel
    welcomePanel () {
        const panel = $('#welcome-panel');

        /// Welcome title Mouse Follow
        $(document).on('mousemove', function (e) {
            const vw = window.innerWidth;
            const vh = window.innerHeight;

            const percentX = (e.clientX / vw - 0.5) * -100; // from -50% to +50%
            const percentY = (e.clientY / vh - 0.5) * -100;

            // Translate from center, plus offset
            $('#welcome-panel .title-shadow').css('transform', `translate(calc(-50% + ${percentX}px), calc(-50% + ${percentY}px))`);
        });


        //Sets up the welcome panel timeline
        let welcomePanelTimeline = gsap.timeline({
            scrollTrigger: {
                trigger: panel, //this uses the parent as the scroll trigger
                pin: $('.bg-image', panel),
                pinSpacing: false,
                start: "top top",
                endTrigger: $('.statement', panel),
                end: "center center",
                scrub: animationScrub,
                invalidateOnRefresh: true,
                anticipatePin: 1
                // markers: true
            }
        });

        //pulls the focus from the image back to the about me
        welcomePanelTimeline.to($('.bg-image', panel), { 
            scale: 0.8,
            borderRadius: 15,
            duration: 5
        }, 0);

        //creates a zoom-scale effect
        welcomePanelTimeline.to($('.bg-image img', panel), { 
            scale: 1.42,
            blur: '3px',
            duration: 5
        }, 0);

        //add some parallax to the title, and overall depth to the whole animation
        welcomePanelTimeline.to($('.title', panel), { 
            y: 220,
            opacity: 0,
            scale: 0.8,
            duration: 5
        }, 0);

        //add some parallax to the title, and overall depth to the whole animation
        welcomePanelTimeline.to($('.title-shadow', panel), {
            opacity: 0,
            duration: 1.2
        }, 0);

        //a little exit animation to pull the statement up over the background image to add more depth
        gsap.to($('.statement', panel), {
            yPercent: -50,
            scale: 0.89,
            scrollTrigger: {
                trigger: $('.statement', panel),
                start: "center-=15px center",
                end: "bottom top",
                scrub: true,
                invalidateOnRefresh: true,
                // markers: true
            }
        });


        //now that its all set, check if we should now disable it all haha
        if (!PROFILE.animationsBackboneState) {
            PROFILE.SetAnimationBackboneState(false);
        }
    },


    /// Portfolio Projects
    projects () {
        const projects = gsap.utils.toArray("#portfolio-work .project");
        
        ///Animates the card content into position
        $('.project-card', projects).each((i, card) => {
            /// These are setup server side to try and add a dynamic structure to the animations
            const { x, y, scale, start, rotate } = card.dataset;

            gsap.fromTo(card, {
                    xPercent: parseFloat(x) || -100,
                    yPercent: parseFloat(y) || -20,
                    scale: parseFloat(scale) || 0.2,
                    rotate: parseFloat(rotate) || -20
                }, 
                {
                    xPercent: 0,
                    yPercent: 0,
                    scale: 1,
                    rotate: 0,

                    scrollTrigger: {
                        trigger: card,
                        start: start || "top 60%",
                        end: (i < $('.project-card', projects).length - 1) ? "center center" : "center 70%",
                        pin: false,
                        scrub: animationScrub,
                        anticipatePin: 1,
                        // markers: true,
                        
                        /// When we start to slide them back out, straighten out the last one so it's straight
                        onEnterBack: ({ progress, direction, isActive }) => {
                            gsap.to(projects[projects.indexOf($(card).closest('.project')[0]) - 1], {
                                x: 0,
                                y: 0,
                                rotate: 0,
                                duration: 1,
                                delay: 0.25
                            });
                        }
                    }
                },
                
            );
        });

        /// Stick the card to the center of the screen
        projects.forEach((project, index) => {
            ScrollTrigger.create({
                trigger: project,
                start: "center center",
                endTrigger: $('#portfolio-work'),
                end: 'bottom bottom',
                pin: true,
                pinSpacing: false,
                invalidateOnRefresh: true,
                // markers: true,

                /// when we stick it rotate it
                onEnter: ({ progress, direction, isActive }) => {
                    if (projects.indexOf(project) > 0 && progress < 0.8){
                        gsap.to(projects[index - 1], {
                            x: Math.floor(PROFILE.GetRandomNumber(-40, 32)),
                            y: Math.floor(PROFILE.GetRandomNumber(-32, 35)),
                            rotate: PROFILE.GetRandomNumber(-8, 9),
                            duration: 0.42
                        });
                    }
                }
                // markers: true
            });
        });


        //For a11y - try to scroll the focused card into view - mainly to traverse up the page with the keyboard
        $('a', projects).each((i, cardLink) => {
            $(cardLink).on('focus', (e) => {
                if(!$('.reduce-motion').length){
                    $(e.currentTarget).closest('.pin-spacer')[0].scrollIntoView({ behavior: 'smooth', block: 'center' });
                }
            });
        });

        //for good measure
        ScrollTrigger.refresh();
    },


    /// Dark Mode
    darkMode() {
        const classString = 'dark-mode';

        /// Cookie Check - also loads in the appropriate highlight.js theme and sets the Profiles theme
        if (PROFILE.GetCookie(classString) != null && PROFILE.GetCookie(classString) == 'true') {
            $('html').addClass(classString);
            $('.dark-mode-toggle').addClass(classString);
            PROFILE.SetCodeTheme(true);
        } else {
            PROFILE.SetCodeTheme(false);
        }

        /// UI for this feature
        $('.dark-mode-toggle').on('click', (e) => {
            const toggle = $(e.currentTarget);

            if (toggle.hasClass(classString)) {
                $('html').removeClass(classString);
                toggle.removeClass(classString);
                $('.label', toggle).html('Dark Mode');
                PROFILE.SetCodeTheme(false);
                PROFILE.SetCookie(classString, false);
            } else {
                $('html').addClass(classString);
                toggle.addClass(classString);
                $('.label', toggle).html('Light Mode');
                PROFILE.SetCodeTheme(true);
                PROFILE.SetCookie(classString, true);
            }
        });

        /// Cheeky keyboard shortcut to make dev work easier - another easter egg I suppose
        $(document).on('keydown', (e) => {
            if (e.ctrlKey && e.altKey && (e.key == 'd' || e.key == '∂')) {
                $('.dark-mode-toggle').first().trigger('click');
            }
        });
    },


    /// Code View
    codeView () {
        hljs.highlightAll(); //runs Highlight.js to style all of our code

        ///
        //  Build the nested tabs
        $('#code-view .code-files').each((i, codeFiles) => {
            $(codeFiles).prepend('<div role="tablist" aria-label="Tabs for each of the code file types, each panel contains an accordion of each file\'s code"></div>');

            $('.code-file', codeFiles).each((i, codeFile) => {
                $('[role="tablist"]', codeFiles).append('<button id="' + codeFile.dataset.fileName + '-trigger" role="tab" aria-selected="false" aria-controls="' + codeFile.dataset.fileName + '-file" tabindex="-1"><span>' + $('h3', codeFile).html() + '</span></button>');
            });

            $('[role="tablist"]', codeFiles).each((i, tabElem) => {
                new TabsAutomatic(tabElem);
            });
        });

        ///
        //  Build the main tabs
        $('#code-view-tabs').prepend('<div role="tablist" aria-label="Tabs for each of the code file types, each panel contains an accordion of each file\'s code"></div>');
        $('#code-view .code-files').each((i, codeFiles) => {
            $('#code-view-tabs > [role="tablist"]').append('<button id="' + codeFiles.dataset.fileType + '-trigger" role="tab" aria-selected="false" aria-controls="' + codeFiles.dataset.fileType + '-files" tabindex="-1"><span>' + $('h2', codeFiles).html() + '</span></button>');
        });

        $('#code-view-tabs > [role="tablist"]').each((i, tabElem) => {
            new TabsAutomatic(tabElem);
        });


        ///
        // View Toggle
        let hideCodeViewTimeout = {},
            showCodeViewTimeout = {},
            tabFocusTimeout = {};

        $('.code-view-toggle')
            .on('keydown', (e) => { //a11y-trap
                if(e.currentTarget.getAttribute('aria-expanded') == 'true' && e.key == 'Tab'){
                    e.preventDefault();

                    if(e.shiftKey){
                        $('#code-view-tabs .code-files.is-active :focusable').last().focus();
                    } else {
                        $('#code-view-tabs > [role="tablist"] > [role="tab"][aria-selected="true"]').focus();
                    }
                }
            })
            .on('click', (e) => {
                const trigger = $(e.currentTarget);

                //clear old timeouts
                clearTimeout(hideCodeViewTimeout);
                clearTimeout(showCodeViewTimeout);
                clearTimeout(tabFocusTimeout);

                if(trigger.attr('aria-expanded') == 'true'){
                    trigger.attr('aria-expanded', false);
                    $('.label', trigger).html('Code View');
                    
                    $('html').removeClass('animate');

                    hideCodeViewTimeout = setTimeout(() => {
                        $('html').removeClass('show-code-view forced-prevent-scrolling');
                        ScrollTrigger.refresh();
                    }, 820);
                } else {
                    window.scrollTo({
                        top: 0,
                        left: 0,
                        behavior: 'smooth'
                    });

                    trigger.attr('aria-expanded', true);
                    $('.label', trigger).html('Live View');

                    $('html').addClass('show-code-view forced-prevent-scrolling');
                    
                    showCodeViewTimeout = setTimeout(() => {
                        $('html').addClass('animate');

                        tabFocusTimeout = setTimeout(() => { //waits for visibility to swap over
                            $('#code-view-tabs > [role="tablist"] > [role="tab"][aria-selected="true"]').focus();
                        }, 100);
                    }, 1);
                }
            });

        ///
        // Code Fullscreen Toggle
        $('#code-view .zoom-toggle')
            .on('keydown', (e) => { //a11y trap
                if (e.key == 'Tab') {

                    if (e.currentTarget.getAttribute('aria-expanded') == 'true') {
                        e.preventDefault();
                        $('code', $(e.currentTarget).closest('.zoom-box')).focus();
                    } else if (!e.shiftKey) {
                        e.preventDefault();
                        $('.code-view-toggle').focus();
                    }
                }
            })
            .on('click', (e) => {
                const trigger = e.currentTarget;
                const code = document.getElementById(trigger.getAttribute('aria-controls'));
                const state = Flip.getState(code);
                const active = (trigger.getAttribute('aria-expanded') == 'true') ? true : false;

                if(active){
                    code.classList.remove('full-screen');
                    trigger.setAttribute('aria-expanded', false);
                } else {
                    $('#code-view').addClass('full-screen-showing');
                    code.classList.add('full-screen');
                    trigger.setAttribute('aria-expanded', true);
                }

                Flip.from(state, {
                    duration: 0.7,
                    ease: 'power2.inOut',
                    absolute: true,
                    onComplete: () => {
                        if (active){
                            $('#code-view').removeClass('full-screen-showing');
                        }
                    }
                });

            });

        /// Cheeky keyboard shortcut to make dev work easier - another easter egg I suppose
        $(document).on('keydown', (e) => {
            if (e.ctrlKey && e.altKey && (e.key == 'c' || e.key == 'ç')){
                $('.code-view-toggle').first().trigger('click');
            }
        });

        ///
        // A11y trap
        $('#code-view').on('keydown', (e) => {
            if(e.key == 'Escape') {
                e.preventDefault();

                if($('#code-view').hasClass('full-screen-showing')) {
                    $('.zoom-toggle[aria-expanded="true"]', e.currentTarget).trigger('click').focus();
                } else {
                    $('.code-view-toggle').trigger('click').focus();
                }
            }
        });

        $('#code-view-tabs > [role="tablist"] > [role="tab"][aria-selected="true"]').on('keydown', (e) => {
            if(e.shiftKey && e.key == 'Tab'){
                e.preventDefault();
                $('.code-view-toggle').focus();
            }
        });
        
        $('#code-view code').on('keydown', (e) => {
            const parent = $(e.currentTarget).closest('.zoom-box');
            if(parent.hasClass('full-screen') && e.key == 'Tab'){
                e.preventDefault();
                $('.zoom-toggle', parent).focus();
            }
        });
    },


    /// Motion Toggle (reduce motion on the page)
    motionToggle () {
        /// UI for this feature
        $('.motion-toggle').on("click", (e) => {
            const trigger = e.currentTarget;

            if($(e.currentTarget).hasClass('animate-mode')){
                trigger.classList.add('reduce-mode');
                trigger.classList.remove('animate-mode');
                trigger.setAttribute('aria-label', 'Increase the motion and animations on the page');

                $('.label', trigger).html('Increase Animations');

                PROFILE.SetAnimationBackboneState(false);
                PROFILE.SetCookie('reduce-motion', true);
            } else {
                trigger.classList.remove('reduce-mode');
                trigger.classList.add('animate-mode');
                trigger.setAttribute('aria-label', 'Reduce the motion and animations on the page');

                $('.label', trigger).html('Reduce Animations');

                PROFILE.SetAnimationBackboneState(true);
                PROFILE.SetCookie('reduce-motion', false);
            }
        });

        /// Cookie check - manages PROFILE state as well
        const motionCookieState = PROFILE.GetCookie('reduce-motion');
        if (motionCookieState != null && motionCookieState == 'true') {
            $('.motion-toggle').trigger('click');
        }
    },


    /// Footer setup
    footer () {
        //run some basic CSS based animations when it hits a certain point
        ScrollTrigger.create({
            trigger: $('#main-footer'),
            start: "63% bottom",
            toggleClass: { targets: $('#main-footer'), className: "in-view" },
            // markers: true
        });
    }
}

PROFILE.init();
View of Raystown Dam in PA
Welcome!

Welcome!

With over a decade of experience in web development, I've had the opportunity to work on a variety of projects across different industries and technologies. My focus is on developing web solutions that are not just functional, but also intuitive, inclusive, and genuinely impactful for both clients and users.

These are a few of my favorite projects from the past few years that I've been fortunate enough to help bring to life. Created in partnership with skilled teams and designers, they represent my ongoing commitment to building thoughtful and impactful digital experiences.

Screenshot of Canterbury School's homepage - built while at Finalsite

Canterbury School

New Milford, Connecticut

Role: Front End Developer

Award Won
Screenshot of Gould Academy's homepage - built while at Finalsite

Gould Academy

Bethel, Maine

Role: Front End Developer

Screenshot of Tallulah Falls School's homepage - built while at Finalsite

Tallulah Falls School

Tallulah Falls, Georgia

Role: Front End Developer

Screenshot of Marin Country Day School's homepage - built while at Finalsite

Marin Country Day School

Corte Madera, California

Role: Front End Developer

Screenshot of North Cobb Christian School's homepage - built while at Finalsite

North Cobb Christian School

Kennesaw, Georgia

Role: Front End Developer

Award Won
Screenshot of Gwinnett County Public Schools's homepage - built while at Finalsite

Gwinnett County Public Schools

Suwanee, Georgia

Role: Front End Developer

Award Won
Screenshot of Saint Ignatius High School's homepage - built while at Finalsite

Saint Ignatius High School

Cleveland, Ohio

Role: Front End Developer

Award Won
Screenshot of Catherine Cook School's homepage - built while at Finalsite

Catherine Cook School

Chicago, Illinois

Role: Font End Developer

Screenshot of Orangewood Christian School's homepage - built while at Finalsite

Orangewood Christian School

Maitland, Florida

Role: Front End Developer

Award Won