Skip to content

Implement initial UI for OrgExplorer pages#16

Open
DeveloperAmrit wants to merge 3 commits intoAOSSIE-Org:mainfrom
DeveloperAmrit:fix-15-basicdashboard
Open

Implement initial UI for OrgExplorer pages#16
DeveloperAmrit wants to merge 3 commits intoAOSSIE-Org:mainfrom
DeveloperAmrit:fix-15-basicdashboard

Conversation

@DeveloperAmrit
Copy link

@DeveloperAmrit DeveloperAmrit commented Feb 14, 2026

Addressed Issues:

Fixes #15

Screenshots/Recordings:

Preview - https://org-explorer-two.vercel.app/

Additional Notes:

Description
This PR introduces the core UI architecture for the OrgExplorer application. It implements the key pages and components outlined in the project requirements, establishing the visual structure and navigation flow. The interface is built with Next.js and Tailwind CSS, designed with a GitHub-inspired dark theme for consistency with the developer environment.

Changes

  1. Global Layout & Theming
  • Theme: Implemented a dark mode theme consistent with GitHub's design language (#0d1117 background, #c9d1d9 text, #30363d borders).
  • Navigation: Added a responsive global Navbar with links to all major sections.
  • Footer: Added a standard footer component.
  1. Home Page
  • Focuses on user-centric activity and notifications.
  • Recent Activity: Displays a feed of recent user actions (issues created, PRs merged, etc.).
  • Mentions: Highlights recent mentions from GitHub and Discord with read/unread status.
  • Your Issues/PRs: Lists user-specific issues and pull requests with status filters.
  • Maintainer Activity: Placeholder for reviewing PRs and issue comments.
  • User Heatmap: Visualizes user contributions over time.
  1. Organization Page
    Provides a high-level overview of the organization's health.
  • Org Heatmap: Visualizes global organization activity.
  • Active Repos: Highlights repositories with the most recent activity.
  • Org Activity: Feeds for recent issues and PRs across the organization.
  1. Projects Page
  • Repo Cards: Grid view of repositories showing key stats (issues, PRs, last active time).
  • Navigation: Links directly to the repo-specific details page.
  1. Discovery Page
    Helps users find interesting content.
  • Natural Language Search: UI for semantic search queries.
  • Topic Clusters: Categorized tags for exploring projects (e.g., "Machine Learning", "Blockchain").
  1. Governance Page
    Monitoring dashboard for project health and compliance.
  • Health Stats: Dead issues, zombie PRs, and healthy repo counts.
  • Risk Analysis: Highlights "bus factor" risks (dependency on single contributors).
  • Audits: Visualization for license compliance and security vulnerability scans.
  1. Repository Details
  • Dynamic route page for individual repositories.
  • Placeholder tabs for Code, Issues, PRs, and Insights.
  1. Profile Page
  • User profile header with editing capabilities.
  • Role Management: Settings to change user roles (Contributor, Maintainer, Admin).
  • Connected Accounts: UI for managing linked GitHub and Discord accounts.

Checklist

  • [x ] My code follows the project's code style and conventions
  • [ x] I have made corresponding changes to the documentation
  • [ x] My changes generate no new warnings or errors
  • [ x] I have joined the Discord server and I will share a link to this PR with the project maintainers there
  • [ x] I have read the Contributing Guidelines

Summary by CodeRabbit

  • New Features

    • Added Discovery page with search and topic browsing
    • Added Governance dashboard with metrics and audits
    • Added Organization and Projects pages with activity tracking
    • Added Repository detail page and Profile page
    • Added navigation bar and footer components
  • Refactor

    • Migrated from Vite to Next.js framework
    • Updated TypeScript and ESLint configurations for Next.js
    • Introduced Tailwind CSS for styling
  • Chores

    • Updated dependencies: added Next.js, PostCSS, Tailwind CSS; removed Vite
    • Added PostCSS configuration
    • Updated gitignore for Next.js build output

@coderabbitai
Copy link

coderabbitai bot commented Feb 14, 2026

📝 Walkthrough

Walkthrough

Comprehensive migration from Vite-based React application to Next.js framework, including addition of Tailwind CSS, new dashboard pages (Home, Organization, Projects, Discovery, Governance, Profile, Repo), shared components (Navbar, Footer), and reorganization of configuration files for TypeScript, ESLint, and PostCSS.

Changes

