Skip to content

Commit 52754d1

Browse files
megany128claude
andcommitted
merge: pull design system updates from annie/setup-design-system
Brings in DS component polish (Avatar, Button, Cards, DateBadge, Logo, SearchBar/Panel, SideBar, Tags, Toggle), new components (Bookmark, Dropdown, OrgHoverCard), token updates, shared fallbackColors util, prettier config, and README/CI tweaks. Conflict resolutions: - Kept HEAD monorepo layout: all DS code lives under shared/ui, apps/dashboard imports via @app/ui barrel. - Moved annie's root src/components/* + src/utils/* under shared/ui/src/. - Dropped stray pre-monorepo root files (src/App.tsx, src/main.tsx, vite.config.ts) — replaced long ago by apps/dashboard equivalents. - Rewrote DesignSystem.tsx imports to use @app/ui and @app/ui/assets/* subpath; added ./assets/* to shared/ui package exports. - Extended shared/ui/src/index.ts to re-export Bookmark, Dropdown, OrgHoverCard. - Added lucide-react as peer dep (shared/ui) and dep (apps/dashboard) — multiple DS components rely on it. - Root package.json keeps workspace-dispatch scripts; added prettier format / format:check scripts + dev deps. - Kept Manrope font link addition from previous commit. - Dropped annie's committed .env (contained a rotated Gemini API key — pre-existing leak on source branch, addressed separately). Added .env / .env.local to .gitignore. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2 parents e03f9f4 + b2ec463 commit 52754d1

40 files changed

Lines changed: 2174 additions & 1089 deletions

.cursor/rules/frontend/figma.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
## Figma MCP Integration Rules
2+
23
These rules define how to translate Figma inputs into code for this project and must be followed for every Figma-driven change.
34

45
### Required flow (do not skip)
6+
57
1. Run get_design_context first to fetch the structured representation for the exact node(s).
68
2. If the response is too large or truncated, run get_metadata to get the high‑level node map and then re‑fetch only the required node(s) with get_design_context.
79
3. Run get_screenshot for a visual reference of the node variant being implemented.
@@ -10,6 +12,7 @@ These rules define how to translate Figma inputs into code for this project and
1012
6. Validate against Figma for 1:1 look and behavior before marking complete.
1113

1214
### Implementation rules
15+
1316
- Treat the Figma MCP output (React + Tailwind) as a representation of design and behavior, not as final code style.
1417
- Replace Tailwind utility classes with the project’s preferred utilities/design‑system tokens when applicable.
1518
- Reuse existing components (e.g., buttons, inputs, typography, icon wrappers) instead of duplicating functionality.
@@ -19,7 +22,8 @@ These rules define how to translate Figma inputs into code for this project and
1922
- Validate the final UI against the Figma screenshot for both look and behavior.
2023

2124
### Figma MCP server rules
25+
2226
  - The Figma MCP server provides an assets endpoint which can serve image and SVG assets
2327
  - IMPORTANT: If the Figma MCP server returns a localhost source for an image or an SVG, use that image or SVG source directly
2428
  - IMPORTANT: DO NOT import/add new icon packages, all the assets should be in the Figma payload
25-
  - IMPORTANT: do NOT use or create placeholders if a localhost source is provided
29+
  - IMPORTANT: do NOT use or create placeholders if a localhost source is provided

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ jobs:
1616
run: bun run type-check
1717
- name: Lint check
1818
run: bun run lint
19+
- name: Format check
20+
run: bun run format:check

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@ dist-ssr
2525

2626
# AI
2727
CLAUDE.md
28+
29+
# Env
30+
.env
31+
.env.local

.prettierignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
node_modules
2+
dist
3+
pnpm-lock.yaml
4+
convex/_generated

.prettierrc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"semi": true,
3+
"singleQuote": false,
4+
"trailingComma": "all",
5+
"printWidth": 80,
6+
"tabWidth": 2,
7+
"plugins": ["prettier-plugin-tailwindcss"]
8+
}

README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ If you are developing a production application, we recommend updating the config
1717

1818
```js
1919
export default defineConfig([
20-
globalIgnores(['dist']),
20+
globalIgnores(["dist"]),
2121
{
22-
files: ['**/*.{ts,tsx}'],
22+
files: ["**/*.{ts,tsx}"],
2323
extends: [
2424
// Other configs...
2525

@@ -34,40 +34,40 @@ export default defineConfig([
3434
],
3535
languageOptions: {
3636
parserOptions: {
37-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
37+
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
3838
tsconfigRootDir: import.meta.dirname,
3939
},
4040
// other options...
4141
},
4242
},
43-
])
43+
]);
4444
```
4545

