{"_id":"@codeluum/compliance-web","_rev":"10-074c41a73fd8cbf5d39040cffb28d1c0","name":"@codeluum/compliance-web","dist-tags":{"latest":"0.1.9"},"versions":{"0.1.0":{"name":"@codeluum/compliance-web","version":"0.1.0","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.0","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"6ab5d7ae61981dcb8ecb710a423ed4ed0e7c1cd1","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.0.tgz","fileCount":64,"integrity":"sha512-9/PbnOfj7oBBDcAu66w9ighn26Mis4oMgx6770nZORgFLA6RrP7yA2AdR+YLzGW6Lb5sjp2qEKYLyh2mxKFlUA==","signatures":[{"sig":"MEQCIBVCvlpul0rjocuwDep5Gs7haXfIe7tkEnLBPUJZi4eNAiAhVAPnd5ylIzp1rrN+RzFa5KoBl/z9Jnkv1JHOuvxhLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313165},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.0_1779995406624_0.6270298741762605","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@codeluum/compliance-web","version":"0.1.1","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.1","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"1f3e395765fe8a26ad756974d5301701e9a8fdb4","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.1.tgz","fileCount":66,"integrity":"sha512-d7QJUv4xwkH7vQtNPs8bTfgaaNLczxxEtCN74TN2isqHP/hLG/SlIoKnDA6LKK1D7IMPDkJ/6fIcWnvLzGNkoQ==","signatures":[{"sig":"MEQCIE0ROc3t75C1vePowReLLDsdWj50lzxtNyIs55Vw8+mzAiBqf/9SDlxVYUhWn+kWDB0IXKX8Zk/aZVSsm4DbkTV+Pg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":335191},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.1_1779998117261_0.8322887913174539","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@codeluum/compliance-web","version":"0.1.2","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.2","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"7d1b7d702617741e8a57f2bdadeac65bbea1be74","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.2.tgz","fileCount":66,"integrity":"sha512-h6sWVf7qegFUQZM41NpcEhEsQQR7G8k4fXCmt3kem3HOTFZsVOJQ+9iaFX13EnaQpVV23aBixDwB8cm4YqDlFw==","signatures":[{"sig":"MEYCIQDivYWKrnogv4Br5e1c3DtFLsxkDRLL4Yiy/39ypc2FqgIhAPEQ2eqfqL38jVQlw/sCCERBHGrQCN1jTAEAMj51ZMDz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":338931},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.2_1780071974728_0.2916850556360835","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@codeluum/compliance-web","version":"0.1.3","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.3","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"d02037fc70c50382f5de31b42f152ad7b79af4da","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.3.tgz","fileCount":75,"integrity":"sha512-B9elVgOnTMsvmLdsqE8dQaE5cF1DYqFw41K/E704yd3Mr9JRTqutuIoKtVBB+ErgfV2eTHF5uIe7DFHRLjTcng==","signatures":[{"sig":"MEYCIQCbtdX80TFkQ6XZCTfZVTnCZuAzlMRqxrg+swiF4cHSgwIhALzMAzrRuahp6n0kK6ite0JHoWQa+5Ti08gvvm7chuGd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":377530},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./policy-page":{"types":"./dist/policy-page.d.ts","import":"./dist/policy-page.js"},"./policy-pages":{"types":"./dist/policy-pages.d.ts","import":"./dist/policy-pages.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./consent-checkbox":{"types":"./dist/consent-checkbox.d.ts","import":"./dist/consent-checkbox.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.3_1786464982954_0.03143217920048369","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@codeluum/compliance-web","version":"0.1.4","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.4","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"9c2c4722c08eb0dabeefb60207ffb7b816ebee10","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.4.tgz","fileCount":75,"integrity":"sha512-uVlhXsJ7tNUZTh3JA9BeqJUcpR0KF7CG1clCerCaHZZQZVNqBrJBBUgHzSI+OPr+d24RuZGYln5GinOIUoimcA==","signatures":[{"sig":"MEUCIA76TXu7JijN3AZW0VsqGw5dIqCQCgcuw/TVERe07OG7AiEAkfoXOHn6aONRhX7cdA/X1CQYS+4rPvfOkeLFXHi113Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":378444},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./policy-page":{"types":"./dist/policy-page.d.ts","import":"./dist/policy-page.js"},"./policy-pages":{"types":"./dist/policy-pages.d.ts","import":"./dist/policy-pages.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./consent-checkbox":{"types":"./dist/consent-checkbox.d.ts","import":"./dist/consent-checkbox.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.4_1786466121955_0.01321986246473461","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@codeluum/compliance-web","version":"0.1.5","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.5","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"548f44a1faec1d29367131b6b255979f7c949a5c","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.5.tgz","fileCount":75,"integrity":"sha512-qv3qXchn0PSEdpsBNVpjD0hK/fVZppI6VAqXkTUMPPj2VGvGott1P/6S8qP0+pQJyP9Lq09bccDpoCCCq1bMfg==","signatures":[{"sig":"MEQCICcsFc4wyeY8+0ZLXBtZYCdW9Nf6+2zzFS8frgpSrXoRAiBGVL+se2wDww2mSWDrZmuv80jt57nxdlIvFRWp3jWwZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":382287},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./policy-page":{"types":"./dist/policy-page.d.ts","import":"./dist/policy-page.js"},"./policy-pages":{"types":"./dist/policy-pages.d.ts","import":"./dist/policy-pages.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./consent-checkbox":{"types":"./dist/consent-checkbox.d.ts","import":"./dist/consent-checkbox.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.5_1786467352568_0.5158240643295626","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@codeluum/compliance-web","version":"0.1.6","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.6","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"18494232c22133d87bf7e50835600f1adb122193","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.6.tgz","fileCount":75,"integrity":"sha512-KDiSp6ixoNuI434SBFonrME93iHaDbWLv894cv2m0jRpWldqGVa2r4Ao4mkUTSXj3NO+IUzZTWLNB8zZBNgRMA==","signatures":[{"sig":"MEUCIQCyZJAfYsvhNtLLQFQLLIaOjKtSRVfRx7gBeX59Qai53gIgNDl7LJrNE3kKXo4O0YwISe7+GruzqdL3oQOU4GFbers=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":384879},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./policy-page":{"types":"./dist/policy-page.d.ts","import":"./dist/policy-page.js"},"./policy-pages":{"types":"./dist/policy-pages.d.ts","import":"./dist/policy-pages.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./consent-checkbox":{"types":"./dist/consent-checkbox.d.ts","import":"./dist/consent-checkbox.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.6_1786554565642_0.279796962394834","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@codeluum/compliance-web","version":"0.1.7","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.7","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"3d567fa7323cd3be002e1382ef4d436ba2d8409c","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.7.tgz","fileCount":75,"integrity":"sha512-IDC0jYh7FvIcd22vzYjYs0tkon+XSwNMFD552F3/4PNOhmcfbfePbrZMMk1WH2ulh1QnZ5Zx/rrQ7Lge1V+OKA==","signatures":[{"sig":"MEUCIQCsXZ8LhLO5DU4N5dMkAnLZ5nkyP6utJD7vLHjM4rtp5QIgB/2ywPntYpu0IsVxZaDgNfNmCWrigqw9vcIRcLjqcCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":391201},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./policy-page":{"types":"./dist/policy-page.d.ts","import":"./dist/policy-page.js"},"./policy-pages":{"types":"./dist/policy-pages.d.ts","import":"./dist/policy-pages.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./consent-checkbox":{"types":"./dist/consent-checkbox.d.ts","import":"./dist/consent-checkbox.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.7_1786560385539_0.9846154515508485","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@codeluum/compliance-web","version":"0.1.8","keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","_id":"@codeluum/compliance-web@0.1.8","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"homepage":"https://github.com/codeluum/codeluum-api#readme","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"dist":{"shasum":"58a6e5d2cd38b4d498768f2811b09caad225333f","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.8.tgz","fileCount":75,"integrity":"sha512-t+KBUEfP2zHInOxKMDxHYC0bNImYeouFMOhLyI3/grAwhySskkZJNWVBUobR+vFEYTko82Clk3MMP1rvzFf4Qw==","signatures":[{"sig":"MEUCIBpIXpWDhqsQC522NSf8KM5mizUu2HxIKgqjga8H18n2AiEA6iyrp4Gg60dkW+cIfBUzg6sA9+mMq4RgUtEmLLVp/m8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392664},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./policy-page":{"types":"./dist/policy-page.d.ts","import":"./dist/policy-page.js"},"./policy-pages":{"types":"./dist/policy-pages.d.ts","import":"./dist/policy-pages.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./consent-checkbox":{"types":"./dist/consent-checkbox.d.ts","import":"./dist/consent-checkbox.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"repository":{"url":"git+https://github.com/codeluum/codeluum-api.git","type":"git","directory":"packages/compliance-web"},"_npmVersion":"11.10.0","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3.2.4","react-dom":"^18.3.1","typescript":"^5.5.4","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/compliance-web_0.1.8_1786567780586_0.3741676811567398","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@codeluum/compliance-web","version":"0.1.9","description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./gate":{"types":"./dist/gate.d.ts","import":"./dist/gate.js"},"./i18n":{"types":"./dist/i18n.d.ts","import":"./dist/i18n.js"},"./consent-state":{"types":"./dist/consent-state.d.ts","import":"./dist/consent-state.js"},"./request-consent":{"types":"./dist/request-consent.d.ts","import":"./dist/request-consent.js"},"./policy":{"types":"./dist/policy.d.ts","import":"./dist/policy.js"},"./policy-page":{"types":"./dist/policy-page.d.ts","import":"./dist/policy-page.js"},"./policy-pages":{"types":"./dist/policy-pages.d.ts","import":"./dist/policy-pages.js"},"./consent-checkbox":{"types":"./dist/consent-checkbox.d.ts","import":"./dist/consent-checkbox.js"},"./consent-receipt":{"types":"./dist/consent-receipt.d.ts","import":"./dist/consent-receipt.js"},"./badge":{"types":"./dist/badge.d.ts","import":"./dist/badge.js"},"./dsar":{"types":"./dist/dsar.d.ts","import":"./dist/dsar.js"},"./dsar-button":{"types":"./dist/dsar-button.d.ts","import":"./dist/dsar-button.js"},"./purpose-registry":{"types":"./dist/purpose-registry.d.ts","import":"./dist/purpose-registry.js"},"./submit-with-consent":{"types":"./dist/submit-with-consent.d.ts","import":"./dist/submit-with-consent.js"},"./retention-notice":{"types":"./dist/retention-notice.d.ts","import":"./dist/retention-notice.js"},"./sensitive-field":{"types":"./dist/sensitive-field.d.ts","import":"./dist/sensitive-field.js"},"./field":{"types":"./dist/field.d.ts","import":"./dist/field.js"},"./preference-center":{"types":"./dist/preference-center.d.ts","import":"./dist/preference-center.js"},"./snag-form":{"types":"./dist/snag-form.d.ts","import":"./dist/snag-form.js"},"./transfer-disclosure":{"types":"./dist/transfer-disclosure.d.ts","import":"./dist/transfer-disclosure.js"},"./pre-install-statement":{"types":"./dist/pre-install-statement.d.ts","import":"./dist/pre-install-statement.js"}},"scripts":{"build":"tsc -p tsconfig.json","prepublishOnly":"npm run build","test":"vitest run"},"keywords":["codeluum","compliance","consent","cookies","ndpr"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/codeluum/codeluum-api.git","directory":"packages/compliance-web"},"peerDependencies":{"react":">=17","react-dom":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"devDependencies":{"@testing-library/react":"^16.3.2","@types/react":"^18.3.28","@types/react-dom":"^18.3.7","jsdom":"^25.0.0","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.5.4","vitest":"^3.2.4"},"_id":"@codeluum/compliance-web@0.1.9","bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"homepage":"https://github.com/codeluum/codeluum-api#readme","_nodeVersion":"23.9.0","_npmVersion":"11.10.0","dist":{"integrity":"sha512-WqOa2pzgW8oG7vdwG+c1aBJsmdaj8EhQV1GR3CM/i5A6Ptb4toFJhCNFAonDkLROMdDLvql4F/OQhHQhsyM/bQ==","shasum":"447c4eae7b0701b28fdc5bd3535a8b3733578f21","tarball":"https://registry.npmjs.org/@codeluum/compliance-web/-/compliance-web-0.1.9.tgz","fileCount":81,"unpackedSize":408945,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDxux634Fpbe7vJf3nc92iofeBnHYX1gwa3wpC0SfMomwIhAI8VSJ70kgLkDFLoRoWDZL6XJV2z3/n8/4vXyQCL3NPX"}]},"_npmUser":{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"},"directories":{},"maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/compliance-web_0.1.9_1786621763583_0.15407122330821044"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-28T19:10:06.398Z","modified":"2026-08-13T11:49:23.922Z","0.1.0":"2026-05-28T19:10:06.763Z","0.1.1":"2026-05-28T19:55:17.423Z","0.1.2":"2026-05-29T16:26:14.881Z","0.1.3":"2026-08-11T16:16:23.128Z","0.1.4":"2026-08-11T16:35:22.108Z","0.1.5":"2026-08-11T16:55:52.712Z","0.1.6":"2026-08-12T17:09:25.830Z","0.1.7":"2026-08-12T18:46:25.697Z","0.1.8":"2026-08-12T20:49:40.730Z","0.1.9":"2026-08-13T11:49:23.761Z"},"bugs":{"url":"https://github.com/codeluum/codeluum-api/issues"},"license":"MIT","homepage":"https://github.com/codeluum/codeluum-api#readme","keywords":["codeluum","compliance","consent","cookies","ndpr"],"repository":{"type":"git","url":"git+https://github.com/codeluum/codeluum-api.git","directory":"packages/compliance-web"},"description":"Browser helpers for Codeluum Content API (cookie consent, publishable key)","maintainers":[{"name":"saidiadegoke","email":"rasheedsaidi@gmail.com"}],"readme":"# @codeluum/compliance-web\n\n[![npm version](https://img.shields.io/npm/v/@codeluum/compliance-web.svg)](https://www.npmjs.com/package/@codeluum/compliance-web)\n[![license](https://img.shields.io/npm/l/@codeluum/compliance-web.svg)](./LICENSE)\n\nBrowser + React widgets for **Codeluum** consent and privacy compliance (GDPR / NDPR — Nigeria Data Protection Act). Drop-in cookie banner, preference center, JIT consent prompts, DSAR buttons, policy links, sensitive-field protection, and the statutory NDPR notices (SNAG / Article 40, cross-border transfer disclosure, pre-install statement) — all driven by the Codeluum **Content API**.\n\nEvery widget authenticates with your **publishable key** (`pk_…`), which is safe to ship to the browser. For server-side calls with the secret key (`sk_…`), use [`@codeluum/compliance`](https://www.npmjs.com/package/@codeluum/compliance).\n\n- Framework-free core (vanilla DOM) **and** first-class React bindings.\n- Tree-shakeable subpath exports — import only what you use.\n- Ships TypeScript types. ESM only.\n- React is an **optional** peer dependency (only needed for `@codeluum/compliance-web/react`).\n\n## Installation\n\n```bash\nnpm install @codeluum/compliance-web\n# React is only required if you use the /react entry point:\nnpm install react react-dom\n```\n\n## Key concepts\n\n- **Publishable key (`pk_…`)** — the only credential this package needs. It can record consent and read public config/policies, but can't enumerate audit history. Never put your **secret** key (`sk_…`) in browser code.\n- **`externalUserId`** — a stable identifier for the current visitor/user, used to attribute consent records. Can be a string or a (sync/async) function returning one.\n- **Consent cookie** — a single cookie (`cl_consent_v1` by default) stores the visitor's decision. The consent-state bus reads it synchronously and notifies subscribers (including across tabs) on change.\n- **Purposes vs. categories** — categories are the toggles shown in the banner; purposes are the granular consent records derived from them.\n\n## Quick start — vanilla cookie banner\n\n```ts\nimport { mountCodeluumBanner } from '@codeluum/compliance-web';\n\nconst banner = await mountCodeluumBanner({\n  publishableKey: 'pk_live_…',\n  apiBaseUrl: 'https://api.codeluum.com',\n  externalUserId: () => getCurrentUserId() ?? crypto.randomUUID(),\n  position: 'bottom',\n  gate: { gtm: {} },                 // auto-activate gated scripts + Google Consent Mode v2\n  onDecision: (purposes) => console.log('granted:', purposes),\n});\n\n// Later — e.g. from a \"Cookie settings\" footer link:\nbanner.openPreferences();\n```\n\nThe banner injects its own styles by default (`injectDefaultStyles: false` to opt out), writes the consent cookie, POSTs the decision, and fires the consent bus so the rest of the page reacts.\n\n## Quick start — React\n\n```tsx\nimport {\n  CodeluumBannerProvider,\n  useConsent,\n  RetentionNotice,\n} from '@codeluum/compliance-web/react';\n\nfunction App() {\n  return (\n    <CodeluumBannerProvider\n      publishableKey=\"pk_live_…\"\n      apiBaseUrl=\"https://api.codeluum.com\"\n      externalUserId={userId}\n      gate\n    >\n      <Analytics />\n    </CodeluumBannerProvider>\n  );\n}\n\nfunction Analytics() {\n  const { granted } = useConsent('analytics'); // re-renders on accept/withdraw, even cross-tab\n  return granted ? <Tracker /> : null;\n}\n```\n\n## Entry points\n\nImport widgets from the main barrel or from focused subpaths (better tree-shaking):\n\n| Import | Exports |\n|---|---|\n| `@codeluum/compliance-web` | `mountCodeluumBanner`, `createCodeluumContentClient`, `initCodeluumConsent`, `purposesFromCategories`, `recordConsentFromToggles`, `CodeluumContentError`, **and re-exports of everything below** |\n| `…/react` | React components + hooks (see [React](#react-bindings)) |\n| `…/consent-state` | `getConsentState`, `getConsentSnapshot`, `subscribeConsent`, `notifyConsentChange`, `CONSENT_COOKIE` |\n| `…/gate` | `applyConsentGates` |\n| `…/i18n` | `resolveStrings`, `detectLocale`, `isRtlLocale`, `SUPPORTED_LOCALES` |\n| `…/request-consent` | `requestConsent` |\n| `…/submit-with-consent` | `submitWithConsent` |\n| `…/purpose-registry` | `getPurposeRegistry`, `refreshPurposeRegistry`, `getPurposeById`, `subscribePurposeRegistry` |\n| `…/policy` | `mountCodeluumPolicyLink`, `mountCodeluumPolicyText` |\n| `…/consent-receipt` | `mountCodeluumConsentReceipt` |\n| `…/badge` | `mountCodeluumComplianceBadge` |\n| `…/dsar` | `createDsarRequest`, `pollDsarStatus`, `TERMINAL_STATUSES` |\n| `…/dsar-button` | `mountCodeluumDsarButton` |\n| `…/preference-center` | `mountCodeluumPreferenceCenter` |\n| `…/retention-notice` | `mountCodeluumRetentionNotice` |\n| `…/field` | `mountCodeluumField` |\n| `…/sensitive-field` | `mountCodeluumSensitiveField`, `SENSITIVE_PATTERNS` |\n| `…/snag-form` | `mountCodeluumSnagForm`, `SCHEDULE_9_VIOLATION_CODES` |\n| `…/transfer-disclosure` | `mountCodeluumTransferDisclosure` |\n| `…/pre-install-statement` | `generatePreInstallStatement`, `PRE_INSTALL_FIELDS` |\n\n> All `mount*` functions accept a target (`string` selector or `HTMLElement`) and return a **handle** with `unmount()` (plus widget-specific methods). They inject default styles unless you pass `injectDefaultStyles: false`, and every visible string / CSS class is overridable via `strings` / `classNames`.\n\n---\n\n## Cookie banner — `mountCodeluumBanner`\n\n```ts\nconst banner = await mountCodeluumBanner(options): Promise<BannerHandle>;\n```\n\nRenders a sticky (bottom/top) or centered-modal banner with Accept All / Essentials Only / Customize. Manages its own DOM, cookie, and the POST to record the decision.\n\nKey options (`MountBannerOptions`):\n\n| Option | Type | Notes |\n|---|---|---|\n| `publishableKey` | `string` | **Required.** |\n| `apiBaseUrl` | `string` | **Required.** |\n| `externalUserId` | `string \\| () => string \\| Promise<string>` | **Required.** Stable visitor id. |\n| `position` | `'bottom' \\| 'top'` | Default `'bottom'`. |\n| `gate` | `boolean \\| { gtm?: GtmGateOptions }` | Auto-activate gated scripts and (optionally) update Google Consent Mode v2. |\n| `locale` | `string` | e.g. `'en'`, `'fr-FR'`, `'ar-EG'`. Defaults to `<html lang>` → `navigator.language` → `'en'`. |\n| `policyLinks` | `{ cookiePolicyUrl?, privacyPolicyUrl?, external? }` | Render policy links in the body. |\n| `linkRenderer` | `(props) => HTMLElement` | Custom anchor (React-Router / Next `Link`). |\n| `constructiveDismiss` | `{ mode: 'centered' }` | Article 17(8)(b) centered modal + dismiss-to-required. |\n| `strings` / `classNames` | `Partial<…>` | Override copy and CSS hooks. |\n| `cookieName`, `cookieMaxAgeDays`, `cookieDomain`, `cookiePath`, `cookieSameSite`, `cookieSecure` | | Cookie attributes. |\n| `render` | `(host, api) => (() => void) \\| void` | Full UI escape hatch — you own the DOM, `api` gives `categories`, `strings`, `decide()`, `dismiss()`. |\n| `onDecision` / `onError` | callbacks | |\n\n`BannerHandle`: `unmount()`, `openPreferences()`, `hasDecided()`, `getDecision()`. The default cookie name is exported as `BANNER_COOKIE_NAME`.\n\n---\n\n## React bindings — `@codeluum/compliance-web/react`\n\n**Components** (each is a thin wrapper over the matching `mount*` function and tears down on unmount):\n\n`<CodeluumBanner />`, `<CodeluumBannerProvider>`, `<CodeluumPreferenceCenter />`, `<CodeluumComplianceBadge />`, `<CodeluumPolicyLink />`, `<CodeluumPolicyText />`, `<CodeluumConsentReceipt />`, `<CodeluumDsarButton />`, `<CodeluumField>`, `<CodeluumSensitiveField />`, `<RetentionNotice />`, `<CodeluumSnagForm />`, `<CodeluumTransferDisclosure />`. Components that expose an imperative handle accept a `handleRef`.\n\n**Hooks:**\n\n| Hook | Returns | Purpose |\n|---|---|---|\n| `useConsent(purposeId, opts?)` | `ConsentState` | Subscribe to one purpose; re-renders on accept/withdraw (cross-tab). |\n| `useConsentSnapshot(opts?)` | `ConsentSnapshot \\| null` | Subscribe to the full decision. |\n| `useCodeluumBanner()` | `{ openPreferences, hasDecided, getDecision }` | Control the banner mounted by `CodeluumBannerProvider`. |\n| `usePurposeRegistry(arg)` | `PurposeRegistryEntry[]` | Module-cached purpose catalog; updates live on refresh. |\n| `useDsarStatus(ticketId, opts)` | `DsarStatusSnapshot \\| null` | Poll a DSAR ticket to completion. |\n\n```tsx\nconst { granted, decided, decidedAt } = useConsent('marketing');\nconst { openPreferences } = useCodeluumBanner();\n```\n\n---\n\n## Consent state bus — `@codeluum/compliance-web/consent-state`\n\nFramework-free, synchronous reads of the consent cookie plus a change subscription (cross-tab via `BroadcastChannel` where available).\n\n```ts\nimport {\n  getConsentState, getConsentSnapshot, subscribeConsent, notifyConsentChange, CONSENT_COOKIE,\n} from '@codeluum/compliance-web/consent-state';\n\nconst { granted, decided, decidedAt } = getConsentState('analytics'); // pure, render-safe\nconst unsubscribe = subscribeConsent((snap) => { /* snap: { purposes, decidedAt } | null */ });\n\n// If you write the cookie yourself, tell subscribers:\nnotifyConsentChange();\n```\n\n`getConsentState(purposeId, opts?) → { granted: boolean; decided: boolean; decidedAt: string | null }`. `opts.cookieName` overrides the default (`CONSENT_COOKIE`).\n\n---\n\n## Script gating — `@codeluum/compliance-web/gate`\n\nActivate every `<script type=\"text/plain\" data-codeluum-purpose=\"…\" data-src=\"…\">` whose purpose is granted. Idempotent. Optionally maps purposes to Google Consent Mode v2.\n\n```html\n<script type=\"text/plain\" data-codeluum-purpose=\"analytics\" data-src=\"https://…/ga.js\"></script>\n```\n\n```ts\nimport { applyConsentGates } from '@codeluum/compliance-web/gate';\n\napplyConsentGates(['necessary', 'analytics'], {\n  gtm: { purposeMap: { analytics: 'analytics_storage', marketing: 'ad_storage' } },\n});\n```\n\n(The banner can do this for you automatically via its `gate` option.)\n\n---\n\n## Internationalization — `@codeluum/compliance-web/i18n`\n\nBuilt-in dictionaries for `SUPPORTED_LOCALES = ['en', 'es', 'fr', 'de', 'pt', 'ar']` (Arabic renders RTL).\n\n```ts\nimport { resolveStrings, detectLocale, isRtlLocale, SUPPORTED_LOCALES } from '@codeluum/compliance-web/i18n';\n\nconst locale = detectLocale();               // explicit → <html lang> → navigator.language → 'en'\nconst strings = resolveStrings(locale, { title: 'Cookies 🍪' }); // exact → language-prefix → English, then overrides\nconst rtl = isRtlLocale(locale);\n```\n\n---\n\n## Just-in-time consent — `@codeluum/compliance-web/request-consent`\n\nPromise-returning inline prompt for a single purpose at the moment it's needed. Resolves `true` on accept, `false` on reject.\n\n```ts\nimport { requestConsent } from '@codeluum/compliance-web/request-consent';\n\nconst ok = await requestConsent({\n  publishableKey: 'pk_live_…',\n  apiBaseUrl: 'https://api.codeluum.com',\n  externalUserId: userId,\n  purpose: 'newsletter_signup',\n  reason: 'We’ll email you product updates. Unsubscribe anytime.',\n  alwaysInclude: ['necessary'],\n});\nif (ok) await subscribe();\n```\n\n## Gated form submit — `@codeluum/compliance-web/submit-with-consent`\n\nCollects every required purpose (prompting via `requestConsent` for any that aren't granted) and only runs `submit(values)` once all are granted. Stops on the first rejection.\n\n```ts\nimport { submitWithConsent } from '@codeluum/compliance-web/submit-with-consent';\n\nconst result = await submitWithConsent(formValues, {\n  publishableKey: 'pk_live_…',\n  apiBaseUrl: 'https://api.codeluum.com',\n  externalUserId: userId,\n  requires: [\n    'newsletter_signup',\n    { purpose: 'profiling', reason: 'To personalize recommendations.' },\n  ],\n  submit: (values) => api.createAccount(values),\n});\n\nif (result.ok) {\n  console.log(result.submitResult, result.granted);\n} else {\n  console.warn('blocked by', result.blockedBy); // purposes the user declined\n}\n```\n\n---\n\n## Content API client — `createCodeluumContentClient`\n\nA browser HTTP client for the public `…/compliance/content/*` endpoints. Most widgets create one for you, but you can share a single instance via the `client` option to avoid duplicate fetches.\n\n```ts\nimport { createCodeluumContentClient } from '@codeluum/compliance-web';\n\nconst client = createCodeluumContentClient({\n  publishableKey: 'pk_live_…',\n  apiBaseUrl: 'https://api.codeluum.com',\n});\n\nawait client.getConfig();      // banner categories\nawait client.getPolicies();    // published policies\nawait client.getPurposes();    // purpose registry\nawait client.consents.record({ subject, purpose, state: 'granted', basis: 'consent' });\nawait client.consents.has({ subject, purpose });\n```\n\nFailed requests throw `CodeluumContentError` (`status`, `message`, `body`).\n\nHelpers on the barrel: `initCodeluumConsent(options)` prefetches config + policies (no UI); `purposesFromCategories(selectedIds, opts?)` derives purpose strings from category toggles; `recordConsentFromToggles(client, params)` records consent from a toggle selection.\n\n---\n\n## DSAR (data-subject access requests) — `@codeluum/compliance-web/dsar`\n\nOpen and track export/delete/rectify requests. The browser never sees the secret key — requests go through **your** backend proxy (`proxyUrl`) or a custom `createTicket` callback.\n\n```ts\nimport { createDsarRequest, pollDsarStatus, TERMINAL_STATUSES } from '@codeluum/compliance-web/dsar';\n\nconst ticket = await createDsarRequest({\n  externalUserId: userId,\n  type: 'export',                       // 'export' | 'delete' | 'rectify'\n  proxyUrl: '/api/codeluum/dsar',        // your endpoint POSTs to the Content API with sk_…\n});\n\nconst poll = pollDsarStatus(ticket.id, {\n  publishableKey: 'pk_live_…',\n  apiBaseUrl: 'https://api.codeluum.com',\n  intervalMs: 5000,\n  onChange: (snap) => {\n    console.log(snap.status);\n    if (TERMINAL_STATUSES.has(snap.status)) poll.stop();\n  },\n});\n```\n\n### DSAR button — `@codeluum/compliance-web/dsar-button`\n\n```ts\nimport { mountCodeluumDsarButton } from '@codeluum/compliance-web/dsar-button';\n\nmountCodeluumDsarButton('#export-data', {\n  type: 'export',\n  externalUserId: userId,\n  proxyUrl: '/api/codeluum/dsar',\n  onTerminal: (snap) => console.log('done:', snap.status),\n});\n```\n\n---\n\n## Compliance badge — `@codeluum/compliance-web/badge`\n\nA transparency icon that opens a modal with tabs for Cookies, Purposes, Policies, optional DSAR Requests, and an optional \"Your data\" inventory.\n\n```ts\nimport { mountCodeluumComplianceBadge } from '@codeluum/compliance-web/badge';\n\nconst badge = mountCodeluumComplianceBadge('#badge', {\n  publishableKey: 'pk_live_…',\n  apiBaseUrl: 'https://api.codeluum.com',\n  externalUserId: userId,\n  tabs: ['cookies', 'purposes', 'policies', 'requests', 'data'],\n  dataInventory: [{ field: 'email', why: 'Account login', retentionDays: 365 }],\n  dsar: { proxyUrl: '/api/codeluum/dsar' },\n});\nbadge.open();\n```\n\n## Preference center — `@codeluum/compliance-web/preference-center`\n\nA full preferences page: decision summary, per-purpose toggles, DSAR buttons, and policy links — all live-updated via the consent bus.\n\n```ts\nimport { mountCodeluumPreferenceCenter } from '@codeluum/compliance-web/preference-center';\n\nmountCodeluumPreferenceCenter('#privacy', {\n  publishableKey: 'pk_live_…',\n  apiBaseUrl: 'https://api.codeluum.com',\n  externalUserId: userId,\n  sections: ['summary', 'purposes', 'requests', 'policies'],\n  dsar: { proxyUrl: '/api/codeluum/dsar' },\n});\n```\n\n---\n\n## Policy links & text — `@codeluum/compliance-web/policy`\n\n```ts\nimport { mountCodeluumPolicyLink, mountCodeluumPolicyText } from '@codeluum/compliance-web/policy';\n\nmountCodeluumPolicyLink('#privacy-link', {\n  publishableKey: 'pk_live_…', apiBaseUrl: 'https://api.codeluum.com',\n  type: 'privacy',        // 'privacy' | 'terms' | 'data_policy' | 'cookie'\n  mode: 'modal',          // 'modal' opens an <a>+dialog; 'link' navigates to href\n});\n\nmountCodeluumPolicyText('#cookie-policy', {\n  publishableKey: 'pk_live_…', apiBaseUrl: 'https://api.codeluum.com', type: 'cookie',\n}); // inlines the published policy HTML\n```\n\n## Consent receipt — `@codeluum/compliance-web/consent-receipt`\n\nShows \"Saved on <date> — manage in privacy settings\" once a decision exists for a purpose.\n\n```ts\nimport { mountCodeluumConsentReceipt } from '@codeluum/compliance-web/consent-receipt';\nmountCodeluumConsentReceipt('#receipt', { purpose: 'newsletter' });\n```\n\n## Retention notice — `@codeluum/compliance-web/retention-notice`\n\n```ts\nimport { mountCodeluumRetentionNotice } from '@codeluum/compliance-web/retention-notice';\nmountCodeluumRetentionNotice('#note', { purpose: 'support tickets', days: 365 }); // days: null → indefinite\n```\n\n---\n\n## Form fields\n\n### Field chrome — `@codeluum/compliance-web/field`\n\nWraps an input with a label, optional tooltip (purpose description), and retention notice sourced from the purpose registry.\n\n```ts\nimport { mountCodeluumField } from '@codeluum/compliance-web/field';\nmountCodeluumField('#email-field', {\n  purpose: 'newsletter_signup',\n  publishableKey: 'pk_live_…', apiBaseUrl: 'https://api.codeluum.com',\n});\n```\n\n### Sensitive field — `@codeluum/compliance-web/sensitive-field`\n\nMask/show toggle, paste validation, and clipboard wipe for high-risk inputs. Built-in patterns for `bvn`, `nin`, `ssn`, `phone` (exported as `SENSITIVE_PATTERNS`); pass a `pattern` for `type: 'custom'`.\n\n```ts\nimport { mountCodeluumSensitiveField } from '@codeluum/compliance-web/sensitive-field';\nconst field = mountCodeluumSensitiveField('#bvn', { type: 'bvn', clipboardWipeMs: 10000 });\nfield.getValue();\n```\n\n---\n\n## NDPR statutory notices\n\n### SNAG form — `@codeluum/compliance-web/snag-form`\n\nStandard Notice to Address Grievance (Article 40 + Schedule 9, NDP Act / GAID 2025). Posts to `/compliance/content/snag` (publishable key + server-side Origin allowlist). The 14 statutory violation codes are exported as `SCHEDULE_9_VIOLATION_CODES`.\n\n```ts\nimport { mountCodeluumSnagForm } from '@codeluum/compliance-web/snag-form';\nmountCodeluumSnagForm('#grievance', {\n  publishableKey: 'pk_live_…', apiBaseUrl: 'https://api.codeluum.com',\n  defaultRespondentName: 'Acme Ltd',\n  onServed: (r) => console.log('ref', r.id, 'deadline', r.deadlineAt),\n});\n```\n\n### Transfer disclosure — `@codeluum/compliance-web/transfer-disclosure`\n\nArticle 27(3)(f) public list of cross-border destinations and their legal bases. Fetches from `/compliance/content/transfers`.\n\n```ts\nimport { mountCodeluumTransferDisclosure } from '@codeluum/compliance-web/transfer-disclosure';\nmountCodeluumTransferDisclosure('#transfers', {\n  publishableKey: 'pk_live_…', apiBaseUrl: 'https://api.codeluum.com',\n});\n```\n\n### Pre-install statement — `@codeluum/compliance-web/pre-install-statement`\n\nPure function that assembles the Article 31(2)(e) pre-install statement (9 fields) into `{ text, html, json }` for app-store listings or onboarding screens.\n\n```ts\nimport { generatePreInstallStatement } from '@codeluum/compliance-web/pre-install-statement';\n\nconst stmt = generatePreInstallStatement({\n  purposes: [{ purposeId: 'analytics', label: 'Usage analytics', retentionDays: 365 }],\n  deviceType: 'mobile',                      // 'mobile' | 'desktop' | 'kiosk' | 'wearable'\n  controllerName: 'Acme Ltd',\n  controllerContact: 'privacy@acme.com',\n  crossBorderDestinations: ['us', 'gb'],     // ISO-3166 alpha-2\n});\nelement.innerHTML = stmt.html;\n```\n\n---\n\n## Purpose registry — `@codeluum/compliance-web/purpose-registry`\n\nA module-cached catalog of your purposes (label, description, lawful basis, retention, sensitivity, required).\n\n```ts\nimport {\n  getPurposeRegistry, refreshPurposeRegistry, getPurposeById, subscribePurposeRegistry,\n} from '@codeluum/compliance-web/purpose-registry';\n\nconst purposes = await getPurposeRegistry({ publishableKey: 'pk_live_…', apiBaseUrl: '…' });\ngetPurposeById('analytics');                  // sync; null until first load resolves\nconst off = subscribePurposeRegistry((list) => { /* re-render */ });\n```\n\n---\n\n## Styling\n\nEvery widget injects scoped default styles (disable with `injectDefaultStyles: false`) and exposes a `classNames` map so you can attach your own CSS to each part. Visible copy is overridable via `strings`, and `locale` selects a built-in translation.\n\n## TypeScript\n\nAll entry points ship `.d.ts` declarations. Notable exported types: `MountBannerOptions`, `BannerHandle`, `ConsentState`, `ConsentSnapshot`, `ContentClientConfig`, `PurposeRegistryEntry`, `DsarType`, `DsarStatusSnapshot`, `CreateDsarRequestOptions`, `PolicyType`, `SensitiveType`, `SchedulNineViolationCode`, `TransferBasis`, `PreInstallStatement`, `LocaleCode`, and the per-widget `*Options` / `*Strings` / `*ClassNames` / `*Handle` types.\n\n> Note: the top-level `ConsentState` is the cookie-state object `{ granted, decided, decidedAt }`. The Content API's consent decision union (`'granted' | 'withdrawn' | 'acknowledged'`) is exported as `ContentConsentState`.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}