Cohort / File(s) Summary
Framework & Build Configuration
.gitignore, eslint.config.js, package.json, tsconfig.json, tsconfig.app.json, tsconfig.node.json
Removed Vite and tsc tooling; introduced Next.js build system. Updated package.json scripts (dev/build/start/lint) for Next.js. Replaced old tsconfig references with unified configuration including Next.js plugin, path aliases (@/*), and es5 target. Removed Node-specific tsconfig. Added .next to ESLint ignores.
Next.js Configuration
next.config.ts, next-env.d.ts
Added Next.js config export and TypeScript ambient declarations for Next.js types with routes reference.
Styling & PostCSS
postcss.config.mjs, src/app/globals.css, src/App.css, src/index.css
New PostCSS config with Tailwind plugin. Added global CSS with Tailwind base import, dark theme variables (bg/fg colors), and font stack. Removed old root CSS declarations from src/index.css and src/App.css.
Removed Vite & Old React Bootstrap
vite.config.ts, src/main.tsx, src/App.tsx, index.html
Deleted entire Vite configuration, React bootstrap entry point, top-level App component, and HTML entry file—no longer needed under Next.js app router model.
Root Layout & Home Page
src/app/layout.tsx, src/app/page.tsx
New Next.js RootLayout with metadata, Navbar, Footer, and full HTML structure. Home page composes RecentActivity, Mentions, MaintainerActivity, YourIssuesPRs, and UserHeatMap components in responsive grid layout.
Dashboard Pages
src/app/organization/page.tsx, src/app/projects/page.tsx, src/app/discovery/page.tsx, src/app/governance/page.tsx, src/app/profile/page.tsx, src/app/repo/[repoId]/page.tsx
Six new page components: Organization (OrgHeatMap, OrgActivity, ActiveRepos), Projects (static repo grid with cards), Discovery (search and topic clusters), Governance (stat cards and audit panels with internal StatCard component), Profile (user info and settings), Repo (dynamic route with repo details and file explorer placeholder).
Home Section Components
src/components/Home/Hero.tsx, src/components/Home/RecentActivity.tsx, src/components/Home/Mentions.tsx, src/components/Home/MaintainerActivity.tsx, src/components/Home/YourIssuesPRs.tsx, src/components/Home/UserHeatMap.tsx, src/components/Home/dummyData.ts
Six presentational components for home dashboard with dummy data export. RecentActivity and Mentions iterate over arrays; UserHeatMap renders 53-week contribution grid with random levels and color palette; YourIssuesPRs displays dual panels for issues and PRs with status badges.
Organization & Shared Components
src/components/Organization/OrgHeatMap.tsx, src/components/Organization/OrgActivity.tsx, src/components/Organization/ActiveRepos.tsx, src/components/Shared/Navbar.tsx, src/components/Shared/Footer.tsx
Three organization components (heatmap placeholder, recent issues/PRs cards, active repos list). Navbar with brand, nav links to all pages, and profile link; Footer with copyright and links.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Suggested labels

javascript, frontend, dependencies, configuration, size/XL

Suggested reviewers

  • Zahnentferner

Poem

🐰 A hop, skip, and jest to Next.js we go,
Dashboard pages sprouting row by row,
Tailwind's twists and layout's dance,
From Vite's flame to Next's advance,
OrgExplorer's home now shines so bright!

🚥 Pre-merge checks | ✅ 5 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Implement initial UI for OrgExplorer pages' accurately reflects the main change: introducing comprehensive UI components and pages for the OrgExplorer application using Next.js and Tailwind CSS.
Linked Issues check ✅ Passed The PR implements all key requirements from issue #15: Home page with recent activity, mentions, issues/PRs sections, maintainer activity, and heatmap; Organization page with heatmap and active repos; Projects page with repo grid; Discovery page with search UI; Governance page with health stats; Repo-specific page with dynamic routing; Profile page with role and account management. All major features are present as static components ready for data integration.
Out of Scope Changes check ✅ Passed All changes are in scope: migration from Vite to Next.js (required for the framework), configuration files (eslint, tsconfig, postcss, next config), UI components for all specified pages, and global styling/layout. No unrelated functionality or refactoring is present.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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 and usage tips.

@github-actions github-actions bot added size/XL and removed size/XL labels Feb 14, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 9

🤖 Fix all issues with AI agents
In `@src/app/organization/page.tsx`:
- Around line 11-14: The two components OrgHeatMap and OrgActivity inside the
same container render flush; update the parent div (the one wrapping OrgHeatMap
and OrgActivity) to add vertical spacing by applying a Tailwind spacing utility
(e.g., use a vertical spacing class such as space-y-6 or make it a flex-col with
gap-6) so there is consistent gap between OrgHeatMap and OrgActivity.

In `@src/app/profile/page.tsx`:
- Around line 29-43: The labels for "Current Role" and "Email Visibility" are
not associated with their selects; add matching id attributes on the select
elements and htmlFor attributes on the corresponding label elements (e.g., label
htmlFor="currentRole" with select id="currentRole", and label
htmlFor="emailVisibility" with select id="emailVisibility") so the <label> and
<select> pairs in the JSX are properly linked.
- Around line 49-61: The "Connect" items are non-interactive spans and must be
real interactive controls: replace the two <span className="text-[`#8b949e`]
text-xs font-semibold">Connect</span> nodes for Discord and GitLab with <button>
elements (e.g., a ConnectButton or inline button) inside the same parent divs
used in the profile page render (page.tsx), keep existing classes for styling,
add type="button", and include accessible attributes (aria-label describing the
action, and keyboard focus styles) plus onClick handlers that invoke the
appropriate connect logic (or a noop placeholder) so these controls are
keyboard- and screen-reader-accessible.

In `@src/app/projects/page.tsx`:
- Around line 19-21: The Link currently builds its href using
project.name.split('/')[1], which is fragile; change the href to use project.id
instead (i.e., replace the `/repo/${project.name.split('/')[1]}` expression with
`/repo/${project.id}`) and ensure the Link rendering (the JSX element using
project.name) still displays project.name while navigation uses project.id;
update any related usages in the same component that rely on the split pattern.

In `@src/components/Home/RecentActivity.tsx`:
- Line 19: The rendering uses activity.type.replace('_', ' ') which only
replaces the first underscore; update the code in RecentActivity.tsx to replace
all underscores (e.g., change activity.type.replace('_', ' ') to
activity.type.replace(/_/g, ' ') or activity.type.replaceAll('_', ' ')) so
multi-underscore types like "issue_comment_created" become "issue comment
created".

In `@src/components/Home/UserHeatMap.tsx`:
- Around line 3-5: The component calls getLevel() (which uses Math.random())
during render causing unstable colors on every re-render; move random generation
out of the render path by creating a stable heatmapData array once (e.g., in
UserHeatMap using React.useMemo or as a module-level constant) and replace JSX
calls to getLevel() with lookups like heatmapData[weekIndex][dayIndex]; ensure
useMemo dependencies are set so data is created only once for the component
lifecycle and keep the getLevel helper removed or used only inside the
memoization logic.

In `@src/components/Organization/ActiveRepos.tsx`:
- Line 18: In the ActiveRepos component update the displayed text in the JSX
where the repo summary is rendered (the <p> element showing "{repo.issues}
issues • {repo.prs} PRs these week") to correct the typo from "these week" to
"this week" so it reads "{repo.issues} issues • {repo.prs} PRs this week".

In `@src/components/Shared/Footer.tsx`:
- Around line 10-16: The footer currently uses non-semantic, non-focusable
<span> elements in the div with className "flex space-x-6"; replace each <span
className="hover:text-[`#58a6ff`]
cursor-pointer">Term/Privacy/Security/Status/Contact</span> with an accessible
interactive element — either an anchor (<a href="#">...</a>) or Next.js <Link>
wrapping an <a> — preserving the existing classes for styling so the links
remain keyboard-focusable and announced by screen readers; if any link is a
placeholder use href="#" and include descriptive aria-label attributes where
needed.

In `@src/components/Shared/Navbar.tsx`:
- Around line 15-21: Navbar currently hides navigation links on small screens
via the "hidden md:flex" wrapper, leaving no mobile menu; add a responsive
mobile toggle: introduce local state (useState) in the Navbar component to track
an "open" mobile menu, render a hamburger button (with accessible
aria-controls/aria-expanded) visible on small screens (e.g., "md:hidden") that
toggles the state, and conditionally render the links block for small screens
(e.g., a vertical menu or popover when open) while keeping the existing desktop
"hidden md:flex" for larger viewports; ensure Link click handlers close the
mobile menu and include keyboard accessibility (Esc to close) if possible.
🧹 Nitpick comments (17)
src/components/Home/Hero.tsx (1)

1-1: Unnecessary React import.

With the new JSX transform (enabled by default in Next.js), you don't need to import React for JSX to work.

♻️ Suggested fix
-import React from 'react'
-
-const Hero = () => {
+const Hero = () => {
.gitignore (1)

409-409: Redundant .gitignore entry.

.next/ on line 368 already ignores the Next.js build output directory. This bare .next entry on line 409 is redundant and can be removed.

src/app/globals.css (1)

3-12: Define theme color tokens to avoid hardcoded hex values across components.

You define --background and --foreground CSS variables here, but every component in this PR hardcodes the same hex values (#0d1117, #161b22, #30363d, #8b949e, #58a6ff, #c9d1d9, #21262d, etc.) directly in Tailwind classes. Consider registering these as Tailwind v4 theme tokens inside the @theme block so components can use semantic names (e.g., bg-surface, text-muted, border-default) instead of raw hex codes.

This makes future palette changes a single-line edit rather than a find-and-replace across dozens of files.

Example `@theme` extension
 `@theme` {
+  --color-surface: `#161b22`;
+  --color-canvas: `#0d1117`;
+  --color-border: `#30363d`;
+  --color-muted: `#8b949e`;
+  --color-accent: `#58a6ff`;
+  --color-fg: `#c9d1d9`;
+  --color-overlay: `#21262d`;
   --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
     "Helvetica Neue", "Arial", "Noto Sans", sans-serif, "Apple Color Emoji",
     "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
 }

Then use e.g. bg-surface, text-muted, border-border in components.

src/app/repo/[repoId]/page.tsx (1)

14-21: Tab navigation uses non-interactive <span> elements.

These tab-like elements lack semantic meaning and keyboard accessibility. When replacing placeholders with real functionality, use <button> or <a> elements (or a proper tab component) to ensure keyboard navigation and screen reader support.

tsconfig.json (1)

18-18: jsx should be "preserve" for Next.js projects.

Next.js (via SWC/Turbopack) handles JSX transformation itself. The standard Next.js tsconfig.json uses "jsx": "preserve". While "react-jsx" won't break anything with "noEmit": true, it deviates from convention and may cause confusing type-check behavior.

Suggested fix
-    "jsx": "react-jsx",
+    "jsx": "preserve",
eslint.config.js (1)

6-22: Consider adding @next/eslint-plugin-next for Next.js-specific linting.

This is a Next.js project but the ESLint config only includes generic TS and React hooks rules. The @next/eslint-plugin-next plugin catches common Next.js pitfalls (e.g., <img> instead of next/image, incorrect next/link usage, missing metadata). Consider adding it as the project matures.

src/components/Home/UserHeatMap.tsx (1)

14-23: <select> elements are non-functional without "use client".

Server components cannot handle client-side interactions. These dropdowns are inert as-is. Add "use client" at the top of the file when wiring up event handlers.

src/app/discovery/page.tsx (1)

31-46: Two-column grid lacks a mobile breakpoint.

grid-cols-2 will render two narrow columns on small screens. Consider grid-cols-1 md:grid-cols-2 for better mobile layout.

Suggested fix
-            <div className="mt-8 grid grid-cols-2 gap-4">
+            <div className="mt-8 grid grid-cols-1 md:grid-cols-2 gap-4">
src/components/Organization/OrgActivity.tsx (1)

8-12: Last list item has a trailing bottom border.

Every <li> gets border-b, including the last one. Add last:border-b-0 to avoid an unnecessary border at the bottom of each list.

Proposed fix (apply to both lists)
-                    <li className="p-2 border-b border-[`#30363d`]">Issue `#101` in Repo A</li>
-                    <li className="p-2 border-b border-[`#30363d`]">Issue `#204` in Repo B</li>
-                    <li className="p-2 border-b border-[`#30363d`]">Issue `#55` in Repo C</li>
+                    <li className="p-2 border-b last:border-b-0 border-[`#30363d`]">Issue `#101` in Repo A</li>
+                    <li className="p-2 border-b last:border-b-0 border-[`#30363d`]">Issue `#204` in Repo B</li>
+                    <li className="p-2 border-b last:border-b-0 border-[`#30363d`]">Issue `#55` in Repo C</li>
src/components/Shared/Navbar.tsx (1)

24-28: Add an accessible label to the profile link.

Screen readers will announce the link content as "Me" without any context. Adding an aria-label improves accessibility.

Proposed fix
-          <Link href="/profile" className="hover:text-gray-300 transition-colors">
+          <Link href="/profile" className="hover:text-gray-300 transition-colors" aria-label="Profile">
src/components/Home/YourIssuesPRs.tsx (2)

26-27: Use Next.js Link (or a button) instead of <a href="#">.

The rest of the app uses next/link for navigation. Anchor tags with href="#" cause a scroll-to-top side effect and aren't semantically correct for actions. If these are placeholders for future navigation, use Link; if they'll trigger client-side behavior, use <button>.

Also applies to: 51-53


4-57: Consider extracting the duplicated card layout into a shared sub-component.

The Issues and PRs panels share nearly identical markup: header with title + action buttons, mapped item list with badge, and a footer link. A small ItemListCard component accepting title, items, actions, and a render callback would eliminate the duplication and make it easier to add the "Export" button to Issues later (currently only PRs has it).

src/app/governance/page.tsx (2)

3-8: Consider simplifying the StatCard border-color logic.

The triple ternary in the className string is correct but hard to scan. A small lookup object would improve readability.

Suggested approach
+const borderColors: Record<'good' | 'bad' | 'neutral', string> = {
+  bad: 'border-l-[`#f85149`]',
+  good: 'border-l-[`#3fb950`]',
+  neutral: 'border-l-[`#8b949e`]',
+};
+
 const StatCard = ({ title, count, type }: { title: string, count: number, type: 'good' | 'bad' | 'neutral' }) => (
-    <div className={`p-4 border rounded-md bg-[`#161b22`] shadow-sm ${type === 'bad' ? 'border-l-4 border-l-[`#f85149`] border-[`#30363d`]' : type === 'good' ? 'border-l-4 border-l-[`#3fb950`] border-[`#30363d`]' : 'border-l-4 border-l-[`#8b949e`] border-[`#30363d`]'}`}>
+    <div className={`p-4 border border-[`#30363d`] border-l-4 ${borderColors[type]} rounded-md bg-[`#161b22`] shadow-sm`}>

1-60: Cross-cutting observation: hardcoded color hex values are repeated across all files.

Colors like #161b22, #30363d, #c9d1d9, #8b949e, #58a6ff, #3fb950, and #f85149 appear dozens of times across components. In Tailwind v4, you can define these as theme tokens in your CSS using the @theme directive, then reference them as semantic utilities (e.g., bg-surface, text-muted, border-subtle). This would make the theme maintainable and reduce the risk of typos or inconsistencies.

src/app/layout.tsx (1)

18-18: Consider extracting hardcoded colors to CSS custom properties or Tailwind theme tokens.

#0d1117 and #c9d1d9 are GitHub's dark-theme colors and are likely reused across many components. Defining them once (e.g., via @theme in Tailwind v4 or CSS variables in globals.css) avoids scattering magic hex values and makes future theme changes a single-point edit.

src/components/Home/dummyData.ts (1)

1-22: Consider adding TypeScript interfaces for the mock data shapes.

The objects have inconsistent optional fields — e.g., issues items have either created or assigned but not both, and recentActivity[2] has a from field unique to that entry. Without explicit types, consuming components may access missing properties without a compile-time warning.

Even for dummy data, lightweight interfaces help catch mismatches early:

Example types
interface Activity {
  id: number;
  type: string;
  repo: string;
  title: string;
  date: string;
  from?: string;
}

interface Mention {
  id: number;
  platform: 'GitHub' | 'Discord';
  author: string;
  type: string;
  title: string;
  status: 'read' | 'unread';
  time: string;
}

interface Issue {
  id: number;
  title: string;
  repo: string;
  status: 'open' | 'closed';
  created?: string;
  assigned?: string;
}

interface PR {
  id: number;
  title: string;
  repo: string;
  status: 'open' | 'merged' | 'closed';
  created: string;
}
package.json (1)

20-30: Remove eslint-plugin-react-refresh; consider adding Next.js ESLint configuration.

eslint-plugin-react-refresh (line 27) is not Vite-specific—it's bundler-agnostic and designed for Fast Refresh safety checks. However, it's not necessary for Next.js projects since Next.js already enforces Fast Refresh behavior through its own mechanisms. Removing it simplifies the dev dependencies.

Additionally, the current custom ESLint config in eslint.config.js doesn't extend any Next.js-specific rules. While the custom flat config is functional, consider either:

  • Adding eslint-config-next (the official Next.js ESLint preset) to get Next.js-specific linting rules and best practices, or
  • Adding @next/eslint-plugin-next directly if you prefer a custom configuration

Note: Starting with Next.js v16.0.0, the next lint command was removed in favor of using the ESLint CLI directly, so ensure your ESLint setup aligns with current Next.js practices for version 16.1.6.

Comment on lines +11 to +14
<div className="lg:col-span-2">
<OrgHeatMap />
<OrgActivity />
</div>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Missing vertical spacing between OrgHeatMap and OrgActivity.

These two components sit inside a plain div with no gap or spacing utility, so they'll render flush against each other. The parent grid provides gap-6 between grid cells but not between siblings within the same cell.

Proposed fix
-        <div className="lg:col-span-2">
+        <div className="lg:col-span-2 space-y-6">
📝 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
<div className="lg:col-span-2">
<OrgHeatMap />
<OrgActivity />
</div>
<div className="lg:col-span-2 space-y-6">
<OrgHeatMap />
<OrgActivity />
</div>
🤖 Prompt for AI Agents
In `@src/app/organization/page.tsx` around lines 11 - 14, The two components
OrgHeatMap and OrgActivity inside the same container render flush; update the
parent div (the one wrapping OrgHeatMap and OrgActivity) to add vertical spacing
by applying a Tailwind spacing utility (e.g., use a vertical spacing class such
as space-y-6 or make it a flex-col with gap-6) so there is consistent gap
between OrgHeatMap and OrgActivity.

Comment on lines +29 to +43
<div className="mb-4">
<label className="block text-sm font-medium text-[#8b949e] mb-1">Current Role</label>
<select className="w-full bg-[#0d1117] text-[#c9d1d9] border-[#30363d] rounded-md shadow-sm border p-2">
<option>Contributor</option>
<option>Maintainer</option>
<option>Admin</option>
</select>
</div>
<div className="mb-4">
<label className="block text-sm font-medium text-[#8b949e] mb-1">Email Visibility</label>
<select className="w-full bg-[#0d1117] text-[#c9d1d9] border-[#30363d] rounded-md shadow-sm border p-2">
<option>Public</option>
<option>Private</option>
</select>
</div>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Associate <label> elements with their <select> inputs.

The <label> elements lack htmlFor attributes and the <select> elements lack id attributes. Screen readers won't associate them, reducing form accessibility.

Suggested fix (example for one pair)
-                   <label className="block text-sm font-medium text-[`#8b949e`] mb-1">Current Role</label>
-                   <select className="w-full bg-[`#0d1117`] text-[`#c9d1d9`] border-[`#30363d`] rounded-md shadow-sm border p-2">
+                   <label htmlFor="current-role" className="block text-sm font-medium text-[`#8b949e`] mb-1">Current Role</label>
+                   <select id="current-role" className="w-full bg-[`#0d1117`] text-[`#c9d1d9`] border-[`#30363d`] rounded-md shadow-sm border p-2">

Apply the same pattern for the "Email Visibility" label/select pair.

🤖 Prompt for AI Agents
In `@src/app/profile/page.tsx` around lines 29 - 43, The labels for "Current Role"
and "Email Visibility" are not associated with their selects; add matching id
attributes on the select elements and htmlFor attributes on the corresponding
label elements (e.g., label htmlFor="currentRole" with select id="currentRole",
and label htmlFor="emailVisibility" with select id="emailVisibility") so the
<label> and <select> pairs in the JSX are properly linked.

Comment on lines +49 to +61
<div className="flex items-center justify-between p-3 bg-[#0d1117] rounded border border-[#30363d]">
<span className="font-medium text-sm text-[#c9d1d9]">GitHub</span>
<span className="text-[#3fb950] text-xs font-semibold">Connected</span>
</div>
<div className="flex items-center justify-between p-3 bg-[#0d1117] rounded border border-[#30363d]">
<span className="font-medium text-sm text-[#c9d1d9]">Discord</span>
<span className="text-[#8b949e] text-xs font-semibold">Connect</span>
</div>
<div className="flex items-center justify-between p-3 bg-[#0d1117] rounded border border-[#30363d]">
<span className="font-medium text-sm text-[#c9d1d9]">GitLab</span>
<span className="text-[#8b949e] text-xs font-semibold">Connect</span>
</div>
</div>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

"Connect" actions should be interactive elements.

The "Connect" text on lines 55 and 59 appears clickable but uses <span>, making it inaccessible to keyboard and screen reader users. Use <button> elements instead.

Suggested fix
-                        <span className="text-[`#8b949e`] text-xs font-semibold">Connect</span>
+                        <button className="text-[`#8b949e`] text-xs font-semibold hover:text-[`#58a6ff`] bg-transparent border-none cursor-pointer">Connect</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
<div className="flex items-center justify-between p-3 bg-[#0d1117] rounded border border-[#30363d]">
<span className="font-medium text-sm text-[#c9d1d9]">GitHub</span>
<span className="text-[#3fb950] text-xs font-semibold">Connected</span>
</div>
<div className="flex items-center justify-between p-3 bg-[#0d1117] rounded border border-[#30363d]">
<span className="font-medium text-sm text-[#c9d1d9]">Discord</span>
<span className="text-[#8b949e] text-xs font-semibold">Connect</span>
</div>
<div className="flex items-center justify-between p-3 bg-[#0d1117] rounded border border-[#30363d]">
<span className="font-medium text-sm text-[#c9d1d9]">GitLab</span>
<span className="text-[#8b949e] text-xs font-semibold">Connect</span>
</div>
</div>
<div className="flex items-center justify-between p-3 bg-[`#0d1117`] rounded border border-[`#30363d`]">
<span className="font-medium text-sm text-[`#c9d1d9`]">GitHub</span>
<span className="text-[`#3fb950`] text-xs font-semibold">Connected</span>
</div>
<div className="flex items-center justify-between p-3 bg-[`#0d1117`] rounded border border-[`#30363d`]">
<span className="font-medium text-sm text-[`#c9d1d9`]">Discord</span>
<button className="text-[`#8b949e`] text-xs font-semibold hover:text-[`#58a6ff`] bg-transparent border-none cursor-pointer">Connect</button>
</div>
<div className="flex items-center justify-between p-3 bg-[`#0d1117`] rounded border border-[`#30363d`]">
<span className="font-medium text-sm text-[`#c9d1d9`]">GitLab</span>
<button className="text-[`#8b949e`] text-xs font-semibold hover:text-[`#58a6ff`] bg-transparent border-none cursor-pointer">Connect</button>
</div>
</div>
🤖 Prompt for AI Agents
In `@src/app/profile/page.tsx` around lines 49 - 61, The "Connect" items are
non-interactive spans and must be real interactive controls: replace the two
<span className="text-[`#8b949e`] text-xs font-semibold">Connect</span> nodes for
Discord and GitLab with <button> elements (e.g., a ConnectButton or inline
button) inside the same parent divs used in the profile page render (page.tsx),
keep existing classes for styling, add type="button", and include accessible
attributes (aria-label describing the action, and keyboard focus styles) plus
onClick handlers that invoke the appropriate connect logic (or a noop
placeholder) so these controls are keyboard- and screen-reader-accessible.

Comment on lines +19 to +21
<Link href={`/repo/${project.name.split('/')[1]}`} className="font-semibold text-[#58a6ff] hover:underline text-lg">
{project.name}
</Link>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Use project.id for the route instead of splitting project.name.

project.name.split('/')[1] is fragile — if the name format changes or lacks a /, this silently produces /repo/undefined. The id field already exists for exactly this purpose.

Suggested fix
-                 <Link href={`/repo/${project.name.split('/')[1]}`} className="font-semibold text-[`#58a6ff`] hover:underline text-lg">
+                 <Link href={`/repo/${project.id}`} className="font-semibold text-[`#58a6ff`] hover:underline text-lg">
📝 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
<Link href={`/repo/${project.name.split('/')[1]}`} className="font-semibold text-[#58a6ff] hover:underline text-lg">
{project.name}
</Link>
<Link href={`/repo/${project.id}`} className="font-semibold text-[`#58a6ff`] hover:underline text-lg">
{project.name}
</Link>
🤖 Prompt for AI Agents
In `@src/app/projects/page.tsx` around lines 19 - 21, The Link currently builds
its href using project.name.split('/')[1], which is fragile; change the href to
use project.id instead (i.e., replace the `/repo/${project.name.split('/')[1]}`
expression with `/repo/${project.id}`) and ensure the Link rendering (the JSX
element using project.name) still displays project.name while navigation uses
project.id; update any related usages in the same component that rely on the
split pattern.

</div>
<div>
<p className="text-[#c9d1d9]">
<span className="font-semibold">{activity.type.replace('_', ' ')}</span>: {activity.title}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

replace('_', ' ') only replaces the first underscore.

String.prototype.replace with a string argument replaces only the first match. If an activity type like issue_comment_created is added, it would render as "issue comment_created". Use a global replace instead.

Proposed fix
-                <span className="font-semibold">{activity.type.replace('_', ' ')}</span>: {activity.title}
+                <span className="font-semibold">{activity.type.replaceAll('_', ' ')}</span>: {activity.title}
📝 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
<span className="font-semibold">{activity.type.replace('_', ' ')}</span>: {activity.title}
<span className="font-semibold">{activity.type.replaceAll('_', ' ')}</span>: {activity.title}
🤖 Prompt for AI Agents
In `@src/components/Home/RecentActivity.tsx` at line 19, The rendering uses
activity.type.replace('_', ' ') which only replaces the first underscore; update
the code in RecentActivity.tsx to replace all underscores (e.g., change
activity.type.replace('_', ' ') to activity.type.replace(/_/g, ' ') or
activity.type.replaceAll('_', ' ')) so multi-underscore types like
"issue_comment_created" become "issue comment created".

Comment on lines +3 to +5
const UserHeatMap = () => {
// varied colors for heatmap
const getLevel = () => Math.floor(Math.random() * 5);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Math.random() called during render will produce unstable output in a client component.

getLevel() is invoked per cell on every render (371 calls). In a server component this renders once, but once you add "use client" for interactivity (the <select> elements need it), the heatmap colors will randomly change on every re-render. Generate the data once outside the render path (e.g., via useMemo or a module-level constant).

Suggested approach
+'use client';
 import React from 'react';
+import { useMemo } from 'react';

 const UserHeatMap = () => {
-  const getLevel = () => Math.floor(Math.random() * 5);
+  const heatmapData = useMemo(
+    () => Array.from({ length: 53 }, () =>
+      Array.from({ length: 7 }, () => Math.floor(Math.random() * 5))
+    ),
+    []
+  );
   const colors = ['bg-[`#161b22`]', 'bg-[`#0e4429`]', 'bg-[`#006d32`]', 'bg-[`#26a641`]', 'bg-[`#39d353`]'];

Then reference heatmapData[weekIndex][dayIndex] instead of calling getLevel() in the JSX.

🤖 Prompt for AI Agents
In `@src/components/Home/UserHeatMap.tsx` around lines 3 - 5, The component calls
getLevel() (which uses Math.random()) during render causing unstable colors on
every re-render; move random generation out of the render path by creating a
stable heatmapData array once (e.g., in UserHeatMap using React.useMemo or as a
module-level constant) and replace JSX calls to getLevel() with lookups like
heatmapData[weekIndex][dayIndex]; ensure useMemo dependencies are set so data is
created only once for the component lifecycle and keep the getLevel helper
removed or used only inside the memoization logic.

<div key={repo.name} className="flex items-center justify-between p-3 border border-[#30363d] rounded hover:bg-[#21262d]">
<div>
<h3 className="text-sm font-semibold text-[#58a6ff]">{repo.name}</h3>
<p className="text-xs text-[#8b949e]">{repo.issues} issues • {repo.prs} PRs these week</p>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Typo: "these week" → "this week".

Proposed fix
-                <p className="text-xs text-[`#8b949e`]">{repo.issues} issues • {repo.prs} PRs these week</p>
+                <p className="text-xs text-[`#8b949e`]">{repo.issues} issues • {repo.prs} PRs this week</p>
📝 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
<p className="text-xs text-[#8b949e]">{repo.issues} issues • {repo.prs} PRs these week</p>
<p className="text-xs text-[`#8b949e`]">{repo.issues} issues • {repo.prs} PRs this week</p>
🤖 Prompt for AI Agents
In `@src/components/Organization/ActiveRepos.tsx` at line 18, In the ActiveRepos
component update the displayed text in the JSX where the repo summary is
rendered (the <p> element showing "{repo.issues} issues • {repo.prs} PRs these
week") to correct the typo from "these week" to "this week" so it reads
"{repo.issues} issues • {repo.prs} PRs this week".

Comment on lines +10 to +16
<div className="flex space-x-6">
<span className="hover:text-[#58a6ff] cursor-pointer">Terms</span>
<span className="hover:text-[#58a6ff] cursor-pointer">Privacy</span>
<span className="hover:text-[#58a6ff] cursor-pointer">Security</span>
<span className="hover:text-[#58a6ff] cursor-pointer">Status</span>
<span className="hover:text-[#58a6ff] cursor-pointer">Contact</span>
</div>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Footer links are not accessible — use <a> or <button> instead of <span>.

These <span> elements look clickable (cursor-pointer, hover styles) but are not focusable via keyboard and have no semantic role. Screen readers and keyboard users cannot interact with them.

Even as placeholders, use <a href="#"> (or Next.js <Link>) so they are natively focusable and announced as links.

Suggested fix
-          <span className="hover:text-[`#58a6ff`] cursor-pointer">Terms</span>
-          <span className="hover:text-[`#58a6ff`] cursor-pointer">Privacy</span>
-          <span className="hover:text-[`#58a6ff`] cursor-pointer">Security</span>
-          <span className="hover:text-[`#58a6ff`] cursor-pointer">Status</span>
-          <span className="hover:text-[`#58a6ff`] cursor-pointer">Contact</span>
+          <a href="#" className="hover:text-[`#58a6ff`]">Terms</a>
+          <a href="#" className="hover:text-[`#58a6ff`]">Privacy</a>
+          <a href="#" className="hover:text-[`#58a6ff`]">Security</a>
+          <a href="#" className="hover:text-[`#58a6ff`]">Status</a>
+          <a href="#" className="hover:text-[`#58a6ff`]">Contact</a>
📝 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
<div className="flex space-x-6">
<span className="hover:text-[#58a6ff] cursor-pointer">Terms</span>
<span className="hover:text-[#58a6ff] cursor-pointer">Privacy</span>
<span className="hover:text-[#58a6ff] cursor-pointer">Security</span>
<span className="hover:text-[#58a6ff] cursor-pointer">Status</span>
<span className="hover:text-[#58a6ff] cursor-pointer">Contact</span>
</div>
<div className="flex space-x-6">
<a href="#" className="hover:text-[`#58a6ff`]">Terms</a>
<a href="#" className="hover:text-[`#58a6ff`]">Privacy</a>
<a href="#" className="hover:text-[`#58a6ff`]">Security</a>
<a href="#" className="hover:text-[`#58a6ff`]">Status</a>
<a href="#" className="hover:text-[`#58a6ff`]">Contact</a>
</div>
🤖 Prompt for AI Agents
In `@src/components/Shared/Footer.tsx` around lines 10 - 16, The footer currently
uses non-semantic, non-focusable <span> elements in the div with className "flex
space-x-6"; replace each <span className="hover:text-[`#58a6ff`]
cursor-pointer">Term/Privacy/Security/Status/Contact</span> with an accessible
interactive element — either an anchor (<a href="#">...</a>) or Next.js <Link>
wrapping an <a> — preserving the existing classes for styling so the links
remain keyboard-focusable and announced by screen readers; if any link is a
placeholder use href="#" and include descriptive aria-label attributes where
needed.

Comment on lines +15 to +21
<div className="hidden md:flex space-x-6 text-sm font-semibold">
<Link href="/" className="hover:text-gray-300 transition-colors">Home</Link>
<Link href="/organization" className="hover:text-gray-300 transition-colors">Organization</Link>
<Link href="/projects" className="hover:text-gray-300 transition-colors">Projects</Link>
<Link href="/discovery" className="hover:text-gray-300 transition-colors">Discovery</Link>
<Link href="/governance" className="hover:text-gray-300 transition-colors">Governance</Link>
</div>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

No mobile navigation — links are completely hidden on small screens.

hidden md:flex hides all nav links below the md breakpoint with no hamburger menu or alternative. Users on mobile devices can only reach Home (via logo) and Profile, but not Organization, Projects, Discovery, or Governance.

Consider adding a mobile menu toggle (e.g., a hamburger button that reveals links) to ensure all pages remain accessible on smaller viewports.

🤖 Prompt for AI Agents
In `@src/components/Shared/Navbar.tsx` around lines 15 - 21, Navbar currently
hides navigation links on small screens via the "hidden md:flex" wrapper,
leaving no mobile menu; add a responsive mobile toggle: introduce local state
(useState) in the Navbar component to track an "open" mobile menu, render a
hamburger button (with accessible aria-controls/aria-expanded) visible on small
screens (e.g., "md:hidden") that toggles the state, and conditionally render the
links block for small screens (e.g., a vertical menu or popover when open) while
keeping the existing desktop "hidden md:flex" for larger viewports; ensure Link
click handlers close the mobile menu and include keyboard accessibility (Esc to
close) if possible.

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]: Implement basic dashboard with Home page and navigation

1 participant