Merge nucleic/keen-willow-panda-3uc2 into main

Mirrored from corpo ca1549a.
This commit is contained in:
2026-08-10 22:07:48 -07:00
parent bfb3c05362
commit 58e451a7eb
+29 -2
View File
@@ -144,7 +144,7 @@ const canonical = new URL('/', Astro.site);
</section> </section>
</main> </main>
<footer class="footer"> <footer class="footer" data-footer>
<p>© 2026 Blakeslee Research</p> <p>© 2026 Blakeslee Research</p>
<div class="footer-links"> <div class="footer-links">
<a href="mailto:[email protected]">Contact</a> <a href="mailto:[email protected]">Contact</a>
@@ -823,8 +823,18 @@ const canonical = new URL('/', Astro.site);
.footer { .footer {
padding-top: 1rem; padding-top: 1rem;
border-top: 1px solid var(--line); border-top: 1px solid var(--line);
}
/* The stack is the journey to the site's closing information. Enhancement adds
this class before first paint; until its final card is active the footer cannot
visually signal that the page has already ended. */
.footer.is-awaiting-final-card {
opacity: 0; opacity: 0;
animation: fade-in 700ms 1.1s ease-out forwards; pointer-events: none;
}
.footer.is-footer-revealed {
animation: fade-in 500ms ease-out forwards;
} }
.footer p { .footer p {
@@ -1095,6 +1105,7 @@ const canonical = new URL('/', Astro.site);
<script> <script>
const technologyStack = document.querySelector<HTMLElement>('[data-technology-stack]'); const technologyStack = document.querySelector<HTMLElement>('[data-technology-stack]');
const footer = document.querySelector<HTMLElement>('[data-footer]');
const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)'); const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
if (technologyStack && 'IntersectionObserver' in window && !reducedMotion.matches) { if (technologyStack && 'IntersectionObserver' in window && !reducedMotion.matches) {
@@ -1111,6 +1122,9 @@ const canonical = new URL('/', Astro.site);
heroLead?.classList.add('has-scroll-stack'); heroLead?.classList.add('has-scroll-stack');
hero?.classList.add('has-scroll-story'); hero?.classList.add('has-scroll-story');
technologyStack.classList.add('is-scroll-stack'); technologyStack.classList.add('is-scroll-stack');
footer?.classList.add('is-awaiting-final-card');
footer?.setAttribute('aria-hidden', 'true');
footer?.setAttribute('inert', '');
let stackWrappedBelow = false; let stackWrappedBelow = false;
@@ -1217,6 +1231,18 @@ const canonical = new URL('/', Astro.site);
{ passive: true }, { passive: true },
); );
let footerRevealed = false;
const revealFooter = () => {
if (!footer || footerRevealed) return;
footerRevealed = true;
footer.classList.remove('is-awaiting-final-card');
footer.classList.add('is-footer-revealed');
footer.removeAttribute('aria-hidden');
footer.removeAttribute('inert');
};
const activateTechnology = (index: number) => { const activateTechnology = (index: number) => {
cards.forEach((card, cardIndex) => { cards.forEach((card, cardIndex) => {
const isActive = cardIndex === index; const isActive = cardIndex === index;
@@ -1226,6 +1252,7 @@ const canonical = new URL('/', Astro.site);
}); });
if (progressCurrent) progressCurrent.textContent = String(index + 1).padStart(2, '0'); if (progressCurrent) progressCurrent.textContent = String(index + 1).padStart(2, '0');
if (index === cards.length - 1) revealFooter();
}; };
activateTechnology(0); activateTechnology(0);