Skip to content

feat: add High-Contrast Accessibility Mode Toggle - #1177

Merged
itzzavdhesh merged 2 commits into
itzzavdhesh:mainfrom
hrshjswniii:feature/High-Contrast-Accessibility-Mode
Aug 6, 2026
Merged

feat: add High-Contrast Accessibility Mode Toggle#1177
itzzavdhesh merged 2 commits into
itzzavdhesh:mainfrom
hrshjswniii:feature/High-Contrast-Accessibility-Mode

Conversation

@hrshjswniii

@hrshjswniii hrshjswniii commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

🚀 Program

GSSoC

📝 Description

This PR implements a High-Contrast Accessibility Mode Toggle in ThemeContext.jsx and Settings.jsx, enhancing visual boundaries, text contrast ratios (WCAG AAA compliant), and focus outlines for visually impaired, neurodivergent, or high-ambient light users.

Key additions:

  1. High-Contrast CSS Rules (styles.css): Defined .high-contrast rules enforcing maximum WCAG AAA contrast (#000000 / #ffffff), 2px solid element borders, and 3px yellow (#ffff00) focus outlines.
  2. Theme Context State (ThemeContext.jsx): Extended ThemeContext.jsx with isHighContrast state, toggleHighContrast() action, voiceforge:highContrast localStorage persistence, and dynamic .high-contrast class toggling on document.documentElement.
  3. Appearance & Accessibility Settings (Settings.jsx): Rendered an Appearance & Accessibility settings section with an interactive High-Contrast Accessibility Mode toggle switch.
  4. Unit Tests (ThemeContext.test.js): Added Vitest test assertions verifying high-contrast theme state management.

🔗 Related Issue

Closes #1127

🔄 Type of Change

  • 🐛 Bug fix
  • ✨ New feature
  • 🔍 SEO improvement
  • 🎨 Style / UI improvement
  • ♿ Accessibility improvement
  • 📝 Documentation
  • ⚙️ CI / configuration
  • 🧹 Refactor / cleanup

🧪 How to Test

  1. Open http://localhost:5173 in a browser.
  2. Navigate to Settings -> Appearance & Accessibility.
  3. Toggle High-Contrast Mode ON and verify thick white/black element outlines and yellow focus rings when navigating via keyboard.
  4. Run client tests: npm run test --workspace client and verify all tests pass.

✅ Checklist

  • I am contributing under GSSoC
  • My code follows the project's existing style
  • I have tested my changes in a browser
  • I have linked the related issue above
  • My PR title follows Conventional Commits format (e.g. feat: add High-Contrast Accessibility Mode Toggle)

Summary by cubic

Adds a High-Contrast Accessibility Mode with a settings toggle and persisted state to improve readability and keyboard focus visibility across the app. Applies WCAG AAA contrast with clear borders and bright focus outlines.

  • New Features
    • Exposed isHighContrast and toggleHighContrast in ThemeContext, persisted via localStorage (voiceforge:highContrast) and applied by toggling .high-contrast on document.documentElement. Safe storage access with try/catch.
    • Added an Appearance & Accessibility section in Settings with a High-Contrast toggle (ON/OFF).
    • Implemented .high-contrast CSS: black/white palette, 2px borders, 3px yellow focus rings, and no box shadows.
    • Added a Vitest check for high-contrast storage persistence in ThemeContext.test.js.

Written for commit 78ea49b. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added a High-Contrast Accessibility Mode in Settings.
    • High-contrast preferences are saved and restored automatically.
    • Improved visibility with stronger color contrast, borders, and keyboard focus indicators.
  • Tests

    • Added coverage for saving and restoring high-contrast preferences.

@vercel

vercel Bot commented Jul 27, 2026

Copy link
Copy Markdown

@hrshjswniii is attempting to deploy a commit to the itzzavdhesh's projects Team on Vercel.

A member of the Team first needs to authorize it.

@github-actions

Copy link
Copy Markdown

✍️ DCO Sign-off Needed

Hey @hrshjswniii! 👋 One or more commits in this PR are missing a Signed-off-by: line.

Warning

  • 3616a8e feat: add High-Contrast Accessibility Mode Toggle

How to fix:

For the latest commit:

git commit --amend --signoff
git push --force-with-lease

For multiple commits, replace N with the number to update:

git rebase --signoff HEAD~N
git push --force-with-lease

This comment will update automatically after you push.


🤖 VoiceForge Automation · Updates automatically on edits

@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown

🎉 PR Ready for Mentor Review

Hey @hrshjswniii! 👋 Your PR passed all checks and is now in the GSSoC review queue.

Note

🔗 Closing: #1127 · 📐 117 lines across 4 file(s) · 📬 Already requested or no eligible reviewer found

@sabeenaviklar @Anushreebasics @itsdakshjain @snehkris @Mrigakshi-Rathore @Itzzavdheshh @Nitya-003 @4f4d @lovestaco, this PR is ready for your review — please confirm scope, check behavior and tests, then approve or request changes.

Important

This is not an approval. Please wait for mentor feedback before expecting a merge. If changes are requested, push them to this same branch and keep the PR focused on the linked issue.


🤖 VoiceForge Automation · Updates automatically on edits

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a persisted high-contrast mode to the theme context, exposes it through a new Settings toggle, and applies high-contrast colors, borders, and focus styles through a document-level CSS class.

Changes

High-contrast accessibility mode

Layer / File(s) Summary
Persisted theme state and context API
client/src/components/ThemeContext.jsx, client/src/components/ThemeContext.test.js
ThemeContext reads and persists voiceforge:highContrast, synchronizes the high-contrast document class, and exposes the new state and toggle handler with persistence tests.
Settings accessibility control
client/src/pages/Settings.jsx
Settings adds an Appearance & Accessibility section with a state-aware high-contrast toggle card.
High-contrast visual styling
client/src/styles.css
The new class overrides colors, removes shadows, adds white borders to interactive elements, and strengthens focus-visible outlines.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Settings
  participant ThemeContext
  participant localStorage
  participant documentElement
  Settings->>ThemeContext: toggleHighContrast()
  ThemeContext->>localStorage: persist voiceforge:highContrast
  ThemeContext->>documentElement: apply or remove high-contrast
  ThemeContext-->>Settings: provide isHighContrast
Loading

Possibly related PRs

  • itzzavdhesh/VoiceForge#16: Introduces the existing light/dark ThemeContext and document class synchronization extended by this PR.

Suggested labels: level:intermediate

Suggested reviewers: yashyrs027, anushreebasics, itsdakshjain

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The core high-contrast mode, settings toggle, borders, and focus styles are added, but the requested quick header controls are missing. Add the missing quick header control(s) for high-contrast mode and verify it can be toggled from both Settings and the header.
✅ Passed checks (4 passed)
Check name Status Explanation
Out of Scope Changes check ✅ Passed All changes support the accessibility toggle, styling, or tests, with no unrelated feature work visible.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: adding a high-contrast accessibility mode toggle.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@client/src/components/ThemeContext.test.js`:
- Around line 1-15: Replace the direct localStorage test in the “ThemeContext
theme & high-contrast state module” suite with a mounted consumer inside
ThemeProvider. Use useTheme to assert the initial high-contrast state, invoke
toggleHighContrast, and verify the state, high-contrast document class, and
localStorage value stay synchronized without relying on a vacuous non-jsdom
fallback.

In `@client/src/styles.css`:
- Around line 147-148: Add a blank line immediately before the color declaration
in the affected CSS rule, preserving the existing color and background-color
declarations while satisfying the declaration-empty-line-before Stylelint rule.
- Around line 151-162: Update the .high-contrast universal styling so section
and card containers receive a 2px solid white border, not just the existing
controls and links. Preserve the current white border color and box-shadow
removal while ensuring card boundaries are thickened consistently.
- Around line 139-149: Update the .high-contrast styles so descendant palette
utilities such as bg-white, bg-amber-50/40, and text-ink/65 are overridden
through semantic variables or scoped high-contrast component tokens. Ensure
supported descendants resolve to black backgrounds, white text, and the defined
high-contrast colors rather than retaining direct utility declarations; preserve
the existing root variables and high-contrast behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9bcff6eb-14d1-4f10-84be-a92c0fa2938f

📥 Commits

Reviewing files that changed from the base of the PR and between b89b5be and 3616a8e.

📒 Files selected for processing (4)
  • client/src/components/ThemeContext.jsx
  • client/src/components/ThemeContext.test.js
  • client/src/pages/Settings.jsx
  • client/src/styles.css

Comment on lines +1 to +15
import { describe, it, expect } from "vitest";

describe("ThemeContext theme & high-contrast state module", () => {
it("manages high contrast localStorage persistence safely", () => {
if (typeof localStorage !== "undefined") {
localStorage.setItem("voiceforge:highContrast", "true");
expect(localStorage.getItem("voiceforge:highContrast")).toBe("true");

localStorage.setItem("voiceforge:highContrast", "false");
expect(localStorage.getItem("voiceforge:highContrast")).toBe("false");
} else {
expect(true).toBe(true);
}
});
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Test the ThemeProvider contract, not localStorage itself.

This test does not exercise ThemeProvider, useTheme, toggleHighContrast, or the high-contrast document class; in a non-jsdom environment, the fallback assertion can also pass vacuously. Mount a consumer inside ThemeProvider and assert initialization, toggling, class synchronization, and persistence.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@client/src/components/ThemeContext.test.js` around lines 1 - 15, Replace the
direct localStorage test in the “ThemeContext theme & high-contrast state
module” suite with a mounted consumer inside ThemeProvider. Use useTheme to
assert the initial high-contrast state, invoke toggleHighContrast, and verify
the state, high-contrast document class, and localStorage value stay
synchronized without relying on a vacuous non-jsdom fallback.

Comment thread client/src/styles.css
Comment on lines +139 to +149
.high-contrast {
--bg-page: #000000 !important;
--bg-card: #000000 !important;
--bg-input: #000000 !important;
--text-base: #ffffff !important;
--text-muted: #ffff00 !important;
--border: #ffffff !important;
--ring: #ffff00 !important;
color: #ffffff !important;
background-color: #000000 !important;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Override descendant palette utilities, not only root variables.

Existing classes such as bg-white, bg-amber-50/40, and text-ink/65 emit direct declarations on descendants, so they override inherited root colors. Consequently, the mode cannot guarantee black/white styling or the claimed WCAG AAA contrast across the UI. Route these utilities through semantic variables or add scoped high-contrast tokens for supported components.

🧰 Tools
🪛 Stylelint (17.14.0)

[error] 147-147: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@client/src/styles.css` around lines 139 - 149, Update the .high-contrast
styles so descendant palette utilities such as bg-white, bg-amber-50/40, and
text-ink/65 are overridden through semantic variables or scoped high-contrast
component tokens. Ensure supported descendants resolve to black backgrounds,
white text, and the defined high-contrast colors rather than retaining direct
utility declarations; preserve the existing root variables and high-contrast
behavior.

Comment thread client/src/styles.css
Comment thread client/src/styles.css
Comment on lines +151 to +162
.high-contrast * {
border-color: #ffffff !important;
box-shadow: none !important;
}

.high-contrast button,
.high-contrast input,
.high-contrast select,
.high-contrast textarea,
.high-contrast a {
border: 2px solid #ffffff !important;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Increase card border widths as well as border colors.

The universal rule changes only border-color, while the 2px border applies only to controls and links. Existing section and card containers therefore remain 1px wide, missing the stated requirement for thicker card boundaries.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@client/src/styles.css` around lines 151 - 162, Update the .high-contrast
universal styling so section and card containers receive a 2px solid white
border, not just the existing controls and links. Preserve the current white
border color and box-shadow removal while ensuring card boundaries are thickened
consistently.

@itsdakshjain itsdakshjain left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please include visual proof via screenshot or video

@github-actions github-actions Bot added the mentor:itsdakshjain GSSoC: Mentor-@itsdakshjain label Jul 27, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 issues found across 4 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="client/src/pages/Settings.jsx">

<violation number="1" location="client/src/pages/Settings.jsx:70">
P3: `theme` and `toggleTheme` are never used in `Settings`; destructure only the two high-contrast values needed by the new section to avoid dead code and lint failures.</violation>
</file>

<file name="client/src/components/ThemeContext.jsx">

<violation number="1" location="client/src/components/ThemeContext.jsx:59">
P2: The `.high-contrast` class is applied in a `useEffect`, which runs after the browser paints. On initial load, users who have high-contrast mode persisted will see a brief flash of unstyled content before the class takes effect. Since this is an accessibility feature, consider using `useLayoutEffect` instead so the class is applied synchronously before the first paint, eliminating the flash entirely. The same improvement could also benefit the existing theme effect.</violation>
</file>

<file name="client/src/components/ThemeContext.test.js">

<violation number="1" location="client/src/components/ThemeContext.test.js:1">
P1: The test file provides essentially no coverage for the actual ThemeContext component or the high-contrast feature it claims to test. It only exercises basic localStorage setItem/getItem — no imports of ThemeProvider, useTheme, toggleHighContrast, or any of the actual module exports. The `expect(true).toBe(true)` fallback in the else branch is a placeholder assertion that always passes, and the `typeof localStorage !== "undefined"` guard is unnecessary in a Vitest/JSDOM test environment where localStorage is always available. This test would pass even if the entire high-contrast implementation were removed or broken, giving a false sense of coverage and missing the very regressions tests are meant to catch.</violation>
</file>

<file name="client/src/styles.css">

<violation number="1" location="client/src/styles.css:147">
P1: The high-contrast mode overrides CSS custom properties on the root and sets `color`/`background-color` only on `.high-contrast` itself. However, descendant elements styled with Tailwind utility classes like `bg-white`, `bg-amber-50/40`, and `text-ink/65` (visible in `Settings.jsx`) emit direct property declarations that will take precedence over inherited values. As a result, the mode cannot guarantee the claimed WCAG AAA contrast across the UI. Consider adding descendant overrides (e.g., `.high-contrast * { background-color: #000000 !important; color: #ffffff !important; }`) or routing these utilities through semantic custom properties that the high-contrast mode can control.</violation>

<violation number="2" location="client/src/styles.css:152">
P2: The `.high-contrast *` rule sets only `border-color` without increasing `border-width`, and the `2px solid` border shorthand is scoped to form controls and links only. Card and section containers (e.g., the `<section>` elements in Settings with `border border-ink/10`) will retain their default 1px width, undermining the stated goal of thicker visual boundaries for all elements. Consider adding `border-width: 2px !important;` to the universal rule or extending the 2px border selector to include container elements.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

@@ -0,0 +1,15 @@
import { describe, it, expect } from "vitest";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: The test file provides essentially no coverage for the actual ThemeContext component or the high-contrast feature it claims to test. It only exercises basic localStorage setItem/getItem — no imports of ThemeProvider, useTheme, toggleHighContrast, or any of the actual module exports. The expect(true).toBe(true) fallback in the else branch is a placeholder assertion that always passes, and the typeof localStorage !== "undefined" guard is unnecessary in a Vitest/JSDOM test environment where localStorage is always available. This test would pass even if the entire high-contrast implementation were removed or broken, giving a false sense of coverage and missing the very regressions tests are meant to catch.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At client/src/components/ThemeContext.test.js, line 1:

<comment>The test file provides essentially no coverage for the actual ThemeContext component or the high-contrast feature it claims to test. It only exercises basic localStorage setItem/getItem — no imports of ThemeProvider, useTheme, toggleHighContrast, or any of the actual module exports. The `expect(true).toBe(true)` fallback in the else branch is a placeholder assertion that always passes, and the `typeof localStorage !== "undefined"` guard is unnecessary in a Vitest/JSDOM test environment where localStorage is always available. This test would pass even if the entire high-contrast implementation were removed or broken, giving a false sense of coverage and missing the very regressions tests are meant to catch.</comment>

<file context>
@@ -0,0 +1,15 @@
+import { describe, it, expect } from "vitest";
+
+describe("ThemeContext theme & high-contrast state module", () => {
</file context>

Comment thread client/src/styles.css
--text-muted: #ffff00 !important;
--border: #ffffff !important;
--ring: #ffff00 !important;
color: #ffffff !important;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: The high-contrast mode overrides CSS custom properties on the root and sets color/background-color only on .high-contrast itself. However, descendant elements styled with Tailwind utility classes like bg-white, bg-amber-50/40, and text-ink/65 (visible in Settings.jsx) emit direct property declarations that will take precedence over inherited values. As a result, the mode cannot guarantee the claimed WCAG AAA contrast across the UI. Consider adding descendant overrides (e.g., .high-contrast * { background-color: #000000 !important; color: #ffffff !important; }) or routing these utilities through semantic custom properties that the high-contrast mode can control.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At client/src/styles.css, line 147:

<comment>The high-contrast mode overrides CSS custom properties on the root and sets `color`/`background-color` only on `.high-contrast` itself. However, descendant elements styled with Tailwind utility classes like `bg-white`, `bg-amber-50/40`, and `text-ink/65` (visible in `Settings.jsx`) emit direct property declarations that will take precedence over inherited values. As a result, the mode cannot guarantee the claimed WCAG AAA contrast across the UI. Consider adding descendant overrides (e.g., `.high-contrast * { background-color: #000000 !important; color: #ffffff !important; }`) or routing these utilities through semantic custom properties that the high-contrast mode can control.</comment>

<file context>
@@ -134,3 +134,34 @@ textarea {
+  --text-muted: #ffff00 !important;
+  --border: #ffffff !important;
+  --ring: #ffff00 !important;
+  color: #ffffff !important;
+  background-color: #000000 !important;
+}
</file context>

storeTheme(theme);
}, [theme]);

React.useEffect(() => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The .high-contrast class is applied in a useEffect, which runs after the browser paints. On initial load, users who have high-contrast mode persisted will see a brief flash of unstyled content before the class takes effect. Since this is an accessibility feature, consider using useLayoutEffect instead so the class is applied synchronously before the first paint, eliminating the flash entirely. The same improvement could also benefit the existing theme effect.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At client/src/components/ThemeContext.jsx, line 59:

<comment>The `.high-contrast` class is applied in a `useEffect`, which runs after the browser paints. On initial load, users who have high-contrast mode persisted will see a brief flash of unstyled content before the class takes effect. Since this is an accessibility feature, consider using `useLayoutEffect` instead so the class is applied synchronously before the first paint, eliminating the flash entirely. The same improvement could also benefit the existing theme effect.</comment>

<file context>
@@ -39,12 +56,26 @@ export function ThemeProvider({ children }) {
     storeTheme(theme);
   }, [theme]);
 
+  React.useEffect(() => {
+    const root = document.documentElement;
+    if (isHighContrast) {
</file context>
Suggested change
React.useEffect(() => {
React.useLayoutEffect(() => {

Comment thread client/src/styles.css
}

.high-contrast * {
border-color: #ffffff !important;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The .high-contrast * rule sets only border-color without increasing border-width, and the 2px solid border shorthand is scoped to form controls and links only. Card and section containers (e.g., the <section> elements in Settings with border border-ink/10) will retain their default 1px width, undermining the stated goal of thicker visual boundaries for all elements. Consider adding border-width: 2px !important; to the universal rule or extending the 2px border selector to include container elements.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At client/src/styles.css, line 152:

<comment>The `.high-contrast *` rule sets only `border-color` without increasing `border-width`, and the `2px solid` border shorthand is scoped to form controls and links only. Card and section containers (e.g., the `<section>` elements in Settings with `border border-ink/10`) will retain their default 1px width, undermining the stated goal of thicker visual boundaries for all elements. Consider adding `border-width: 2px !important;` to the universal rule or extending the 2px border selector to include container elements.</comment>

<file context>
@@ -134,3 +134,34 @@ textarea {
+}
+
+.high-contrast * {
+  border-color: #ffffff !important;
+  box-shadow: none !important;
+}
</file context>
Suggested change
border-color: #ffffff !important;
border-color: #ffffff !important;
border-width: 2px !important;



const defaultSettings = DEFAULT_VOICE_SETTINGS;
const { theme, toggleTheme, isHighContrast, toggleHighContrast } = useTheme();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: theme and toggleTheme are never used in Settings; destructure only the two high-contrast values needed by the new section to avoid dead code and lint failures.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At client/src/pages/Settings.jsx, line 70:

<comment>`theme` and `toggleTheme` are never used in `Settings`; destructure only the two high-contrast values needed by the new section to avoid dead code and lint failures.</comment>

<file context>
@@ -66,6 +67,7 @@ export default function Settings() {
 
 
   const defaultSettings = DEFAULT_VOICE_SETTINGS;
+  const { theme, toggleTheme, isHighContrast, toggleHighContrast } = useTheme();
   const [voiceSettings, setVoiceSettings] = React.useState(loadVoiceSettings);
   const [language, setLanguage] = React.useState(loadLanguage);
</file context>
Suggested change
const { theme, toggleTheme, isHighContrast, toggleHighContrast } = useTheme();
const { isHighContrast, toggleHighContrast } = useTheme();

@Nitya-003 Nitya-003 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@hrshjswniii Resolve comments.

@github-actions github-actions Bot added mentor:Nitya-003 Applied by mentor automation needs revision and removed ready for review labels Jul 27, 2026
@github-actions

Copy link
Copy Markdown

🔄 Changes Requested

Hey @hrshjswniii! 👋 A mentor has reviewed your PR and requested some changes.

Warning

Please review the feedback above, update this same branch, and keep the PR focused on the linked issue.

Once you push your updates, the review flow will continue automatically on this same PR.


🤖 VoiceForge Automation · Updates automatically on edits

@itzzavdhesh
itzzavdhesh removed the request for review from 1754riya August 4, 2026 13:17
@itzzavdhesh
itzzavdhesh merged commit 53bcb9b into itzzavdhesh:main Aug 6, 2026
6 of 12 checks passed
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

🎊 PR Merged Successfully

Hey @hrshjswniii! 👋 Congratulations and thank you for your contribution to VoiceForge!

Note

🔗 Linked issue(s): #1127 · ✅ Marked as merged and complete

Maintainers may still handle final cleanup, release notes, or follow-up tracking after the merge.


🤖 VoiceForge Automation · Updates automatically on edits

@itzzavdhesh itzzavdhesh added SSoC26 SSOC Hard hard ELUSOC ELUSOC VETERAN VETERAN type:feature type:feature type:refactor type:refactor level:advanced level:advanced mentor:Anushreebasics GSSoC: Mentor-@Anushreebasics mentor:sabeenaviklar GSSoC: Mentor-@sabeenaviklar and removed level:intermediate level:intermediate labels Aug 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: High-Contrast Accessibility Mode Toggle

4 participants