From 9fd152d727f689f8ef45f9221e2dcf576c41e643 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Fri, 12 Sep 2025 00:57:04 +0800 Subject: [PATCH] refactor(a11y): add basic lint for accessibility (#2021) --- .github/workflows/pull-request.yml | 5 + apps/readest-app/eslint.config.mjs | 28 +++-- apps/readest-app/package.json | 1 + apps/readest-app/src/app/layout.tsx | 13 +- .../src/app/library/components/Bookshelf.tsx | 5 +- .../app/library/components/GroupingModal.tsx | 11 +- .../app/library/components/SettingsMenu.tsx | 8 +- .../src/app/library/components/ViewMenu.tsx | 5 +- .../app/reader/components/FoliateViewer.tsx | 3 + .../src/app/reader/components/FooterBar.tsx | 5 +- .../app/reader/components/FootnotePopup.tsx | 9 +- .../src/app/reader/components/HeaderBar.tsx | 3 + .../src/app/reader/components/Reader.tsx | 8 +- .../src/app/reader/components/ViewMenu.tsx | 1 - .../reader/components/notebook/NoteEditor.tsx | 1 - .../reader/components/notebook/Notebook.tsx | 42 +++++-- .../reader/components/settings/ColorInput.tsx | 6 +- .../reader/components/settings/ColorPanel.tsx | 17 ++- .../components/settings/CustomFonts.tsx | 12 +- .../reader/components/settings/DialogMenu.tsx | 1 - .../reader/components/settings/DropDown.tsx | 63 ---------- .../components/settings/FontDropDown.tsx | 16 ++- .../components/settings/NumberInput.tsx | 10 +- .../reader/components/sidebar/BookCard.tsx | 3 +- .../reader/components/sidebar/BookMenu.tsx | 5 +- .../components/sidebar/BooknoteItem.tsx | 23 +++- .../components/sidebar/SearchOptions.tsx | 1 - .../components/sidebar/SearchResults.tsx | 10 ++ .../app/reader/components/sidebar/SideBar.tsx | 50 ++++++-- .../app/reader/components/sidebar/TOCItem.tsx | 12 +- .../components/sidebar/TabNavigation.tsx | 16 ++- .../app/reader/components/tts/TTSControl.tsx | 9 +- .../src/app/reader/components/tts/TTSIcon.tsx | 4 +- .../app/reader/components/tts/TTSPanel.tsx | 4 + .../src/app/reader/hooks/useSidebar.ts | 2 + .../src/app/user/components/PlanCard.tsx | 8 +- .../src/components/AboutWindow.tsx | 116 +++++++++--------- apps/readest-app/src/components/Dialog.tsx | 12 +- apps/readest-app/src/components/Dropdown.tsx | 28 +++-- apps/readest-app/src/components/MenuItem.tsx | 1 + apps/readest-app/src/components/Overlay.tsx | 32 +++++ apps/readest-app/src/components/Providers.tsx | 18 ++- apps/readest-app/src/components/Quota.tsx | 6 +- apps/readest-app/src/components/Select.tsx | 7 +- .../components/metadata/BookDetailEdit.tsx | 4 +- .../components/metadata/BookDetailModal.tsx | 14 ++- .../components/metadata/BookDetailView.tsx | 3 +- .../components/metadata/SourceSelector.tsx | 33 +++-- apps/readest-app/src/context/EnvContext.tsx | 2 +- apps/readest-app/src/hooks/useDrag.ts | 33 ++++- apps/readest-app/src/pages/_app.tsx | 2 +- apps/readest-app/src/store/notebookStore.ts | 2 + apps/readest-app/src/store/sidebarStore.ts | 2 + apps/readest-app/src/store/themeStore.ts | 10 ++ apps/readest-app/src/utils/a11y.ts | 5 + pnpm-lock.yaml | 75 +++++------ 56 files changed, 511 insertions(+), 314 deletions(-) delete mode 100644 apps/readest-app/src/app/reader/components/settings/DropDown.tsx create mode 100644 apps/readest-app/src/components/Overlay.tsx create mode 100644 apps/readest-app/src/utils/a11y.ts diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 6dc584f5..377732ee 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -72,6 +72,11 @@ jobs: run: | pnpm test -- --watch=false + - name: run lint + working-directory: apps/readest-app + run: | + pnpm lint + - name: build the web App if: matrix.config.platform == 'web' working-directory: apps/readest-app diff --git a/apps/readest-app/eslint.config.mjs b/apps/readest-app/eslint.config.mjs index df9db349..8cc926be 100644 --- a/apps/readest-app/eslint.config.mjs +++ b/apps/readest-app/eslint.config.mjs @@ -1,13 +1,25 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import js from "@eslint/js"; -import { FlatCompat } from "@eslint/eslintrc"; +import path from 'node:path'; +import js from '@eslint/js'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; +import { fileURLToPath } from 'node:url'; +import { FlatCompat } from '@eslint/eslintrc'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, }); -export default [...compat.extends("next/core-web-vitals", "next/typescript")]; \ No newline at end of file + +export default [ + ...compat.extends('next/core-web-vitals', 'next/typescript'), + { + plugins: { + 'jsx-a11y': jsxA11y, + }, + rules: { + ...jsxA11y.configs.recommended.rules, + }, + }, +]; diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json index 580f53b6..37ef85ec 100644 --- a/apps/readest-app/package.json +++ b/apps/readest-app/package.json @@ -125,6 +125,7 @@ "dotenv-cli": "^7.4.4", "eslint": "^9.16.0", "eslint-config-next": "15.0.3", + "eslint-plugin-jsx-a11y": "^6.10.2", "i18next-scanner": "^4.6.0", "jsdom": "^26.1.0", "mkdirp": "^3.0.1", diff --git a/apps/readest-app/src/app/layout.tsx b/apps/readest-app/src/app/layout.tsx index a5ab9dad..abbb8d8c 100644 --- a/apps/readest-app/src/app/layout.tsx +++ b/apps/readest-app/src/app/layout.tsx @@ -41,20 +41,9 @@ export const viewport = { export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - + {title} -