Epic: NoScript Accessibility — Add <noscript> Fallbacks Site-Wide #489

Open
opened 2026-04-16 07:12:22 +00:00 by jjalangtry · 0 comments
jjalangtry commented 2026-04-16 07:12:22 +00:00 (Migrated from github.com)

Epic Goal

Make the SSE website gracefully usable for members who browse with JavaScript disabled, by adding <noscript> fallbacks and fixing JS-default-hidden content across the site.

Problem / Opportunity

A team member browses without JavaScript. Currently the SSE website has zero <noscript> tags in the entire codebase. The result is silent failures everywhere:

  • Content is actively hidden by animation components that start opacity-0 and never un-hide without JS
  • Mobile users have no navigation — the hamburger menu never opens
  • Sign-in and sign-out are completely broken — both are JS-only event handlers
  • Every form uses e.preventDefault() + fetch() with no HTML form fallback
  • Whole pages render blank because all data is fetched in useEffect

Success Criteria

  • No content is ever hidden by default because of a JS animation — animations are enhancements only
  • Navigation is usable on both desktop and mobile without JS
  • Users can reach the sign-in page without JS (via NextAuth's built-in /api/auth/signin)
  • All public-facing forms have a <noscript> message with an alternative contact path
  • A root-level banner explains the JS requirement to any noscript visitor
  • All dynamic data pages have a <noscript> placeholder instead of a silent blank screen

Stories in This Epic

🔴 P0 — Critical

  • Bug: RevealOnScroll hides content permanently without JS — #475
  • Bug: Mobile navigation is completely broken without JS — #476
  • Bug: Sign-in and sign-out are completely broken without JS — #477

🟠 P1 — High

  • Task: Add root-level noscript banner to layout.tsx — #478
  • Task: Add noscript fallback to desktop nav dropdowns — #479
  • Task: Add noscript fallbacks to all public-facing JS-only forms — #480

🟡 P2 — Medium

  • Task: Add noscript fallbacks to purchasing forms — #481
  • Task: Add noscript fallbacks to dynamic data pages — #482
  • Task: Add noscript fallback to Events Calendar — #483
  • Task: Add noscript fallback to image upload components — #484
  • Task: Add noscript fallbacks to homepage hero animations — #485

🔵 P3 — Low

  • Task: Add noscript to Recharts chart components — #486
  • Task: Add noscript to theme, style, and font toggle buttons — #487
  • Task: Add noscript fallbacks to officer dashboard pages — #488

Technical Notes

  • NextAuth ships a built-in HTML sign-in page at /api/auth/signin — use this as the auth fallback, no extra work needed
  • RevealOnScroll is the most severe issue because it actively hides content. Fix: start visible, add animation class via JS rather than removing a hidden class
  • Root <noscript> banner in layout.tsx covers the whole app in one change and should be done early
  • No new dependencies are needed — all fixes are pure HTML <noscript> blocks or CSS tweaks
# Epic Goal Make the SSE website gracefully usable for members who browse with JavaScript disabled, by adding `<noscript>` fallbacks and fixing JS-default-hidden content across the site. ## Problem / Opportunity A team member browses without JavaScript. Currently the SSE website has **zero `<noscript>` tags** in the entire codebase. The result is silent failures everywhere: - Content is **actively hidden** by animation components that start `opacity-0` and never un-hide without JS - **Mobile users have no navigation** — the hamburger menu never opens - **Sign-in and sign-out are completely broken** — both are JS-only event handlers - Every form uses `e.preventDefault()` + `fetch()` with no HTML form fallback - Whole pages render blank because all data is fetched in `useEffect` ## Success Criteria - [ ] No content is ever hidden by default because of a JS animation — animations are enhancements only - [ ] Navigation is usable on both desktop and mobile without JS - [ ] Users can reach the sign-in page without JS (via NextAuth's built-in `/api/auth/signin`) - [ ] All public-facing forms have a `<noscript>` message with an alternative contact path - [ ] A root-level banner explains the JS requirement to any noscript visitor - [ ] All dynamic data pages have a `<noscript>` placeholder instead of a silent blank screen ## Stories in This Epic **🔴 P0 — Critical** - [ ] Bug: RevealOnScroll hides content permanently without JS — #475 - [ ] Bug: Mobile navigation is completely broken without JS — #476 - [ ] Bug: Sign-in and sign-out are completely broken without JS — #477 **🟠 P1 — High** - [ ] Task: Add root-level noscript banner to layout.tsx — #478 - [ ] Task: Add noscript fallback to desktop nav dropdowns — #479 - [ ] Task: Add noscript fallbacks to all public-facing JS-only forms — #480 **🟡 P2 — Medium** - [ ] Task: Add noscript fallbacks to purchasing forms — #481 - [ ] Task: Add noscript fallbacks to dynamic data pages — #482 - [ ] Task: Add noscript fallback to Events Calendar — #483 - [ ] Task: Add noscript fallback to image upload components — #484 - [ ] Task: Add noscript fallbacks to homepage hero animations — #485 **🔵 P3 — Low** - [ ] Task: Add noscript to Recharts chart components — #486 - [ ] Task: Add noscript to theme, style, and font toggle buttons — #487 - [ ] Task: Add noscript fallbacks to officer dashboard pages — #488 ## Technical Notes - **NextAuth** ships a built-in HTML sign-in page at `/api/auth/signin` — use this as the auth fallback, no extra work needed - **`RevealOnScroll`** is the most severe issue because it actively hides content. Fix: start visible, add animation class via JS rather than removing a hidden class - **Root `<noscript>` banner** in `layout.tsx` covers the whole app in one change and should be done early - No new dependencies are needed — all fixes are pure HTML `<noscript>` blocks or CSS tweaks
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
SSE/WebsiteTheSSEquel#489
No description provided.