// ServiceSignatureA.jsx — shared helpers + signature sections for Web and Mobile (part 1)
// Each "signature" is a unique, domain-specific animated module that makes its
// service page visually distinct from the others. Registered on
// window.SERVICE_SIGNATURES keyed by slug; dispatcher lives in part B.
window.SERVICE_SIGNATURES = window.SERVICE_SIGNATURES || {};
// ── Inject keyframes once ──
(function injectSigStyles() {
if (document.getElementById('gs-sig-styles')) return;
const s = document.createElement('style');
s.id = 'gs-sig-styles';
s.textContent = `
@keyframes gs-sweep { to { transform: rotate(360deg); } }
@keyframes gs-blip { 0% { opacity: 0; transform: scale(0.2); } 30% { opacity: 1; transform: scale(1); } 100% { opacity: 0; transform: scale(1.6); } }
@keyframes gs-draw { to { stroke-dashoffset: 0; } }
@keyframes gs-flow { from { offset-distance: 0%; } to { offset-distance: 100%; } }
@keyframes gs-flowx { from { transform: translateX(-120%); } to { transform: translateX(420%); } }
@keyframes gs-fadeup { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
@keyframes gs-trace { 0% { opacity: 0.2; } 50% { opacity: 1; } 100% { opacity: 0.2; } }
@keyframes gs-glowpulse { 0%,100% { box-shadow: 0 0 0 0 rgba(94,105,210,0.0); } 50% { box-shadow: 0 0 18px 2px rgba(94,105,210,0.35); } }
`;
document.head.appendChild(s);
})();
// ── Shared hooks/components ──
const useInView = (threshold = 0.25) => {
const ref = React.useRef(null);
const [seen, setSeen] = React.useState(false);
React.useEffect(() => {
const el = ref.current; if (!el) return;
const obs = new IntersectionObserver(([e]) => { if (e.isIntersecting) { setSeen(true); obs.disconnect(); } }, { threshold });
obs.observe(el); return () => obs.disconnect();
}, []);
return [ref, seen];
};
const useCountUp = (target, active, dur = 1400) => {
const [v, setV] = React.useState(0);
React.useEffect(() => {
if (!active) return;
let raf, start;
const tick = (t) => {
if (!start) start = t;
const p = Math.min(1, (t - start) / dur);
const eased = 1 - Math.pow(1 - p, 3);
setV(target * eased);
if (p < 1) raf = requestAnimationFrame(tick);
};
raf = requestAnimationFrame(tick);
return () => cancelAnimationFrame(raf);
}, [active, target]);
return v;
};
const SigSection = ({ eyebrow, title, sub, children, max = 1280 }) => (
{eyebrow}
{title}
{sub &&
{sub}
}
{children}
);
const SigPanel = React.forwardRef(({ children, accent = '#5e6ad2', pad = 24, style = {} }, ref) => (
));
const sevColor = (s) => s === 'critical' || s === 'C' ? '#e8543a' : s === 'high' || s === 'H' ? '#d98326' : s === 'medium' || s === 'M' ? '#5e6ad2' : s === 'low' || s === 'L' ? '#7a7fad' : '#27a644';
// ═══════════════ WEB — OWASP Top 10 coverage board ═══════════════
const WebSignature = () => {
const cats = [
{ id: 'A01', n: 'Broken Access Control', cov: 96, f: 142, d: 'IDOR cascades, privilege escalation, and tenant breakouts. The most common critical we report.' },
{ id: 'A02', n: 'Cryptographic Failures', cov: 88, f: 61, d: 'Weak token signing, predictable secrets, plaintext at rest, and TLS downgrade paths.' },
{ id: 'A03', n: 'Injection', cov: 94, f: 88, d: 'SQL, NoSQL, template, and command injection, each confirmed by manual reproduction.' },
{ id: 'A04', n: 'Insecure Design', cov: 82, f: 47, d: 'Business-logic flaws, race conditions, and workflow skipping.' },
{ id: 'A05', n: 'Security Misconfiguration', cov: 91, f: 73, d: 'Debug endpoints, default credentials, verbose errors, and permissive CORS.' },
{ id: 'A06', n: 'Vulnerable Components', cov: 86, f: 55, d: 'Outdated libraries where the vulnerable code is reachable and exploitable.' },
{ id: 'A07', n: 'Auth & Identity Failures', cov: 93, f: 79, d: 'MFA bypass, session fixation, JWT tampering, and credential-stuffing resilience.' },
{ id: 'A08', n: 'Integrity Failures', cov: 79, f: 31, d: 'Insecure deserialization, unsigned updates, and CI/CD supply-chain trust gaps.' },
{ id: 'A09', n: 'Logging & Monitoring', cov: 74, f: 24, d: 'Whether your own telemetry would have detected the activity, tested against your real logging pipeline.' },
{ id: 'A10', n: 'Server-Side Request Forgery', cov: 90, f: 42, d: 'Cloud-metadata reachability, internal service pivoting, and blind-SSRF confirmation.' },
];
const [ref, seen] = useInView();
const [active, setActive] = React.useState(0);
React.useEffect(() => { if (!seen) return; const t = setInterval(() => setActive(a => (a + 1) % cats.length), 2600); return () => clearInterval(t); }, [seen]);
const cur = cats[active];
return (
{cats.map((c, i) => (
))}
{cur.id} · OWASP 2021
{cur.n}
{cur.d}
{cur.cov}%
manual coverage
);
};
// ═══════════════ MOBILE — MASVS radar chart ═══════════════
const MobileSignature = () => {
const [ref, seen] = useInView();
const axes = [
{ l: 'Storage', v: 0.82 }, { l: 'Crypto', v: 0.74 }, { l: 'Auth', v: 0.9 },
{ l: 'Network', v: 0.86 }, { l: 'Platform', v: 0.7 }, { l: 'Resilience', v: 0.64 },
];
const cx = 150, cy = 150, R = 110;
const pt = (i, r) => { const a = (Math.PI * 2 * i) / axes.length - Math.PI / 2; return [cx + Math.cos(a) * R * r, cy + Math.sin(a) * R * r]; };
const poly = (vals) => vals.map((v, i) => pt(i, v).join(',')).join(' ');
return (
{[{ p: 'iOS', d: 'iPhone 12+ · iOS 16/17', sub: 'jailbroken & stock', icon: 'lock' }, { p: 'Android', d: 'AOSP 11–14', sub: 'rooted & user builds', icon: 'fingerprint' }].map(d => (
{d.p}
{d.d}
{d.sub}
))}
Runtime instrumentation
{['Frida', 'Objection', 'SSL-kill-switch', 'MobSF', 'Ghidra', 'Hopper', 'jadx', 'r2'].map(t => (
{t}
))}
Jailbreak and root-detection bypass, SSL-pinning circumvention, and IPC fuzzing on real devices, then the backend API in the same engagement.
);
};
Object.assign(window, {
useInView, useCountUp, SigSection, SigPanel, sevColor,
WebSignature, MobileSignature,
});
window.SERVICE_SIGNATURES['web'] = WebSignature;
window.SERVICE_SIGNATURES['mobile'] = MobileSignature;