# CLAUDE.md - Globe Visualization 7 Project Guidelines

## Project Context

This is **Iteration 7** of the Mapbox Globe Progressive Web-Enhanced Learning series. This iteration focuses on timeline animation techniques for temporal data visualization, learning from Mapbox's timeline animation example.

## Quick Start Commands

### Local Development Server
```bash
# Python 3
cd /home/ygg/Workspace/sandbox/infinite-agents/mapbox_test/mapbox_globe_7
python -m http.server 8000

# Python 2
python -m SimpleHTTPServer 8000

# Node.js (if installed)
npx http-server -p 8000
```

Access at: http://localhost:8000

### VS Code Live Server
1. Install "Live Server" extension
2. Right-click `index.html`
3. Select "Open with Live Server"

## File Structure

```
mapbox_globe_7/
├── index.html              # Main HTML with timeline UI
├── src/
│   ├── index.js           # Timeline animation logic
│   └── data/
│       └── data.js        # 80 education platforms, 8 years
├── README.md              # Full documentation
└── CLAUDE.md              # This file
```

## Architecture Overview

### Timeline Animation Pattern (Learned from Web)

**Source:** https://docs.mapbox.com/mapbox-gl-js/example/timeline-animation/

**Key Pattern:**
1. **Preprocess temporal data** → Add year index to each feature
2. **Use setFilter()** → Apply time-based filters efficiently
3. **Range slider control** → Manual timeline scrubbing
4. **Interval-based playback** → Automatic progression
5. **Synchronized updates** → UI state matches map state

### Data Transformation Flow

```javascript
// Input: Nested year data
feature.properties.yearData = {
  "2010": { enrollment, courses, completionRate },
  "2012": { ... }
}

// Processing: Flatten to temporal features
processedFeatures = features × years with yearIndex

// Filtering: Efficient year selection
map.setFilter('layer', ['==', 'yearIndex', selectedYearIndex])
```

## Key Implementation Details

### Timeline Control System
- **Slider Input:** HTML5 range input (0-7 for 8 years)
- **Event Handling:** Input event triggers filterByYear()
- **Auto-pause:** Scrubbing stops playback automatically
- **Play/Pause:** setInterval() for 1.5s per year progression

### Visual Encoding Strategy
- **Size:** Exponential scale based on enrollment
- **Color:** Growth rate gradient (red → yellow → green → blue)
- **Stroke:** White highlight for 10M+ platforms
- **Labels:** Conditional visibility (5M+ threshold)

### Performance Optimizations
1. **Preprocessed data** - Calculations done once at load
2. **Filter-based animation** - No layer recreation
3. **Conditional labeling** - Only major platforms labeled
4. **Efficient expressions** - Interpolate/step for styling

## Mapbox-Specific Patterns

### Globe Projection Setup
```javascript
const map = new mapboxgl.Map({
    projection: 'globe',
    style: 'mapbox://styles/mapbox/dark-v11',
    zoom: 1.8,
    pitch: 20
});
```

### Timeline Filtering
```javascript
map.setFilter('education-circles', ['==', 'yearIndex', yearIndex]);
map.setFilter('education-labels', ['==', 'yearIndex', yearIndex]);
```

### Data-Driven Styling
```javascript
'circle-radius': [
    'interpolate',
    ['exponential', 1.5],
    ['get', 'enrollment'],
    0, 3,
    50000000, 22,
    150000000, 32
]
```

## Code Quality Standards

### JavaScript Style
- ES6+ features (const/let, arrow functions, template literals)
- Clear function names (filterByYear, calculateGrowthRate)
- Comment blocks for major sections
- Error handling for edge cases

### Data Quality
- Realistic enrollment numbers
- Accurate geographic coordinates
- Consistent property naming
- Complete temporal coverage (8 years per platform)

### UI/UX Considerations
- Responsive timeline controls
- Clear year display
- Intuitive slider interaction
- Real-time statistics feedback
- Informative hover popups

## Debugging Tips

