Skip to content

feat: phase 1 dark/light mode toggle#85

Merged
Venkat-Kolasani merged 4 commits into
Venkat-Kolasani:mainfrom
Dev1822:feature/phase-1-theme
Jul 8, 2026
Merged

feat: phase 1 dark/light mode toggle#85
Venkat-Kolasani merged 4 commits into
Venkat-Kolasani:mainfrom
Dev1822:feature/phase-1-theme

Conversation

@Dev1822

@Dev1822 Dev1822 commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Summary

Implemented Phase 1 of the dark/light mode infrastructure. This includes setting up Tailwind darkMode: 'class', a persistent ThemeContext using localStorage, a <ThemeToggle> component, and a blocking <script> in index.html to prevent any Flash of Unstyled Content (FOUC).

Fixes #45

Type of change

  • Bug fix
  • New feature
  • Refactor (no behavior change)
  • Documentation

Changes made

  • public/index.html: Added a blocking script in the <head> to prevent FOUC on page load.
  • tailwind.config.js & src/index.css: Enabled class-based dark mode and added CSS variables for background/text color tokens.
  • src/context/ThemeContext.jsx: Created context to handle theme switching and localStorage persistence.
  • src/components/common/ThemeToggle.jsx: Created reusable Sun/Moon toggle button.
  • src/App.js: Wrapped router with <ThemeProvider> and passed dynamic theme to ToastContainer.
  • src/components/common/Navbar.jsx & src/pages/Home.jsx: Integrated the ThemeToggle component into the desktop and mobile menus.

Test plan

  • npm run test:ci passes (frontend)
  • cd backend && npm test passes (if API/backend changed)
  • Backend tests added/updated (if API changed)
  • npm run check:architecture passes locally
  • Tested locally with backend running (cd backend && npm run dev)
  • Signed in and smoke-tested affected page(s)
  • Checked mobile / responsive layout (if UI change)
  • No secrets or .env files committed

Screenshots / recording

image

Checklist

  • PR addresses one assigned issue only
  • Acceptance criteria from the issue are met
  • Follows existing code style and patterns in this repo
  • Database migrations added under docs/ if schema changed
  • No console.log debug noise left behind
  • Read docs/TESTING.md if unsure what CI expects

Summary by CodeRabbit

  • New Features
    • Added a site-wide light/dark theme toggle with saved preference and automatic system-theme detection.
    • Updated app theming throughout, including theme-aware toasts.
  • Bug Fixes
    • Reduced initial theme flashing by applying the correct theme immediately on page load.
  • Style
    • Refreshed light/dark styling across navigation, homepage, FAQ, and footer with smooth transitions, CSS variable colors, theme-aware scrollbars, and Tailwind dark class support.

@vercel

vercel Bot commented Jul 6, 2026

Copy link
Copy Markdown

@Dev1822 is attempting to deploy a commit to the venkat-kolasani's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds class-based dark/light theme support across the app, including persisted theme state, initial theme application before mount, a toggle control, and light/dark styling updates in the shell, navigation, homepage, FAQ, footer, and global styles.

Changes

Theme system implementation

Layer / File(s) Summary
Tailwind dark mode config and CSS variables
tailwind.config.js, src/index.css
Enables class-based dark mode and defines theme variables for background, text, and scrollbar styling.
ThemeContext provider and useTheme hook
src/context/ThemeContext.jsx
Adds ThemeProvider, toggleTheme, useTheme, localStorage persistence, system preference handling, and document class syncing.
FOUC prevention inline script
public/index.html
Adds an inline head script that sets the theme class before React mounts.
ThemeToggle component
src/components/common/ThemeToggle.jsx
Adds a sun/moon toggle button that reads and updates theme state.
App.js theming wiring
src/App.js
Wraps the app in ThemeProvider, uses theme state for root styling, and makes toast theme selection dynamic.
Navbar theming and toggle integration
src/components/common/Navbar.jsx
Adds ThemeToggle and updates navbar styling for light/dark modes.
Home page light/dark styling
src/pages/Home.jsx
Updates the homepage layout, hero, CTAs, stats, and embedded navbar styling for light/dark modes.
FAQ and footer theming
src/components/common/FAQ.jsx, src/components/common/Footer.jsx
Updates FAQ and footer styling to use light/dark Tailwind classes across borders, text, gradients, buttons, and decorative elements.

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

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant InlineScript
  participant ThemeProvider
  participant ThemeToggle
  participant AppContent

  Browser->>InlineScript: parse head
  InlineScript->>Browser: apply dark class from storage or system preference
  Browser->>ThemeProvider: mount app
  ThemeProvider->>AppContent: provide isDark and toggleTheme
  ThemeToggle->>ThemeProvider: toggle theme
  ThemeProvider->>Browser: update dark class and persist choice
Loading

Possibly related issues

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR covers theme infrastructure, but the required shared-primitives migration is not shown for Button, Card, Modal, LoadingSpinner, EmptyState, or ErrorBoundary. Add the remaining Phase 1 shell/shared primitive theme updates and verify accessible toggle styling plus the requested contrast requirements.
Out of Scope Changes check ⚠️ Warning Several styling changes extend beyond Phase 1 scope, including Footer, FAQ, and broad Home section restyling beyond the requested shell/nav work. Trim unrelated page/section theming from this PR or justify it against #45; keep Phase 1 focused on infrastructure and core shell.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: phase 1 dark/light mode toggle support.
Description check ✅ Passed The PR description follows the template with summary, type of change, changes made, tests, screenshots, and checklist.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

