diff --git a/src/templates/static/js/map.js b/src/templates/static/js/map.js
index 5181295..aaf613b 100644
--- a/src/templates/static/js/map.js
+++ b/src/templates/static/js/map.js
@@ -36,14 +36,45 @@ function createClusterIcon(cluster) {
gradientStops.push(`${color} ${start.toFixed(1)}deg ${end.toFixed(1)}deg`);
});
- const size = Math.max(32, Math.min(50, 32 + Math.log2(total) * 5));
- const inner = size - 10;
- const offset = 5; // (size - inner) / 2
+ const size = Math.max(20, Math.min(44, 20 + Math.log2(total) * 4));
+ const centerSize = size - 8;
+ const centerOffset = 4;
+ const ringWidth = 4;
+ const radius = (size / 2) - (ringWidth / 2);
+ const cx = size / 2;
+ const cy = size / 2;
+ const gapDeg = 8;
+
+ // Build SVG arc segments with gaps - glow layer first, then sharp layer
+ let glowSegments = '';
+ let segments = '';
+ let currentAngle = -90;
+ sorted.forEach(([cat, count], idx) => {
+ const sliceDeg = (count / total) * 360;
+ if (sliceDeg < gapDeg) return;
+ const startAngle = currentAngle + (gapDeg / 2);
+ const endAngle = currentAngle + sliceDeg - (gapDeg / 2);
+ const startRad = (startAngle * Math.PI) / 180;
+ const endRad = (endAngle * Math.PI) / 180;
+ const x1 = cx + radius * Math.cos(startRad);
+ const y1 = cy + radius * Math.sin(startRad);
+ const x2 = cx + radius * Math.cos(endRad);
+ const y2 = cy + radius * Math.sin(endRad);
+ const largeArc = (endAngle - startAngle) > 180 ? 1 : 0;
+ const color = categoryColors[cat] || '#8b949e';
+ // Glow layer - subtle
+ glowSegments += `