Source code for colorstackosu.org. Built with Next.js 14, Tailwind CSS, and TypeScript.
- Node.js 18+ (recommend using nvm)
- npm (comes with Node)
# Clone the repo
git clone <repo-url>
cd colorstacksite_rework
# Install dependencies
npm install
# Create your environment file
cp .env.local.example .env.local
# Then fill in the API key (see Environment Variables below)
# Start the dev server
npm run devThe site will be running at http://localhost:3000.
| Command | What it does |
|---|---|
npm run dev |
Start the development server (hot reload) |
npm run build |
Create a production build |
npm run start |
Serve the production build locally |
npm run lint |
Run ESLint |
npm test |
Run tests (Vitest) |
├── app/ # Next.js App Router — pages and layouts
│ ├── layout.tsx # Root layout (nav, footer, fonts, global CSS)
│ ├── page.tsx # Homepage
│ ├── about/ # /about page
│ ├── events/ # /events page
│ ├── execboard/ # /execboard (Meet Us) page
│ └── sponsors/ # /sponsors page
│
├── components/ # Reusable React components
│ ├── Navigation.tsx # Site-wide navbar
│ ├── Footer.tsx # Site-wide footer
│ ├── ScrollHint.tsx # Scroll indicator on homepage
│ ├── home/ # Homepage sections (Hero, Mission, etc.)
│ ├── events/ # Events page components (EventGrid, GalleryModal)
│ ├── execboard/ # Exec board components (MemberCard, MemberModal)
│ ├── sponsors/ # Sponsors page components
│ └── about/ # About page components
│
├── data/ # Static data files
│ ├── board-data.ts # Executive board members by year
│ └── sponsors-data.ts # Sponsor tiers and logos
│
├── lib/ # Utility functions
│ └── drive-gallery.ts # Google Drive API integration (auto-fetches events)
│
├── types/ # TypeScript interfaces
│ ├── board.ts
│ ├── drive.ts
│ ├── events.ts
│ └── sponsors.ts
│
├── public/ # Static assets (images, PDFs, logos)
│ └── images/
│
├── __tests__/ # Unit tests (Vitest + Testing Library)
│
├── app/globals.css # Global styles + CSS custom properties (design tokens)
├── tailwind.config.ts # Tailwind theme extensions
├── next.config.mjs # Next.js configuration
└── .env.local # Environment variables (not committed)
Create a .env.local file in the root with:
NEXT_PUBLIC_GOOGLE_DRIVE_API_KEY=your_google_drive_api_key
NEXT_PUBLIC_EVENTS_PARENT_FOLDER_ID=1mfgArA71a3qWw1EHwxABwzLOg-lqrUTeNEXT_PUBLIC_GOOGLE_DRIVE_API_KEY— A Google Cloud API key with the Drive API enabled. Used to fetch event gallery photos.NEXT_PUBLIC_EVENTS_PARENT_FOLDER_ID— The Google Drive folder ID that contains all event subfolders.
The
NEXT_PUBLIC_prefix makes these available in the browser. They are not secret — the API key should be restricted to the Drive API and your domain(s).
Events are automatically pulled from Google Drive. No code changes needed to add a new event.
-
Open the Events parent folder in Google Drive
-
Create a new subfolder named with this convention:
Event Name - Month Day, YearExamples:
Matcha & Map - January 20, 2026GoDaddy - September 23, 2025.atEOS( ) Fall - November 18, 2025
-
Upload photos into that folder
-
Make sure the folder is shared as "Anyone with the link" → Viewer
That's it. The site will automatically pick up the new folder, parse the name/date, sort by date (newest first), and display the gallery.
Edit data/board-data.ts. Each academic year has an array of members. Add a new year or modify existing entries. Member photos go in public/images/eboard-photos/.
Edit data/sponsors-data.ts. Sponsors are organized by tier (Platinum, Gold, Silver, Bronze). Logos go in public/images/sponsor-logos/.
Edit components/Navigation.tsx. The navLinks array at the top controls the nav items.
The site uses a token-based design system defined in app/globals.css as CSS custom properties and extended in tailwind.config.ts.
Key patterns:
- Colors:
text-brand-red,bg-brand-dark,bg-brand-cream, etc. - Typography:
text-hero,text-heading,text-body,font-display,font-body - Spacing:
py-space-section,gap-space-lg - Animations: GSAP for scroll-triggered reveals, CSS for gradient overlays
Fonts:
- Display/headings: Syne (variable, loaded via
next/font) - Body text: Source Serif 4 (variable, loaded via
next/font)
npm testTests use Vitest with React Testing Library and jsdom. Test files live in __tests__/components/.
The site is configured for static/CDN hosting. After pushing to the main branch:
- Changes automatically propagate to the live site
- CDN may take 1–5 minutes to update
The CNAME file points to colorstackosu.org.
| Branch | Purpose |
|---|---|
main |
Production — deployed to live site |
archive/old-html-site |
Preserved copy of the old vanilla HTML/JS/CSS site (for reference only) |
Reach out on the ColorStack OSU Slack or email colorstackosu@gmail.com.