4646
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
4747

4848
```js
4949
// eslint.config.js
50-
import reactX from 'eslint-plugin-react-x'
51-
import reactDom from 'eslint-plugin-react-dom'
50+
import reactX from "eslint-plugin-react-x";
51+
import reactDom from "eslint-plugin-react-dom";
5252

5353
export default defineConfig([
54-
globalIgnores(['dist']),
54+
globalIgnores(["dist"]),
5555
{
56-
files: ['**/*.{ts,tsx}'],
56+
files: ["**/*.{ts,tsx}"],
5757
extends: [
5858
// Other configs...
5959
// Enable lint rules for React
60-
reactX.configs['recommended-typescript'],
60+
reactX.configs["recommended-typescript"],
6161
// Enable lint rules for React DOM
6262
reactDom.configs.recommended,
6363
],
6464
languageOptions: {
6565
parserOptions: {
66-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
66+
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
6767
tsconfigRootDir: import.meta.dirname,
6868
},
6969
// other options...
7070
},
7171
},
72-
])
72+
]);
7373
```

ai/data/dummy_data.json

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
[
2+
{
3+
"listserv": "ACSU",
4+
"host": "ACSU",
5+
"club": "ACSU",
6+
"title": "ACSU Student Faculty Luncheon",
7+
"description": "Connect with CS professors and students over lunch with other CS students.",
8+
"date": "2026-03-13",
9+
"location": "CIS 250 (Young Conference Room)",
10+
"tags": ["networking", "cs", "faculty"]
11+
},
12+
{
13+
"listserv": "ACSU",
14+
"host": "ACSU",
15+
"club": "ACSU",
16+
"title": "1:1 Faculty Coffee Chat Week",
17+
"description": "Sign up for informal 1:1 chats with professors about research opportunities, careers, and advice.",
18+
"date": "2026-03-09",
19+
"location": "Various campus locations",
20+
"tags": ["research", "mentorship", "coffee"]
21+
},
22+
{
23+
"listserv": "ACSU",
24+
"host": "Cornell AppDev & Ramp",
25+
"club": "Cornell AppDev",
26+
"title": "AppDev x Ramp - HACK→HIRED",
27+
"description": "One-day AI-focused hackathon with workshops, prizes, and a chance to interview for a Fall SWE internship at Ramp.",
28+
"date": "2026-03-14",
29+
"location": "eHub",
30+
"tags": ["hackathon", "career", "recruiting", "ai"]
31+
},
32+
{
33+
"listserv": "ACSU",
34+
"host": "Citadel GQS",
35+
"club": "",
36+
"title": "Citadel Global Quantitative Strategies Tech Talk",
37+
"description": "Tech talk on quantitative trading careers and how your research skills translate to GQS at Citadel.",
38+
"date": "2026-03-17",
39+
"location": "Upson 142",
40+
"tags": ["finance", "tech-talk", "recruiting"]
41+
},
42+
{
43+
"listserv": "WICC",
44+
"host": "WICC",
45+
"club": "WICC",
46+
"title": "Cracking Your Career (CYC)",
47+
"description": "Four-part series on pathways in computing, interviewing, resumes, and standing out in tech roles.",
48+
"date": "2026-03-03",
49+
"location": "Gates 114",
50+
"tags": ["career", "workshop"]
51+
},
52+
{
53+
"listserv": "WICC",
54+
"host": "WICC & MathWorks",
55+
"club": "WICC",
56+
"title": "WICC x MathWorks MATLAB Challenge",
57+
"description": "Hands-on MATLAB challenge using MATLAB Copilot with prizes, swag, and info on careers at MathWorks.",
58+
"date": "2026-03-16",
59+
"location": "Gates G01",
60+
"tags": ["workshop", "mathworks", "ai", "swag"]
61+
},
62+
{
63+
"listserv": "WICC",
64+
"host": "WICC & Jane Street",
65+
"club": "WICC",
66+
"title": "WICC x Jane Street Tech Talks",
67+
"description": "Talk on predictable communication at scale and Aria, Jane Street's low-latency messaging system, with food and swag.",
68+
"date": "2026-03-18",
69+
"location": "Phillips 101",
70+
"tags": ["talk", "jane-street", "systems"]
71+
},
72+
{
73+
"listserv": "WICC",
74+
"host": "External",
75+
"club": "",
76+
"title": "HackDartmouth XI",
77+
"description": "24-hour hackathon at Dartmouth with workshops, prizes, and a Lost In Space theme.",
78+
"date": "2026-04-11",
79+
"location": "Dartmouth",
80+
"tags": ["hackathon", "travel"]
81+
},
82+
{
83+
"listserv": "WICC",
84+
"host": "Jane Street",
85+
"club": "",
86+
"title": "Jane Street FOCUS Program",
87+
"description": "Multi-day NYC program for first-year students to explore trading, software development, and strategy at Jane Street.",
88+
"date": "2026-05-19",
89+
"location": "New York City",
90+
"tags": ["program", "first-year", "professional-track"]
91+
}
92+
]

