diff --git a/web/src/padelnomics/content/templates/markets.html b/web/src/padelnomics/content/templates/markets.html
index 84b109a..e0901a2 100644
--- a/web/src/padelnomics/content/templates/markets.html
+++ b/web/src/padelnomics/content/templates/markets.html
@@ -102,9 +102,11 @@
if (!c.lat || !c.lon) return;
var size = 12 + 44 * Math.sqrt(c.total_venues / maxV);
var color = scoreColor(c.avg_market_score);
+ var oppColor = c.avg_opportunity_score >= 60 ? '#16A34A' : (c.avg_opportunity_score >= 30 ? '#D97706' : '#3B82F6');
var tip = '' + c.country_name_en + '
'
+ c.total_venues + ' venues · ' + c.city_count + ' cities
'
- + 'Padelnomics Market Score: ' + c.avg_market_score + '/100';
+ + 'Padelnomics Market Score: ' + c.avg_market_score + '/100
'
+ + 'Padelnomics Opportunity Score: ' + (c.avg_opportunity_score || 0) + '/100';
L.marker([c.lat, c.lon], { icon: makeIcon(size, color) })
.bindTooltip(tip, { className: 'map-tooltip', direction: 'top', offset: [0, -Math.round(size / 2)] })
.on('click', function() { window.location = '/' + lang + '/markets/' + c.country_slug; })
diff --git a/web/src/padelnomics/public/templates/opportunity_map.html b/web/src/padelnomics/public/templates/opportunity_map.html
index 9eca701..0ddf190 100644
--- a/web/src/padelnomics/public/templates/opportunity_map.html
+++ b/web/src/padelnomics/public/templates/opportunity_map.html
@@ -104,8 +104,10 @@
var dist = loc.nearest_padel_court_km != null
? loc.nearest_padel_court_km.toFixed(1) + ' km to nearest court'
: 'No nearby courts';
+ var mktColor = loc.market_score >= 60 ? '#16A34A' : (loc.market_score >= 30 ? '#D97706' : '#DC2626');
var tip = '' + loc.location_name + '
'
+ 'Padelnomics Opportunity Score: ' + loc.opportunity_score + '/100
'
+ + 'Padelnomics Market Score: ' + (loc.market_score || 0) + '/100
'
+ dist + ' · Pop. ' + fmtPop(loc.population);
L.marker([loc.lat, loc.lon], { icon: makeIcon(size, color) })
.bindTooltip(tip, { className: 'map-tooltip', direction: 'top', offset: [0, -Math.round(size / 2)] })
diff --git a/web/src/padelnomics/static/js/article-maps.js b/web/src/padelnomics/static/js/article-maps.js
index 975663c..d90cf8f 100644
--- a/web/src/padelnomics/static/js/article-maps.js
+++ b/web/src/padelnomics/static/js/article-maps.js
@@ -49,10 +49,12 @@
var pop = c.population >= 1000000
? (c.population / 1000000).toFixed(1) + 'M'
: (c.population >= 1000 ? Math.round(c.population / 1000) + 'K' : (c.population || ''));
+ var oppColor = c.opportunity_score >= 60 ? '#16A34A' : (c.opportunity_score >= 30 ? '#D97706' : '#3B82F6');
var tip = '' + c.city_name + '
'
+ (c.padel_venue_count || 0) + ' venues'
+ (pop ? ' · ' + pop : '')
- + '
Padelnomics Market Score: ' + Math.round(c.market_score) + '/100';
+ + '
Padelnomics Market Score: ' + Math.round(c.market_score) + '/100'
+ + '
Padelnomics Opportunity Score: ' + Math.round(c.opportunity_score || 0) + '/100';
if (hasArticle) {
tip += '
Click to explore →';
} else {