About

Pierre is a seasoned front-end web developer and content project manager with extensive expertise in user experience. Excels at creating intuitive and engaging interfaces, leveraging the latest tools, and ensuring that Section 508 compliance adheres to industry standards.

If you can design it, I can code it.

Delivers exceptional user experiences that meet and exceed expectations. Provides innovative solutions tailored to meet the evolving needs of users and stakeholders alike. Relishes solving problems creatively in a fast-paced environment, consistently meeting deadlines and getting results.

Code

/*							
This JavaScript code is useful for 
creating accordion menus that are 
both accessible & usable by 
providing focus to the current 
item selected.
*/			

// document ready
$(function() {
	
	// cache objects
	const mainNavLinks = $('header').find('.main-nav > ul').children('li');
	const acc = $('main').find('.accordion');
	
	// target main nav link clicked
	$(mainNavLinks).on('click', 'a', function(){	
		$('.main-nav a').removeClass('current');
		$(this).addClass('current');
	});
	
	// show only the first panel (by default)
	$(acc).find('button').first().addClass('active');
	$(acc).find('.panel').not(':first').attr('hidden', 'hidden').hide();
	
	// update aria-expanded
	$(acc).find('button').not(':first').attr('aria-expanded', 'false');

	// on click event		
	$(acc).find('h3').on('click', 'button', function(){

		// close all other panels
		let otherButtons = $(acc).find('button').not(this); 
		$(otherButtons).removeClass('active').parent().next().slideUp(400, function() {
			toggleExpanded($(this));
			toggleHidden($(this));
		});

		// open current panel selected
		$(this).toggleClass('active').parent().next().slideToggle(400, function() {
			toggleExpanded($(this));
			toggleHidden($(this));
			focusActiveItem($(this));
		});

	});
	
});  // end ready

// functions

// toggle aria-expanded based on panel visibility
function toggleExpanded(elm){
	$(elm).prev('h3').children('button').attr('aria-expanded', $(elm).is(':visible'));
}  // end func

// toggle hidden based on panel visibility
function toggleHidden(elm){
	$(elm).css('display')==='none' ? $(elm).attr('hidden', 'hidden') : $(elm).removeAttr('hidden'); 
}  // end func

// scroll to target
function smoothScrollingTo(target) {
	const root = $('html, body');	
	$(root).stop().animate({ scrollTop: $(target).offset().top - 10 }, 200);
}  // end func

// shift focus to current active item
function focusActiveItem(elm){   	
	const tgtCodeSect = $('main').find('section:nth-of-type(2)');
	let allActiveBtns = $(tgtCodeSect).children('.accordion').find('button').hasClass('active'), 
	tgtActiveBtn = $(elm).prev('h3').children('button');

	// if no items are active then scroll to top of code section
	// else scroll to top of active item
	!allActiveBtns ? smoothScrollingTo(tgtCodeSect) : smoothScrollingTo(tgtActiveBtn);
}  // end func

/*
This styling code is useful for 
overlaying text on top of 
background images, which provides 
an accessible solution when 
combining text & graphics.
*/

/* site container */
.container {  
	--max-width: 960px; 
	width: min(100% - 2rem, var(--max-width));
	margin-inline: auto;
	@media (min-width: 1024px){ width: min(100%, var(--max-width)); }
}

.infoGraphic { margin-block: 1em .75em; }
.infoGraphic :is(p, h2) { margin: 0; }	
.infoGraphic h2 { 
	font-size: clamp(1.25rem, 4vw, 1.5rem);
	line-height: 1.25;
}

[class*="col-"] {
	margin: 1.5em 0 .2142857em;
	display: grid;
	grid-template-columns: 1fr;
	gap: 21px;
}

.col-33-66 p {
	padding: .5em;
	font-weight: 700;
	font-size: 110%;
	line-height: 1.4;
	color: #FFF;
	background-color: #024b82;	
}

/* one-third two-third col layout */
@media (min-width: 634px) { 
	.col-33-66 { grid-template-columns: 306px 1fr; }
	.col-33-66 p { height: 230px; }
}

/* three col layout */
.col-3 { grid-template-columns: repeat(auto-fit, minmax(auto, 306px)); }

/* two-third one-third col layout */		
.col-66-33-spec > div:nth-of-type(2), 
.col-66-33-spec > div:nth-of-type(3) { max-width: 306px; }
	
