✨ feat(legal-terms): add the cookie consent banner alongside the policy - #108
Merged
Merged
Conversation
The banner makes the same promises the Terms and the Privacy Policy make, in a smaller box, and links to them — so it ships from the same package, and the two stay one thing to maintain. - `src/cookie-consent.ts` — the consent record and its localStorage, exported from the framework-free root so analytics gating and server code can read the choice without pulling React in. "Reject" records essential cookies only rather than nothing; a malformed record, and a browser that refuses storage at either the property access or the call, read as no decision instead of throwing. - `src/react/CookieConsent.tsx` — the banner, Tailwind-styled and dark-mode ready like the page beside it, taking its copy, links, labels and storage key from props. `heightVar` publishes its measured height so other bottom-right chrome can sit above it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q5gjihR6tDv5ah4GHbwfQq
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…-legal-terms-ozu2eb # Conflicts: # packages/legal-terms-privacy-policy/package.json
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
This branch had an error being deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The cookie consent banner makes the same promises the Terms and the Privacy Policy make, in a smaller box, and links to them. Shipping it from this package is what keeps the corner card and the legal page from drifting apart — the same reason the two variants of the document live together here.
Ported from the hand-written popup in the QwkSearch web app (
OpenSourceAGI/qwksearch-research-agent), generalized to props and styled to match this package's page.What's new
src/cookie-consent.ts— the consent record and itslocalStorage, exported from the framework-free root so analytics gating, a worker or a build script can read the choice without pulling React in:The record is
{ analytics, marketing, functional, timestamp }. "Reject" records essential cookies only rather than nothing —functionalstays true, since rejecting it would be rejecting the login — and the timestamp is what proves when consent was given. A malformed or half-written record, and a browser that refuses storage at either the property access or the call, both read as no decision rather than throwing.src/react/CookieConsent.tsx— the banner, Tailwind-styled and dark-mode ready like the page beside it.appName,links,title/message,acceptLabel/rejectLabel,storageKey,dismissibleandonDecisionare all props;heightVarpublishes the banner's measured height into a CSS custom property on<html>while it is up, so other bottom-right chrome can offset by it instead of sitting underneath.It shows only when no decision is on record, and that check runs in an effect — so it renders to nothing on the server, and a cached page never shows it to someone who already answered.
Also updated
readme.mdprose andskills/legal-terms-privacy-policy/SKILL.md— the banner, its props, the stored record, and four new troubleshooting rows..claude/packages/legal-terms-privacy-policy/CLAUDE.md— notes that the record's shape and itscookie-consentkey are a compatibility surface (widen it, don't re-key it), and why the consent tests stublocalStorage.0.1.34→0.2.0— new public exports.Testing
bun run test— 51 pass, 3 files. The consent tests stublocalStorageand server-render the banner rather than adding jsdom to a package whose suite runs innode. They cover separate storage keys, a malformed record, a missing timestamp, storage that refuses every call, and no storage at all.bun run typecheckclean;bun run readmes:checkreports every header up to date; the CLI still renders.One bug surfaced while writing the tests and is fixed here: an
onDecision?.(writeCookieConsent(...))shape would have skipped the write entirely whenever no handler was passed, because an optional call does not evaluate its arguments.🤖 Generated with Claude Code
https://claude.ai/code/session_01Q5gjihR6tDv5ah4GHbwfQq
Generated by Claude Code