# Project export: IDEate

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: UC Berkeley AI Hackathon 2025
- Tagline: IDEate is your AI-powered code review co-pilot — streamlining PR feedback with specialized agents for security, performance, and UX, so teams ship better code, faster.
- Devpost: https://devpost.com/software/ideate-qk13b2
- GitHub: https://github.com/cheyennechau/calhacks-frontend
- Demo: https://github.com/cheyennechau/calhacks-backend
- Video: https://www.youtube.com/embed/MuiWpjFVwSQ?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 2 GitHub contributor(s) — Cheyenne Chau (4 commits), Bia Shok (3 commits)

## Devpost submission (written by the team)

No Devpost description available.

## README (from the GitHub repository)

# React + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.


## Detected evidence (automated analysis)

Indexed codebase: 40 recognized source files, 89 KB.
- CSS (language) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- Python (language) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (43 of 43)

```
.gitignore
components.json
eslint.config.js
index.html
package.json
README.md
src/App.css
src/App.jsx
src/components/AgentSelector.jsx
src/components/Header.jsx
src/components/ReviewDetails.jsx
src/components/ui/Accordion.jsx
src/components/ui/Alert.jsx
src/components/ui/AlertDialog.jsx
src/components/ui/AspectRatio.jsx
src/components/ui/Avatar.jsx
src/components/ui/Badge.jsx
src/components/ui/Button.jsx
src/components/ui/Calendar.jsx
src/components/ui/Card.jsx
src/components/ui/Carousel.jsx
src/components/ui/CheckBox.jsx
src/components/ui/Collapsible.jsx
src/components/ui/Command.jsx
src/components/ui/ContextMenu.jsx
src/components/ui/Dialog.jsx
src/components/ui/Input.jsx
src/components/ui/Label.jsx
src/components/ui/Progress.jsx
src/components/ui/RadioGroup.jsx
src/components/ui/Separator.jsx
src/components/ui/Switch.jsx
src/components/ui/Tabs.jsx
src/components/ui/TextArea.jsx
src/index.css
src/lib/utils.js
src/main.jsx
src/pages/Dashboard.jsx
src/pages/Login.jsx
src/pages/Review.jsx
src/pages/ReviewResult.jsx
src/pages/Signup.jsx
vite.config.js
```

### Dependencies

- package.json: @eslint/js@^9.25.0, @radix-ui/react-avatar@^1.1.10, @radix-ui/react-icons@^1.3.2, @radix-ui/react-label@^2.1.7, @radix-ui/react-progress@^1.1.7, @radix-ui/react-radio-group@^1.3.7, @radix-ui/react-scroll-area@^1.2.9, @radix-ui/react-separator@^1.1.7, @radix-ui/react-slot@^1.2.3, @radix-ui/react-switch@^1.2.5, @radix-ui/react-tabs@^1.1.12, @tailwindcss/vite@^4.1.10, @types/react@^19.1.2, @types/react-dom@^19.1.2, @vitejs/plugin-react@^4.4.1, class-variance-authority@^0.7.1, clsx@^2.1.1, eslint@^9.25.0, eslint-plugin-react-hooks@^5.2.0, eslint-plugin-react-refresh@^0.4.19, globals@^16.0.0, lucide-react@^0.522.0, react@^19.1.0, react-dom@^19.1.0, react-router-dom@^7.6.2, tailwind-merge@^3.3.1, tailwind-variants@^1.0.0, tailwindcss@^4.1.10, tailwindcss-animate@^1.0.7, tw-animate-css@^1.3.4, vite@^6.3.5

### Recent commits (newest first)

- Cleaned up code again
- Cleaned up code
- Some UI improvements & code cleanup
- chore: remove all .DS_Store files
- Updated .gitignore
- Added Login & Signup Pages
- more edits
- Add .gitignore to exclude node_modules
- Add and update review component files
- Cleaned up code & improved Header styling
- Properly handle CORS error
- Initial commit

## Key source files (fetched from GitHub, selected and truncated for size)

### package.json

