Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# CodeRabbit Configuration
language: en-US # Language for reviews

# Review settings
reviews:
profile: chill # Options: chill, assertive
high_level_summary: true
high_level_summary_placeholder: '@coderabbitai summary'
auto_title_placeholder: '@coderabbitai'
changed_files_summary: true
sequence_diagrams: true
assess_linked_issues: true
related_issues: true
related_prs: true
suggested_labels: true
suggested_reviewers: true
poem: true

# Path filters and instructions
path_filters: [] # Add glob patterns to include/exclude files
path_instructions: [] # Add path-specific review instructions

# Auto review settings
auto_review:
enabled: true
auto_incremental_review: true
drafts: false

# Tool integrations
tools:
# Common tools (all enabled by default)
ast-grep:
essential_rules: true
shellcheck:
enabled: true
ruff:
enabled: true
markdownlint:
enabled: true
biome:
enabled: true
eslint:
enabled: true
gitleaks:
enabled: true

# Chat settings
chat:
auto_reply: true
create_issues: true

# Knowledge base settings
knowledge_base:
web_search:
enabled: true
learnings:
scope: auto
issues:
scope: auto
pull_requests:
scope: auto

# Code generation settings
code_generation:
docstrings:
path_instructions:
- path: "**/*.js"
instructions: |
End all docstrings with a notice that says "Auto-generated by CodeRabbit.".
Do not omit the closing tags; the docstring must be valid.
8 changes: 0 additions & 8 deletions bin/help-center.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,6 @@ program
console.log(' Deploys the help center to your specified domain.');
});

program
.command('build')
.description('Build the help center for production')
.action(() => {
console.log(chalk.blue('Building help center...'));
execSync('next build', { stdio: 'inherit' });
});

program
.command('start')
.description('Start the development server')
Expand Down
35 changes: 35 additions & 0 deletions context/ThemeContext.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import React, { createContext, useState, useEffect, useContext } from 'react';

const ThemeContext = createContext();

export const useTheme = () => useContext(ThemeContext);

export const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light'); // Default theme

