App Directory
Location: src/app/
Purpose: Next.js App Router directory containing all routes, pages, layouts, and API endpoints.
Structure
app/
├── (base-layout)/ # Base layout group (unauthenticated)
│ ├── account/
│ │ └── page.tsx # Account settings page
│ ├── layout.tsx # Base layout component
│ └── page.tsx # Root/home page
│
├── [primaryTeam]/ # Dynamic team route segment
│ ├── (team-layout)/ # Team-scoped layout group
│ │ ├── _users-management/
│ │ ├── admin-voter-search/
│ │ ├── rates/
│ │ ├── credentials/
│ │ ├── members/
│ │ ├── permission-keys/
│ │ ├── permission-set/
│ │ ├── roles/
│ │ ├── teams/
│ │ ├── voter-search/
│ │ ├── layout.tsx # Team layout wrapper
│ │ └── page.tsx # Team dashboard
│ │
│ ├── accept-campaign-invite/
│ ├── accept-invite/
│ ├── campaign/ # Campaign routes
│ │ ├── (layout)/ # Campaign layout group
│ │ │ ├── layout.tsx
│ │ │ ├── new/ # Create new campaign
│ │ │ └── page.tsx # Campaigns list
│ │ └── [slug]/ # Individual campaign routes
│ │ ├── (data-views)/ # Data view routes
│ │ ├── (invitation-layout)/
│ │ ├── add-signatures/
│ │ ├── admin-dashboard/
│ │ ├── dashboard/
│ │ ├── edit/
│ │ ├── petition-format/
│ │ ├── rates/
│ │ ├── sub-teams/
│ │ ├── transactions/
│ │ ├── layout.tsx
│ │ └── page.tsx
│ │
│ └── layout.tsx # Primary team layout
│
├── api/ # API routes (Next.js API endpoints)
│ ├── _inviteuser/
│ │ └── route.ts
│ ├── duplicate/
│ │ └── route.ts # Redis duplicate check
│ ├── essearch/
│ │ └── route.ts # Dynamic Directus voter search
│ ├── essearch-common/
│ │ └── route.ts # Common Directus voter search
│ └── invite-team-member/
│ └── route.ts # Team member invitation
│
├── auth/ # Authentication routes
│ ├── callback/
│ │ └── route.ts # OAuth callback handler
│ ├── confirm/
│ │ └── route.ts # Email confirmation handler
│ ├── invite-confirmtion/
│ │ └── page.tsx # Invitation confirmation page
│ ├── login-confirmtion/
│ │ └── page.tsx # Login confirmation page
│ ├── restricted/
│ │ └── page.tsx # Access restricted page
│ ├── sign-in/
│ │ └── page.tsx # Sign-in page
│ ├── sign-up/
│ │ └── page.tsx # Sign-up page
│ └── layout.tsx # Auth layout
│
├── fonts/ # Local font files
│ ├── GeistMonoVF.woff
│ └── GeistVF.woff
│
├── favicon.ico # Site favicon
├── globals.css # Global styles
└── layout.tsx # Root layout (metadata, fonts, providers)
Route Groups
(base-layout): Routes that don't require team context(team-layout): Routes scoped to a team(layout): Campaign-specific layout group(data-views): Data visualization routes(invitation-layout): Invitation-related routes
Dynamic Segments
[primaryTeam]: Dynamic team identifier in URL[slug]: Campaign slug identifier[id],[credID],[roleID], etc.: Various resource identifiers