```
{
  "name": "calhacks-25",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "@radix-ui/react-avatar": "^1.1.10",
    "@radix-ui/react-icons": "^1.3.2",
    "@radix-ui/react-label": "^2.1.7",
    "@radix-ui/react-progress": "^1.1.7",
    "@radix-ui/react-radio-group": "^1.3.7",
    "@radix-ui/react-scroll-area": "^1.2.9",
    "@radix-ui/react-separator": "^1.1.7",
    "@radix-ui/react-slot": "^1.2.3",
    "@radix-ui/react-switch": "^1.2.5",
    "@radix-ui/react-tabs": "^1.1.12",
    "@tailwindcss/vite": "^4.1.10",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "lucide-react": "^0.522.0",
    "react": "^19.1.0",
    "react-dom": "^19.1.0",
    "react-router-dom": "^7.6.2",
    "tailwind-merge": "^3.3.1",
    "tailwind-variants": "^1.0.0",
    "tailwindcss": "^4.1.10",
    "tailwindcss-animate": "^1.0.7"
  },
  "devDependencies": {
    "@eslint/js": "^9.25.0",
    "@types/react": "^19.1.2",
    "@types/react-dom": "^19.1.2",
    "@vitejs/plugin-react": "^4.4.1",
    "eslint": "^9.25.0",
    "eslint-plugin-react-hooks": "^5.2.0",
    "eslint-plugin-react-refresh": "^0.4.19",
    "globals": "^16.0.0",
    "tw-animate-css": "^1.3.4",
    "vite": "^6.3.5"
  }
}

```

### src/main.jsx

```javascript
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import "./index.css";
import App from "./App.jsx";

createRoot(document.getElementById("root")).render(
  <StrictMode>
    <App />
  </StrictMode>
)

```

### src/App.jsx

```javascript
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";

import Signup from "@/pages/Signup";
import Login from "@/pages/Login";
import Dashboard from "@/pages/Dashboard";
import Review from "@/pages/Review";
import Header from "@/components/Header";

import "@/App.css"
import "@/index.css"

const App = () => {
  return (
      <Router>
        {(location.pathname == "/dashboard" || location.pathname == "/review") && <Header />}
        <Routes>
          <Route path="/" element={<Signup />} />
          <Route path="/login" element={<Login />} />
          <Route path="/dashboard" element={<Dashboard />} />
          <Route path="/review" element={<Review />} />
        </Routes>
      </Router>
  );
};

export default App;

```

### index.html

```html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/logo.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>IDEate</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>

```

### vite.config.js

```javascript
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'
import tailwindcss from "@tailwindcss/vite";

// https://vite.dev/config/
export default defineConfig({
  plugins: [react(), tailwindcss(),],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
})



// import { defineConfig } from 'vite'
// import react from '@vitejs/plugin-react'

// // https://vite.dev/config/
// export default defineConfig({
//   plugins: [react()],
// })

```

### eslint.config.js

```javascript
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'

export default [
  { ignores: ['dist'] },
  {
    files: ['**/*.{js,jsx}'],
    languageOptions: {
      ecmaVersion: 2020,
      globals: globals.browser,
      parserOptions: {
        ecmaVersion: 'latest',
        ecmaFeatures: { jsx: true },
        sourceType: 'module',
      },
    },
    plugins: {
      'react-hooks': reactHooks,
      'react-refresh': reactRefresh,
    },
    rules: {
      ...js.configs.recommended.rules,
      ...reactHooks.configs.recommended.rules,
      'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
      'react-refresh/only-export-components': [
        'warn',
        { allowConstantExport: true },
      ],
    },
  },
]

```

### src/App.css

```css
@import "tailwindcss";

/* App.css */

.custom-heading {
  font-weight: bold;
  font-size: 1.5rem;
}

.section-padding {
  padding: 2rem;
}

```

### src/index.css