feat: Phase 1 dark/light mode toggle with FOUC prevention

✨ Enhancement 🕐 20-40 Minutes

Grey Divider

AI Description

• Adds a persistent ThemeContext backed by localStorage and prefers-color-scheme media query,
 with a ThemeToggle (Sun/Moon) button placed in both desktop and mobile navbars.
• Enables Tailwind darkMode: 'class' and introduces CSS custom properties for background, text,
 and scrollbar colors so all existing UI adapts to both themes.
• Injects a blocking IIFE in index.html  to apply the saved theme class before React hydrates,
 eliminating Flash of Unstyled Content (FOUC).
Diagram

graph TD
    A["index.html\n(blocking IIFE)"] -->|"sets .dark class"| B["document.documentElement"]
    C["ThemeContext.jsx\n(ThemeProvider)"] -->|"reads/writes"| D[("localStorage\nfuturestack-theme")]
    C -->|"listens"| E["prefers-color-scheme\nmedia query"]
    C -->|"adds/removes .dark"| B
    F["ThemeToggle.jsx"] -->|"calls toggleTheme"| C
    G["App.js"] -->|"wraps with"| C
    G -->|"uses isDark"| H["ToastContainer theme"]
    I["Navbar.jsx"] -->|"renders"| F
    J["Home.jsx"] -->|"renders"| F
    K["tailwind.config.js"] -->|"darkMode: class"| B
    L["index.css"] -->|"CSS vars per theme"| B

    subgraph Legend
      direction LR
      _html["HTML/Config"] ~~~ _ctx(["React Context"]) ~~~ _comp["Component"]
    end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. CSS-only media query theming
  • ➕ Zero JavaScript required
  • ➕ No FOUC by default
  • ➕ Simpler implementation
  • ➖ Cannot persist a user-chosen override across sessions
  • ➖ No programmatic toggle without JS anyway
2. Third-party library (e.g. use-dark-mode)
  • ➕ Battle-tested FOUC handling
  • ➕ Less custom code to maintain
  • ➖ Adds an external dependency
  • ➖ Less control over behaviour and storage key
  • ➖ Overkill for a single-app use case

Recommendation: The chosen approach (class-based Tailwind + React context + localStorage) is the standard, well-supported pattern for React SPAs and is the right call here. The FOUC-prevention IIFE is the correct technique for class-based theming. One alternative worth noting is CSS-only theming via prefers-color-scheme media queries without JavaScript, but that sacrifices user-override persistence. Another is a third-party library like next-themes (or its non-Next equivalent use-dark-mode), which would reduce boilerplate but adds a dependency for something the team has now implemented cleanly themselves.

Files changed (8) +181 / -52

Enhancement (7) +180 / -52
index.htmlAdd blocking FOUC-prevention script in <head> +14/-0

Add blocking FOUC-prevention script in <head>

• Injects an IIFE that reads 'futurestack-theme' from localStorage (falling back to 'prefers-color-scheme') and immediately adds or removes the 'dark' class on '<html>' before any rendering occurs, eliminating flash of unstyled content.

public/index.html

index.cssAdd CSS custom properties for light/dark theme tokens +23/-4

Add CSS custom properties for light/dark theme tokens

• Defines '--bg-color', '--text-color', and scrollbar CSS variables under ':root' (light) and '.dark' selectors. Updates 'body' to use these variables and adds a smooth 'transition' for background and text color changes.

src/index.css

ThemeContext.jsxCreate ThemeContext with localStorage persistence and OS preference sync +61/-0

Create ThemeContext with localStorage persistence and OS preference sync

• Implements 'ThemeProvider' which initialises 'isDark' from localStorage or 'prefers-color-scheme', syncs the '.dark' class to 'document.documentElement' on change, listens for OS preference changes (only when no explicit user preference is stored), and exposes '{ isDark, toggleTheme }' via context. Includes a 'useTheme' hook with a guard error.

src/context/ThemeContext.jsx

ThemeToggle.jsxCreate reusable Sun/Moon theme toggle button +23/-0

Create reusable Sun/Moon theme toggle button

• New component that consumes 'useTheme' and renders a 'FiSun' or 'FiMoon' icon button. Includes accessible 'aria-label' and 'title' attributes that update based on current theme.

src/components/common/ThemeToggle.jsx

App.jsWrap app with ThemeProvider and make ToastContainer theme-aware +14/-8

Wrap app with ThemeProvider and make ToastContainer theme-aware

• Imports and wraps the component tree with 'ThemeProvider'. Updates 'PageLoader' and 'AppContent' root div to use 'dark:' Tailwind variants. Dynamically sets 'ToastContainer' theme to ''dark'' or ''light'' based on 'isDark'.

src/App.js

Navbar.jsxApply dark/light Tailwind variants and add ThemeToggle to desktop and mobile menus +19/-16

Apply dark/light Tailwind variants and add ThemeToggle to desktop and mobile menus

• Replaces all hardcoded dark-only Tailwind classes with 'dark:' variant pairs across the nav bar, mobile menu, logo, links, and UserButton ring. Renders '<ThemeToggle />' in both the desktop nav and the mobile header row.

src/components/common/Navbar.jsx

Home.jsxApply dark/light Tailwind variants across the landing page and add ThemeToggle +26/-24

Apply dark/light Tailwind variants across the landing page and add ThemeToggle