@media (min-width: 726px) { 
	.col-66-33-spec { grid: repeat(2, 105px) / 1fr 306px; }
	.col-66-33-spec > div:first-of-type { grid-area: 1 / 1 / 3 / 2; }
	.col-66-33-spec > div:nth-of-type(2) { grid-area: 1 / 2 / 2 / 3; }
	.col-66-33-spec > div:nth-of-type(3) { grid-area: 2 / 2 / 3 / 3; }
}

/* info graphics */
[class*="Txt"] {
	position: relative;
	display: block;	
	height: 230px;
	transition: all .4s ease-out;
}

.infoTxt {
	background: #40B5EA 50% 50% no-repeat;
	background-size: cover;  
}

[class*="Txt"]:hover, 
[class*="Txt"]:focus { filter: saturate(150%); } 
	
[class*="Txt"] > h2 {
	position: absolute;
	left: .75em;
	bottom: .5em; 
	text-transform: uppercase;
	color: #FFF;
}
	
.plainTxt.three > h2:first-of-type { bottom: 3.5em; }
.plainTxt.three > h2:nth-of-type(2) { bottom: 2em; }
	
.plainTxt.half { height: 105px; }
	
.graphic1 { background-image:url('../img/info_graphic1.jpg'); }
.graphic2 { background-image:url('../img/info_graphic2.jpg'); }
.graphic3 { background-image:url('../img/info_graphic3.jpg'); }
.graphic4 { background-image:url('../img/info_graphic4.jpg'); }
.graphic5 { background-image:url('../img/info_graphic5.jpg'); }
.graphic6 { background-image:url('../img/info_graphic6.jpg'); }
.three { background-color: #3CB87A; }
.faq, .contact { background-color: #468BCC; }

/*								
This JavaScript code is useful for 
mobile display by utilizing a 
fully accessible off-canvas menu 
to toggle the hamburger style menu 
(can also toggle w/ the escape 
key). This code also resets the 
off-canvas menu (when switching 
out of mobile view).
*/

// document ready
$(function() {

    // add class .js if JS is enabled
    $('html').first().removeClass('no-js').addClass('js');

    // cache menu objects
    const menuLink = $('header[role="banner"]').find('button'), 
    bod = $('body');

    // set up the click behavior
    menuLink.on('click', function(){
        toggleExpanded($(this));
        toggleNav($(this), bod);
    });

    // toggle hamburger menu & body w/ escape key  
    function toggleHandler(e){
        if(e.keyCode == 27){		
            toggleExpanded(menuLink);
            toggleNav(menuLink, bod);
        } 
    }

    // check for smaller screen width 
    function checkSmallScreen(){
        const mq = window.matchMedia("(max-width: 767px)");
        mq.matches ? $(document).on('keyup', toggleHandler) : $(document).off('keyup');
    }

    checkSmallScreen();           
    $(window).resize(checkSmallScreen);

    // reset the hamburger menu (when switching from mobile to tablet/desktop view)
    $(window).resize(function(){
        var width = $(this).width();
        if(width >= 768 && bod.hasClass('active')){    
            menuLink.add(bod).removeClass('active')
                .end()
            .prop('ariaExpanded', 'false')
                .end()
            .find('i').eq(0).removeClass('fa-times').addClass('fa-bars');
        }

    });

});  // end ready 

// functions

// toggle aria-expanded
function toggleExpanded(elm){
    $(elm).attr('aria-expanded', $(elm).attr('aria-expanded') == 'true' ? 'false' : 'true');
}  // end func

// toggle hamburger menu & body
function toggleNav(elm, bodyElm){
    $(elm).add(bodyElm).toggleClass('active')
        .end()
    .find('i').eq(0).toggleClass('fa-bars fa-times');   
}  // end func

Skills

Content Management

  • ColdFusion
  • Adobe Experience Manager (AEM)
  • SEO/Web Analytics – Adobe

Technical Development

  • HTML5
  • CSS4
  • Bootstrap
  • jQuery
  • JSON
  • Angular
  • PHP
  • XML
  • Git
  • UI Design
  • Responsive Web Design

Other Software

  • Photoshop
  • Microsoft Office Suite
  • Dreamweaver
  • Eclipse
  • Visual Studio

Back to Top