ai/prompts/clubSummary.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
export function clubSummaryPrompt(events: any[]) {
3+
return `
4+
You are writing a very short description of what a student club does, based only on their recent events.
5+
6+
You are given a JSON array called "events". All events belong to the **same club**, with a "club" field that contains its name.
7+
8+
### Your task
9+
- Write **2–3 concise sentences** (max **70 words total**) describing:
10+
- What the club focuses on (e.g. hackathons, career prep, mentorship, theory, community building).
11+
- The typical kinds of events they run (talks, workshops, study groups, socials, conferences, etc.).
12+
- The community/audience they serve (e.g. CS undergrads, women in computing, international students, etc.).
13+
- **Start the first sentence with the club name**, taken from the "club" field (e.g. "ACSU is...", "WICC is...").
14+
- Do **not** mention specific dates, rooms, or one‑off logistics; speak in general patterns.
15+
- Keep the tone clear and informative; no emojis.
16+
17+
### Style constraints
18+
- Output **plain text only** (no markdown headings or bullets).
19+
- Use 2–3 sentences in a single short paragraph.
20+
21+
Here are the events for this club (JSON):
22+
\`\`\`json
23+
${JSON.stringify(events, null, 2)}
24+
\`\`\`
25+
`;
26+
}

ai/prompts/weeklySummary.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
export function weeklySummaryPrompt(events: any[]) {
3+
return `
4+
You are generating a concise weekly opportunities digest for a single student.
5+
6+
You are given a JSON array called "events". Each event may look like:
7+
{
8+
"listserv": "ACSU", // listserv or source that advertised the event
9+
"host": "Cornell AppDev", // primary hosting org or company (may differ from listserv)
10+
"title": "AppDev x Ramp - HACK→HIRED",
11+
"description": "One‑day hackathon with prizes and recruiting",
12+
"date": "2026-03-14",
13+
"location": "eHub",
14+
"tags": ["hackathon", "career", "recruiting"]
15+
}
16+
17+
Important:
18+
- \`listserv\` = who sent/advertised the opportunity (ACSU, WICC, etc.).
19+
- \`host\` = who is actually running the event (AppDev, Ramp, a company, a conference, etc.).
20+
Many events are cross‑posted; do not assume the listserv owns the event.
21+
22+
### Your task
23+
- Write a **compact markdown digest** for this week, **no intro or outro sentences**.
24+
- **Group events by listserv** using markdown headings based on the \`listserv\` field:
25+
- Use a level-3 heading for each listserv that appears, like:
26+
- \`### ACSU\`
27+
- \`### WICC\`
28+
- \`### Cornell\`
29+
- \`### Opportunities\`
30+
- Under each heading, list at most **3 high‑value events** that were advertised on that listserv, chosen for impact (recruiting, hackathons, major talks, strong mentorship/community events).
31+
- For each event, use **one clean bullet point** in this exact format:
32+
- \`- **Title (Mar 14)** – 1‑sentence description that clearly names the **host** or event type, the key value prop, and location if available.\`
33+
- Keep each description **under 25 words**.
34+
- Prefer **hackathons, recruiting, mentorship, and flagship events** over minor or redundant ones.
35+
- If a listserv has more than 3 events, summarize only the top 3 and ignore the rest.
36+
37+
### Style constraints
38+
- Output **markdown only** (no code fences).
39+
- Use only \`###\` headings and \`- \` bullets, nothing else.
40+
- **No emojis, no unsubscribe text, no calendar links, no greetings or sign‑offs.**
41+
- **Total digest <= 220 words** across all sections.
42+
43+
Now write the digest based on this JSON:
44+
\`\`\`json
45+
${JSON.stringify(events, null, 2)}
46+
\`\`\`
47+
`;
48+
}

ai/summarize.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { GoogleGenAI } from "@google/genai";
2+
3+
const ai = new GoogleGenAI({
4+
apiKey: process.env.GEMINI_API_KEY,
5+
});
6+
7+
export async function generateSummary(prompt: string) {
8+
const res = await ai.models.generateContent({
9+
model: "gemini-2.5-flash",
10+
contents: prompt,
11+
});
12+
13+
return res.text;
14+
}

0 commit comments

Comments
 (0)