Performance, SEO, a11y, and code quality improvements
CI / check (push) Has been cancelled

1. Performance: 25 pages switched from force-dynamic to revalidate=300 (ISR);
   2 pages (community, developers) now fully static (SSG)
2. DB indexes: Added @@index on foreign keys for WebsiteArticles,
   WebsiteArticleReactions, WebsiteArticleComments, WebsiteHelpCenterTickets,
   WebsiteShopArticles, RadioSongRequests, StaffActivities
3. SEO: Added robots.ts, sitemap.ts, canonical URLs, Open Graph + Twitter
   Card metadata on root layout and news articles
4. A11Y: Replaced <details>/<summary> dropdowns with accessible button-based
   NavDropdown (aria-expanded, aria-haspopup, role=menu). MobileNav now
   uses translated aria-label, aria-expanded, aria-controls, role=menu
5. Code quality: Added try/catch to updateArticle/deleteArticle; deleteArticle
   now uses prisma. for atomicity
6. CI/CD: Added GitHub Actions workflow (typecheck + test)
7. i18n: Added openMenu/closeMenu keys to all 6 locales
8. Observability: Health endpoint now checks SMTP reachability when configured
9. Loading states: Added loading.tsx for root, admin, and news sections
10. Word filter cache: Added 60s TTL auto-refresh instead of manual cache bust
This commit is contained in:
openhands committed 2026-07-04 19:41:04 +02:00
1 parent 10523e58ce
commit 8bcbc501ba
48 files changed
+337 -98

No files matched your search

+13 -2
View File
@@ -2,7 +2,14 @@
import { useState } from "react";
export function MobileNav({ children }: { children: React.ReactNode }) {
interface MobileNavProps {
children: React.ReactNode;
/** Accessible label for the menu button. Pass translated string from server. */
menuLabel?: string;
closeLabel?: string;
}
export function MobileNav({ children, menuLabel = "Open menu", closeLabel = "Close menu" }: MobileNavProps) {
const [open, setOpen] = useState(false);
return (
@@ -12,7 +19,9 @@ export function MobileNav({ children }: { children: React.ReactNode }) {
onClick={() => setOpen(!open)}
className="flex md:hidden items-center justify-center w-10 h-10 rounded-lg transition-colors duration-150"
style={{ color: "var(--color-navbar-text)" }}
aria-label={open ? "Sluit menu" : "Open menu"}
aria-expanded={open}
aria-controls="mobile-menu"
aria-label={open ? closeLabel : menuLabel}
>
<svg className="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
{open ? (
@@ -43,6 +52,8 @@ export function MobileNav({ children }: { children: React.ReactNode }) {
)}
<div
id="mobile-menu"
role="menu"
className={`${open ? "max-h-[80vh] opacity-100" : "max-h-0 opacity-0 pointer-events-none md:pointer-events-auto"} overflow-hidden transition-all duration-300 ease-in-out md:!max-h-none md:!opacity-100 md:!overflow-visible md:flex md:items-center md:gap-x-1 w-full md:w-auto`}
style={{ backgroundColor: "var(--color-navbar)" }}
>