feature: Refactor footer layout and styles for improved design consistency
Sync TODOs with Issues / sync_todos (push) Successful in 6s

This commit is contained in:
Keith Solomon
2026-06-06 22:55:32 -05:00
parent df0a499630
commit d3e879c439
9 changed files with 168 additions and 193 deletions
+62 -74
View File
@@ -23,87 +23,75 @@ $footerNav = ! empty( $locations['footer_navigation'] )
</main> </main>
<footer role="contentinfo" class="site-footer bg-gray-800 text-white text-base"> <footer role="contentinfo" class="site-footer bg-cwc-blue-02 text-white pt-16 pb-12 text-base">
<div class="pt-16 pb-12 text-base"> <div class="container mx-auto grid grid-cols-4 gap-6">
<div class="container mx-auto"> <div class="max-w-[40ch]">
<div class="grid grid-cols-4 gap-6 md:grid-cols-8 lg:grid-cols-12"> <h2 id="footer-header" class="max-w-64 h-auto">
<div class="col-span-4 md:col-span-8 lg:col-span-4 max-w-[40ch] prose-p:text-14px prose-p:mb-4 text-balance" aria-labelledby="footer-header"> <a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="site-footer__logo-link h-full w-full">
<h2 id="footer-header" class="max-w-64 h-auto"> <?php if ( $footerLogo ) { ?>
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="site-footer__logo-link h-full w-full"> <img src="<?php echo esc_url( $footerLogo ); ?>" alt="<?php echo esc_attr( get_bloginfo( 'name' ) ); ?>" class="site-footer__logo-image" />
<?php if ( $footerLogo ) { ?> <?php
<img src="<?php echo esc_url( $footerLogo ); ?>" alt="<?php echo esc_attr( get_bloginfo( 'name' ) ); ?>" class="site-footer__logo-image" /> } else {
<?php echo esc_html( get_bloginfo( 'name' ) );
} else { }
echo esc_html( get_bloginfo( 'name' ) ); ?>
} </a>
?> </h2>
</a> </div>
</h2>
<div id="footer-description" aria-label="Footer description"> <div id="footer-nav" aria-labelledby="footer-navigation">
<?php echo wp_kses_post( $footerDesc ); ?> <?php if ( $footerNav ) : ?>
</div> <nav class="site-footer__nav" aria-label="Footer navigation">
<ul class="site-footer__nav-list">
<?php foreach ( $footerNav as $item ) : ?>
<li class="site-footer__nav-item list-none text-left <?php echo esc_attr( implode( ' ', $item->classes ) ); ?>">
<a href="<?php echo esc_url( $item->url ); ?>" class="site-footer__nav-link">
<?php echo esc_html( $item->title ); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</nav>
<?php endif; ?>
</div>
<div class="social-links mt-8"> <div aria-labelledby="footer-area-1" class="prose-p:text-balance">
<?php <div id="footer-description" aria-label="Footer description">
get_template_part( <?php echo wp_kses_post( $footerDesc ); ?>
'views/partials/social-media', </div>
null,
array(
'circle' => false,
'classes' => 'social-icons p-0 mr-2 text-30px text-gray-300! hover:text-info!',
)
);
?>
</div>
</div>
<div id="footRight" class="col-span-4 md:col-span-8 grid md:grid-cols-4 gap-10 lg:justify-end"> <?php dynamic_sidebar( 'footer-1' ); ?>
<div aria-labelledby="footer-area-1" class="prose-p:text-balance"> </div>
<h3 class="mb-4 pb-2 border-b border-b-secondary font-bold text-white" id="footer-area-1">Footer Area 1</h3>
<?php dynamic_sidebar( 'footer-1' ); ?>
</div>
<div aria-labelledby="footer-area-2" class="prose-p:text-balance"> <div class="text-right flex flex-col justify-end items-end">
<h3 class="mb-4 pb-2 border-b border-b-secondary font-bold text-white" id="footer-area-2">Footer Area 2</h3> <?php dynamic_sidebar( 'footer-2' ); ?>
<?php dynamic_sidebar( 'footer-2' ); ?>
</div>
<div aria-labelledby="footer-area-3" class="prose-p:text-balance"> <x-back-to-top></x-back-to-top>
<h3 class="mb-4 pb-2 border-b border-b-secondary font-bold text-white" id="footer-area-3">Footer Area 3</h3>
<?php dynamic_sidebar( 'footer-3' ); ?>
</div>
<div id="footer-nav" aria-labelledby="footer-navigation"> <div class="social-links mt-12">
<h3 class="mb-4 pb-2 border-b border-b-secondary font-bold text-white" id="footer-navigation"><?php echo esc_html__( 'Navigation' ); ?></h3> <?php
<?php if ( $footerNav ) : ?> get_template_part(
<nav class="site-footer__nav" aria-label="Footer navigation"> 'views/partials/social-media',
<ul class="site-footer__nav-list"> null,
<?php foreach ( $footerNav as $item ) : ?> array(
<li class="site-footer__nav-item list-none text-left <?php echo esc_attr( implode( ' ', $item->classes ) ); ?>"> 'circle' => true,
<a href="<?php echo esc_url( $item->url ); ?>" class="site-footer__nav-link"> 'classes' => 'social-icons p-0 text-18px',
<?php echo esc_html( $item->title ); ?> )
</a> );
</li> ?>
<?php endforeach; ?> </div>
</ul>
</nav>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
<div class="copyright bg-primary text-white text-center py-3 text-14px"> <div class="copyright text-white text-right py-3 text-12px">
<?php <?php
if ( $copyright ) { if ( $copyright ) {
echo wp_kses_post( $copyright ); echo wp_kses_post( $copyright );
} else { } else {
echo esc_html( '&copy; ' . gmdate( 'Y' ) . ' ' . get_bloginfo( 'name' ) . '.' ); echo esc_html( '&copy; ' . gmdate( 'Y' ) . ' ' . get_bloginfo( 'name' ) . '.' );
} }
?> ?>
</div> </div>
</div>
</div>
</footer> </footer>
<?php wp_footer(); ?> <?php wp_footer(); ?>
+11 -13
View File
@@ -2,23 +2,21 @@
class BackToTopButton extends HTMLElement { class BackToTopButton extends HTMLElement {
connectedCallback() { connectedCallback() {
this.innerHTML = ` this.innerHTML = `
<button id="backToTopBtn" aria-label="Back to top" class="back-to-top" style=""> <button id="backToTopBtn" aria-label="Back to top" class="back-to-top" style=""><i class="icon-arrow-upward"></i></button>
↑ Top
</button>
`; `;
const btn = this.querySelector('#backToTopBtn'); const btn = this.querySelector('#backToTopBtn');
let previousScrollY = window.scrollY; // let previousScrollY = window.scrollY;
window.addEventListener('scroll', () => { // window.addEventListener('scroll', () => {
const currentScrollY = window.scrollY; // const currentScrollY = window.scrollY;
const isScrollingUp = currentScrollY < previousScrollY; // const isScrollingUp = currentScrollY < previousScrollY;
const shouldShowButton = currentScrollY > 300 && isScrollingUp; // const shouldShowButton = currentScrollY > 300 && isScrollingUp;
btn.style.display = shouldShowButton ? 'block' : 'none'; // btn.style.display = shouldShowButton ? 'block' : 'none';
previousScrollY = currentScrollY; // previousScrollY = currentScrollY;
}); // });
btn.addEventListener('click', () => { btn.addEventListener('click', () => {
window.scrollTo({ top: 0, behavior: 'smooth' }); window.scrollTo({ top: 0, behavior: 'smooth' });
@@ -27,7 +25,7 @@ class BackToTopButton extends HTMLElement {
} }
export function registerBackToTopButton() { export function registerBackToTopButton() {
if (!customElements.get('back-to-top')) { if (!customElements.get('x-back-to-top')) {
customElements.define('back-to-top', BackToTopButton); customElements.define('x-back-to-top', BackToTopButton);
} }
} }
+36 -36
View File
@@ -10,41 +10,41 @@ import Navigation from './modules/Navigation.js';
// Add passive event listeners // Add passive event listeners
! function (e) { ! function (e) {
"function" == typeof define && define.amd ? define(e) : e() "function" == typeof define && define.amd ? define(e) : e()
}(function () { }(function () {
let e; let e;
const t = ["scroll", "wheel", "touchstart", "touchmove", "touchenter", "touchend", "touchleave", "mouseout", "mouseleave", "mouseup", "mousedown", "mousemove", "mouseenter", "mousewheel", "mouseover"]; const t = ["scroll", "wheel", "touchstart", "touchmove", "touchenter", "touchend", "touchleave", "mouseout", "mouseleave", "mouseup", "mousedown", "mousemove", "mouseenter", "mousewheel", "mouseover"];
if (function () { if (function () {
let e = !1; let e = !1;
try { try {
const t = Object.defineProperty({}, "passive", { const t = Object.defineProperty({}, "passive", {
get: function () { get: function () {
e = !0 e = !0
} }
}); });
window.addEventListener("test", null, t); window.addEventListener("test", null, t);
window.removeEventListener("test", null, t); window.removeEventListener("test", null, t);
} catch (e) { } } catch (e) { }
return e return e
}()) { }()) {
const n = EventTarget.prototype.addEventListener; const n = EventTarget.prototype.addEventListener;
e = n; e = n;
EventTarget.prototype.addEventListener = function (n, o, r) { EventTarget.prototype.addEventListener = function (n, o, r) {
let i; let i;
const s = "object" == typeof r && null !== r, const s = "object" == typeof r && null !== r,
u = s ? r.capture : r; u = s ? r.capture : r;
if (s) { if (s) {
const t = Object.getOwnPropertyDescriptor(r, "passive"); const t = Object.getOwnPropertyDescriptor(r, "passive");
r = t && !0 !== t.writable && void 0 === t.set ? { ...r } : r; r = t && !0 !== t.writable && void 0 === t.set ? { ...r } : r;
} else { } else {
r = {}; r = {};
} }
r.passive = void 0 !== (i = r.passive) ? i : -1 !== t.indexOf(n) && !0; r.passive = void 0 !== (i = r.passive) ? i : -1 !== t.indexOf(n) && !0;
r.capture = void 0 !== u && u; r.capture = void 0 !== u && u;
e.call(this, n, o, r); e.call(this, n, o, r);
}; };
EventTarget.prototype.addEventListener._original = e EventTarget.prototype.addEventListener._original = e
} }
}); });
/** /**
@@ -69,8 +69,8 @@ document.addEventListener('DOMContentLoaded', () => {
GetHeaderHeight(); GetHeaderHeight();
// Add Back to Top button to body // Add Back to Top button to body
const backToTop = document.createElement('back-to-top'); // const backToTop = document.createElement('x-back-to-top');
document.body.appendChild(backToTop); // document.body.appendChild(backToTop);
}); });
console.log(`theme.js loaded.`); console.log(`theme.js loaded.`);
+3 -3
View File
@@ -7,9 +7,9 @@
--color-background: oklch(89.75% 0 0); --color-background: oklch(89.75% 0 0);
--color-text: var(--color-black); --color-text: var(--color-black);
--color-cwc-blue-01: oklch(47.31% 0.1141 242.9); --color-cwc-blue-01: oklch(47.31% 0.1141 242.9);
--color-cwc-blue-02: oklch(28.99% 0.0614 237.9); --color-cwc-blue-02: oklch(28.99% 0.0614 237.9);
--color-cwc-blue-03: oklch(80.63% 0.0724 230.4); --color-cwc-blue-03: oklch(80.63% 0.0724 230.4);
--color-cwc-orange-01: oklch(63.53% 0.1751 29.61); --color-cwc-orange-01: oklch(63.53% 0.1751 29.61);
--color-primary: var(--color-cwc-blue-01); --color-primary: var(--color-cwc-blue-01);
+2
View File
@@ -20,6 +20,7 @@
* Font sizes at standard viewport widths: * Font sizes at standard viewport widths:
* | 360px | 640px | 768px | 1024px | 1280px | 1440px | 1920px * | 360px | 640px | 768px | 1024px | 1280px | 1440px | 1920px
* --------- | ----- | ----- | ----- | ------ | ------ | ------ | ------ * --------- | ----- | ----- | ----- | ------ | ------ | ------ | ------
* text-12px | 10.00 | 10.36 | 10.52 | 10.85 | 11.18 | 11.38 | 12.00
* text-14px | 12.00 | 12.36 | 12.52 | 12.85 | 13.18 | 13.38 | 14.00 * text-14px | 12.00 | 12.36 | 12.52 | 12.85 | 13.18 | 13.38 | 14.00
* text-16px | 14.00 | 14.36 | 14.52 | 14.85 | 15.18 | 15.38 | 16.00 * text-16px | 14.00 | 14.36 | 14.52 | 14.85 | 15.18 | 15.38 | 16.00
* text-18px | 16.00 | 16.36 | 16.52 | 16.85 | 17.18 | 17.38 | 18.00 * text-18px | 16.00 | 16.36 | 16.52 | 16.85 | 17.18 | 17.38 | 18.00
@@ -41,6 +42,7 @@
--line-height: 1.6; --line-height: 1.6;
--text-base: 1rem; --text-base: 1rem;
--text-12px: round(down, clamp(0.625rem, 0.5962rem + 0.1282vw, 0.75rem), 1px);
--text-14px: round(up, clamp(0.75rem, 0.7212rem + 0.1282vw, 0.875rem), 2px); --text-14px: round(up, clamp(0.75rem, 0.7212rem + 0.1282vw, 0.875rem), 2px);
--text-16px: round(up, clamp(0.875rem, 0.8462rem + 0.1282vw, 1rem), 2px); --text-16px: round(up, clamp(0.875rem, 0.8462rem + 0.1282vw, 1rem), 2px);
--text-18px: round(up, clamp(1rem, 0.9712rem + 0.1282vw, 1.125rem), 2px); --text-18px: round(up, clamp(1rem, 0.9712rem + 0.1282vw, 1.125rem), 2px);
+28 -32
View File
@@ -76,24 +76,6 @@
.btn:active, .button:active { transform: scale(99%); } .btn:active, .button:active { transform: scale(99%); }
/* Back To Top Button */
#backToTopBtn {
background: var(--color-primary);
border: none;
border-radius: 2em;
bottom: 2rem;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
color: #fff;
cursor: pointer;
display: none;
font-size: 1.1rem;
padding: 0.75em 1.5em;
position: fixed;
right: 2rem;
transition: opacity 0.2s;
z-index: 1000;
}
/** /**
* Variants * Variants
* *
@@ -159,21 +141,35 @@ x-button:has(.button[data-button-width="full"]) { @apply w-full; }
--button-hover-color: var(--color-dark); --button-hover-color: var(--color-dark);
} }
.back-to-top { /* Back To Top Button */
background: var(--color-primary, #3857BC); #backToTopBtn {
border: none; align-items: center;
border-radius: 2em; background: var(--color-secondary);
box-shadow: 0 2px 8px rgba(0,0,0,0.15); border: 1px solid transparent;
color: #fff; border-radius: 100%;
color: var(--color-white);
cursor: pointer; cursor: pointer;
font-size: 1.1rem; display: flex;
opacity: 0.85; font-size: 1rem;
padding: 0.75em 1.5em; height: 1rem;
justify-content: center;
line-height: 1;
outline: 1px solid transparent;
padding: 1rem;
transition: opacity 0.2s, background 0.2s; transition: opacity 0.2s, background 0.2s;
} width: 1rem;
.back-to-top:hover, .back-to-top:focus { i {
background: var(--color-info, #233a7a); font-weight: bold;
opacity: 1; display: inline-block;
outline: 2px solid var(--color-info, #233a7a); margin: -4px 0 0 0;
}
&:hover, &:focus {
background: var(--color-secondary-800);
border: 1px solid var(--color-secondary);
color: var(--color-white);
opacity: 1;
outline: 1px solid var(--color-secondary);
}
} }
+10 -30
View File
@@ -1,41 +1,21 @@
/* Footer styles */ /* Footer styles */
.site-footer { .site-footer {
#footRight { border-bottom: 1rem solid var(--color-orange, #F26B53);
div {
@apply col-span-1 md:col-span-4 lg:col-span-1;
h3 { a { @apply text-white transition-colors duration-300 hover:text-secondary-400 focus-visible:text-secondary-400; }
@apply font-bold text-secondary-300 text-20px mb-4 pb-2 border-b border-b-secondary-300
}
a {
@apply text-footlinks hover:opacity-60;
}
}
.widget { .widget {
li { li { @apply text-16px my-1 mb-2 leading-4; }
@apply text-16px my-1 mb-2 leading-4;
}
h4 { h4 { @apply font-bold text-18px text-secondary mb-2; }
@apply font-bold text-18px text-secondary mb-2;
}
a {
@apply transition-colors duration-300 hover:text-success focus-visible:text-success;
}
} }
.menu-footer-menu-container { .menu-footer-menu-container { @apply grow; }
@apply grow;
.copyright {
p { @apply text-white leading-none m-0 p-0; }
a { @apply text-white hover:text-primary-500 underline underline-offset-2; }
} }
}
.copyright {
p { @apply leading-none m-0 p-0; }
a { @apply text-white hover:text-primary-500 underline underline-offset-2; }
}
} }
+16 -4
View File
@@ -26,7 +26,8 @@ Lineicons regular icon font
/* For safety - reset parent styles, that can break glyph codes*/ /* For safety - reset parent styles, that can break glyph codes*/
font-variant: normal; font-variant: normal;
text-transform: none; text-transform: none;
font-size: 120%; font-size: 110%;
line-height: 1;
/* Font smoothing. That was taken from TWBS */ /* Font smoothing. That was taken from TWBS */
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
@@ -37,11 +38,21 @@ Lineicons regular icon font
*/ */
} }
.social-links{
@apply flex flex-row justify-end w-full;
a {
margin-right: 1rem;
&:last-child { margin-right: 0 !important; }
}
}
/* Circular Icons */ /* Circular Icons */
.circular-icon { .circular-icon {
@apply box-content bg-secondary rounded-full text-gray-800 inline-block; @apply box-content bg-secondary rounded-full text-white flex justify-center items-center;
--size: 3rem; --size: 2rem;
height: var(--size); height: var(--size);
text-align: center; text-align: center;
width: var(--size); width: var(--size);
@@ -49,7 +60,8 @@ Lineicons regular icon font
i { i {
display: inline-block; display: inline-block;
height: var(--size); height: var(--size);
line-height: var(--size); line-height: 1;
margin-top: 0.5rem;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
width: var(--size); width: var(--size);
@@ -52,5 +52,4 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview );
></x-button> ></x-button>
<?php endif; ?> <?php endif; ?>
</div> </div>
</section> </section>