Built and Written by Seokhyeon Byun
A modern, responsive conference website built with Next.js for the SuperDARN 2025 Workshop in Roanoke, Virginia.
This website serves as the primary platform for the SuperDARN 2025 Workshop, providing information about:
- Conference venue and lodging
- Registration details
- Abstract submission
- Travel information
- Participant information
- Responsive design for all devices
- Easy navigation
- Clear information structure
- Accessible interface
- Virginia Tech brand guidelines compliance
- Optimized performance
- Framework: Next.js 15 (React)
- Language: TypeScript
- Styling: TailwindCSS
- UI Components: Custom components with VT brand guidelines
- Icons: Lucide React
app/
├── abstract/
│ └── page.tsx
├── registration/
│ └── page.tsx
├── travel/
│ └── page.tsx
├── venue/
│ └── page.tsx
├── participants/
│ └── page.tsx
├── layout.tsx
└── page.tsx
components/
├── navbar.tsx
├── hero.tsx
└── footer.tsx
lib/
└── utils.ts
public/
├── images/
├── blue-ridge.png
├── hotel-roanoke.jpg
└── other images...
Unlike traditional Flask routing where routes are defined in Python files (e.g., @app.route('/about')), Next.js uses a folder-based routing system:
- Each folder in
app/becomes a URL route page.tsxfiles inside these folders define the content for that route- Example:
app/venue/page.tsxautomatically creates/venueroute
app/
├── venue/page.tsx → accessible at /venue
├── travel/page.tsx → accessible at /travel
├── abstract/page.tsx → accessible at /abstract
└── page.tsx → accessible at / (homepage)
layout.tsx: Defines the common layout (navbar, footer) shared across all pagespage.tsx: The actual page content for each routeglobals.css: Global styles applied to the entire application
Contains reusable UI components that can be imported into any page:
- Not route-based
- Used for code organization and reusability
- Example:
navbar.tsxandfooter.tsxare used in the layout
Stores static assets that are:
- Publicly accessible
- Referenced directly in code
- Example:
/public/images/blue-ridge.pngis accessed as/images/blue-ridge.pngin the code
Flask:
@app.route('/venue')
def venue():
return render_template('venue.html')Next.js:
app/venue/page.tsx → Automatically creates /venue route
This folder-based system:
- Is more intuitive
- Requires less configuration
- Automatically handles routing
- Better organizes related files
Next.js 13+ uses React Server Components by default. Understanding which files use "use client" is important:
Files without "use client" directive are server components:
// app/venue/page.tsx
export default function VenuePage() {
return <div>Server Component</div>;
}- Better performance
- Smaller client-side JavaScript
- Direct access to backend resources
- Used for: Static pages, data fetching, server-side operations
Files that need interactivity must use "use client" directive:
// components/navbar.tsx
"use client";
import { useState } from "react";
export function Navbar() {
const [isOpen, setIsOpen] = useState(false);
// ... interactive component code
}- Required for:
- useState, useEffect hooks
- onClick handlers
- Browser APIs
- Interactive components
- Examples in our project:
components/navbar.tsx(mobile menu interaction)components/hero.tsx(image loading optimization)
This hybrid approach allows us to optimize performance while maintaining interactivity where needed.
Homepage (/)
│
├── Venue & Lodging (/venue)
│
├── Register (/registration)
│
├── Submit Abstract (/abstract)
│
├── Participants (/participants)
│
└── Travel (/travel)
- Clone the repository:
git clone [repository-url]- Install dependencies:
npm install- Run the development server:
npm run devOpen http://localhost:3000 with your browser to see the result.
The site is configured for static export, making it deployable to any static hosting service:
- Build the site:
npm run build- Deploy the
outdirectory to your hosting service of choice (Vercel, Netlify, GitHub Pages, etc.)