+
+ {attacker.services.length > 0 ? (
+ attacker.services.map((svc) => {
+ const isActive = serviceFilter === svc;
+ const interacted =
+ attacker.service_activity?.interacted.includes(svc) ?? false;
+ const baseStyle: React.CSSProperties = interacted
+ ? {
+ borderColor: 'var(--accent-color)',
+ color: 'var(--accent-color)',
+ background: 'var(--violet-tint-10)',
+ }
+ : { opacity: 0.55 };
+ const activeStyle: React.CSSProperties = isActive
+ ? interacted
+ ? {
+ backgroundColor: 'var(--accent-color)',
+ color: 'var(--bg-color)',
+ borderColor: 'var(--accent-color)',
+ opacity: 1,
+ }
+ : {
+ backgroundColor: 'var(--text-color)',
+ color: 'var(--bg-color)',
+ borderColor: 'var(--text-color)',
+ opacity: 1,
+ }
+ : {};
+ return (
+ setServiceFilter(isActive ? null : svc)}
+ title={
+ isActive
+ ? 'Clear filter'
+ : `Filter by ${svc.toUpperCase()} — ${interacted ? 'interacted with' : 'scanned only'}`
+ }
+ >
+ {interacted ? '· ' : ''}{svc.toUpperCase()}
+
+ );
+ })
+ ) : (
+ No services recorded
+ )}
+
+ {attacker.services.length > 0 && (
+
+ · INTERACTED
+ SCAN-ONLY
+
+ )}
+
+