themes-gotham/templates/gotham/article.ninjatpl
Alex Dunmow f5af05fd5f fix(gotham): noir remediation — SVG geometry guards, shortcode→SVG, hero string-vs-object, reveal no-scroll fallback, deeper blacks, seed media
- Replace ::icon:: shortcodes with explicit sized <svg><use> (events_marquee,
  membership_tiers, button, hours-location, divider).
- Add width/height presentation attrs to every <use> SVG (recipe 4d guard).
- hero: field.text -> field|get:"text"|default:field (bare-string seed fields
  no longer error the block to EMPTY — About orphaned-rule root cause).
- reveal script: rAF kick + all() no-scroll fallback 2600ms -> 650ms across all
  templates so above/below-fold content never strands invisible without scroll.
- article: render aside + vertical divider only when slots.aside is non-empty
  (kills the empty fenced right column); narrow single-column when no aside.
- presets: deeper near-black backgrounds, higher-contrast foregrounds, richer
  brass/gold accents across all five palettes (light + dark).
- divider/quote: retire busy reel-strip sunburst for clean centred gold rules.
- seed: longer members-club articles; wire licensed noir stock imagery
  (bar-scene B&W hero, bar-shelf About, bar-interior/dark-lounge blog cards).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:31:20 +08:00

24 lines
2.5 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, &quot;Cormorant Garamond&quot;, &quot;Cormorant&quot;, Georgia, serif);">
{{ admin_banner_html|safe }}
<header class="w-full">
<div class="max-w-3xl mx-auto px-4">{{ slots.header|safe }}</div>
</header>
<div class="flex-grow grid gap-12 w-full px-4 py-12 md:py-16 {% if slots.aside %}max-w-5xl mx-auto md:grid-cols-[2fr_1fr]{% else %}max-w-2xl mx-auto{% endif %}">
<main class="prose max-w-none">
{% if slots.main %}<article class="reel-dropcap" data-reel-dropcap="true">{{ slots.main|safe }}</article>{% 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>
{% if slots.aside %}<aside class="w-full md:border-l md:border-[hsl(var(--primary)/0.3)] md:pl-10">{{ slots.aside|safe }}</aside>{% endif %}
</div>
<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();if(window.requestAnimationFrame){requestAnimationFrame(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,650);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>