Frontend Components
The Ada UI uses Svelte components for carbon monitoring visualization. All components are located in ada-ui/src/components/Carbon/.
Component Overview
| Component | Purpose |
|---|---|
CarbonDashboard | Main dashboard combining all carbon views |
CarbonIntensityForecast | UK grid carbon intensity forecast chart |
CarbonEquivalencies | Real-world carbon equivalencies display |
CarbonStackedBarChart | Busy/idle usage breakdown chart |
CarbonHeatmap | GitHub-style year heatmap |
WorkspaceCarbonUsage | Per-workspace carbon tracking |
CarbonBadge | Compact carbon indicator for workspace cards |
Architecture
ada-ui (Svelte)
│
├── src/components/Carbon/
│ ├── CarbonDashboard.svelte # Main dashboard
│ ├── CarbonIntensityForecast.svelte # Forecast chart
│ ├── CarbonEquivalencies.svelte # Equivalencies display
│ ├── CarbonStackedBarChart.svelte # Stacked bar chart
│ ├── CarbonHeatmap.svelte # Year heatmap
│ ├── WorkspaceCarbonUsage.svelte # Workspace detail
│ ├── CarbonBadge.svelte # Compact badge
│ └── index.js # Exports
│
└── src/api/carbon.js (API client)
│
↓
ada-api (proxy)
│
↓
ada-carbon-monitoring-api
Using Components
Import
import {
CarbonDashboard,
CarbonIntensityForecast,
CarbonEquivalencies,
CarbonStackedBarChart,
CarbonHeatmap,
WorkspaceCarbonUsage,
CarbonBadge
} from "$components/Carbon";
CarbonDashboard
The main dashboard component that combines all carbon views.
<CarbonDashboard />
Features
- Summary cards (energy, carbon, workspaces, CPU time)
- Carbon intensity forecast
- Stacked bar chart (day/month/year views)
- GitHub-style heatmap
- Carbon equivalencies
- Workspace breakdown table
Demo Mode
When running with fake data (carbon-labs-demo branch), displays an orange banner:
⚗️ Demo Mode - Displaying simulated data for demonstration purposes
Data Loading
Fetches data in parallel on mount:
getMySummary()- User’s carbon summarygetMyUsage()- User’s workspace usagegetHeatmapData()- Year heatmap datagetHistoricalData()- Chart data for all views
CarbonIntensityForecast
Line chart showing UK grid carbon intensity with best 3-hour window highlighted.
<CarbonIntensityForecast defaultRange="working" />
Props
| Prop | Type | Default | Description | |——|——|———|————-| | defaultRange | string | “working” | Initial view: “working”, “24h”, “48h”, “custom” |
Features
- Line chart with Chart.js
- Highlights best 3-hour low-carbon window (green background)
- “Now” marker (dashed vertical line)
- Range selector tabs
- Auto-refresh timestamp in subtitle
Range Options
| Range | Description | |——-|————-| | Working | 8:00 AM - 5:00 PM (today or tomorrow) | | 24h | Next 24 hours | | 48h | Next 48 hours | | Custom | User-defined range |
API Response Handling
Transforms API response format:
// API returns:
{ forecasts: [{ from_time, to_time, intensity_forecast, intensity_index }] }
// Component expects:
{ periods: [{ from, to, intensity: { forecast, actual, index } }] }
CarbonStackedBarChart
Stacked bar chart showing busy vs idle breakdown.
<CarbonStackedBarChart
defaultDataType="carbon"
defaultTimeView="day"
title="Carbon Usage"
/>
Props
| Prop | Type | Default | Description | |——|——|———|————-| | data | object | null | External data (uses API if not provided) | | defaultDataType | string | “carbon” | “carbon” or “electricity” | | defaultTimeView | string | “day” | “day”, “month”, or “year” | | title | string | “” | Chart title |
Features
- Stacked bars (busy = green, idle = gray)
- Toggle between carbon (gCO2eq) and electricity (kWh)
- Day/month/year view selector
- Date picker for specific periods
- Dynamic data fetching on view change
Data Format
{
labels: ["00:00", "01:00", "02:00", ...], // Time labels
busy: [12.5, 15.3, 8.7, ...], // Busy values
idle: [3.2, 4.1, 2.8, ...] // Idle values
}
CarbonHeatmap
GitHub-style year heatmap showing daily carbon footprint.
<CarbonHeatmap
year={2026}
title="2026 Carbon Footprint"
/>
Props
| Prop | Type | Default | Description | |——|——|———|————-| | data | object | null | External data (uses API if not provided) | | year | number | current | Year to display | | maxValue | number | null | Override color scale maximum | | title | string | “” | Component title |
Features
- Full year grid (52-53 weeks × 7 days)
- Color gradient from green (low) to red (high)
- Month labels
- Day-of-week labels
- Hover tooltips with exact values
- Legend with color scale
Data Format
{
year: 2026,
days: [
{ date: "2026-01-01", value: 125.5 },
{ date: "2026-01-02", value: 143.2 },
...
],
max: 250.0 // Maximum value for color scaling
}
March 2025 Cutoff
Data before March 2025 displays as 0 (gray) due to Prometheus label changes.
CarbonEquivalencies
Displays carbon in relatable real-world terms.
<CarbonEquivalencies
gco2eq={1500}
equivalencies={data}
showTotal={true}
/>
Props
| Prop | Type | Default | Description | |——|——|———|————-| | gco2eq | number | 0 | Total carbon in gCO2eq | | equivalencies | object | {} | Equivalencies from API | | showTotal | boolean | true | Show total emissions header |
Features
- Grid of equivalency cards with icons
- Hover effects
- Responsive layout
- Icon mapping for each equivalency type
Equivalency Types
| Key | Icon | Description | |—–|——|————-| | smartphone_charge | 📱 | Smartphone charges | | miles_driven | 🚗 | Miles driven | | trees_day | 🌳 | Tree-days to offset | | streaming_hours | 📺 | HD streaming hours | | kettle_boil | ☕ | Liters boiled |
WorkspaceCarbonUsage
Per-workspace carbon tracking display.
<WorkspaceCarbonUsage
workspaceId="abc123"
workspaceName="My Workspace"
compact={false}
/>
Props
| Prop | Type | Default | Description | |——|——|———|————-| | workspaceId | string | required | Workspace ID | | workspaceName | string | “” | Display name | | compact | boolean | false | Use compact layout |
Features
- Real-time carbon tracking
- CPU usage breakdown
- Energy consumption
- Carbon emissions
- Equivalencies (in full mode)
CarbonBadge
Compact carbon indicator for workspace cards.
<CarbonBadge workspaceId="abc123" />
Props
| Prop | Type | Default | Description | |——|——|———|————-| | workspaceId | string | required | Workspace ID |
Features
- Small footprint badge
- Shows total gCO2eq
- Color-coded by intensity
- Loading state
- Error handling
Usage in WorkspaceCard
<div class="workspace-card">
<div class="workspace-info">
<span>{workspace.name}</span>
<CarbonBadge workspaceId={workspace.id} />
</div>
</div>
API Client
The carbon.js API client provides all data fetching functions.
import {
getCurrentIntensity,
getIntensityForecast,
calculateCarbon,
getEquivalencies,
trackWorkspaces,
getActiveWorkspaces,
getWorkspacesSummary,
getMySummary,
getMyUsage,
getHistoricalData,
getHeatmapData,
getWorkspaceCarbon,
formatCarbon,
formatEnergy,
getIntensityColor
} from "$api/carbon";
Key Functions
// Get user's carbon summary
const summary = await getMySummary();
// Get historical data for charts
const data = await getHistoricalData({
view: "month",
month: "2026-01",
data_type: "carbon"
});
// Get heatmap data
const heatmap = await getHeatmapData({ year: 2026 });
// Format values for display
formatCarbon(1500); // "1.5 kg CO₂eq"
formatEnergy(0.5); // "0.50 kWh"
// Get color for intensity value
getIntensityColor(185); // "moderate" → yellow
Styling
Components use:
- CSS Variables for theming
- SMUI (Svelte Material UI) components
- Chart.js for visualizations
- Scoped styles for component isolation
Color Scheme
| Context | Color | |———|——-| | Busy usage | Green (#4caf50) | | Idle usage | Gray (#9e9e9e) | | Low intensity | Green | | Moderate intensity | Yellow | | High intensity | Orange | | Very high intensity | Red |
Branch Structure
| Branch | Features |
|---|---|
carbon-labs-platform | Production - Carbon in Labs sidebar |
carbon-labs-demo | Demo mode with fake data banner |