- Token sweep: exact-value gold literals now use --wg-border / --wg-border-soft / --wg-focus - Topbar: drop invalid role="menuitem" (no parent role="menu") - topics_list: topic-select icons get role="checkbox", tabindex, aria-label; client.js makes them keyboard-operable and syncs aria-checked - category.tpl: copy-handle link gets an accessible name, "View Original" moved to i18n, external-link icon aria-hidden, stretched link inside aria-hidden alert removed from tab order - Footer: all copy moved to [[westgate:footer.*]] keys; year injected via filter:middleware.renderFooter instead of hard-coded 2026 - client.js: batch table measurements before writes (no interleaved reflow), .catch on the category class map so search results never hang, category selector match uses fw-bold class instead of inline style - Forced-colors focus fallback: transparent outline alongside the box-shadow focus ring - DESIGN.md: real radius scale (3/4/6/8px), code-block palette, motion & modes section, placeholder alpha Verified against the sow-nodebb dev container: themed code blocks render in posts, footer i18n + year, checkbox roles in served HTML. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
64 lines
2.4 KiB
Smarty
64 lines
2.4 KiB
Smarty
<footer class="wg-footer" aria-label="Shadows Over Westgate footer">
|
|
<div class="wg-footer__inner">
|
|
<section class="wg-footer__brand" aria-labelledby="wg-footer-title">
|
|
<div class="wg-footer__brand-row">
|
|
<span class="wg-footer__mark" aria-hidden="true"><span></span></span>
|
|
<h2 class="wg-footer__title" id="wg-footer-title">{config.siteTitle}</h2>
|
|
</div>
|
|
<p class="wg-footer__description">
|
|
[[westgate:footer.description]]
|
|
</p>
|
|
<p class="wg-footer__motto">[[westgate:footer.motto]]</p>
|
|
</section>
|
|
|
|
<nav class="wg-footer__nav" aria-label="[[westgate:footer.explore]]">
|
|
<h2 class="wg-footer__heading">[[westgate:footer.explore]]</h2>
|
|
<ul class="wg-footer__links">
|
|
<li><a href="{relative_path}/">[[westgate:footer.home]]</a></li>
|
|
<li><a href="{relative_path}/category/1/news">[[westgate:footer.news]]</a></li>
|
|
<li><a href="{relative_path}/gallery">[[westgate:footer.gallery]]</a></li>
|
|
<li><a href="{relative_path}/category/84/developer-blog">[[westgate:footer.dev-blog]]</a></li>
|
|
<li><a href="{relative_path}/recruitment">[[westgate:footer.join-team]]</a></li>
|
|
</ul>
|
|
</nav>
|
|
|
|
<nav class="wg-footer__nav" aria-label="[[westgate:footer.community]]">
|
|
<h2 class="wg-footer__heading">[[westgate:footer.community]]</h2>
|
|
<ul class="wg-footer__links">
|
|
<li><a href="{relative_path}/categories">[[westgate:footer.forums]]</a></li>
|
|
<li><a href="{relative_path}/wiki">[[westgate:footer.wiki]]</a></li>
|
|
<li><a href="{relative_path}/register">[[westgate:footer.register]]</a></li>
|
|
<li><a href="{relative_path}/wiki">[[westgate:footer.how-to-join]]</a></li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
|
|
<div class="wg-footer__meta">
|
|
<p>[[westgate:footer.copyright, {currentYear}]]</p>
|
|
<p>[[westgate:footer.setting]]</p>
|
|
</div>
|
|
|
|
<div class="wg-footer__powered-by" aria-label="Platform credits">
|
|
<a
|
|
class="wg-footer__powered-pill"
|
|
href="https://nodebb.org"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
aria-label="Powered by NodeBB"
|
|
>
|
|
<span class="wg-footer__powered-label">[[westgate:footer.powered-by]]</span>
|
|
<span class="wg-footer__powered-name">NodeBB</span>
|
|
</a>
|
|
<a
|
|
class="wg-footer__powered-pill"
|
|
href="https://tiptap.dev"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
aria-label="Powered by Tiptap"
|
|
>
|
|
<span class="wg-footer__powered-label">[[westgate:footer.powered-by]]</span>
|
|
<span class="wg-footer__powered-name">Tiptap</span>
|
|
</a>
|
|
</div>
|
|
</footer>
|