```css
@import "tailwindcss";

@layer utilities {
  .bg-background {
    background-color: hsl(var(--background));
  }

  .text-foreground {
    color: hsl(var(--foreground));
  }

  .bg-muted {
    background-color: hsl(var(--muted));
  }

  .text-muted-foreground {
    color: hsl(var(--muted-foreground));
  }

  .text-balance {
    text-wrap: balance;
  }
}


@layer base {
  :root {
    /* Light theme variables */
    --background: 0 0% 100%;
    --foreground: 0 0% 3.9%;
    --card: 0 0% 100%;
    --card-foreground: 0 0% 3.9%;
    --popover: 0 0% 100%;
    --popover-foreground: 0 0% 3.9%;
    --primary: 0 0% 9%;
    --primary-foreground: 0 0% 98%;
    --secondary: 0 0% 96.1%;
    --secondary-foreground: 0 0% 9%;
    --muted: 0 0% 96.1%;
    --muted-foreground: 0 0% 45.1%;
    --accent: 0 0% 96.1%;
    --accent-foreground: 0 0% 9%;
    --destructive: 0 84.2% 60.2%;
    --destructive-foreground: 0 0% 98%;
    --border: 0 0% 89.8%;
    --input: 0 0% 89.8%;
    --ring: 0 0% 3.9%;
    --chart-1: 12 76% 61%;
    --chart-2: 173 58% 39%;
    --chart-3: 197 37% 24%;
    --chart-4: 43 74% 66%;
    --chart-5: 27 87% 67%;
    --radius: 0.5rem;
    --sidebar-background: 0 0% 98%;
    --sidebar-foreground: 240 5.3% 26.1%;
    --sidebar-primary: 240 5.9% 10%;
    --sidebar-primary-foreground: 0 0% 98%;
    --sidebar-accent: 240 4.8% 95.9%;
    --sidebar-accent-foreground: 240 5.9% 10%;
    --sidebar-border: 220 13% 91%;
    --sidebar-ring: 217.2 91.2% 59.8%;
  }

  .dark {
    /* Dark theme variables */
    --background: 0 0% 3.9%;
    --foreground: 0 0% 98%;
    --card: 0 0% 3.9%;
    --card-foreground: 0 0% 98%;
    --popover: 0 0% 3.9%;
    --popover-foreground: 0 0% 98%;
    --primary: 0 0% 98%;
    --primary-foreground: 0 0% 9%;
    --secondary: 0 0% 14.9%;
    --secondary-foreground: 0 0% 98%;
    --muted: 0 0% 14.9%;
    --muted-foreground: 0 0% 63.9%;
    --accent: 0 0% 14.9%;
    --accent-foreground: 0 0% 98%;
    --destructive: 0 62.8% 30.6%;
    --destructive-foreground: 0 0% 98%;
    --border: 0 0% 14.9%;
    --input: 0 0% 14.9%;
    --ring: 0 0% 83.1%;
    --chart-1: 220 70% 50%;
    --chart-2: 160 60% 45%;
    --chart-3: 30 80% 55%;
    --chart-4: 280 65% 60%;
    --chart-5: 340 75% 55%;
    --sidebar-background: 240 5.9% 10%;
    --sidebar-foreground: 240 4.8% 95.9%;
    --sidebar-primary: 224.3 76.3% 48%;
    --sidebar-primary-foreground: 0 0% 100%;
    --sidebar-accent: 240 3.7% 15.9%;
    --sidebar-accent-foreground: 240 4.8% 95.9%;
    --sidebar-border: 240 3.7% 15.9%;
    --sidebar-ring: 217.2 91.2% 59.8%;
  }

  * {
    border-color: hsl(var(--border));
    border-width: 1px;
  }


  body {
    font-family: Arial, Helvetica, sans-serif;
  }
}


```

### src/lib/utils.js

```javascript
import { clsx } from "clsx";
import { twMerge } from "tailwind-merge";

export function cn(...inputs) {
  return twMerge(clsx(...inputs))
}

```

### src/components/Header.jsx

```javascript
import { Link } from "react-router-dom";
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";

const Header = () => {
  return (
    <header className="border-b">
      <div className="relative w-full flex h-16 items-center justify-between px-4 md:px-6">
        {/* Left: Logo */}
        <div className="flex items-center gap-2">
          <Link to="/" className="flex items-center gap-1">
            <img src="/logo.png" alt="IDEate Logo" className="h-10 w-auto" />
            <span className="text-2xl font-bold">IDEate</span>
          </Link>
        </div>

        {/* Center: Navigation */}
        <nav className="absolute left-1/2 transform -translate-x-1/2 flex gap-6">
          <Link className="text-med font-medium hover:underline underline-offset-4" to="/review">
            New Review
          </Link>
          <Link className="text-med font-medium hover:underline underline-offset-4" to="/dashboard">
            Dashboard
          </Link>
        </nav>

        {/* Right: Avatar */}
        <div className="flex items-center gap-4">
          <Avatar>
            <AvatarImage src="/placeholder.svg?height=32&width=32" alt="User" />
            <AvatarFallback>CB</AvatarFallback>
          </Avatar>
        </div>
      </div>
    </header>
  );
};

export default Header;
```

[30 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]