devtools-guardian 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +192 -0
- package/dist/index.d.mts +57 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.js +657 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +628 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useDevToolsDetector.ts","../src/components/DevToolsWarningOverlay.tsx","#style-inject:#style-inject","../src/styles/index.css","../src/provider/DevToolsProtection.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DevToolsDetectorOptions {\n /** Keyboard shortcuts to intercept. Default covers common DevTools keys. */\n blockedKeys?: string[];\n /** Disable right-click context menu. Default: true */\n disableRightClick?: boolean;\n /** Disable text selection on the page. Default: true */\n disableSelection?: boolean;\n /** Called once when DevTools is first detected as open. */\n onDetect?: () => void;\n /** Called once when DevTools is detected as closed. */\n onClose?: () => void;\n /** Polling interval in ms. Default: 1500 */\n pollInterval?: number;\n /**\n * Extra px added to both dimension thresholds.\n * Raise this on layouts with large chrome (e.g. electron shells). Default: 0\n */\n thresholdBuffer?: number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DEFAULT_BLOCKED_KEYS: string[] = [\n // 'F12',\n 'Ctrl+Shift+I',\n 'Ctrl+Shift+J',\n 'Ctrl+Shift+C',\n 'Ctrl+U',\n 'Ctrl+S',\n];\n\nconst CONSOLE_STYLES = {\n owner:\n 'color:rgba(89, 255, 0, 1);font-size:28px;font-weight:900;font-family:monospace;' +\n 'text-shadow:0 0 10px rgba(89, 255, 0, 1);padding:5px 0;',\n warning:\n 'color:#FF8C00;font-size:22px;font-weight:800;font-family:monospace;' +\n 'text-shadow:0 0 10px rgba(255, 189, 0, 1);padding:5px 0;',\n message:\n 'color:red;font-size:14px;font-family:monospace;font-weight:bold;margin-bottom:8px;',\n labelGreen:\n 'color:#10b981;font-size:13px;font-family:monospace;font-weight:bold;',\n linkPurple:\n 'color:#6366f1;font-size:13px;font-family:monospace;text-decoration:underline;font-weight:bold;',\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst isMobileDevice = (): boolean => {\n if (typeof window === 'undefined') return false;\n return (\n window.matchMedia('(pointer: coarse)').matches ||\n /Mobi|Android|iPhone|iPad/i.test(navigator.userAgent)\n );\n};\n\nconst isDevMode = (): boolean => {\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development') {\n return true;\n }\n if (typeof window !== 'undefined' && window.location) {\n const hostname = window.location.hostname;\n if (\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname === '[::1]' ||\n hostname.startsWith('192.168.') ||\n hostname.startsWith('10.') ||\n hostname.startsWith('172.')\n ) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * useDevToolsDetector\n\n *\n * Detects whether the browser's DevTools panel is open using three\n * complementary heuristics:\n * 1. Window outer/inner size differential (docked panel)\n * 2. Console Image-getter trick (Chrome / Firefox console evaluation)\n * 3. Optional debugger timing check (undocked panel, production only)\n *\n * Additionally provides keyboard-shortcut blocking and UX protections.\n *\n * @returns `true` when DevTools is considered open, `false` otherwise.\n */\nexport function useDevToolsDetector(options: DevToolsDetectorOptions = {}): boolean {\n const {\n blockedKeys = DEFAULT_BLOCKED_KEYS,\n disableRightClick = true,\n disableSelection = true,\n onDetect,\n onClose,\n pollInterval = 1500,\n thresholdBuffer = 0,\n } = options;\n\n // ── State ──────────────────────────────────────────────────────────────────\n\n const [isOpen, setIsOpen] = useState(false);\n\n /**\n * Ref mirrors state to give stable access inside closures / setInterval\n * callbacks without requiring the effect to re-subscribe on every render.\n */\n const isOpenRef = useRef(false);\n\n // Stable refs for callbacks so effects don't need them as deps.\n const onDetectRef = useRef(onDetect);\n const onCloseRef = useRef(onClose);\n useEffect(() => { onDetectRef.current = onDetect; }, [onDetect]);\n useEffect(() => { onCloseRef.current = onClose; }, [onClose]);\n\n // ── Core trigger helpers ───────────────────────────────────────────────────\n\n /** Mark DevTools as open (idempotent). */\n const triggerDetection = useCallback(() => {\n if (!isOpenRef.current) {\n isOpenRef.current = true;\n setIsOpen(true);\n onDetectRef.current?.();\n }\n }, []);\n\n /** Mark DevTools as closed (idempotent). */\n const triggerClose = useCallback(() => {\n if (isOpenRef.current) {\n isOpenRef.current = false;\n setIsOpen(false);\n onCloseRef.current?.();\n }\n }, []);\n\n // ── Console branding ───────────────────────────────────────────────────────\n\n /**\n * Prints a branded warning to the console.\n * Only called while DevTools is confirmed open to avoid unnecessary noise.\n * Stable reference via useCallback so it can safely be listed as a dep.\n */\n const printConsoleBranding = useCallback(() => {\n console.clear();\n console.log('%c Built with ❤️ by Ali Arshad', CONSOLE_STYLES.owner);\n console.log('%c ⚠ UNAUTHORIZED REVERSE ENGINEERING DETECTED.', CONSOLE_STYLES.warning);\n console.log(\n '%c ⚠ Stealing code harms innovation. Let\\'s build together instead!',\n CONSOLE_STYLES.message,\n );\n console.log(\n '%c ⚠ Portfolio: %chttps://ali-arshad-110.github.io',\n CONSOLE_STYLES.labelGreen,\n CONSOLE_STYLES.linkPurple,\n );\n }, []);\n\n // ── Keyboard + context-menu protection ────────────────────────────────────\n\n useEffect(() => {\n const blockedSet = new Set(blockedKeys);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n\n // F12\n if (blockedSet.has('F12') && e.key === 'F12') {\n e.preventDefault();\n triggerDetection();\n return;\n }\n\n // Ctrl + Shift + I / J / C\n if (e.ctrlKey && e.shiftKey) {\n if (\n (blockedSet.has('Ctrl+Shift+I') && key === 'i') ||\n (blockedSet.has('Ctrl+Shift+J') && key === 'j') ||\n (blockedSet.has('Ctrl+Shift+C') && key === 'c')\n ) {\n e.preventDefault();\n triggerDetection();\n return;\n }\n }\n\n // Ctrl + U (view-source)\n if (blockedSet.has('Ctrl+U') && e.ctrlKey && key === 'u') {\n e.preventDefault();\n triggerDetection();\n return;\n }\n\n // Ctrl + S (save-page — block silently, no detection)\n if (blockedSet.has('Ctrl+S') && e.ctrlKey && key === 's') {\n e.preventDefault();\n }\n };\n\n const handleContextMenu = (e: MouseEvent) => {\n if (disableRightClick) e.preventDefault();\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('contextmenu', handleContextMenu);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('contextmenu', handleContextMenu);\n };\n }, [blockedKeys, disableRightClick, triggerDetection]);\n\n // ── Text-selection guard ───────────────────────────────────────────────────\n\n useEffect(() => {\n const el = document.body;\n if (disableSelection) {\n el.style.userSelect = 'none';\n // Cast needed for older TypeScript DOM typings that don't include webkit prefix\n (el.style as CSSStyleDeclaration & { webkitUserSelect: string }).webkitUserSelect = 'none';\n }\n return () => {\n el.style.userSelect = '';\n (el.style as CSSStyleDeclaration & { webkitUserSelect: string }).webkitUserSelect = '';\n };\n }, [disableSelection]);\n\n // ── Detection: resize listener ─────────────────────────────────────────────\n\n useEffect(() => {\n const checkDimensions = (): boolean => {\n if (isMobileDevice()) return false;\n const dpr = window.devicePixelRatio || 1;\n\n /*\n * Thresholds are intentionally conservative to minimise false positives\n * on split-screen, picture-in-picture, and high-DPI displays.\n *\n * Width: scrollbar (~15px) + window chrome (~35px) → floor at 50px\n * Height: browser UI (tabs, address bar) → floor at 120px\n *\n * Both are scaled by devicePixelRatio to handle display zoom correctly,\n * and shifted by the caller-supplied thresholdBuffer for custom shells.\n */\n const widthThreshold = Math.max(50, 160 / dpr) + thresholdBuffer;\n const heightThreshold = Math.max(120, 250 / dpr) + thresholdBuffer;\n\n return (\n window.outerWidth - window.innerWidth > widthThreshold ||\n window.outerHeight - window.innerHeight > heightThreshold\n );\n };\n\n const handleResize = () => {\n if (checkDimensions()) triggerDetection();\n // NOTE: we intentionally do NOT call triggerClose here.\n // The polling interval is the authoritative \"close\" signal; reacting to\n // resize-only avoids a race where a momentary resize triggers a false close.\n };\n\n window.addEventListener('resize', handleResize);\n // Run immediately so we capture the state before the first poll tick.\n handleResize();\n\n return () => window.removeEventListener('resize', handleResize);\n }, [thresholdBuffer, triggerDetection]);\n\n // ── Detection: polling (console getter + dimension + debugger timing) ──────\n\n useEffect(() => {\n /*\n * Console-getter method (BLINK-FREE)\n * ─────────────────────────────────────\n * We attach a getter to a custom object's `toString` / `Symbol.toPrimitive`.\n * When the browser console is open it lazily evaluates these to render a\n * preview — triggering our getter — WITHOUT us ever calling console.log()\n * ourselves. This completely eliminates the log→clear blink.\n *\n * How it works:\n * - We override `console.log` temporarily with a version that intercepts\n * our sentinel object and detects getter invocation, then immediately\n * restores the original. The override exists for <1 ms per tick so it\n * is invisible to the app.\n * - The sentinel uses `Symbol.toPrimitive` (Chrome, Edge, Firefox all\n * invoke this when rendering objects in an open console).\n */\n let consoleGetterFired = false;\n\n const sentinel = {\n [Symbol.toPrimitive]() {\n consoleGetterFired = true;\n return 'devtools-probe';\n },\n toString() {\n consoleGetterFired = true;\n return 'devtools-probe';\n },\n };\n\n /*\n * Debugger-timing method\n * ──────────────────────\n * A `debugger` statement is essentially a no-op in normal execution, but\n * when DevTools is open with \"Pause on debugger statements\" active, it\n * introduces a measurable delay (>100 ms). We only run this in production\n * because it would halt execution for legitimate engineers during dev.\n */\n const checkDebuggerTiming = (): boolean => {\n if (isDevMode()) return false;\n const t0 = performance.now();\n // eslint-disable-next-line no-debugger\n debugger;\n return performance.now() - t0 > 100;\n };\n\n /*\n * Dimension method (inline per-tick)\n * ────────────────────────────────────\n * Kept as a local helper here to avoid the resize-effect dep chain.\n */\n const checkDimensions = (): boolean => {\n if (isMobileDevice()) return false;\n const dpr = window.devicePixelRatio || 1;\n return (\n window.outerWidth - window.innerWidth > Math.max(60, 80 / dpr) + thresholdBuffer ||\n window.outerHeight - window.innerHeight > Math.max(80, 150 / dpr) + thresholdBuffer\n );\n };\n\n const tick = () => {\n // Reset before each tick for a clean read.\n consoleGetterFired = false;\n\n /*\n * Momentarily patch console.log to pass our sentinel through.\n * The open console renderer will invoke toString/Symbol.toPrimitive\n * during its own lazy evaluation — our getter fires, we detect it.\n * The patch is restored synchronously so no other code sees it.\n */\n // eslint-disable-next-line no-console\n const _orig = console.log;\n try {\n // eslint-disable-next-line no-console\n console.log = (...args: unknown[]) => {\n if (args[0] === sentinel) return; // swallow our own probe silently\n _orig.apply(console, args);\n };\n // eslint-disable-next-line no-console\n console.log(sentinel);\n } finally {\n // eslint-disable-next-line no-console\n console.log = _orig; // restore immediately — invisible to the app\n }\n\n /*\n * Defer the verdict slightly so the browser has time to evaluate the\n * getter asynchronously (Chrome defers console object rendering).\n */\n setTimeout(() => {\n const detected =\n consoleGetterFired ||\n checkDimensions() ||\n checkDebuggerTiming();\n\n if (detected) {\n triggerDetection();\n printConsoleBranding();\n } else {\n triggerClose();\n }\n }, 50);\n };\n\n const intervalId = setInterval(tick, pollInterval);\n // Run one tick immediately so there is no blind window on mount.\n tick();\n\n return () => clearInterval(intervalId);\n }, [pollInterval, thresholdBuffer, triggerDetection, triggerClose, printConsoleBranding]);\n\n return isOpen;\n}","import React, { useEffect, useRef, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport '../styles/index.css';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants (defined outside the component so they are stable references)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SCAN_STEPS = [\n { id: 'step-1', label: 'Tracing unauthorized debugger session...' },\n { id: 'step-2', label: 'Analyzing reverse-engineering attempt...' },\n { id: 'step-3', label: 'Access monitored — preparing security report...' },\n] as const;\n\n/** Total duration of the scan phase in ms (SCAN_STEPS.length × STEP_INTERVAL). */\nconst STEP_INTERVAL_MS = 1000;\n\nconst MATRIX_CHARS =\n 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン' +\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst MATRIX_FONT_SIZE = 15;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MatrixBackground\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Full-screen canvas rain effect.\n */\nconst MatrixBackground: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const chars = MATRIX_CHARS.split('');\n let rainDrops: number[] = [];\n let animId: number;\n let mounted = true;\n\n const initDrops = () => {\n const cols = Math.floor(canvas.width / MATRIX_FONT_SIZE);\n rainDrops = Array.from({ length: cols }, () =>\n Math.floor(Math.random() * (canvas.height / MATRIX_FONT_SIZE)),\n );\n };\n\n const resize = () => {\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n initDrops();\n };\n\n resize();\n\n const draw = () => {\n if (!mounted) return;\n\n // Fade trail\n ctx.fillStyle = 'rgba(5, 7, 10, 0.055)';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n ctx.font = `${MATRIX_FONT_SIZE}px monospace`;\n\n for (let i = 0; i < rainDrops.length; i++) {\n const ch = chars[Math.floor(Math.random() * chars.length)];\n const x = i * MATRIX_FONT_SIZE;\n const y = rainDrops[i] * MATRIX_FONT_SIZE;\n\n // Colour: rare red spark → occasional cyan → default green\n const r = Math.random();\n if (r > 0.985) {\n ctx.fillStyle = '#f43f5e';\n } else if (r > 0.96) {\n ctx.fillStyle = '#22d3ee';\n } else {\n ctx.fillStyle = '#10b981';\n }\n\n ctx.fillText(ch, x, y);\n\n // Reset column when it drops off screen\n if (y > canvas.height && Math.random() > 0.975) {\n rainDrops[i] = 0;\n }\n rainDrops[i]++;\n }\n\n animId = requestAnimationFrame(draw);\n };\n\n // Use rAF instead of setInterval for buttery-smooth rendering\n animId = requestAnimationFrame(draw);\n\n window.addEventListener('resize', resize);\n return () => {\n mounted = false;\n cancelAnimationFrame(animId);\n window.removeEventListener('resize', resize);\n };\n }, []);\n\n return (\n <canvas\n ref={canvasRef}\n aria-hidden=\"true\"\n className=\"dtg-canvas\"\n />\n );\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Scanline overlay\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ScanlineOverlay: React.FC = () => (\n <div\n aria-hidden=\"true\"\n className=\"dtg-scanlines\"\n style={{\n backgroundImage: [\n 'repeating-linear-gradient(0deg, transparent, transparent 3px, rgba(0,0,0,0.18) 3px, rgba(0,0,0,0.18) 4px)',\n 'repeating-linear-gradient(90deg, rgba(255,0,0,0.025), rgba(0,255,0,0.015), rgba(0,0,255,0.025))',\n ].join(', '),\n }}\n />\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Glowing top / bottom border lines\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NeonEdge: React.FC<{ position: 'top' | 'bottom' }> = ({ position }) => (\n <div\n aria-hidden=\"true\"\n className={`dtg-neon-edge dtg-neon-edge-${position}`}\n />\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Animated status dot\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst PulseDot: React.FC<{ color?: string }> = ({ color = '#f43f5e' }) => (\n <span className=\"dtg-pulse-dot\" aria-hidden=\"true\">\n <span\n className=\"dtg-pulse-dot-ping\"\n style={{ backgroundColor: color }}\n />\n <span\n className=\"dtg-pulse-dot-inner\"\n style={{ backgroundColor: color }}\n />\n </span>\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Icon SVGs\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst IconGithub: React.FC<{ className?: string }> = ({ className }) => (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483\n 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466\n -.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832\n .092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688\n -.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844\n c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651\n .64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855\n 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482C19.138 20.197 22 16.44 22 12.017\n 22 6.484 17.522 2 12 2z\"\n />\n </svg>\n);\n\nconst IconLinkedin: React.FC<{ className?: string }> = ({ className }) => (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M19 0H5C2.239 0 0 2.239 0 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5V5c0-2.761-2.238-5-5-5zM8 19H5V8h3v11zM6.5 6.732c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zM20 19h-3v-5.604c0-3.368-4-3.113-4 0V19h-3V8h3v1.765c1.396-2.586 7-2.777 7 2.476V19z\" />\n </svg>\n);\n\nconst IconGlobe: React.FC<{ className?: string }> = ({ className }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 010 20M12 2a14.5 14.5 0 000 20M2 12h20\" />\n </svg>\n);\n\nconst IconShield: React.FC<{ className?: string }> = ({ className }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 2L4 6v6c0 5.25 3.5 10.15 8 11 4.5-.85 8-5.75 8-11V6l-8-4z\"\n />\n </svg>\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Creator link card\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface CreatorCardProps {\n href: string;\n icon: React.ReactNode;\n label: string;\n sub: string;\n accentColor: string;\n}\n\nconst CreatorCard: React.FC<CreatorCardProps> = ({ href, icon, label, sub, accentColor }) => (\n <motion.a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n whileHover={{ y: -2, scale: 1.02 }}\n whileTap={{ scale: 0.97 }}\n transition={{ type: 'spring', stiffness: 400, damping: 20 }}\n className=\"dtg-creator-card\"\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.borderColor = `${accentColor}55`;\n (e.currentTarget as HTMLAnchorElement).style.background = `${accentColor}0d`;\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.borderColor = 'rgba(148,163,184,0.12)';\n (e.currentTarget as HTMLAnchorElement).style.background = 'rgba(15,20,30,0.7)';\n }}\n >\n <span\n className=\"dtg-creator-icon\"\n style={{ background: `${accentColor}18`, color: accentColor }}\n >\n {icon}\n </span>\n <span className=\"dtg-creator-label\">{label}</span>\n <span className=\"dtg-creator-sub\">{sub}</span>\n </motion.a>\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Scan phase\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ScanPhase: React.FC<{ step: number }> = ({ step }) => {\n const progress = Math.min(((step + 1) / SCAN_STEPS.length) * 100, 100);\n\n return (\n <motion.div\n key=\"scan\"\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -12 }}\n transition={{ duration: 0.25 }}\n className=\"dtg-scan-container\"\n >\n {/* Status header */}\n <div className=\"dtg-flex-row\">\n <PulseDot />\n <span className=\"dtg-scan-title\">\n Security scan running\n </span>\n </div>\n\n {/* Step list */}\n <ol className=\"dtg-steps-list\" aria-live=\"polite\" aria-label=\"Scan progress\">\n {SCAN_STEPS.map((s, idx) => {\n const done = idx < step;\n const active = idx === step;\n const pending = idx > step;\n\n return (\n <motion.li\n key={s.id}\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: pending ? 0.3 : 1, x: 0 }}\n transition={{ duration: 0.3, delay: active ? 0.05 : 0 }}\n className=\"dtg-step-item\"\n >\n {/* Status indicator */}\n <span className=\"dtg-step-indicator\">\n {done && (\n <svg style={{ width: '14px', height: '14px', color: '#34d399' }} fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n {active && <PulseDot color=\"#f43f5e\" />}\n {pending && <span className=\"dtg-step-dot\" />}\n </span>\n\n <span\n className={\n done\n ? 'dtg-text-done'\n : active\n ? 'dtg-text-active'\n : 'dtg-text-pending'\n }\n >\n {s.label}\n </span>\n </motion.li>\n );\n })}\n </ol>\n\n {/* Progress bar */}\n <div\n role=\"progressbar\"\n aria-valuenow={Math.round(progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label=\"Scan progress\"\n className=\"dtg-progress-track\"\n >\n <motion.div\n initial={{ width: '0%' }}\n animate={{ width: `${progress}%` }}\n transition={{ duration: STEP_INTERVAL_MS / 1000, ease: 'easeInOut' }}\n className=\"dtg-progress-fill\"\n />\n </div>\n\n {/* Fake log stream */}\n <div\n aria-hidden=\"true\"\n className=\"dtg-log-stream\"\n >\n <div>> pid={'{'}0x{Math.floor(Math.random() * 0xffff).toString(16).padStart(4, '0')}{`'}`} signal=SIGINT</div>\n <div>> stack_trace captured at 0x{Math.floor(Math.random() * 0xffffff).toString(16)}</div>\n <div>> hash_check: {step >= 1 ? 'MISMATCH ✗' : 'pending...'}</div>\n <div>> exfil_guard: {step >= 2 ? 'BLOCKED ✗' : 'scanning...'}</div>\n </div>\n </motion.div>\n );\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Warning phase\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst WarningPhase: React.FC<{ onClose?: () => void }> = ({ onClose }) => (\n <motion.div\n key=\"warning\"\n initial={{ opacity: 0, scale: 0.97 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.35, type: 'spring', stiffness: 260, damping: 22 }}\n className=\"dtg-warning-container\"\n >\n {/* Shield icon */}\n <motion.div\n initial={{ scale: 0.6, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ delay: 0.1, type: 'spring', stiffness: 300, damping: 18 }}\n className=\"dtg-shield-wrapper\"\n >\n <IconShield className=\"dtg-shield-icon\" />\n </motion.div>\n\n {/* Heading */}\n <div className=\"dtg-flex-row\" style={{ flexDirection: 'column', gap: '10px' }}>\n <h2 className=\"dtg-warning-title\">\n Developer Tools Detected\n </h2>\n {/* Decorative rule */}\n <div className=\"dtg-divider\">\n <div className=\"dtg-divider-line\" />\n <span className=\"dtg-divider-text\">alert</span>\n <div className=\"dtg-divider-line-rev\" />\n </div>\n </div>\n\n {/* Message */}\n <p className=\"dtg-description\">\n This platform is protected intellectual property. Reverse engineering or\n code extraction is monitored. If you're curious about what was built here,\n reach out directly.\n </p>\n\n {/* Creator links */}\n <div className=\"dtg-creator-grid\">\n <CreatorCard\n href=\"https://github.com/Ali-Arshad-110\"\n icon={<IconGithub className=\"w-4 h-4\" />}\n label=\"GitHub\"\n sub=\"My Work\"\n accentColor=\"#818cf8\"\n />\n <CreatorCard\n href=\"https://www.linkedin.com/in/aliarshad110\"\n icon={<IconLinkedin className=\"w-4 h-4\" />}\n label=\"LinkedIn\"\n sub=\"Connect\"\n accentColor=\"#38bdf8\"\n />\n <CreatorCard\n href=\"https://github.com/Ali-Arshad-110\"\n icon={<IconGlobe className=\"w-4 h-4\" />}\n label=\"Portfolio\"\n sub=\"About me\"\n accentColor=\"#34d399\"\n />\n </div>\n\n {/* Close button */}\n {onClose && (\n <motion.button\n onClick={onClose}\n whileHover={{ scale: 1.03 }}\n whileTap={{ scale: 0.97 }}\n className=\"dtg-close-button\"\n >\n Close & return to platform\n </motion.button>\n )}\n\n {/* Footer */}\n <div className=\"dtg-footer\">\n <span className=\"dtg-uppercase-track\">Secured · SSL/TLS</span>\n <span className=\"dtg-uppercase-track\">Copyright © {new Date().getFullYear()}</span>\n </div>\n </motion.div>\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Main export\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DevToolsWarningOverlayProps {\n /** Optional handler called when the user dismisses the overlay. */\n onClose?: () => void;\n}\n\n/**\n * DevToolsWarningOverlay\n *\n * Full-screen security overlay shown when DevTools are detected.\n * Runs a 3-step animated scan sequence before revealing the warning card.\n */\nexport const DevToolsWarningOverlay: React.FC<DevToolsWarningOverlayProps> = ({ onClose }) => {\n const [scanStep, setScanStep] = useState(0);\n const [phase, setPhase] = useState<'scan' | 'warning'>('scan');\n\n useEffect(() => {\n if (phase !== 'scan') return;\n\n if (scanStep < SCAN_STEPS.length - 1) {\n const t = setTimeout(() => setScanStep((s) => s + 1), STEP_INTERVAL_MS);\n return () => clearTimeout(t);\n } else {\n // All steps revealed — wait one more interval then flip to warning\n const t = setTimeout(() => setPhase('warning'), STEP_INTERVAL_MS);\n return () => clearTimeout(t);\n }\n }, [scanStep, phase]);\n\n return (\n <div\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label=\"Security alert: developer tools detected\"\n className=\"dtg-overlay\"\n >\n {/* Ambient background effects */}\n <MatrixBackground />\n <ScanlineOverlay />\n\n {/* Soft radial vignette centred behind the card */}\n <div aria-hidden=\"true\" className=\"dtg-vignette\" />\n\n {/* Card */}\n <motion.div\n initial={{ opacity: 0, y: 16, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n transition={{ duration: 0.4, type: 'spring', stiffness: 240, damping: 26 }}\n className=\"dtg-card\"\n >\n {/* Neon top / bottom edges */}\n <NeonEdge position=\"top\" />\n <NeonEdge position=\"bottom\" />\n\n {/* Inner padding */}\n <div className=\"dtg-card-padding\">\n <AnimatePresence mode=\"wait\">\n {phase === 'scan' ? (\n <ScanPhase key=\"scan\" step={scanStep} />\n ) : (\n <WarningPhase key=\"warning\" onClose={onClose} />\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n </div>\n );\n};\n\nexport default DevToolsWarningOverlay;\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".dtg-overlay {\\n position: fixed;\\n inset: 0;\\n z-index: 99999;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n user-select: none;\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n background: rgba(3, 5, 8, 0.93);\\n backdrop-filter: blur(6px);\\n}\\n.dtg-canvas {\\n position: absolute;\\n inset: 0;\\n width: 100%;\\n height: 100%;\\n pointer-events: none;\\n opacity: 0.18;\\n}\\n.dtg-scanlines {\\n position: absolute;\\n inset: 0;\\n pointer-events: none;\\n}\\n.dtg-vignette {\\n position: absolute;\\n inset: 0;\\n pointer-events: none;\\n background:\\n radial-gradient(\\n ellipse 60% 55% at 50% 50%,\\n rgba(190, 18, 60, 0.07) 0%,\\n transparent 70%);\\n}\\n.dtg-card {\\n position: relative;\\n width: 100%;\\n max-width: 512px;\\n margin-left: 16px;\\n margin-right: 16px;\\n border-radius: 12px;\\n overflow: hidden;\\n background: rgba(8, 12, 18, 0.92);\\n border: 1px solid rgba(244, 63, 94, 0.2);\\n box-shadow: 0 0 0 1px rgba(244, 63, 94, 0.05), 0 32px 64px rgba(0, 0, 0, 0.6);\\n}\\n.dtg-card-padding {\\n padding: 32px;\\n}\\n.dtg-neon-edge {\\n position: absolute;\\n left: 0;\\n right: 0;\\n height: 1px;\\n background:\\n linear-gradient(\\n 90deg,\\n transparent 0%,\\n #f43f5e 30%,\\n #f43f5e 70%,\\n transparent 100%);\\n box-shadow: 0 0 6px 1px rgba(244, 63, 94, 0.6);\\n}\\n.dtg-neon-edge-top {\\n top: 0;\\n}\\n.dtg-neon-edge-bottom {\\n bottom: 0;\\n}\\n.dtg-pulse-dot {\\n position: relative;\\n display: flex;\\n height: 10px;\\n width: 10px;\\n flex-shrink: 0;\\n}\\n.dtg-pulse-dot-ping {\\n position: absolute;\\n display: inline-flex;\\n height: 100%;\\n width: 100%;\\n border-radius: 9999px;\\n opacity: 0.6;\\n animation: dtg-ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\\n}\\n.dtg-pulse-dot-inner {\\n position: relative;\\n display: inline-flex;\\n border-radius: 9999px;\\n height: 10px;\\n width: 10px;\\n}\\n@keyframes dtg-ping {\\n 75%, 100% {\\n transform: scale(2);\\n opacity: 0;\\n }\\n}\\n.dtg-creator-grid {\\n display: grid;\\n grid-template-columns: repeat(3, minmax(0, 1fr));\\n gap: 12px;\\n padding-top: 4px;\\n}\\n.dtg-creator-card {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: 6px;\\n padding: 16px 8px;\\n border-radius: 8px;\\n border: 1px solid rgba(148, 163, 184, 0.12);\\n background: rgba(15, 20, 30, 0.7);\\n text-decoration: none;\\n transition: all 0.2s ease-in-out;\\n}\\n.dtg-creator-icon {\\n width: 36px;\\n height: 36px;\\n border-radius: 9999px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n margin-bottom: 2px;\\n transition: background-color 0.2s, color 0.2s;\\n}\\n.dtg-creator-label {\\n font-size: 13px;\\n font-weight: 600;\\n color: #e2e8f0;\\n}\\n.dtg-creator-sub {\\n font-size: 10px;\\n color: #64748b;\\n letter-spacing: 0.025em;\\n}\\n.dtg-scan-container {\\n display: flex;\\n flex-direction: column;\\n gap: 20px;\\n}\\n.dtg-flex-row {\\n display: flex;\\n align-items: center;\\n gap: 10px;\\n}\\n.dtg-scan-title {\\n font-size: 12px;\\n font-weight: 600;\\n letter-spacing: 0.2em;\\n text-transform: uppercase;\\n color: #fb7185;\\n}\\n.dtg-steps-list {\\n display: flex;\\n flex-direction: column;\\n gap: 10px;\\n margin: 0;\\n padding: 0;\\n list-style: none;\\n}\\n.dtg-step-item {\\n display: flex;\\n align-items: start;\\n gap: 10px;\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n monospace;\\n font-size: 14px;\\n}\\n.dtg-step-indicator {\\n margin-top: 2px;\\n width: 16px;\\n flex-shrink: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n.dtg-step-dot {\\n width: 6px;\\n height: 6px;\\n border-radius: 9999px;\\n background-color: #334155;\\n display: inline-block;\\n}\\n.dtg-text-done {\\n color: #64748b;\\n text-decoration: line-through;\\n text-decoration-color: #475569;\\n}\\n.dtg-text-active {\\n color: #fda4af;\\n font-weight: 500;\\n}\\n.dtg-text-pending {\\n color: #475569;\\n}\\n.dtg-progress-track {\\n width: 100%;\\n height: 3px;\\n border-radius: 9999px;\\n overflow: hidden;\\n background: rgba(255, 255, 255, 0.06);\\n}\\n.dtg-progress-fill {\\n height: 100%;\\n border-radius: 9999px;\\n background:\\n linear-gradient(\\n 90deg,\\n #be123c,\\n #f43f5e,\\n #fb7185);\\n}\\n.dtg-log-stream {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n monospace;\\n font-size: 10px;\\n color: #065f46;\\n line-height: 1.625;\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n opacity: 0.6;\\n user-select: none;\\n}\\n.dtg-warning-container {\\n text-align: center;\\n display: flex;\\n flex-direction: column;\\n gap: 24px;\\n}\\n.dtg-shield-wrapper {\\n display: inline-flex;\\n padding: 16px;\\n border-radius: 9999px;\\n border: 1px solid rgba(244, 63, 94, 0.3);\\n background: rgba(190, 18, 60, 0.12);\\n box-shadow: 0 0 24px rgba(244, 63, 94, 0.18);\\n margin: 0 auto;\\n}\\n.dtg-shield-icon {\\n width: 40px;\\n height: 40px;\\n color: #f43f5e;\\n}\\n.dtg-warning-title {\\n font-size: 20px;\\n font-weight: 700;\\n letter-spacing: 0.15em;\\n text-transform: uppercase;\\n color: #f43f5e;\\n text-shadow: 0 0 20px rgba(244, 63, 94, 0.35);\\n margin: 0;\\n}\\n.dtg-divider {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 12px;\\n margin: 0 auto;\\n width: 100%;\\n max-width: 320px;\\n}\\n.dtg-divider-line {\\n flex: 1 1 0%;\\n height: 1px;\\n background:\\n linear-gradient(\\n 90deg,\\n transparent,\\n rgba(244, 63, 94, 0.4));\\n}\\n.dtg-divider-line-rev {\\n flex: 1 1 0%;\\n height: 1px;\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(244, 63, 94, 0.4),\\n transparent);\\n}\\n.dtg-divider-text {\\n font-size: 9px;\\n letter-spacing: 0.25em;\\n text-transform: uppercase;\\n color: rgba(190, 18, 60, 0.7);\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n monospace;\\n}\\n.dtg-description {\\n color: #94a3b8;\\n font-size: 14px;\\n line-height: 1.625;\\n max-width: 384px;\\n margin: 0 auto;\\n}\\n.dtg-close-button {\\n margin-top: 4px;\\n padding: 8px 28px;\\n border-radius: 4px;\\n font-size: 12px;\\n font-weight: 600;\\n letter-spacing: 0.15em;\\n text-transform: uppercase;\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n monospace;\\n transition: all 0.2s ease-in-out;\\n cursor: pointer;\\n border: 1px solid rgba(244, 63, 94, 0.25);\\n color: #fda4af;\\n background: transparent;\\n align-self: center;\\n}\\n.dtg-close-button:hover {\\n background: rgba(244, 63, 94, 0.08);\\n border-color: rgba(244, 63, 94, 0.5);\\n}\\n.dtg-footer {\\n padding-top: 16px;\\n border-top: 1px solid rgba(255, 255, 255, 0.05);\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n monospace;\\n font-size: 9px;\\n color: rgba(148, 163, 184, 0.3);\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n}\\n.dtg-uppercase-track {\\n letter-spacing: 0.1em;\\n text-transform: uppercase;\\n}\\n\")","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { useDevToolsDetector } from \"../hooks/useDevToolsDetector\";\r\nimport DevToolsWarningOverlay from \"../components/DevToolsWarningOverlay\";\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n overlay?: boolean;\r\n}\r\n\r\nexport const DevToolsProtection = ({\r\n children,\r\n overlay = true,\r\n}: Props) => {\r\n const isOpen = useDevToolsDetector();\r\n\r\n return (\r\n <>\r\n {children}\r\n\r\n {overlay && isOpen && (\r\n <DevToolsWarningOverlay />\r\n )}\r\n </>\r\n );\r\n};"],"mappings":"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","names":["useEffect","useRef","useState","useRef","useEffect","useState","jsx","jsxs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "devtools-guardian",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"main": "./dist/index.js",
|
|
5
|
+
"module": "./dist/index.mjs",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"dev": "vite"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [],
|
|
23
|
+
"author": "",
|
|
24
|
+
"license": "ISC",
|
|
25
|
+
"description": "",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"framer-motion": "^12.39.0",
|
|
28
|
+
"react": "^19.2.6"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/react": "^19.2.15",
|
|
32
|
+
"@types/react-dom": "^19.2.3",
|
|
33
|
+
"@vitejs/plugin-react": "^4.7.0",
|
|
34
|
+
"react-dom": "^19.2.6",
|
|
35
|
+
"tsup": "^8.5.1",
|
|
36
|
+
"typescript": "^6.0.3",
|
|
37
|
+
"vite": "^6.4.2"
|
|
38
|
+
}
|
|
39
|
+
}
|