The official website for the Contextual Dynamics Lab at Dartmouth College, hosted on GitHub Pages.
Live site: https://context-lab.com
contextlab.github.io/
├── index.html # Homepage with animated brain
├── research.html # Research interests and projects
├── people.html # Current members and alumni (auto-generated)
├── publications.html # Papers, talks, posters, materials (auto-generated)
├── software.html # Open-source software projects (auto-generated)
├── contact.html # Contact form
├── news.html # Lab news and updates
├── css/
│ └── style.css # Main stylesheet
├── js/
│ └── main.js # Interactive components
├── images/
│ ├── brain/ # Animated brain frames
│ ├── people/ # Team member photos
│ ├── publications/ # Publication thumbnails
│ └── software/ # Software project images
├── documents/
│ └── JRM_CV.pdf # Jeremy Manning's CV
├── data/ # Content source files (edit these!)
│ ├── publications.xlsx
│ ├── people.xlsx
│ └── software.xlsx
├── templates/ # HTML templates for auto-generation
│ ├── publications.html
│ ├── people.html
│ └── software.html
├── scripts/ # Build and validation scripts
│ ├── build.py
│ └── ...
└── tests/ # Automated tests
└── ...
Site design by Chameleon Studios.
The site uses a green-based color scheme defined in CSS variables:
:root {
--primary-green: rgb(0, 112, 60); /* Main brand color */
--primary-green-light: rgba(0, 112, 60, 0.6);
--bg-green: rgba(0, 112, 60, 0.2); /* Page backgrounds */
--white: #FFFFFF;
--dark-text: rgba(0, 0, 0, 0.7);
}- Body text: Nunito Sans (300 weight)
- Headings: Nunito Sans (300-700 weight), lowercase with letter-spacing
- Base font size: 14px with 1.7 line-height
- Sticky Footer Navigation - Fixed navigation bar at the bottom of the viewport
- Animated Brain - Homepage features a rotating brain animation (GIF frames)
- Info Panel Toggle - Homepage "i" button reveals lab description with smooth animation
- Modal Forms - Contact and join-us forms appear in centered modals
- Publication Cards - Hover effects reveal additional information
- Animated brain image that scales with viewport
- "Info" button toggles descriptive panel
- Brain and text resize responsively
- Lab director section
- Grid of current members
- "Join Us" modal for prospective members
- Alumni section with past lab members
- Collaborators list
- Peer-reviewed articles with thumbnails
- Talks section with video/PDF links
- Course materials
- Conference abstracts and posters
- Contact form (Formspree integration)
- Physical address and email
Located in js/main.js:
- initDropdowns() - Dropdown menu behavior
- initStickyNav() - Footer nav visibility on scroll
- initSlideshow() - Image carousel with autoplay
- initModal() - Modal open/close handling
- initSmoothScroll() - Anchor link smooth scrolling
- initInfoPanel() - Homepage info toggle with animations
- initContactForms() - AJAX form submission
- initMobileMenu() - Mobile navigation toggle
- initCustomValidation() - Styled form validation messages
Contact forms use Formspree for processing. Form validation messages are styled to match the site's green theme.
To update the form endpoint:
- Create a Formspree account
- Create a new form
- Replace the
actionURL in the form HTML
The publications, people, and software pages are automatically generated from Excel spreadsheets. This makes it easy to update content without editing HTML directly.
data/ # Source data (edit these!)
├── publications.xlsx # 104 publications
├── people.xlsx # 95 people entries
└── software.xlsx # 20 software items
templates/ # HTML templates with markers
├── publications.html
├── people.html
└── software.html
scripts/ # Build scripts
├── build.py # Master build script
├── build_publications.py
├── build_people.py
├── build_software.py
├── validate_data.py # Data validation
├── pre_push_check.py # Pre-push checks
└── utils.py # Shared utilities
# Generated output (don't edit directly!)
├── publications.html
├── people.html
└── software.html
- Open
data/publications.xlsxin Excel/Google Sheets - Go to the appropriate sheet (
papers,preprints,chapters, orother) - Add a new row with:
title- Publication titletitle_url- Link to paper (DOI, PDF, etc.)citation- Full citation text (can include HTML links)image- Thumbnail filename (optional, place image inimages/publications/)
- Save and push to GitHub (or run build locally)
- Open
data/people.xlsxin Excel/Google Sheets - Go to the
memberssheet - Add a new row with:
name- Person's namename_url- Personal website (optional)role- e.g., "grad student", "undergrad", "postdoc"bio- Biography textimage- Photo filename (place photo inimages/people/)
- Save and push to GitHub
- Open
data/people.xlsx - Go to the appropriate sheet:
alumni_postdocs- Former postdocsalumni_grads- Former graduate studentsalumni_managers- Former lab managersalumni_undergrads- Former undergraduates
- Add a row with:
name- Person's namename_url- Personal website (optional)current_position- e.g., "now at Google"current_position_url- Link to current employer (optional)
- Open
data/software.xlsx - Go to the appropriate sheet (
python,javascript, ormatlab) - Add a new row with:
name- Project namedescription- Brief descriptionlinks_html- HTML for links, e.g.,[<a href="https://github.com/..." target="_blank">GitHub</a>]
# Install dependencies
pip install -r requirements-build.txt
# Validate data files
python scripts/validate_data.py
# Build all pages
python scripts/build.py
# Or run the full pre-push check
python scripts/pre_push_check.pyWhen you push changes to data/, templates/, or scripts/ on the main branch, GitHub Actions automatically:
- Validates all spreadsheet data
- Rebuilds the HTML pages
- Runs the test suite (76 tests)
- Commits and pushes the regenerated HTML
You can also manually trigger a build from the Actions tab.
| Field | Required | Description |
|---|---|---|
title |
Yes | Publication title |
title_url |
No | Link to paper |
citation |
Yes | Full citation (HTML allowed) |
image |
No | Thumbnail filename |
| Field | Required | Description |
|---|---|---|
name |
Yes | Person's name |
name_url |
No | Personal website |
role |
No | Role in lab |
bio |
No | Biography text |
image |
No | Photo filename |
| Field | Required | Description |
|---|---|---|
name |
Yes | Person's name |
name_url |
No | Personal website |
current_position |
No | Current role/employer |
current_position_url |
No | Link to employer |
| Field | Required | Description |
|---|---|---|
name |
Yes | Project name |
description |
Yes | Brief description |
links_html |
No | HTML links to repo, docs, etc. |
- HTML in cells: You can use HTML tags in spreadsheet cells (e.g.,
<a href="...">,<em>,<strong>) - Image files: Place images in the appropriate
images/subdirectory before referencing them - Validation: Run
python scripts/validate_data.pyto check for missing required fields or broken image references - Don't edit generated HTML: Changes to
publications.html,people.html, andsoftware.htmlin the root directory will be overwritten by the build system
Note: For publications, people, and software pages, use the spreadsheet method above. The manual method below is for other pages or special cases.
- Add photo to
images/people/(recommended: 400x400px) - Edit
people.html, add to appropriate section:
<div class="team-member">
<img src="images/people/name.jpg" alt="Name">
<h3>name | role</h3>
<p>Bio text here.</p>
</div>- Add thumbnail to
images/publications/(recommended: 500x500px with green border) - Edit
publications.html, add to publications grid:
<div class="publication-card">
<img src="images/publications/thumbnail.png" alt="Paper title">
<div class="publication-info">
<h3>Paper Title</h3>
<p>Authors (Year). Journal Name.</p>
<a href="https://doi.org/..." target="_blank">PDF</a>
</div>
</div>- Add screenshot to
images/software/ - Edit
software.html, add to software grid
The site is fully responsive with breakpoints at:
- 768px - Tablet layout
- 480px - Mobile layout
Key mobile adaptations:
- Collapsible navigation menu
- Single-column layouts
- Adjusted font sizes
- Touch-friendly tap targets
The site deploys automatically via GitHub Pages when changes are pushed to the main branch.
To test locally, open any HTML file directly in a browser or use a local server:
python3 -m http.server 8000
# Then visit http://localhost:8000Tested and supported in:
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Design: Chameleon Studios
- Development: Contextual Dynamics Lab
- Hosting: GitHub Pages