# CLAUDE.md - Globe Visualization 9

## Project Guidelines for Claude Code

### Local Development

#### Starting a Local Server
```bash
# From the mapbox_globe_9 directory:

# Python 3 (recommended)
python -m http.server 8000

# Python 2
python -m SimpleHTTPServer 8000

# Node.js
npx http-server -p 8000
```

Access at: `http://localhost:8000`

### Project Structure

```
mapbox_globe_9/
├── index.html              # Main HTML with UI overlays
├── src/
│   ├── index.js           # Mapbox initialization & choropleth logic
│   └── data/
│       └── data.js        # Educational funding GeoJSON data
├── README.md              # Full documentation
└── CLAUDE.md              # This file
```

### Code Organization Patterns

#### Mapbox Token
- Uses public token: `pk.eyJ1IjoibGludXhpc2Nvb2wiLCJhIjoiY2w3ajM1MnliMDV4NDNvb2J5c3V5dzRxZyJ9.wJukH5hVSiO74GM_VSJR3Q`
- Configured in `src/index.js`

#### Data Structure
**Country Educational Data** (`educationalFundingData`):
```javascript
{
    type: "FeatureCollection",
    features: [{
        type: "Feature",
        geometry: { type: "Point", coordinates: [lng, lat] },
        properties: {
            country: "Country Name",
            iso: "ISO",
            spendingPerCapita: 2850,
            budgetPercent: 5.4,
            avgTeacherSalary: 62000,
            teacherStudentRatio: 16,
            educationIndex: 0.92,
            trainingCenters: 15
        }
    }]
}
```

**Training Centers** (`trainingCentersData`):
- Generated dynamically from country data
- Distributed around country coordinates with random offset

#### Key Mapbox Techniques

**Choropleth Color Interpolation**:
```javascript
'circle-color': [
    'interpolate',
    ['linear'],
    ['get', 'spendingPerCapita'],
    0, '#440154',      // Purple
    500, '#31688e',    // Blue
    1000, '#35b779',   // Green
    2000, '#fde724'    // Yellow
]
```

**Size Scaling**:
```javascript
'circle-radius': [
    'interpolate',
    ['linear'],
    ['get', 'spendingPerCapita'],
    0, 3,
    5000, 25
]
```

**Zoom-Based Opacity**:
```javascript
'text-opacity': [
    'interpolate',
    ['linear'],
    ['zoom'],
    1.5, 0,
    2.5, 0.7
]
```

### Mapbox Layers

1. **education-circles**: Main choropleth layer with size + color encoding
2. **training-centers-layer**: Red point markers for training facilities
3. **training-centers-halo**: Glow effect around centers
4. **country-labels**: Country name labels (zoom-dependent)

### Data Processing Pipeline

1. **Load GeoJSON data** from `data.js`
2. **Process features** to calculate derived metrics:
   - Funding gap classification
   - Efficiency scores
   - Salary gap tiers
3. **Sort for rankings** (top countries by spending)
4. **Calculate statistics** (avg, max, min)
5. **Generate training centers** from country data
6. **Add to map** as GeoJSON sources
7. **Apply data-driven styling** with expressions

### Interactive Features

**Hover Events**:
- Countries: Show comprehensive funding metrics popup
- Training Centers: Show facility details popup

**Click Events**:
- Countries: Fly to location with camera animation

**Toggle Controls**:
- Training centers visibility
- Country labels visibility

**Leaderboard**:
- Top 10 countries by spending
- Click to navigate

### Globe Configuration

```javascript
map.setFog({
    color: 'rgba(10, 15, 35, 0.9)',
    'high-color': 'rgba(25, 50, 100, 0.5)',
    'horizon-blend': 0.3,
    'space-color': '#000814',
    'star-intensity': 0.7
});
```

### Animation

**Auto-Rotation**:
- Smooth continuous rotation when user not interacting
- Pauses on mouse down/drag/pitch/rotate
- Resumes on interaction end

### Styling Guidelines

**Color Palette**:
- Background: `#000814` (deep blue-black)
- Primary accent: `#fde724` (bright yellow)
- Secondary accent: `#35b779` (green)
- Training centers: `#ff6b6b` (coral red)
- Choropleth: Viridis scale (purple → blue → green → yellow)

**Typography**:
- Font family: 'Inter' (Google Fonts)
- Weights: 300, 400, 600, 700

**UI Patterns**:
- Glassmorphism: `rgba(0, 8, 20, 0.92)` + `backdrop-filter: blur(10px)`
- Border accents: `rgba(253, 231, 36, 0.2)`
- Shadows: `0 8px 32px rgba(0, 0, 0, 0.5)`

### Responsive Design

**Mobile Breakpoint**: `@media (max-width: 768px)`
- Hides legend and leaderboard
- Repositions controls to bottom
- Reduces font sizes
- Adjusts padding

### Performance Considerations

- Single-pass data processing on load
- Efficient GeoJSON structure
- Optimized layer ordering
- Smooth animations with requestAnimationFrame
- Minimal DOM manipulation

### Browser Console Logging

On successful load, logs:
```
Globe loaded successfully!
Total countries: [count]
Total training centers: [count]
Average spending: $[amount]
Top 5 countries by spending: [list]
```

### Common Tasks

**Add a New Country**:
1. Add feature to `educationalFundingData.features` in `data.js`
2. Include all required properties
3. Training centers will auto-generate

**Modify Color Scale**:
1. Edit `circle-color` interpolate expression in `src/index.js`
2. Adjust color stops and values
3. Update legend in `index.html`

**Change Globe Style**:
1. Modify `style` parameter in map initialization
2. Options: `dark-v11`, `light-v11`, `satellite-v9`, `streets-v12`

**Adjust Rotation Speed**:
1. Change `rotationSpeed` variable or modify timestamp divisor in `rotateCamera()`
2. Current: `(timestamp / 200) % 360`

### Web Learning Applied

This iteration implements **choropleth data visualization techniques** learned from:
- **Mapbox GL JS Documentation**: [Update a choropleth layer by zoom level](https://docs.mapbox.com/mapbox-gl-js/example/updating-choropleth/)

**Key learnings applied**:
1. Interpolate expressions for continuous color scaling
2. Linear interpolation for smooth gradients
3. Data-driven property access with `['get', 'property']`
4. Multi-stop color ramps for choropleth maps
5. Layer-based data visualization architecture

### Quality Standards

**Code**:
- Clear variable naming
- Commented sections
- Consistent formatting
- Error-free execution

**Visual**:
- Professional color scheme
- Clear data hierarchy
- Smooth animations
- Readable typography

**Data**:
- Realistic values
- Complete coverage (180+ countries)
- Proper coordinate format
- Meaningful correlations

### Future Enhancement Ideas

1. Add time-series slider for historical data
2. Implement 3D extrusions for total budget
3. Add filter controls for regions/income levels
4. Include comparison mode (side-by-side countries)
5. Real-time data integration from APIs
6. Export functionality for charts/data
7. Accessibility improvements (ARIA labels, keyboard nav)

---

This iteration demonstrates **intermediate-to-advanced Mapbox techniques** with a focus on choropleth data visualization, multi-layer composition, and rich interactivity on a 3D globe projection.