### Timeline Not Updating
1. Check yearIndex assignment in preprocessing
2. Verify filter expression syntax
3. Confirm slider value range (0-7)
4. Test filterByYear() function in console

### Visual Encoding Issues
1. Inspect feature properties in console
2. Check Mapbox expression syntax
3. Verify data ranges for interpolation
4. Test with simplified expressions

### Performance Problems
1. Check feature count (should be ~640)
2. Verify filter efficiency
3. Monitor frame rate during animation
4. Simplify visual expressions if needed

## Browser Console Testing

```javascript
// Check processed data
console.log(processedData.features.length); // Should be ~640

// Test filtering manually
filterByYear(3); // Jump to 2016

// Inspect current year
console.log(currentYearIndex, years[currentYearIndex]);

// Toggle playback
togglePlayback();
```

## Extension Ideas

### Easy Additions
1. Speed control for playback (0.5x, 1x, 2x)
2. Year range selector (start/end)
3. Platform type filter (MOOC, University, etc.)
4. Keyboard shortcuts (space = play/pause, arrows = navigate)

### Medium Complexity
1. Multi-metric visualization (enrollment vs courses)
2. Regional comparison mode
3. Growth trend charts
4. Search functionality for platforms

### Advanced Features
1. Export timeline as video/GIF
2. Custom data upload
3. Side-by-side year comparison
4. 3D bar charts for enrollment

## Web Learning Application

### What Was Learned
1. **Timeline preprocessing pattern** - Transform nested temporal data
2. **Filter-based animation** - Efficient layer updates
3. **Range slider integration** - Map state synchronization
4. **Playback control system** - setInterval management
5. **Aggregate calculation** - Real-time statistics

### How It Was Applied
- Transformed 80 platforms with nested yearData into 640 flat features
- Implemented year-based filtering with yearIndex property
- Built play/pause system with auto-pause on scrubbing
- Created synchronized UI (slider, year display, statistics)
- Added growth rate calculation for temporal analysis

### Innovation Beyond Source
- Multi-metric temporal data (enrollment, courses, completion)
- Growth rate calculation and visualization
- Aggregate statistics panel
- Exponential size scaling for better hierarchy
- Auto-rotation with interaction detection

## Mapbox Token

**Working Token:** `pk.eyJ1IjoibGludXhpc2Nvb2wiLCJhIjoiY2w3ajM1MnliMDV4NDNvb2J5c3V5dzRxZyJ9.wJukH5hVSiO74GM_VSJR3Q`

This token is included in the source code and works for this visualization.

## Related Documentation

- [Mapbox Timeline Animation Example](https://docs.mapbox.com/mapbox-gl-js/example/timeline-animation/)
- [Mapbox Expressions](https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/)
- [Mapbox Globe Projection](https://docs.mapbox.com/mapbox-gl-js/example/globe/)
- [Mapbox setFilter API](https://docs.mapbox.com/mapbox-gl-js/api/map/#map#setfilter)

## Success Metrics

This iteration successfully demonstrates:
- ✓ Timeline animation learned from web source
- ✓ Temporal data preprocessing pattern
- ✓ Filter-based animation approach
- ✓ Manual timeline scrubbing control
- ✓ Automatic playback functionality
- ✓ Real-time aggregate statistics
- ✓ Multi-year growth visualization
- ✓ 80+ education platforms worldwide
- ✓ Globe-appropriate temporal visualization

## Iteration Evolution

**Previous Focus (Iterations 1-6):**
- Basic globe setup and styling
- Single-layer visualizations
- Static data snapshots
- Simple interactivity

**This Iteration (7):**
- Timeline animation system
- Temporal data exploration
- Multi-year data processing
- Playback controls
- Growth rate analysis

**Future Directions (8+):**
- 3D extrusions for temporal depth
- Custom animations and transitions
- Real-time data integration
- Advanced temporal analysis
- Multi-view coordination

---

**Generated by:** Sub Agent 3
**Date:** 2025-10-09
**Web Source:** Mapbox Timeline Animation Example
**Iteration:** 7 of Progressive Mapbox Globe Series
