From e68ced7203923eca0e1827dafc27b7fb8556df7b Mon Sep 17 00:00:00 2001
From: Ben Senescu <44480372+bensenescu@users.noreply.github.com>
Date: Tue, 14 Apr 2026 20:14:09 -0400
Subject: [PATCH] feat: group navigation into dropdown menus (#110)
* feat: group navigation into Keywords, Domain, and AI dropdowns
Reorganize the top nav from 7 flat items into grouped dropdowns:
- Keywords: Keyword Research, Saved Keywords, Rank Tracking
- Domain: Domain Overview, Backlinks, Site Audit
- AI: standalone link
Mobile sidebar uses section headers for the same groupings.
Active dropdown items are highlighted with primary tint.
* fix: use matchSegment lookup instead of hardcoded array indices in nav groups
---
src/client/components/Sidebar.tsx | 78 +++++++++++++++++++--------
src/client/layout/AppShell.tsx | 90 +++++++++++++++++++++++++------
src/client/navigation/items.ts | 36 ++++++++++++-
3 files changed, 163 insertions(+), 41 deletions(-)
diff --git a/src/client/components/Sidebar.tsx b/src/client/components/Sidebar.tsx
index 9927f1f..286c5b4 100644
--- a/src/client/components/Sidebar.tsx
+++ b/src/client/components/Sidebar.tsx
@@ -1,6 +1,6 @@
import { Link } from "@tanstack/react-router";
import { ChevronsUpDown, X } from "lucide-react";
-import { getProjectNavItems } from "@/client/navigation/items";
+import { getProjectNavGroups } from "@/client/navigation/items";
interface SidebarProps {
projectId: string;
@@ -9,7 +9,7 @@ interface SidebarProps {
}
export function Sidebar({ projectId, onNavigate, onClose }: SidebarProps) {
- const projectNavItems = getProjectNavItems(projectId);
+ const navGroups = getProjectNavGroups(projectId);
return (
@@ -41,29 +41,61 @@ export function Sidebar({ projectId, onNavigate, onClose }: SidebarProps) {
{/* Navigation */}
-