@tantainnovative/ndpr-toolkit 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -14
- package/dist/components/breach-notification/BreachNotificationForm.d.ts +18 -0
- package/dist/components/breach-notification/BreachNotificationForm.d.ts.map +1 -0
- package/dist/components/consent/ConsentBanner.d.ts +30 -0
- package/dist/components/consent/ConsentBanner.d.ts.map +1 -0
- package/dist/components/consent/ConsentManager.d.ts +51 -0
- package/dist/components/consent/ConsentManager.d.ts.map +1 -0
- package/dist/components/consent/ConsentSettings.d.ts +15 -0
- package/dist/components/consent/ConsentSettings.d.ts.map +1 -0
- package/dist/components/consent/unstyled/UnstyledConsentBanner.d.ts +7 -0
- package/dist/components/consent/unstyled/UnstyledConsentBanner.d.ts.map +1 -0
- package/dist/components/consent/unstyled/UnstyledConsentSettings.d.ts +7 -0
- package/dist/components/consent/unstyled/UnstyledConsentSettings.d.ts.map +1 -0
- package/dist/components/consent/unstyled/UnstyledConsentToggle.d.ts +8 -0
- package/dist/components/consent/unstyled/UnstyledConsentToggle.d.ts.map +1 -0
- package/dist/components/consent/unstyled/index.d.ts +4 -0
- package/dist/components/consent/unstyled/index.d.ts.map +1 -0
- package/dist/components/data-subject-rights/DataSubjectRequestForm.d.ts +14 -0
- package/dist/components/data-subject-rights/DataSubjectRequestForm.d.ts.map +1 -0
- package/dist/components/docs/DocLayout.d.ts +9 -0
- package/dist/components/docs/DocLayout.d.ts.map +1 -0
- package/dist/components/docs/index.d.ts +2 -0
- package/dist/components/docs/index.d.ts.map +1 -0
- package/dist/components/dpia/DPIAQuestionnaire.d.ts +9 -0
- package/dist/components/dpia/DPIAQuestionnaire.d.ts.map +1 -0
- package/dist/components/privacy-policy/PolicyGenerator.d.ts +12 -0
- package/dist/components/privacy-policy/PolicyGenerator.d.ts.map +1 -0
- package/dist/components/privacy-policy/data.d.ts +8 -0
- package/dist/components/privacy-policy/data.d.ts.map +1 -0
- package/dist/components/privacy-policy/shared/CheckboxField.d.ts +13 -0
- package/dist/components/privacy-policy/shared/CheckboxField.d.ts.map +1 -0
- package/dist/components/privacy-policy/shared/CheckboxGroup.d.ts +13 -0
- package/dist/components/privacy-policy/shared/CheckboxGroup.d.ts.map +1 -0
- package/dist/components/privacy-policy/shared/FormField.d.ts +13 -0
- package/dist/components/privacy-policy/shared/FormField.d.ts.map +1 -0
- package/dist/components/privacy-policy/shared/StepIndicator.d.ts +8 -0
- package/dist/components/privacy-policy/shared/StepIndicator.d.ts.map +1 -0
- package/dist/components/privacy-policy/steps/CustomSectionsStep.d.ts +15 -0
- package/dist/components/privacy-policy/steps/CustomSectionsStep.d.ts.map +1 -0
- package/dist/components/privacy-policy/steps/DataCollectionStep.d.ts +20 -0
- package/dist/components/privacy-policy/steps/DataCollectionStep.d.ts.map +1 -0
- package/dist/components/privacy-policy/steps/DataSharingStep.d.ts +34 -0
- package/dist/components/privacy-policy/steps/DataSharingStep.d.ts.map +1 -0
- package/dist/components/privacy-policy/steps/OrganizationInfoStep.d.ts +17 -0
- package/dist/components/privacy-policy/steps/OrganizationInfoStep.d.ts.map +1 -0
- package/dist/components/privacy-policy/steps/PolicyPreviewStep.d.ts +30 -0
- package/dist/components/privacy-policy/steps/PolicyPreviewStep.d.ts.map +1 -0
- package/dist/components/ui/Badge.d.ts +10 -0
- package/dist/components/ui/Badge.d.ts.map +1 -0
- package/dist/components/ui/Button.d.ts +11 -0
- package/dist/components/ui/Button.d.ts.map +1 -0
- package/dist/components/ui/Card.d.ts +10 -0
- package/dist/components/ui/Card.d.ts.map +1 -0
- package/dist/components/ui/Checkbox.d.ts +8 -0
- package/dist/components/ui/Checkbox.d.ts.map +1 -0
- package/dist/components/ui/FormField.d.ts +11 -0
- package/dist/components/ui/FormField.d.ts.map +1 -0
- package/dist/components/ui/Input.d.ts +6 -0
- package/dist/components/ui/Input.d.ts.map +1 -0
- package/dist/components/ui/Select.d.ts +6 -0
- package/dist/components/ui/Select.d.ts.map +1 -0
- package/dist/components/ui/TextArea.d.ts +6 -0
- package/dist/components/ui/TextArea.d.ts.map +1 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/label.d.ts +5 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/switch.d.ts +5 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/tabs.d.ts +8 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/contexts/ConsentContext.d.ts +35 -0
- package/dist/contexts/ConsentContext.d.ts.map +1 -0
- package/dist/contexts/GenericConsentContext.d.ts +11 -0
- package/dist/contexts/GenericConsentContext.d.ts.map +1 -0
- package/dist/hooks/useConsent.d.ts +12 -0
- package/dist/hooks/useConsent.d.ts.map +1 -0
- package/dist/hooks/useConsentActions.d.ts +12 -0
- package/dist/hooks/useConsentActions.d.ts.map +1 -0
- package/dist/hooks/useConsentManager.d.ts +14 -0
- package/dist/hooks/useConsentManager.d.ts.map +1 -0
- package/dist/hooks/useConsentState.d.ts +10 -0
- package/dist/hooks/useConsentState.d.ts.map +1 -0
- package/dist/index.d.mts +256 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/consentService.d.ts +11 -0
- package/dist/lib/consentService.d.ts.map +1 -0
- package/dist/lib/dpiaQuestions.d.ts +3 -0
- package/dist/lib/dpiaQuestions.d.ts.map +1 -0
- package/dist/lib/requestService.d.ts +10 -0
- package/dist/lib/requestService.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/styles.css +38 -0
- package/dist/types/consent.d.ts +57 -0
- package/dist/types/consent.d.ts.map +1 -0
- package/dist/types/index.d.ts +91 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/unstyled.d.mts +22 -0
- package/dist/unstyled.d.ts +2 -0
- package/dist/unstyled.d.ts.map +1 -0
- package/dist/unstyled.js +2 -0
- package/dist/unstyled.js.map +1 -0
- package/dist/unstyled.mjs +2 -0
- package/dist/unstyled.mjs.map +1 -0
- package/package.json +33 -5
- package/CHANGELOG.md +0 -16
- package/CNAME +0 -1
- package/CONTRIBUTING.md +0 -87
- package/RELEASE-NOTES-v1.0.0.md +0 -140
- package/RELEASE-NOTES-v1.0.1.md +0 -69
- package/SECURITY.md +0 -21
- package/components.json +0 -21
- package/eslint.config.mjs +0 -16
- package/next-env.d.ts +0 -5
- package/next.config.js +0 -15
- package/next.config.ts +0 -62
- package/packages/ndpr-toolkit/README.md +0 -467
- package/packages/ndpr-toolkit/dist/components/breach/BreachNotificationManager.d.ts +0 -62
- package/packages/ndpr-toolkit/dist/components/breach/BreachReportForm.d.ts +0 -66
- package/packages/ndpr-toolkit/dist/components/breach/BreachRiskAssessment.d.ts +0 -50
- package/packages/ndpr-toolkit/dist/components/breach/RegulatoryReportGenerator.d.ts +0 -94
- package/packages/ndpr-toolkit/dist/components/consent/ConsentBanner.d.ts +0 -79
- package/packages/ndpr-toolkit/dist/components/consent/ConsentManager.d.ts +0 -73
- package/packages/ndpr-toolkit/dist/components/consent/ConsentStorage.d.ts +0 -41
- package/packages/ndpr-toolkit/dist/components/dpia/DPIAQuestionnaire.d.ts +0 -70
- package/packages/ndpr-toolkit/dist/components/dpia/DPIAReport.d.ts +0 -40
- package/packages/ndpr-toolkit/dist/components/dpia/StepIndicator.d.ts +0 -64
- package/packages/ndpr-toolkit/dist/components/dsr/DSRDashboard.d.ts +0 -58
- package/packages/ndpr-toolkit/dist/components/dsr/DSRRequestForm.d.ts +0 -74
- package/packages/ndpr-toolkit/dist/components/dsr/DSRTracker.d.ts +0 -56
- package/packages/ndpr-toolkit/dist/components/policy/PolicyExporter.d.ts +0 -65
- package/packages/ndpr-toolkit/dist/components/policy/PolicyGenerator.d.ts +0 -54
- package/packages/ndpr-toolkit/dist/components/policy/PolicyPreview.d.ts +0 -71
- package/packages/ndpr-toolkit/dist/hooks/useBreach.d.ts +0 -97
- package/packages/ndpr-toolkit/dist/hooks/useConsent.d.ts +0 -63
- package/packages/ndpr-toolkit/dist/hooks/useDPIA.d.ts +0 -92
- package/packages/ndpr-toolkit/dist/hooks/useDSR.d.ts +0 -72
- package/packages/ndpr-toolkit/dist/hooks/usePrivacyPolicy.d.ts +0 -87
- package/packages/ndpr-toolkit/dist/index.d.ts +0 -31
- package/packages/ndpr-toolkit/dist/index.esm.js +0 -2
- package/packages/ndpr-toolkit/dist/index.esm.js.map +0 -1
- package/packages/ndpr-toolkit/dist/index.js +0 -2
- package/packages/ndpr-toolkit/dist/index.js.map +0 -1
- package/packages/ndpr-toolkit/dist/setupTests.d.ts +0 -2
- package/packages/ndpr-toolkit/dist/types/breach.d.ts +0 -239
- package/packages/ndpr-toolkit/dist/types/consent.d.ts +0 -95
- package/packages/ndpr-toolkit/dist/types/dpia.d.ts +0 -196
- package/packages/ndpr-toolkit/dist/types/dsr.d.ts +0 -162
- package/packages/ndpr-toolkit/dist/types/privacy.d.ts +0 -204
- package/packages/ndpr-toolkit/dist/utils/breach.d.ts +0 -14
- package/packages/ndpr-toolkit/dist/utils/consent.d.ts +0 -10
- package/packages/ndpr-toolkit/dist/utils/dpia.d.ts +0 -12
- package/packages/ndpr-toolkit/dist/utils/dsr.d.ts +0 -11
- package/packages/ndpr-toolkit/dist/utils/privacy.d.ts +0 -12
- package/packages/ndpr-toolkit/package-lock.json +0 -8197
- package/packages/ndpr-toolkit/package.json +0 -71
- package/packages/ndpr-toolkit/rollup.config.js +0 -34
- package/packages/ndpr-toolkit/src/components/breach/BreachNotificationManager.tsx +0 -701
- package/packages/ndpr-toolkit/src/components/breach/BreachReportForm.tsx +0 -631
- package/packages/ndpr-toolkit/src/components/breach/BreachRiskAssessment.tsx +0 -569
- package/packages/ndpr-toolkit/src/components/breach/RegulatoryReportGenerator.tsx +0 -496
- package/packages/ndpr-toolkit/src/components/consent/ConsentBanner.tsx +0 -270
- package/packages/ndpr-toolkit/src/components/consent/ConsentManager.tsx +0 -217
- package/packages/ndpr-toolkit/src/components/consent/ConsentStorage.tsx +0 -206
- package/packages/ndpr-toolkit/src/components/dpia/DPIAQuestionnaire.tsx +0 -342
- package/packages/ndpr-toolkit/src/components/dpia/DPIAReport.tsx +0 -373
- package/packages/ndpr-toolkit/src/components/dpia/StepIndicator.tsx +0 -174
- package/packages/ndpr-toolkit/src/components/dsr/DSRDashboard.tsx +0 -717
- package/packages/ndpr-toolkit/src/components/dsr/DSRRequestForm.tsx +0 -476
- package/packages/ndpr-toolkit/src/components/dsr/DSRTracker.tsx +0 -620
- package/packages/ndpr-toolkit/src/components/policy/PolicyExporter.tsx +0 -541
- package/packages/ndpr-toolkit/src/components/policy/PolicyGenerator.tsx +0 -454
- package/packages/ndpr-toolkit/src/components/policy/PolicyPreview.tsx +0 -333
- package/packages/ndpr-toolkit/src/hooks/useBreach.ts +0 -409
- package/packages/ndpr-toolkit/src/hooks/useConsent.ts +0 -263
- package/packages/ndpr-toolkit/src/hooks/useDPIA.ts +0 -457
- package/packages/ndpr-toolkit/src/hooks/useDSR.ts +0 -236
- package/packages/ndpr-toolkit/src/hooks/usePrivacyPolicy.ts +0 -428
- package/packages/ndpr-toolkit/src/index.ts +0 -44
- package/packages/ndpr-toolkit/src/setupTests.ts +0 -5
- package/packages/ndpr-toolkit/src/types/breach.ts +0 -283
- package/packages/ndpr-toolkit/src/types/consent.ts +0 -111
- package/packages/ndpr-toolkit/src/types/dpia.ts +0 -236
- package/packages/ndpr-toolkit/src/types/dsr.ts +0 -192
- package/packages/ndpr-toolkit/src/types/index.ts +0 -42
- package/packages/ndpr-toolkit/src/types/privacy.ts +0 -246
- package/packages/ndpr-toolkit/src/utils/breach.ts +0 -122
- package/packages/ndpr-toolkit/src/utils/consent.ts +0 -51
- package/packages/ndpr-toolkit/src/utils/dpia.ts +0 -104
- package/packages/ndpr-toolkit/src/utils/dsr.ts +0 -77
- package/packages/ndpr-toolkit/src/utils/privacy.ts +0 -100
- package/packages/ndpr-toolkit/tsconfig.json +0 -23
- package/postcss.config.mjs +0 -5
- package/public/NDPR TOOLKIT.svg +0 -1
- package/public/favicon/android-chrome-192x192.png +0 -0
- package/public/favicon/android-chrome-512x512.png +0 -0
- package/public/favicon/apple-touch-icon.png +0 -0
- package/public/favicon/favicon-16x16.png +0 -0
- package/public/favicon/favicon-32x32.png +0 -0
- package/public/favicon/site.webmanifest +0 -1
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/ndpr-toolkit-logo.svg +0 -108
- package/public/next.svg +0 -1
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/src/app/accessibility.css +0 -70
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +0 -123
- package/src/app/layout.tsx +0 -37
- package/src/app/ndpr-demos/breach/page.tsx +0 -354
- package/src/app/ndpr-demos/consent/page.tsx +0 -366
- package/src/app/ndpr-demos/dpia/page.tsx +0 -495
- package/src/app/ndpr-demos/dsr/page.tsx +0 -280
- package/src/app/ndpr-demos/page.tsx +0 -73
- package/src/app/ndpr-demos/policy/page.tsx +0 -771
- package/src/app/page.tsx +0 -452
- package/src/components/ErrorBoundary.tsx +0 -90
- package/src/components/breach-notification/BreachNotificationForm.tsx +0 -479
- package/src/components/consent/ConsentBanner.tsx +0 -193
- package/src/components/data-subject-rights/DataSubjectRequestForm.tsx +0 -530
- package/src/components/dpia/DPIAQuestionnaire.tsx +0 -523
- package/src/components/privacy-policy/PolicyGenerator.tsx +0 -1062
- package/src/components/privacy-policy/data.ts +0 -98
- package/src/components/privacy-policy/shared/CheckboxField.tsx +0 -38
- package/src/components/privacy-policy/shared/CheckboxGroup.tsx +0 -85
- package/src/components/privacy-policy/shared/FormField.tsx +0 -79
- package/src/components/privacy-policy/shared/StepIndicator.tsx +0 -86
- package/src/components/privacy-policy/steps/CustomSectionsStep.tsx +0 -361
- package/src/components/privacy-policy/steps/DataCollectionStep.tsx +0 -231
- package/src/components/privacy-policy/steps/DataSharingStep.tsx +0 -418
- package/src/components/privacy-policy/steps/OrganizationInfoStep.tsx +0 -202
- package/src/components/privacy-policy/steps/PolicyPreviewStep.tsx +0 -226
- package/src/components/ui/Badge.tsx +0 -46
- package/src/components/ui/Button.tsx +0 -59
- package/src/components/ui/Card.tsx +0 -92
- package/src/components/ui/Checkbox.tsx +0 -57
- package/src/components/ui/FormField.tsx +0 -50
- package/src/components/ui/Input.tsx +0 -38
- package/src/components/ui/Loading.tsx +0 -201
- package/src/components/ui/Select.tsx +0 -42
- package/src/components/ui/TextArea.tsx +0 -38
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/switch.tsx +0 -31
- package/src/components/ui/tabs.tsx +0 -66
- package/src/hooks/useConsent.ts +0 -70
- package/src/hooks/useLoadingState.ts +0 -85
- package/src/lib/consentService.ts +0 -144
- package/src/lib/dpiaQuestions.ts +0 -188
- package/src/lib/requestService.ts +0 -79
- package/src/lib/sanitize.ts +0 -108
- package/src/lib/storage.ts +0 -222
- package/src/lib/utils.ts +0 -6
- package/src/types/html-to-docx.d.ts +0 -30
- package/src/types/index.ts +0 -77
- package/tailwind.config.ts +0 -65
- package/tsconfig.json +0 -41
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var C=require('react'),reactSlot=require('@radix-ui/react-slot'),classVarianceAuthority=require('class-variance-authority'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),j=require('@radix-ui/react-switch'),uuid=require('uuid');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var C__namespace=/*#__PURE__*/_interopNamespace(C);var j__namespace=/*#__PURE__*/_interopNamespace(j);var Se=Object.defineProperty,xe=Object.defineProperties;var we=Object.getOwnPropertyDescriptors;var H=Object.getOwnPropertySymbols;var re=Object.prototype.hasOwnProperty,ie=Object.prototype.propertyIsEnumerable;var se=(e,n,o)=>n in e?Se(e,n,{enumerable:true,configurable:true,writable:true,value:o}):e[n]=o,a=(e,n)=>{for(var o in n||(n={}))re.call(n,o)&&se(e,o,n[o]);if(H)for(var o of H(n))ie.call(n,o)&&se(e,o,n[o]);return e},T=(e,n)=>xe(e,we(n));var x=(e,n)=>{var o={};for(var t in e)re.call(e,t)&&n.indexOf(t)<0&&(o[t]=e[t]);if(e!=null&&H)for(var t of H(e))n.indexOf(t)<0&&ie.call(e,t)&&(o[t]=e[t]);return o};var Y=C.createContext(void 0),le={necessary:true,analytics:false,marketing:false,functional:false};function G({children:e,initialConsent:n={},onConsentChange:o,storageKey:t="ndpr-consent"}){let[s,l]=C.useState(()=>{if(typeof window!="undefined"){let S=localStorage.getItem(t);if(S)try{let N=JSON.parse(S);return a(a({},le),N)}catch(N){console.error("Failed to parse consent from localStorage",N);}}return a(a({},le),n)}),[r,d]=C.useState(()=>typeof window!="undefined"?localStorage.getItem(`${t}-set`)==="true":false),[i,c]=C.useState(!r),[f,u]=C.useState(false);C.useEffect(()=>{typeof window!="undefined"&&r&&(localStorage.setItem(t,JSON.stringify(s)),localStorage.setItem(`${t}-set`,"true"));},[s,r,t]),C.useEffect(()=>{r&&o&&o(s);},[s,r,o]);let k=C.useCallback(()=>{l({necessary:true,analytics:true,marketing:true,functional:true}),d(true),c(false),u(false);},[]),F=C.useCallback(()=>{l({necessary:true,analytics:false,marketing:false,functional:false}),d(true),c(false),u(false);},[]),E=C.useCallback(S=>{l(N=>T(a(a({},N),S),{necessary:true})),d(true),c(false),u(false);},[]),$=C.useCallback((S,N)=>{S!=="necessary"&&l(W=>T(a({},W),{[S]:N}));},[]),B=C.useCallback(()=>{u(true),c(false);},[]),_=C.useCallback(()=>{u(false);},[]),R={hasUserConsented:r,consentState:s,showBanner:i,showSettings:f,acceptAll:k,rejectAll:F,savePreferences:E,openSettings:B,closeSettings:_,updateConsent:$};return C__namespace.default.createElement(Y.Provider,{value:R},e)}function g(){let e=C.useContext(Y);if(!e)throw new Error("useConsent must be used within a ConsentProvider");return e}function Ee(){let e=C.createContext(void 0);function n({children:t,initialConsent:s={},onConsentChange:l,storageKey:r="ndpr-consent",categories:d}){let i=()=>{let p={necessary:true};return d?d.forEach(m=>{m.id!=="necessary"&&(p[m.id]=false);}):(p.analytics=false,p.marketing=false,p.functional=false),p},[c,f]=C.useState(()=>{if(typeof window!="undefined"){let p=localStorage.getItem(r);if(p)try{let m=JSON.parse(p);return a(a({},i()),m)}catch(m){console.error("Failed to parse consent from localStorage",m);}}return a(a({},i()),s)}),[u,k]=C.useState(()=>typeof window!="undefined"?localStorage.getItem(`${r}-set`)==="true":false),[F,E]=C.useState(!u),[$,B]=C.useState(false);C.useEffect(()=>{typeof window!="undefined"&&u&&(localStorage.setItem(r,JSON.stringify(c)),localStorage.setItem(`${r}-set`,"true"));},[c,u,r]),C.useEffect(()=>{u&&l&&l(c);},[c,u,l]);let _=C.useCallback(()=>{let p=a({},c);Object.keys(p).forEach(m=>{p[m]=true;}),f(p),k(true),E(false),B(false);},[c]),R=C.useCallback(()=>{let p=a({},c);Object.keys(p).forEach(m=>{m!=="necessary"&&(p[m]=false);}),f(p),k(true),E(false),B(false);},[c]),S=C.useCallback(p=>{f(m=>T(a(a({},m),p),{necessary:true})),k(true),E(false),B(false);},[]),N=C.useCallback((p,m)=>{p!=="necessary"&&f(be=>T(a({},be),{[p]:m}));},[]),W=C.useCallback(()=>{B(true),E(false);},[]),ye=C.useCallback(()=>{B(false);},[]),he={hasUserConsented:u,consentState:c,showBanner:F,showSettings:$,acceptAll:_,rejectAll:R,savePreferences:S,openSettings:W,closeSettings:ye,updateConsent:N};return C__namespace.default.createElement(e.Provider,{value:he},t)}function o(){let t=C.useContext(e);if(!t)throw new Error("useConsent must be used within a ConsentProvider");return t}return {ConsentContext:e,ConsentProvider:n,useConsent:o}}function v(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var Oe=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function A(l){var r=l,{className:e,variant:n,size:o,asChild:t=false}=r,s=x(r,["className","variant","size","asChild"]);return C__namespace.createElement(t?reactSlot.Slot:"button",a({"data-slot":"button",className:v(Oe({variant:n,size:o,className:e}))},s))}var U=({renderBanner:e,theme:n,position:o="bottom",animation:t="slide",fullWidth:s=true,maxWidth:l="1200px",unstyled:r=false,className:d,children:i})=>{let{showBanner:c,acceptAll:f,rejectAll:u,openSettings:k}=g();return c?e?C__namespace.default.createElement(C__namespace.default.Fragment,null,e({onAcceptAll:f,onRejectAll:u,onOpenSettings:k})):i?C__namespace.default.createElement("div",{className:v(!r&&["fixed z-50 p-4",o==="bottom"&&"bottom-0 left-0 right-0",o==="top"&&"top-0 left-0 right-0",o==="center"&&"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",t==="slide"&&"animate-slide-in",t==="fade"&&"animate-fade-in"],d),style:{backgroundColor:r?void 0:(n==null?void 0:n.backgroundColor)||"white",color:r||n==null?void 0:n.textColor,maxWidth:s?void 0:l,margin:s?void 0:"0 auto"}},i):C__namespace.default.createElement("div",{className:v("fixed z-50 p-4",o==="bottom"&&"bottom-0 left-0 right-0",o==="top"&&"top-0 left-0 right-0",o==="center"&&"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",t==="slide"&&"animate-slide-in",t==="fade"&&"animate-fade-in",d),style:{backgroundColor:(n==null?void 0:n.backgroundColor)||"white",color:n==null?void 0:n.textColor}},C__namespace.default.createElement("div",{className:"mx-auto",style:{maxWidth:s?void 0:l}},C__namespace.default.createElement("div",{className:"bg-white rounded-lg shadow-lg p-6"},C__namespace.default.createElement("h3",{className:"text-lg font-semibold mb-2"},"Cookie Consent"),C__namespace.default.createElement("p",{className:"text-gray-600 mb-4"},"We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies."),C__namespace.default.createElement("div",{className:"flex gap-3 flex-wrap"},C__namespace.default.createElement(A,{onClick:f,style:{backgroundColor:n==null?void 0:n.primaryColor}},"Accept All"),C__namespace.default.createElement(A,{onClick:u,variant:"outline"},"Reject All"),C__namespace.default.createElement(A,{onClick:k,variant:"ghost"},"Manage Preferences"))))):null};U.Message=({children:e,className:n})=>C__namespace.default.createElement("div",{className:v("mb-4",n)},e);U.Actions=({children:e,className:n})=>C__namespace.default.createElement("div",{className:v("flex gap-3 flex-wrap",n)},e);function fe(o){var t=o,{className:e}=t,n=x(t,["className"]);return C__namespace.createElement(j__namespace.Root,a({"data-slot":"switch",className:v("peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",e)},n),C__namespace.createElement(j__namespace.Thumb,{"data-slot":"switch-thumb",className:v("bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0")}))}var q=({open:e,onOpenChange:n,children:o})=>e?C__namespace.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center"},C__namespace.createElement("div",{className:"fixed inset-0 bg-black/50",onClick:()=>n==null?void 0:n(false)}),o):null,L=C__namespace.forwardRef((l,s)=>{var r=l,{className:e,children:n,unstyled:o}=r,t=x(r,["className","children","unstyled"]);return C__namespace.createElement("div",a({ref:s,className:v(!o&&"relative z-50 grid w-full max-w-lg gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg",e)},t),n)});L.displayName="DialogContent";var X=o=>{var t=o,{className:e}=t,n=x(t,["className"]);return C__namespace.createElement("div",a({className:v("flex flex-col space-y-1.5 text-center sm:text-left",e)},n))};X.displayName="DialogHeader";var Z=C__namespace.forwardRef((t,o)=>{var s=t,{className:e}=s,n=x(s,["className"]);return C__namespace.createElement("h3",a({ref:o,className:v("text-lg font-semibold leading-none tracking-tight",e)},n))});Z.displayName="DialogTitle";var K=C__namespace.forwardRef((t,o)=>{var s=t,{className:e}=s,n=x(s,["className"]);return C__namespace.createElement("p",a({ref:o,className:v("text-sm text-muted-foreground",e)},n))});K.displayName="DialogDescription";var Ie=[{id:"necessary",name:"Necessary Cookies",description:"These cookies are essential for the website to function properly.",disabled:true},{id:"analytics",name:"Analytics Cookies",description:"These cookies help us understand how visitors interact with our website.",disabled:false},{id:"marketing",name:"Marketing Cookies",description:"These cookies are used to track visitors across websites for marketing purposes.",disabled:false},{id:"functional",name:"Functional Cookies",description:"These cookies enable personalized features and functionality.",disabled:false}],J=({renderSettings:e,theme:n,unstyled:o=false,className:t,children:s})=>{let{showSettings:l,consentState:r,updateConsent:d,savePreferences:i,closeSettings:c}=g();if(!l)return null;let f=()=>{i(r);};return e?C__namespace.default.createElement(C__namespace.default.Fragment,null,e({consentState:r,onUpdateConsent:d,onSave:f,onClose:c})):s?C__namespace.default.createElement(q,{open:l,onOpenChange:c},C__namespace.default.createElement(L,{className:t,unstyled:o},s)):C__namespace.default.createElement(q,{open:l,onOpenChange:c},C__namespace.default.createElement(L,{className:"max-w-2xl"},C__namespace.default.createElement(X,null,C__namespace.default.createElement(Z,null,"Cookie Preferences"),C__namespace.default.createElement(K,null,"Manage your cookie preferences. You can enable or disable different categories of cookies below.")),C__namespace.default.createElement("div",{className:"space-y-6 py-4"},Ie.map(u=>C__namespace.default.createElement("div",{key:u.id,className:"flex items-start justify-between space-x-4"},C__namespace.default.createElement("div",{className:"flex-1"},C__namespace.default.createElement("h4",{className:"font-medium mb-1"},u.name),C__namespace.default.createElement("p",{className:"text-sm text-gray-600"},u.description)),C__namespace.default.createElement(fe,{checked:r[u.id],onCheckedChange:k=>d(u.id,k),disabled:u.disabled})))),C__namespace.default.createElement("div",{className:"flex justify-end gap-3 pt-4 border-t"},C__namespace.default.createElement(A,{variant:"outline",onClick:c},"Cancel"),C__namespace.default.createElement(A,{onClick:f,style:{backgroundColor:n==null?void 0:n.primaryColor}},"Save Preferences"))))};var je=({children:e,headless:n=false,renderBanner:o,renderSettings:t,components:s,theme:l,position:r="bottom",animation:d="slide",fullWidth:i=true,maxWidth:c="1200px"})=>{let f=g();if(typeof e=="function"){let u={consents:f.consentState,actions:{acceptAll:f.acceptAll,rejectAll:f.rejectAll,savePreferences:f.savePreferences,updateConsent:f.updateConsent,openSettings:f.openSettings,closeSettings:f.closeSettings},ui:{showBanner:f.showBanner,showSettings:f.showSettings,openSettings:f.openSettings,closeSettings:f.closeSettings}};return C__namespace.default.createElement(C__namespace.default.Fragment,null,e(u))}return C__namespace.default.createElement(C__namespace.default.Fragment,null,e,!n&&C__namespace.default.createElement(C__namespace.default.Fragment,null,s!=null&&s.Banner?C__namespace.default.createElement(s.Banner,null):C__namespace.default.createElement(U,{renderBanner:o,theme:l,position:r,animation:d,fullWidth:i,maxWidth:c}),s!=null&&s.Settings?C__namespace.default.createElement(s.Settings,null):C__namespace.default.createElement(J,{renderSettings:t,theme:l})))},ee=l=>{var r=l,{children:e,initialConsent:n,onConsentChange:o,storageKey:t}=r,s=x(r,["children","initialConsent","onConsentChange","storageKey"]);return C__namespace.default.createElement(G,{initialConsent:n,onConsentChange:o,storageKey:t},C__namespace.default.createElement(je,a({},s),e))};ee.Banner=U;ee.Settings=J;var ue=({className:e,children:n})=>{let{showBanner:o,acceptAll:t,rejectAll:s,openSettings:l}=g();return o?C__namespace.default.createElement("div",{className:e,role:"region","aria-label":"Cookie consent"},n||C__namespace.default.createElement(C__namespace.default.Fragment,null,C__namespace.default.createElement("div",null,C__namespace.default.createElement("h3",null,"Cookie Consent"),C__namespace.default.createElement("p",null,"We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.")),C__namespace.default.createElement("div",null,C__namespace.default.createElement("button",{onClick:t,"aria-label":"Accept all cookies"},"Accept All"),C__namespace.default.createElement("button",{onClick:s,"aria-label":"Reject non-essential cookies"},"Reject All"),C__namespace.default.createElement("button",{onClick:l,"aria-label":"Manage cookie preferences"},"Manage Preferences")))):null};var Le=[{id:"necessary",name:"Necessary Cookies",description:"These cookies are essential for the website to function properly.",disabled:true},{id:"analytics",name:"Analytics Cookies",description:"These cookies help us understand how visitors interact with our website.",disabled:false},{id:"marketing",name:"Marketing Cookies",description:"These cookies are used to track visitors across websites for marketing purposes.",disabled:false},{id:"functional",name:"Functional Cookies",description:"These cookies enable personalized features and functionality.",disabled:false}],pe=({className:e,children:n})=>{let{showSettings:o,consentState:t,updateConsent:s,savePreferences:l,closeSettings:r}=g();if(!o)return null;let d=()=>{l(t);};return C__namespace.default.createElement("div",{className:e,role:"dialog","aria-label":"Cookie preferences"},n||C__namespace.default.createElement(C__namespace.default.Fragment,null,C__namespace.default.createElement("div",null,C__namespace.default.createElement("h2",null,"Cookie Preferences"),C__namespace.default.createElement("p",null,"Manage your cookie preferences. You can enable or disable different categories of cookies below.")),C__namespace.default.createElement("div",null,Le.map(i=>C__namespace.default.createElement("div",{key:i.id},C__namespace.default.createElement("div",null,C__namespace.default.createElement("h4",null,i.name),C__namespace.default.createElement("p",null,i.description)),C__namespace.default.createElement("input",{type:"checkbox",checked:t[i.id],onChange:c=>s(i.id,c.target.checked),disabled:i.disabled,"aria-label":`Toggle ${i.name}`})))),C__namespace.default.createElement("div",null,C__namespace.default.createElement("button",{onClick:r,"aria-label":"Cancel changes"},"Cancel"),C__namespace.default.createElement("button",{onClick:d,"aria-label":"Save cookie preferences"},"Save Preferences"))))};var ge=({category:e,className:n,label:o})=>{let{consentState:t,updateConsent:s}=g();return C__namespace.default.createElement("label",{className:n},C__namespace.default.createElement("input",{type:"checkbox",checked:t[e],onChange:l=>s(e,l.target.checked),"aria-label":o||`Toggle ${e} cookies`}),o&&C__namespace.default.createElement("span",null,o))};function Je(){let{hasUserConsented:e,consentState:n,showBanner:o,showSettings:t}=g();return {hasUserConsented:e,consentState:n,showBanner:o,showSettings:t}}function ze(){let{acceptAll:e,rejectAll:n,savePreferences:o,openSettings:t,closeSettings:s,updateConsent:l}=g();return {acceptAll:e,rejectAll:n,savePreferences:o,openSettings:t,closeSettings:s,updateConsent:l}}function Fe(){let e=g(),n=C.useRef(new Map),o=C.useRef({hasUserConsented:e.hasUserConsented,showBanner:e.showBanner,showSettings:e.showSettings,consentState:e.consentState}),t=C.useCallback((r,d)=>{let i=n.current.get(r);i&&i.forEach(c=>c(d));},[]),s=C.useCallback((r,d)=>(n.current.has(r)||n.current.set(r,new Set),n.current.get(r).add(d),()=>{let i=n.current.get(r);i&&i.delete(d);}),[]),l=C.useCallback((r,d)=>{let i=n.current.get(r);i&&i.delete(d);},[]);return C.useEffect(()=>{let r=o.current;if(!r.hasUserConsented&&e.hasUserConsented){let d=Object.entries(e.consentState).filter(([i])=>i!=="necessary").every(([,i])=>i);t(d?"consent:accepted":"consent:rejected",e.consentState);}r.hasUserConsented&&e.hasUserConsented&&JSON.stringify(r.consentState)!==JSON.stringify(e.consentState)&&t("consent:updated",e.consentState),!r.showBanner&&e.showBanner?t("banner:shown"):r.showBanner&&!e.showBanner&&t("banner:hidden"),!r.showSettings&&e.showSettings?t("settings:opened"):r.showSettings&&!e.showSettings&&t("settings:closed"),o.current={hasUserConsented:e.hasUserConsented,showBanner:e.showBanner,showSettings:e.showSettings,consentState:a({},e.consentState)};},[e,t]),T(a({},e),{on:s,off:l,emit:t})}var z="ndpr_consent_records",V="ndpr_consent_history",oe=()=>{if(typeof window=="undefined")return [];let e=localStorage.getItem(V);if(!e)return [];try{return JSON.parse(e)}catch(n){return console.error("Error parsing consent history:",n),[]}},ve={saveConsent:(e,n)=>{let o={id:uuid.v4(),userId:n,consents:e,timestamp:new Date().toISOString(),ipAddress:"Collected server-side in real implementation",userAgent:typeof window!="undefined"?window.navigator.userAgent:"Unknown"};if(typeof window!="undefined"){localStorage.setItem(z,JSON.stringify(o));let t=oe();t.push(o),localStorage.setItem(V,JSON.stringify(t));}return o},getCurrentConsent:()=>{if(typeof window=="undefined")return null;let e=localStorage.getItem(z);if(!e)return null;try{return JSON.parse(e)}catch(n){return console.error("Error parsing consent record:",n),null}},getConsentHistory:()=>oe(),updateConsent:(e,n,o)=>{let t={id:uuid.v4(),userId:o,consents:e,timestamp:new Date().toISOString(),ipAddress:"Collected server-side in real implementation",userAgent:typeof window!="undefined"?window.navigator.userAgent:"Unknown",changeReason:n};if(typeof window!="undefined"){localStorage.setItem(z,JSON.stringify(t));let s=oe();s.push(t),localStorage.setItem(V,JSON.stringify(s));}return t},clearConsentData:()=>{typeof window!="undefined"&&(localStorage.removeItem(z),localStorage.removeItem(V));},hasConsent:e=>{let n=ve.getCurrentConsent();return n?n.consents[e]===true:false}};var at={set:(e,n,o)=>{if(typeof window=="undefined")return;let t=new Date;t.setTime(t.getTime()+o*24*60*60*1e3);let s=`expires=${t.toUTCString()}`;document.cookie=`${e}=${n};${s};path=/`;},get:e=>{if(typeof window=="undefined")return null;let n=`${e}=`,o=document.cookie.split(";");for(let t=0;t<o.length;t++){let s=o[t];for(;s.charAt(0)===" ";)s=s.substring(1,s.length);if(s.indexOf(n)===0)return s.substring(n.length,s.length)}return null},delete:e=>{typeof window!="undefined"&&(document.cookie=`${e}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`);}},lt={save:(e,n)=>{typeof window!="undefined"&&localStorage.setItem(e,JSON.stringify(n));},load:e=>{if(typeof window=="undefined")return null;let n=localStorage.getItem(e);return n?JSON.parse(n):null},remove:e=>{typeof window!="undefined"&&localStorage.removeItem(e);}};exports.ConsentBanner=U;exports.ConsentContext=Y;exports.ConsentManager=ee;exports.ConsentProvider=G;exports.ConsentSettings=J;exports.UnstyledConsentBanner=ue;exports.UnstyledConsentSettings=pe;exports.UnstyledConsentToggle=ge;exports.consentService=ve;exports.consentStorage=lt;exports.cookieUtils=at;exports.createConsentContext=Ee;exports.useConsent=g;exports.useConsentActions=ze;exports.useConsentManager=Fe;exports.useConsentState=Je;//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/ConsentContext.tsx","../src/contexts/GenericConsentContext.tsx","../src/lib/utils.ts","../src/components/ui/Button.tsx","../src/components/consent/ConsentBanner.tsx","../src/components/ui/switch.tsx","../src/components/ui/dialog.tsx","../src/components/consent/ConsentSettings.tsx","../src/components/consent/ConsentManager.tsx","../src/components/consent/unstyled/UnstyledConsentBanner.tsx","../src/components/consent/unstyled/UnstyledConsentSettings.tsx","../src/components/consent/unstyled/UnstyledConsentToggle.tsx","../src/hooks/useConsentState.ts","../src/hooks/useConsentActions.ts","../src/hooks/useConsentManager.ts","../src/lib/consentService.ts","../src/index.ts"],"names":["ConsentContext","createContext","defaultConsent","ConsentProvider","children","initialConsent","onConsentChange","storageKey","consentState","setConsentState","useState","stored","parsed","__spreadValues","e","hasUserConsented","setHasUserConsented","showBanner","setShowBanner","showSettings","setShowSettings","useEffect","acceptAll","useCallback","rejectAll","savePreferences","preferences","prev","__spreadProps","updateConsent","category","value","openSettings","closeSettings","React","useConsent","context","useContext","createConsentContext","categories","getDefaultConsent","cat","newConsent","key","cn","inputs","twMerge","clsx","buttonVariants","cva","Button","_a","_b","className","variant","size","asChild","props","__objRest","de","Slot","ConsentBanner","renderBanner","theme","position","animation","fullWidth","maxWidth","unstyled","Switch","Q","j","Dialog","open","onOpenChange","w","DialogContent","ref","DialogHeader","DialogTitle","DialogDescription","cookieCategories","ConsentSettings","renderSettings","handleSave","checked","ConsentManagerInner","headless","components","consent","renderProps","ConsentManager","innerProps","UnstyledConsentBanner","UnstyledConsentSettings","UnstyledConsentToggle","label","useConsentState","useConsentActions","useConsentManager","listenersRef","useRef","previousStateRef","emit","event","data","listeners","listener","on","off","allAccepted","CONSENT_STORAGE_KEY","CONSENT_HISTORY_KEY","getConsentHistoryHelper","storedHistory","error","consentService","consents","userId","consentRecord","uuidv4","history","storedConsent","changeReason","type","current","cookieUtils","name","days","date","expires","nameEQ","ca","i","c","consentStorage"],"mappings":"wpBAAA,IAAA,EAAA,CAAA,MAAA,CAAA,cAAA,CAAA,EAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,IAAA,EAAA,CAAA,MAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,qBAAA,CAAA,IAAA,EAAA,CAAA,MAAA,CAAA,SAAA,CAAA,cAAA,CAAA,EAAA,CAAA,MAAA,CAAA,SAAA,CAAA,oBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,IAAA,CAAA,YAAA,CAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,EAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,EAAA,IAAA,EAAA,CAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,KA4BMA,CAAAA,CAAiBC,eAAAA,CAA+C,MAAS,CAAA,CASzEC,EAAAA,CAAoC,CACxC,SAAA,CAAW,IAAA,CACX,SAAA,CAAW,KAAA,CACX,UAAW,KAAA,CACX,UAAA,CAAY,KACd,EAEO,SAASC,EAAgB,CAC9B,QAAA,CAAAC,EACA,cAAA,CAAAC,CAAAA,CAAiB,EAAC,CAClB,eAAA,CAAAC,EACA,UAAA,CAAAC,CAAAA,CAAa,cACf,CAAA,CAAyB,CACvB,GAAM,CAACC,EAAcC,CAAe,CAAA,CAAIC,WAA4B,IAAM,CAExE,GAAI,OAAO,MAAA,EAAW,YAAa,CACjC,IAAMC,EAAS,YAAA,CAAa,OAAA,CAAQJ,CAAU,CAAA,CAC9C,GAAII,EACF,GAAI,CACF,IAAMC,CAAAA,CAAS,IAAA,CAAK,MAAMD,CAAM,CAAA,CAChC,OAAOE,CAAAA,CAAAA,CAAAA,CAAA,EAAA,CAAKX,IAAmBU,CAAAA,CACjC,CAAA,MAASE,EAAG,CACV,OAAA,CAAQ,MAAM,2CAAA,CAA6CA,CAAC,EAC9D,CAEJ,CACA,OAAOD,CAAAA,CAAAA,CAAAA,CAAA,EAAA,CAAKX,EAAAA,CAAAA,CAAmBG,CAAAA,CACjC,CAAC,CAAA,CAEK,CAACU,EAAkBC,CAAmB,CAAA,CAAIN,WAAS,IACnD,OAAO,QAAW,WAAA,CACb,YAAA,CAAa,QAAQ,CAAA,EAAGH,CAAU,MAAM,CAAA,GAAM,MAAA,CAEhD,KACR,CAAA,CAEK,CAACU,CAAAA,CAAYC,CAAa,EAAIR,UAAAA,CAAS,CAACK,CAAgB,CAAA,CACxD,CAACI,EAAcC,CAAe,CAAA,CAAIV,WAAS,KAAK,CAAA,CAGtDW,YAAU,IAAM,CACV,OAAO,MAAA,EAAW,WAAA,EAAeN,IACnC,YAAA,CAAa,OAAA,CAAQR,CAAAA,CAAY,IAAA,CAAK,UAAUC,CAAY,CAAC,EAC7D,YAAA,CAAa,OAAA,CAAQ,GAAGD,CAAU,CAAA,IAAA,CAAA,CAAQ,MAAM,CAAA,EAEpD,CAAA,CAAG,CAACC,CAAAA,CAAcO,CAAAA,CAAkBR,CAAU,CAAC,CAAA,CAG/Cc,YAAU,IAAM,CACVN,GAAoBT,CAAAA,EACtBA,CAAAA,CAAgBE,CAAY,EAEhC,CAAA,CAAG,CAACA,CAAAA,CAAcO,CAAAA,CAAkBT,CAAe,CAAC,CAAA,CAEpD,IAAMgB,CAAAA,CAAYC,aAAAA,CAAY,IAAM,CAOlCd,CAAAA,CANsC,CACpC,SAAA,CAAW,IAAA,CACX,UAAW,IAAA,CACX,SAAA,CAAW,IAAA,CACX,UAAA,CAAY,IACd,CAC0B,CAAA,CAC1BO,EAAoB,IAAI,CAAA,CACxBE,EAAc,KAAK,CAAA,CACnBE,EAAgB,KAAK,EACvB,EAAG,EAAE,EAECI,CAAAA,CAAYD,aAAAA,CAAY,IAAM,CAOlCd,CAAAA,CANsC,CACpC,SAAA,CAAW,KACX,SAAA,CAAW,KAAA,CACX,UAAW,KAAA,CACX,UAAA,CAAY,KACd,CAC0B,CAAA,CAC1BO,EAAoB,IAAI,CAAA,CACxBE,EAAc,KAAK,CAAA,CACnBE,EAAgB,KAAK,EACvB,EAAG,EAAE,CAAA,CAECK,CAAAA,CAAkBF,cAAaG,CAAAA,EAA4C,CAC/EjB,EAAgBkB,CAAAA,EAASC,CAAAA,CAAAf,IAAA,EAAA,CACpBc,CAAAA,CAAAA,CACAD,GAFoB,CAGvB,SAAA,CAAW,IACb,CAAA,CAAE,CAAA,CACFV,EAAoB,IAAI,CAAA,CACxBE,EAAc,KAAK,CAAA,CACnBE,EAAgB,KAAK,EACvB,EAAG,EAAE,EAECS,CAAAA,CAAgBN,aAAAA,CAAY,CAACO,CAAAA,CAAmCC,CAAAA,GAAmB,CACnFD,CAAAA,GAAa,WAAA,EAEjBrB,EAAgBkB,CAAAA,EAASC,CAAAA,CAAAf,EAAA,EAAA,CACpBc,CAAAA,CAAAA,CADoB,CAEvB,CAACG,CAAQ,EAAGC,CACd,EAAE,EACJ,CAAA,CAAG,EAAE,CAAA,CAECC,EAAeT,aAAAA,CAAY,IAAM,CACrCH,CAAAA,CAAgB,IAAI,EACpBF,CAAAA,CAAc,KAAK,EACrB,CAAA,CAAG,EAAE,CAAA,CAECe,CAAAA,CAAgBV,cAAY,IAAM,CACtCH,EAAgB,KAAK,EACvB,EAAG,EAAE,EAECW,CAAAA,CAA6B,CACjC,iBAAAhB,CAAAA,CACA,YAAA,CAAAP,EACA,UAAA,CAAAS,CAAAA,CACA,aAAAE,CAAAA,CACA,SAAA,CAAAG,EACA,SAAA,CAAAE,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,aAAAO,CAAAA,CACA,aAAA,CAAAC,EACA,aAAA,CAAAJ,CACF,EAEA,OACEK,oBAAAA,CAAA,cAAClC,CAAAA,CAAe,QAAA,CAAf,CAAwB,KAAA,CAAO+B,CAAAA,CAAAA,CAC7B3B,CACH,CAEJ,CAEO,SAAS+B,CAAAA,EAAa,CAC3B,IAAMC,CAAAA,CAAUC,YAAAA,CAAWrC,CAAc,CAAA,CACzC,GAAI,CAACoC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,kDAAkD,EAEpE,OAAOA,CACT,CC/JO,SAASE,EAAAA,EAAmF,CACjG,IAAMtC,CAAAA,CAAiBC,eAAAA,CAAkD,MAAS,CAAA,CAElF,SAASE,EAAgB,CACvB,QAAA,CAAAC,EACA,cAAA,CAAAC,CAAAA,CAAiB,EAAC,CAClB,eAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,EAAa,cAAA,CACb,UAAA,CAAAgC,CACF,CAAA,CAA4B,CAC1B,IAAMC,CAAAA,CAAoB,IAAS,CACjC,IAAMtC,CAAAA,CAAsB,CAAE,SAAA,CAAW,IAAK,EAE9C,OAAIqC,CAAAA,CACFA,EAAW,OAAA,CAAQE,CAAAA,EAAO,CACpBA,CAAAA,CAAI,KAAO,WAAA,GACbvC,CAAAA,CAAeuC,EAAI,EAAE,CAAA,CAAI,OAE7B,CAAC,CAAA,EAGDvC,EAAe,SAAA,CAAY,KAAA,CAC3BA,EAAe,SAAA,CAAY,KAAA,CAC3BA,EAAe,UAAA,CAAa,KAAA,CAAA,CAGvBA,CACT,CAAA,CAEM,CAACM,EAAcC,CAAe,CAAA,CAAIC,WAAY,IAAM,CAExD,GAAI,OAAO,MAAA,EAAW,YAAa,CACjC,IAAMC,EAAS,YAAA,CAAa,OAAA,CAAQJ,CAAU,CAAA,CAC9C,GAAII,EACF,GAAI,CACF,IAAMC,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMD,CAAM,EAChC,OAAOE,CAAAA,CAAAA,CAAAA,CAAA,GAAK2B,CAAAA,EAAkB,CAAA,CAAM5B,EACtC,CAAA,MAASE,CAAAA,CAAG,CACV,OAAA,CAAQ,KAAA,CAAM,4CAA6CA,CAAC,EAC9D,CAEJ,CACA,OAAOD,IAAA,EAAA,CAAK2B,CAAAA,IAAwBnC,CAAAA,CACtC,CAAC,EAEK,CAACU,CAAAA,CAAkBC,CAAmB,CAAA,CAAIN,UAAAA,CAAS,IACnD,OAAO,MAAA,EAAW,YACb,YAAA,CAAa,OAAA,CAAQ,GAAGH,CAAU,CAAA,IAAA,CAAM,IAAM,MAAA,CAEhD,KACR,EAEK,CAACU,CAAAA,CAAYC,CAAa,CAAA,CAAIR,WAAS,CAACK,CAAgB,EACxD,CAACI,CAAAA,CAAcC,CAAe,CAAA,CAAIV,UAAAA,CAAS,KAAK,CAAA,CAGtDW,WAAAA,CAAU,IAAM,CACV,OAAO,QAAW,WAAA,EAAeN,CAAAA,GACnC,aAAa,OAAA,CAAQR,CAAAA,CAAY,KAAK,SAAA,CAAUC,CAAY,CAAC,CAAA,CAC7D,YAAA,CAAa,QAAQ,CAAA,EAAGD,CAAU,OAAQ,MAAM,CAAA,EAEpD,EAAG,CAACC,CAAAA,CAAcO,EAAkBR,CAAU,CAAC,EAG/Cc,WAAAA,CAAU,IAAM,CACVN,CAAAA,EAAoBT,CAAAA,EACtBA,CAAAA,CAAgBE,CAAY,EAEhC,CAAA,CAAG,CAACA,EAAcO,CAAAA,CAAkBT,CAAe,CAAC,CAAA,CAEpD,IAAMgB,EAAYC,aAAAA,CAAY,IAAM,CAClC,IAAMmB,CAAAA,CAAa7B,EAAA,EAAA,CAAKL,CAAAA,CAAAA,CACxB,OAAO,IAAA,CAAKkC,CAAU,CAAA,CAAE,OAAA,CAAQC,GAAO,CACrCD,CAAAA,CAAWC,CAAc,CAAA,CAAI,KAC/B,CAAC,CAAA,CACDlC,CAAAA,CAAgBiC,CAAU,CAAA,CAC1B1B,CAAAA,CAAoB,IAAI,CAAA,CACxBE,CAAAA,CAAc,KAAK,CAAA,CACnBE,CAAAA,CAAgB,KAAK,EACvB,CAAA,CAAG,CAACZ,CAAY,CAAC,CAAA,CAEXgB,CAAAA,CAAYD,cAAY,IAAM,CAClC,IAAMmB,CAAAA,CAAa7B,CAAAA,CAAA,GAAKL,CAAAA,CAAAA,CACxB,MAAA,CAAO,KAAKkC,CAAU,CAAA,CAAE,QAAQC,CAAAA,EAAO,CACjCA,IAAQ,WAAA,GACVD,CAAAA,CAAWC,CAAc,CAAA,CAAI,KAAA,EAEjC,CAAC,CAAA,CACDlC,CAAAA,CAAgBiC,CAAU,CAAA,CAC1B1B,CAAAA,CAAoB,IAAI,CAAA,CACxBE,CAAAA,CAAc,KAAK,CAAA,CACnBE,CAAAA,CAAgB,KAAK,EACvB,CAAA,CAAG,CAACZ,CAAY,CAAC,EAEXiB,CAAAA,CAAkBF,aAAAA,CAAaG,CAAAA,EAA4B,CAC/DjB,EAAgBkB,CAAAA,EAASC,CAAAA,CAAAf,IAAA,EAAA,CACpBc,CAAAA,CAAAA,CACAD,GAFoB,CAGvB,SAAA,CAAW,IACb,CAAA,CAAO,CAAA,CACPV,EAAoB,IAAI,CAAA,CACxBE,EAAc,KAAK,CAAA,CACnBE,EAAgB,KAAK,EACvB,EAAG,EAAE,EAECS,CAAAA,CAAgBN,aAAAA,CAAY,CAACO,CAAAA,CAAmBC,CAAAA,GAAmB,CACnED,CAAAA,GAAa,WAAA,EAEjBrB,EAAgBkB,EAAAA,EAASC,CAAAA,CAAAf,EAAA,EAAA,CACpBc,EAAAA,CAAAA,CADoB,CAEvB,CAACG,CAAQ,EAAGC,CACd,CAAA,CAAE,EACJ,CAAA,CAAG,EAAE,CAAA,CAECC,EAAeT,aAAAA,CAAY,IAAM,CACrCH,CAAAA,CAAgB,IAAI,EACpBF,CAAAA,CAAc,KAAK,EACrB,CAAA,CAAG,EAAE,CAAA,CAECe,EAAAA,CAAgBV,cAAY,IAAM,CACtCH,EAAgB,KAAK,EACvB,EAAG,EAAE,EAECW,EAAAA,CAAgC,CACpC,iBAAAhB,CAAAA,CACA,YAAA,CAAAP,EACA,UAAA,CAAAS,CAAAA,CACA,aAAAE,CAAAA,CACA,SAAA,CAAAG,EACA,SAAA,CAAAE,CAAAA,CACA,gBAAAC,CAAAA,CACA,YAAA,CAAAO,CAAAA,CACA,aAAA,CAAAC,GACA,aAAA,CAAAJ,CACF,EAEA,OACEK,oBAAAA,CAAA,cAAClC,CAAAA,CAAe,QAAA,CAAf,CAAwB,KAAA,CAAO+B,EAAAA,CAAAA,CAC7B3B,CACH,CAEJ,CAEA,SAAS+B,CAAAA,EAAa,CACpB,IAAMC,CAAAA,CAAUC,YAAAA,CAAWrC,CAAc,CAAA,CACzC,GAAI,CAACoC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAEpE,OAAOA,CACT,CAEA,OAAO,CACL,cAAA,CAAApC,CAAAA,CACA,gBAAAG,CAAAA,CACA,UAAA,CAAAgC,CACF,CACF,CCtKO,SAASS,KAAMC,CAAAA,CAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCCA,IAAMG,EAAAA,CAAiBC,2BACrB,6bAAA,CACA,CACE,SAAU,CACR,OAAA,CAAS,CACP,OAAA,CACE,kEAAA,CACF,WAAA,CACE,6JAAA,CACF,QACE,uIAAA,CACF,SAAA,CACE,yEACF,KAAA,CACE,sEAAA,CACF,KAAM,iDACR,CAAA,CACA,KAAM,CACJ,OAAA,CAAS,gCACT,EAAA,CAAI,+CAAA,CACJ,GAAI,sCAAA,CACJ,IAAA,CAAM,QACR,CACF,CAAA,CACA,gBAAiB,CACf,OAAA,CAAS,UACT,IAAA,CAAM,SACR,CACF,CACF,CAAA,CAEA,SAASC,CAAAA,CAAOC,CAAAA,CASX,CATW,IAAAC,CAAAA,CAAAD,EACd,CAAA,SAAA,CAAAE,CAAAA,CACA,QAAAC,CAAAA,CACA,IAAA,CAAAC,EACA,OAAA,CAAAC,CAAAA,CAAU,KAzCZ,CAAA,CAqCgBJ,EAKXK,CAAAA,CAAAC,CAAAA,CALWN,EAKX,CAJH,WAAA,CACA,UACA,MAAA,CACA,SAAA,CAAA,CAAA,CAQA,OACEO,YAAA,CAAA,aAAA,CAHWH,CAAAA,CAAUI,eAAO,QAAA,CAG3B/C,CAAAA,CAAA,CACC,WAAA,CAAU,QAAA,CACV,UAAW+B,CAAAA,CAAGI,EAAAA,CAAe,CAAE,OAAA,CAAAM,CAAAA,CAAS,KAAAC,CAAAA,CAAM,SAAA,CAAAF,CAAU,CAAC,CAAC,GACtDI,CAAAA,CACN,CAEJ,CC7BA,IAAMI,CAAAA,CAAwC,CAAC,CAC7C,YAAA,CAAAC,EACA,KAAA,CAAAC,CAAAA,CACA,SAAAC,CAAAA,CAAW,QAAA,CACX,SAAA,CAAAC,CAAAA,CAAY,QACZ,SAAA,CAAAC,CAAAA,CAAY,KACZ,QAAA,CAAAC,CAAAA,CAAW,SACX,QAAA,CAAAC,CAAAA,CAAW,MACX,SAAA,CAAAf,CAAAA,CACA,SAAAjD,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,WAAAa,CAAAA,CAAY,SAAA,CAAAK,CAAAA,CAAW,SAAA,CAAAE,EAAW,YAAA,CAAAQ,CAAa,EAAIG,CAAAA,EAAW,CAEtE,OAAKlB,CAAAA,CAGD6C,CAAAA,CACK5B,qBAAA,aAAA,CAAAA,oBAAAA,CAAA,cAAG4B,CAAAA,CAAa,CAAE,YAAaxC,CAAAA,CAAW,WAAA,CAAaE,EAAW,cAAA,CAAgBQ,CAAa,CAAC,CAAE,EAIvG5B,CAAAA,CAEA8B,oBAAAA,CAAA,cAAC,KAAA,CAAA,CACC,SAAA,CAAWU,EACT,CAACwB,CAAAA,EAAY,CACX,gBAAA,CACAJ,CAAAA,GAAa,UAAY,yBAAA,CACzBA,CAAAA,GAAa,OAAS,sBAAA,CACtBA,CAAAA,GAAa,UAAY,oDAAA,CACzBC,CAAAA,GAAc,SAAW,kBAAA,CACzBA,CAAAA,GAAc,QAAU,iBAC1B,CAAA,CACAZ,CACF,CAAA,CACA,KAAA,CAAO,CACL,eAAA,CAAiBe,CAAAA,CAAW,QAAYL,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,EAAO,eAAA,GAAmB,OAAA,CAClE,MAAOK,CAAAA,EAAuBL,CAAAA,EAAA,KAAZ,MAAA,CAAYA,CAAAA,CAAO,SAAA,CACrC,QAAA,CAAUG,EAAY,MAAA,CAAYC,CAAAA,CAClC,OAAQD,CAAAA,CAAY,MAAA,CAAY,QAClC,CAAA,CAAA,CAEC9D,CACH,EAMF8B,oBAAAA,CAAA,aAAA,CAAC,OACC,SAAA,CAAWU,CAAAA,CACT,iBACAoB,CAAAA,GAAa,QAAA,EAAY,0BACzBA,CAAAA,GAAa,KAAA,EAAS,uBACtBA,CAAAA,GAAa,QAAA,EAAY,qDACzBC,CAAAA,GAAc,OAAA,EAAW,mBACzBA,CAAAA,GAAc,MAAA,EAAU,kBACxBZ,CACF,CAAA,CACA,MAAO,CACL,eAAA,CAAA,CAAiBU,GAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAO,kBAAmB,OAAA,CAC3C,KAAA,CAAOA,GAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAO,SAChB,CAAA,CAAA,CAEA7B,qBAAA,aAAA,CAAC,KAAA,CAAA,CACC,UAAU,SAAA,CACV,KAAA,CAAO,CACL,QAAA,CAAUgC,CAAAA,CAAY,OAAYC,CACpC,CAAA,CAAA,CAEAjC,qBAAA,aAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mCAAA,CAAA,CACbA,oBAAAA,CAAA,cAAC,IAAA,CAAA,CAAG,SAAA,CAAU,8BAA6B,gBAAc,CAAA,CACzDA,qBAAA,aAAA,CAAC,GAAA,CAAA,CAAE,UAAU,oBAAA,CAAA,CAAqB,8GAElC,EACAA,oBAAAA,CAAA,aAAA,CAAC,OAAI,SAAA,CAAU,sBAAA,CAAA,CACbA,qBAAA,aAAA,CAACgB,CAAAA,CAAA,CACC,OAAA,CAAS5B,CAAAA,CACT,MAAO,CAAE,eAAA,CAAiByC,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,EAAO,YAAa,CAAA,CAAA,CAC/C,YAED,CAAA,CACA7B,oBAAAA,CAAA,cAACgB,CAAAA,CAAA,CACC,QAAS1B,CAAAA,CACT,OAAA,CAAQ,WACT,YAED,CAAA,CACAU,qBAAA,aAAA,CAACgB,CAAAA,CAAA,CACC,OAAA,CAASlB,CAAAA,CACT,OAAA,CAAQ,OAAA,CAAA,CACT,oBAED,CACF,CACF,CACF,CACF,CAAA,CApFsB,IAsF1B,EAGA6B,CAAAA,CAAc,QAAU,CAAC,CAAE,SAAAzD,CAAAA,CAAU,SAAA,CAAAiD,CAAU,CAAA,GAC7CnB,oBAAAA,CAAA,cAAC,KAAA,CAAA,CAAI,SAAA,CAAWU,CAAAA,CAAG,MAAA,CAAQS,CAAS,CAAA,CAAA,CAAIjD,CAAS,EAGnDyD,CAAAA,CAAc,OAAA,CAAU,CAAC,CAAE,QAAA,CAAAzD,EAAU,SAAA,CAAAiD,CAAU,IAC7CnB,oBAAAA,CAAA,aAAA,CAAC,OAAI,SAAA,CAAWU,CAAAA,CAAG,uBAAwBS,CAAS,CAAA,CAAA,CAAIjD,CAAS,CAAA,CC/HnE,SAASiE,GAAOlB,CAAAA,CAGsC,CAHtC,IAAAC,CAAAA,CAAAD,CAAAA,CACd,WAAAE,CARF,CAAA,CAOgBD,EAEXK,CAAAA,CAAAC,CAAAA,CAFWN,CAAAA,CAEX,CADH,cAGA,OACEkB,YAAA,CAAA,aAAA,CAAiBC,kBAAhB1D,CAAAA,CAAA,CACC,YAAU,QAAA,CACV,SAAA,CAAW+B,EACT,2WAAA,CACAS,CACF,GACII,CAAAA,CAAAA,CAEJa,YAAA,CAAA,aAAA,CAAiBC,mBAAhB,CACC,WAAA,CAAU,eACV,SAAA,CAAW3B,CAAAA,CACT,0QACF,CAAA,CACF,CACF,CAEJ,CCnBA,IAAM4B,EAAS,CAAC,CAAE,KAAAC,CAAAA,CAAM,YAAA,CAAAC,EAAc,QAAA,CAAAtE,CAAS,IACxCqE,CAAAA,CAGHE,YAAA,CAAA,aAAA,CAAC,OAAI,SAAA,CAAU,qDAAA,CAAA,CACbA,YAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CACC,UAAU,2BAAA,CACV,OAAA,CAAS,IAAMD,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,EAAe,KAAA,CAAA,CAChC,CAAA,CACCtE,CACH,CAAA,CATgB,IAAA,CAadwE,EAAsBD,YAAA,CAAA,UAAA,CAG1B,CAACxB,EAA6C0B,CAAAA,GAAK,CAAlD,IAAAzB,CAAAA,CAAAD,CAAAA,CAAE,WAAAE,CAAAA,CAAW,QAAA,CAAAjD,EAAU,QAAA,CAAAgE,CA1B1B,EA0BGhB,CAAAA,CAAoCK,CAAAA,CAAAC,EAApCN,CAAAA,CAAoC,CAAlC,YAAW,UAAA,CAAU,UAAA,CAAA,CAAA,CACxB,kCAAC,KAAA,CAAAvC,CAAAA,CAAA,CACC,GAAA,CAAKgE,CAAAA,CACL,UAAWjC,CAAAA,CACT,CAACwB,CAAAA,EAAY,6RAAA,CACbf,CACF,CAAA,CAAA,CACII,CAAAA,CAAAA,CAEHrD,CACH,CAAA,CACD,CAAA,CACDwE,EAAc,WAAA,CAAc,eAAA,CAE5B,IAAME,CAAAA,CAAgB3B,CAAAA,EAGmB,CAHnB,IAAAC,CAAAA,CAAAD,EACpB,CAAA,SAAA,CAAAE,CAzCF,EAwCsBD,CAAAA,CAEjBK,CAAAA,CAAAC,CAAAA,CAFiBN,CAAAA,CAEjB,CADH,WAAA,CAAA,CAAA,CAGA,OAAAuB,YAAA,CAAA,aAAA,CAAC,MAAA9D,CAAAA,CAAA,CACC,UAAW+B,CAAAA,CACT,oDAAA,CACAS,CACF,CAAA,CAAA,CACII,CAAAA,CACN,GAEFqB,CAAAA,CAAa,WAAA,CAAc,eAE3B,IAAMC,CAAAA,CAAoBJ,wBAGxB,CAACxB,CAAAA,CAAyB0B,CAAAA,GAAK,CAA9B,IAAAzB,CAAAA,CAAAD,CAAAA,CAAE,WAAAE,CAzDL,CAAA,CAyDGD,EAAgBK,CAAAA,CAAAC,CAAAA,CAAhBN,EAAgB,CAAd,WAAA,CAAA,CAAA,CACH,kCAAC,IAAA,CAAAvC,CAAAA,CAAA,CACC,GAAA,CAAKgE,CAAAA,CACL,UAAWjC,CAAAA,CACT,mDAAA,CACAS,CACF,CAAA,CAAA,CACII,CAAAA,CACN,EACD,CAAA,CACDsB,CAAAA,CAAY,YAAc,aAAA,CAE1B,IAAMC,EAA0BL,YAAA,CAAA,UAAA,CAG9B,CAACxB,EAAyB0B,CAAAA,GAAK,CAA9B,IAAAzB,CAAAA,CAAAD,CAAAA,CAAE,WAAAE,CAxEL,CAAA,CAwEGD,EAAgBK,CAAAA,CAAAC,CAAAA,CAAhBN,CAAAA,CAAgB,CAAd,cACH,OAAAuB,YAAA,CAAA,aAAA,CAAC,GAAA,CAAA9D,EAAA,CACC,GAAA,CAAKgE,EACL,SAAA,CAAWjC,CAAAA,CAAG,gCAAiCS,CAAS,CAAA,CAAA,CACpDI,EACN,CAAA,CACD,CAAA,CACDuB,EAAkB,WAAA,CAAc,mBAAA,KC5D1BC,EAAAA,CAAmB,CACvB,CACE,EAAA,CAAI,WAAA,CACJ,KAAM,mBAAA,CACN,WAAA,CAAa,oEACb,QAAA,CAAU,IACZ,EACA,CACE,EAAA,CAAI,YACJ,IAAA,CAAM,mBAAA,CACN,YAAa,0EAAA,CACb,QAAA,CAAU,KACZ,CAAA,CACA,CACE,GAAI,WAAA,CACJ,IAAA,CAAM,mBAAA,CACN,WAAA,CAAa,mFACb,QAAA,CAAU,KACZ,EACA,CACE,EAAA,CAAI,aACJ,IAAA,CAAM,oBAAA,CACN,YAAa,+DAAA,CACb,QAAA,CAAU,KACZ,CACF,CAAA,CAEaC,EAAkD,CAAC,CAC9D,eAAAC,CAAAA,CACA,KAAA,CAAApB,EACA,QAAA,CAAAK,CAAAA,CAAW,MACX,SAAA,CAAAf,CAAAA,CACA,SAAAjD,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,aAAAe,CAAAA,CAAc,YAAA,CAAAX,EAAc,aAAA,CAAAqB,CAAAA,CAAe,gBAAAJ,CAAAA,CAAiB,aAAA,CAAAQ,CAAc,CAAA,CAAIE,CAAAA,EAAW,CAEjG,GAAI,CAAChB,CAAAA,CAAc,OAAO,KAE1B,IAAMiE,CAAAA,CAAa,IAAM,CACvB3D,CAAAA,CAAgBjB,CAAY,EAC9B,CAAA,CAGA,OAAI2E,CAAAA,CAEAjD,oBAAAA,CAAA,cAAAA,oBAAAA,CAAA,QAAA,CAAA,IAAA,CACGiD,EAAe,CACd,YAAA,CAAA3E,CAAAA,CACA,eAAA,CAAiBqB,EACjB,MAAA,CAAQuD,CAAAA,CACR,QAASnD,CACX,CAAC,CACH,CAAA,CAKA7B,CAAAA,CAEA8B,qBAAA,aAAA,CAACsC,CAAAA,CAAA,CAAO,IAAA,CAAMrD,CAAAA,CAAc,aAAcc,CAAAA,CAAAA,CACxCC,oBAAAA,CAAA,cAAC0C,CAAAA,CAAA,CAAc,SAAA,CAAWvB,CAAAA,CAAW,SAAUe,CAAAA,CAAAA,CAC5ChE,CACH,CACF,CAAA,CAMF8B,oBAAAA,CAAA,cAACsC,CAAAA,CAAA,CAAO,KAAMrD,CAAAA,CAAc,YAAA,CAAcc,GACxCC,oBAAAA,CAAA,aAAA,CAAC0C,EAAA,CAAc,SAAA,CAAU,aACvB1C,oBAAAA,CAAA,aAAA,CAAC4C,EAAA,IAAA,CACC5C,oBAAAA,CAAA,cAAC6C,CAAAA,CAAA,IAAA,CAAY,oBAAkB,CAAA,CAC/B7C,oBAAAA,CAAA,cAAC8C,CAAAA,CAAA,IAAA,CAAkB,kGAEnB,CACF,CAAA,CAEA9C,qBAAA,aAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gBAAA,CAAA,CACZ+C,EAAAA,CAAiB,IAAKnD,CAAAA,EACrBI,oBAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,IAAKJ,CAAAA,CAAS,EAAA,CAAI,UAAU,4CAAA,CAAA,CAC/BI,oBAAAA,CAAA,cAAC,KAAA,CAAA,CAAI,SAAA,CAAU,UACbA,oBAAAA,CAAA,aAAA,CAAC,MAAG,SAAA,CAAU,kBAAA,CAAA,CAAoBJ,EAAS,IAAK,CAAA,CAChDI,qBAAA,aAAA,CAAC,GAAA,CAAA,CAAE,UAAU,uBAAA,CAAA,CAAyBJ,CAAAA,CAAS,WAAY,CAC7D,CAAA,CACAI,qBAAA,aAAA,CAACmC,EAAAA,CAAA,CACC,OAAA,CAAS7D,CAAAA,CAAasB,EAAS,EAA+B,CAAA,CAC9D,gBAAkBuD,CAAAA,EAAYxD,CAAAA,CAAcC,EAAS,EAAA,CAAiCuD,CAAO,EAC7F,QAAA,CAAUvD,CAAAA,CAAS,QAAA,CACrB,CACF,CACD,CACH,CAAA,CAEAI,qBAAA,aAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sCAAA,CAAA,CACbA,oBAAAA,CAAA,cAACgB,CAAAA,CAAA,CAAO,QAAQ,SAAA,CAAU,OAAA,CAASjB,GAAe,QAElD,CAAA,CACAC,qBAAA,aAAA,CAACgB,CAAAA,CAAA,CACC,OAAA,CAASkC,CAAAA,CACT,MAAO,CAAE,eAAA,CAAiBrB,GAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAO,YAAa,CAAA,CAAA,CAC/C,kBAED,CACF,CACF,CACF,CAEJ,ECxEA,IAAMuB,GAAyG,CAAC,CAC9G,SAAAlF,CAAAA,CACA,QAAA,CAAAmF,CAAAA,CAAW,KAAA,CACX,aAAAzB,CAAAA,CACA,cAAA,CAAAqB,EACA,UAAA,CAAAK,CAAAA,CACA,MAAAzB,CAAAA,CACA,QAAA,CAAAC,EAAW,QAAA,CACX,SAAA,CAAAC,EAAY,OAAA,CACZ,SAAA,CAAAC,EAAY,IAAA,CACZ,QAAA,CAAAC,EAAW,QACb,CAAA,GAAM,CACJ,IAAMsB,EAAUtD,CAAAA,EAAW,CAG3B,GAAI,OAAO/B,CAAAA,EAAa,WAAY,CAClC,IAAMsF,EAA2B,CAC/B,QAAA,CAAUD,EAAQ,YAAA,CAClB,OAAA,CAAS,CACP,SAAA,CAAWA,CAAAA,CAAQ,UACnB,SAAA,CAAWA,CAAAA,CAAQ,SAAA,CACnB,eAAA,CAAiBA,EAAQ,eAAA,CACzB,aAAA,CAAeA,EAAQ,aAAA,CACvB,YAAA,CAAcA,EAAQ,YAAA,CACtB,aAAA,CAAeA,EAAQ,aACzB,CAAA,CACA,GAAI,CACF,UAAA,CAAYA,EAAQ,UAAA,CACpB,YAAA,CAAcA,EAAQ,YAAA,CACtB,YAAA,CAAcA,EAAQ,YAAA,CACtB,aAAA,CAAeA,EAAQ,aACzB,CACF,EACA,OAAOvD,oBAAAA,CAAA,cAAAA,oBAAAA,CAAA,QAAA,CAAA,IAAA,CAAG9B,EAASsF,CAAW,CAAE,CAClC,CAEA,OACExD,qBAAA,aAAA,CAAAA,oBAAAA,CAAA,cACG9B,CAAAA,CACA,CAACmF,CAAAA,EACArD,oBAAAA,CAAA,cAAAA,oBAAAA,CAAA,QAAA,CAAA,IAAA,CACGsD,GAAA,IAAA,EAAAA,CAAAA,CAAY,OACXtD,oBAAAA,CAAA,aAAA,CAACsD,EAAW,MAAA,CAAX,IAAkB,EAEnBtD,oBAAAA,CAAA,aAAA,CAAC2B,EAAA,CACC,YAAA,CAAcC,EACd,KAAA,CAAOC,CAAAA,CACP,SAAUC,CAAAA,CACV,SAAA,CAAWC,EACX,SAAA,CAAWC,CAAAA,CACX,SAAUC,CAAAA,CACZ,CAAA,CAEDqB,GAAA,IAAA,EAAAA,CAAAA,CAAY,SACXtD,oBAAAA,CAAA,aAAA,CAACsD,EAAW,QAAA,CAAX,IAAoB,EAErBtD,oBAAAA,CAAA,aAAA,CAACgD,EAAA,CACC,cAAA,CAAgBC,CAAAA,CAChB,KAAA,CAAOpB,EACT,CAEJ,CAEJ,CAEJ,CAAA,CAEM4B,EAAAA,CAA2CxC,GAM3C,CAN2C,IAAAC,EAAAD,CAAAA,CAC/C,CAAA,QAAA,CAAA/C,EACA,cAAA,CAAAC,CAAAA,CACA,gBAAAC,CAAAA,CACA,UAAA,CAAAC,CA9HF,CAAA,CA0HiD6C,CAAAA,CAK5CwC,EAAAlC,CAAAA,CAL4CN,CAAAA,CAK5C,CAJH,UAAA,CACA,gBAAA,CACA,kBACA,YAAA,CAAA,CAAA,CAGA,OACElB,qBAAA,aAAA,CAAC/B,CAAAA,CAAA,CACC,cAAA,CAAgBE,CAAAA,CAChB,gBAAiBC,CAAAA,CACjB,UAAA,CAAYC,GAEZ2B,oBAAAA,CAAA,aAAA,CAACoD,GAAAzE,CAAAA,CAAA,EAAA,CAAwB+E,CAAAA,CAAAA,CACtBxF,CACH,CACF,CAEJ,EAGAuF,GAAe,MAAA,CAAS9B,CAAAA,CACxB8B,GAAe,QAAA,CAAWT,CAAAA,KCxIbW,EAAAA,CAA8D,CAAC,CAC1E,SAAA,CAAAxC,CAAAA,CACA,SAAAjD,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,UAAA,CAAAa,CAAAA,CAAY,UAAAK,CAAAA,CAAW,SAAA,CAAAE,EAAW,YAAA,CAAAQ,CAAa,EAAIG,CAAAA,EAAW,CAEtE,OAAKlB,CAAAA,CAGHiB,oBAAAA,CAAA,cAAC,KAAA,CAAA,CAAI,SAAA,CAAWmB,EAAW,IAAA,CAAK,QAAA,CAAS,YAAA,CAAW,gBAAA,CAAA,CACjDjD,GACC8B,oBAAAA,CAAA,aAAA,CAAAA,qBAAA,QAAA,CAAA,IAAA,CACEA,oBAAAA,CAAA,cAAC,KAAA,CAAA,IAAA,CACCA,oBAAAA,CAAA,cAAC,IAAA,CAAA,IAAA,CAAG,gBAAc,EAClBA,oBAAAA,CAAA,aAAA,CAAC,SAAE,8GAA4G,CACjH,EACAA,oBAAAA,CAAA,aAAA,CAAC,WACCA,oBAAAA,CAAA,aAAA,CAAC,UAAO,OAAA,CAASZ,CAAAA,CAAW,aAAW,oBAAA,CAAA,CAAqB,YAE5D,EACAY,oBAAAA,CAAA,aAAA,CAAC,UAAO,OAAA,CAASV,CAAAA,CAAW,aAAW,8BAAA,CAAA,CAA+B,YAEtE,EACAU,oBAAAA,CAAA,aAAA,CAAC,UAAO,OAAA,CAASF,CAAAA,CAAc,YAAA,CAAW,2BAAA,CAAA,CAA4B,oBAEtE,CACF,CACF,CAEJ,CAAA,CAvBsB,IAyB1B,EC/BA,IAAMiD,EAAAA,CAAmB,CACvB,CACE,EAAA,CAAI,YACJ,IAAA,CAAM,mBAAA,CACN,YAAa,mEAAA,CACb,QAAA,CAAU,IACZ,CAAA,CACA,CACE,GAAI,WAAA,CACJ,IAAA,CAAM,oBACN,WAAA,CAAa,0EAAA,CACb,SAAU,KACZ,CAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,KAAM,mBAAA,CACN,WAAA,CAAa,mFACb,QAAA,CAAU,KACZ,EACA,CACE,EAAA,CAAI,YAAA,CACJ,IAAA,CAAM,qBACN,WAAA,CAAa,+DAAA,CACb,SAAU,KACZ,CACF,EAEaa,EAAAA,CAAkE,CAAC,CAC9E,SAAA,CAAAzC,CAAAA,CACA,SAAAjD,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,aAAAe,CAAAA,CAAc,YAAA,CAAAX,EAAc,aAAA,CAAAqB,CAAAA,CAAe,gBAAAJ,CAAAA,CAAiB,aAAA,CAAAQ,CAAc,CAAA,CAAIE,CAAAA,GAEtF,GAAI,CAAChB,EAAc,OAAO,IAAA,CAE1B,IAAMiE,CAAAA,CAAa,IAAM,CACvB3D,CAAAA,CAAgBjB,CAAY,EAC9B,CAAA,CAEA,OACE0B,oBAAAA,CAAA,aAAA,CAAC,OAAI,SAAA,CAAWmB,CAAAA,CAAW,KAAK,QAAA,CAAS,YAAA,CAAW,sBACjDjD,CAAAA,EACC8B,oBAAAA,CAAA,cAAAA,oBAAAA,CAAA,QAAA,CAAA,IAAA,CACEA,qBAAA,aAAA,CAAC,KAAA,CAAA,IAAA,CACCA,qBAAA,aAAA,CAAC,IAAA,CAAA,IAAA,CAAG,oBAAkB,CAAA,CACtBA,oBAAAA,CAAA,aAAA,CAAC,GAAA,CAAA,IAAA,CAAE,kGAAgG,CACrG,CAAA,CAEAA,qBAAA,aAAA,CAAC,KAAA,CAAA,IAAA,CACE+C,GAAiB,GAAA,CAAKnD,CAAAA,EACrBI,qBAAA,aAAA,CAAC,KAAA,CAAA,CAAI,IAAKJ,CAAAA,CAAS,EAAA,CAAA,CACjBI,qBAAA,aAAA,CAAC,KAAA,CAAA,IAAA,CACCA,qBAAA,aAAA,CAAC,IAAA,CAAA,IAAA,CAAIJ,CAAAA,CAAS,IAAK,EACnBI,oBAAAA,CAAA,aAAA,CAAC,SAAGJ,CAAAA,CAAS,WAAY,CAC3B,CAAA,CACAI,oBAAAA,CAAA,cAAC,OAAA,CAAA,CACC,IAAA,CAAK,WACL,OAAA,CAAS1B,CAAAA,CAAasB,EAAS,EAA+B,CAAA,CAC9D,SAAWhB,CAAAA,EAAMe,CAAAA,CAAcC,EAAS,EAAA,CAAiChB,CAAAA,CAAE,OAAO,OAAO,CAAA,CACzF,SAAUgB,CAAAA,CAAS,QAAA,CACnB,aAAY,CAAA,OAAA,EAAUA,CAAAA,CAAS,IAAI,CAAA,CAAA,CACrC,CACF,CACD,CACH,CAAA,CAEAI,qBAAA,aAAA,CAAC,KAAA,CAAA,IAAA,CACCA,qBAAA,aAAA,CAAC,QAAA,CAAA,CAAO,OAAA,CAASD,CAAAA,CAAe,aAAW,gBAAA,CAAA,CAAiB,QAE5D,EACAC,oBAAAA,CAAA,aAAA,CAAC,UAAO,OAAA,CAASkD,CAAAA,CAAY,aAAW,yBAAA,CAAA,CAA0B,kBAElE,CACF,CACF,CAEJ,CAEJ,EC7EO,IAAMW,GAA8D,CAAC,CAC1E,SAAAjE,CAAAA,CACA,SAAA,CAAAuB,EACA,KAAA,CAAA2C,CACF,IAAM,CACJ,GAAM,CAAE,YAAA,CAAAxF,CAAAA,CAAc,cAAAqB,CAAc,CAAA,CAAIM,GAAW,CAEnD,OACED,qBAAA,aAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAWmB,CAAAA,CAAAA,CAChBnB,qBAAA,aAAA,CAAC,OAAA,CAAA,CACC,KAAK,UAAA,CACL,OAAA,CAAS1B,EAAasB,CAAQ,CAAA,CAC9B,SAAWhB,CAAAA,EAAMe,CAAAA,CAAcC,EAAUhB,CAAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CACzD,YAAA,CAAYkF,GAAS,CAAA,OAAA,EAAUlE,CAAQ,WACzC,CAAA,CACCkE,CAAAA,EAAS9D,qBAAA,aAAA,CAAC,MAAA,CAAA,IAAA,CAAM8D,CAAM,CACzB,CAEJ,ECtBO,SAASC,EAAAA,EAAkB,CAChC,GAAM,CAAE,iBAAAlF,CAAAA,CAAkB,YAAA,CAAAP,EAAc,UAAA,CAAAS,CAAAA,CAAY,aAAAE,CAAa,CAAA,CAAIgB,CAAAA,EAAW,CAEhF,OAAO,CACL,gBAAA,CAAApB,EACA,YAAA,CAAAP,CAAAA,CACA,WAAAS,CAAAA,CACA,YAAA,CAAAE,CACF,CACF,CCTO,SAAS+E,EAAAA,EAAoB,CAClC,GAAM,CACJ,SAAA,CAAA5E,EACA,SAAA,CAAAE,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,aAAAO,CAAAA,CACA,aAAA,CAAAC,EACA,aAAA,CAAAJ,CACF,EAAIM,CAAAA,EAAW,CAEf,OAAO,CACL,SAAA,CAAAb,EACA,SAAA,CAAAE,CAAAA,CACA,gBAAAC,CAAAA,CACA,YAAA,CAAAO,EACA,aAAA,CAAAC,CAAAA,CACA,aAAA,CAAAJ,CACF,CACF,CCCO,SAASsE,EAAAA,EAAyE,CACvF,IAAMV,CAAAA,CAAUtD,GAAW,CACrBiE,CAAAA,CAAeC,SAAyD,IAAI,GAAK,EACjFC,CAAAA,CAAmBD,QAAAA,CAAO,CAC9B,gBAAA,CAAkBZ,CAAAA,CAAQ,iBAC1B,UAAA,CAAYA,CAAAA,CAAQ,WACpB,YAAA,CAAcA,CAAAA,CAAQ,aACtB,YAAA,CAAcA,CAAAA,CAAQ,YACxB,CAAC,CAAA,CAGKc,EAAOhF,aAAAA,CAAY,CAACiF,EAAyBC,CAAAA,GAAe,CAChE,IAAMC,CAAAA,CAAYN,EAAa,OAAA,CAAQ,GAAA,CAAII,CAAK,CAAA,CAC5CE,CAAAA,EACFA,EAAU,OAAA,CAAQC,CAAAA,EAAYA,EAASF,CAAI,CAAC,EAEhD,CAAA,CAAG,EAAE,CAAA,CAECG,CAAAA,CAAKrF,cAAY,CAACiF,CAAAA,CAAyBG,KAC1CP,CAAAA,CAAa,OAAA,CAAQ,IAAII,CAAK,CAAA,EACjCJ,EAAa,OAAA,CAAQ,GAAA,CAAII,EAAO,IAAI,GAAK,EAE3CJ,CAAAA,CAAa,OAAA,CAAQ,IAAII,CAAK,CAAA,CAAG,IAAIG,CAAQ,CAAA,CAGtC,IAAM,CACX,IAAMD,CAAAA,CAAYN,CAAAA,CAAa,QAAQ,GAAA,CAAII,CAAK,EAC5CE,CAAAA,EACFA,CAAAA,CAAU,OAAOC,CAAQ,EAE7B,GACC,EAAE,EAECE,CAAAA,CAAMtF,aAAAA,CAAY,CAACiF,CAAAA,CAAyBG,CAAAA,GAAmC,CACnF,IAAMD,CAAAA,CAAYN,EAAa,OAAA,CAAQ,GAAA,CAAII,CAAK,CAAA,CAC5CE,CAAAA,EACFA,EAAU,MAAA,CAAOC,CAAQ,EAE7B,CAAA,CAAG,EAAE,CAAA,CAGL,OAAAtF,YAAU,IAAM,CACd,IAAMM,CAAAA,CAAO2E,CAAAA,CAAiB,QAG9B,GAAI,CAAC3E,CAAAA,CAAK,gBAAA,EAAoB8D,EAAQ,gBAAA,CAAkB,CACtD,IAAMqB,CAAAA,CAAc,MAAA,CAAO,QAAQrB,CAAAA,CAAQ,YAAY,EACpD,MAAA,CAAO,CAAC,CAAC9C,CAAG,CAAA,GAAMA,IAAQ,WAAW,CAAA,CACrC,MAAM,CAAC,EAAGZ,CAAK,IAAMA,CAAK,CAAA,CAG3BwE,EADEO,CAAAA,CACG,kBAAA,CAEA,mBAFoBrB,CAAAA,CAAQ,YAAY,EAIjD,CAGI9D,CAAAA,CAAK,kBAAoB8D,CAAAA,CAAQ,gBAAA,EACjC,KAAK,SAAA,CAAU9D,CAAAA,CAAK,YAAY,CAAA,GAAM,IAAA,CAAK,SAAA,CAAU8D,CAAAA,CAAQ,YAAY,CAAA,EAC3Ec,CAAAA,CAAK,kBAAmBd,CAAAA,CAAQ,YAAY,EAI1C,CAAC9D,CAAAA,CAAK,YAAc8D,CAAAA,CAAQ,UAAA,CAC9Bc,EAAK,cAAc,CAAA,CACV5E,EAAK,UAAA,EAAc,CAAC8D,EAAQ,UAAA,EACrCc,CAAAA,CAAK,eAAe,CAAA,CAIlB,CAAC5E,EAAK,YAAA,EAAgB8D,CAAAA,CAAQ,aAChCc,CAAAA,CAAK,iBAAiB,EACb5E,CAAAA,CAAK,YAAA,EAAgB,CAAC8D,CAAAA,CAAQ,YAAA,EACvCc,EAAK,iBAAiB,CAAA,CAIxBD,EAAiB,OAAA,CAAU,CACzB,iBAAkBb,CAAAA,CAAQ,gBAAA,CAC1B,UAAA,CAAYA,CAAAA,CAAQ,WACpB,YAAA,CAAcA,CAAAA,CAAQ,aACtB,YAAA,CAAc5E,CAAAA,CAAA,GAAK4E,CAAAA,CAAQ,YAAA,CAC7B,EACF,CAAA,CAAG,CAACA,EAASc,CAAI,CAAC,EAEX3E,CAAAA,CAAAf,CAAAA,CAAA,GACF4E,CAAAA,CAAAA,CADE,CAEL,GAAAmB,CAAAA,CACA,GAAA,CAAAC,EACA,IAAA,CAAAN,CACF,EACF,KC5GMQ,CAAAA,CAAsB,sBAAA,CACtBC,EAAsB,sBAAA,CAGtBC,EAAAA,CAA0B,IAA6B,CAC3D,GAAI,OAAO,MAAA,EAAW,WAAA,CAAa,OAAO,GAE1C,IAAMC,CAAAA,CAAgB,aAAa,OAAA,CAAQF,CAAmB,EAC9D,GAAI,CAACE,EAAe,OAAO,GAE3B,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMA,CAAa,CACjC,CAAA,MAASC,EAAO,CACd,OAAA,OAAA,CAAQ,MAAM,gCAAA,CAAkCA,CAAK,EAC9C,EACT,CACF,CAAA,CAEaC,EAAAA,CAAiB,CAE5B,WAAA,CAAa,CAACC,EAAwCC,CAAAA,GAAmC,CACvF,IAAMC,CAAAA,CAA+B,CACnC,GAAIC,OAAAA,EAAO,CACX,MAAA,CAAAF,CAAAA,CACA,SAAAD,CAAAA,CACA,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,aAAY,CAClC,SAAA,CAAW,+CACX,SAAA,CAAW,OAAO,QAAW,WAAA,CAAc,MAAA,CAAO,UAAU,SAAA,CAAY,SAC1E,EAGA,GAAI,OAAO,MAAA,EAAW,WAAA,CAAa,CAEjC,YAAA,CAAa,OAAA,CAAQN,EAAqB,IAAA,CAAK,SAAA,CAAUQ,CAAa,CAAC,CAAA,CAGvE,IAAME,CAAAA,CAAUR,EAAAA,GAChBQ,CAAAA,CAAQ,IAAA,CAAKF,CAAa,CAAA,CAC1B,YAAA,CAAa,QAAQP,CAAAA,CAAqB,IAAA,CAAK,SAAA,CAAUS,CAAO,CAAC,EACnE,CAEA,OAAOF,CACT,CAAA,CAGA,kBAAmB,IAA4B,CAC7C,GAAI,OAAO,MAAA,EAAW,YAAa,OAAO,IAAA,CAE1C,IAAMG,CAAAA,CAAgB,YAAA,CAAa,QAAQX,CAAmB,CAAA,CAC9D,GAAI,CAACW,CAAAA,CAAe,OAAO,IAAA,CAE3B,GAAI,CACF,OAAO,IAAA,CAAK,MAAMA,CAAa,CACjC,OAASP,CAAAA,CAAO,CACd,eAAQ,KAAA,CAAM,+BAAA,CAAiCA,CAAK,CAAA,CAC7C,IACT,CACF,CAAA,CAGA,iBAAA,CAAmB,IACVF,EAAAA,GAIT,aAAA,CAAe,CACbI,EACAM,CAAAA,CACAL,CAAAA,GACkB,CAClB,IAAMC,CAAAA,CAAqC,CACzC,EAAA,CAAIC,OAAAA,GACJ,MAAA,CAAAF,CAAAA,CACA,SAAAD,CAAAA,CACA,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,aAAY,CAClC,SAAA,CAAW,+CACX,SAAA,CAAW,OAAO,QAAW,WAAA,CAAc,MAAA,CAAO,UAAU,SAAA,CAAY,SAAA,CACxE,aAAAM,CACF,CAAA,CAGA,GAAI,OAAO,MAAA,EAAW,YAAa,CAEjC,YAAA,CAAa,QAAQZ,CAAAA,CAAqB,IAAA,CAAK,SAAA,CAAUQ,CAAa,CAAC,CAAA,CAGvE,IAAME,EAAUR,EAAAA,EAAwB,CACxCQ,EAAQ,IAAA,CAAKF,CAAa,EAC1B,YAAA,CAAa,OAAA,CAAQP,EAAqB,IAAA,CAAK,SAAA,CAAUS,CAAO,CAAC,EACnE,CAEA,OAAOF,CACT,EAGA,gBAAA,CAAkB,IAAY,CACxB,OAAO,MAAA,EAAW,cAEtB,YAAA,CAAa,UAAA,CAAWR,CAAmB,CAAA,CAC3C,YAAA,CAAa,WAAWC,CAAmB,CAAA,EAC7C,EAGA,UAAA,CAAaY,CAAAA,EAA+B,CAC1C,IAAMC,CAAAA,CAAUT,GAAe,iBAAA,EAAkB,CACjD,OAAKS,CAAAA,CACEA,EAAQ,QAAA,CAASD,CAAI,IAAM,IAAA,CADb,KAEvB,CACF,EClFO,IAAME,GAAc,CACzB,GAAA,CAAK,CAACC,CAAAA,CAAchG,CAAAA,CAAeiG,IAAiB,CAClD,GAAI,OAAO,MAAA,EAAW,WAAA,CAAa,OACnC,IAAMC,EAAO,IAAI,IAAA,CACjBA,EAAK,OAAA,CAAQA,CAAAA,CAAK,SAAQ,CAAKD,CAAAA,CAAO,GAAK,EAAA,CAAK,EAAA,CAAK,GAAK,CAAA,CAC1D,IAAME,EAAU,CAAA,QAAA,EAAWD,CAAAA,CAAK,aAAa,CAAA,CAAA,CAC7C,QAAA,CAAS,MAAA,CAAS,GAAGF,CAAI,CAAA,CAAA,EAAIhG,CAAK,CAAA,CAAA,EAAImG,CAAO,UAC/C,CAAA,CACA,GAAA,CAAMH,GAAgC,CACpC,GAAI,OAAO,MAAA,EAAW,WAAA,CAAa,OAAO,IAAA,CAC1C,IAAMI,EAAS,CAAA,EAAGJ,CAAI,IAChBK,CAAAA,CAAK,QAAA,CAAS,OAAO,KAAA,CAAM,GAAG,EACpC,IAAA,IAASC,CAAAA,CAAI,EAAGA,CAAAA,CAAID,CAAAA,CAAG,OAAQC,CAAAA,EAAAA,CAAK,CAClC,IAAIC,CAAAA,CAAIF,CAAAA,CAAGC,CAAC,CAAA,CACZ,KAAOC,EAAE,MAAA,CAAO,CAAC,CAAA,GAAM,GAAA,EAAKA,EAAIA,CAAAA,CAAE,SAAA,CAAU,EAAGA,CAAAA,CAAE,MAAM,EACvD,GAAIA,CAAAA,CAAE,QAAQH,CAAM,CAAA,GAAM,EAAG,OAAOG,CAAAA,CAAE,UAAUH,CAAAA,CAAO,MAAA,CAAQG,EAAE,MAAM,CACzE,CACA,OAAO,IACT,EACA,MAAA,CAASP,CAAAA,EAAiB,CACpB,OAAO,MAAA,EAAW,cACtB,QAAA,CAAS,MAAA,CAAS,GAAGA,CAAI,CAAA,+CAAA,CAAA,EAC3B,CACF,CAAA,CAGaQ,EAAAA,CAAiB,CAC5B,IAAA,CAAM,CAAC5F,EAAa8D,CAAAA,GAAc,CAC5B,OAAO,MAAA,EAAW,aACtB,YAAA,CAAa,OAAA,CAAQ9D,EAAK,IAAA,CAAK,SAAA,CAAU8D,CAAI,CAAC,EAChD,EACA,IAAA,CAAO9D,CAAAA,EAA4B,CACjC,GAAI,OAAO,QAAW,WAAA,CAAa,OAAO,KAC1C,IAAM8D,CAAAA,CAAO,aAAa,OAAA,CAAQ9D,CAAG,EACrC,OAAO8D,CAAAA,CAAO,KAAK,KAAA,CAAMA,CAAI,EAAI,IACnC,CAAA,CACA,OAAS9D,CAAAA,EAAgB,CACnB,OAAO,MAAA,EAAW,WAAA,EACtB,aAAa,UAAA,CAAWA,CAAG,EAC7B,CACF","file":"index.js","sourcesContent":["import React, { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react';\n\nexport interface ConsentCategories {\n necessary: boolean;\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n [key: string]: boolean;\n}\n\nexport interface ConsentState {\n hasUserConsented: boolean;\n consentState: ConsentCategories;\n showBanner: boolean;\n showSettings: boolean;\n}\n\nexport interface ConsentActions {\n acceptAll: () => void;\n rejectAll: () => void;\n savePreferences: (preferences: Partial<ConsentCategories>) => void;\n openSettings: () => void;\n closeSettings: () => void;\n updateConsent: (category: keyof ConsentCategories, value: boolean) => void;\n}\n\nexport interface ConsentContextValue extends ConsentState, ConsentActions {}\n\nconst ConsentContext = createContext<ConsentContextValue | undefined>(undefined);\n\nexport interface ConsentProviderProps {\n children: ReactNode;\n initialConsent?: Partial<ConsentCategories>;\n onConsentChange?: (consent: ConsentCategories) => void;\n storageKey?: string;\n}\n\nconst defaultConsent: ConsentCategories = {\n necessary: true, // Always true\n analytics: false,\n marketing: false,\n functional: false,\n};\n\nexport function ConsentProvider({\n children,\n initialConsent = {},\n onConsentChange,\n storageKey = 'ndpr-consent',\n}: ConsentProviderProps) {\n const [consentState, setConsentState] = useState<ConsentCategories>(() => {\n // Try to load from localStorage\n if (typeof window !== 'undefined') {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n try {\n const parsed = JSON.parse(stored);\n return { ...defaultConsent, ...parsed };\n } catch (e) {\n console.error('Failed to parse consent from localStorage', e);\n }\n }\n }\n return { ...defaultConsent, ...initialConsent };\n });\n\n const [hasUserConsented, setHasUserConsented] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(`${storageKey}-set`) === 'true';\n }\n return false;\n });\n\n const [showBanner, setShowBanner] = useState(!hasUserConsented);\n const [showSettings, setShowSettings] = useState(false);\n\n // Persist consent to localStorage\n useEffect(() => {\n if (typeof window !== 'undefined' && hasUserConsented) {\n localStorage.setItem(storageKey, JSON.stringify(consentState));\n localStorage.setItem(`${storageKey}-set`, 'true');\n }\n }, [consentState, hasUserConsented, storageKey]);\n\n // Notify parent of consent changes\n useEffect(() => {\n if (hasUserConsented && onConsentChange) {\n onConsentChange(consentState);\n }\n }, [consentState, hasUserConsented, onConsentChange]);\n\n const acceptAll = useCallback(() => {\n const newConsent: ConsentCategories = {\n necessary: true,\n analytics: true,\n marketing: true,\n functional: true,\n };\n setConsentState(newConsent);\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, []);\n\n const rejectAll = useCallback(() => {\n const newConsent: ConsentCategories = {\n necessary: true,\n analytics: false,\n marketing: false,\n functional: false,\n };\n setConsentState(newConsent);\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, []);\n\n const savePreferences = useCallback((preferences: Partial<ConsentCategories>) => {\n setConsentState(prev => ({\n ...prev,\n ...preferences,\n necessary: true, // Always keep necessary as true\n }));\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, []);\n\n const updateConsent = useCallback((category: keyof ConsentCategories, value: boolean) => {\n if (category === 'necessary') return; // Can't change necessary cookies\n \n setConsentState(prev => ({\n ...prev,\n [category]: value,\n }));\n }, []);\n\n const openSettings = useCallback(() => {\n setShowSettings(true);\n setShowBanner(false);\n }, []);\n\n const closeSettings = useCallback(() => {\n setShowSettings(false);\n }, []);\n\n const value: ConsentContextValue = {\n hasUserConsented,\n consentState,\n showBanner,\n showSettings,\n acceptAll,\n rejectAll,\n savePreferences,\n openSettings,\n closeSettings,\n updateConsent,\n };\n\n return (\n <ConsentContext.Provider value={value}>\n {children}\n </ConsentContext.Provider>\n );\n}\n\nexport function useConsent() {\n const context = useContext(ConsentContext);\n if (!context) {\n throw new Error('useConsent must be used within a ConsentProvider');\n }\n return context;\n}\n\n// Export for external use\nexport { ConsentContext };","import React, { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react';\nimport {\n BaseConsentCategories,\n DefaultConsentCategories,\n ConsentState,\n ConsentActions,\n ConsentContextValue,\n ConsentProviderProps,\n} from '@/types/consent';\n\n/**\n * Factory function to create a typed consent context\n */\nexport function createConsentContext<T extends BaseConsentCategories = DefaultConsentCategories>() {\n const ConsentContext = createContext<ConsentContextValue<T> | undefined>(undefined);\n\n function ConsentProvider({\n children,\n initialConsent = {} as Partial<T>,\n onConsentChange,\n storageKey = 'ndpr-consent',\n categories,\n }: ConsentProviderProps<T>) {\n const getDefaultConsent = (): T => {\n const defaultConsent: any = { necessary: true };\n \n if (categories) {\n categories.forEach(cat => {\n if (cat.id !== 'necessary') {\n defaultConsent[cat.id] = false;\n }\n });\n } else {\n // Use default categories\n defaultConsent.analytics = false;\n defaultConsent.marketing = false;\n defaultConsent.functional = false;\n }\n \n return defaultConsent as T;\n };\n\n const [consentState, setConsentState] = useState<T>(() => {\n // Try to load from localStorage\n if (typeof window !== 'undefined') {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n try {\n const parsed = JSON.parse(stored);\n return { ...getDefaultConsent(), ...parsed };\n } catch (e) {\n console.error('Failed to parse consent from localStorage', e);\n }\n }\n }\n return { ...getDefaultConsent(), ...initialConsent } as T;\n });\n\n const [hasUserConsented, setHasUserConsented] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(`${storageKey}-set`) === 'true';\n }\n return false;\n });\n\n const [showBanner, setShowBanner] = useState(!hasUserConsented);\n const [showSettings, setShowSettings] = useState(false);\n\n // Persist consent to localStorage\n useEffect(() => {\n if (typeof window !== 'undefined' && hasUserConsented) {\n localStorage.setItem(storageKey, JSON.stringify(consentState));\n localStorage.setItem(`${storageKey}-set`, 'true');\n }\n }, [consentState, hasUserConsented, storageKey]);\n\n // Notify parent of consent changes\n useEffect(() => {\n if (hasUserConsented && onConsentChange) {\n onConsentChange(consentState);\n }\n }, [consentState, hasUserConsented, onConsentChange]);\n\n const acceptAll = useCallback(() => {\n const newConsent = { ...consentState };\n Object.keys(newConsent).forEach(key => {\n newConsent[key as keyof T] = true as any;\n });\n setConsentState(newConsent);\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, [consentState]);\n\n const rejectAll = useCallback(() => {\n const newConsent = { ...consentState };\n Object.keys(newConsent).forEach(key => {\n if (key !== 'necessary') {\n newConsent[key as keyof T] = false as any;\n }\n });\n setConsentState(newConsent);\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, [consentState]);\n\n const savePreferences = useCallback((preferences: Partial<T>) => {\n setConsentState(prev => ({\n ...prev,\n ...preferences,\n necessary: true, // Always keep necessary as true\n } as T));\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, []);\n\n const updateConsent = useCallback((category: keyof T, value: boolean) => {\n if (category === 'necessary') return; // Can't change necessary cookies\n \n setConsentState(prev => ({\n ...prev,\n [category]: value,\n }));\n }, []);\n\n const openSettings = useCallback(() => {\n setShowSettings(true);\n setShowBanner(false);\n }, []);\n\n const closeSettings = useCallback(() => {\n setShowSettings(false);\n }, []);\n\n const value: ConsentContextValue<T> = {\n hasUserConsented,\n consentState,\n showBanner,\n showSettings,\n acceptAll,\n rejectAll,\n savePreferences,\n openSettings,\n closeSettings,\n updateConsent,\n };\n\n return (\n <ConsentContext.Provider value={value}>\n {children}\n </ConsentContext.Provider>\n );\n }\n\n function useConsent() {\n const context = useContext(ConsentContext);\n if (!context) {\n throw new Error('useConsent must be used within a ConsentProvider');\n }\n return context;\n }\n\n return {\n ConsentContext,\n ConsentProvider,\n useConsent,\n };\n}","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { Button } from '@/components/ui/Button';\nimport { cn } from '@/lib/utils';\nimport { BannerProps } from './ConsentManager';\n\nexport interface ConsentBannerProps {\n renderBanner?: (props: BannerProps) => ReactNode;\n theme?: {\n primaryColor?: string;\n textColor?: string;\n backgroundColor?: string;\n };\n position?: 'top' | 'bottom' | 'center';\n animation?: 'slide' | 'fade' | 'none';\n fullWidth?: boolean;\n maxWidth?: string;\n unstyled?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\ninterface ConsentBannerComponent extends React.FC<ConsentBannerProps> {\n Message: React.FC<{ children: ReactNode; className?: string }>;\n Actions: React.FC<{ children: ReactNode; className?: string }>;\n}\n\nconst ConsentBanner: ConsentBannerComponent = ({\n renderBanner,\n theme,\n position = 'bottom',\n animation = 'slide',\n fullWidth = true,\n maxWidth = '1200px',\n unstyled = false,\n className,\n children,\n}) => {\n const { showBanner, acceptAll, rejectAll, openSettings } = useConsent();\n\n if (!showBanner) return null;\n\n // Custom render function\n if (renderBanner) {\n return <>{renderBanner({ onAcceptAll: acceptAll, onRejectAll: rejectAll, onOpenSettings: openSettings })}</>;\n }\n\n // Children-based composition\n if (children) {\n return (\n <div\n className={cn(\n !unstyled && [\n 'fixed z-50 p-4',\n position === 'bottom' && 'bottom-0 left-0 right-0',\n position === 'top' && 'top-0 left-0 right-0',\n position === 'center' && 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n animation === 'slide' && 'animate-slide-in',\n animation === 'fade' && 'animate-fade-in',\n ],\n className\n )}\n style={{\n backgroundColor: unstyled ? undefined : theme?.backgroundColor || 'white',\n color: unstyled ? undefined : theme?.textColor,\n maxWidth: fullWidth ? undefined : maxWidth,\n margin: fullWidth ? undefined : '0 auto',\n }}\n >\n {children}\n </div>\n );\n }\n\n // Default implementation\n return (\n <div\n className={cn(\n 'fixed z-50 p-4',\n position === 'bottom' && 'bottom-0 left-0 right-0',\n position === 'top' && 'top-0 left-0 right-0',\n position === 'center' && 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n animation === 'slide' && 'animate-slide-in',\n animation === 'fade' && 'animate-fade-in',\n className\n )}\n style={{\n backgroundColor: theme?.backgroundColor || 'white',\n color: theme?.textColor,\n }}\n >\n <div\n className=\"mx-auto\"\n style={{\n maxWidth: fullWidth ? undefined : maxWidth,\n }}\n >\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-lg font-semibold mb-2\">Cookie Consent</h3>\n <p className=\"text-gray-600 mb-4\">\n We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.\n </p>\n <div className=\"flex gap-3 flex-wrap\">\n <Button\n onClick={acceptAll}\n style={{ backgroundColor: theme?.primaryColor }}\n >\n Accept All\n </Button>\n <Button\n onClick={rejectAll}\n variant=\"outline\"\n >\n Reject All\n </Button>\n <Button\n onClick={openSettings}\n variant=\"ghost\"\n >\n Manage Preferences\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// Sub-components for composition\nConsentBanner.Message = ({ children, className }) => (\n <div className={cn('mb-4', className)}>{children}</div>\n);\n\nConsentBanner.Actions = ({ children, className }) => (\n <div className={cn('flex gap-3 flex-wrap', className)}>{children}</div>\n);\n\nexport { ConsentBanner };","\"use client\"\n\nimport * as React from \"react\"\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\ninterface DialogProps {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Dialog = ({ open, onOpenChange, children }: DialogProps) => {\n if (!open) return null\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <div \n className=\"fixed inset-0 bg-black/50\" \n onClick={() => onOpenChange?.(false)}\n />\n {children}\n </div>\n )\n}\n\nconst DialogContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { unstyled?: boolean }\n>(({ className, children, unstyled, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n !unstyled && \"relative z-50 grid w-full max-w-lg gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n))\nDialogContent.displayName = \"DialogContent\"\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = \"DialogTitle\"\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = \"DialogDescription\"\n\nexport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n}","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { Button } from '@/components/ui/Button';\nimport { Switch } from '@/components/ui/switch';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog';\nimport { SettingsProps } from './ConsentManager';\n\nexport interface ConsentSettingsProps {\n renderSettings?: (props: SettingsProps) => ReactNode;\n theme?: {\n primaryColor?: string;\n textColor?: string;\n backgroundColor?: string;\n };\n unstyled?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nconst cookieCategories = [\n {\n id: 'necessary',\n name: 'Necessary Cookies',\n description: 'These cookies are essential for the website to function properly.',\n disabled: true,\n },\n {\n id: 'analytics',\n name: 'Analytics Cookies',\n description: 'These cookies help us understand how visitors interact with our website.',\n disabled: false,\n },\n {\n id: 'marketing',\n name: 'Marketing Cookies',\n description: 'These cookies are used to track visitors across websites for marketing purposes.',\n disabled: false,\n },\n {\n id: 'functional',\n name: 'Functional Cookies',\n description: 'These cookies enable personalized features and functionality.',\n disabled: false,\n },\n];\n\nexport const ConsentSettings: React.FC<ConsentSettingsProps> = ({\n renderSettings,\n theme,\n unstyled = false,\n className,\n children,\n}) => {\n const { showSettings, consentState, updateConsent, savePreferences, closeSettings } = useConsent();\n\n if (!showSettings) return null;\n\n const handleSave = () => {\n savePreferences(consentState);\n };\n\n // Custom render function\n if (renderSettings) {\n return (\n <>\n {renderSettings({\n consentState,\n onUpdateConsent: updateConsent,\n onSave: handleSave,\n onClose: closeSettings,\n })}\n </>\n );\n }\n\n // Children-based composition\n if (children) {\n return (\n <Dialog open={showSettings} onOpenChange={closeSettings}>\n <DialogContent className={className} unstyled={unstyled}>\n {children}\n </DialogContent>\n </Dialog>\n );\n }\n\n // Default implementation\n return (\n <Dialog open={showSettings} onOpenChange={closeSettings}>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>Cookie Preferences</DialogTitle>\n <DialogDescription>\n Manage your cookie preferences. You can enable or disable different categories of cookies below.\n </DialogDescription>\n </DialogHeader>\n \n <div className=\"space-y-6 py-4\">\n {cookieCategories.map((category) => (\n <div key={category.id} className=\"flex items-start justify-between space-x-4\">\n <div className=\"flex-1\">\n <h4 className=\"font-medium mb-1\">{category.name}</h4>\n <p className=\"text-sm text-gray-600\">{category.description}</p>\n </div>\n <Switch\n checked={consentState[category.id as keyof typeof consentState]}\n onCheckedChange={(checked) => updateConsent(category.id as keyof typeof consentState, checked)}\n disabled={category.disabled}\n />\n </div>\n ))}\n </div>\n\n <div className=\"flex justify-end gap-3 pt-4 border-t\">\n <Button variant=\"outline\" onClick={closeSettings}>\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n style={{ backgroundColor: theme?.primaryColor }}\n >\n Save Preferences\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n};","import React, { ReactNode } from 'react';\nimport { ConsentProvider, ConsentProviderProps, ConsentCategories, ConsentActions, useConsent } from '@/contexts/ConsentContext';\nimport { ConsentBanner } from './ConsentBanner';\nimport { ConsentSettings } from './ConsentSettings';\n\nexport interface BannerProps {\n onAcceptAll: () => void;\n onRejectAll: () => void;\n onOpenSettings: () => void;\n}\n\nexport interface SettingsProps {\n consentState: ConsentCategories;\n onUpdateConsent: (category: keyof ConsentCategories, value: boolean) => void;\n onSave: () => void;\n onClose: () => void;\n}\n\nexport interface RenderProps {\n consents: ConsentCategories;\n actions: ConsentActions;\n ui: {\n showBanner: boolean;\n showSettings: boolean;\n openSettings: () => void;\n closeSettings: () => void;\n };\n}\n\nexport interface ConsentManagerProps extends Omit<ConsentProviderProps, 'children'> {\n children?: ReactNode | ((props: RenderProps) => ReactNode);\n headless?: boolean;\n renderBanner?: (props: BannerProps) => ReactNode;\n renderSettings?: (props: SettingsProps) => ReactNode;\n components?: {\n Banner?: React.ComponentType<any>;\n Settings?: React.ComponentType<any>;\n };\n theme?: {\n primaryColor?: string;\n textColor?: string;\n backgroundColor?: string;\n };\n position?: 'top' | 'bottom' | 'center';\n animation?: 'slide' | 'fade' | 'none';\n fullWidth?: boolean;\n maxWidth?: string;\n}\n\ninterface ConsentManagerComponent extends React.FC<ConsentManagerProps> {\n Banner: typeof ConsentBanner;\n Settings: typeof ConsentSettings;\n}\n\n// Internal component that has access to consent context\nconst ConsentManagerInner: React.FC<Omit<ConsentManagerProps, keyof Omit<ConsentProviderProps, 'children'>>> = ({\n children,\n headless = false,\n renderBanner,\n renderSettings,\n components,\n theme,\n position = 'bottom',\n animation = 'slide',\n fullWidth = true,\n maxWidth = '1200px',\n}) => {\n const consent = useConsent();\n\n // If using render props pattern\n if (typeof children === 'function') {\n const renderProps: RenderProps = {\n consents: consent.consentState,\n actions: {\n acceptAll: consent.acceptAll,\n rejectAll: consent.rejectAll,\n savePreferences: consent.savePreferences,\n updateConsent: consent.updateConsent,\n openSettings: consent.openSettings,\n closeSettings: consent.closeSettings,\n },\n ui: {\n showBanner: consent.showBanner,\n showSettings: consent.showSettings,\n openSettings: consent.openSettings,\n closeSettings: consent.closeSettings,\n },\n };\n return <>{children(renderProps)}</>;\n }\n\n return (\n <>\n {children}\n {!headless && (\n <>\n {components?.Banner ? (\n <components.Banner />\n ) : (\n <ConsentBanner\n renderBanner={renderBanner}\n theme={theme}\n position={position}\n animation={animation}\n fullWidth={fullWidth}\n maxWidth={maxWidth}\n />\n )}\n {components?.Settings ? (\n <components.Settings />\n ) : (\n <ConsentSettings\n renderSettings={renderSettings}\n theme={theme}\n />\n )}\n </>\n )}\n </>\n );\n};\n\nconst ConsentManager: ConsentManagerComponent = ({\n children,\n initialConsent,\n onConsentChange,\n storageKey,\n ...innerProps\n}) => {\n return (\n <ConsentProvider\n initialConsent={initialConsent}\n onConsentChange={onConsentChange}\n storageKey={storageKey}\n >\n <ConsentManagerInner {...innerProps}>\n {children}\n </ConsentManagerInner>\n </ConsentProvider>\n );\n};\n\n// Attach sub-components for composition\nConsentManager.Banner = ConsentBanner;\nConsentManager.Settings = ConsentSettings;\n\nexport { ConsentManager };","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentBannerProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport const UnstyledConsentBanner: React.FC<UnstyledConsentBannerProps> = ({\n className,\n children,\n}) => {\n const { showBanner, acceptAll, rejectAll, openSettings } = useConsent();\n\n if (!showBanner) return null;\n\n return (\n <div className={className} role=\"region\" aria-label=\"Cookie consent\">\n {children || (\n <>\n <div>\n <h3>Cookie Consent</h3>\n <p>We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.</p>\n </div>\n <div>\n <button onClick={acceptAll} aria-label=\"Accept all cookies\">\n Accept All\n </button>\n <button onClick={rejectAll} aria-label=\"Reject non-essential cookies\">\n Reject All\n </button>\n <button onClick={openSettings} aria-label=\"Manage cookie preferences\">\n Manage Preferences\n </button>\n </div>\n </>\n )}\n </div>\n );\n};","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentSettingsProps {\n className?: string;\n children?: ReactNode;\n}\n\nconst cookieCategories = [\n {\n id: 'necessary',\n name: 'Necessary Cookies',\n description: 'These cookies are essential for the website to function properly.',\n disabled: true,\n },\n {\n id: 'analytics',\n name: 'Analytics Cookies',\n description: 'These cookies help us understand how visitors interact with our website.',\n disabled: false,\n },\n {\n id: 'marketing',\n name: 'Marketing Cookies',\n description: 'These cookies are used to track visitors across websites for marketing purposes.',\n disabled: false,\n },\n {\n id: 'functional',\n name: 'Functional Cookies',\n description: 'These cookies enable personalized features and functionality.',\n disabled: false,\n },\n];\n\nexport const UnstyledConsentSettings: React.FC<UnstyledConsentSettingsProps> = ({\n className,\n children,\n}) => {\n const { showSettings, consentState, updateConsent, savePreferences, closeSettings } = useConsent();\n\n if (!showSettings) return null;\n\n const handleSave = () => {\n savePreferences(consentState);\n };\n\n return (\n <div className={className} role=\"dialog\" aria-label=\"Cookie preferences\">\n {children || (\n <>\n <div>\n <h2>Cookie Preferences</h2>\n <p>Manage your cookie preferences. You can enable or disable different categories of cookies below.</p>\n </div>\n \n <div>\n {cookieCategories.map((category) => (\n <div key={category.id}>\n <div>\n <h4>{category.name}</h4>\n <p>{category.description}</p>\n </div>\n <input\n type=\"checkbox\"\n checked={consentState[category.id as keyof typeof consentState]}\n onChange={(e) => updateConsent(category.id as keyof typeof consentState, e.target.checked)}\n disabled={category.disabled}\n aria-label={`Toggle ${category.name}`}\n />\n </div>\n ))}\n </div>\n\n <div>\n <button onClick={closeSettings} aria-label=\"Cancel changes\">\n Cancel\n </button>\n <button onClick={handleSave} aria-label=\"Save cookie preferences\">\n Save Preferences\n </button>\n </div>\n </>\n )}\n </div>\n );\n};","import React from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentToggleProps {\n category: 'analytics' | 'marketing' | 'functional';\n className?: string;\n label?: string;\n}\n\nexport const UnstyledConsentToggle: React.FC<UnstyledConsentToggleProps> = ({\n category,\n className,\n label,\n}) => {\n const { consentState, updateConsent } = useConsent();\n\n return (\n <label className={className}>\n <input\n type=\"checkbox\"\n checked={consentState[category]}\n onChange={(e) => updateConsent(category, e.target.checked)}\n aria-label={label || `Toggle ${category} cookies`}\n />\n {label && <span>{label}</span>}\n </label>\n );\n};","import { useConsent } from '@/contexts/ConsentContext';\n\n/**\n * Hook to access only the consent state without actions\n */\nexport function useConsentState() {\n const { hasUserConsented, consentState, showBanner, showSettings } = useConsent();\n \n return {\n hasUserConsented,\n consentState,\n showBanner,\n showSettings,\n };\n}","import { useConsent } from '@/contexts/ConsentContext';\n\n/**\n * Hook to access only the consent actions without state\n */\nexport function useConsentActions() {\n const {\n acceptAll,\n rejectAll,\n savePreferences,\n openSettings,\n closeSettings,\n updateConsent,\n } = useConsent();\n \n return {\n acceptAll,\n rejectAll,\n savePreferences,\n openSettings,\n closeSettings,\n updateConsent,\n };\n}","import { useEffect, useRef, useCallback } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { ConsentCategories } from '@/contexts/ConsentContext';\n\ntype ConsentEventType = \n | 'consent:accepted'\n | 'consent:rejected'\n | 'consent:updated'\n | 'banner:shown'\n | 'banner:hidden'\n | 'settings:opened'\n | 'settings:closed';\n\ntype ConsentEventListener = (data?: any) => void;\n\ninterface ConsentEventManager {\n on: (event: ConsentEventType, listener: ConsentEventListener) => () => void;\n off: (event: ConsentEventType, listener: ConsentEventListener) => void;\n emit: (event: ConsentEventType, data?: any) => void;\n}\n\n/**\n * Advanced hook that provides event-driven consent management\n */\nexport function useConsentManager(): ConsentEventManager & ReturnType<typeof useConsent> {\n const consent = useConsent();\n const listenersRef = useRef<Map<ConsentEventType, Set<ConsentEventListener>>>(new Map());\n const previousStateRef = useRef({\n hasUserConsented: consent.hasUserConsented,\n showBanner: consent.showBanner,\n showSettings: consent.showSettings,\n consentState: consent.consentState,\n });\n\n // Event emitter implementation\n const emit = useCallback((event: ConsentEventType, data?: any) => {\n const listeners = listenersRef.current.get(event);\n if (listeners) {\n listeners.forEach(listener => listener(data));\n }\n }, []);\n\n const on = useCallback((event: ConsentEventType, listener: ConsentEventListener) => {\n if (!listenersRef.current.has(event)) {\n listenersRef.current.set(event, new Set());\n }\n listenersRef.current.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n const listeners = listenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n };\n }, []);\n\n const off = useCallback((event: ConsentEventType, listener: ConsentEventListener) => {\n const listeners = listenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }, []);\n\n // Track state changes and emit events\n useEffect(() => {\n const prev = previousStateRef.current;\n \n // Check for consent acceptance\n if (!prev.hasUserConsented && consent.hasUserConsented) {\n const allAccepted = Object.entries(consent.consentState)\n .filter(([key]) => key !== 'necessary')\n .every(([, value]) => value);\n \n if (allAccepted) {\n emit('consent:accepted', consent.consentState);\n } else {\n emit('consent:rejected', consent.consentState);\n }\n }\n\n // Check for consent updates\n if (prev.hasUserConsented && consent.hasUserConsented && \n JSON.stringify(prev.consentState) !== JSON.stringify(consent.consentState)) {\n emit('consent:updated', consent.consentState);\n }\n\n // Check for banner visibility changes\n if (!prev.showBanner && consent.showBanner) {\n emit('banner:shown');\n } else if (prev.showBanner && !consent.showBanner) {\n emit('banner:hidden');\n }\n\n // Check for settings visibility changes\n if (!prev.showSettings && consent.showSettings) {\n emit('settings:opened');\n } else if (prev.showSettings && !consent.showSettings) {\n emit('settings:closed');\n }\n\n // Update previous state\n previousStateRef.current = {\n hasUserConsented: consent.hasUserConsented,\n showBanner: consent.showBanner,\n showSettings: consent.showSettings,\n consentState: { ...consent.consentState },\n };\n }, [consent, emit]);\n\n return {\n ...consent,\n on,\n off,\n emit,\n };\n}","'use client';\n\nimport { ConsentRecord, ConsentType, ConsentHistoryEntry } from '@/types';\nimport { v4 as uuidv4 } from 'uuid';\n\n// In a real implementation, this would connect to a database\n// For demo purposes, we're using localStorage\n\nconst CONSENT_STORAGE_KEY = 'ndpr_consent_records';\nconst CONSENT_HISTORY_KEY = 'ndpr_consent_history';\n\n// Helper function to get consent history\nconst getConsentHistoryHelper = (): ConsentHistoryEntry[] => {\n if (typeof window === 'undefined') return [];\n \n const storedHistory = localStorage.getItem(CONSENT_HISTORY_KEY);\n if (!storedHistory) return [];\n \n try {\n return JSON.parse(storedHistory) as ConsentHistoryEntry[];\n } catch (error) {\n console.error('Error parsing consent history:', error);\n return [];\n }\n};\n\nexport const consentService = {\n // Save a new consent record\n saveConsent: (consents: Record<ConsentType, boolean>, userId?: string): ConsentRecord => {\n const consentRecord: ConsentRecord = {\n id: uuidv4(),\n userId,\n consents,\n timestamp: new Date().toISOString(),\n ipAddress: 'Collected server-side in real implementation',\n userAgent: typeof window !== 'undefined' ? window.navigator.userAgent : 'Unknown',\n };\n\n // Store in localStorage for demo\n if (typeof window !== 'undefined') {\n // Save as current consent\n localStorage.setItem(CONSENT_STORAGE_KEY, JSON.stringify(consentRecord));\n \n // Add to history\n const history = getConsentHistoryHelper();\n history.push(consentRecord);\n localStorage.setItem(CONSENT_HISTORY_KEY, JSON.stringify(history));\n }\n\n return consentRecord;\n },\n\n // Get the current consent record\n getCurrentConsent: (): ConsentRecord | null => {\n if (typeof window === 'undefined') return null;\n \n const storedConsent = localStorage.getItem(CONSENT_STORAGE_KEY);\n if (!storedConsent) return null;\n \n try {\n return JSON.parse(storedConsent) as ConsentRecord;\n } catch (error) {\n console.error('Error parsing consent record:', error);\n return null;\n }\n },\n\n // Get consent history\n getConsentHistory: (): ConsentHistoryEntry[] => {\n return getConsentHistoryHelper();\n },\n\n // Update consent with change reason\n updateConsent: (\n consents: Record<ConsentType, boolean>, \n changeReason?: string,\n userId?: string\n ): ConsentRecord => {\n const consentRecord: ConsentHistoryEntry = {\n id: uuidv4(),\n userId,\n consents,\n timestamp: new Date().toISOString(),\n ipAddress: 'Collected server-side in real implementation',\n userAgent: typeof window !== 'undefined' ? window.navigator.userAgent : 'Unknown',\n changeReason\n };\n\n // Store in localStorage for demo\n if (typeof window !== 'undefined') {\n // Save as current consent\n localStorage.setItem(CONSENT_STORAGE_KEY, JSON.stringify(consentRecord));\n \n // Add to history\n const history = getConsentHistoryHelper();\n history.push(consentRecord);\n localStorage.setItem(CONSENT_HISTORY_KEY, JSON.stringify(history));\n }\n\n return consentRecord;\n },\n\n // Clear all consent data (for testing/development)\n clearConsentData: (): void => {\n if (typeof window === 'undefined') return;\n \n localStorage.removeItem(CONSENT_STORAGE_KEY);\n localStorage.removeItem(CONSENT_HISTORY_KEY);\n },\n\n // Check if a specific consent is granted\n hasConsent: (type: ConsentType): boolean => {\n const current = consentService.getCurrentConsent();\n if (!current) return false;\n return current.consents[type] === true;\n }\n};\n\nexport default consentService;\n","// Core exports\nexport { ConsentProvider, useConsent, ConsentContext } from './contexts/ConsentContext';\nexport type { ConsentCategories, ConsentState, ConsentActions, ConsentContextValue } from './contexts/ConsentContext';\n\n// Generic consent context factory\nexport { createConsentContext } from './contexts/GenericConsentContext';\nexport type {\n BaseConsentCategories,\n DefaultConsentCategories,\n ConsentProviderProps,\n} from './types/consent';\n\n// Components\nexport { ConsentManager } from './components/consent/ConsentManager';\nexport { ConsentBanner } from './components/consent/ConsentBanner';\nexport { ConsentSettings } from './components/consent/ConsentSettings';\nexport type { ConsentManagerProps, BannerProps, SettingsProps, RenderProps } from './components/consent/ConsentManager';\n\n// Unstyled components\nexport {\n UnstyledConsentBanner,\n UnstyledConsentSettings,\n UnstyledConsentToggle,\n} from './components/consent/unstyled';\n\n// Hooks\nexport { useConsentState } from './hooks/useConsentState';\nexport { useConsentActions } from './hooks/useConsentActions';\nexport { useConsentManager } from './hooks/useConsentManager';\n\n// Utilities\nexport { consentService } from './lib/consentService';\n\n// Cookie utilities\nexport const cookieUtils = {\n set: (name: string, value: string, days: number) => {\n if (typeof window === 'undefined') return;\n const date = new Date();\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = `expires=${date.toUTCString()}`;\n document.cookie = `${name}=${value};${expires};path=/`;\n },\n get: (name: string): string | null => {\n if (typeof window === 'undefined') return null;\n const nameEQ = `${name}=`;\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n },\n delete: (name: string) => {\n if (typeof window === 'undefined') return;\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n }\n};\n\n// Consent storage utilities\nexport const consentStorage = {\n save: (key: string, data: any) => {\n if (typeof window === 'undefined') return;\n localStorage.setItem(key, JSON.stringify(data));\n },\n load: (key: string): any | null => {\n if (typeof window === 'undefined') return null;\n const data = localStorage.getItem(key);\n return data ? JSON.parse(data) : null;\n },\n remove: (key: string) => {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(key);\n }\n};"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as C from'react';import C__default,{createContext,useState,useEffect,useCallback,useContext,useRef}from'react';import {Slot}from'@radix-ui/react-slot';import {cva}from'class-variance-authority';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import*as j from'@radix-ui/react-switch';import {v4}from'uuid';var Se=Object.defineProperty,xe=Object.defineProperties;var we=Object.getOwnPropertyDescriptors;var H=Object.getOwnPropertySymbols;var re=Object.prototype.hasOwnProperty,ie=Object.prototype.propertyIsEnumerable;var se=(e,n,o)=>n in e?Se(e,n,{enumerable:true,configurable:true,writable:true,value:o}):e[n]=o,a=(e,n)=>{for(var o in n||(n={}))re.call(n,o)&&se(e,o,n[o]);if(H)for(var o of H(n))ie.call(n,o)&&se(e,o,n[o]);return e},T=(e,n)=>xe(e,we(n));var x=(e,n)=>{var o={};for(var t in e)re.call(e,t)&&n.indexOf(t)<0&&(o[t]=e[t]);if(e!=null&&H)for(var t of H(e))n.indexOf(t)<0&&ie.call(e,t)&&(o[t]=e[t]);return o};var Y=createContext(void 0),le={necessary:true,analytics:false,marketing:false,functional:false};function G({children:e,initialConsent:n={},onConsentChange:o,storageKey:t="ndpr-consent"}){let[s,l]=useState(()=>{if(typeof window!="undefined"){let S=localStorage.getItem(t);if(S)try{let N=JSON.parse(S);return a(a({},le),N)}catch(N){console.error("Failed to parse consent from localStorage",N);}}return a(a({},le),n)}),[r,d]=useState(()=>typeof window!="undefined"?localStorage.getItem(`${t}-set`)==="true":false),[i,c]=useState(!r),[f,u]=useState(false);useEffect(()=>{typeof window!="undefined"&&r&&(localStorage.setItem(t,JSON.stringify(s)),localStorage.setItem(`${t}-set`,"true"));},[s,r,t]),useEffect(()=>{r&&o&&o(s);},[s,r,o]);let k=useCallback(()=>{l({necessary:true,analytics:true,marketing:true,functional:true}),d(true),c(false),u(false);},[]),F=useCallback(()=>{l({necessary:true,analytics:false,marketing:false,functional:false}),d(true),c(false),u(false);},[]),E=useCallback(S=>{l(N=>T(a(a({},N),S),{necessary:true})),d(true),c(false),u(false);},[]),$=useCallback((S,N)=>{S!=="necessary"&&l(W=>T(a({},W),{[S]:N}));},[]),B=useCallback(()=>{u(true),c(false);},[]),_=useCallback(()=>{u(false);},[]),R={hasUserConsented:r,consentState:s,showBanner:i,showSettings:f,acceptAll:k,rejectAll:F,savePreferences:E,openSettings:B,closeSettings:_,updateConsent:$};return C__default.createElement(Y.Provider,{value:R},e)}function g(){let e=useContext(Y);if(!e)throw new Error("useConsent must be used within a ConsentProvider");return e}function Ee(){let e=createContext(void 0);function n({children:t,initialConsent:s={},onConsentChange:l,storageKey:r="ndpr-consent",categories:d}){let i=()=>{let p={necessary:true};return d?d.forEach(m=>{m.id!=="necessary"&&(p[m.id]=false);}):(p.analytics=false,p.marketing=false,p.functional=false),p},[c,f]=useState(()=>{if(typeof window!="undefined"){let p=localStorage.getItem(r);if(p)try{let m=JSON.parse(p);return a(a({},i()),m)}catch(m){console.error("Failed to parse consent from localStorage",m);}}return a(a({},i()),s)}),[u,k]=useState(()=>typeof window!="undefined"?localStorage.getItem(`${r}-set`)==="true":false),[F,E]=useState(!u),[$,B]=useState(false);useEffect(()=>{typeof window!="undefined"&&u&&(localStorage.setItem(r,JSON.stringify(c)),localStorage.setItem(`${r}-set`,"true"));},[c,u,r]),useEffect(()=>{u&&l&&l(c);},[c,u,l]);let _=useCallback(()=>{let p=a({},c);Object.keys(p).forEach(m=>{p[m]=true;}),f(p),k(true),E(false),B(false);},[c]),R=useCallback(()=>{let p=a({},c);Object.keys(p).forEach(m=>{m!=="necessary"&&(p[m]=false);}),f(p),k(true),E(false),B(false);},[c]),S=useCallback(p=>{f(m=>T(a(a({},m),p),{necessary:true})),k(true),E(false),B(false);},[]),N=useCallback((p,m)=>{p!=="necessary"&&f(be=>T(a({},be),{[p]:m}));},[]),W=useCallback(()=>{B(true),E(false);},[]),ye=useCallback(()=>{B(false);},[]),he={hasUserConsented:u,consentState:c,showBanner:F,showSettings:$,acceptAll:_,rejectAll:R,savePreferences:S,openSettings:W,closeSettings:ye,updateConsent:N};return C__default.createElement(e.Provider,{value:he},t)}function o(){let t=useContext(e);if(!t)throw new Error("useConsent must be used within a ConsentProvider");return t}return {ConsentContext:e,ConsentProvider:n,useConsent:o}}function v(...e){return twMerge(clsx(e))}var Oe=cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function A(l){var r=l,{className:e,variant:n,size:o,asChild:t=false}=r,s=x(r,["className","variant","size","asChild"]);return C.createElement(t?Slot:"button",a({"data-slot":"button",className:v(Oe({variant:n,size:o,className:e}))},s))}var U=({renderBanner:e,theme:n,position:o="bottom",animation:t="slide",fullWidth:s=true,maxWidth:l="1200px",unstyled:r=false,className:d,children:i})=>{let{showBanner:c,acceptAll:f,rejectAll:u,openSettings:k}=g();return c?e?C__default.createElement(C__default.Fragment,null,e({onAcceptAll:f,onRejectAll:u,onOpenSettings:k})):i?C__default.createElement("div",{className:v(!r&&["fixed z-50 p-4",o==="bottom"&&"bottom-0 left-0 right-0",o==="top"&&"top-0 left-0 right-0",o==="center"&&"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",t==="slide"&&"animate-slide-in",t==="fade"&&"animate-fade-in"],d),style:{backgroundColor:r?void 0:(n==null?void 0:n.backgroundColor)||"white",color:r||n==null?void 0:n.textColor,maxWidth:s?void 0:l,margin:s?void 0:"0 auto"}},i):C__default.createElement("div",{className:v("fixed z-50 p-4",o==="bottom"&&"bottom-0 left-0 right-0",o==="top"&&"top-0 left-0 right-0",o==="center"&&"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",t==="slide"&&"animate-slide-in",t==="fade"&&"animate-fade-in",d),style:{backgroundColor:(n==null?void 0:n.backgroundColor)||"white",color:n==null?void 0:n.textColor}},C__default.createElement("div",{className:"mx-auto",style:{maxWidth:s?void 0:l}},C__default.createElement("div",{className:"bg-white rounded-lg shadow-lg p-6"},C__default.createElement("h3",{className:"text-lg font-semibold mb-2"},"Cookie Consent"),C__default.createElement("p",{className:"text-gray-600 mb-4"},"We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies."),C__default.createElement("div",{className:"flex gap-3 flex-wrap"},C__default.createElement(A,{onClick:f,style:{backgroundColor:n==null?void 0:n.primaryColor}},"Accept All"),C__default.createElement(A,{onClick:u,variant:"outline"},"Reject All"),C__default.createElement(A,{onClick:k,variant:"ghost"},"Manage Preferences"))))):null};U.Message=({children:e,className:n})=>C__default.createElement("div",{className:v("mb-4",n)},e);U.Actions=({children:e,className:n})=>C__default.createElement("div",{className:v("flex gap-3 flex-wrap",n)},e);function fe(o){var t=o,{className:e}=t,n=x(t,["className"]);return C.createElement(j.Root,a({"data-slot":"switch",className:v("peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",e)},n),C.createElement(j.Thumb,{"data-slot":"switch-thumb",className:v("bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0")}))}var q=({open:e,onOpenChange:n,children:o})=>e?C.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center"},C.createElement("div",{className:"fixed inset-0 bg-black/50",onClick:()=>n==null?void 0:n(false)}),o):null,L=C.forwardRef((l,s)=>{var r=l,{className:e,children:n,unstyled:o}=r,t=x(r,["className","children","unstyled"]);return C.createElement("div",a({ref:s,className:v(!o&&"relative z-50 grid w-full max-w-lg gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg",e)},t),n)});L.displayName="DialogContent";var X=o=>{var t=o,{className:e}=t,n=x(t,["className"]);return C.createElement("div",a({className:v("flex flex-col space-y-1.5 text-center sm:text-left",e)},n))};X.displayName="DialogHeader";var Z=C.forwardRef((t,o)=>{var s=t,{className:e}=s,n=x(s,["className"]);return C.createElement("h3",a({ref:o,className:v("text-lg font-semibold leading-none tracking-tight",e)},n))});Z.displayName="DialogTitle";var K=C.forwardRef((t,o)=>{var s=t,{className:e}=s,n=x(s,["className"]);return C.createElement("p",a({ref:o,className:v("text-sm text-muted-foreground",e)},n))});K.displayName="DialogDescription";var Ie=[{id:"necessary",name:"Necessary Cookies",description:"These cookies are essential for the website to function properly.",disabled:true},{id:"analytics",name:"Analytics Cookies",description:"These cookies help us understand how visitors interact with our website.",disabled:false},{id:"marketing",name:"Marketing Cookies",description:"These cookies are used to track visitors across websites for marketing purposes.",disabled:false},{id:"functional",name:"Functional Cookies",description:"These cookies enable personalized features and functionality.",disabled:false}],J=({renderSettings:e,theme:n,unstyled:o=false,className:t,children:s})=>{let{showSettings:l,consentState:r,updateConsent:d,savePreferences:i,closeSettings:c}=g();if(!l)return null;let f=()=>{i(r);};return e?C__default.createElement(C__default.Fragment,null,e({consentState:r,onUpdateConsent:d,onSave:f,onClose:c})):s?C__default.createElement(q,{open:l,onOpenChange:c},C__default.createElement(L,{className:t,unstyled:o},s)):C__default.createElement(q,{open:l,onOpenChange:c},C__default.createElement(L,{className:"max-w-2xl"},C__default.createElement(X,null,C__default.createElement(Z,null,"Cookie Preferences"),C__default.createElement(K,null,"Manage your cookie preferences. You can enable or disable different categories of cookies below.")),C__default.createElement("div",{className:"space-y-6 py-4"},Ie.map(u=>C__default.createElement("div",{key:u.id,className:"flex items-start justify-between space-x-4"},C__default.createElement("div",{className:"flex-1"},C__default.createElement("h4",{className:"font-medium mb-1"},u.name),C__default.createElement("p",{className:"text-sm text-gray-600"},u.description)),C__default.createElement(fe,{checked:r[u.id],onCheckedChange:k=>d(u.id,k),disabled:u.disabled})))),C__default.createElement("div",{className:"flex justify-end gap-3 pt-4 border-t"},C__default.createElement(A,{variant:"outline",onClick:c},"Cancel"),C__default.createElement(A,{onClick:f,style:{backgroundColor:n==null?void 0:n.primaryColor}},"Save Preferences"))))};var je=({children:e,headless:n=false,renderBanner:o,renderSettings:t,components:s,theme:l,position:r="bottom",animation:d="slide",fullWidth:i=true,maxWidth:c="1200px"})=>{let f=g();if(typeof e=="function"){let u={consents:f.consentState,actions:{acceptAll:f.acceptAll,rejectAll:f.rejectAll,savePreferences:f.savePreferences,updateConsent:f.updateConsent,openSettings:f.openSettings,closeSettings:f.closeSettings},ui:{showBanner:f.showBanner,showSettings:f.showSettings,openSettings:f.openSettings,closeSettings:f.closeSettings}};return C__default.createElement(C__default.Fragment,null,e(u))}return C__default.createElement(C__default.Fragment,null,e,!n&&C__default.createElement(C__default.Fragment,null,s!=null&&s.Banner?C__default.createElement(s.Banner,null):C__default.createElement(U,{renderBanner:o,theme:l,position:r,animation:d,fullWidth:i,maxWidth:c}),s!=null&&s.Settings?C__default.createElement(s.Settings,null):C__default.createElement(J,{renderSettings:t,theme:l})))},ee=l=>{var r=l,{children:e,initialConsent:n,onConsentChange:o,storageKey:t}=r,s=x(r,["children","initialConsent","onConsentChange","storageKey"]);return C__default.createElement(G,{initialConsent:n,onConsentChange:o,storageKey:t},C__default.createElement(je,a({},s),e))};ee.Banner=U;ee.Settings=J;var ue=({className:e,children:n})=>{let{showBanner:o,acceptAll:t,rejectAll:s,openSettings:l}=g();return o?C__default.createElement("div",{className:e,role:"region","aria-label":"Cookie consent"},n||C__default.createElement(C__default.Fragment,null,C__default.createElement("div",null,C__default.createElement("h3",null,"Cookie Consent"),C__default.createElement("p",null,"We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.")),C__default.createElement("div",null,C__default.createElement("button",{onClick:t,"aria-label":"Accept all cookies"},"Accept All"),C__default.createElement("button",{onClick:s,"aria-label":"Reject non-essential cookies"},"Reject All"),C__default.createElement("button",{onClick:l,"aria-label":"Manage cookie preferences"},"Manage Preferences")))):null};var Le=[{id:"necessary",name:"Necessary Cookies",description:"These cookies are essential for the website to function properly.",disabled:true},{id:"analytics",name:"Analytics Cookies",description:"These cookies help us understand how visitors interact with our website.",disabled:false},{id:"marketing",name:"Marketing Cookies",description:"These cookies are used to track visitors across websites for marketing purposes.",disabled:false},{id:"functional",name:"Functional Cookies",description:"These cookies enable personalized features and functionality.",disabled:false}],pe=({className:e,children:n})=>{let{showSettings:o,consentState:t,updateConsent:s,savePreferences:l,closeSettings:r}=g();if(!o)return null;let d=()=>{l(t);};return C__default.createElement("div",{className:e,role:"dialog","aria-label":"Cookie preferences"},n||C__default.createElement(C__default.Fragment,null,C__default.createElement("div",null,C__default.createElement("h2",null,"Cookie Preferences"),C__default.createElement("p",null,"Manage your cookie preferences. You can enable or disable different categories of cookies below.")),C__default.createElement("div",null,Le.map(i=>C__default.createElement("div",{key:i.id},C__default.createElement("div",null,C__default.createElement("h4",null,i.name),C__default.createElement("p",null,i.description)),C__default.createElement("input",{type:"checkbox",checked:t[i.id],onChange:c=>s(i.id,c.target.checked),disabled:i.disabled,"aria-label":`Toggle ${i.name}`})))),C__default.createElement("div",null,C__default.createElement("button",{onClick:r,"aria-label":"Cancel changes"},"Cancel"),C__default.createElement("button",{onClick:d,"aria-label":"Save cookie preferences"},"Save Preferences"))))};var ge=({category:e,className:n,label:o})=>{let{consentState:t,updateConsent:s}=g();return C__default.createElement("label",{className:n},C__default.createElement("input",{type:"checkbox",checked:t[e],onChange:l=>s(e,l.target.checked),"aria-label":o||`Toggle ${e} cookies`}),o&&C__default.createElement("span",null,o))};function Je(){let{hasUserConsented:e,consentState:n,showBanner:o,showSettings:t}=g();return {hasUserConsented:e,consentState:n,showBanner:o,showSettings:t}}function ze(){let{acceptAll:e,rejectAll:n,savePreferences:o,openSettings:t,closeSettings:s,updateConsent:l}=g();return {acceptAll:e,rejectAll:n,savePreferences:o,openSettings:t,closeSettings:s,updateConsent:l}}function Fe(){let e=g(),n=useRef(new Map),o=useRef({hasUserConsented:e.hasUserConsented,showBanner:e.showBanner,showSettings:e.showSettings,consentState:e.consentState}),t=useCallback((r,d)=>{let i=n.current.get(r);i&&i.forEach(c=>c(d));},[]),s=useCallback((r,d)=>(n.current.has(r)||n.current.set(r,new Set),n.current.get(r).add(d),()=>{let i=n.current.get(r);i&&i.delete(d);}),[]),l=useCallback((r,d)=>{let i=n.current.get(r);i&&i.delete(d);},[]);return useEffect(()=>{let r=o.current;if(!r.hasUserConsented&&e.hasUserConsented){let d=Object.entries(e.consentState).filter(([i])=>i!=="necessary").every(([,i])=>i);t(d?"consent:accepted":"consent:rejected",e.consentState);}r.hasUserConsented&&e.hasUserConsented&&JSON.stringify(r.consentState)!==JSON.stringify(e.consentState)&&t("consent:updated",e.consentState),!r.showBanner&&e.showBanner?t("banner:shown"):r.showBanner&&!e.showBanner&&t("banner:hidden"),!r.showSettings&&e.showSettings?t("settings:opened"):r.showSettings&&!e.showSettings&&t("settings:closed"),o.current={hasUserConsented:e.hasUserConsented,showBanner:e.showBanner,showSettings:e.showSettings,consentState:a({},e.consentState)};},[e,t]),T(a({},e),{on:s,off:l,emit:t})}var z="ndpr_consent_records",V="ndpr_consent_history",oe=()=>{if(typeof window=="undefined")return [];let e=localStorage.getItem(V);if(!e)return [];try{return JSON.parse(e)}catch(n){return console.error("Error parsing consent history:",n),[]}},ve={saveConsent:(e,n)=>{let o={id:v4(),userId:n,consents:e,timestamp:new Date().toISOString(),ipAddress:"Collected server-side in real implementation",userAgent:typeof window!="undefined"?window.navigator.userAgent:"Unknown"};if(typeof window!="undefined"){localStorage.setItem(z,JSON.stringify(o));let t=oe();t.push(o),localStorage.setItem(V,JSON.stringify(t));}return o},getCurrentConsent:()=>{if(typeof window=="undefined")return null;let e=localStorage.getItem(z);if(!e)return null;try{return JSON.parse(e)}catch(n){return console.error("Error parsing consent record:",n),null}},getConsentHistory:()=>oe(),updateConsent:(e,n,o)=>{let t={id:v4(),userId:o,consents:e,timestamp:new Date().toISOString(),ipAddress:"Collected server-side in real implementation",userAgent:typeof window!="undefined"?window.navigator.userAgent:"Unknown",changeReason:n};if(typeof window!="undefined"){localStorage.setItem(z,JSON.stringify(t));let s=oe();s.push(t),localStorage.setItem(V,JSON.stringify(s));}return t},clearConsentData:()=>{typeof window!="undefined"&&(localStorage.removeItem(z),localStorage.removeItem(V));},hasConsent:e=>{let n=ve.getCurrentConsent();return n?n.consents[e]===true:false}};var at={set:(e,n,o)=>{if(typeof window=="undefined")return;let t=new Date;t.setTime(t.getTime()+o*24*60*60*1e3);let s=`expires=${t.toUTCString()}`;document.cookie=`${e}=${n};${s};path=/`;},get:e=>{if(typeof window=="undefined")return null;let n=`${e}=`,o=document.cookie.split(";");for(let t=0;t<o.length;t++){let s=o[t];for(;s.charAt(0)===" ";)s=s.substring(1,s.length);if(s.indexOf(n)===0)return s.substring(n.length,s.length)}return null},delete:e=>{typeof window!="undefined"&&(document.cookie=`${e}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`);}},lt={save:(e,n)=>{typeof window!="undefined"&&localStorage.setItem(e,JSON.stringify(n));},load:e=>{if(typeof window=="undefined")return null;let n=localStorage.getItem(e);return n?JSON.parse(n):null},remove:e=>{typeof window!="undefined"&&localStorage.removeItem(e);}};export{U as ConsentBanner,Y as ConsentContext,ee as ConsentManager,G as ConsentProvider,J as ConsentSettings,ue as UnstyledConsentBanner,pe as UnstyledConsentSettings,ge as UnstyledConsentToggle,ve as consentService,lt as consentStorage,at as cookieUtils,Ee as createConsentContext,g as useConsent,ze as useConsentActions,Fe as useConsentManager,Je as useConsentState};//# sourceMappingURL=index.mjs.map
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/ConsentContext.tsx","../src/contexts/GenericConsentContext.tsx","../src/lib/utils.ts","../src/components/ui/Button.tsx","../src/components/consent/ConsentBanner.tsx","../src/components/ui/switch.tsx","../src/components/ui/dialog.tsx","../src/components/consent/ConsentSettings.tsx","../src/components/consent/ConsentManager.tsx","../src/components/consent/unstyled/UnstyledConsentBanner.tsx","../src/components/consent/unstyled/UnstyledConsentSettings.tsx","../src/components/consent/unstyled/UnstyledConsentToggle.tsx","../src/hooks/useConsentState.ts","../src/hooks/useConsentActions.ts","../src/hooks/useConsentManager.ts","../src/lib/consentService.ts","../src/index.ts"],"names":["ConsentContext","createContext","defaultConsent","ConsentProvider","children","initialConsent","onConsentChange","storageKey","consentState","setConsentState","useState","stored","parsed","__spreadValues","e","hasUserConsented","setHasUserConsented","showBanner","setShowBanner","showSettings","setShowSettings","useEffect","acceptAll","useCallback","rejectAll","savePreferences","preferences","prev","__spreadProps","updateConsent","category","value","openSettings","closeSettings","React","useConsent","context","useContext","createConsentContext","categories","getDefaultConsent","cat","newConsent","key","cn","inputs","twMerge","clsx","buttonVariants","cva","Button","_a","_b","className","variant","size","asChild","props","__objRest","de","Slot","ConsentBanner","renderBanner","theme","position","animation","fullWidth","maxWidth","unstyled","Switch","Q","Dialog","open","onOpenChange","w","DialogContent","ref","DialogHeader","DialogTitle","DialogDescription","cookieCategories","ConsentSettings","renderSettings","handleSave","checked","ConsentManagerInner","headless","components","consent","renderProps","ConsentManager","innerProps","UnstyledConsentBanner","UnstyledConsentSettings","UnstyledConsentToggle","label","useConsentState","useConsentActions","useConsentManager","listenersRef","useRef","previousStateRef","emit","event","data","listeners","listener","on","off","allAccepted","CONSENT_STORAGE_KEY","CONSENT_HISTORY_KEY","getConsentHistoryHelper","storedHistory","error","consentService","consents","userId","consentRecord","uuidv4","history","storedConsent","changeReason","type","current","cookieUtils","name","days","date","expires","nameEQ","ca","i","c","consentStorage"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react';\n\nexport interface ConsentCategories {\n necessary: boolean;\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n [key: string]: boolean;\n}\n\nexport interface ConsentState {\n hasUserConsented: boolean;\n consentState: ConsentCategories;\n showBanner: boolean;\n showSettings: boolean;\n}\n\nexport interface ConsentActions {\n acceptAll: () => void;\n rejectAll: () => void;\n savePreferences: (preferences: Partial<ConsentCategories>) => void;\n openSettings: () => void;\n closeSettings: () => void;\n updateConsent: (category: keyof ConsentCategories, value: boolean) => void;\n}\n\nexport interface ConsentContextValue extends ConsentState, ConsentActions {}\n\nconst ConsentContext = createContext<ConsentContextValue | undefined>(undefined);\n\nexport interface ConsentProviderProps {\n children: ReactNode;\n initialConsent?: Partial<ConsentCategories>;\n onConsentChange?: (consent: ConsentCategories) => void;\n storageKey?: string;\n}\n\nconst defaultConsent: ConsentCategories = {\n necessary: true, // Always true\n analytics: false,\n marketing: false,\n functional: false,\n};\n\nexport function ConsentProvider({\n children,\n initialConsent = {},\n onConsentChange,\n storageKey = 'ndpr-consent',\n}: ConsentProviderProps) {\n const [consentState, setConsentState] = useState<ConsentCategories>(() => {\n // Try to load from localStorage\n if (typeof window !== 'undefined') {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n try {\n const parsed = JSON.parse(stored);\n return { ...defaultConsent, ...parsed };\n } catch (e) {\n console.error('Failed to parse consent from localStorage', e);\n }\n }\n }\n return { ...defaultConsent, ...initialConsent };\n });\n\n const [hasUserConsented, setHasUserConsented] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(`${storageKey}-set`) === 'true';\n }\n return false;\n });\n\n const [showBanner, setShowBanner] = useState(!hasUserConsented);\n const [showSettings, setShowSettings] = useState(false);\n\n // Persist consent to localStorage\n useEffect(() => {\n if (typeof window !== 'undefined' && hasUserConsented) {\n localStorage.setItem(storageKey, JSON.stringify(consentState));\n localStorage.setItem(`${storageKey}-set`, 'true');\n }\n }, [consentState, hasUserConsented, storageKey]);\n\n // Notify parent of consent changes\n useEffect(() => {\n if (hasUserConsented && onConsentChange) {\n onConsentChange(consentState);\n }\n }, [consentState, hasUserConsented, onConsentChange]);\n\n const acceptAll = useCallback(() => {\n const newConsent: ConsentCategories = {\n necessary: true,\n analytics: true,\n marketing: true,\n functional: true,\n };\n setConsentState(newConsent);\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, []);\n\n const rejectAll = useCallback(() => {\n const newConsent: ConsentCategories = {\n necessary: true,\n analytics: false,\n marketing: false,\n functional: false,\n };\n setConsentState(newConsent);\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, []);\n\n const savePreferences = useCallback((preferences: Partial<ConsentCategories>) => {\n setConsentState(prev => ({\n ...prev,\n ...preferences,\n necessary: true, // Always keep necessary as true\n }));\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, []);\n\n const updateConsent = useCallback((category: keyof ConsentCategories, value: boolean) => {\n if (category === 'necessary') return; // Can't change necessary cookies\n \n setConsentState(prev => ({\n ...prev,\n [category]: value,\n }));\n }, []);\n\n const openSettings = useCallback(() => {\n setShowSettings(true);\n setShowBanner(false);\n }, []);\n\n const closeSettings = useCallback(() => {\n setShowSettings(false);\n }, []);\n\n const value: ConsentContextValue = {\n hasUserConsented,\n consentState,\n showBanner,\n showSettings,\n acceptAll,\n rejectAll,\n savePreferences,\n openSettings,\n closeSettings,\n updateConsent,\n };\n\n return (\n <ConsentContext.Provider value={value}>\n {children}\n </ConsentContext.Provider>\n );\n}\n\nexport function useConsent() {\n const context = useContext(ConsentContext);\n if (!context) {\n throw new Error('useConsent must be used within a ConsentProvider');\n }\n return context;\n}\n\n// Export for external use\nexport { ConsentContext };","import React, { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react';\nimport {\n BaseConsentCategories,\n DefaultConsentCategories,\n ConsentState,\n ConsentActions,\n ConsentContextValue,\n ConsentProviderProps,\n} from '@/types/consent';\n\n/**\n * Factory function to create a typed consent context\n */\nexport function createConsentContext<T extends BaseConsentCategories = DefaultConsentCategories>() {\n const ConsentContext = createContext<ConsentContextValue<T> | undefined>(undefined);\n\n function ConsentProvider({\n children,\n initialConsent = {} as Partial<T>,\n onConsentChange,\n storageKey = 'ndpr-consent',\n categories,\n }: ConsentProviderProps<T>) {\n const getDefaultConsent = (): T => {\n const defaultConsent: any = { necessary: true };\n \n if (categories) {\n categories.forEach(cat => {\n if (cat.id !== 'necessary') {\n defaultConsent[cat.id] = false;\n }\n });\n } else {\n // Use default categories\n defaultConsent.analytics = false;\n defaultConsent.marketing = false;\n defaultConsent.functional = false;\n }\n \n return defaultConsent as T;\n };\n\n const [consentState, setConsentState] = useState<T>(() => {\n // Try to load from localStorage\n if (typeof window !== 'undefined') {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n try {\n const parsed = JSON.parse(stored);\n return { ...getDefaultConsent(), ...parsed };\n } catch (e) {\n console.error('Failed to parse consent from localStorage', e);\n }\n }\n }\n return { ...getDefaultConsent(), ...initialConsent } as T;\n });\n\n const [hasUserConsented, setHasUserConsented] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(`${storageKey}-set`) === 'true';\n }\n return false;\n });\n\n const [showBanner, setShowBanner] = useState(!hasUserConsented);\n const [showSettings, setShowSettings] = useState(false);\n\n // Persist consent to localStorage\n useEffect(() => {\n if (typeof window !== 'undefined' && hasUserConsented) {\n localStorage.setItem(storageKey, JSON.stringify(consentState));\n localStorage.setItem(`${storageKey}-set`, 'true');\n }\n }, [consentState, hasUserConsented, storageKey]);\n\n // Notify parent of consent changes\n useEffect(() => {\n if (hasUserConsented && onConsentChange) {\n onConsentChange(consentState);\n }\n }, [consentState, hasUserConsented, onConsentChange]);\n\n const acceptAll = useCallback(() => {\n const newConsent = { ...consentState };\n Object.keys(newConsent).forEach(key => {\n newConsent[key as keyof T] = true as any;\n });\n setConsentState(newConsent);\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, [consentState]);\n\n const rejectAll = useCallback(() => {\n const newConsent = { ...consentState };\n Object.keys(newConsent).forEach(key => {\n if (key !== 'necessary') {\n newConsent[key as keyof T] = false as any;\n }\n });\n setConsentState(newConsent);\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, [consentState]);\n\n const savePreferences = useCallback((preferences: Partial<T>) => {\n setConsentState(prev => ({\n ...prev,\n ...preferences,\n necessary: true, // Always keep necessary as true\n } as T));\n setHasUserConsented(true);\n setShowBanner(false);\n setShowSettings(false);\n }, []);\n\n const updateConsent = useCallback((category: keyof T, value: boolean) => {\n if (category === 'necessary') return; // Can't change necessary cookies\n \n setConsentState(prev => ({\n ...prev,\n [category]: value,\n }));\n }, []);\n\n const openSettings = useCallback(() => {\n setShowSettings(true);\n setShowBanner(false);\n }, []);\n\n const closeSettings = useCallback(() => {\n setShowSettings(false);\n }, []);\n\n const value: ConsentContextValue<T> = {\n hasUserConsented,\n consentState,\n showBanner,\n showSettings,\n acceptAll,\n rejectAll,\n savePreferences,\n openSettings,\n closeSettings,\n updateConsent,\n };\n\n return (\n <ConsentContext.Provider value={value}>\n {children}\n </ConsentContext.Provider>\n );\n }\n\n function useConsent() {\n const context = useContext(ConsentContext);\n if (!context) {\n throw new Error('useConsent must be used within a ConsentProvider');\n }\n return context;\n }\n\n return {\n ConsentContext,\n ConsentProvider,\n useConsent,\n };\n}","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { Button } from '@/components/ui/Button';\nimport { cn } from '@/lib/utils';\nimport { BannerProps } from './ConsentManager';\n\nexport interface ConsentBannerProps {\n renderBanner?: (props: BannerProps) => ReactNode;\n theme?: {\n primaryColor?: string;\n textColor?: string;\n backgroundColor?: string;\n };\n position?: 'top' | 'bottom' | 'center';\n animation?: 'slide' | 'fade' | 'none';\n fullWidth?: boolean;\n maxWidth?: string;\n unstyled?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\ninterface ConsentBannerComponent extends React.FC<ConsentBannerProps> {\n Message: React.FC<{ children: ReactNode; className?: string }>;\n Actions: React.FC<{ children: ReactNode; className?: string }>;\n}\n\nconst ConsentBanner: ConsentBannerComponent = ({\n renderBanner,\n theme,\n position = 'bottom',\n animation = 'slide',\n fullWidth = true,\n maxWidth = '1200px',\n unstyled = false,\n className,\n children,\n}) => {\n const { showBanner, acceptAll, rejectAll, openSettings } = useConsent();\n\n if (!showBanner) return null;\n\n // Custom render function\n if (renderBanner) {\n return <>{renderBanner({ onAcceptAll: acceptAll, onRejectAll: rejectAll, onOpenSettings: openSettings })}</>;\n }\n\n // Children-based composition\n if (children) {\n return (\n <div\n className={cn(\n !unstyled && [\n 'fixed z-50 p-4',\n position === 'bottom' && 'bottom-0 left-0 right-0',\n position === 'top' && 'top-0 left-0 right-0',\n position === 'center' && 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n animation === 'slide' && 'animate-slide-in',\n animation === 'fade' && 'animate-fade-in',\n ],\n className\n )}\n style={{\n backgroundColor: unstyled ? undefined : theme?.backgroundColor || 'white',\n color: unstyled ? undefined : theme?.textColor,\n maxWidth: fullWidth ? undefined : maxWidth,\n margin: fullWidth ? undefined : '0 auto',\n }}\n >\n {children}\n </div>\n );\n }\n\n // Default implementation\n return (\n <div\n className={cn(\n 'fixed z-50 p-4',\n position === 'bottom' && 'bottom-0 left-0 right-0',\n position === 'top' && 'top-0 left-0 right-0',\n position === 'center' && 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n animation === 'slide' && 'animate-slide-in',\n animation === 'fade' && 'animate-fade-in',\n className\n )}\n style={{\n backgroundColor: theme?.backgroundColor || 'white',\n color: theme?.textColor,\n }}\n >\n <div\n className=\"mx-auto\"\n style={{\n maxWidth: fullWidth ? undefined : maxWidth,\n }}\n >\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-lg font-semibold mb-2\">Cookie Consent</h3>\n <p className=\"text-gray-600 mb-4\">\n We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.\n </p>\n <div className=\"flex gap-3 flex-wrap\">\n <Button\n onClick={acceptAll}\n style={{ backgroundColor: theme?.primaryColor }}\n >\n Accept All\n </Button>\n <Button\n onClick={rejectAll}\n variant=\"outline\"\n >\n Reject All\n </Button>\n <Button\n onClick={openSettings}\n variant=\"ghost\"\n >\n Manage Preferences\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// Sub-components for composition\nConsentBanner.Message = ({ children, className }) => (\n <div className={cn('mb-4', className)}>{children}</div>\n);\n\nConsentBanner.Actions = ({ children, className }) => (\n <div className={cn('flex gap-3 flex-wrap', className)}>{children}</div>\n);\n\nexport { ConsentBanner };","\"use client\"\n\nimport * as React from \"react\"\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\ninterface DialogProps {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Dialog = ({ open, onOpenChange, children }: DialogProps) => {\n if (!open) return null\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <div \n className=\"fixed inset-0 bg-black/50\" \n onClick={() => onOpenChange?.(false)}\n />\n {children}\n </div>\n )\n}\n\nconst DialogContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { unstyled?: boolean }\n>(({ className, children, unstyled, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n !unstyled && \"relative z-50 grid w-full max-w-lg gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n))\nDialogContent.displayName = \"DialogContent\"\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = \"DialogTitle\"\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = \"DialogDescription\"\n\nexport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n}","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { Button } from '@/components/ui/Button';\nimport { Switch } from '@/components/ui/switch';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog';\nimport { SettingsProps } from './ConsentManager';\n\nexport interface ConsentSettingsProps {\n renderSettings?: (props: SettingsProps) => ReactNode;\n theme?: {\n primaryColor?: string;\n textColor?: string;\n backgroundColor?: string;\n };\n unstyled?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nconst cookieCategories = [\n {\n id: 'necessary',\n name: 'Necessary Cookies',\n description: 'These cookies are essential for the website to function properly.',\n disabled: true,\n },\n {\n id: 'analytics',\n name: 'Analytics Cookies',\n description: 'These cookies help us understand how visitors interact with our website.',\n disabled: false,\n },\n {\n id: 'marketing',\n name: 'Marketing Cookies',\n description: 'These cookies are used to track visitors across websites for marketing purposes.',\n disabled: false,\n },\n {\n id: 'functional',\n name: 'Functional Cookies',\n description: 'These cookies enable personalized features and functionality.',\n disabled: false,\n },\n];\n\nexport const ConsentSettings: React.FC<ConsentSettingsProps> = ({\n renderSettings,\n theme,\n unstyled = false,\n className,\n children,\n}) => {\n const { showSettings, consentState, updateConsent, savePreferences, closeSettings } = useConsent();\n\n if (!showSettings) return null;\n\n const handleSave = () => {\n savePreferences(consentState);\n };\n\n // Custom render function\n if (renderSettings) {\n return (\n <>\n {renderSettings({\n consentState,\n onUpdateConsent: updateConsent,\n onSave: handleSave,\n onClose: closeSettings,\n })}\n </>\n );\n }\n\n // Children-based composition\n if (children) {\n return (\n <Dialog open={showSettings} onOpenChange={closeSettings}>\n <DialogContent className={className} unstyled={unstyled}>\n {children}\n </DialogContent>\n </Dialog>\n );\n }\n\n // Default implementation\n return (\n <Dialog open={showSettings} onOpenChange={closeSettings}>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>Cookie Preferences</DialogTitle>\n <DialogDescription>\n Manage your cookie preferences. You can enable or disable different categories of cookies below.\n </DialogDescription>\n </DialogHeader>\n \n <div className=\"space-y-6 py-4\">\n {cookieCategories.map((category) => (\n <div key={category.id} className=\"flex items-start justify-between space-x-4\">\n <div className=\"flex-1\">\n <h4 className=\"font-medium mb-1\">{category.name}</h4>\n <p className=\"text-sm text-gray-600\">{category.description}</p>\n </div>\n <Switch\n checked={consentState[category.id as keyof typeof consentState]}\n onCheckedChange={(checked) => updateConsent(category.id as keyof typeof consentState, checked)}\n disabled={category.disabled}\n />\n </div>\n ))}\n </div>\n\n <div className=\"flex justify-end gap-3 pt-4 border-t\">\n <Button variant=\"outline\" onClick={closeSettings}>\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n style={{ backgroundColor: theme?.primaryColor }}\n >\n Save Preferences\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n};","import React, { ReactNode } from 'react';\nimport { ConsentProvider, ConsentProviderProps, ConsentCategories, ConsentActions, useConsent } from '@/contexts/ConsentContext';\nimport { ConsentBanner } from './ConsentBanner';\nimport { ConsentSettings } from './ConsentSettings';\n\nexport interface BannerProps {\n onAcceptAll: () => void;\n onRejectAll: () => void;\n onOpenSettings: () => void;\n}\n\nexport interface SettingsProps {\n consentState: ConsentCategories;\n onUpdateConsent: (category: keyof ConsentCategories, value: boolean) => void;\n onSave: () => void;\n onClose: () => void;\n}\n\nexport interface RenderProps {\n consents: ConsentCategories;\n actions: ConsentActions;\n ui: {\n showBanner: boolean;\n showSettings: boolean;\n openSettings: () => void;\n closeSettings: () => void;\n };\n}\n\nexport interface ConsentManagerProps extends Omit<ConsentProviderProps, 'children'> {\n children?: ReactNode | ((props: RenderProps) => ReactNode);\n headless?: boolean;\n renderBanner?: (props: BannerProps) => ReactNode;\n renderSettings?: (props: SettingsProps) => ReactNode;\n components?: {\n Banner?: React.ComponentType<any>;\n Settings?: React.ComponentType<any>;\n };\n theme?: {\n primaryColor?: string;\n textColor?: string;\n backgroundColor?: string;\n };\n position?: 'top' | 'bottom' | 'center';\n animation?: 'slide' | 'fade' | 'none';\n fullWidth?: boolean;\n maxWidth?: string;\n}\n\ninterface ConsentManagerComponent extends React.FC<ConsentManagerProps> {\n Banner: typeof ConsentBanner;\n Settings: typeof ConsentSettings;\n}\n\n// Internal component that has access to consent context\nconst ConsentManagerInner: React.FC<Omit<ConsentManagerProps, keyof Omit<ConsentProviderProps, 'children'>>> = ({\n children,\n headless = false,\n renderBanner,\n renderSettings,\n components,\n theme,\n position = 'bottom',\n animation = 'slide',\n fullWidth = true,\n maxWidth = '1200px',\n}) => {\n const consent = useConsent();\n\n // If using render props pattern\n if (typeof children === 'function') {\n const renderProps: RenderProps = {\n consents: consent.consentState,\n actions: {\n acceptAll: consent.acceptAll,\n rejectAll: consent.rejectAll,\n savePreferences: consent.savePreferences,\n updateConsent: consent.updateConsent,\n openSettings: consent.openSettings,\n closeSettings: consent.closeSettings,\n },\n ui: {\n showBanner: consent.showBanner,\n showSettings: consent.showSettings,\n openSettings: consent.openSettings,\n closeSettings: consent.closeSettings,\n },\n };\n return <>{children(renderProps)}</>;\n }\n\n return (\n <>\n {children}\n {!headless && (\n <>\n {components?.Banner ? (\n <components.Banner />\n ) : (\n <ConsentBanner\n renderBanner={renderBanner}\n theme={theme}\n position={position}\n animation={animation}\n fullWidth={fullWidth}\n maxWidth={maxWidth}\n />\n )}\n {components?.Settings ? (\n <components.Settings />\n ) : (\n <ConsentSettings\n renderSettings={renderSettings}\n theme={theme}\n />\n )}\n </>\n )}\n </>\n );\n};\n\nconst ConsentManager: ConsentManagerComponent = ({\n children,\n initialConsent,\n onConsentChange,\n storageKey,\n ...innerProps\n}) => {\n return (\n <ConsentProvider\n initialConsent={initialConsent}\n onConsentChange={onConsentChange}\n storageKey={storageKey}\n >\n <ConsentManagerInner {...innerProps}>\n {children}\n </ConsentManagerInner>\n </ConsentProvider>\n );\n};\n\n// Attach sub-components for composition\nConsentManager.Banner = ConsentBanner;\nConsentManager.Settings = ConsentSettings;\n\nexport { ConsentManager };","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentBannerProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport const UnstyledConsentBanner: React.FC<UnstyledConsentBannerProps> = ({\n className,\n children,\n}) => {\n const { showBanner, acceptAll, rejectAll, openSettings } = useConsent();\n\n if (!showBanner) return null;\n\n return (\n <div className={className} role=\"region\" aria-label=\"Cookie consent\">\n {children || (\n <>\n <div>\n <h3>Cookie Consent</h3>\n <p>We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.</p>\n </div>\n <div>\n <button onClick={acceptAll} aria-label=\"Accept all cookies\">\n Accept All\n </button>\n <button onClick={rejectAll} aria-label=\"Reject non-essential cookies\">\n Reject All\n </button>\n <button onClick={openSettings} aria-label=\"Manage cookie preferences\">\n Manage Preferences\n </button>\n </div>\n </>\n )}\n </div>\n );\n};","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentSettingsProps {\n className?: string;\n children?: ReactNode;\n}\n\nconst cookieCategories = [\n {\n id: 'necessary',\n name: 'Necessary Cookies',\n description: 'These cookies are essential for the website to function properly.',\n disabled: true,\n },\n {\n id: 'analytics',\n name: 'Analytics Cookies',\n description: 'These cookies help us understand how visitors interact with our website.',\n disabled: false,\n },\n {\n id: 'marketing',\n name: 'Marketing Cookies',\n description: 'These cookies are used to track visitors across websites for marketing purposes.',\n disabled: false,\n },\n {\n id: 'functional',\n name: 'Functional Cookies',\n description: 'These cookies enable personalized features and functionality.',\n disabled: false,\n },\n];\n\nexport const UnstyledConsentSettings: React.FC<UnstyledConsentSettingsProps> = ({\n className,\n children,\n}) => {\n const { showSettings, consentState, updateConsent, savePreferences, closeSettings } = useConsent();\n\n if (!showSettings) return null;\n\n const handleSave = () => {\n savePreferences(consentState);\n };\n\n return (\n <div className={className} role=\"dialog\" aria-label=\"Cookie preferences\">\n {children || (\n <>\n <div>\n <h2>Cookie Preferences</h2>\n <p>Manage your cookie preferences. You can enable or disable different categories of cookies below.</p>\n </div>\n \n <div>\n {cookieCategories.map((category) => (\n <div key={category.id}>\n <div>\n <h4>{category.name}</h4>\n <p>{category.description}</p>\n </div>\n <input\n type=\"checkbox\"\n checked={consentState[category.id as keyof typeof consentState]}\n onChange={(e) => updateConsent(category.id as keyof typeof consentState, e.target.checked)}\n disabled={category.disabled}\n aria-label={`Toggle ${category.name}`}\n />\n </div>\n ))}\n </div>\n\n <div>\n <button onClick={closeSettings} aria-label=\"Cancel changes\">\n Cancel\n </button>\n <button onClick={handleSave} aria-label=\"Save cookie preferences\">\n Save Preferences\n </button>\n </div>\n </>\n )}\n </div>\n );\n};","import React from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentToggleProps {\n category: 'analytics' | 'marketing' | 'functional';\n className?: string;\n label?: string;\n}\n\nexport const UnstyledConsentToggle: React.FC<UnstyledConsentToggleProps> = ({\n category,\n className,\n label,\n}) => {\n const { consentState, updateConsent } = useConsent();\n\n return (\n <label className={className}>\n <input\n type=\"checkbox\"\n checked={consentState[category]}\n onChange={(e) => updateConsent(category, e.target.checked)}\n aria-label={label || `Toggle ${category} cookies`}\n />\n {label && <span>{label}</span>}\n </label>\n );\n};","import { useConsent } from '@/contexts/ConsentContext';\n\n/**\n * Hook to access only the consent state without actions\n */\nexport function useConsentState() {\n const { hasUserConsented, consentState, showBanner, showSettings } = useConsent();\n \n return {\n hasUserConsented,\n consentState,\n showBanner,\n showSettings,\n };\n}","import { useConsent } from '@/contexts/ConsentContext';\n\n/**\n * Hook to access only the consent actions without state\n */\nexport function useConsentActions() {\n const {\n acceptAll,\n rejectAll,\n savePreferences,\n openSettings,\n closeSettings,\n updateConsent,\n } = useConsent();\n \n return {\n acceptAll,\n rejectAll,\n savePreferences,\n openSettings,\n closeSettings,\n updateConsent,\n };\n}","import { useEffect, useRef, useCallback } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { ConsentCategories } from '@/contexts/ConsentContext';\n\ntype ConsentEventType = \n | 'consent:accepted'\n | 'consent:rejected'\n | 'consent:updated'\n | 'banner:shown'\n | 'banner:hidden'\n | 'settings:opened'\n | 'settings:closed';\n\ntype ConsentEventListener = (data?: any) => void;\n\ninterface ConsentEventManager {\n on: (event: ConsentEventType, listener: ConsentEventListener) => () => void;\n off: (event: ConsentEventType, listener: ConsentEventListener) => void;\n emit: (event: ConsentEventType, data?: any) => void;\n}\n\n/**\n * Advanced hook that provides event-driven consent management\n */\nexport function useConsentManager(): ConsentEventManager & ReturnType<typeof useConsent> {\n const consent = useConsent();\n const listenersRef = useRef<Map<ConsentEventType, Set<ConsentEventListener>>>(new Map());\n const previousStateRef = useRef({\n hasUserConsented: consent.hasUserConsented,\n showBanner: consent.showBanner,\n showSettings: consent.showSettings,\n consentState: consent.consentState,\n });\n\n // Event emitter implementation\n const emit = useCallback((event: ConsentEventType, data?: any) => {\n const listeners = listenersRef.current.get(event);\n if (listeners) {\n listeners.forEach(listener => listener(data));\n }\n }, []);\n\n const on = useCallback((event: ConsentEventType, listener: ConsentEventListener) => {\n if (!listenersRef.current.has(event)) {\n listenersRef.current.set(event, new Set());\n }\n listenersRef.current.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n const listeners = listenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n };\n }, []);\n\n const off = useCallback((event: ConsentEventType, listener: ConsentEventListener) => {\n const listeners = listenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }, []);\n\n // Track state changes and emit events\n useEffect(() => {\n const prev = previousStateRef.current;\n \n // Check for consent acceptance\n if (!prev.hasUserConsented && consent.hasUserConsented) {\n const allAccepted = Object.entries(consent.consentState)\n .filter(([key]) => key !== 'necessary')\n .every(([, value]) => value);\n \n if (allAccepted) {\n emit('consent:accepted', consent.consentState);\n } else {\n emit('consent:rejected', consent.consentState);\n }\n }\n\n // Check for consent updates\n if (prev.hasUserConsented && consent.hasUserConsented && \n JSON.stringify(prev.consentState) !== JSON.stringify(consent.consentState)) {\n emit('consent:updated', consent.consentState);\n }\n\n // Check for banner visibility changes\n if (!prev.showBanner && consent.showBanner) {\n emit('banner:shown');\n } else if (prev.showBanner && !consent.showBanner) {\n emit('banner:hidden');\n }\n\n // Check for settings visibility changes\n if (!prev.showSettings && consent.showSettings) {\n emit('settings:opened');\n } else if (prev.showSettings && !consent.showSettings) {\n emit('settings:closed');\n }\n\n // Update previous state\n previousStateRef.current = {\n hasUserConsented: consent.hasUserConsented,\n showBanner: consent.showBanner,\n showSettings: consent.showSettings,\n consentState: { ...consent.consentState },\n };\n }, [consent, emit]);\n\n return {\n ...consent,\n on,\n off,\n emit,\n };\n}","'use client';\n\nimport { ConsentRecord, ConsentType, ConsentHistoryEntry } from '@/types';\nimport { v4 as uuidv4 } from 'uuid';\n\n// In a real implementation, this would connect to a database\n// For demo purposes, we're using localStorage\n\nconst CONSENT_STORAGE_KEY = 'ndpr_consent_records';\nconst CONSENT_HISTORY_KEY = 'ndpr_consent_history';\n\n// Helper function to get consent history\nconst getConsentHistoryHelper = (): ConsentHistoryEntry[] => {\n if (typeof window === 'undefined') return [];\n \n const storedHistory = localStorage.getItem(CONSENT_HISTORY_KEY);\n if (!storedHistory) return [];\n \n try {\n return JSON.parse(storedHistory) as ConsentHistoryEntry[];\n } catch (error) {\n console.error('Error parsing consent history:', error);\n return [];\n }\n};\n\nexport const consentService = {\n // Save a new consent record\n saveConsent: (consents: Record<ConsentType, boolean>, userId?: string): ConsentRecord => {\n const consentRecord: ConsentRecord = {\n id: uuidv4(),\n userId,\n consents,\n timestamp: new Date().toISOString(),\n ipAddress: 'Collected server-side in real implementation',\n userAgent: typeof window !== 'undefined' ? window.navigator.userAgent : 'Unknown',\n };\n\n // Store in localStorage for demo\n if (typeof window !== 'undefined') {\n // Save as current consent\n localStorage.setItem(CONSENT_STORAGE_KEY, JSON.stringify(consentRecord));\n \n // Add to history\n const history = getConsentHistoryHelper();\n history.push(consentRecord);\n localStorage.setItem(CONSENT_HISTORY_KEY, JSON.stringify(history));\n }\n\n return consentRecord;\n },\n\n // Get the current consent record\n getCurrentConsent: (): ConsentRecord | null => {\n if (typeof window === 'undefined') return null;\n \n const storedConsent = localStorage.getItem(CONSENT_STORAGE_KEY);\n if (!storedConsent) return null;\n \n try {\n return JSON.parse(storedConsent) as ConsentRecord;\n } catch (error) {\n console.error('Error parsing consent record:', error);\n return null;\n }\n },\n\n // Get consent history\n getConsentHistory: (): ConsentHistoryEntry[] => {\n return getConsentHistoryHelper();\n },\n\n // Update consent with change reason\n updateConsent: (\n consents: Record<ConsentType, boolean>, \n changeReason?: string,\n userId?: string\n ): ConsentRecord => {\n const consentRecord: ConsentHistoryEntry = {\n id: uuidv4(),\n userId,\n consents,\n timestamp: new Date().toISOString(),\n ipAddress: 'Collected server-side in real implementation',\n userAgent: typeof window !== 'undefined' ? window.navigator.userAgent : 'Unknown',\n changeReason\n };\n\n // Store in localStorage for demo\n if (typeof window !== 'undefined') {\n // Save as current consent\n localStorage.setItem(CONSENT_STORAGE_KEY, JSON.stringify(consentRecord));\n \n // Add to history\n const history = getConsentHistoryHelper();\n history.push(consentRecord);\n localStorage.setItem(CONSENT_HISTORY_KEY, JSON.stringify(history));\n }\n\n return consentRecord;\n },\n\n // Clear all consent data (for testing/development)\n clearConsentData: (): void => {\n if (typeof window === 'undefined') return;\n \n localStorage.removeItem(CONSENT_STORAGE_KEY);\n localStorage.removeItem(CONSENT_HISTORY_KEY);\n },\n\n // Check if a specific consent is granted\n hasConsent: (type: ConsentType): boolean => {\n const current = consentService.getCurrentConsent();\n if (!current) return false;\n return current.consents[type] === true;\n }\n};\n\nexport default consentService;\n","// Core exports\nexport { ConsentProvider, useConsent, ConsentContext } from './contexts/ConsentContext';\nexport type { ConsentCategories, ConsentState, ConsentActions, ConsentContextValue } from './contexts/ConsentContext';\n\n// Generic consent context factory\nexport { createConsentContext } from './contexts/GenericConsentContext';\nexport type {\n BaseConsentCategories,\n DefaultConsentCategories,\n ConsentProviderProps,\n} from './types/consent';\n\n// Components\nexport { ConsentManager } from './components/consent/ConsentManager';\nexport { ConsentBanner } from './components/consent/ConsentBanner';\nexport { ConsentSettings } from './components/consent/ConsentSettings';\nexport type { ConsentManagerProps, BannerProps, SettingsProps, RenderProps } from './components/consent/ConsentManager';\n\n// Unstyled components\nexport {\n UnstyledConsentBanner,\n UnstyledConsentSettings,\n UnstyledConsentToggle,\n} from './components/consent/unstyled';\n\n// Hooks\nexport { useConsentState } from './hooks/useConsentState';\nexport { useConsentActions } from './hooks/useConsentActions';\nexport { useConsentManager } from './hooks/useConsentManager';\n\n// Utilities\nexport { consentService } from './lib/consentService';\n\n// Cookie utilities\nexport const cookieUtils = {\n set: (name: string, value: string, days: number) => {\n if (typeof window === 'undefined') return;\n const date = new Date();\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = `expires=${date.toUTCString()}`;\n document.cookie = `${name}=${value};${expires};path=/`;\n },\n get: (name: string): string | null => {\n if (typeof window === 'undefined') return null;\n const nameEQ = `${name}=`;\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n },\n delete: (name: string) => {\n if (typeof window === 'undefined') return;\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n }\n};\n\n// Consent storage utilities\nexport const consentStorage = {\n save: (key: string, data: any) => {\n if (typeof window === 'undefined') return;\n localStorage.setItem(key, JSON.stringify(data));\n },\n load: (key: string): any | null => {\n if (typeof window === 'undefined') return null;\n const data = localStorage.getItem(key);\n return data ? JSON.parse(data) : null;\n },\n remove: (key: string) => {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(key);\n }\n};"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ConsentRecord, ConsentType, ConsentHistoryEntry } from '@/types';
|
|
2
|
+
export declare const consentService: {
|
|
3
|
+
saveConsent: (consents: Record<ConsentType, boolean>, userId?: string) => ConsentRecord;
|
|
4
|
+
getCurrentConsent: () => ConsentRecord | null;
|
|
5
|
+
getConsentHistory: () => ConsentHistoryEntry[];
|
|
6
|
+
updateConsent: (consents: Record<ConsentType, boolean>, changeReason?: string, userId?: string) => ConsentRecord;
|
|
7
|
+
clearConsentData: () => void;
|
|
8
|
+
hasConsent: (type: ConsentType) => boolean;
|
|
9
|
+
};
|
|
10
|
+
export default consentService;
|
|
11
|
+
//# sourceMappingURL=consentService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consentService.d.ts","sourceRoot":"","sources":["../../src/lib/consentService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAwB1E,eAAO,MAAM,cAAc;4BAED,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,MAAM,KAAG,aAAa;6BAyB9D,aAAa,GAAG,IAAI;6BAepB,mBAAmB,EAAE;8BAMhC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,iBACvB,MAAM,WACZ,MAAM,KACd,aAAa;4BA0BM,IAAI;uBAQP,WAAW,KAAG,OAAO;CAKzC,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpiaQuestions.d.ts","sourceRoot":"","sources":["../../src/lib/dpiaQuestions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjD,eAAO,MAAM,aAAa,EAAE,sBAAsB,EAiJjD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DataSubjectRequest, RequestStatus } from '@/types';
|
|
2
|
+
export declare const requestService: {
|
|
3
|
+
createRequest: (requestType: DataSubjectRequest["requestType"], requesterName: string, requesterEmail: string, details: string, consent: boolean) => DataSubjectRequest;
|
|
4
|
+
updateStatus: (id: string, status: RequestStatus) => DataSubjectRequest | null;
|
|
5
|
+
getRequest: (id: string) => DataSubjectRequest | null;
|
|
6
|
+
getAllRequests: () => DataSubjectRequest[];
|
|
7
|
+
clear: () => void;
|
|
8
|
+
};
|
|
9
|
+
export default requestService;
|
|
10
|
+
//# sourceMappingURL=requestService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestService.d.ts","sourceRoot":"","sources":["../../src/lib/requestService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAiB5D,eAAO,MAAM,cAAc;iCAEV,kBAAkB,CAAC,aAAa,CAAC,iBAC/B,MAAM,kBACL,MAAM,WACb,MAAM,WACN,OAAO,KACf,kBAAkB;uBAuBF,MAAM,UAAU,aAAa,KAAG,kBAAkB,GAAG,IAAI;qBAW3D,MAAM,KAAG,kBAAkB,GAAG,IAAI;0BAK/B,kBAAkB,EAAE;iBAI7B,IAAI;CAIhB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAG5C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
@keyframes slide-in-bottom {
|
|
2
|
+
from {
|
|
3
|
+
transform: translateY(100%);
|
|
4
|
+
}
|
|
5
|
+
to {
|
|
6
|
+
transform: translateY(0);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@keyframes slide-in-top {
|
|
11
|
+
from {
|
|
12
|
+
transform: translateY(-100%);
|
|
13
|
+
}
|
|
14
|
+
to {
|
|
15
|
+
transform: translateY(0);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@keyframes fade-in {
|
|
20
|
+
from {
|
|
21
|
+
opacity: 0;
|
|
22
|
+
}
|
|
23
|
+
to {
|
|
24
|
+
opacity: 1;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.animate-slide-in {
|
|
29
|
+
animation: slide-in-bottom 0.3s ease-out;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.animate-slide-in-top {
|
|
33
|
+
animation: slide-in-top 0.3s ease-out;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.animate-fade-in {
|
|
37
|
+
animation: fade-in 0.3s ease-out;
|
|
38
|
+
}
|