{"_id":"@4884org/jumble","_rev":"5-92a4b3b51f3d7268a59794784dad5757","name":"@4884org/jumble","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@4884org/jumble","version":"0.1.0","keywords":["bot-detection","content-protection","web-scraping-protection","anti-bot","text-scrambling","media-obfuscation","web-components","stencil","react","vue","angular","svelte","universal","seo-friendly","multi-language","typescript","security","automation-prevention"],"author":{"name":"Aaron Kanzer"},"license":"MIT","_id":"@4884org/jumble@0.1.0","maintainers":[{"name":"4884org","email":"aaronkanzer@gmail.com"}],"homepage":"https://github.com/4884org/jumble","bugs":{"url":"https://github.com/4884org/jumble/issues"},"dist":{"shasum":"1db2a1f1fa081b952500fdc40b97ef781cddbed5","tarball":"https://registry.npmjs.org/@4884org/jumble/-/jumble-0.1.0.tgz","fileCount":75,"integrity":"sha512-M3gAvnHVyELc6efOWJIY1XzvW9JAhvuXNx/PC83GMXzSXpXai/1b75y64Bnkt+qDkxvt/R2Fz2xGlcw98VzV7Q==","signatures":[{"sig":"MEQCIA1DRP3t9rgBXYIH7Gr1Ie7zjyWgk6RouDR/FTuu5jQaAiB6JaJ6qj3ZZ5m0btB7PJxfdXio2i8m1oq4df19Kvye0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3116393},"main":"dist/index.cjs.js","types":"dist/types/index.d.ts","unpkg":"dist/jumble/jumble.esm.js","module":"dist/index.js","exports":{".":{"import":"./dist/jumble/jumble.esm.js","require":"./dist/cjs/jumble.cjs.js"},"./loader":{"types":"./loader/index.d.ts","import":"./loader/index.js","require":"./loader/index.cjs.js"},"./jumble-head":{"types":"./dist/components/jumble-head.d.ts","import":"./dist/components/jumble-head.js"}},"gitHead":"89bf9c30b673b797d3ea32b63fbcf31598798488","scripts":{"lint":"stencil test --spec --silent","test":"stencil test --spec","build":"stencil build && node scripts/fix-paths.js","start":"stencil build --dev --watch --serve","format":"prettier --write src/**/*.{ts,tsx}","prepare":"husky","generate":"stencil generate","test:all":"npm run test && npm run test:e2e","test:e2e":"stencil test --e2e","test:build":"node scripts/test-build.js","test:watch":"stencil test --spec --watchAll","test:coverage":"stencil test --spec --coverage","prepublishOnly":"npm run build && npm run test:all","publish:manual":"npm publish","test:e2e:headless":"stencil test --e2e --headless"},"_npmUser":{"name":"4884org","actor":{"name":"4884org","type":"user","email":"aaronkanzer@gmail.com"},"email":"aaronkanzer@gmail.com"},"collection":"dist/collection/collection-manifest.json","repository":{"url":"git+https://github.com/4884org/jumble.git","type":"git"},"_npmVersion":"11.3.0","description":"🛡️ Advanced bot detection & content protection component. Automatically detects bots and scrambles text content while obfuscating media to protect websites. Universal implementation works with React, Vue, Angular, Svelte.","directories":{},"lint-staged":{"src/**/*.{ts,tsx,css,json,md}":["prettier --write"]},"_nodeVersion":"24.2.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"collection:main":"dist/collection/index.js","devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","jest-cli":"^29.7.0","prettier":"^3.4.2","puppeteer":"^24.3.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.13.5","lint-staged":"^16.1.2","@stencil/core":"^4.27.1"},"_npmOperationalInternal":{"tmp":"tmp/jumble_0.1.0_1750645814934_0.6066661328984226","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@4884org/jumble","version":"0.1.1","keywords":["bot-detection","content-protection","web-scraping-protection","anti-bot","text-scrambling","media-obfuscation","web-components","stencil","react","vue","angular","svelte","universal","seo-friendly","multi-language","typescript","security","automation-prevention"],"author":{"name":"Aaron Kanzer"},"license":"MIT","_id":"@4884org/jumble@0.1.1","maintainers":[{"name":"4884org","email":"aaronkanzer@gmail.com"}],"homepage":"https://github.com/4884org/jumble","bugs":{"url":"https://github.com/4884org/jumble/issues"},"dist":{"shasum":"a94806bd7b765f0023e06a74bade30c377576255","tarball":"https://registry.npmjs.org/@4884org/jumble/-/jumble-0.1.1.tgz","fileCount":75,"integrity":"sha512-XS+g0Jpkx/ev8iLc/3uW+6t3QaVUS9GaERr7k6IeGf4Vgm9v+q334lx11aop/2tLNiQZMwkL1OAxdcwWzNxodw==","signatures":[{"sig":"MEUCIDnPyw28A35AHbGXGh/5zpOjTu/UuW+kn50cg+DpxzPjAiEAiS3vDgOe34FKaQvJo5rh2h6+kL7mrQ9R4OA/wYIS8Vs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3118009},"main":"dist/index.cjs.js","types":"dist/types/index.d.ts","unpkg":"dist/jumble/jumble.esm.js","module":"dist/index.js","exports":{".":{"import":"./dist/jumble/jumble.esm.js","require":"./dist/cjs/jumble.cjs.js"},"./loader":{"types":"./loader/index.d.ts","import":"./loader/index.js","require":"./loader/index.cjs.js"},"./jumble-head":{"types":"./dist/components/jumble-head.d.ts","import":"./dist/components/jumble-head.js"}},"gitHead":"ac7ab44a5d73e0db53971cf3460404e671dcad49","scripts":{"lint":"stencil test --spec --silent","test":"stencil test --spec","build":"stencil build && node scripts/fix-paths.js","start":"stencil build --dev --watch --serve","format":"prettier --write src/**/*.{ts,tsx}","prepare":"husky","generate":"stencil generate","test:all":"npm run test && npm run test:e2e","test:e2e":"stencil test --e2e","test:build":"node scripts/test-build.js","test:watch":"stencil test --spec --watchAll","test:coverage":"stencil test --spec --coverage","prepublishOnly":"npm run build && npm run test:all","publish:manual":"npm publish","test:e2e:headless":"stencil test --e2e --headless"},"_npmUser":{"name":"4884org","actor":{"name":"4884org","type":"user","email":"aaronkanzer@gmail.com"},"email":"aaronkanzer@gmail.com"},"collection":"dist/collection/collection-manifest.json","repository":{"url":"git+https://github.com/4884org/jumble.git","type":"git"},"_npmVersion":"11.3.0","description":"🛡️ Advanced bot detection & content protection component with 100ms optimized timing. Automatically detects bots and scrambles text content while obfuscating media to protect websites. Universal implementation works with React, Vue, Angular, Svelte.","directories":{},"lint-staged":{"src/**/*.{ts,tsx,css,json,md}":["prettier --write"]},"_nodeVersion":"24.2.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"collection:main":"dist/collection/index.js","devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","jest-cli":"^29.7.0","prettier":"^3.4.2","puppeteer":"^24.3.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.13.5","lint-staged":"^16.1.2","@stencil/core":"^4.27.1"},"_npmOperationalInternal":{"tmp":"tmp/jumble_0.1.1_1750812105097_0.5242347167207511","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@4884org/jumble","version":"0.1.2","keywords":["bot-detection","content-protection","web-scraping-protection","anti-bot","text-scrambling","media-obfuscation","web-components","stencil","react","vue","angular","svelte","universal","seo-friendly","multi-language","typescript","security","automation-prevention"],"author":{"name":"Aaron Kanzer"},"license":"MIT","_id":"@4884org/jumble@0.1.2","maintainers":[{"name":"4884org","email":"aaronkanzer@gmail.com"}],"homepage":"https://github.com/4884org/jumble","bugs":{"url":"https://github.com/4884org/jumble/issues"},"dist":{"shasum":"19357bbd931d5d32aa5df64bc44bde91b813514a","tarball":"https://registry.npmjs.org/@4884org/jumble/-/jumble-0.1.2.tgz","fileCount":75,"integrity":"sha512-AKhr/gFs2qKKIedXwwwx3133C+sMMZmV0ErHP7tPfECj6xvY1eFzz6BqLw1ALbhiR6anic6KyiePdd2LLkmMaw==","signatures":[{"sig":"MEQCIAzlQjmSdQ/dcwaykt+JvRe7lUNxVeIMWksrOFv/8fdxAiAoxMies9peNxvO8gZTtGIw8RX8CVsVICX8RtwRS9r3bw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3117759},"main":"dist/index.cjs.js","types":"dist/types/index.d.ts","unpkg":"dist/jumble/jumble.esm.js","module":"dist/index.js","exports":{".":{"import":"./dist/jumble/jumble.esm.js","require":"./dist/cjs/jumble.cjs.js"},"./loader":{"types":"./loader/index.d.ts","import":"./loader/index.js","require":"./loader/index.cjs.js"},"./jumble-head":{"types":"./dist/components/jumble-head.d.ts","import":"./dist/components/jumble-head.js"}},"gitHead":"aa471272c509a28aac913e06c6b70025fafb99f8","scripts":{"lint":"stencil test --spec --silent","test":"stencil test --spec","build":"stencil build && node scripts/fix-paths.js","start":"stencil build --dev --watch --serve","format":"prettier --write src/**/*.{ts,tsx}","prepare":"husky","generate":"stencil generate","test:all":"npm run test && npm run test:e2e","test:e2e":"stencil test --e2e","test:build":"node scripts/test-build.js","test:watch":"stencil test --spec --watchAll","test:coverage":"stencil test --spec --coverage","prepublishOnly":"npm run build && npm run test:all","publish:manual":"npm publish","test:e2e:headless":"stencil test --e2e --headless"},"_npmUser":{"name":"4884org","actor":{"name":"4884org","type":"user","email":"aaronkanzer@gmail.com"},"email":"aaronkanzer@gmail.com"},"collection":"dist/collection/collection-manifest.json","repository":{"url":"git+https://github.com/4884org/jumble.git","type":"git"},"_npmVersion":"11.3.0","description":"🛡️ Advanced bot detection & content protection component with 100ms optimized timing. Automatically detects bots and scrambles text content while obfuscating media to protect websites. Universal implementation works with React, Vue, Angular, Svelte.","directories":{},"lint-staged":{"src/**/*.{ts,tsx,css,json,md}":["prettier --write"]},"_nodeVersion":"24.2.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"collection:main":"dist/collection/index.js","devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","jest-cli":"^29.7.0","prettier":"^3.4.2","puppeteer":"^24.3.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.13.5","lint-staged":"^16.1.2","@stencil/core":"^4.27.1"},"_npmOperationalInternal":{"tmp":"tmp/jumble_0.1.2_1750816319617_0.7450091275792343","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@4884org/jumble","version":"0.1.3","keywords":["bot-detection","content-protection","web-scraping-protection","anti-bot","text-scrambling","media-obfuscation","web-components","stencil","react","vue","angular","svelte","universal","seo-friendly","multi-language","typescript","security","automation-prevention"],"author":{"name":"Aaron Kanzer"},"license":"MIT","_id":"@4884org/jumble@0.1.3","maintainers":[{"name":"4884org","email":"aaronkanzer@gmail.com"}],"homepage":"https://github.com/4884org/jumble","bugs":{"url":"https://github.com/4884org/jumble/issues"},"dist":{"shasum":"75942ee780793a2fc61b7e1ab2a41a6db6261c1d","tarball":"https://registry.npmjs.org/@4884org/jumble/-/jumble-0.1.3.tgz","fileCount":75,"integrity":"sha512-OLRP4asvox79Xa4+UwqKRQ4DJq+P8mYDbXBC5EZx0hvM7LyMNaK4tEWJHjPa2+DcSr6nfRdIDnXx4+cBSCwmwA==","signatures":[{"sig":"MEYCIQDEm7DWfvDMSD8tsxpfXDll2EPnq5RtaFnSdwNzyk9a7QIhAMhxC549EkHiUwqBFo3oL6FszsiUbfL51WOprQP5BIIt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3117642},"main":"dist/index.cjs.js","types":"dist/types/index.d.ts","unpkg":"dist/jumble/jumble.esm.js","module":"dist/index.js","exports":{".":{"import":"./dist/jumble/jumble.esm.js","require":"./dist/cjs/jumble.cjs.js"},"./loader":{"types":"./loader/index.d.ts","import":"./loader/index.js","require":"./loader/index.cjs.js"},"./jumble-head":{"types":"./dist/components/jumble-head.d.ts","import":"./dist/components/jumble-head.js"}},"gitHead":"aa471272c509a28aac913e06c6b70025fafb99f8","scripts":{"lint":"stencil test --spec --silent","test":"stencil test --spec","build":"stencil build && node scripts/fix-paths.js","start":"stencil build --dev --watch --serve","format":"prettier --write src/**/*.{ts,tsx}","prepare":"husky","generate":"stencil generate","test:all":"npm run test && npm run test:e2e","test:e2e":"stencil test --e2e","test:build":"node scripts/test-build.js","test:watch":"stencil test --spec --watchAll","test:coverage":"stencil test --spec --coverage","prepublishOnly":"npm run build && npm run test:all","publish:manual":"npm publish","test:e2e:headless":"stencil test --e2e --headless"},"_npmUser":{"name":"4884org","actor":{"name":"4884org","type":"user","email":"aaronkanzer@gmail.com"},"email":"aaronkanzer@gmail.com"},"collection":"dist/collection/collection-manifest.json","repository":{"url":"git+https://github.com/4884org/jumble.git","type":"git"},"_npmVersion":"11.3.0","description":"🛡️ Advanced bot detection & content protection component with 100ms optimized timing. Automatically detects bots and scrambles text content while obfuscating media to protect websites. Universal implementation works with React, Vue, Angular, Svelte.","directories":{},"lint-staged":{"src/**/*.{ts,tsx,css,json,md}":["prettier --write"]},"_nodeVersion":"24.2.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"collection:main":"dist/collection/index.js","devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","jest-cli":"^29.7.0","prettier":"^3.4.2","puppeteer":"^24.3.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.13.5","lint-staged":"^16.1.2","@stencil/core":"^4.27.1"},"_npmOperationalInternal":{"tmp":"tmp/jumble_0.1.3_1750816608471_0.683190809033501","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@4884org/jumble","version":"0.1.4","description":"🛡️ Advanced bot detection & content protection component with 100ms optimized timing. Automatically detects bots and scrambles text content while obfuscating media to protect websites. Universal implementation works with React, Vue, Angular, Svelte.","author":{"name":"Aaron Kanzer"},"keywords":["bot-detection","content-protection","web-scraping-protection","anti-bot","text-scrambling","media-obfuscation","web-components","stencil","react","vue","angular","svelte","universal","seo-friendly","multi-language","typescript","security","automation-prevention"],"homepage":"https://github.com/4884org/jumble","bugs":{"url":"https://github.com/4884org/jumble/issues"},"main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/types/index.d.ts","collection":"dist/collection/collection-manifest.json","collection:main":"dist/collection/index.js","unpkg":"dist/jumble/jumble.esm.js","exports":{".":{"import":"./dist/jumble/jumble.esm.js","require":"./dist/cjs/jumble.cjs.js"},"./jumble-head":{"import":"./dist/components/jumble-head.js","types":"./dist/components/jumble-head.d.ts"},"./loader":{"import":"./loader/index.js","require":"./loader/index.cjs.js","types":"./loader/index.d.ts"}},"repository":{"type":"git","url":"git+https://github.com/4884org/jumble.git"},"scripts":{"build":"stencil build && node scripts/fix-paths.js","start":"stencil build --dev --watch --serve","test":"stencil test --spec","test:watch":"stencil test --spec --watchAll","test:coverage":"stencil test --spec --coverage","test:e2e":"stencil test --e2e","test:e2e:headless":"stencil test --e2e --headless","test:all":"npm run test && npm run test:e2e","test:build":"node scripts/test-build.js","generate":"stencil generate","lint":"stencil test --spec --silent","format":"prettier --write src/**/*.{ts,tsx}","prepublishOnly":"npm run build && npm run test:all","publish:manual":"npm publish","prepare":"husky"},"devDependencies":{"@stencil/core":"^4.27.1","@types/jest":"^29.5.14","@types/node":"^22.13.5","husky":"^9.1.7","jest":"^29.7.0","jest-cli":"^29.7.0","lint-staged":"^16.1.2","prettier":"^3.4.2","puppeteer":"^24.3.0","typescript":"^5.6.3"},"license":"MIT","publishConfig":{"access":"public"},"lint-staged":{"src/**/*.{ts,tsx,css,json,md}":["prettier --write"]},"_id":"@4884org/jumble@0.1.4","gitHead":"aa471272c509a28aac913e06c6b70025fafb99f8","_nodeVersion":"24.2.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-DyAtGlLp6SCOg6o6TxWqbTMXnoUuy+aAkY+5XFI2ou9SLlzvf4/k+hOv9bsiifj6CPWtNqZ9c0XW5VNGRpeaIw==","shasum":"3f7ae4b7258cfe8114fe5173724a6dcdb9f9f464","tarball":"https://registry.npmjs.org/@4884org/jumble/-/jumble-0.1.4.tgz","fileCount":75,"unpackedSize":3117707,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDuPlhmBJtGeCO67EDi0gJPn1Hkn5ORqj5FAVYryxC9QQIhAO8L5WQVeeOkb9BTGeyP+9wYGKmixo/8p1pB01K2Tfpn"}]},"_npmUser":{"name":"4884org","email":"aaronkanzer@gmail.com","actor":{"name":"4884org","email":"aaronkanzer@gmail.com","type":"user"}},"directories":{},"maintainers":[{"name":"4884org","email":"aaronkanzer@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jumble_0.1.4_1750816950498_0.9913144103000724"},"_hasShrinkwrap":false}},"time":{"created":"2025-06-23T02:30:14.836Z","modified":"2025-06-25T02:02:30.933Z","0.1.0":"2025-06-23T02:30:15.258Z","0.1.1":"2025-06-25T00:41:45.356Z","0.1.2":"2025-06-25T01:51:59.872Z","0.1.3":"2025-06-25T01:56:48.736Z","0.1.4":"2025-06-25T02:02:30.745Z"},"bugs":{"url":"https://github.com/4884org/jumble/issues"},"author":{"name":"Aaron Kanzer"},"license":"MIT","homepage":"https://github.com/4884org/jumble","keywords":["bot-detection","content-protection","web-scraping-protection","anti-bot","text-scrambling","media-obfuscation","web-components","stencil","react","vue","angular","svelte","universal","seo-friendly","multi-language","typescript","security","automation-prevention"],"repository":{"type":"git","url":"git+https://github.com/4884org/jumble.git"},"description":"🛡️ Advanced bot detection & content protection component with 100ms optimized timing. Automatically detects bots and scrambles text content while obfuscating media to protect websites. Universal implementation works with React, Vue, Angular, Svelte.","maintainers":[{"name":"4884org","email":"aaronkanzer@gmail.com"}],"readme":"<div align=\"center\">\n  <h1 style=\"font-size: 4rem; font-weight: bold; margin: 0; padding: 20px 0; letter-spacing: 3px;\">\n    🛡️ JUMBLE\n  </h1>\n  <h3 style=\"margin: 0; color: #666; font-weight: 300;\">\n    Advanced Bot Detection & Content Protection\n  </h3>\n</div>\n\n<div align=\"center\">\n\n[![npm version](https://img.shields.io/npm/v/@4884org/jumble?style=flat-square&logo=npm&logoColor=white)](https://npmjs.com/package/@4884org/jumble)\n[![npm downloads](https://img.shields.io/npm/dm/@4884org/jumble?style=flat-square&logo=npm&logoColor=white)](https://npmjs.com/package/@4884org/jumble)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=flat-square)](https://opensource.org/licenses/MIT)\n\n</div>\n\n---\n\n🛡️ **Advanced Bot Detection & Content Protection** 🤖\n\nAutomatically detects bots and scrapers using sophisticated heuristics, then scrambles text content and obfuscates media to protect your website while maintaining full accessibility for human users.\n\n## 🔍 **SEO-Safe Protection** ✅\n\n**Smart bot detection that protects your content from scrapers while allowing search engines to index your site properly:**\n\n- ✅ **Google, Bing, Yahoo** → See real content for indexing\n- ✅ **Facebook, Twitter, LinkedIn** → See real content for social previews  \n- ✅ **SEO tools** (SEMrush, Ahrefs) → See real content for analysis\n- ❌ **Scrapers & headless browsers** → See scrambled content\n- ❌ **AI training bots** → See scrambled content\n- ❌ **Content harvesters** → See obfuscated media\n\n**SEO protection is enabled by default** - no configuration needed!\n\n## 📦 Installation\n\n### NPM Installation\nInstall via npm for maximum flexibility and version control:\n\n```bash\nnpm install @4884org/jumble\n```\n\n### CDN Installation\nQuick setup via CDN for rapid prototyping:\n\n```html\n<script type=\"module\" src=\"https://unpkg.com/@4884org/jumble@latest/dist/jumble/jumble.esm.js\"></script>\n```\n\n## 🚀 Universal Usage Pattern (Works with Any Framework)\n\n**Add the loader script to `<head>`, `<jumble-head>` as the first element in `<body>`, and the critical CSS/class to `<html>`.**\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\" class=\"jumble-init\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Protected Content</title>\n  <!-- Critical: Hide content during bot detection (100ms) -->\n  <style>\n    html.jumble-init * {\n      visibility: hidden !important;\n    }\n  </style>\n  <!-- Jumble Web Component Loader -->\n  <script type=\"module\" src=\"https://unpkg.com/@4884org/jumble@latest/dist/jumble/jumble.esm.js\"></script>\n</head>\n<body>\n  <!-- Place jumble-head as the first element in body -->\n  <jumble-head></jumble-head>\n  <main>\n    <h1>Your content will be protected automatically</h1>\n    <p>This text will be scrambled for bots but readable for humans.</p>\n    <img src=\"image.jpg\" alt=\"This image will be hidden from bots\">\n    <video src=\"video.mp4\" controls></video>\n  </main>\n</body>\n</html>\n```\n\n## 🛠️ Framework Integration\n\n**This pattern works for React, Vue, Angular, Svelte, and static sites.**\n\n- Do **not** use `<jumble-head>` in any React/JSX/TSX/component file.\n- Do **not** add custom element type declarations for React/TypeScript.\n- Do **not** use `defineCustomElements()` in your app code unless you need advanced loader scenarios.\n- Just add the loader script and `<jumble-head>` to your main HTML file as above.\n\n**Your app content works as usual. Jumble protects it automatically.**\n\n## ⚙️ Component Attributes Reference\n\nThe `<jumble-head>` component accepts the following attributes for customization:\n\n| Attribute | Type | Default | Description |\n|-----------|------|---------|-------------|\n| allow-seo | boolean | true | Allow search engine bots to see real content for SEO. |\n| custom-allowlist | string[] | [] | Additional legitimate bot user agents to allow. |\n| custom-denylist | string[] | [] | Additional suspicious bot patterns to block. |\n\n## 📋 **Component Attributes Reference**\n\nThe `<jumble-head>` component accepts the following attributes for customization:\n\n| Attribute | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `allow-seo` | `boolean` | `true` | Controls SEO protection mode. When `true`, legitimate search engines see real content. When `false`, ALL bots see scrambled content. |\n| `custom-allowlist` | `string[]` | `[]` | JSON array of additional bot patterns to allow (added to default search engines). Case-insensitive matching. |\n| `custom-denylist` | `string[]` | `[]` | JSON array of additional bot patterns to block (added to default malicious patterns). Case-insensitive matching. |\n\n### **Basic Usage Examples**\n\n```html\n<!-- ✅ Recommended: SEO-safe (default behavior) -->\n<jumble-head></jumble-head>\n\n<!-- 🔒 Maximum protection: Block ALL bots (including search engines) -->\n<jumble-head allow-seo=\"false\"></jumble-head>\n\n<!-- 🎯 Custom allowlist: Allow your partner's bot -->\n<jumble-head custom-allowlist='[\"mypartnerbot\", \"trustedapi\"]'></jumble-head>\n\n<!-- 🚫 Custom denylist: Block specific scrapers -->\n<jumble-head custom-denylist='[\"badbot\", \"evilscraper\", \"harvester\"]'></jumble-head>\n\n<!-- ⚡ Full configuration: Combined settings -->\n<jumble-head \n  allow-seo=\"true\"\n  custom-allowlist='[\"partnerbot\", \"apiservice\"]'\n  custom-denylist='[\"maliciousbot\", \"scraper123\"]'>\n</jumble-head>\n```\n\n### **Attribute Details**\n\n#### `allow-seo` (boolean)\n- **Default:** `true` (SEO-safe mode)\n- **When `true`:** Legitimate search engines (Google, Bing, Facebook, etc.) see real content for indexing and social previews\n- **When `false`:** ALL bots see scrambled content (maximum protection but breaks SEO)\n\n```html\n<!-- SEO-friendly (recommended for public websites) -->\n<jumble-head allow-seo=\"true\"></jumble-head>\n\n<!-- Maximum security (recommended for private/internal content) -->\n<jumble-head allow-seo=\"false\"></jumble-head>\n```\n\n#### `custom-allowlist` (string array)\n- **Default:** `[]` (empty array)\n- **Purpose:** Add specific bot patterns that should be allowed to see real content\n- **Format:** JSON array of strings (case-insensitive partial matching)\n- **Combined with:** Default legitimate search engines (Google, Bing, Facebook, etc.)\n\n```html\n<!-- Allow your monitoring service -->\n<jumble-head custom-allowlist='[\"uptimerobot\"]'></jumble-head>\n\n<!-- Allow multiple partner services -->\n<jumble-head custom-allowlist='[\"partnerapi\", \"trustedbot\", \"monitoring-service\"]'></jumble-head>\n```\n\n#### `custom-denylist` (string array)\n- **Default:** `[]` (empty array)  \n- **Purpose:** Add specific bot patterns that should be blocked and see scrambled content\n- **Format:** JSON array of strings (case-insensitive partial matching)\n- **Combined with:** Default malicious patterns (headless browsers, scrapers, AI training bots, etc.)\n\n```html\n<!-- Block specific scraper -->\n<jumble-head custom-denylist='[\"badbot\"]'></jumble-head>\n\n<!-- Block multiple malicious patterns -->\n<jumble-head custom-denylist='[\"scraper\", \"harvester\", \"malicious-bot\", \"content-stealer\"]'></jumble-head>\n```\n\n### **Real-World Configuration Examples**\n\n```html\n<!-- E-commerce site: Allow price monitoring, block scrapers -->\n<jumble-head \n  allow-seo=\"true\"\n  custom-allowlist='[\"shopify-monitor\", \"price-tracker\"]'\n  custom-denylist='[\"competitor-scraper\", \"price-spy\"]'>\n</jumble-head>\n\n<!-- News site: Allow social media, block AI training -->\n<jumble-head \n  allow-seo=\"true\"\n  custom-denylist='[\"content-scraper\", \"article-bot\"]'>\n</jumble-head>\n\n<!-- Private dashboard: Maximum protection -->\n<jumble-head \n  allow-seo=\"false\"\n  custom-allowlist='[\"internal-monitor\"]'>\n</jumble-head>\n\n<!-- Public blog: Default SEO-safe protection -->\n<jumble-head></jumble-head>\n```\n\n## 📚 **Built-in Bot Detection**\n\n### **Default Legitimate Bots (Always Allowed with `allow-seo=\"true\"`)**\n- **Search Engines:** Google, Bing, Yahoo, DuckDuckGo, Yandex, Baidu\n- **Social Media:** Facebook, Twitter, LinkedIn, WhatsApp, Telegram, Discord\n- **SEO Tools:** SEMrush, Ahrefs, Majestic, Moz, Screaming Frog\n- **Monitoring:** UptimeRobot, Pingdom, GTmetrix\n\n### **Default Malicious Patterns (Always Blocked)**\n- **Automation Tools:** Selenium, Puppeteer, Playwright, PhantomJS\n- **Generic Scrapers:** headless, scraper, crawler, harvester, extractor\n- **AI Training Bots:** GPTBot, ClaudeBot, CCBot, meta-externalagent\n- **And 20+ more malicious patterns...**\n\n## 🌍 Multi-Language Support\n\nJumble intelligently handles different writing systems:\n\n- **Latin Characters (a-z, A-Z):** Scrambled to random lowercase letters\n- **Arabic Script (0x0600-0x06FF):** Scrambled to random Arabic characters  \n- **CJK Ideographs (0x4E00-0x9FFF):** Scrambled to random Chinese characters\n- **Numbers (0-9):** Left unchanged for functionality\n- **Punctuation & Symbols:** Preserved to maintain readability structure\n- **Emojis:** Remain unchanged\n\n## 🔧 Development\n\n### Building\n```bash\nnpm run build\n```\n\n### Testing\n```bash\nnpm test\nnpm run test:e2e\nnpm run test:coverage\n```\n\n### Starting the dev server\n```bash\nnpm start\n```\n\n## 📖 Additional Resources\n\n- **[Live Demo](https://4884org.github.io/jumble/)** - Interactive demonstration\n- **[NPM Package](https://www.npmjs.com/package/@4884org/jumble)** - Package details\n- **[GitHub Repository](https://github.com/4884org/jumble)** - Source code\n\n## 📄 License\n\nMIT License - see LICENSE file for details.","readmeFilename":"README.md"}