diff --git a/public/analytics.js b/public/analytics.js index 986aef5..c7e26b3 100644 --- a/public/analytics.js +++ b/public/analytics.js @@ -783,12 +783,14 @@ ${data.subpaths.map((s, i) => { const barW = Math.max(2, Math.round(s.count / maxCount * 100)); - return ` + const hops = s.path.split(' → '); + const hasSelfLoop = hops.some((h, j) => j > 0 && h === hops[j - 1]); + return ` ${i + 1} - ${escapeHtml(s.path)} + ${esc(s.path)}${hasSelfLoop ? ' 🔄' : ''} ${s.count.toLocaleString()} ${s.pct}% -
+
`; }).join('')} `; diff --git a/public/style.css b/public/style.css index e60389b..31fc9f4 100644 --- a/public/style.css +++ b/public/style.css @@ -1146,3 +1146,7 @@ button.ch-item.ch-item-encrypted .ch-badge { filter: grayscale(0.6); } /* Ambiguous hop indicator */ .hop-ambiguous { border-bottom: 1px dashed #f59e0b; } .hop-warn { font-size: 0.7em; margin-left: 2px; vertical-align: super; } + +/* Self-loop subpath rows */ +.subpath-selfloop { opacity: 0.6; } +.subpath-selfloop td:first-child::after { content: ''; }