• Updates every hardcoded dark-only class on the landing page (hero, navbar, stats section, CTA buttons, glows, gradients) to include 'dark:' counterparts for light mode. Adds '<ThemeToggle />' to the landing page navbar.

src/pages/Home.jsx

Other (1) +1 / -0
tailwind.config.jsEnable class-based dark mode strategy +1/-0

Enable class-based dark mode strategy

• Adds 'darkMode: 'class'' so Tailwind generates 'dark:' variant utilities controlled by the presence of the '.dark' class on the root element.

tailwind.config.js

@qodo-code-review

qodo-code-review Bot commented Jul 6, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 📜 Skill insights (0)

Context used

Grey Divider


Action required

1. ThemeProvider always writes localStorage ✓ Resolved 📎 Requirement gap ≡ Correctness
Description
ThemeProvider unconditionally writes futurestack-theme to localStorage on initial mount via
the isDark effect, even when the theme came from prefers-color-scheme rather than an explicit
user choice. This turns the system-derived default into a persisted override, making the
prefers-color-scheme listener effectively stop updating the UI after the first render.
Code

src/context/ThemeContext.jsx[R19-28]

+  useEffect(() => {
+    try {
+      const root = window.document.documentElement;
+      if (isDark) {
+        root.classList.add('dark');
+        window.localStorage.setItem('futurestack-theme', 'dark');
+      } else {
+        root.classList.remove('dark');
+        window.localStorage.setItem('futurestack-theme', 'light');
+      }
Relevance

⭐⭐ Medium

No similar historical findings on prefers-color-scheme vs localStorage persistence; correctness
concern but no repo precedent found.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The requirement is to respect prefers-color-scheme only when no stored preference exists, and to
persist only after the user explicitly overrides the system setting. In ThemeContext.jsx[19-28],
the isDark-driven effect always calls localStorage.setItem('futurestack-theme', ...), which
creates a stored value even on first visit/initial mount; meanwhile, the media-query change handler
only calls setIsDark when that storage key is missing, so once the mount-time write happens the
handler’s condition is no longer met and OS theme changes are ignored.

Default theme respects prefers-color-scheme on first visit, then persists user override
src/context/ThemeContext.jsx[19-28]
src/context/ThemeContext.jsx[34-44]
src/context/ThemeContext.jsx[6-44]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`ThemeProvider` persists `futurestack-theme` to `localStorage` for every `isDark` update (including initial mount), which converts the initial system-derived theme into an explicit stored preference. Because the `matchMedia` listener only applies OS theme changes when no stored preference exists, this makes system theme changes stop propagating after first render.

## Issue Context
Phase 1 behavior needed: on first visit (no stored preference), derive theme from `prefers-color-scheme` and keep following OS changes; only after the user toggles should a stored preference exist and override the system preference. To accomplish this, the implementation must distinguish a **system-derived default** (no explicit user choice yet) from an **explicit user override**.

## Fix Focus Areas
- src/context/ThemeContext.jsx[6-44]
- src/context/ThemeContext.jsx[46-52]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. AppContent hardcodes theme colors ✓ Resolved 📎 Requirement gap ⚙ Maintainability
Description
The updated shell styling still relies on hardcoded Tailwind colors like `bg-white
dark:bg-black/text-gray-900 dark:text-white` instead of semantic theme tokens. This undermines the
Phase 1 semantic-tokens approach and makes consistent theming harder across shared primitives.
Code

src/App.js[69]

+    <div className="min-h-screen bg-white dark:bg-black text-gray-900 dark:text-white font-sans transition-colors duration-300">
Relevance

⭐⭐ Medium

No historical enforcement of semantic theme tokens; past UI used hardcoded Tailwind colors (e.g., PR
#5).

PR-#5

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Compliance requires Phase 1 core shell components to use the semantic theming approach. The new code
uses explicit light/dark color classes (bg-white dark:bg-black, text-gray-900 dark:text-white)
in the shell and navbar instead of semantic tokens, indicating the migration is incomplete.

Migrate Phase 1 core shell components to semantic theming
Enable Tailwind class-based dark mode and semantic theme tokens
src/App.js[69-69]
src/components/common/Navbar.jsx[25-25]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Core shell components are still using hardcoded Tailwind color classes (e.g., `bg-white dark:bg-black`) rather than semantic theme tokens.

## Issue Context
Phase 1 requires migrating the core shell (including `App.js` and `Navbar`) to semantic theming so components rely on shared tokens instead of direct color choices.

## Fix Focus Areas
- src/App.js[69-69]
- src/components/common/Navbar.jsx[25-25]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. FOUC script skips fallback ✓ Resolved 🐞 Bug ☼ Reliability
Description
The inline head script wraps both storage access and theme application in a single empty catch, so
if localStorage.getItem throws the script applies no theme class before React mounts. In
storage-restricted environments this can reintroduce a theme flash that the script is meant to
prevent.
Code

public/index.html[R134-144]

+  <script>
+    (function () {
+      try {
+        var theme = localStorage.getItem('futurestack-theme');
+        if (theme === 'dark' || (!theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+          document.documentElement.classList.add('dark');
+        } else {
+          document.documentElement.classList.remove('dark');
+        }
+      } catch (e) { }
+    })();
Relevance

⭐⭐ Medium

No prior theme-FOUC fallback precedent; team did accept index.html reliability tweaks in PR #5.

PR-#5

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The catch (e) { } covers the entire theme-detection and class-application logic, so if storage
access throws, the code does not run classList.add/remove at all.

public/index.html[133-145]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The FOUC-prevention script fails closed: any exception inside the `try` block causes it to exit without applying either `dark` or `light` state.

## Issue Context
You can still safely compute the initial theme from `matchMedia` even if `localStorage` is unavailable/throws.

## Fix Focus Areas
- public/index.html[133-145]

## Implementation notes
- Restructure the script so `localStorage` read is isolated:
 - Initialize `theme = null`.
 - `try { theme = localStorage.getItem('futurestack-theme'); } catch (e) { /* ignore */ }`
 - Then apply class using `theme === 'dark' || (!theme && matchMedia(...).matches)`.
- Avoid an entirely empty catch around the whole block (optional: keep it silent, but ensure class application still runs).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread src/App.js Outdated
Comment thread src/context/ThemeContext.jsx Outdated
Comment thread public/index.html

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/components/common/ThemeToggle.jsx (1)

8-13: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add explicit type="button".

<button> without a type attribute defaults to type="submit". As a reusable common/ component it may later be placed inside a <form> (e.g. settings), where it would unintentionally submit the form.

🔧 Proposed fix
     <button
       onClick={toggleTheme}
+      type="button"
       className={`p-2 rounded-md hover:bg-black/10 dark:hover:bg-white/10 transition-colors focus:outline-none focus:ring-2 focus:ring-primary-500 ${className}`}
🤖 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 `@src/components/common/ThemeToggle.jsx` around lines 8 - 13, Add an explicit
type to the reusable button in ThemeToggle so it cannot act as a form submit
control by default. Update the <button> used in the ThemeToggle component to
include type="button" alongside the existing onClick, className, aria-label, and
title props, so it remains safe when used inside forms.
🤖 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 `@src/context/ThemeContext.jsx`:
- Around line 19-46: The ThemeContext `useEffect` currently persists `isDark` to
`localStorage` on every change, including the initial mount value from
`prefers-color-scheme`, which blocks the `mediaQuery` listener’s “no explicit
preference” check from ever working. Move the `futurestack-theme` persistence
out of the syncing effect and into `toggleTheme` (or another explicit
user-action path), while keeping the DOM `dark` class update in the effect, so
`handleChange` can continue following OS theme changes until the user chooses a
theme.

---

Nitpick comments:
In `@src/components/common/ThemeToggle.jsx`:
- Around line 8-13: Add an explicit type to the reusable button in ThemeToggle
so it cannot act as a form submit control by default. Update the <button> used
in the ThemeToggle component to include type="button" alongside the existing
onClick, className, aria-label, and title props, so it remains safe when used
inside forms.
🪄 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: fd001c59-a7ba-404f-bd05-fec24df4a946

📥 Commits

Reviewing files that changed from the base of the PR and between ca2c571 and 7323041.

📒 Files selected for processing (8)
  • public/index.html
  • src/App.js
  • src/components/common/Navbar.jsx
  • src/components/common/ThemeToggle.jsx
  • src/context/ThemeContext.jsx
  • src/index.css
  • src/pages/Home.jsx
  • tailwind.config.js

Comment thread src/context/ThemeContext.jsx Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/pages/Home.jsx (1)

172-229: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Features Grid still hardcoded for dark mode — unreadable in light mode.

The rest of the page (navbar, hero, stats) got dark: variants, but this section's card border/background (border-white/10 bg-white/[0.03] hover:bg-white/[0.06]), icon wrapper (bg-white/5 ring-white/10), and text (text-white, text-gray-400) have no light-mode counterparts. With the root now defaulting to bg-white in light mode, feature titles (text-white) will render white-on-white and be effectively invisible, and card borders/backgrounds will be nearly imperceptible.

🎨 Proposed fix to add light-mode variants
-              className="group relative p-8 rounded-2xl border border-white/10 bg-white/[0.03] hover:bg-white/[0.06] transition-all duration-300 hover:-translate-y-1 overflow-hidden"
+              className="group relative p-8 rounded-2xl border border-gray-200 dark:border-white/10 bg-gray-50/50 dark:bg-white/[0.03] hover:bg-gray-100 dark:hover:bg-white/[0.06] transition-all duration-300 hover:-translate-y-1 overflow-hidden"
             >
               <div className={`absolute inset-0 bg-gradient-to-br ${feature.gradient} opacity-0 group-hover:opacity-100 transition-opacity duration-500`} />

               <div className="relative z-10">
-                <div className="w-12 h-12 bg-white/5 rounded-xl flex items-center justify-center mb-6 ring-1 ring-white/10 group-hover:scale-110 transition-transform duration-300">
+                <div className="w-12 h-12 bg-gray-100 dark:bg-white/5 rounded-xl flex items-center justify-center mb-6 ring-1 ring-gray-200 dark:ring-white/10 group-hover:scale-110 transition-transform duration-300">
                   {feature.icon}
                 </div>
-                <h3 className="text-xl font-bold mb-3 text-white group-hover:text-blue-200 transition-colors">{feature.title}</h3>
-                <p className="text-gray-400 leading-relaxed group-hover:text-gray-300 transition-colors">
+                <h3 className="text-xl font-bold mb-3 text-gray-900 dark:text-white group-hover:text-blue-600 dark:group-hover:text-blue-200 transition-colors">{feature.title}</h3>
+                <p className="text-gray-600 dark:text-gray-400 leading-relaxed group-hover:text-gray-700 dark:group-hover:text-gray-300 transition-colors">
                   {feature.desc}
                 </p>
               </div>
🤖 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 `@src/pages/Home.jsx` around lines 172 - 229, The feature cards in Home.jsx are
still hardcoded for dark mode, so the grid becomes unreadable when the app is in
light mode. Update the feature card styling inside the features map to add
light-mode Tailwind variants for the outer card, gradient overlay, icon wrapper,
and text colors, using the existing card markup and feature object so titles,
descriptions, borders, and hover states remain visible on both themes.
🧹 Nitpick comments (2)
src/pages/Home.jsx (2)

84-85: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicate JSX comment.

{/* Hero Section */} is repeated on consecutive lines.

🤖 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 `@src/pages/Home.jsx` around lines 84 - 85, There is a duplicate JSX comment in
the Home component’s hero section. Remove the repeated `{/* Hero Section */}`
line so only one comment remains, keeping the surrounding Home markup unchanged.

166-166: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Features intro paragraph missing dark-mode-aware color pairing.

text-gray-400 alone is fine on light backgrounds but was likely intended to pair with a lighter shade in light mode for better contrast, consistent with other paragraphs in this file (e.g., line 100 uses text-gray-600 dark:text-gray-400).

🎨 Suggested fix
-          <p className="text-gray-400 max-w-2xl mx-auto">
+          <p className="text-gray-600 dark:text-gray-400 max-w-2xl mx-auto">
🤖 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 `@src/pages/Home.jsx` at line 166, The Features intro paragraph in Home.jsx
uses only a single gray text class, so update that paragraph to use a light/dark
text pair consistent with the other copy in this component. In the JSX for the
Features section, adjust the paragraph class on the relevant p element to follow
the same pattern as the existing intro text near the other section, using the
appropriate light-mode shade together with a dark-mode override.
🤖 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.

Outside diff comments:
In `@src/pages/Home.jsx`:
- Around line 172-229: The feature cards in Home.jsx are still hardcoded for
dark mode, so the grid becomes unreadable when the app is in light mode. Update
the feature card styling inside the features map to add light-mode Tailwind
variants for the outer card, gradient overlay, icon wrapper, and text colors,
using the existing card markup and feature object so titles, descriptions,
borders, and hover states remain visible on both themes.

---

Nitpick comments:
In `@src/pages/Home.jsx`:
- Around line 84-85: There is a duplicate JSX comment in the Home component’s
hero section. Remove the repeated `{/* Hero Section */}` line so only one
comment remains, keeping the surrounding Home markup unchanged.
- Line 166: The Features intro paragraph in Home.jsx uses only a single gray
text class, so update that paragraph to use a light/dark text pair consistent
with the other copy in this component. In the JSX for the Features section,
adjust the paragraph class on the relevant p element to follow the same pattern
as the existing intro text near the other section, using the appropriate
light-mode shade together with a dark-mode override.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9b6159ea-1200-4baf-94dc-9b8673378437

📥 Commits

Reviewing files that changed from the base of the PR and between 7323041 and cd91f48.

📒 Files selected for processing (2)
  • src/App.js
  • src/pages/Home.jsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/App.js

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/context/ThemeContext.jsx (1)

30-35: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Inconsistent error handling: localStorage.getItem unguarded here.

Every other localStorage access in this file (Lines 8, 44) is wrapped in try/catch, but this one isn't. If storage access throws (e.g., blocked cookies/storage in some browser privacy modes or restricted iframe contexts), this handler will throw uncaught inside the mediaQuery change listener.

🛠️ Proposed fix
     const handleChange = (e) => {
       // Only change if user hasn't explicitly set a preference in localStorage
-      if (!window.localStorage.getItem('futurestack-theme')) {
-        setIsDark(e.matches);
-      }
+      try {
+        if (!window.localStorage.getItem('futurestack-theme')) {
+          setIsDark(e.matches);
+        }
+      } catch (error) {
+        console.warn('Error reading theme from localStorage', error);
+      }
     };
🤖 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 `@src/context/ThemeContext.jsx` around lines 30 - 35, `handleChange` in
`ThemeContext` reads `window.localStorage.getItem('futurestack-theme')` without
the same protection used elsewhere in the file, so wrap that storage access in
the existing try/catch pattern. Keep the current behavior of only calling
`setIsDark(e.matches)` when no saved preference exists, but ensure any storage
failure in the media query listener is safely handled instead of throwing.
🧹 Nitpick comments (1)
src/context/ThemeContext.jsx (1)

40-50: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Side effect (localStorage.setItem) inside a useState updater function.

Functions passed to setIsDark are double-invoked by React Strict Mode in development. Writing to localStorage from within the updater means the write runs twice per toggle in dev; harmless here since the value is idempotent, but it's cleaner to keep updaters pure and perform the persistence as a separate step.

♻️ Optional refactor
   const toggleTheme = () => {
-    setIsDark((prev) => {
-      const next = !prev;
-      try {
-        window.localStorage.setItem('futurestack-theme', next ? 'dark' : 'light');
-      } catch (error) {
-        console.warn('Error saving theme to localStorage', error);
-      }
-      return next;
-    });
+    setIsDark((prev) => {
+      const next = !prev;
+      return next;
+    });
   };

Then persist via the existing DOM-sync effect (or a dedicated effect keyed on isDark) instead of inside the updater.

🤖 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 `@src/context/ThemeContext.jsx` around lines 40 - 50, The toggleTheme updater
in ThemeContext should stay pure and not perform the localStorage write inside
the setIsDark callback. Move the persistence logic out of the updater and into
the existing DOM-sync effect, or a separate effect keyed on isDark, so the theme
change and storage sync happen in distinct steps. Keep the toggleTheme function
focused on flipping isDark and use the same futurestack-theme storage key when
persisting from the effect.
🤖 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.

Outside diff comments:
In `@src/context/ThemeContext.jsx`:
- Around line 30-35: `handleChange` in `ThemeContext` reads
`window.localStorage.getItem('futurestack-theme')` without the same protection
used elsewhere in the file, so wrap that storage access in the existing
try/catch pattern. Keep the current behavior of only calling
`setIsDark(e.matches)` when no saved preference exists, but ensure any storage
failure in the media query listener is safely handled instead of throwing.

---

Nitpick comments:
In `@src/context/ThemeContext.jsx`:
- Around line 40-50: The toggleTheme updater in ThemeContext should stay pure
and not perform the localStorage write inside the setIsDark callback. Move the
persistence logic out of the updater and into the existing DOM-sync effect, or a
separate effect keyed on isDark, so the theme change and storage sync happen in
distinct steps. Keep the toggleTheme function focused on flipping isDark and use
the same futurestack-theme storage key when persisting from the effect.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 247b644e-afd5-4a75-9f4e-63610510a04f

📥 Commits

Reviewing files that changed from the base of the PR and between cd91f48 and 17f9567.

📒 Files selected for processing (3)
  • public/index.html
  • src/App.js
  • src/context/ThemeContext.jsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • public/index.html
  • src/App.js

@Dev1822 Dev1822 force-pushed the feature/phase-1-theme branch from 17f9567 to dbd129b Compare July 6, 2026 15:54

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/context/ThemeContext.jsx (1)

44-52: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Optional: use functional setState update for toggleTheme.

setIsDark(next) reads isDark from the closure rather than using the updater-function form. Currently harmless since toggleTheme is redefined every render with a fresh isDark, but functional form (setIsDark(prev => !prev)) is more defensive if this function is ever memoized with useCallback.

♻️ Optional refactor
   const toggleTheme = () => {
-    const next = !isDark;
-    setIsDark(next);
-    try {
-      window.localStorage.setItem('futurestack-theme', next ? 'dark' : 'light');
-    } catch (error) {
-      console.warn('Error saving theme to localStorage', error);
-    }
+    setIsDark((prev) => {
+      const next = !prev;
+      try {
+        window.localStorage.setItem('futurestack-theme', next ? 'dark' : 'light');
+      } catch (error) {
+        console.warn('Error saving theme to localStorage', error);
+      }
+      return next;
+    });
   };
🤖 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 `@src/context/ThemeContext.jsx` around lines 44 - 52, In toggleTheme, replace
the closure-based isDark flip with the functional updater form on setIsDark so
the state change does not depend on a captured value. Keep the localStorage
write in sync with the computed next theme inside the same function, and use the
toggleTheme symbol as the place to apply this refactor.

Source: Linters/SAST tools

🤖 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.

Nitpick comments:
In `@src/context/ThemeContext.jsx`:
- Around line 44-52: In toggleTheme, replace the closure-based isDark flip with
the functional updater form on setIsDark so the state change does not depend on
a captured value. Keep the localStorage write in sync with the computed next
theme inside the same function, and use the toggleTheme symbol as the place to
apply this refactor.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: f2556c7a-2a34-4f85-a66a-3fc9a8921741

📥 Commits

Reviewing files that changed from the base of the PR and between 17f9567 and dbd129b.

📒 Files selected for processing (3)
  • public/index.html
  • src/App.js
  • src/context/ThemeContext.jsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • public/index.html
  • src/App.js

@Dev1822 Dev1822 force-pushed the feature/phase-1-theme branch from dbd129b to 2887af5 Compare July 6, 2026 16:00
@Venkat-Kolasani

Copy link
Copy Markdown
Owner

@coderabbitai resume

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
✅ Action performed

Reviews resumed.

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@vercel

vercel Bot commented Jul 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
future-stack Ready Ready Preview, Comment Jul 7, 2026 9:59am

@Venkat-Kolasani Venkat-Kolasani left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

@Dev1822 - Critical Light Mode Visibility Issues Need Attention

I've reviewed the dark/light mode toggle implementation and found a critical issue that needs to be addressed before this can be merged.

Issue: Text is barely visible in light mode. The FAQ section (and likely other components) uses hardcoded dark mode styles (white text, light backgrounds) that don't adapt to light mode, making content unreadable. This is not at all expected from the PR.

Specific Problems Found:

FAQ.jsx - Questions and answers use text-white without light mode variants
Background colors use bg-white/5 which is nearly invisible on white backgrounds
Border colors use border-white/10 which doesn't provide contrast in light mode
This pattern likely exists in other components modified in this PR

What Needs to Be Done:

Review ALL modified components and add proper dark: prefixed classes for:

Text colors (e.g., text-gray-900 dark:text-white)
Background colors (e.g., bg-gray-50 dark:bg-white/5)
Border colors (e.g., border-gray-200 dark:border-white/10)

Test the application thoroughly in BOTH light and dark modes
Ensure text contrast meets accessibility standards in both themes
Check all pages, not just the landing page

Expectation: This feature requires comprehensive testing across the entire application. A theme toggle that makes content unreadable in one mode is not acceptable. Please take the time to review every component you modified and ensure proper theming support.

Please address these issues and resubmit.

Image Image Image

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/pages/Home.jsx (1)

95-100: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Gradient text tail fails WCAG AA contrast in light mode.

The heading gradient ends at to-gray-400, which yields roughly 2.9:1 contrast against a white background — below the 3:1 AA threshold for large text. This directly conflicts with the PR's stated goal of WCAG AA contrast for Phase 1 tokens.

🎨 Suggested fix
-              <span className="bg-clip-text text-transparent bg-gradient-to-r from-gray-900 via-gray-600 to-gray-400 dark:from-white dark:via-gray-200 dark:to-gray-400">
+              <span className="bg-clip-text text-transparent bg-gradient-to-r from-gray-900 via-gray-700 to-gray-500 dark:from-white dark:via-gray-200 dark:to-gray-400">
🤖 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 `@src/pages/Home.jsx` around lines 95 - 100, The heading text in the Home page
hero uses a gradient that becomes too light at the end, causing the final color
stop to miss WCAG AA contrast in light mode. Update the gradient used on the
hero heading span so the light-mode end color is darker than the current
`to-gray-400`, while preserving the existing `bg-clip-text`/transparent text
approach and the dark-mode stops. Use the hero heading span in `Home.jsx` to
locate the change.
🤖 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.

Outside diff comments:
In `@src/pages/Home.jsx`:
- Around line 95-100: The heading text in the Home page hero uses a gradient
that becomes too light at the end, causing the final color stop to miss WCAG AA
contrast in light mode. Update the gradient used on the hero heading span so the
light-mode end color is darker than the current `to-gray-400`, while preserving
the existing `bg-clip-text`/transparent text approach and the dark-mode stops.
Use the hero heading span in `Home.jsx` to locate the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 3794d50c-5e54-4462-ae9f-beda7f6b6a19

📥 Commits

Reviewing files that changed from the base of the PR and between 2887af5 and 2a8d96a.

📒 Files selected for processing (3)
  • src/components/common/FAQ.jsx
  • src/components/common/Footer.jsx
  • src/pages/Home.jsx
✅ Files skipped from review due to trivial changes (2)
  • src/components/common/FAQ.jsx
  • src/components/common/Footer.jsx

@Dev1822 Dev1822 force-pushed the feature/phase-1-theme branch from 2a8d96a to a7563d9 Compare July 7, 2026 08:55

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/pages/Home.jsx (1)

111-111: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicated CTA button styling.

The "Get Started Free" and "Go to Dashboard" buttons share an identical, lengthy className (background, shadow, hover states). Consider extracting a shared heroCtaClass constant or small button component to avoid drift between the two.

Also applies to: 132-132

🤖 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 `@src/pages/Home.jsx` at line 111, The CTA button styles in Home.jsx are
duplicated between “Get Started Free” and “Go to Dashboard,” which risks them
drifting out of sync. Extract the shared Tailwind class string into a reusable
constant like heroCtaClass, or factor the buttons into a small shared component,
and use that in both places so the styling stays identical and easier to
maintain.
🤖 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.

Nitpick comments:
In `@src/pages/Home.jsx`:
- Line 111: The CTA button styles in Home.jsx are duplicated between “Get
Started Free” and “Go to Dashboard,” which risks them drifting out of sync.
Extract the shared Tailwind class string into a reusable constant like
heroCtaClass, or factor the buttons into a small shared component, and use that
in both places so the styling stays identical and easier to maintain.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ea2a91b6-7787-43d1-b5fb-c58040dc79b2

📥 Commits

Reviewing files that changed from the base of the PR and between 2a8d96a and a7563d9.

📒 Files selected for processing (3)
  • src/components/common/FAQ.jsx
  • src/components/common/Footer.jsx
  • src/pages/Home.jsx
✅ Files skipped from review due to trivial changes (2)
  • src/components/common/Footer.jsx
  • src/components/common/FAQ.jsx

@Dev1822 Dev1822 force-pushed the feature/phase-1-theme branch from a7563d9 to 0ddd2a9 Compare July 7, 2026 09:03

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/pages/Home.jsx (1)

176-211: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Feature icon accent colors are theme-static.

Card container, text, and background were migrated to light/dark variants (Lines 219-228), but the icon colors (text-blue-400, text-indigo-400, text-purple-400, text-orange-400, text-yellow-400, text-red-400) remain fixed. These -400 shades were likely tuned for the previous dark-only background and may have inconsistent/lower contrast against the new light card background (bg-gray-50/50).

Given the PR's stated goal of WCAG AA contrast for Phase 1 tokens, consider giving these icons dark: variants (or shifting to a stronger shade like -500/-600 for light mode) to keep contrast consistent across themes.

icon:

🤖 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 `@src/pages/Home.jsx` around lines 176 - 211, The feature icons in the Home
page card list are still using fixed `text-*-400` classes in the icon objects,
so their contrast may be inconsistent on the new light cards. Update the icon
class names for the `FiBriefcase`, `FiLayers`, `FiCode`, `FiDownload`,
`FiFileText`, and `FiCalendar` entries to use theme-aware styling or stronger
light-mode shades, matching the existing light/dark token approach used by the
card container and text styles. Keep the icon colors consistent with the Phase 1
WCAG AA contrast goal.
🤖 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.

Nitpick comments:
In `@src/pages/Home.jsx`:
- Around line 176-211: The feature icons in the Home page card list are still
using fixed `text-*-400` classes in the icon objects, so their contrast may be
inconsistent on the new light cards. Update the icon class names for the
`FiBriefcase`, `FiLayers`, `FiCode`, `FiDownload`, `FiFileText`, and
`FiCalendar` entries to use theme-aware styling or stronger light-mode shades,
matching the existing light/dark token approach used by the card container and
text styles. Keep the icon colors consistent with the Phase 1 WCAG AA contrast
goal.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b0a99370-f2e9-4206-97cd-b96d54e2cf43

📥 Commits

Reviewing files that changed from the base of the PR and between a7563d9 and 0ddd2a9.

📒 Files selected for processing (3)
  • src/components/common/FAQ.jsx
  • src/components/common/Footer.jsx
  • src/pages/Home.jsx
✅ Files skipped from review due to trivial changes (2)
  • src/components/common/FAQ.jsx
  • src/components/common/Footer.jsx

@Venkat-Kolasani

Copy link
Copy Markdown
Owner

Please enhance this section.Maybe a minimal orange shade enhancement.So it looks as impactful as does in dark mode and also verify the review comments left by coderabbit ai agent
Screenshot 2026-07-07 at 3 15 29 PM

@Dev1822 Dev1822 force-pushed the feature/phase-1-theme branch from 0ddd2a9 to bc2a0b7 Compare July 7, 2026 09:49

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/pages/Home.jsx (1)

195-198: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Address the requested orange-shade enhancement.

Per PR comments, the light-mode orange (text-orange-600, from-orange-500/20) was flagged as looking less "impactful" than its dark-mode counterpart. Consider bumping saturation/shade (e.g. orange-500 or a custom brand orange) for the light-mode icon/gradient to match the visual weight of dark:text-orange-400.

Want me to propose a specific shade pairing for the light-mode orange treatment?

🤖 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 `@src/pages/Home.jsx` around lines 195 - 198, The light-mode orange treatment
in the Home page “Reports & Export” card is too muted compared with the
dark-mode styling. Update the icon and gradient in the Home.jsx card definition
to use a more saturated or stronger orange shade for light mode, matching the
visual weight of the existing dark:text-orange-400 styling while keeping the
same component structure and class-based styling.
🤖 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.

Nitpick comments:
In `@src/pages/Home.jsx`:
- Around line 195-198: The light-mode orange treatment in the Home page “Reports
& Export” card is too muted compared with the dark-mode styling. Update the icon
and gradient in the Home.jsx card definition to use a more saturated or stronger
orange shade for light mode, matching the visual weight of the existing
dark:text-orange-400 styling while keeping the same component structure and
class-based styling.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 48d805b4-9d4d-47db-a07c-bf5aafeabbca

📥 Commits

Reviewing files that changed from the base of the PR and between 0ddd2a9 and bc2a0b7.

📒 Files selected for processing (3)
  • src/components/common/FAQ.jsx
  • src/components/common/Footer.jsx
  • src/pages/Home.jsx
✅ Files skipped from review due to trivial changes (1)
  • src/components/common/FAQ.jsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/common/Footer.jsx

@Dev1822 Dev1822 force-pushed the feature/phase-1-theme branch from bc2a0b7 to 4a7b36d Compare July 7, 2026 09:51

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/pages/Home.jsx (1)

148-148: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider extracting the repeated card-style pattern.

The border/background combo border-gray-200 dark:border-white/10 bg-gray-50/50 dark:bg-white/[0.03] (and similar translucent variants at the navbar) repeats across the stats card and feature cards. Similar to heroCtaClass, this could be pulled into a shared constant to keep future light/dark palette tweaks in one place.

Also applies to: 219-219

🤖 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 `@src/pages/Home.jsx` at line 148, The repeated card styling used by the stats
card and feature cards is duplicated and should be centralized for easier
maintenance. Extract the shared border/background/translucent pattern from the
Home component into a reusable constant alongside existing style constants like
heroCtaClass, then replace the repeated class strings in the card markup and any
matching navbar variant so future light/dark palette changes only need one
update.
🤖 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.

Nitpick comments:
In `@src/pages/Home.jsx`:
- Line 148: The repeated card styling used by the stats card and feature cards
is duplicated and should be centralized for easier maintenance. Extract the
shared border/background/translucent pattern from the Home component into a
reusable constant alongside existing style constants like heroCtaClass, then
replace the repeated class strings in the card markup and any matching navbar
variant so future light/dark palette changes only need one update.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ad0e9a56-959f-46fa-bf7a-00d52a382444

📥 Commits

Reviewing files that changed from the base of the PR and between bc2a0b7 and 4a7b36d.

📒 Files selected for processing (3)
  • src/components/common/FAQ.jsx
  • src/components/common/Footer.jsx
  • src/pages/Home.jsx
✅ Files skipped from review due to trivial changes (2)
  • src/components/common/FAQ.jsx
  • src/components/common/Footer.jsx

@Venkat-Kolasani Venkat-Kolasani left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thank you @Dev1822 . Merging Phase 1.... Look into Phase 2 (complete app pages + including shared link pages as well)

@Venkat-Kolasani Venkat-Kolasani merged commit 27016d4 into Venkat-Kolasani:main Jul 8, 2026
7 of 8 checks passed
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.

Feature: Add Dark/Light mode toggle

3 participants