Skip to content

feat: add Vue Simulator section to Releases page - #175

Merged
naman79820 merged 15 commits into
CircuitVerse:mainfrom
Ayush1169:fix/vue-simulator-releases
Jan 9, 2026
Merged

feat: add Vue Simulator section to Releases page#175
naman79820 merged 15 commits into
CircuitVerse:mainfrom
Ayush1169:fix/vue-simulator-releases

Conversation

@Ayush1169

@Ayush1169 Ayush1169 commented Jan 9, 2026

Copy link
Copy Markdown

Description

This PR adds a dedicated Vue Simulator section to the Releases page.

The Releases page now supports multiple repositories via tabs:

  • Mobile App
  • Vue Simulator

For Vue Simulator, a placeholder state is shown when no releases are available, ensuring the UI is future-ready and consistent.

Once Vue Simulator releases are created on GitHub, they will automatically appear without requiring further frontend changes.

Related Issue

Fixes #104

Type of change

  • Feature

Checklist

  • Code follows project style
  • Tested locally
  • No unnecessary files added
  • PR title is clear and descriptive
Screenshot 2026-01-09 193748

Summary by CodeRabbit

  • New Features

    • Releases view now provides tabs to filter by "Mobile App" and "Vue Simulator" and shows a clear placeholder when no releases exist for the selected tab.
    • Releases page updated to use the new client-side tabbed releases component for streamlined rendering.
  • Style

    • Release cards improved for responsive layouts on small screens.
    • Text wrapping, spacing, and alignment adjusted to prevent overflow and improve readability.

✏️ Tip: You can customize this high-level summary in your review settings.

@netlify

netlify Bot commented Jan 9, 2026

Copy link
Copy Markdown

Deploy Preview for cv-community-dashboard ready!

Name Link
🔨 Latest commit ccdafe6
🔍 Latest deploy log https://app.netlify.com/projects/cv-community-dashboard/deploys/69613c2cd7357a0008df65e2
😎 Deploy Preview https://deploy-preview-175--cv-community-dashboard.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Jan 9, 2026

Copy link
Copy Markdown

Walkthrough

Replaces per-release map rendering in app/releases/page.tsx with a new client component ReleasesClient; updates components/Releases/ReleaseCard.tsx to a responsive, break-word layout and adjusted spacing; and adds a new client-side component components/Releases/ReleasesClient.tsx that provides a tabbed filter for releases by repository and renders ReleaseCard entries. No exported/public API signatures were removed.

Possibly related PRs

  • PR 120 in CircuitVerse/community-dashboard — modifies app/releases/page.tsx and components/Releases/ReleaseCard.tsx and introduces the initial releases page structure that this change refactors.
