- 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>
## Summary
- add the global Westgate footer partial under `templates/partials/footer/`
- import scoped footer styles from `theme.scss`
- include the footer design spec and powered-by HTML/CSS references
- add a contract test for the footer integration and required links
## Verification
- `node tests/global-footer-contract.test.js`
- `node tests/global-topbar-contract.test.js`
- `for test in tests/*.test.js; do node "$test"; done`
- `npm test --if-present`
- `git diff --check`
Reviewed-on: #8
Co-authored-by: vickydotbat <vickydotbat@tutamail.com>
Co-committed-by: vickydotbat <vickydotbat@tutamail.com>