useEffect(() => {
const storedTheme = localStorage.getItem('theme');
if (storedTheme) {
setTheme(storedTheme);
}
Comment on lines +11 to +14
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Validate persisted theme values before applying state.

At Line 11–Line 14, any localStorage value is accepted. Restrict to light/dark to avoid invalid theme state.

Suggested fix
   useEffect(() => {
     const storedTheme = localStorage.getItem('theme');
-    if (storedTheme) {
+    if (storedTheme === 'light' || storedTheme === 'dark') {
       setTheme(storedTheme);
     }
   }, []);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const storedTheme = localStorage.getItem('theme');
if (storedTheme) {
setTheme(storedTheme);
}
const storedTheme = localStorage.getItem('theme');
if (storedTheme === 'light' || storedTheme === 'dark') {
setTheme(storedTheme);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@context/ThemeContext.js` around lines 11 - 14, Validate the persisted theme
value from localStorage before applying it: when reading storedTheme and calling
setTheme (in ThemeContext / the initialization useEffect), only allow the string
'light' or 'dark' (e.g., check storedTheme === 'light' || storedTheme ===
'dark') and ignore/unset any other values so the component never enters an
invalid theme state.

}, []);

useEffect(() => {
if (theme === 'dark') {
document.body.classList.add('dark-mode');
} else {
document.body.classList.remove('dark-mode');
}
localStorage.setItem('theme', theme);
}, [theme]);

const toggleTheme = () => {
setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
};

return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
7 changes: 6 additions & 1 deletion pages/_app.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import '../styles/globals.css';
import { config } from '@fortawesome/fontawesome-svg-core';
import '@fortawesome/fontawesome-svg-core/styles.css';
import { ThemeProvider } from '../context/ThemeContext';

// Prevent Font Awesome from adding its CSS since we did it manually above
config.autoAddCss = false;

function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />;
return (
<ThemeProvider>
<Component {...pageProps} />
</ThemeProvider>
);
}

export default MyApp;
16 changes: 15 additions & 1 deletion pages/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ import {
faBook,
faCreditCard,
faCode,
faUser
faUser,
faSun,
faMoon
} from '@fortawesome/free-solid-svg-icons';
import { faTwitter, faLinkedin } from '@fortawesome/free-brands-svg-icons';
import { categories, articles } from '../data';
import styles from '../styles/Home.module.css';
import { useTheme } from '../context/ThemeContext'; // Import useTheme

const iconMap = {
'rocket': faRocket,
Expand All @@ -22,6 +25,7 @@ const iconMap = {

export default function Home() {
const [query, setQuery] = useState('');
const { theme, toggleTheme } = useTheme(); // Use theme context
const filteredArticles = articles.filter(article =>
article.title.toLowerCase().includes(query.toLowerCase())
);
Expand All @@ -30,21 +34,31 @@ export default function Home() {
<div className={styles.container}>
<header className={styles.header}>
<Link href="/" className={styles.logo}>Acme Corp</Link>
<button onClick={toggleTheme} className={styles.themeToggle}>
<FontAwesomeIcon icon={theme === 'light' ? faMoon : faSun} />
</button>
Comment on lines +37 to +39
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Add an accessible name/state to the theme toggle button.

The icon-only button has no accessible name, so assistive tech users won’t know its purpose or state.

Suggested fix
-        <button onClick={toggleTheme} className={styles.themeToggle}>
+        <button
+          type="button"
+          onClick={toggleTheme}
+          className={styles.themeToggle}
+          aria-label={theme === 'light' ? 'Switch to dark mode' : 'Switch to light mode'}
+          aria-pressed={theme === 'dark'}
+        >
           <FontAwesomeIcon icon={theme === 'light' ? faMoon : faSun} />
         </button>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<button onClick={toggleTheme} className={styles.themeToggle}>
<FontAwesomeIcon icon={theme === 'light' ? faMoon : faSun} />
</button>
<button
type="button"
onClick={toggleTheme}
className={styles.themeToggle}
aria-label={theme === 'light' ? 'Switch to dark mode' : 'Switch to light mode'}
aria-pressed={theme === 'dark'}
>
<FontAwesomeIcon icon={theme === 'light' ? faMoon : faSun} />
</button>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pages/index.js` around lines 37 - 39, The theme toggle button (button using
onClick={toggleTheme}, className={styles.themeToggle} and rendering
<FontAwesomeIcon icon={theme === 'light' ? faMoon : faSun} />) lacks an
accessible name and state; update the element to provide an accessible label
(e.g., aria-label or visually hidden text that describes "Toggle theme" or
"Switch to dark/light theme") and expose its current state using
aria-pressed="true"/"false" or role="switch" with aria-checked based on the
theme variable so screen reader users know the purpose and whether dark or light
is active.

</header>
<main className={styles.main}>
<div className={styles.searchContainer}>
<h1>Advice and answers from the Acme Corp Team</h1>
<div className={styles.searchWrapper}>
<label htmlFor="search-input" className={styles.visuallyHidden}>
Search help articles
</label>
<FontAwesomeIcon
icon={faSearch}
className={styles.searchIcon}
aria-hidden="true"
/>
<input
id="search-input"
type="text"
placeholder="Search for articles..."
className={styles.search}
value={query}
onChange={(e) => setQuery(e.target.value)}
aria-label="Search help articles"
role="searchbox"
/>
</div>
</div>
Expand Down
80 changes: 80 additions & 0 deletions styles/Home.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
background-color: #0f172a;
padding: 1.5rem 2rem;
color: white;
display: flex; /* Enable flexbox for alignment */
justify-content: space-between; /* Space between logo and toggle */
align-items: center; /* Vertically align items */
}

.logo {
Expand Down Expand Up @@ -175,4 +178,81 @@
.socialIcon svg {
width: 1.25rem !important;
height: 1.25rem;
}

.themeToggle {
background: none;
border: none;
color: white;
cursor: pointer;
font-size: 1.25rem; /* Adjust icon size as needed */
}

.themeToggle:hover {
color: #cbd5e0; /* Lighter color on hover */
}

Comment on lines +183 to +194
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Define the missing .visuallyHidden utility used by the search label.

pages/index.js Line 45 references styles.visuallyHidden, but this class is not defined in this module.

Suggested fix
+.visuallyHidden {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border: 0;
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.themeToggle {
background: none;
border: none;
color: white;
cursor: pointer;
font-size: 1.25rem; /* Adjust icon size as needed */
}
.themeToggle:hover {
color: #cbd5e0; /* Lighter color on hover */
}
.themeToggle {
background: none;
border: none;
color: white;
cursor: pointer;
font-size: 1.25rem; /* Adjust icon size as needed */
}
.themeToggle:hover {
color: `#cbd5e0`; /* Lighter color on hover */
}
.visuallyHidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@styles/Home.module.css` around lines 183 - 194, Add a .visuallyHidden CSS
class to the styles module so pages/index.js can use styles.visuallyHidden for
the search label; define it as an accessible visually-hidden utility (e.g.,
positioned off-screen, sized 1px, clipped, overflow-hidden, white-space: nowrap,
border: 0, padding: 0, margin: -1px) and include it alongside the existing
.themeToggle rules in Home.module.css so the label is present for screen readers
but invisible visually.

/* Dark Mode adjustments for Home.module.css */
/* You might need to add specific dark mode overrides for components in this file */
/* For example, if a card has a light background, you\'ll want to change it for dark mode */

body.dark-mode .search {
background-color: #2d3748; /* Darker search input background */
border-color: #4a5568; /* Darker border */
color: #e2e8f0; /* Light text for input */
}

body.dark-mode .search::placeholder {
color: #a0aec0; /* Lighter placeholder text */
}

body.dark-mode .search:focus {
border-color: #63b3ed; /* Lighter blue for focus */
background-color: #1a202c;
}

body.dark-mode .categoryCard {
background: #2d3748; /* Darker card background */
border-color: #4a5568;
}

body.dark-mode .categoryCard:hover {
border-color: #63b3ed;
}

body.dark-mode .categoryCard h2 {
color: #e2e8f0;
}

body.dark-mode .categoryCard p,
body.dark-mode .articleCount {
color: #a0aec0;
}

body.dark-mode .searchResults {
background: #2d3748;
box-shadow: 0 1px 3px rgba(0,0,0,0.3); /* Adjust shadow for dark mode */
}

body.dark-mode .searchResults li a {
color: #e2e8f0;
}

body.dark-mode .searchResults li a:hover {
color: #63b3ed;
}

body.dark-mode .footer {
border-top-color: #4a5568;
}

body.dark-mode .footerLogo,
body.dark-mode .footerLink,
body.dark-mode .socialIcon {
color: #a0aec0;
}

body.dark-mode .footerLink:hover,
body.dark-mode .socialIcon:hover {
color: #e2e8f0;
}
Comment on lines +195 to 258
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Add dark-mode heading color override to prevent low contrast text.

h1 remains dark (#111827) in dark mode because no override is defined, which hurts readability.

Suggested fix
+body.dark-mode .searchContainer h1 {
+  color: `#e2e8f0`;
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
/* Dark Mode adjustments for Home.module.css */
/* You might need to add specific dark mode overrides for components in this file */
/* For example, if a card has a light background, you\'ll want to change it for dark mode */
body.dark-mode .search {
background-color: #2d3748; /* Darker search input background */
border-color: #4a5568; /* Darker border */
color: #e2e8f0; /* Light text for input */
}
body.dark-mode .search::placeholder {
color: #a0aec0; /* Lighter placeholder text */
}
body.dark-mode .search:focus {
border-color: #63b3ed; /* Lighter blue for focus */
background-color: #1a202c;
}
body.dark-mode .categoryCard {
background: #2d3748; /* Darker card background */
border-color: #4a5568;
}
body.dark-mode .categoryCard:hover {
border-color: #63b3ed;
}
body.dark-mode .categoryCard h2 {
color: #e2e8f0;
}
body.dark-mode .categoryCard p,
body.dark-mode .articleCount {
color: #a0aec0;
}
body.dark-mode .searchResults {
background: #2d3748;
box-shadow: 0 1px 3px rgba(0,0,0,0.3); /* Adjust shadow for dark mode */
}
body.dark-mode .searchResults li a {
color: #e2e8f0;
}
body.dark-mode .searchResults li a:hover {
color: #63b3ed;
}
body.dark-mode .footer {
border-top-color: #4a5568;
}
body.dark-mode .footerLogo,
body.dark-mode .footerLink,
body.dark-mode .socialIcon {
color: #a0aec0;
}
body.dark-mode .footerLink:hover,
body.dark-mode .socialIcon:hover {
color: #e2e8f0;
}
/* Dark Mode adjustments for Home.module.css */
/* You might need to add specific dark mode overrides for components in this file */
/* For example, if a card has a light background, you\'ll want to change it for dark mode */
body.dark-mode .search {
background-color: `#2d3748`; /* Darker search input background */
border-color: `#4a5568`; /* Darker border */
color: `#e2e8f0`; /* Light text for input */
}
body.dark-mode .search::placeholder {
color: `#a0aec0`; /* Lighter placeholder text */
}
body.dark-mode .search:focus {
border-color: `#63b3ed`; /* Lighter blue for focus */
background-color: `#1a202c`;
}
body.dark-mode .searchContainer h1 {
color: `#e2e8f0`;
}
body.dark-mode .categoryCard {
background: `#2d3748`; /* Darker card background */
border-color: `#4a5568`;
}
body.dark-mode .categoryCard:hover {
border-color: `#63b3ed`;
}
body.dark-mode .categoryCard h2 {
color: `#e2e8f0`;
}
body.dark-mode .categoryCard p,
body.dark-mode .articleCount {
color: `#a0aec0`;
}
body.dark-mode .searchResults {
background: `#2d3748`;
box-shadow: 0 1px 3px rgba(0,0,0,0.3); /* Adjust shadow for dark mode */
}
body.dark-mode .searchResults li a {
color: `#e2e8f0`;
}
body.dark-mode .searchResults li a:hover {
color: `#63b3ed`;
}
body.dark-mode .footer {
border-top-color: `#4a5568`;
}
body.dark-mode .footerLogo,
body.dark-mode .footerLink,
body.dark-mode .socialIcon {
color: `#a0aec0`;
}
body.dark-mode .footerLink:hover,
body.dark-mode .socialIcon:hover {
color: `#e2e8f0`;
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@styles/Home.module.css` around lines 195 - 258, Add a dark-mode override for
headings so they don’t remain dark on dark backgrounds: in
styles/Home.module.css add a rule targeting body.dark-mode h1 (and optionally
h2–h6) to set a light, high-contrast color (e.g., `#e2e8f0`) to replace the
default `#111827`; update the selector(s) near the other body.dark-mode rules so
headings (h1) render readable in dark mode.

15 changes: 15 additions & 0 deletions styles/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@ html, body {
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
background: #ffffff;
color: #111827;
transition: background-color 0.3s ease, color 0.3s ease;
}

/* Dark Mode Styles */
body.dark-mode {
background-color: #1a202c; /* Dark background */
color: #e2e8f0; /* Light text */
}

body.dark-mode a {
color: #63b3ed; /* Lighter blue for links in dark mode */
}

body.dark-mode a:hover {
color: #4299e1;
}

* {
Expand Down