- Robust scroll-reveal: replace observer-only reveal (which stranded below-fold .reveal blocks at opacity:0 while they still occupied layout height, producing a huge dead band before the footer) with an instant in-view pass + scroll/resize/load listeners + safety-net full reveal. Applied identically to all 8 page templates. Never strands content; fixes the invisible hero text and the giant empty band. - Imageless hero: cap to a compact 520px (380px mobile) letterboxed text plate with a token spotlight backdrop instead of a 75vh empty void. Height moved to a raw manifest CSS class (JIT-scan-independent). - Mobile safety net: raw @media(max-width:640px) rules force the events, membership and feature-grid layouts to a single column so a dropped responsive Tailwind prefix can never strand a wide grid on a phone. - Shorten reveal transition .7s -> .5s for screenshot-safe opacity. check-safety: 32 checks 19 ok 13 skip -> OK; codeless build exit 0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
21 lines
2.1 KiB
Plaintext
21 lines
2.1 KiB
Plaintext
<!doctype html>
|
|
<html lang="en" class="{% if theme_mode == "dark" %}dark{% endif %}">
|
|
{{ head_html|safe }}
|
|
<body class="bg-background text-foreground antialiased min-h-screen flex flex-col film-grain" style="font-family: var(--font-body, "Cormorant Garamond", "Cormorant", Georgia, serif);">
|
|
{{ admin_banner_html|safe }}
|
|
<header class="w-full">
|
|
<div class="max-w-5xl mx-auto px-4">{{ slots.header|safe }}</div>
|
|
</header>
|
|
<main class="flex-grow max-w-3xl mx-auto w-full px-4 py-12 md:py-16">
|
|
{% if slots.main %}{{ slots.main|safe }}{% else %}<div class="py-20 text-center"><p class="italic" style="color:hsl(var(--muted-foreground));">No content blocks assigned to this page.</p></div>{% endif %}
|
|
</main>
|
|
<footer class="w-full mt-auto border-t border-[hsl(var(--primary)/0.35)]">
|
|
<div class="max-w-5xl mx-auto px-4">{{ slots.footer|safe }}</div>
|
|
</footer>
|
|
{{ body_end_html|safe }}
|
|
<script>
|
|
(function(){if(window.__gothamMotion)return;window.__gothamMotion=1;var d=document,root=d.documentElement;root.classList.add('gotham-js');var reduce=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;function pending(){return d.querySelectorAll('.reveal:not(.is-visible)');}function reveal(el){el.classList.add('is-visible');}function inView(){var h=window.innerHeight||root.clientHeight;pending().forEach(function(el){var r=el.getBoundingClientRect();if(r.top<h*1.05&&r.bottom>-h*0.25)reveal(el);});}function all(){pending().forEach(reveal);}function run(){if(reduce){all();return;}inView();window.addEventListener('scroll',inView,{passive:true});window.addEventListener('resize',inView,{passive:true});window.addEventListener('load',function(){inView();setTimeout(inView,120);},{once:true});setTimeout(inView,400);setTimeout(all,2600);d.querySelectorAll('[data-spotlight]').forEach(function(s){s.addEventListener('pointermove',function(ev){var r=s.getBoundingClientRect();s.style.setProperty('--sx',((ev.clientX-r.left)/r.width*100)+'%');s.style.setProperty('--sy',((ev.clientY-r.top)/r.height*100)+'%');});});}if(d.readyState!='loading')run();else d.addEventListener('DOMContentLoaded',run);})();
|
|
</script>
|
|
</body>
|
|
</html>
|