{"_id":"@altare/tecton","name":"@altare/tecton","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@altare/tecton","version":"0.1.0","description":"Tecton.","keywords":["captcha","react","typescript","shadcn","pattern-lock","slider-captcha","text-captcha"],"author":"","license":"MIT","type":"module","sideEffects":false,"main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup src/index.ts --dts --format cjs,esm --clean --sourcemap --minify --external react,react-dom","dev":"tsup src/index.ts --dts --format cjs,esm --watch --sourcemap --external react,react-dom","lint":"eslint --ext .ts,.tsx src","prepublishOnly":"npm run build"},"peerDependencies":{"react":">=18.2.0 || 19.x","react-dom":">=18.2.0 || 19.x"},"dependencies":{"clsx":"^2.1.1","tailwind-merge":"^2.3.0"},"devDependencies":{"@types/react":"^18.3.4","@types/react-dom":"^18.3.0","eslint":"^9.9.0","eslint-config-prettier":"^9.1.0","eslint-plugin-react-hooks":"^5.0.0","prettier":"^3.3.3","tsup":"^8.1.0","typescript":"^5.5.4"},"_id":"@altare/tecton@0.1.0","_nodeVersion":"22.3.0","_npmVersion":"10.8.1","dist":{"integrity":"sha512-XLSvu+biX3fsgkgqnJKyQYpjnnKuvbSV4cSkW5fcvG/hcFkekIPwvIxR6xTrfF6lwHtvoJarenKUVlCPreJqcQ==","shasum":"f82f3ebd3ae3c04c4b212410db964552da7829dc","tarball":"https://registry.npmjs.org/@altare/tecton/-/tecton-0.1.0.tgz","fileCount":9,"unpackedSize":85786,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICSQbYq8i128HqyiYLbXDY5mLJ9SFzk/h/a09yW2eHCZAiEAsjF9hE4bQKlyUduN82ZFgNS9gta18Q35QzJ7paVY/qQ="}]},"_npmUser":{"name":"mattjzmes","email":"mattj@altare.cv"},"directories":{},"maintainers":[{"name":"mattjzmes","email":"mattj@altare.cv"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tecton_0.1.0_1755974892333_0.5359551940758169"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-23T18:48:12.234Z","0.1.0":"2025-08-23T18:48:12.549Z","modified":"2025-08-23T18:48:12.813Z"},"maintainers":[{"name":"mattjzmes","email":"mattj@altare.cv"}],"description":"Tecton.","keywords":["captcha","react","typescript","shadcn","pattern-lock","slider-captcha","text-captcha"],"license":"MIT","readme":"# Tecton\n\nAltare's CAPTCHA library.\n\n## Install\n\n```bash\nnpm install @altare/tecton\n```\n\n## Usage\n\n```tsx\nimport { CaptchaProvider, SmartCaptcha } from '@altare/tecton'\nimport 'tecton/style.css'\n\nexport default function Example() {\n  return (\n    <CaptchaProvider>\n      <SmartCaptcha variant=\"text\" onSuccess={(proof) => console.log(proof)} />\n    </CaptchaProvider>\n  )\n}\n```\n\nThe slider is the only variant.\n\n## Server-side verification\n\nTecton issues a proof using HMAC-SHA256. Provide a server secret and verify on your backend.\n\nClient:\n\n```tsx\n<TextCaptcha secret={process.env.NEXT_PUBLIC_TECTON_PUBLIC || 'dev'} onSuccess={sendProof} />\n```\n\nServer (Node):\n\n```ts\nimport { createHmac } from 'crypto'\n\nfunction verify(secret: string, message: string, signatureHex: string) {\n  const h = createHmac('sha256', secret)\n  h.update(message)\n  return h.digest('hex') === signatureHex\n}\n```\n\n## Theming\n\nWrap with `CaptchaProvider` and pass CSS variable overrides.\n\n```tsx\n<CaptchaProvider theme={{ radius: '0.75rem', colors: { primary: '14 165 233' } }}>\n  <SmartCaptcha />\n</CaptchaProvider>\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-71413f6badd3debe12448aa13d28abd3"}