eslint-plugin-jsx-a11y joins the lint step and found 19 violations on arrival - 15 orphaned labels, a clickable div, a combobox missing its required attributes, an autoFocus. All fixed, none suppressed, and the rule set stays enforcing so the next one fails CI. The two hand-rolled overlays were the worst of it. The notification bell was a div with div-onClick rows: nothing focusable, nothing announced, no way to close it from the keyboard. It is a real popover now - the trigger reports its state and the unread count, the panel is a labelled dialog, every row is a button with its actions beside it rather than nested inside it, Escape closes and returns focus. The Challenge Friend overlay had no role, no focus trap and no Escape, so Tab went straight through it into the page behind; it is the UI kit's Dialog now, which supplies all of that. Every form control has a label, including the three change-password fields that had only placeholders and a game-night join-password field that had nothing at all. Every icon-only button says what it does, including three versus buttons whose content collapsed to a bare spinner while loading. The search combobox follows the ARIA 1.2 pattern, with the role on the input; verified live that aria-expanded flips and aria-controls resolves to the listbox. State that changed silently is announced: link validation, both lobby countdowns (assertively - a 3-2-1 that launches the game is not something to miss), the game-night player list. The game header's "Passed Movie B" read identically in both states and only the icon differed, so a screen reader heard the wrong thing until B was reached. A skip-to-content link on every page, and a global reduced-motion rule that collapses every animation when the OS asks; the confetti overlay does not render at all under it. Addresses audit section 2.8.
64 lines
1.9 KiB
JSON
64 lines
1.9 KiB
JSON
{
|
|
"name": "frontend-temp",
|
|
"private": true,
|
|
"version": "2.1.0",
|
|
"type": "module",
|
|
"license": "MIT",
|
|
"author": "Kevin Riehl",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "tsc -b && vite build",
|
|
"lint": "eslint . --max-warnings 0",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:cov": "vitest run --coverage",
|
|
"preview": "vite preview",
|
|
"release": "commit-and-tag-version",
|
|
"release:minor": "commit-and-tag-version --release-as minor",
|
|
"release:major": "commit-and-tag-version --release-as major",
|
|
"release:dry": "commit-and-tag-version --dry-run"
|
|
},
|
|
"dependencies": {
|
|
"@base-ui/react": "^1.2.0",
|
|
"@fontsource-variable/geist": "^5.2.8",
|
|
"axios": "^1.13.6",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"lucide-react": "^0.577.0",
|
|
"react": "^19.2.0",
|
|
"react-dom": "^19.2.0",
|
|
"react-router": "^7.13.1",
|
|
"socket.io-client": "^4.8.3",
|
|
"sonner": "^2.0.7",
|
|
"tailwind-merge": "^3.5.0",
|
|
"zustand": "^5.0.11"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^9.39.1",
|
|
"@tailwindcss/vite": "^4.2.1",
|
|
"@testing-library/dom": "^10.4.1",
|
|
"@testing-library/jest-dom": "^7.0.1",
|
|
"@testing-library/react": "^16.3.3",
|
|
"@testing-library/user-event": "^14.6.7",
|
|
"@types/node": "^24.10.1",
|
|
"@types/react": "^19.2.7",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@vitejs/plugin-react": "^5.1.1",
|
|
"@vitest/coverage-v8": "^5.0.0",
|
|
"commit-and-tag-version": "^12.5.0",
|
|
"eslint": "^9.39.1",
|
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
"eslint-plugin-react-refresh": "^0.4.24",
|
|
"globals": "^16.5.0",
|
|
"jsdom": "^30.0.1",
|
|
"shadcn": "^4.0.0",
|
|
"tailwindcss": "^4.2.1",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "~5.9.3",
|
|
"typescript-eslint": "^8.48.0",
|
|
"vite": "^7.3.1",
|
|
"vitest": "^5.0.0"
|
|
}
|
|
}
|