From 2db8276c0969a0ddecff20c86b48f00e13237383 Mon Sep 17 00:00:00 2001 From: s0lray Date: Thu, 26 Mar 2026 14:57:19 -0400 Subject: [PATCH 1/3] Add api, invitationOnly, deprecated badges to tool panel (THE-116) Show boolean feature badges in the tool details panel when true: - API (blue): tool has a public API - Invite Only (amber): tool requires an invitation - Deprecated (dark red): tool is no longer actively maintained Co-Authored-By: Paperclip --- public/css/panel.css | 7 ++++++- public/js/arf.js | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/public/css/panel.css b/public/css/panel.css index 7128b1c..aa0bd1c 100644 --- a/public/css/panel.css +++ b/public/css/panel.css @@ -335,7 +335,12 @@ .badge-active { background: #c84040; } /* Unknown / fallback */ -.badge-unknown { background: #606060; } +.badge-unknown { background: #606060; } + +/* Boolean feature badges */ +.badge-api { background: #1e90cc; } +.badge-invitation-only { background: #b87800; } +.badge-deprecated { background: #8b3030; } /* OPSEC row layout */ .opsec-row { diff --git a/public/js/arf.js b/public/js/arf.js index a935de5..2234b2b 100644 --- a/public/js/arf.js +++ b/public/js/arf.js @@ -451,6 +451,16 @@ function openPanel(d) { var pricingClass = ["free","freemium","paid"].indexOf(pricing) !== -1 ? pricing : "unknown"; badgeHtml += ' ' + escapeHtml(pricing) + ''; + if (d.data.api === true) { + badgeHtml += ' API'; + } + if (d.data.invitationOnly === true) { + badgeHtml += ' Invite Only'; + } + if (d.data.deprecated === true) { + badgeHtml += ' Deprecated'; + } + badgesEl.innerHTML = badgeHtml; badgesEl.classList.remove("empty"); } From 591ded3875cfa479c72fad562d17044176a23580 Mon Sep 17 00:00:00 2001 From: s0lray Date: Thu, 26 Mar 2026 15:01:41 -0400 Subject: [PATCH 2/3] Add nsfw badge to tool panel (THE-116) Co-Authored-By: Paperclip --- public/css/panel.css | 1 + public/js/arf.js | 3 +++ 2 files changed, 4 insertions(+) diff --git a/public/css/panel.css b/public/css/panel.css index aa0bd1c..8ee99fc 100644 --- a/public/css/panel.css +++ b/public/css/panel.css @@ -341,6 +341,7 @@ .badge-api { background: #1e90cc; } .badge-invitation-only { background: #b87800; } .badge-deprecated { background: #8b3030; } +.badge-nsfw { background: #9b2b9b; } /* OPSEC row layout */ .opsec-row { diff --git a/public/js/arf.js b/public/js/arf.js index 2234b2b..e6fd43b 100644 --- a/public/js/arf.js +++ b/public/js/arf.js @@ -460,6 +460,9 @@ function openPanel(d) { if (d.data.deprecated === true) { badgeHtml += ' Deprecated'; } + if (d.data.nsfw === true) { + badgeHtml += ' NSFW'; + } badgesEl.innerHTML = badgeHtml; badgesEl.classList.remove("empty"); From 05997513b54fe841f5fff91f8689aec8a5e6e681 Mon Sep 17 00:00:00 2001 From: s0lray Date: Thu, 26 Mar 2026 15:04:12 -0400 Subject: [PATCH 3/3] Add region badge to tool panel (THE-116) Adds a region badge that always shows in the tool details panel. Defaults to "Global" when the region field is absent or set to "global". Accepts a two-letter country code string (uppercased) or an array of country codes (joined as "US, UK"). Badge is styled green (#2e7d32). Co-Authored-By: Paperclip --- public/css/panel.css | 1 + public/js/arf.js | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/public/css/panel.css b/public/css/panel.css index 8ee99fc..3d9e488 100644 --- a/public/css/panel.css +++ b/public/css/panel.css @@ -342,6 +342,7 @@ .badge-invitation-only { background: #b87800; } .badge-deprecated { background: #8b3030; } .badge-nsfw { background: #9b2b9b; } +.badge-region { background: #2e7d32; } /* OPSEC row layout */ .opsec-row { diff --git a/public/js/arf.js b/public/js/arf.js index e6fd43b..e7cd87b 100644 --- a/public/js/arf.js +++ b/public/js/arf.js @@ -464,6 +464,17 @@ function openPanel(d) { badgeHtml += ' NSFW'; } + var region = d.data.region; + var regionLabel; + if (!region || region === "global") { + regionLabel = "Global"; + } else if (Array.isArray(region)) { + regionLabel = region.map(function(r) { return r.toUpperCase(); }).join(", "); + } else { + regionLabel = String(region).toUpperCase(); + } + badgeHtml += ' ' + escapeHtml(regionLabel) + ''; + badgesEl.innerHTML = badgeHtml; badgesEl.classList.remove("empty"); }