shieldx/dashboard/src/components/EmptyState.tsx
Rene Fichtmueller 1c4c034483 feat: ShieldX v0.3.0 — UnicodeScanner (L5), DNS Covert Channel rules, ATLAS v5.4 mappings
- Layer 4 EntropyScanner: Shannon entropy, Base32/Base64 detection, CVE-2025-55284
  ping/nslookup exfil, EchoLeak markdown pattern, DNS tunneling (iodine/dnscat)
- Layer 5 UnicodeScanner: ASCII Smuggling (U+E0000 Tags Block), Variant Selectors,
  Zero-Width steganography, CamoLeak image-ordering (CVE-2025-53773), homoglyphs,
  BiDi override, high-entropy URL params
- 30 DNS covert channel rules (dns-001 to dns-030)
- ATLASMapper: 29 techniques (ATLAS v5.4.0 Feb 2026), added AML.T0062 (Agent Tool
  Invocation), AML.TA0015 (C2 tactic), memory poisoning, multi-agent trust,
  CamoLeak, Unicode steganography mappings
- Rule count: 72 → 102
- Build: tsup 316ms, zero TypeScript errors
2026-03-31 16:32:16 +02:00

31 lines
765 B
TypeScript

'use client'
import { theme } from '../theme'
export interface EmptyStateProps {
readonly message?: string
readonly icon?: string
readonly className?: string
}
export function EmptyState({ message = 'No data available', icon = '\u26A0', className }: EmptyStateProps) {
return (
<div
className={className}
style={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
padding: '48px 24px',
color: theme.colors.textDim,
fontFamily: theme.font,
textAlign: 'center',
}}
>
<span style={{ fontSize: 36, marginBottom: 12, opacity: 0.5 }}>{icon}</span>
<p style={{ fontSize: 14, margin: 0 }}>{message}</p>
</div>
)
}