Skip to content

feat(nav): link Catalogs from the side menu (chat#1912 row 3) - #1913

Merged
sweetmantech merged 3 commits into
mainfrom
feat/side-menu-catalogs-link
Jul 30, 2026
Merged

feat(nav): link Catalogs from the side menu (chat#1912 row 3)#1913
sweetmantech merged 3 commits into
mainfrom
feat/side-menu-catalogs-link

Conversation

@sweetmantech

@sweetmantech sweetmantech commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Closes row 3 of chat#1912.

Why

The app's only navigation lists exactly Agents / Tasks / Files. Catalogs — the valuation payoff surface, and the conversion target of the whole funnel — is unreachable from the menu; the catalog page is enterable only via direct URL or its own back-link.

Reported by a live outreach customer on 2026-07-29 (account 148e1644):

I guess I'm waiting on the newsletter because while I hear what Recoup I'm not sure where to find the tooling in the site.

Confirmed on prod 2026-07-30 at both breakpoints — 390px showed only New Chat / Agents / Tasks / Files, and the 1440px rail was four unlabeled icons. Screenshots in the issue.

What changed

  • New components/Sidebar/CatalogsNavItem.tsx, mirroring FilesNavItem exactly (same NavButton, book icon from the existing resolver, aria-label="View catalogs"). No new dependency, no new icon asset.
  • SecondaryNav takes isCatalogs and renders the item first in the tool list — Catalogs is the payoff surface, so it leads.
  • Both call sites wired with the pathname-derived active state the siblings already use: Menu (desktop rail) and SideMenu (mobile).

Catalogs leads the list rather than being appended, because the whole point of the report is that a customer arrives wanting the number.

Tests

components/Sidebar/__tests__/SecondaryNav.test.tsx — new, TDD red→green:

  1. Catalogs is present in the nav (RED before: Unable to find an accessible element with the role "button" and name /view catalogs/i)
  2. clicking it navigates to catalogs (same RED)
  3. regression guard: Agents / Tasks / Files still render (GREEN throughout, so the addition is proven additive)

Full suite 285 passed / 76 files, tsc --noEmit clean.

Verification

Preview verification against the issue's Works when script (390px + 1440px, navigational only, no pasted URLs) will be posted as a PR comment once the preview builds.

🤖 Generated with Claude Code


Summary by cubic

Adds Catalogs to the sidebar and mobile side menu, placed first in the tools list so users can open catalogs directly from navigation. Addresses chat#1912 row 3 by making catalogs discoverable.

  • New Features

    • Added Catalogs to desktop rail and mobile menu using NavButton with the "disc" icon and aria-label "View catalogs".
    • Wired pathname-based active state and navigation to "/catalogs"; Agents, Tasks, and Files are unchanged.
  • Bug Fixes

    • Made the Catalogs icon theme-aware with currentColor by adding disc to Icon/resolver.
    • Cleanup: added a typed CatalogsNavItemProps interface and removed customer-identifying text from tests.

Written for commit a934e11. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added a Catalogs option to the side navigation.
    • Includes a book icon, accessible labeling, and active-state highlighting based on the current page.
    • Selecting Catalogs navigates to the catalogs section and stays in sync with the route.
  • Style
    • Updated relevant icons to use currentColor, improving consistency with the surrounding text/theme.

The app's only navigation listed Agents / Tasks / Files, so Catalogs — the
valuation payoff surface and the funnel's conversion target — was reachable
only by direct URL or its own back-link.

Adds CatalogsNavItem and renders it in both nav surfaces: SecondaryNav
(desktop rail, via Menu) and SideMenu (mobile), each with the pathname-derived
active state the sibling items already use.

Reported by a live customer 2026-07-29: "I'm not sure where to find the
tooling in the site ... I guess I'm waiting on the newsletter."

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
chat Ready Ready Preview Jul 30, 2026 6:26pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@sweetmantech, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 48 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 571b9a55-23bb-4ae5-b548-1e2ad5678e88

📥 Commits

Reviewing files that changed from the base of the PR and between 0f7c8f1 and a934e11.

📒 Files selected for processing (2)
  • components/Icon/resolver.tsx
  • components/Sidebar/CatalogsNavItem.tsx
📝 Walkthrough

Walkthrough

Adds a Catalogs navigation item to both sidebar navigation paths, with route-based active state, a book icon, accessibility labeling, and navigation through the existing catalogs destination.

Changes

Catalogs navigation

Layer / File(s) Summary
Catalogs navigation component
components/Sidebar/CatalogsNavItem.tsx, components/Icon/resolver.tsx
Defines CatalogsNavItem and renders a configured NavButton; the book and plus icons now use currentColor for inherited styling.
Route activation and navigation wiring
components/SideMenu/SideMenu.tsx, components/Sidebar/Menu.tsx, components/Sidebar/SecondaryNav.tsx
Derives Catalogs active state from the pathname and wires the new item to goToItem("catalogs") and onNavigate("catalogs").

Estimated code review effort: 2 (Simple) | ~10 minutes

Poem

A book now guides the way,
Through routes where catalogs stay.
Active lights softly glow,
Clicks make the destination flow,
Sidebar paths align today.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Solid & Clean Code ✅ Passed PASS: The Catalogs addition is small, readable, and consistent with existing nav-item patterns; new components stay single-purpose and simple.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/side-menu-catalogs-link

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

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@components/Sidebar/CatalogsNavItem.tsx`:
- Around line 3-11: Replace the anonymous inline props type on CatalogsNavItem
with a named CatalogsNavItemProps interface, preserving the existing isActive,
optional isExpanded, and onClick definitions, and use that interface in the
component declaration.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 58586a13-e3fd-497f-b575-f93fcf1002f2

📥 Commits

Reviewing files that changed from the base of the PR and between 9fcd2aa and e8eeb60.

⛔ Files ignored due to path filters (1)
  • components/Sidebar/__tests__/SecondaryNav.test.tsx is excluded by !**/*.test.* and included by components/**
📒 Files selected for processing (4)
  • components/SideMenu/SideMenu.tsx
  • components/Sidebar/CatalogsNavItem.tsx
  • components/Sidebar/Menu.tsx
  • components/Sidebar/SecondaryNav.tsx

Comment thread components/Sidebar/CatalogsNavItem.tsx Outdated

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e8eeb6002c

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread components/Sidebar/CatalogsNavItem.tsx Outdated
}) => {
return (
<NavButton
icon="book"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Use a theme-aware icon for Catalogs

In dark theme, this new nav entry is rendered on bg-sidebar/bg-card backgrounds while the resolver's book SVG hard-codes its path to fill="black"; unlike the existing nav icons, NavButton's text-foreground cannot recolor it. Users with system dark mode will get a black Catalogs icon on a near-black sidebar, especially in the collapsed desktop rail where the label is hidden, so the new navigation target is effectively invisible; use a currentColor icon or update the book SVG before using it here.

AGENTS.md reference: AGENTS.md:L74-L78

Useful? React with 👍 / 👎.

Comment on lines +28 to +29
// Ben Hanchett, 2026-07-29: "I'm not sure where to find the tooling in the
// site ... I guess I'm waiting on the newsletter." Catalogs is the valuation

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Remove the named customer from test comments

This test comment commits a real customer's full name plus their quoted feedback into source control. Even though it is only test code, it exposes customer identity/context to everyone with repo access and any downstream code artifacts; keep the regression rationale anonymized or reference the issue without personally identifying details.

Useful? React with 👍 / 👎.

@cubic-dev-ai cubic-dev-ai 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.

No issues found across 5 files

Confidence score: 5/5

  • Automated review surfaced no issues in the provided summaries.
  • No files require special attention.

Auto-approved: Adds a navigation link to the existing Catalogs page, mirroring the pattern used by other nav items. No new functionality, schema changes, or tradeoffs; bounded UI change with tests.

Re-trigger cubic

… tests

Three review findings, all validated first:

- codex P2: the book icon's path hard-coded fill="black" while every sibling
  nav icon uses stroke="currentColor", so Catalogs rendered black on the dark
  sidebar. NavButton's text-foreground cannot recolor a hard-coded fill. The
  icon has no other consumer, so switching it to currentColor is contained.
- coderabbit: named CatalogsNavItemProps interface, per the repo's own
  .coderabbit.yaml guideline ("Use TypeScript interfaces for props").
- codex P2: dropped a customer's real name and quoted feedback from a test
  comment; the reporter and quote belong on chat#1912, not in source.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
cubic-dev-ai[bot]
cubic-dev-ai Bot previously approved these changes Jul 30, 2026

@cubic-dev-ai cubic-dev-ai 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.

0 issues found across 3 files (changes from recent commits).

Confidence score: 5/5

  • Automated review surfaced no issues in the provided summaries.
  • No files require special attention.

Auto-approved: Adds a navigation link to an existing Catalogs page, fixing a discoverability issue. No backend, schema, security, or operational changes; implementation is bounded and clearly beneficial.

Re-trigger cubic

Review (@sweetmantech): a book reads as reading material; a disc reads as
recordings, which is what a catalog is.

Adds a `disc` entry to the icon resolver, inlined from lucide's Disc3 in the
same style as the neighbouring files and clock icons. It ships
stroke="currentColor", so it inherits NavButton's text-foreground and is
theme-aware by construction — which also resolves the codex finding about the
book glyph's hard-coded fill="black" without touching an icon this PR no
longer uses.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@sweetmantech

Copy link
Copy Markdown
Collaborator Author

Preview verification — 2026-07-30

Two preview builds were used, because the icon changed mid-review. Each row below says which commit it ran against.

Both deployments were resolved by sha, not by branch.

Results

# Check Documented / before Actual on preview Commit
1 Catalogs visible in the menu at 390px menu listed only New Chat / Agents / Tasks / Files "View catalogs" present, listed first a934e11c
2 Catalogs visible in the rail at 1440px four unlabeled icons, no Catalogs present and visible (catalogsVisible: true) a934e11c
3 Signed-in user reaches /catalogs by clicking only unreachable without typing the URL clicked the rail item as sweetman@recoupable.comlocation.pathname === "/catalogs". No URL typed or pasted at any point 0f7c8f19
4 Icon is legible on the dark sidebar n/a disc renders stroke: #fafafa against the #0a0a0a sidebar a934e11c
5 Icon matches its siblings n/a lucide lucide-disc-3, circle,path,circle,path, same 20x20 / strokeWidth 2 as files and clock a934e11c

Row 3 ran on 0f7c8f19; the only delta to a934e11c is the icon glyph, and the navigation wiring is byte-identical. Happy to re-run it against the final commit if you would rather have every row on one build.

Screenshots

390px — Catalogs leads the tool list, disc icon:

menu 390

1440px:

rail 1440

Review findings

All three validated against the code before acting.

Finding Verdict Action
@sweetmantech — use a CD icon rather than a book Agreed new disc entry in the resolver, inlined from lucide Disc3 in the same style as files/clock. A book reads as reading material; a disc reads as recordings
codex P2 — the book glyph hard-codes fill="black", so Catalogs renders black on the dark sidebar Valid, and it was a real defect measured before switching icons: book's path resolved to a 1.06:1 contrast ratio against the #0a0a0a sidebar, effectively invisible, because NavButton's text-foreground cannot recolor a hard-coded fill. Now moot — disc ships stroke="currentColor" and measures 18.97:1. Without this the nav entry would have shipped unseeable
coderabbit — use a named props interface Valid CatalogsNavItemProps. I first thought this contradicted the sibling nav items, which all use inline anonymous types, but this repo's own .coderabbit.yaml states "Use TypeScript interfaces for props" — so the guideline is real and the siblings are the ones out of step
codex P2 — a customer's real name and quoted feedback were committed in a test comment Valid, and mine removed. The reporter and the quote belong on chat#1912, not in source

book is left exactly as it was. An earlier commit here changed its fill to currentColor; once Catalogs moved to disc, nothing in the codebase uses book, so that edit became unrelated scope and was reverted. The net change to components/Icon/resolver.tsx is now purely additive (3 insertions, 0 deletions). Worth noting separately: book and three other glyphs still hard-code fill="black" and will have the same dark-mode problem for whoever uses them next.

Note for merge

This branch predates chat#1914, so its preview still shows the old Loading user profile skeleton at the bottom of the menu. That is not a defect in this PR — main already has the fix and it resolves on merge.

Suite 285 passed / 76 files, tsc --noEmit and eslint clean.

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 2 files (changes from recent commits).

Confidence score: 4/5

  • In components/Sidebar/CatalogsNavItem.tsx, the implemented icon="disc" conflicts with the PR description claiming a book icon, which creates a concrete spec-to-code mismatch that can cause UI inconsistency and reviewer confusion about intended behavior — align either the code or the PR documentation so they match before merge.
Prompt for AI agents (unresolved issues)

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


<file name="components/Sidebar/CatalogsNavItem.tsx">

<violation number="1" location="components/Sidebar/CatalogsNavItem.tsx:16">
P2: Custom agent: **Flag AI Slop and Fabricated Changes**

The PR description explicitly states CatalogsNavItem uses a `book` icon, but the implementation uses `icon="disc"`. This is a clear mismatch between the documented behavior and the actual code. Please align the icon choice with the PR description, or update the description to reflect the chosen `disc` icon.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

}: CatalogsNavItemProps) => {
return (
<NavButton
icon="disc"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: Custom agent: Flag AI Slop and Fabricated Changes

The PR description explicitly states CatalogsNavItem uses a book icon, but the implementation uses icon="disc". This is a clear mismatch between the documented behavior and the actual code. Please align the icon choice with the PR description, or update the description to reflect the chosen disc icon.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At components/Sidebar/CatalogsNavItem.tsx, line 16:

<comment>The PR description explicitly states CatalogsNavItem uses a `book` icon, but the implementation uses `icon="disc"`. This is a clear mismatch between the documented behavior and the actual code. Please align the icon choice with the PR description, or update the description to reflect the chosen `disc` icon.</comment>

<file context>
@@ -13,7 +13,7 @@ const CatalogsNavItem = ({
   return (
     <NavButton
-      icon="book"
+      icon="disc"
       label="Catalogs"
       isActive={isActive}
</file context>

@cubic-dev-ai
cubic-dev-ai Bot dismissed their stale review July 30, 2026 18:33

Dismissed because Cubic found issues in a newer review.

@sweetmantech
sweetmantech merged commit 735c7e4 into main Jul 30, 2026
4 checks passed
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.

1 participant