|
291 | 291 | .privacy .lock{font-size:2.4rem;margin-bottom:14px} |
292 | 292 | .privacy code{color:var(--amber-bright);font-size:.9em} |
293 | 293 |
|
| 294 | + /* ---------- house ad (T71) ---------- |
| 295 | + All of the spacing is the slot's own margin, so a slot the loader collapses — an |
| 296 | + unreachable catalogue, a browser with no shadow DOM — takes the gap with it instead |
| 297 | + of leaving a blank strip above the footer. |
| 298 | +
|
| 299 | + min-height is the loader's reserved height for the in-content format, declared here |
| 300 | + as well because the loader only reserves once its script has run: without it the |
| 301 | + banner would arrive into a box of zero height and push the footer down the page. |
| 302 | + Nothing else is styled — the banner is drawn inside a shadow root and this stylesheet |
| 303 | + cannot reach it, which is the point of the slot having one. */ |
| 304 | + .ad{max-width:780px;min-height:140px;margin:8px auto 0} |
| 305 | + |
294 | 306 | /* ---------- footer ---------- */ |
295 | 307 | footer{border-top:1px solid var(--line);padding:46px 0 38px;margin-top:30px} |
296 | 308 | .foot-grid{display:flex;justify-content:space-between;align-items:center;gap:24px;flex-wrap:wrap} |
@@ -748,6 +760,26 @@ <h3>A demo cast</h3> |
748 | 760 | </div> |
749 | 761 | </section> |
750 | 762 |
|
| 763 | +<!-- HOUSE AD (T71) — above the footer rather than inside it: it belongs to the end of the |
| 764 | + page's content, not to the chrome. The container stays empty; the loader attaches a |
| 765 | + shadow root and draws inside that, so this stylesheet cannot reach the banner and the |
| 766 | + banner cannot leak into the page. |
| 767 | +
|
| 768 | + data-ad-theme is fixed because this page is: there is no toggle to follow, and "auto" |
| 769 | + would hand a reader on a light OS a light card on a dark page. |
| 770 | + data-ad-memory keeps the loader out of localStorage, so there is nothing to declare. |
| 771 | + data-ad-exclude is how a site stays off its own slot — see §T71 for why the catalogue |
| 772 | + cannot do it for us. --> |
| 773 | +<div class="wrap"> |
| 774 | + <div class="ad" |
| 775 | + data-japode-ads |
| 776 | + data-ad-format="in-content" |
| 777 | + data-ad-slot="page-end" |
| 778 | + data-ad-theme="dark" |
| 779 | + data-ad-memory="off" |
| 780 | + data-ad-exclude="commitclerk"></div> |
| 781 | +</div> |
| 782 | + |
751 | 783 | <!-- FOOTER --> |
752 | 784 | <footer> |
753 | 785 | <div class="wrap"> |
@@ -806,6 +838,11 @@ <h3>A demo cast</h3> |
806 | 838 | </div> |
807 | 839 | </footer> |
808 | 840 |
|
| 841 | +<!-- The house ad loader (T71). Async and last: it never blocks the page, it makes one |
| 842 | + request however many slots it finds, and if it cannot be reached the slot above |
| 843 | + collapses itself rather than leaving an empty frame. --> |
| 844 | +<script src="https://ads.japode.com/v1/ads.js" async></script> |
| 845 | + |
809 | 846 | <script> |
810 | 847 | // reveal-on-scroll |
811 | 848 | const io = new IntersectionObserver((entries)=>{ |
|
0 commit comments