🚥 Pre-merge checks | ✅ 4 | ❌ 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 (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main feature addition: adding Vue Simulator support to the Releases page via tabs.
Description check ✅ Passed The description comprehensively covers the feature, related issue, type of change, completed checklist, and includes a screenshot demonstrating the implementation.
Linked Issues check ✅ Passed The PR addresses core requirements from issue #104: multiple repository tabs (Mobile App, Vue Simulator), placeholder states, and automatic display of releases when available.
Out of Scope Changes check ✅ Passed All changes are directly related to implementing the Vue Simulator releases feature, with no unrelated modifications found.

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

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

📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4ac6337 and ccdafe6.

📒 Files selected for processing (1)
  • .gitignore
✅ Files skipped from review due to trivial changes (1)
  • .gitignore

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.

@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

🤖 Fix all issues with AI agents
In @components/Releases/ReleasesClient.tsx:
- Around line 22-44: The tab container div and the two buttons need ARIA roles
and keyboard navigation: add role="tablist" to the div that wraps the buttons,
give each button role="tab", set aria-selected based on the activeRepo state
(e.g., aria-selected={activeRepo === "Mobile App"}), add aria-controls values
that reference the corresponding panel IDs (create matching id attributes on the
release panels), and ensure each button has an id used by the panel's
aria-labelledby; also implement Left/Right arrow key handlers on the buttons (or
a shared keyboard handler) to move focus between tabs and call setActiveRepo to
update the active tab accordingly.
🧹 Nitpick comments (1)
components/Releases/ReleasesClient.tsx (1)

12-13: Consider deriving available repositories dynamically from data.

The repository names are hard-coded, requiring manual code changes when new repos are added. Since the PR objectives mention supporting multiple repositories, consider making this extensible:

💡 Dynamic repo tabs approach
export default function ReleasesClient({
  releases,
}: {
  releases: Release[];
}) {
+  // Derive unique repos from data
+  const availableRepos = Array.from(new Set(releases.map(r => r.repo)));
+  const [activeRepo, setActiveRepo] = useState(availableRepos[0] || "");
-  const [activeRepo, setActiveRepo] =
-    useState<"Mobile App" | "Vue Simulator">("Mobile App");

  const filtered = releases.filter(
    (r) => r.repo === activeRepo
  );

  return (
    <div className="mt-6 space-y-6">
      {/* Tabs */}
      <div className="flex gap-6 border-b pb-2">
-        <button
-          onClick={() => setActiveRepo("Mobile App")}
-          className={
-            activeRepo === "Mobile App"
-              ? "font-semibold text-[#50B78B]"
-              : "text-zinc-500"
-          }
-        >
-          Mobile App
-        </button>
-
-        <button
-          onClick={() => setActiveRepo("Vue Simulator")}
-          className={
-            activeRepo === "Vue Simulator"
-              ? "font-semibold text-[#50B78B]"
-              : "text-zinc-500"
-          }
-        >
-          Vue Simulator
-        </button>
+        {availableRepos.map((repo) => (
+          <button
+            key={repo}
+            onClick={() => setActiveRepo(repo)}
+            className={
+              activeRepo === repo
+                ? "font-semibold text-[#50B78B]"
+                : "text-zinc-500"
+            }
+          >
+            {repo}
+          </button>
+        ))}
      </div>

This approach automatically adapts to new repos in the data without code changes.

Also applies to: 22-44

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 739f86b and 2245ea5.

📒 Files selected for processing (4)
  • .gitignore
  • app/releases/page.tsx
  • components/Releases/ReleaseCard.tsx
  • components/Releases/ReleasesClient.tsx
🧰 Additional context used
🧬 Code graph analysis (2)
app/releases/page.tsx (2)
lib/releases.ts (1)
  • getReleases (18-31)
components/Releases/ReleasesClient.tsx (1)
  • ReleasesClient (7-61)
components/Releases/ReleasesClient.tsx (2)
lib/releases.ts (1)
  • Release (4-15)
components/Releases/ReleaseCard.tsx (1)
  • ReleaseCard (7-76)
🔇 Additional comments (4)
.gitignore (1)

66-66: LGTM! Appropriate ignore rule for generated releases data.

The ignore rule correctly excludes the dynamically generated releases JSON file from version control.

components/Releases/ReleaseCard.tsx (1)

12-26: LGTM! Well-implemented responsive layout improvements.

The responsive header layout correctly stacks on mobile and flows horizontally on larger screens. The break-words utility prevents overflow issues, and the min-w-0 wrapper allows proper flex shrinking. The date positioning adjusts appropriately across breakpoints.

components/Releases/ReleasesClient.tsx (1)

1-61: Core implementation is solid with good client/server separation.

The client component correctly uses the "use client" directive, implements stateful tab filtering, and provides a good user experience with the placeholder state for empty repositories. The filtering logic is correct, and the key generation ensures unique identifiers.

app/releases/page.tsx (1)

1-17: LGTM! Clean implementation following Next.js 15 best practices.

The page correctly implements the server component pattern: it fetches data server-side with getReleases() and passes it to the client component for stateful rendering. The simplified structure improves maintainability while preserving functionality.

Comment thread components/Releases/ReleasesClient.tsx Outdated
Comment on lines +22 to +44
<div className="flex gap-6 border-b pb-2">
<button
onClick={() => setActiveRepo("Mobile App")}
className={
activeRepo === "Mobile App"
? "font-semibold text-[#50B78B]"
: "text-zinc-500"
}
>
Mobile App
</button>

<button
onClick={() => setActiveRepo("Vue Simulator")}
className={
activeRepo === "Vue Simulator"
? "font-semibold text-[#50B78B]"
: "text-zinc-500"
}
>
Vue Simulator
</button>
</div>

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

Missing ARIA attributes for accessible tab navigation.

The tab buttons lack proper ARIA attributes needed for screen reader users and assistive technology. Tab interfaces should implement the ARIA tabs pattern with:

  • role="tablist" on the container
  • role="tab" on each button
  • aria-selected="true|false" to indicate the active tab
  • aria-controls linking each tab to its panel
  • Keyboard navigation (Left/Right arrow keys to navigate between tabs)
♿ Proposed accessibility improvements
      {/* Tabs */}
-     <div className="flex gap-6 border-b pb-2">
+     <div role="tablist" className="flex gap-6 border-b pb-2">
        <button
+         role="tab"
+         aria-selected={activeRepo === "Mobile App"}
+         aria-controls="releases-panel"
          onClick={() => setActiveRepo("Mobile App")}
          className={
            activeRepo === "Mobile App"
              ? "font-semibold text-[#50B78B]"
              : "text-zinc-500"
          }
        >
          Mobile App
        </button>

        <button
+         role="tab"
+         aria-selected={activeRepo === "Vue Simulator"}
+         aria-controls="releases-panel"
          onClick={() => setActiveRepo("Vue Simulator")}
          className={
            activeRepo === "Vue Simulator"
              ? "font-semibold text-[#50B78B]"
              : "text-zinc-500"
          }
        >
          Vue Simulator
        </button>
      </div>

      {/* Content */}
-     {filtered.length === 0 ? (
+     <div id="releases-panel" role="tabpanel">
+       {filtered.length === 0 ? (
          <p className="text-sm text-zinc-500">
            No releases yet for {activeRepo}.
          </p>
        ) : (
          filtered.map((release) => (
            <ReleaseCard
              key={`${release.repoSlug}-${release.version}`}
              release={release}
            />
          ))
        )}
+     </div>

For full keyboard support, also add arrow key handlers to move focus between tabs.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In @components/Releases/ReleasesClient.tsx around lines 22 - 44, The tab
container div and the two buttons need ARIA roles and keyboard navigation: add
role="tablist" to the div that wraps the buttons, give each button role="tab",
set aria-selected based on the activeRepo state (e.g., aria-selected={activeRepo
=== "Mobile App"}), add aria-controls values that reference the corresponding
panel IDs (create matching id attributes on the release panels), and ensure each
button has an id used by the panel's aria-labelledby; also implement Left/Right
arrow key handlers on the buttons (or a shared keyboard handler) to move focus
between tabs and call setActiveRepo to update the active tab accordingly.

@Ayush1169

Copy link
Copy Markdown
Author

@naman79820 @Atharva7126

@naman79820
naman79820 self-requested a review January 9, 2026 17:33
@naman79820

Copy link
Copy Markdown
Member

Never add json data in .gitignore file

@naman79820
naman79820 merged commit a43be06 into CircuitVerse:main Jan 9, 2026
5 checks passed
naman79820 added a commit that referenced this pull request Jan 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feat: Add a Release Page for Contributors Leaderboard

3 participants