{"_id":"@convex-internal/web-analytics","_rev":"12-fcbd3c521200ca32db8f3de5e8e764df","name":"@convex-internal/web-analytics","dist-tags":{"latest":"2.2.2"},"versions":{"1.0.0":{"name":"@convex-internal/web-analytics","version":"1.0.0","_id":"@convex-internal/web-analytics@1.0.0","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"55d12e9923a4379ddf03866d4dd7427e994daf63","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-1.0.0.tgz","fileCount":19,"integrity":"sha512-f9VRnUTmeL5l080xMjvX0VkhAQ9IXPteg2TDB68lid+kpuVuZxuJZQ/W4a7wL3f6+v/1Fiu2myC7gW8Ytq8ZuA==","signatures":[{"sig":"MEUCIGxCkCH+sNini4OcDNAV1qH3hD0CugTKW14jpFytx9tDAiEAm3D52UrerMYYaE/VnzMVetwBE/0fZRvIvBDwff09inA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21072},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"2d4273a453cd7313ac27b65b2e18307158008041","scripts":{"test":"vitest run","build":"tsc && cp src/banner.css dist/banner.css","prepack":"npm run build"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites. Wrap the app in `WebAnalyticsProvider`. It renders the consent banner. Wrap other tracking, such as GA or an ad pixel, in `Consented` so it loads only after consent is confirme","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19.2.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_1.0.0_1787069603828_0.7009396186300709","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@convex-internal/web-analytics","version":"1.0.1","_id":"@convex-internal/web-analytics@1.0.1","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"4806210ea17029d405bd8784e95dca0712bbc45d","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-1.0.1.tgz","fileCount":19,"integrity":"sha512-gb/jSFtW8mtVQOi2bI+YT+QPtIjOZ++0L8C23XDc/s5mM1yYQbbrMYpNB6utZXgoEbl5p6vq5zJkWfxvIS8x2A==","signatures":[{"sig":"MEUCIGSYM/SngnkWTYzIQGbknTnDtrpeQNN+/KxlY0vRcpgwAiEArtAA3ErBpH2sVlK1ZdygZupRfMl/CYYiZnkxuLgCXK8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20822},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"f3f9f8ee3ab1f5cfd0906db033422fa6455ba414","scripts":{"test":"vitest run","build":"tsc && cp src/banner.css dist/banner.css","prepack":"npm run build"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites. Wrap the app in `WebAnalyticsProvider`. It renders the consent banner. Wrap other tracking, such as GA or an ad pixel, in `Consented` so it loads only after consent is confirme","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19.2.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_1.0.1_1787073417451_0.23381444726153666","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@convex-internal/web-analytics","version":"1.0.2","_id":"@convex-internal/web-analytics@1.0.2","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"e9ba42dd90dee10c74a9420b0b34626db43e1399","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-1.0.2.tgz","fileCount":19,"integrity":"sha512-fHr8ahnM7OcAmzG5eYdOPJxsCP1TjxcrtLeAC9a9z3As8baumB0C/NaDGm5UFsbKE800aQGabz9UdoqlPJxghg==","signatures":[{"sig":"MEUCIEUCc/w4w9arVgBlPSW1XgYV5Uas/Ihfdvdwi0Ci/xabAiEAurPkJ2vdyKxFOO8XaDxPLpwnIRw6dfd46UoFwLDdtB8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20626},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"39a7d755c4869dc91652ee6e9f3b16110b6ccd17","scripts":{"test":"vitest run","build":"tsc && cp src/banner.css dist/banner.css","prepack":"npm run build"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites. Wrap the app in `WebAnalyticsProvider`. It renders the consent banner. Wrap other tracking, such as GA or an ad pixel, in `Consented` so it loads only after consent is confirme","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19.2.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_1.0.2_1787074201137_0.7550610546903431","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@convex-internal/web-analytics","version":"1.0.3","_id":"@convex-internal/web-analytics@1.0.3","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"7633ae79b183f85f27b56abb10a0d3d5f154d0ea","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-1.0.3.tgz","fileCount":19,"integrity":"sha512-7gS836VVeXIMDXie5B7c8vgMCFV5P7HBs/FXYVgjI3e9b3RkYGX909lnZTVvT24ukH1aJxnaaa2TBGpLlyf35w==","signatures":[{"sig":"MEQCIArIh9QMHXsMW53/k4NoZvF4W0J5Aopf9it+3j7/9uc0AiA6/ZfYKHc6DtSmx+ynA8T71tUkWFbnSPOOMPDDmlKOkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20520},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"4459138fe3dea527254c1cc4a85a9a52061f051a","scripts":{"test":"vitest run","build":"tsc && cp src/banner.css dist/banner.css","prepack":"npm run build"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites. Wrap the app in `WebAnalyticsProvider`. It renders the consent banner. Wrap other tracking, such as GA or an ad pixel, in `Consented` so it loads only after consent is confirme","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19.2.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_1.0.3_1787078654856_0.4528114381720132","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@convex-internal/web-analytics","version":"1.1.0","_id":"@convex-internal/web-analytics@1.1.0","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"a26d1351ce91251e925a799221f4891452679efb","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-1.1.0.tgz","fileCount":19,"integrity":"sha512-+Ahfx09HInRKYgKH7a1sSvspHslolYYyVzkCqw40uyEe0GZ5jXjHKJ1q3AVM8Bf75bMHP8PGygjbraUXDWpvng==","signatures":[{"sig":"MEUCIQDObZOhUrKEDbL7C9hPb6gPNMDMDZtv4ZtO8xCn3cmKkQIgGcC+sTZx2h4D0ryRiWj8mL/UhC1IsBu9vw8mFpSbQDc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20757},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"d4366efccd353a18793b884a76b5ac99e034485c","scripts":{"test":"vitest run","build":"tsc && cp src/banner.css dist/banner.css","prepack":"npm run build"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites. Wrap the app in `WebAnalyticsProvider`. It renders the consent banner. Wrap other tracking, such as GA or an ad pixel, in `Consented` so it loads only after consent is confirme","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19.2.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_1.1.0_1787263692496_0.11976617910745047","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@convex-internal/web-analytics","version":"1.1.1","_id":"@convex-internal/web-analytics@1.1.1","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"e5e1bd6d66e7a784bf3dc06d7f9762dd095f5cc5","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-1.1.1.tgz","fileCount":19,"integrity":"sha512-PzZPuJSsJ6Qwh4Km/dKS5+fXU8HLB8w3oLeYZewl69QJXPyhQ4ugC9AsVard+KyAmkYac1px4MaBPMkuljXBYA==","signatures":[{"sig":"MEYCIQCODarrM06rgrswU9+UfBZ5gJxWTK/Lx504QByghq3ZtQIhAInLXJTm1H0UNgfERGfZVfuZ2958Ham406041w0NFo1k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21055},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"22fea31875af099fbfc26713db972d75145194e4","scripts":{"test":"vitest run","build":"tsc && cp src/banner.css dist/banner.css","prepack":"npm run build"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites. Wrap the app in `WebAnalyticsProvider`. It renders the consent banner. Wrap other tracking, such as GA or an ad pixel, in `Consented` so it loads only after consent is confirme","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19.2.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_1.1.1_1787327296738_0.4455757790649646","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@convex-internal/web-analytics","version":"2.0.0","_id":"@convex-internal/web-analytics@2.0.0","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"ea14abef5e002ff5e5a5f55ec167872f6f67c9e7","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-2.0.0.tgz","fileCount":32,"integrity":"sha512-KegzX5G9ERm6kPQdIdU6ykXe7lxhSvwN97+TMQ67BLewpEQrFysuS1ZO0s0x+x8JeY20i/MIRMupdm5W1YnMsA==","signatures":[{"sig":"MEUCICfjLh19TQLqzYhwrm35d0jV03VzFlqdG4RJ6Bh3VCATAiEAgmxRP/CjbFzb8XCxSnxNKN0CoGFuGhSOhFRjDZC7iiA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27490},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"c72d0d64ba34bfe04694674fe3b324ff6175f269","scripts":{"test":"vitest run","build":"npm run check:svelte && tsc && cp src/banner.css dist/banner.css && cp src/svelte/WebAnalytics.svelte dist/svelte/WebAnalytics.svelte","prepack":"npm run build","check:svelte":"svelte-check --tsconfig ./src/svelte/tsconfig.json","test:coverage":"vitest run --coverage","dev:apps:react":"npm run build && vite --config test-apps/react/vite.config.ts","dev:apps:svelte":"npm run build && vite --config test-apps/svelte/vite.config.ts"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.1","jsdom":"^30.0.1","react":"^19.2.4","svelte":"^5.56.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","svelte-check":"^4.7.6","@types/react-dom":"^19.2.4","@vitest/coverage-v8":"^4.1.10","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2","@testing-library/svelte":"^5.3.1","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_2.0.0_1787340223413_0.3446409458210231","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@convex-internal/web-analytics","version":"2.0.1","_id":"@convex-internal/web-analytics@2.0.1","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"86115939cfc6559d278e83cd94349a7480622a15","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-2.0.1.tgz","fileCount":32,"integrity":"sha512-ZRGKC6CIg/tYi/iZIBmcRfu3d+8sUz2sDPxMcsCiqlD/cSBT4j+Tq+YbqnzBfzjrUuDivQ6E3IanxBtJGIaDIA==","signatures":[{"sig":"MEQCIEhOv0dKw89rkx+rdljq0bhkGZy0/WSl5SMCggIF8iFcAiBzhzfzrZz6dAb5zjpPdyqcT9x0kDTOdU6iGElzIkItjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27434},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"d1af48e715e61bcd4e20e392d8ec159b1c9f070b","scripts":{"test":"vitest run","build":"npm run check:svelte && tsc && cp src/banner.css dist/banner.css && cp src/svelte/WebAnalytics.svelte dist/svelte/WebAnalytics.svelte","prepack":"npm run build","check:svelte":"svelte-check --tsconfig ./src/svelte/tsconfig.json","test:coverage":"vitest run --coverage","dev:apps:react":"npm run build && vite --config test-apps/react/vite.config.ts","dev:apps:svelte":"npm run build && vite --config test-apps/svelte/vite.config.ts"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.1","jsdom":"^30.0.1","react":"^19.2.4","svelte":"^5.56.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","svelte-check":"^4.7.6","@types/react-dom":"^19.2.4","@vitest/coverage-v8":"^4.1.10","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2","@testing-library/svelte":"^5.3.1","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_2.0.1_1787341124526_0.3885988056241514","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@convex-internal/web-analytics","version":"2.1.0","_id":"@convex-internal/web-analytics@2.1.0","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"a0b1837b89486f173f16226fa3350358b4f6a6d7","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-2.1.0.tgz","fileCount":32,"integrity":"sha512-n3NIZ/t5teASR69F0Lz3N6vnoqHBcUyvgXZg//sa2hvohyPQIzG/sVN8ct+AJgigscL0mjIPme9cPKUkbzuv5g==","signatures":[{"sig":"MEUCIQDbVkDrc6cWRFgn9I2ZJWsyBqIh2uHZCngfq70X/0OljAIgSXea7WNSjqmT5v2wD92gcFwM7350bUtCjcE6DAl+ppg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28297},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"4b9fa1ba62a52f5985c2edc8f191cf008cb5a391","scripts":{"test":"vitest run","build":"npm run check:svelte && tsc && cp src/banner.css dist/banner.css && cp src/svelte/WebAnalytics.svelte dist/svelte/WebAnalytics.svelte","prepack":"npm run build","check:svelte":"svelte-check --tsconfig ./src/svelte/tsconfig.json","test:coverage":"vitest run --coverage","dev:apps:react":"npm run build && vite --config test-apps/react/vite.config.ts","dev:apps:svelte":"npm run build && vite --config test-apps/svelte/vite.config.ts"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.1","jsdom":"^30.0.1","react":"^19.2.4","svelte":"^5.56.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","svelte-check":"^4.7.6","@types/react-dom":"^19.2.4","@vitest/coverage-v8":"^4.1.10","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2","@testing-library/svelte":"^5.3.1","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_2.1.0_1787757613453_0.5557027230109932","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@convex-internal/web-analytics","version":"2.2.0","_id":"@convex-internal/web-analytics@2.2.0","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"63d1ee56b113e87283e9df1325c927f4ffb9671b","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-2.2.0.tgz","fileCount":32,"integrity":"sha512-QvRAVxAEpeuorsql5wZbpMszuUDH0roT2KQm0LmFOieTrSZoik+uuSdDI9Dq2XogCsY9ATLGZ2a4YyQLDsKgmg==","signatures":[{"sig":"MEQCIHo8ndAFqpeVQSiVjnQ1YdIzgI7vewCwcdclD7bcGdAfAiBZrWnYT2Ox9bbOM/rtW2Tyb5nHhEK4y6a5wt+WKsJGLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29884},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"08258984bd66049bf29eaef3308f8928e5f52dd0","scripts":{"test":"vitest run","build":"npm run check:svelte && tsc && cp src/banner.css dist/banner.css && cp src/svelte/WebAnalytics.svelte dist/svelte/WebAnalytics.svelte","prepack":"npm run build","check:svelte":"svelte-check --tsconfig ./src/svelte/tsconfig.json","test:coverage":"vitest run --coverage","dev:apps:react":"npm run build && vite --config test-apps/react/vite.config.ts","dev:apps:svelte":"npm run build && vite --config test-apps/svelte/vite.config.ts"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.1","jsdom":"^30.0.1","react":"^19.2.4","svelte":"^5.56.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","svelte-check":"^4.7.6","@types/react-dom":"^19.2.4","@vitest/coverage-v8":"^4.1.10","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2","@testing-library/svelte":"^5.3.1","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_2.2.0_1787762605990_0.47544775359496083","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@convex-internal/web-analytics","version":"2.2.1","license":"UNLICENSED","_id":"@convex-internal/web-analytics@2.2.1","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"dist":{"shasum":"ab27e1652c4be0762781d9ba0daf6665f9e725d0","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-2.2.1.tgz","fileCount":32,"integrity":"sha512-5TopbRez1CYCc/nQt2AdSC9tCctabjK7o6n304H7KICFrfL4RhPtR3u/fp+jvEXnbss9cVW0bcVfue7hP8hz2Q==","signatures":[{"sig":"MEYCIQC4Qclxoc0sIhLAZeGwaXukxlUMCU6fegRzrYU9AwmG2AIhAMQjbGPHGs5zbLus8H6TSnk0u2TfjD5HL0ZTsED8RP2I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDktRbv0a+//FR0gkrX5a6VX/m9ln2eExTJVsTlkESJjAIgK86anj1mbxPJVUe8lYpfSfSITRiLZfObe5wWohsq/Fg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29911},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"c4a827b8b1814b9534d7294c64546f0e0e40cb15","scripts":{"test":"vitest run","build":"npm run check:svelte && tsc && cp src/banner.css dist/banner.css && cp src/svelte/WebAnalytics.svelte dist/svelte/WebAnalytics.svelte","prepack":"npm run build","check:svelte":"svelte-check --tsconfig ./src/svelte/tsconfig.json","test:coverage":"vitest run --coverage","dev:apps:react":"npm run build && vite --config test-apps/react/vite.config.ts","dev:apps:svelte":"npm run build && vite --config test-apps/svelte/vite.config.ts"},"_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.1","jsdom":"^30.0.1","react":"^19.2.4","svelte":"^5.56.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","svelte-check":"^4.7.6","@types/react-dom":"^19.2.4","@vitest/coverage-v8":"^4.1.10","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2","@testing-library/svelte":"^5.3.1","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/web-analytics_2.2.1_1788453882734_0.7574652306598197","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"_id":"@convex-internal/web-analytics@2.2.2","dist":{"shasum":"cadb99e5acaeae8d900aa70bcaf370351842593b","tarball":"https://registry.npmjs.org/@convex-internal/web-analytics/-/web-analytics-2.2.2.tgz","fileCount":32,"integrity":"sha512-5zwW2ZG1KtchBSiZU3goGoQH4M5QudFB4P8YFiQAKIbXE5SM6jIPtyGHAvMLUDPxgfKcLocprcHU8Yehmgg1VQ==","signatures":[{"sig":"MEUCIQC8iaHP327Xs7km5geBgEV9RyMdiDBVyDcIzFnabmNL+AIgK1Jik6ADYTsiwTLzV/U+r1NzDTTDDdLV1p3LBGaDR24=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEUqJX0MwakbQ/cnQceaqATSzpXtrNvf+BRHaCJy3iwnAiEAg4oG0ewZbbGRWiElTynGAzn8hy6e7RvSXLL52LUg70I="}],"unpackedSize":29884},"name":"@convex-internal/web-analytics","type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./banner.css":"./dist/banner.css"},"gitHead":"903d14922b15bf47043ca6a597c71f5cedf34abd","scripts":{"test":"vitest run","build":"npm run check:svelte && tsc && cp src/banner.css dist/banner.css && cp src/svelte/WebAnalytics.svelte dist/svelte/WebAnalytics.svelte","prepack":"npm run build","check:svelte":"svelte-check --tsconfig ./src/svelte/tsconfig.json","test:coverage":"vitest run --coverage","dev:apps:react":"npm run build && vite --config test-apps/react/vite.config.ts","dev:apps:svelte":"npm run build && vite --config test-apps/svelte/vite.config.ts"},"version":"2.2.2","_npmUser":{"name":"mikewheaton","email":"mike@wheaton.dev"},"_npmVersion":"11.19.0","description":"Shared consent state, consent banner, and analytics setup for Convex websites.","directories":{},"maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"sideEffects":["**/*.css"],"_nodeVersion":"24.15.0","dependencies":{"posthog-js":"^1.211.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.1","jsdom":"^30.0.1","react":"^19.2.4","svelte":"^5.56.4","vitest":"^4.1.10","react-dom":"^19.2.8","typescript":"^5.9.2","@types/node":"^26.2.0","@types/react":"^19.2.18","svelte-check":"^4.7.6","@types/react-dom":"^19.2.4","@vitest/coverage-v8":"^4.1.10","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2","@testing-library/svelte":"^5.3.1","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/web-analytics_2.2.2_1788454511283_0.9903250762905431"}}},"time":{"created":"2026-08-18T16:13:23.612Z","modified":"2026-09-03T16:55:11.844Z","1.0.0":"2026-08-18T16:13:23.989Z","1.0.1":"2026-08-18T17:16:57.598Z","1.0.2":"2026-08-18T17:30:01.288Z","1.0.3":"2026-08-18T18:44:15.021Z","1.1.0":"2026-08-20T22:08:12.650Z","1.1.1":"2026-08-21T15:48:16.876Z","2.0.0":"2026-08-21T19:23:43.549Z","2.0.1":"2026-08-21T19:38:44.672Z","2.1.0":"2026-08-26T15:20:13.596Z","2.2.0":"2026-08-26T16:43:26.125Z","2.2.1":"2026-09-03T16:44:42.829Z","2.2.2":"2026-09-03T16:55:11.663Z"},"description":"Shared consent state, consent banner, and analytics setup for Convex websites.","maintainers":[{"name":"nicolapps","email":"nicolas@ettlin.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"}],"readme":"# @convex-internal/web-analytics\n\nShared consent state, consent banner, and analytics setup for Convex websites.\n\n## Core\n\nMount a framework entry at the root ([React](#react) or [Svelte](#svelte)).\nAnalytics start in production, except on localhost. Consent is synced to\nPostHog. The banner shows when the visitor has not chosen yet.\n\nPostHog already copies standard campaign params (UTMs, `gclid`, `rdt_cid`,\n`fbclid`, and other common click IDs) from the landing URL onto events. This\npackage also captures `dub_id`. After consent, PostHog creates an anonymous\nperson profile. Campaign params still available at that point can be stored as\n`$initial_*`, supporting person-level attribution before login.\n\n### `capture`\n\nRecord an event from client code through the framework-neutral root entry.\nThe optional third argument is\n[PostHog's capture options](https://posthog.com/docs/libraries/js/usage).\n\n```tsx\nimport { capture } from \"@convex-internal/web-analytics\";\n\ncapture(\"www-login\", undefined, {\n  transport: \"sendBeacon\",\n  send_instantly: true,\n});\n```\n\n### `getDistinctId`\n\nPostHog's identifier for the current visitor. After consent is granted it is\nstored in a cookie on `.convex.dev`, so every Convex site in the browser uses\nthe same ID.\n\nWhen this helper returns a value, consent has been granted. Pass that ID to a\nthird-party tool so you can match that tool's events or sessions, such as a\nsupport chat, back to the same visitor in PostHog.\n\nIt's expected that a call on first load is always `undefined`, so call again\nafter consent is granted.\n\nIt returns one of:\n\n- **`undefined`**. PostHog is not initialized (localhost, non-production, or\n  still loading), or consent has not been granted. Before consent, PostHog\n  still has a cookieless ID, but it is not stable across sites or even page\n  reloads, so returning it would create noise rather than being useful.\n- **Anonymous UUID**, such as `\"019a7d8f-9190-7844-a5c0-73d461a3a5d1\"`.\n  Consent has been granted but this browser has not logged into the\n  dashboard where the user is identified.\n- **Convex profile ID**, such as `\"4281\"`. Consent has been granted and this\n  browser has logged into the dashboard.\n\n### Consent banner\n\nThe banner is visible when `consent` is `\"undecided\"`. It is hidden while\n`consent` is `\"unknown\"`, `\"consented\"`, or `\"declined\"`.\n\nTheme with `--wa-banner-*` variables on `.wa-banner`:\n\n```css\n.wa-banner {\n  --wa-banner-background-color: var(--color-seashell);\n  --wa-banner-font-family: var(--font-primary);\n  --wa-banner-accept-background-color: var(--color-plum-p4);\n}\n```\n\n- Background, text, and border: `--wa-banner-background-color`,\n  `--wa-banner-text-color`, `--wa-banner-border-color`,\n  `--wa-banner-border-radius`, `--wa-banner-box-shadow`,\n  `--wa-banner-backdrop-filter`\n- Type and layout: `--wa-banner-font-family`, `--wa-banner-font-size`,\n  `--wa-banner-padding`, `--wa-banner-max-width`, `--wa-banner-action-gap`,\n  `--wa-banner-z-index`\n- Link and focus: `--wa-banner-link-color`, `--wa-banner-focus-color`\n- Buttons: `--wa-banner-button-border-radius`, `--wa-banner-button-padding`,\n  `--wa-banner-button-min-height`, `--wa-banner-button-font-size`,\n  `--wa-banner-button-font-weight`\n- Accept button: `--wa-banner-accept-background-color`, `--wa-banner-accept-text-color`\n- Decline button: `--wa-banner-decline-background-color`,\n  `--wa-banner-decline-text-color`\n\nButtons default to 80% opacity and go to 100% on hover or keyboard focus.\n\n### Consent events\n\n`cookie_consent_shown` is recorded when the banner appears.\n`cookie_consent_decided` is recorded with\n`{ decision: \"accepted\" | \"declined\", source: \"banner\" }` just before the\nchoice is saved, and with `{ decision: \"declined\", source: \"gpc\" }` when\nthe GPC preference is applied. Historic events without `source` are banner\ndecisions.\n\n### Cookie behavior\n\nOnce the cookie has been read, `consent` is resolved in this order:\n\n1. **Global Privacy Control.** If `navigator.globalPrivacyControl === true`,\n   `consent` is `\"declined\"`. GPC is not stored: the cookie is not written or\n   changed. Turn GPC off and the stored cookie (if set) applies again.\n2. **Cookie.** `true` is `\"consented\"`, `false` is `\"declined\"`, and a missing\n   or unrecognized value is `\"undecided\"`.\n\nThe cookie is stored with `path=/` and a max-age of one year. On `convex.dev`\nand `*.convex.dev` it is also set with `domain=.convex.dev` so the website,\nDocs, Stack, and other subdomains share one choice. The cookie is marked\n`Secure` everywhere except localhost.\n\nChanges made through `setConsent` update immediately. Changes made\nelsewhere, such as in another tab or DevTools, are synchronized through cookie\nchange events when available, and when the window regains focus or its\nvisibility changes as a fallback.\n\n## React\n\nImport from `@convex-internal/web-analytics/react`.\n`WebAnalyticsProvider` is a client component. `useConsent` throws if called\noutside that provider.\n\n```tsx\nimport { WebAnalyticsProvider } from \"@convex-internal/web-analytics/react\";\n\n<WebAnalyticsProvider>{children}</WebAnalyticsProvider>;\n```\n\n### `Consented`\n\nRenders children only when `consent` is `\"consented\"`. It renders nothing during\nSSR, while consent is still `\"unknown\"` or `\"undecided\"`, if the visitor\ndeclined, or while Global Privacy Control is on.\n\n```tsx\nimport { Consented } from \"@convex-internal/web-analytics/react\";\n\n<Consented>\n  <YourAnalyticsScripts />\n</Consented>;\n```\n\n### `useConsent`\n\n- `consent` (`ConsentStatus`)\n  - `\"unknown\"` until cookie has been read (SSR and first client render)\n  - `\"undecided\"` after that if there is no recognized choice yet\n  - `\"consented\"` if the cookie is `true` and GPC is not set\n  - `\"declined\"` if the cookie is `false` or GPC is set\n- `setConsent(\"consented\" | \"declined\")`\n  - Saves the choice to the `allowsCookies` cookie and updates context\n  - Do not write the cookie yourself\n\nUse the hook when you need `consent` or `setConsent` directly. Enable tracking\nonly when `consent === \"consented\"`.\n\n## Svelte\n\nThe Svelte entry exports only `WebAnalytics`. Render it once in the root\nlayout. It has no props and no snippet: it starts PostHog and shows the banner.\nThere is no `Consented` wrapper or consent store. Those can be added later;\nnothing using the Svelte entry has needed them yet.\n\n```svelte\n<script>\n  import { WebAnalytics } from \"@convex-internal/web-analytics/svelte\";\n</script>\n\n<WebAnalytics />\n```\n\n## Test in-development changes\n\n1. In the `web-analytics` repo, build and pack the package:\n\n```bash\ncd /path/to/web-analytics\nnpm run build\nnpm pack\n```\n\nThis creates a tarball such as `convex-internal-web-analytics-1.0.0.tgz`.\n\n1. Install that tarball in the consuming app:\n\n```bash\ncd /path/to/consuming-app\nnpm install /path/to/web-analytics/convex-internal-web-analytics-1.0.0.tgz --force\n```\n\n`--force` ensures npm refreshes the package when the filename and version have\nnot changed.\n\n## Publish a version to npm\n\n1. Confirm that you are signed in to the npm account with access to the\n   `@convex-internal` organization:\n\n```bash\nnpm whoami\n```\n\nRun `npm login` first if needed.\n\n1. Commit any README or code changes, then bump the version. `npm version`\n   requires a clean Git worktree and creates a version commit and tag.\n\n```bash\nnpm version major   # breaking, or 0.x → 1.0.0\nnpm version minor   # new backwards-compatible functionality\nnpm version patch   # bug fixes\n```\n\n1. Run tests, inspect the package contents, then publish. `.npmrc` sets\n   `ignore-scripts=true`, so `prepack` will not run — build first:\n\n```bash\nnpm test\nnpm run build\nnpm pack --dry-run\nnpm publish\n```\n\n## Consume a published version\n\nConvex repos typically set `min-release-age=7` in `.npmrc`, so a version\npublished in the last 7 days will fail to install. Override the window for that\none install:\n\n```bash\nnpm install @convex-internal/web-analytics@<version> --min-release-age=0\n```\n\nUse the local tarball workflow whenever you need to test changes that have\nnot been published yet.\n","readmeFilename":"README.md"}