@c15t/react 3.0.0-alpha.0 → 3.0.0-alpha.2

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.
Files changed (145) hide show
  1. package/AGENTS.md +4 -1
  2. package/dist/aggregate-components.js +1 -1
  3. package/dist/component-hooks/use-manager.js +1 -1
  4. package/dist/components/consent-gate/atoms.js +1 -0
  5. package/dist/components/consent-gate/consent-gate.js +2 -0
  6. package/dist/components/consent-gate/index.js +2 -0
  7. package/dist/components/preferences/atoms/accordion.js +1 -1
  8. package/dist/components/preferences/atoms/vendor-list.js +1 -0
  9. package/dist/components/preferences/index.js +1 -1
  10. package/dist/consent-gate.js +2 -0
  11. package/dist/draft.js +1 -1
  12. package/dist/external-iab-context.js +1 -1
  13. package/dist/hooks.js +1 -1
  14. package/dist/iab/styles.tw3.css +4 -110
  15. package/dist/index.js +1 -1
  16. package/dist/provider.js +1 -1
  17. package/dist/styles.tw3.css +10 -113
  18. package/dist/utils/deferred-module.js +2 -0
  19. package/dist/version.js +1 -1
  20. package/dist-types/aggregate-components.d.ts +2 -2
  21. package/dist-types/component-hooks/use-headless-iab-consent-ui.d.ts +1 -1
  22. package/dist-types/component-hooks/use-manager.d.ts +6 -1
  23. package/dist-types/components/consent-gate/atoms.d.ts +11 -0
  24. package/dist-types/components/consent-gate/consent-gate.d.ts +2 -0
  25. package/dist-types/components/consent-gate/index.d.ts +41 -0
  26. package/dist-types/components/{frame → consent-gate}/types.d.ts +7 -7
  27. package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
  28. package/dist-types/components/consent-preferences-link/index.d.ts +1 -1
  29. package/dist-types/components/iab-panel/atoms/purpose-item.d.ts +1 -1
  30. package/dist-types/components/iab-panel/atoms/stack-item.d.ts +1 -1
  31. package/dist-types/components/iab-panel/atoms/vendor-list.d.ts +1 -1
  32. package/dist-types/components/iab-panel/iab-panel.d.ts +1 -1
  33. package/dist-types/components/iab-panel/index.d.ts +24 -24
  34. package/dist-types/components/iab-prompt/index.d.ts +17 -17
  35. package/dist-types/components/panel/atoms/card.d.ts +4 -4
  36. package/dist-types/components/panel/atoms/overlay.d.ts +1 -1
  37. package/dist-types/components/panel/index.d.ts +7 -7
  38. package/dist-types/components/panel/panel.d.ts +2 -2
  39. package/dist-types/components/panel-link/index.d.ts +1 -1
  40. package/dist-types/components/panel-trigger/atoms/button.d.ts +1 -1
  41. package/dist-types/components/panel-trigger/atoms/icon.d.ts +1 -1
  42. package/dist-types/components/panel-trigger/atoms/root.d.ts +2 -2
  43. package/dist-types/components/panel-trigger/atoms/toolbar.d.ts +2 -2
  44. package/dist-types/components/panel-trigger/index.d.ts +4 -4
  45. package/dist-types/components/panel-trigger/panel-trigger-toolbar.d.ts +1 -1
  46. package/dist-types/components/panel-trigger/panel-trigger.d.ts +9 -9
  47. package/dist-types/components/panel-trigger/types.d.ts +1 -1
  48. package/dist-types/components/preferences/atoms/accordion.d.ts +6 -4
  49. package/dist-types/components/preferences/atoms/button.d.ts +1 -1
  50. package/dist-types/components/preferences/atoms/footer.d.ts +1 -1
  51. package/dist-types/components/preferences/atoms/root.d.ts +1 -1
  52. package/dist-types/components/preferences/atoms/vendor-list.d.ts +23 -0
  53. package/dist-types/components/preferences/index.d.ts +13 -11
  54. package/dist-types/components/preferences/policy-actions.d.ts +2 -2
  55. package/dist-types/components/preferences/preferences.d.ts +1 -1
  56. package/dist-types/components/preferences/types.d.ts +1 -1
  57. package/dist-types/components/prompt/components.d.ts +3 -3
  58. package/dist-types/components/prompt/index.d.ts +11 -11
  59. package/dist-types/components/prompt/policy-actions.d.ts +2 -2
  60. package/dist-types/components/prompt/prompt.d.ts +1 -1
  61. package/dist-types/components/shared/policy-actions.d.ts +2 -2
  62. package/dist-types/components/shared/primitives/box.d.ts +1 -1
  63. package/dist-types/components/shared/primitives/button.d.ts +2 -2
  64. package/dist-types/components/shared/primitives/button.types.d.ts +1 -1
  65. package/dist-types/components/shared/ui/accordion/accordion.d.ts +2 -2
  66. package/dist-types/components/shared/ui/accordion/index.d.ts +2 -2
  67. package/dist-types/components/shared/ui/animated-collapse/index.d.ts +2 -2
  68. package/dist-types/components/shared/ui/branding.d.ts +1 -1
  69. package/dist-types/components/shared/ui/button/button.d.ts +1 -1
  70. package/dist-types/components/shared/ui/button/index.d.ts +2 -2
  71. package/dist-types/components/shared/ui/collapsible/index.d.ts +1 -1
  72. package/dist-types/components/shared/ui/dialog/index.d.ts +1 -1
  73. package/dist-types/components/shared/ui/preference-item/index.d.ts +1 -1
  74. package/dist-types/components/shared/ui/switch/index.d.ts +2 -2
  75. package/dist-types/components/shared/ui/switch/switch.d.ts +1 -1
  76. package/dist-types/components/shared/ui/tabs/index.d.ts +1 -1
  77. package/dist-types/consent-gate.d.ts +1 -0
  78. package/dist-types/context/index.d.ts +3 -3
  79. package/dist-types/context/theme-context.d.ts +1 -1
  80. package/dist-types/draft.d.ts +53 -1
  81. package/dist-types/headless.d.ts +7 -7
  82. package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +1 -1
  83. package/dist-types/hooks/use-iab-manager.d.ts +1 -1
  84. package/dist-types/hooks/use-theme.d.ts +1 -1
  85. package/dist-types/hooks.d.ts +28 -1
  86. package/dist-types/iab.d.ts +5 -5
  87. package/dist-types/index.d.ts +25 -25
  88. package/dist-types/module-hooks.d.ts +4 -4
  89. package/dist-types/panel-link.d.ts +1 -1
  90. package/dist-types/panel-trigger.d.ts +1 -1
  91. package/dist-types/panel.d.ts +1 -1
  92. package/dist-types/preferences.d.ts +1 -1
  93. package/dist-types/primitives/accordion.d.ts +1 -1
  94. package/dist-types/primitives/button.d.ts +1 -1
  95. package/dist-types/primitives/collapsible.d.ts +1 -1
  96. package/dist-types/primitives/dialog.d.ts +1 -1
  97. package/dist-types/primitives/preference-item.d.ts +1 -1
  98. package/dist-types/primitives/switch.d.ts +1 -1
  99. package/dist-types/primitives/tabs.d.ts +1 -1
  100. package/dist-types/primitives.d.ts +7 -7
  101. package/dist-types/prompt.d.ts +1 -1
  102. package/dist-types/provider.d.ts +27 -5
  103. package/dist-types/server/fetch-ssr-data.d.ts +1 -1
  104. package/dist-types/server/index.d.ts +5 -5
  105. package/dist-types/theme-provider.d.ts +2 -2
  106. package/dist-types/types/index.d.ts +3 -3
  107. package/dist-types/types/manager.d.ts +1 -1
  108. package/dist-types/types/theme/index.d.ts +1 -1
  109. package/dist-types/ui-config-context.d.ts +1 -1
  110. package/dist-types/utils/deferred-module.d.ts +11 -0
  111. package/dist-types/utils/index.d.ts +4 -4
  112. package/dist-types/utils/merge-slot-props.d.ts +2 -2
  113. package/dist-types/utils/merge-styles.d.ts +1 -1
  114. package/dist-types/utils/theme-utils.d.ts +1 -1
  115. package/dist-types/version.d.ts +1 -1
  116. package/docs/README.md +4 -1
  117. package/docs/frameworks/react/components/consent-dialog.md +1 -1
  118. package/docs/frameworks/react/components/{frame.md → consent-gate.md} +27 -27
  119. package/docs/frameworks/react/components/consent-manager-provider.md +14 -1
  120. package/docs/frameworks/react/components/consent-widget.md +39 -6
  121. package/docs/frameworks/react/concepts/consent-categories.md +31 -2
  122. package/docs/frameworks/react/script-loader.md +8 -0
  123. package/docs/frameworks/react/styling/overview.md +10 -0
  124. package/docs/guides/deployment-modes.md +12 -0
  125. package/docs/integrations/building-integrations.md +5 -0
  126. package/docs/integrations/clear-on-revocation.md +167 -0
  127. package/docs/integrations/cloudflare-zaraz.md +399 -0
  128. package/docs/integrations/google-maps.md +20 -20
  129. package/docs/integrations/granular-consent.md +208 -0
  130. package/docs/integrations/overview.md +5 -4
  131. package/docs/integrations/youtube.md +26 -21
  132. package/docs/upgrade-v3.md +47 -0
  133. package/package.json +26 -16
  134. package/dist/components/frame/atoms.js +0 -1
  135. package/dist/components/frame/frame.js +0 -2
  136. package/dist/components/frame/index.js +0 -2
  137. package/dist/frame.js +0 -2
  138. package/dist-types/components/frame/atoms.d.ts +0 -11
  139. package/dist-types/components/frame/frame.d.ts +0 -2
  140. package/dist-types/components/frame/index.d.ts +0 -24
  141. package/dist-types/frame.d.ts +0 -1
  142. package/readme.json +0 -48
  143. package/src/iab/styles.css +0 -11
  144. package/src/styles.css +0 -10
  145. /package/dist/components/{frame → consent-gate}/types.js +0 -0
package/AGENTS.md CHANGED
@@ -25,10 +25,10 @@ These docs describe v3. Start with Inth hosted setup, identify the framework, ro
25
25
  - [ConsentDialog](./docs/frameworks/react/components/consent-dialog.md): Open the c15t preference center as a modal ConsentDialog in a React app, wire its triggers and control blocking, focus and policy gating.
26
26
  - [ConsentDialogLink](./docs/frameworks/react/components/consent-dialog-link.md): Add a ConsentDialogLink to a React footer so visitors reopen the c15t preference center from your own text link, with asChild and rights data.
27
27
  - [ConsentDialogTrigger](./docs/frameworks/react/components/consent-dialog-trigger.md): Floating button and toolbar that reopen the preference center after the first prompt.
28
+ - [ConsentGate](./docs/frameworks/react/components/consent-gate.md): Gate a YouTube or map iframe behind consent with ConsentGate in React, showing a placeholder that opens the preference center until the category is allowed.
28
29
  - [ConsentProvider](./docs/frameworks/react/components/consent-manager-provider.md): Configure the v3 consent runtime and share its state with child components.
29
30
  - [ConsentWidget](./docs/frameworks/react/components/consent-widget.md): Embed the c15t preference center inline with ConsentWidget on a React privacy page, with draft toggles that record a choice only on Save.
30
31
  - [DevTools](./docs/frameworks/react/components/dev-tools.md): A development tool for inspecting consent state, geolocation, loaded scripts, and consent events in real time.
31
- - [Frame](./docs/frameworks/react/components/frame.md): Gate a YouTube or map iframe behind consent with Frame in React, showing a placeholder that opens the preference center until the category is allowed.
32
32
  - [Consent categories](./docs/frameworks/react/concepts/consent-categories.md): Assign optional features to categories and understand how policy scope affects permission.
33
33
  - [Policy presets](./docs/frameworks/react/concepts/policy-presets.md): Understand how policy rules affect React prompts, permissions and persistent privacy controls.
34
34
  - [Headless](./docs/frameworks/react/headless.md): Build a custom consent banner in React with the c15t/react/headless hooks inside your ConsentProvider.
@@ -61,14 +61,17 @@ These docs describe v3. Start with Inth hosted setup, identify the framework, ro
61
61
  - [Ahrefs Analytics](./docs/integrations/ahrefs-analytics.md): Configure Ahrefs Analytics with c15t v3, understand measurement permission and verify loading and revocation.
62
62
  - [Amplitude](./docs/integrations/amplitude.md): Configure Amplitude with c15t v3, understand measurement permission and verify loading and revocation.
63
63
  - [Custom integrations](./docs/integrations/building-integrations.md): Define loading, initialization and consent-change behavior for a vendor without a helper.
64
+ - [Clear on revocation](./docs/integrations/clear-on-revocation.md): Remove configured first-party cookies and Web Storage keys when their consent category is denied.
64
65
  - [Clearbit](./docs/integrations/clearbit.md): Configure Clearbit with c15t v3, understand marketing permission and verify loading and revocation.
65
66
  - [Cloudflare Web Analytics](./docs/integrations/cloudflare-web-analytics.md): Configure Cloudflare Web Analytics with c15t v3, understand measurement permission and verify loading and revocation.
67
+ - [Cloudflare Zaraz](./docs/integrations/cloudflare-zaraz.md): Synchronize c15t permissions with Zaraz purposes while Cloudflare manages your tools.
66
68
  - [Crisp](./docs/integrations/crisp.md): Configure Crisp with c15t v3, understand functionality permission and verify loading and revocation.
67
69
  - [Databuddy](./docs/integrations/databuddy.md): Configure Databuddy's initial and updated consent state with c15t v3.
68
70
  - [Fathom Analytics](./docs/integrations/fathom-analytics.md): Configure Fathom Analytics with c15t v3, understand measurement permission and verify loading and revocation.
69
71
  - [Google Maps](./docs/integrations/google-maps.md): Prevent a map iframe from mounting before the required permission.
70
72
  - [Google Tag](./docs/integrations/google-tag.md): Configure gtag with c15t Consent Mode signals and understand its loading behavior.
71
73
  - [Google Tag Manager](./docs/integrations/google-tag-manager.md): Load GTM with c15t consent signals and verify the tags inside your container.
74
+ - [Granular consent](./docs/integrations/granular-consent.md): Let visitors grant a category and still turn one vendor off, without adopting IAB TCF.
72
75
  - [Heap](./docs/integrations/heap.md): Configure Heap with c15t v3, understand measurement permission and verify loading and revocation.
73
76
  - [Hightouch](./docs/integrations/hightouch.md): Configure Hightouch with c15t v3, understand measurement permission and verify loading and revocation.
74
77
  - [Hotjar](./docs/integrations/hotjar.md): Configure Hotjar with c15t v3, understand measurement permission and verify loading and revocation.
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as o}from"react/jsx-runtime";import{Suspense as e,lazy as n}from"react";import{registerDialogChunkWarmer as t}from"./chunk-warming.js";import{useActiveUI as r}from"./hooks.js";let i=function(n){return t=>o(e,{fallback:null,children:o(n,{...t})})},c=function(o){return i(n(async()=>({default:(await import("./components/panel/index.js"))[o]})))};t(()=>{import("./components/panel/index.js")});let a=function(o){return i(n(async()=>({default:(await import("./components/preferences/index.js"))[o]})))},l=c("ConsentDialog"),s=a("ConsentWidget"),d=function(o,e,n){let t={};for(let r of e)Object.defineProperty(o,r,{configurable:!0,enumerable:!0,get:()=>(t[r]??=n(r),t[r])});return o},u=d(e=>{let n=r();return!0===e.open||"dialog"===n||e.showTrigger?o(l,{...e}):null},["Card","Header","HeaderTitle","HeaderDescription","Content","Footer","ConsentCustomizationCard","ConsentDialogFooter","ConsentDialogHeader","ConsentDialogHeaderTitle","ConsentDialogHeaderDescription","ConsentDialogContent","Overlay","Root"],c),m=d(e=>o(s,{...e}),["AccordionTrigger","AccordionTriggerInner","AccordionContent","AccordionArrow","Accordion","Switch","AccordionItems","AccordionItem","Root","AcceptAllButton","CustomizeButton","SaveButton","RejectButton","PolicyActions","Footer","FooterSubGroup"],a);export{u as ConsentDialog,m as ConsentWidget};
2
+ import{jsx as o}from"react/jsx-runtime";import{registerDialogChunkWarmer as e}from"./chunk-warming.js";import{useActiveUI as t}from"./hooks.js";import{createDeferredModule as n}from"./utils/deferred-module.js";let r=n(()=>import("./components/panel/index.js")),i=n(()=>import("./components/preferences/index.js"));e(()=>{r.preload()});let c=r.component(o=>o.ConsentDialog),s=i.component(o=>o.ConsentWidget),l=function(o,e,t){let n={};for(let r of e)Object.defineProperty(o,r,{configurable:!0,enumerable:!0,get:()=>(n[r]??=t(r),n[r])});return o},d=l(e=>{let n=t();return!0===e.open||"dialog"===n||e.showTrigger?o(c,{...e}):null},["Card","Header","HeaderTitle","HeaderDescription","Content","Footer","ConsentCustomizationCard","ConsentDialogFooter","ConsentDialogHeader","ConsentDialogHeaderTitle","ConsentDialogHeaderDescription","ConsentDialogContent","Overlay","Root"],o=>r.component(e=>e[o])),a=l(e=>o(s,{...e}),["AccordionTrigger","AccordionTriggerInner","AccordionContent","AccordionArrow","Accordion","Switch","AccordionItems","AccordionItem","VendorList","Root","AcceptAllButton","CustomizeButton","SaveButton","RejectButton","PolicyActions","Footer","FooterSubGroup"],o=>i.component(e=>e[o]));export{d as ConsentDialog,a as ConsentWidget};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{evaluateConsent as e}from"@c15t/core";import{useCallback as t,useContext as a,useMemo as i}from"react";import{ProviderServicesContext as n}from"../context.js";import{useConsentManagerDraft as s}from"../draft.js";import{useActiveUI as r,useBranding as o,useConsents as l,useModel as p,usePolicyCategories as c,usePolicyScopeMode as u,usePreferencesPresentation as m,usePromptPresentation as d,useSetActiveUI as f,useSnapshot as y,useSubscribeToConsentChanges as g,useTranslations as v}from"../hooks.js";import{defaultTranslationConfig as C}from"../utils/default-translation-config.js";let T={},b=[{defaultValue:!0,description:"Required for basic site functionality",disabled:!0,display:!0,gdprType:1,name:"necessary"},{defaultValue:!1,description:"Enables enhanced features",display:!0,gdprType:2,name:"functionality"},{defaultValue:!1,description:"Analytics and performance measurement",display:!0,gdprType:4,name:"measurement"},{defaultValue:!1,description:"Improves your experience",display:!0,gdprType:3,name:"experience"},{defaultValue:!1,description:"Advertising and marketing",display:!0,gdprType:5,name:"marketing"}],x=function(){let x=y(),D=a(n),h=l(),R=r(),S=o(),V=p(),j=d(),k=c(),q=m(),w=u(),{draft:I,save:A}=s(),M=f(),O=g(),P=v(),_=i(()=>P?{...C,defaultLanguage:P.language,translations:{...C.translations,[P.language]:P.translations}}:C,[P]),B=i(()=>["necessary",...k],[k]),E=i(()=>[...D?.getConsentCategories()??B],[D,B]),L=t(()=>{let e=new Set(E);return b.filter(t=>e.has(t.name)).map(e=>({...e,display:!0}))},[E]),U=t(t=>e({category:t},x),[x]),z=t(e=>{M(e)},[M]),F=t(async(e,t)=>{"custom"===e?await A():await A("all"===e?"all":"none")},[A]),G=t((e,t)=>{E.includes(e)&&I.set(e,t)},[I,E]),H=t(e=>{},[]),J=t(e=>O(e),[O]);return{activeUI:R??"none",branding:S??"c15t",consentCategories:E,consentTypes:L(),consents:h,draftIsStale:I.isStale,effectivePermissions:x.effectivePermissions,explicitChoice:x.explicitChoice,getDisplayedConsents:L,has:U,iab:x.iab,manager:null,model:V??"opt-in",noticeDismissal:x.noticeDismissal,optOutDirectives:x.optOutDirectives,policyBanner:j??T,policyCategories:B,policyDialog:q??T,policyRule:x.policyRule,policyScopeMode:w,privacySignals:x.privacySignals,promptRequirement:x.promptRequirement,resetDraft:I.reset,resolution:x.resolution,restrictions:x.restrictions,saveConsents:F,selectedConsentTypes:I.values,selectedConsents:I.values,setActiveUI:z,setSelectedConsent:G,subscribeToConsentChanges:J,translationConfig:_,updateConsentCategories:H}};export{x as useConsentManager};
2
+ import{evaluateConsent as e,vendorsListedUnder as a}from"@c15t/core";import{useCallback as i,useMemo as t}from"react";import{useConsentManagerDraft as n}from"../draft.js";import{useActiveUI as s,useBranding as r,useConsents as o,useDeclaredVendors as l,useModel as c,usePolicyCategories as p,usePolicyScopeMode as d,usePreferencesPresentation as u,usePromptPresentation as m,useRegisterConsentCategories as y,useSetActiveUI as f,useSnapshot as g,useSubscribeToConsentChanges as v,useTranslations as h}from"../hooks.js";import{defaultTranslationConfig as C}from"../utils/default-translation-config.js";let S={},T=[{defaultValue:!0,description:"Required for basic site functionality",disabled:!0,display:!0,gdprType:1,name:"necessary"},{defaultValue:!1,description:"Enables enhanced features",display:!0,gdprType:2,name:"functionality"},{defaultValue:!1,description:"Analytics and performance measurement",display:!0,gdprType:4,name:"measurement"},{defaultValue:!1,description:"Improves your experience",display:!0,gdprType:3,name:"experience"},{defaultValue:!1,description:"Advertising and marketing",display:!0,gdprType:5,name:"marketing"}],V=function(){let V=g(),b=o(),D=s(),x=r(),R=c(),P=m(),j=p(),k=u(),q=d(),{draft:w,save:I}=n(),A=l(),M=f(),O=v(),_=h(),B=t(()=>_?{...C,defaultLanguage:_.language,translations:{...C.translations,[_.language]:_.translations}}:C,[_]),E=t(()=>["necessary",...j],[j]),L=t(()=>["necessary",...V.evaluationPolicy.choiceScope??j],[V.evaluationPolicy.choiceScope,j]),U=i(()=>{let e=new Set(L);return T.filter(a=>e.has(a.name)).map(e=>({...e,display:!0}))},[L]),z=i(a=>e({category:a},V),[V]),F=i(e=>{M(e)},[M]),G=i(async(e,a)=>{"custom"===e?await I():await I("all"===e?"all":"none")},[I]),H=i((e,a)=>{L.includes(e)&&w.set(e,a)},[w,L]),J=i((e,a)=>{w.setVendor(e,a)},[w]),K=i(e=>a(A,e),[A]),N=y(),Q=i(e=>O(e),[O]);return{activeUI:D??"none",branding:x??"c15t",consentCategories:L,consentTypes:U(),consents:b,draftIsStale:w.isStale,effectivePermissions:V.effectivePermissions,explicitChoice:V.explicitChoice,getDisplayedConsents:U,getDisplayedVendors:K,has:z,iab:V.iab,manager:null,model:R??"opt-in",noticeDismissal:V.noticeDismissal,optOutDirectives:V.optOutDirectives,policyBanner:P??S,policyCategories:E,policyDialog:k??S,policyRule:V.policyRule,policyScopeMode:q,privacySignals:V.privacySignals,promptRequirement:V.promptRequirement,resetDraft:w.reset,resolution:V.resolution,restrictions:V.restrictions,saveConsents:G,selectedConsentTypes:w.values,selectedConsents:w.values,selectedVendors:w.vendors,setActiveUI:F,setSelectedConsent:H,setSelectedVendor:J,subscribeToConsentChanges:Q,translationConfig:B,updateConsentCategories:N,vendorChoice:V.vendorChoice,vendors:A}};export{V as useConsentManager};
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";import t from"@c15t/ui/styles/components/frame";import{forwardRef as o}from"react";import{useTranslations as a}from"../../component-hooks/use-translations.js";import{Box as r}from"../shared/primitives/box.js";import{ConsentButton as i}from"../shared/primitives/button.js";let s=o(({children:o,...a},i)=>e(r,{ref:i,baseClassName:t.placeholder,"data-testid":"frame-placeholder",...a,children:o})),n=o(({children:o,category:i,...s},n)=>{let{frame:l,consentTypes:m}=a(),p=i&&l?.title?l.title.replace("{category}",m?.[i]?.title??i):void 0;return e(r,{ref:n,baseClassName:t.title,...s,children:o??p})}),l=o(({children:t,category:o,...r},s)=>{let{frame:n,consentTypes:l}=a(),m=l?.[o]?.title??o,p=n?.actionButton?.replace("{category}",m);return e(i,{mode:"stroke",size:"small",variant:"primary",...r,ref:s,action:"open-consent-dialog",category:o,"data-testid":"frame-open-dialog",children:t??p})});s.displayName="ConsentGateRoot",n.displayName="ConsentGateTitle",l.displayName="ConsentGateButton";export{l as ConsentGateButton,s as ConsentGateRoot,n as ConsentGateTitle};
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import{forwardRef as r,useEffect as t}from"react";import{useConsentManager as n}from"../../component-hooks/use-manager.js";import{useTranslations as s}from"../../component-hooks/use-translations.js";import{ConsentGateButton as i,ConsentGateRoot as l,ConsentGateTitle as c}from"./atoms.js";let a=({category:r,policyBlocked:t,policyBlockedMessage:n})=>o(l,{children:[e(c,{category:r,children:t?n??"This content is unavailable under your region's consent policy.":void 0}),t?null:e(i,{category:r})]}),m=r(({children:o,category:r,placeholder:i,noStyle:l,className:c,theme:m,...p},d)=>{let{has:y,updateConsentCategories:u,policyCategories:h,policyScopeMode:g}=n(),{frame:f}=s(),k=y(r),j=Array.isArray(h)&&h.length>0&&!h.includes("*")&&!h.includes(r);return t(()=>{u([r])},[r,u]),e("div",{ref:d,className:c,...p,children:k?o:i||e(a,{category:r,policyBlocked:"strict"===g&&j,policyBlockedMessage:f?.policyBlocked})})});m.displayName="ConsentGate";let p=m;export{p as ConsentGate};
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{ConsentGate as t}from"./consent-gate.js";import*as e from"./atoms.js";let o=Object.assign(t,{Button:e.ConsentGateButton,Root:e.ConsentGateRoot,Title:e.ConsentGateTitle}),n=o,a=e.ConsentGateRoot,s=e.ConsentGateTitle,C=e.ConsentGateButton;var G=e.ConsentGateButton,r=e.ConsentGateRoot,i=e.ConsentGateTitle;export{G as ConsentGateButton,r as ConsentGateRoot,i as ConsentGateTitle,n as Frame,C as FrameButton,a as FrameRoot,s as FrameTitle,o as ConsentGate};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/accordion";import{createContext as n,forwardRef as i,useCallback as r,useContext as c,useMemo as a}from"react";import{useConsentManager as s}from"../../../component-hooks/use-manager.js";import{useTranslations as d}from"../../../component-hooks/use-translations.js";import{Box as l}from"../../shared/primitives/box.js";import{LucideIcon as m}from"../../shared/ui/icon.js";import{useTheme as g}from"../../../hooks/use-theme.js";import*as h from"../../shared/ui/preference-item/index.js";import*as p from"../../shared/ui/switch/index.js";let u=n(null),y=function(){let e=c(u);if(!e)throw Error("ConsentWidgetAccordion components must be used within ConsentWidgetAccordion");return e},w=i(({children:t,...n},i)=>e(l,{ref:i,baseClassName:o.triggerRow,...n,children:t}));w.displayName="ConsentWidgetAccordionTrigger";let C=h.Trigger,A=h.Content,f=h.Leading,v=p.Root,N=({"data-testid":t,children:n,className:i,noStyle:c,onValueChange:s,style:d,type:m="multiple",value:h,...p})=>{let{noStyle:y}=g(),w=c??y,C=a(()=>Array.isArray(h)?h:h?[h]:[],[h]),A=r((e,t)=>{if("single"===m)return void s?.(t?e:"");let o=t?[...new Set([...C,e])]:C.filter(t=>t!==e);s?.(o)},[s,C,m]),f=a(()=>({noStyle:w,onToggleItem:A,openValues:C}),[w,A,C]);return e(u.Provider,{value:f,children:e(l,{className:i,"data-testid":t??"consent-widget-accordion",noStyle:c,style:d,slotKey:"accordion.root",baseClassName:o.list,...p,children:n})})},S=()=>{let{selectedConsents:n,setSelectedConsent:i,getDisplayedConsents:c,explicitChoice:a,restrictions:l}=s(),g=function(e){if("necessary"===e)return!1;let t=a?.categories[e];return t?.value===!0&&(l[e]?.length??0)>0},{noStyle:p,onToggleItem:u,openValues:N}=y(),S=r((e,t)=>{i(e,t)},[i]),W=function(e){return e.replace(/_/gu," ").replace(/\b\w/gu,e=>e.toUpperCase())},{consentTypes:b}=d();return c().map(i=>{let r;return t(h.Root,{className:p?void 0:o.item,"data-testid":`consent-widget-accordion-item-${i.name}`,noStyle:!0,onOpenChange:e=>u(i.name,e),open:N.includes(i.name),slotKey:"accordion-item.root",children:[t(w,{slotKey:"accordion.triggerRow",children:[t(C,{className:p?void 0:o.trigger,"data-testid":`consent-widget-accordion-trigger-${i.name}`,noStyle:!0,slotKey:"accordion-item.trigger",children:[(r=m({iconPath:N.includes(i.name)?e("path",{d:"M5 12h14"}):e("path",{d:"M5 12h14M12 5v14"}),title:N.includes(i.name)?"Close":"Open"}),e(f,{className:p?void 0:o.arrow,"data-testid":`consent-widget-accordion-arrow-${i.name}`,noStyle:!0,slotKey:"accordion.arrow",children:e(r,{})})),e(h.Header,{noStyle:!0,slotKey:"accordion.header",children:e(h.Title,{className:p?void 0:o.title,noStyle:!0,slotKey:"accordion.title",children:b[i.name]?.title??W(i.name)})})]}),e(h.Control,{className:p?void 0:o.control,noStyle:!0,slotKey:"accordion.control",children:e(v,{"aria-label":b[i.name]?.title??W(i.name),checked:n[i.name],"aria-describedby":g(i.name)?`c15t-restriction-${i.name}`:void 0,onCheckedChange:e=>S(i.name,e),disabled:i.disabled,size:"small","data-testid":`consent-widget-switch-${i.name}`})})]}),g(i.name)?e("output",{className:p?void 0:o.restriction,"data-testid":`consent-widget-restriction-${i.name}`,id:`c15t-restriction-${i.name}`,children:"Your saved choice is restricted by the current privacy settings."}):null,e(A,{className:p?void 0:o.content,"data-testid":`consent-widget-accordion-content-${i.name}`,innerClassName:p?void 0:o.contentInner,innerSlotKey:"accordion.contentInner",slotKey:"accordion-item.content",viewportClassName:p?void 0:o.contentViewport,viewportSlotKey:"accordion.contentViewport",children:b[i.name]?.description??i.description})]},i.name)})},W=i(({className:t,...n},i)=>e(h.Root,{ref:i,className:[o.item,t].filter(Boolean).join(" "),noStyle:!0,...n}));W.displayName="ConsentWidgetAccordionItem";let b=C,K=w,j=A,I=f,$=N,T=v,k=S,x=W;export{$ as Accordion,I as AccordionArrow,j as AccordionContent,x as AccordionItem,k as AccordionItems,K as AccordionTrigger,b as AccordionTriggerInner,N as ConsentWidgetAccordion,f as ConsentWidgetAccordionArrow,A as ConsentWidgetAccordionContent,W as ConsentWidgetAccordionItem,S as ConsentWidgetAccordionItems,w as ConsentWidgetAccordionTrigger,C as ConsentWidgetAccordionTriggerInner,v as ConsentWidgetSwitch,T as Switch};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/accordion";import{createContext as n,forwardRef as i,useCallback as r,useContext as c,useMemo as a}from"react";import{useConsentManager as s}from"../../../component-hooks/use-manager.js";import{useTranslations as d}from"../../../component-hooks/use-translations.js";import{Box as l}from"../../shared/primitives/box.js";import{LucideIcon as m}from"../../shared/ui/icon.js";import{useTheme as g}from"../../../hooks/use-theme.js";import{ConsentWidgetVendorList as h}from"./vendor-list.js";import*as p from"../../shared/ui/preference-item/index.js";import*as u from"../../shared/ui/switch/index.js";let y=n(null),w=function(){let e=c(y);if(!e)throw Error("ConsentWidgetAccordion components must be used within ConsentWidgetAccordion");return e},C=i(({children:t,...n},i)=>e(l,{ref:i,baseClassName:o.triggerRow,...n,children:t}));C.displayName="ConsentWidgetAccordionTrigger";let f=p.Trigger,A=p.Content,v=p.Leading,S=u.Root,N=({"data-testid":t,children:n,className:i,noStyle:c,onValueChange:s,style:d,type:m="multiple",value:h,...p})=>{let{noStyle:u}=g(),w=c??u,C=a(()=>Array.isArray(h)?h:h?[h]:[],[h]),f=r((e,t)=>{if("single"===m)return void s?.(t?e:"");let o=t?[...new Set([...C,e])]:C.filter(t=>t!==e);s?.(o)},[s,C,m]),A=a(()=>({noStyle:w,onToggleItem:f,openValues:C}),[w,f,C]);return e(y.Provider,{value:A,children:e(l,{className:i,"data-testid":t??"consent-widget-accordion",noStyle:c,style:d,slotKey:"accordion.root",baseClassName:o.list,...p,children:n})})},W=()=>{let{selectedConsents:n,setSelectedConsent:i,getDisplayedConsents:c,explicitChoice:a,restrictions:l}=s(),g=function(e){if("necessary"===e)return!1;let t=a?.categories[e];return t?.value===!0&&(l[e]?.length??0)>0},{noStyle:u,onToggleItem:y,openValues:N}=w(),W=r((e,t)=>{i(e,t)},[i]),b=function(e){return e.replace(/_/gu," ").replace(/\b\w/gu,e=>e.toUpperCase())},{consentTypes:K}=d();return c().map(i=>{let r;return t(p.Root,{className:u?void 0:o.item,"data-testid":`consent-widget-accordion-item-${i.name}`,noStyle:!0,onOpenChange:e=>y(i.name,e),open:N.includes(i.name),slotKey:"accordion-item.root",children:[t(C,{slotKey:"accordion.triggerRow",children:[t(f,{className:u?void 0:o.trigger,"data-testid":`consent-widget-accordion-trigger-${i.name}`,noStyle:!0,slotKey:"accordion-item.trigger",children:[(r=m({iconPath:N.includes(i.name)?e("path",{d:"M5 12h14"}):e("path",{d:"M5 12h14M12 5v14"}),title:N.includes(i.name)?"Close":"Open"}),e(v,{className:u?void 0:o.arrow,"data-testid":`consent-widget-accordion-arrow-${i.name}`,noStyle:!0,slotKey:"accordion.arrow",children:e(r,{})})),e(p.Header,{noStyle:!0,slotKey:"accordion.header",children:e(p.Title,{className:u?void 0:o.title,noStyle:!0,slotKey:"accordion.title",children:K[i.name]?.title??b(i.name)})})]}),e(p.Control,{className:u?void 0:o.control,noStyle:!0,slotKey:"accordion.control",children:e(S,{"aria-label":K[i.name]?.title??b(i.name),checked:n[i.name],"aria-describedby":g(i.name)?`c15t-restriction-${i.name}`:void 0,onCheckedChange:e=>W(i.name,e),disabled:i.disabled,size:"small","data-testid":`consent-widget-switch-${i.name}`})})]}),g(i.name)?e("output",{className:u?void 0:o.restriction,"data-testid":`consent-widget-restriction-${i.name}`,id:`c15t-restriction-${i.name}`,children:"Your saved choice is restricted by the current privacy settings."}):null,t(A,{className:u?void 0:o.content,"data-testid":`consent-widget-accordion-content-${i.name}`,innerClassName:u?void 0:o.contentInner,innerSlotKey:"accordion.contentInner",slotKey:"accordion-item.content",viewportClassName:u?void 0:o.contentViewport,viewportSlotKey:"accordion.contentViewport",children:[K[i.name]?.description??i.description,e(h,{category:i.name,noStyle:u})]})]},i.name)})},b=i(({className:t,...n},i)=>e(p.Root,{ref:i,className:[o.item,t].filter(Boolean).join(" "),noStyle:!0,...n}));b.displayName="ConsentWidgetAccordionItem";let K=f,j=C,I=A,$=v,T=N,k=S,x=W,R=b,V=h;export{T as Accordion,$ as AccordionArrow,I as AccordionContent,R as AccordionItem,x as AccordionItems,j as AccordionTrigger,K as AccordionTriggerInner,N as ConsentWidgetAccordion,v as ConsentWidgetAccordionArrow,A as ConsentWidgetAccordionContent,b as ConsentWidgetAccordionItem,W as ConsentWidgetAccordionItems,C as ConsentWidgetAccordionTrigger,f as ConsentWidgetAccordionTriggerInner,S as ConsentWidgetSwitch,h as ConsentWidgetVendorList,k as Switch,V as VendorList};
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import n from"@c15t/ui/styles/components/vendor-list";import{useId as o,useState as i}from"react";import{useConsentManager as r}from"../../../component-hooks/use-manager.js";import{useTranslations as l}from"../../../component-hooks/use-translations.js";import{Box as s}from"../../shared/primitives/box.js";import{useTheme as d}from"../../../hooks/use-theme.js";import*as a from"../../shared/ui/preference-item/index.js";import*as c from"../../shared/ui/switch/index.js";let h=({open:n})=>t("svg",{"aria-hidden":"true",fill:"none",focusable:"false",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",viewBox:"0 0 24 24",children:[e("title",{children:n?"Close":"Open"}),n?e("path",{d:"M5 12h14"}):e("path",{d:"M5 12h14M12 5v14"})]}),m={disabledByCategory:"Turn on this category to choose vendors.",privacyPolicy:"Privacy policy",switchLabel:"Allow {vendor}",title:"Vendors ({count})"},y=({category:n,categoryOn:o,checked:r,copy:l,labelId:d,noStyle:m,onCheckedChange:y,styles:p,vendor:v})=>{let[g,u]=i(!1),C=v.name??v.id,b=!0!==v.disabled,f=!!(v.description||v.privacyPolicyUrl);return t(a.Root,{className:p?.item,"data-testid":`consent-widget-vendor-item-${n}-${v.id}`,disabled:!f,noStyle:m,onOpenChange:u,open:g,slotKey:"vendor-list.item",children:[t(s,{noStyle:m,baseClassName:p?.header,slotKey:"vendor-list.header",children:[t(a.Trigger,{className:p?.trigger,"data-testid":`consent-widget-vendor-trigger-${n}-${v.id}`,noStyle:m,slotKey:"vendor-list.trigger",children:[e(a.Leading,{className:p?.arrow,noStyle:m,children:e(h,{open:g})}),e(s,{asChild:!0,noStyle:m,baseClassName:p?.name,slotKey:"vendor-list.name",children:e("span",{"data-testid":`consent-widget-vendor-name-${n}-${v.id}`,id:d,children:C})})]}),b?e(s,{noStyle:m,baseClassName:p?.control,slotKey:"vendor-list.control",children:e(c.Root,{"aria-label":l.switchLabel.replace("{vendor}",C),"aria-describedby":d,checked:r,"data-testid":`consent-widget-vendor-switch-${n}-${v.id}`,disabled:!o,onCheckedChange:y,size:"small"})}):null]}),f?t(a.Content,{className:p?.content,"data-testid":`consent-widget-vendor-content-${n}-${v.id}`,innerClassName:p?.contentInner,noStyle:m,slotKey:"vendor-list.content",children:[v.description?e(s,{asChild:!0,noStyle:m,baseClassName:p?.description,slotKey:"vendor-list.description",children:e("p",{children:v.description})}):null,v.privacyPolicyUrl?e(s,{asChild:!0,noStyle:m,baseClassName:p?.link,slotKey:"vendor-list.link",children:e("a",{href:v.privacyPolicyUrl,rel:"noopener noreferrer",target:"_blank",children:l.privacyPolicy})}):null]}):null]})},p=({category:i,className:a,noStyle:c,...h})=>{let{getDisplayedVendors:p,selectedConsents:v,selectedVendors:g,setSelectedVendor:u}=r(),{consentManagerDialog:C}=l(),{noStyle:b}=d(),f=o(),$=c??b??!1,k=p(i);if(0===k.length)return null;let w={...m,...C.vendors},N=!0===v[i],S=$?void 0:n,K=w.title.replace("{count}",String(k.length));return e(s,{asChild:!0,className:a,"data-testid":`consent-widget-vendor-list-${i}`,noStyle:$,baseClassName:S?.root,slotKey:"vendor-list.root",...h,children:t("section",{"aria-label":K,children:[N?null:e("p",{className:S?.hint,"data-testid":`consent-widget-vendor-hint-${i}`,children:w.disabledByCategory}),k.map(t=>e(y,{category:i,categoryOn:N,checked:g[t.id]??!0,copy:w,labelId:`${f}vendor-${i}-${t.id}`,noStyle:$,onCheckedChange:e=>u(t.id,e),styles:S,vendor:t},t.id))]})})};export{p as ConsentWidgetVendorList};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{Accordion as o,AccordionArrow as t,AccordionContent as n,AccordionItem as e,AccordionItems as r,AccordionTrigger as c,AccordionTriggerInner as i,ConsentWidgetAccordion as s,ConsentWidgetAccordionArrow as d,ConsentWidgetAccordionContent as A,ConsentWidgetAccordionItem as g,ConsentWidgetAccordionItems as m,ConsentWidgetAccordionTrigger as C,ConsentWidgetAccordionTriggerInner as u,ConsentWidgetSwitch as W,Switch as p}from"./atoms/accordion.js";import{AcceptAllButton as a,ConsentWidgetAcceptAllButton as l,ConsentWidgetCustomizeButton as B,ConsentWidgetRejectButton as f,ConsentWidgetSaveButton as j,CustomizeButton as I,RejectButton as S,SaveButton as w}from"./atoms/button.js";import{ConsentWidgetFooter as F,ConsentWidgetFooterSubGroup as R,Footer as T,FooterSubGroup as b}from"./atoms/footer.js";import{ConsentWidgetRoot as y,Root as h}from"./atoms/root.js";import{ConsentWidgetPolicyActions as v,PolicyActions as z}from"./policy-actions.js";import{ConsentWidget as G}from"./preferences.js";let P=Object.assign(G,{AcceptAllButton:a,Accordion:o,AccordionArrow:t,AccordionContent:n,AccordionItem:e,AccordionItems:r,AccordionTrigger:c,AccordionTriggerInner:i,CustomizeButton:I,Footer:T,FooterSubGroup:b,PolicyActions:z,RejectButton:S,Root:h,SaveButton:w,Switch:p});export default P;export{a as AcceptAllButton,o as Accordion,t as AccordionArrow,n as AccordionContent,e as AccordionItem,r as AccordionItems,c as AccordionTrigger,i as AccordionTriggerInner,l as ConsentWidgetAcceptAllButton,s as ConsentWidgetAccordion,d as ConsentWidgetAccordionArrow,A as ConsentWidgetAccordionContent,g as ConsentWidgetAccordionItem,m as ConsentWidgetAccordionItems,C as ConsentWidgetAccordionTrigger,u as ConsentWidgetAccordionTriggerInner,B as ConsentWidgetCustomizeButton,F as ConsentWidgetFooter,R as ConsentWidgetFooterSubGroup,v as ConsentWidgetPolicyActions,f as ConsentWidgetRejectButton,y as ConsentWidgetRoot,j as ConsentWidgetSaveButton,W as ConsentWidgetSwitch,I as CustomizeButton,T as Footer,b as FooterSubGroup,z as PolicyActions,S as RejectButton,h as Root,w as SaveButton,p as Switch,P as ConsentWidget};
2
+ import{Accordion as o,AccordionArrow as t,AccordionContent as n,AccordionItem as e,AccordionItems as r,AccordionTrigger as i,AccordionTriggerInner as c,ConsentWidgetAccordion as s,ConsentWidgetAccordionArrow as d,ConsentWidgetAccordionContent as A,ConsentWidgetAccordionItem as g,ConsentWidgetAccordionItems as m,ConsentWidgetAccordionTrigger as C,ConsentWidgetAccordionTriggerInner as u,ConsentWidgetSwitch as W,ConsentWidgetVendorList as p,Switch as a,VendorList as l}from"./atoms/accordion.js";import{AcceptAllButton as B,ConsentWidgetAcceptAllButton as f,ConsentWidgetCustomizeButton as j,ConsentWidgetRejectButton as I,ConsentWidgetSaveButton as S,CustomizeButton as w,RejectButton as F,SaveButton as R}from"./atoms/button.js";import{ConsentWidgetFooter as T,ConsentWidgetFooterSubGroup as b,Footer as y,FooterSubGroup as h}from"./atoms/footer.js";import{ConsentWidgetRoot as v,Root as z}from"./atoms/root.js";import{ConsentWidgetPolicyActions as G,PolicyActions as L}from"./policy-actions.js";import{ConsentWidget as P}from"./preferences.js";let V=Object.assign(P,{AcceptAllButton:B,Accordion:o,AccordionArrow:t,AccordionContent:n,AccordionItem:e,AccordionItems:r,AccordionTrigger:i,AccordionTriggerInner:c,CustomizeButton:w,Footer:y,FooterSubGroup:h,PolicyActions:L,RejectButton:F,Root:z,SaveButton:R,Switch:a,VendorList:l});export default V;export{B as AcceptAllButton,o as Accordion,t as AccordionArrow,n as AccordionContent,e as AccordionItem,r as AccordionItems,i as AccordionTrigger,c as AccordionTriggerInner,f as ConsentWidgetAcceptAllButton,s as ConsentWidgetAccordion,d as ConsentWidgetAccordionArrow,A as ConsentWidgetAccordionContent,g as ConsentWidgetAccordionItem,m as ConsentWidgetAccordionItems,C as ConsentWidgetAccordionTrigger,u as ConsentWidgetAccordionTriggerInner,j as ConsentWidgetCustomizeButton,T as ConsentWidgetFooter,b as ConsentWidgetFooterSubGroup,G as ConsentWidgetPolicyActions,I as ConsentWidgetRejectButton,v as ConsentWidgetRoot,S as ConsentWidgetSaveButton,W as ConsentWidgetSwitch,p as ConsentWidgetVendorList,w as CustomizeButton,y as Footer,h as FooterSubGroup,L as PolicyActions,F as RejectButton,z as Root,R as SaveButton,a as Switch,l as VendorList,V as ConsentWidget};
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ export*from"./components/consent-gate/index.js";
package/dist/draft.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as e}from"react/jsx-runtime";import{createContext as t,useCallback as r,useContext as o,useEffect as i,useMemo as s,useState as n,useSyncExternalStore as a}from"react";import{KernelContext as l,ProviderServicesContext as c}from"./context.js";import{useUIConfig as u}from"./ui-config-context.js";import{saveConsentUI as p}from"./ui-save.js";let f=function(e,t){let r={experience:!1,functionality:!1,marketing:!1,measurement:!1,necessary:!0};for(let o of e.policyRule.scope)r[o]=e.explicitChoice?.categories[o]?.value??t?.[o]??("opt-out"===e.policyRule.model||e.policyRule.preselectedCategories.includes(o));return r},d=function(e,t){let r=0,o=0,i=e.getSnapshot(),s=f(i,t),{fingerprint:n}=i.evaluationPolicy.choice,a={displayedCategories:["necessary",...i.policyRule.scope],isDirty:!1,isStale:!1,values:s},l=new Set,c=e=>{for(let t of(a=e,l))t()},u=()=>{r+=1,s=f(i=e.getSnapshot(),t),({fingerprint:n}=i.evaluationPolicy.choice),c({displayedCategories:["necessary",...i.policyRule.scope],isDirty:!1,isStale:!1,values:s})},p=e=>{let t={...a.values},o=!1;for(let r of a.displayedCategories)"necessary"!==r&&"boolean"==typeof e[r]&&t[r]!==e[r]&&(t[r]=e[r],o=!0);o&&(r+=1,c({...a,isDirty:a.displayedCategories.some(e=>t[e]!==s[e]),values:t}))},d=()=>{let t=e.getSnapshot();if(i.explicitChoice===t.explicitChoice&&i.policyRule===t.policyRule&&i.evaluationPolicy===t.evaluationPolicy)return;let r=n!==t.evaluationPolicy.choice.fingerprint;i=t,a.isDirty?r&&!a.isStale&&c({...a,isStale:!0}):u()};return{acceptAll(){p(Object.fromEntries(a.displayedCategories.map(e=>[e,!0])))},connect:()=>(d(),e.subscribe(d)),getSnapshot:()=>a,rejectAll(){p(Object.fromEntries(a.displayedCategories.map(e=>[e,!1])))},reset:u,async save(t,i,s){if(n!==e.getSnapshot().evaluationPolicy.choice.fingerprint||a.isStale)return c({...a,isStale:!0}),{ok:!1};let l={},p=new Set(i??a.displayedCategories);for(let e of a.displayedCategories)"necessary"!==e&&p.has(e)&&(l[e]=a.values[e]);let f=o+=1,d=e.commands.save(t??l,{categories:i}),y=r,g=await d;return g.ok&&f===o&&r===y&&!a.isStale&&n===e.getSnapshot().evaluationPolicy.choice.fingerprint&&(u(),s?.()),g},set(e,t){p({[e]:t})},subscribe:e=>(l.add(e),()=>{l.delete(e)}),update:p}},y=t(null),g=function(){let e=o(l);if(!e)throw Error("Consent drafts require a ConsentProvider.");return e},v=({children:t,initial:r})=>{let s=g(),a=o(y),{presentation:l}=u(),[c,p]=n(()=>d(s,r??l?.preferences?.defaults)),f=a&&!r?a:c;return i(()=>f.connect(),[f]),e(y.Provider,{value:f,children:t})},C=function(){let e=g(),t=o(y),{presentation:r}=u(),[s,a]=n(()=>d(e,r?.preferences?.defaults)),l=t??s;return i(()=>t?void 0:l.connect(),[t,l]),l},m=function(e){let t=g(),i=o(c);return r(r=>{let o=!1;return p(t,()=>e.save(r,i?.getConsentCategories(),()=>{o=!0}),()=>o)},[t,e,i])},h=function(e){let t=a(e.subscribe,e.getSnapshot,e.getSnapshot);return s(()=>({...t,acceptAll:e.acceptAll,rejectAll:e.rejectAll,reset:e.reset,save:e.save,set:e.set,update:e.update}),[t,e])},S=function(){return m(C())},P=function(){let e=C();return{draft:h(e),save:m(e)}},b=function(){return h(C())};export{v as ConsentDraftProvider,b as useConsentDraft,P as useConsentManagerDraft,S as useConsentSaveAction};
2
+ import{jsx as e}from"react/jsx-runtime";import{deniedVendorIds as t,vendorRenders as o}from"@c15t/core";import{createContext as r,useCallback as n,useContext as i,useEffect as s,useMemo as l,useState as a,useSyncExternalStore as c}from"react";import{KernelContext as u,ProviderServicesContext as d}from"./context.js";import{useUIConfig as f}from"./ui-config-context.js";import{saveConsentUI as p}from"./ui-save.js";let y=function(e,t,o){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:o,writable:!0})},v=function(e){let o={};if("iab"===e.model)return o;let r=t(e)??new Set;for(let t of e.vendors?.declared??[])y(o,t.id,!r.has(t.id));return o},g=function(e){return"iab"===e.model?"":JSON.stringify((e.vendors?.declared??[]).filter(o).map(e=>[e.id,!0===e.disabled,e.category]).sort(([e],[t])=>String(e).localeCompare(String(t))))},m=function(e){let t=new Set;if("iab"===e.model)return t;for(let o of e.vendors?.declared??[])!0!==o.disabled&&t.add(o.id);return t},h=function(e,t){let o=Object.keys(e);return o.length===Object.keys(t).length&&o.every(o=>e[o]===t[o])},C=function(e,t){let o={experience:!1,functionality:!1,marketing:!1,measurement:!1,necessary:!0};for(let r of e.evaluationPolicy.choiceScope??e.policyRule.scope)o[r]=e.explicitChoice?.categories[r]?.value??t?.[r]??("opt-out"===e.policyRule.model||e.policyRule.preselectedCategories.includes(r));return o},S=function(e,t){let o=0,r=0,n=e.getSnapshot(),i=C(n,t),s=v(n),l=m(n),a=g(n),{fingerprint:c}=n.evaluationPolicy.choice,u={displayedCategories:["necessary",...n.evaluationPolicy.choiceScope??n.policyRule.scope],isDirty:!1,isStale:!1,values:i,vendors:s},d=new Set,f=e=>{for(let t of(u=e,d))t()},p=(e,t)=>u.displayedCategories.some(t=>e[t]!==i[t])||!h(t,s),S=()=>{o+=1,i=C(n=e.getSnapshot(),t),s=v(n),l=m(n),a=g(n),({fingerprint:c}=n.evaluationPolicy.choice),f({displayedCategories:["necessary",...n.evaluationPolicy.choiceScope??n.policyRule.scope],isDirty:!1,isStale:!1,values:i,vendors:s})},b=e=>{let t={...u.values},r=!1;for(let o of u.displayedCategories)"necessary"!==o&&"boolean"==typeof e[o]&&t[o]!==e[o]&&(t[o]=e[o],r=!0);r&&(o+=1,f({...u,isDirty:p(t,u.vendors),values:t}))},j=e=>{let t={...u.vendors},r=!1;for(let[o,n]of Object.entries(e))l.has(o)&&"boolean"==typeof n&&t[o]!==n&&(y(t,o,n),r=!0);r&&(o+=1,f({...u,isDirty:p(u.values,t),vendors:t}))},P=()=>{let e={};for(let t of Object.keys(s))y(e,t,!0);return e},D=()=>{let t=e.getSnapshot();if(n.explicitChoice===t.explicitChoice&&n.policyRule===t.policyRule&&n.evaluationPolicy===t.evaluationPolicy&&n.vendors===t.vendors&&n.vendorChoice===t.vendorChoice&&n.model===t.model)return;let o=t.evaluationPolicy.choiceScope??t.policyRule.scope,r=u.displayedCategories.length!==o.length+1||o.some(e=>!u.displayedCategories.includes(e)),i=g(t)!==a,s=c!==t.evaluationPolicy.choice.fingerprint||r||i;n=t,u.isDirty?s&&!u.isStale&&f({...u,isStale:!0}):S()};return{acceptAll(){b(Object.fromEntries(u.displayedCategories.map(e=>[e,!0]))),j(P())},connect:()=>(D(),e.subscribe(D)),getSnapshot:()=>u,rejectAll(){b(Object.fromEntries(u.displayedCategories.map(e=>[e,!1]))),j(P())},reset:S,async save(t,n,i){if(c!==e.getSnapshot().evaluationPolicy.choice.fingerprint||u.isStale)return f({...u,isStale:!0}),{ok:!1};let l={},a=new Set(n??u.displayedCategories);for(let e of u.displayedCategories)"necessary"!==e&&a.has(e)&&(l[e]=u.values[e]);let d=r+=1,p={};if("all"!==t&&"none"!==t)for(let[e,t]of Object.entries(u.vendors))s[e]!==t&&y(p,e,t);let v=e.commands.save(t??l,{categories:n,...Object.keys(p).length>0&&{vendors:p}}),g=o,m=await v;return m.ok&&d===r&&o===g&&!u.isStale&&c===e.getSnapshot().evaluationPolicy.choice.fingerprint&&(S(),i?.()),m},set(e,t){b({[e]:t})},setVendor(e,t){j({[e]:t})},subscribe:e=>(d.add(e),()=>{d.delete(e)}),update:b}},b=r(null),j=function(){let e=i(u);if(!e)throw Error("Consent drafts require a ConsentProvider.");return e},P=({children:t,initial:o})=>{let r=j(),n=i(b),{presentation:l}=f(),[c,u]=a(()=>S(r,o??l?.preferences?.defaults)),d=n&&!o?n:c;return s(()=>d.connect(),[d]),e(b.Provider,{value:d,children:t})},D=function(){let e=j(),t=i(b),{presentation:o}=f(),[r,n]=a(()=>S(e,o?.preferences?.defaults)),l=t??r;return s(()=>t?void 0:l.connect(),[t,l]),l},O=function(e){let t=j(),o=i(d);return n(r=>{let n=!1;return p(t,()=>e.save(r,o?.getConsentCategories(),()=>{n=!0}),()=>n)},[t,e,o])},x=function(e){let t=c(e.subscribe,e.getSnapshot,e.getSnapshot);return l(()=>({...t,acceptAll:e.acceptAll,rejectAll:e.rejectAll,reset:e.reset,save:e.save,set:e.set,setVendor:e.setVendor,update:e.update}),[t,e])},A=function(){return O(D())},R=function(){let e=D();return{draft:x(e),save:O(e)}},k=function(){return x(D())},w=function(){let{isDirty:e,isStale:t,reset:o,save:r,setVendor:n,vendors:i}=x(D());return l(()=>({isDirty:e,isStale:t,reset:o,save:r,setVendor:n,vendors:i}),[e,t,o,r,n,i])};export{P as ConsentDraftProvider,k as useConsentDraft,R as useConsentManagerDraft,A as useConsentSaveAction,w as useVendorDraft};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as r}from"react/jsx-runtime";import{useMemo as e,useState as t,useSyncExternalStore as o}from"react";import{IABContext as n}from"./context/iab-context-value.js";let i=function(){return null},a=({runtime:a,children:l})=>{let[u,m]=t("purposes"),c=o(r=>a.onIABChange(r),()=>a.iab,i),p=e(()=>({handle:c,setTab:m,tab:u}),[c,u]);return r(n.Provider,{value:p,children:l})};export{a as ExternalIABProvider};
2
+ import{jsx as e}from"react/jsx-runtime";import{useCallback as t,useEffect as r,useMemo as i,useState as n,useSyncExternalStore as o}from"react";import{IABContext as a}from"./context/iab-context-value.js";let c=function(){return null},u=({runtime:u,children:l})=>{let[s,m]=n("purposes"),d=o(e=>u.onIABChange(e),()=>u.iab,c),f=i(()=>{let e,t,r;return e=!1,t=!1,{actions:r=[],activate:()=>{e=!0,t=!1},deactivate:()=>{e=!1,queueMicrotask(()=>{if(!e)for(let e of(t=!0,r.splice(0)))e.cancel()})},isClosed:()=>t,runtime:u}},[u]);r(()=>{f.activate();let e=()=>{let e=f.runtime.iab;if(e)for(let t of f.actions.splice(0))t.run(e)},t=f.runtime.onIABChange(e);return e(),()=>{t(),f.deactivate()}},[f]);let p=t(e=>{let t=new Promise((t,r)=>{let i=()=>r(new DOMException("External IAB provider unmounted or changed runtimes.","AbortError"));if(f.isClosed())return void i();let n=async i=>{try{await e(i),t()}catch(e){r(e)}},o=f.runtime.iab;o?n(o):f.actions.push({cancel:i,run:n})});return t.catch(()=>void 0),t},[f]),v=i(()=>({handle:d,run:p,setTab:m,tab:s}),[d,p,s]);return e(a.Provider,{value:v,children:l})};export{u as ExternalIABProvider};
package/dist/hooks.js CHANGED
@@ -1 +1 @@
1
- import{useCallback as e,useContext as s,useSyncExternalStore as n}from"react";import{KernelContext as o}from"./context.js";import{useUIConfig as t}from"./ui-config-context.js";import{invalidateConsentUIAction as u}from"./ui-save.js";let i=function(){let e=s(o);if(!e)throw Error("c15t: no kernel in context. Wrap your app with <ConsentProvider options={...}> from @c15t/react.");return e},r=function(e,s){return e.subscribe(s)},a=function(e){let s=i();return n(e=>r(s,e),()=>e(s.getSnapshot()),()=>e(s.getServerSnapshot()))},c=function(){let e=i();return n(s=>r(e,s),()=>e.getSnapshot(),()=>e.getServerSnapshot())},f=function(e){return a(s=>s.effectivePermissions[e])},l=function(){return a(e=>e.effectivePermissions)},h=function(){return a(e=>e.overrides)},p=function(){return a(e=>e.user)},m=function(){return a(e=>e.location)},k=function(){return a(e=>e.translations)},_=function(){return a(e=>e.branding)},d=function(){return a(e=>"matched"===e.resolution.status)},v=function(){return a(e=>"matched"===e.resolution.status&&("none"!==e.policyRule.prompt||e.policyRule.rights.length>0))},P=function(){return a(e=>"matched"===e.resolution.status?e.model:null)},S=function(){return a(e=>e.activeUI)},g=function(){return a(e=>e.policyRule.scope)},C=function(){return a(e=>e.policyRule.scopeMode)},y=function(){return a(e=>e.iab)},I=function(){return a(e=>e.iab?.enabled??!1)},b=function(e){let s=String(e);return a(e=>e.iab?.vendorConsents[s]??!1)},R=function(e){return a(s=>s.iab?.purposeConsents[e]??!1)},O=function(e){return a(s=>s.iab?.specialFeatureOptIns[e]??!1)},U=function(){return a(e=>e.iab?.tcString??null)},A=function(){return i().set.overrides},D=function(){return i().set.language},x=function(){let s=i();return e(e=>{u(s),s.set.activeUI(e)},[s])},E=function(){return i().commands.save},B=function(){let s=i();return e(e=>s.events.on("permissions:changed",({snapshot:s})=>e(s.effectivePermissions)),[s])},T=function(){return i().commands.identify},M=function(){return i().commands.init},N=function(){return a(e=>e.explicitChoice)},H=function(){return a(e=>e.effectivePermissions)},L=function(){return a(e=>e.promptRequirement)},j=function(){return a(e=>e.noticeDismissal)},q=function(){return a(e=>e.privacySignals)},F=function(){return a(e=>e.optOutDirectives)},w=function(){return a(e=>e.resolution)},V=function(){return a(e=>e.policyRule)},W=function(){return a(e=>e.restrictions)},z=function(){return i().commands.dismissNotice},G={},J={},K=function(){return t().presentation?.prompt??G},Q=function(){return t().presentation?.preferences??J};export{S as useActiveUI,_ as useBranding,f as useConsent,l as useConsents,z as useDismissNotice,H as useEffectivePermissions,N as useExplicitChoice,d as useHasConsentPolicy,v as useHasConsentUI,I as useIABEnabled,y as useIABSnapshot,T as useIdentify,M as useInit,m as useLocation,P as useModel,j as useNoticeDismissal,F as useOptOutDirectives,h as useOverrides,g as usePolicyCategories,w as usePolicyResolution,V as usePolicyRule,C as usePolicyScopeMode,Q as usePreferencesPresentation,q as usePrivacySignals,K as usePromptPresentation,L as usePromptRequirement,R as usePurposeConsent,W as useRestrictions,E as useSaveConsents,x as useSetActiveUI,D as useSetLanguage,A as useSetOverrides,c as useSnapshot,O as useSpecialFeatureOptIn,B as useSubscribeToConsentChanges,U as useTCString,k as useTranslations,p as useUser,b as useVendorConsent};
1
+ import{evaluateConsent as e,isVendorDenied as s}from"@c15t/core";import{useCallback as o,useContext as n,useSyncExternalStore as t}from"react";import{KernelContext as r}from"./context.js";import{useUIConfig as u}from"./ui-config-context.js";import{invalidateConsentUIAction as i}from"./ui-save.js";let a=function(){let e=n(r);if(!e)throw Error("c15t: no kernel in context. Wrap your app with <ConsentProvider options={...}> from @c15t/react.");return e},c=function(e,s){return e.subscribe(s)},f=function(e){let s=a();return t(e=>c(s,e),()=>e(s.getSnapshot()),()=>e(s.getServerSnapshot()))},l=function(){let e=a();return t(s=>c(e,s),()=>e.getSnapshot(),()=>e.getServerSnapshot())},h=function(e){return f(s=>s.effectivePermissions[e])},p=function(){return f(e=>e.effectivePermissions)},d=function(){return f(e=>e.overrides)},m=function(){return f(e=>e.user)},k=function(){return f(e=>e.location)},_=function(){return f(e=>e.translations)},C=function(){return f(e=>e.branding)},g=function(){return f(e=>"matched"===e.resolution.status)},v=function(){return f(e=>"matched"===e.resolution.status&&("none"!==e.policyRule.prompt||e.policyRule.rights.length>0))},P=function(){return f(e=>"matched"===e.resolution.status?e.model:null)},S=function(){return f(e=>e.activeUI)},y=function(){return f(e=>e.policyRule.scope)},I=function(){return f(e=>e.policyRule.scopeMode)},b=function(){return f(e=>e.iab)},R=function(){return f(e=>e.iab?.enabled??!1)},O=function(e){let s=String(e);return f(e=>e.iab?.vendorConsents[s]??!1)},A=function(e){return f(s=>s.iab?.purposeConsents[e]??!1)},D=function(e){return f(s=>s.iab?.specialFeatureOptIns[e]??!1)},U=function(){return f(e=>e.iab?.tcString??null)},V=[],x=function(){return f(e=>"iab"===e.model?V:e.vendors?.declared??V)},E=function(){return f(e=>e.vendorChoice)},B=function(o){return f(n=>{let t=n.vendors?.declared.find(e=>e.id===o);if(!t)return!0;if("iab"!==n.model&&s(n,o))return!1;try{return e({category:t.category},n)}catch{return!1}})},T=function(){return a().set.registerConsentCategories},M=function(){return a().set.overrides},N=function(){return a().set.language},w=function(){let e=a();return o(s=>{i(e),e.set.activeUI(s)},[e])},H=function(){return a().commands.save},L=function(){let e=a();return o(s=>e.events.on("permissions:changed",({snapshot:e})=>s(e.effectivePermissions)),[e])},j=function(){return a().commands.identify},q=function(){return a().commands.init},F=function(){return f(e=>e.explicitChoice)},W=function(){return f(e=>e.effectivePermissions)},z=function(){return f(e=>e.promptRequirement)},G=function(){return f(e=>e.noticeDismissal)},J=function(){return f(e=>e.privacySignals)},K=function(){return f(e=>e.optOutDirectives)},Q=function(){return f(e=>e.resolution)},X=function(){return f(e=>e.policyRule)},Y=function(){return f(e=>e.restrictions)},Z=function(){return a().commands.dismissNotice},$={},ee={},es=function(){return u().presentation?.prompt??$},eo=function(){return u().presentation?.preferences??ee};export{S as useActiveUI,C as useBranding,h as useConsent,p as useConsents,x as useDeclaredVendors,Z as useDismissNotice,W as useEffectivePermissions,F as useExplicitChoice,g as useHasConsentPolicy,v as useHasConsentUI,R as useIABEnabled,b as useIABSnapshot,j as useIdentify,q as useInit,k as useLocation,P as useModel,G as useNoticeDismissal,K as useOptOutDirectives,d as useOverrides,y as usePolicyCategories,Q as usePolicyResolution,X as usePolicyRule,I as usePolicyScopeMode,eo as usePreferencesPresentation,J as usePrivacySignals,es as usePromptPresentation,z as usePromptRequirement,A as usePurposeConsent,T as useRegisterConsentCategories,Y as useRestrictions,H as useSaveConsents,w as useSetActiveUI,N as useSetLanguage,M as useSetOverrides,l as useSnapshot,D as useSpecialFeatureOptIn,L as useSubscribeToConsentChanges,U as useTCString,_ as useTranslations,m as useUser,B as useVendorAllowed,E as useVendorChoice,O as useVendorConsent};
@@ -5,116 +5,10 @@
5
5
  * nested package CSS imports still include the complete stylesheet.
6
6
  */
7
7
  /* default theme tokens (generated from defaultTheme) */
8
- :root, :host, .c15t-theme-root {
9
- --c15t-border: hsl(0, 0%, 90%);
10
- --c15t-border-hover: hsl(0, 0%, 85%);
11
- --c15t-duration-fast: 80ms;
12
- --c15t-duration-normal: 150ms;
13
- --c15t-duration-slow: 200ms;
14
- --c15t-easing: cubic-bezier(0.4, 0, 0.2, 1);
15
- --c15t-easing-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
16
- --c15t-easing-out: cubic-bezier(0.215, 0.61, 0.355, 1);
17
- --c15t-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
18
- --c15t-font-family: system-ui, -apple-system, sans-serif;
19
- --c15t-font-size-base: 1rem;
20
- --c15t-font-size-lg: 1.125rem;
21
- --c15t-font-size-sm: 0.875rem;
22
- --c15t-font-weight-medium: 500;
23
- --c15t-font-weight-normal: 400;
24
- --c15t-font-weight-semibold: 600;
25
- --c15t-line-height-normal: 1.5;
26
- --c15t-line-height-relaxed: 1.75;
27
- --c15t-line-height-tight: 1.25;
28
- --c15t-overlay: hsla(0, 0%, 0%, 0.5);
29
- --c15t-primary: hsl(228, 100%, 60%);
30
- --c15t-primary-hover: hsl(228, 100%, 55%);
31
- --c15t-radius-full: 9999px;
32
- --c15t-radius-lg: 0.75rem;
33
- --c15t-radius-md: 0.5rem;
34
- --c15t-radius-sm: 0.25rem;
35
- --c15t-shadow-lg: 0 8px 24px hsla(0, 0%, 0%, 0.12);
36
- --c15t-shadow-md: 0 4px 12px hsla(0, 0%, 0%, 0.08);
37
- --c15t-shadow-sm: 0 1px 2px hsla(0, 0%, 0%, 0.05);
38
- --c15t-space-lg: 1.5rem;
39
- --c15t-space-md: 1rem;
40
- --c15t-space-sm: 0.5rem;
41
- --c15t-space-xl: 2rem;
42
- --c15t-space-xs: 0.25rem;
43
- --c15t-surface: hsl(0, 0%, 100%);
44
- --c15t-surface-hover: hsl(0, 0%, 98%);
45
- --c15t-switch-thumb: hsl(0, 0%, 100%);
46
- --c15t-switch-track: hsl(0, 0%, 85%);
47
- --c15t-switch-track-active: hsl(228, 100%, 60%);
48
- --c15t-text: hsl(0, 0%, 10%);
49
- --c15t-text-muted: hsl(0, 0%, 40%);
50
- --c15t-text-on-primary: hsl(0, 0%, 100%);
51
- }
52
-
53
- :root.dark, :host(.dark), .dark .c15t-theme-root, :root.c15t-dark, :host(.c15t-dark), .c15t-dark .c15t-theme-root {
54
- --c15t-border: hsl(0, 0%, 20%);
55
- --c15t-border-hover: hsl(0, 0%, 25%);
56
- --c15t-duration-fast: 80ms;
57
- --c15t-duration-normal: 150ms;
58
- --c15t-duration-slow: 200ms;
59
- --c15t-easing: cubic-bezier(0.4, 0, 0.2, 1);
60
- --c15t-easing-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
61
- --c15t-easing-out: cubic-bezier(0.215, 0.61, 0.355, 1);
62
- --c15t-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
63
- --c15t-font-family: system-ui, -apple-system, sans-serif;
64
- --c15t-font-size-base: 1rem;
65
- --c15t-font-size-lg: 1.125rem;
66
- --c15t-font-size-sm: 0.875rem;
67
- --c15t-font-weight-medium: 500;
68
- --c15t-font-weight-normal: 400;
69
- --c15t-font-weight-semibold: 600;
70
- --c15t-line-height-normal: 1.5;
71
- --c15t-line-height-relaxed: 1.75;
72
- --c15t-line-height-tight: 1.25;
73
- --c15t-overlay: hsla(0, 0%, 0%, 0.7);
74
- --c15t-primary: hsl(228, 100%, 70%);
75
- --c15t-primary-hover: hsl(228, 100%, 65%);
76
- --c15t-radius-full: 9999px;
77
- --c15t-radius-lg: 0.75rem;
78
- --c15t-radius-md: 0.5rem;
79
- --c15t-radius-sm: 0.25rem;
80
- --c15t-shadow-lg: 0 8px 24px hsla(0, 0%, 0%, 0.12);
81
- --c15t-shadow-md: 0 4px 12px hsla(0, 0%, 0%, 0.08);
82
- --c15t-shadow-sm: 0 1px 2px hsla(0, 0%, 0%, 0.05);
83
- --c15t-space-lg: 1.5rem;
84
- --c15t-space-md: 1rem;
85
- --c15t-space-sm: 0.5rem;
86
- --c15t-space-xl: 2rem;
87
- --c15t-space-xs: 0.25rem;
88
- --c15t-surface: hsl(0, 0%, 7%);
89
- --c15t-surface-hover: hsl(0, 0%, 10%);
90
- --c15t-switch-thumb: hsl(0, 0%, 93%);
91
- --c15t-switch-track: hsl(0, 0%, 25%);
92
- --c15t-switch-track-active: hsl(228, 100%, 70%);
93
- --c15t-text: hsl(0, 0%, 93%);
94
- --c15t-text-muted: hsl(0, 0%, 60%);
95
- --c15t-text-on-primary: hsl(0, 0%, 100%);
96
- }
97
-
98
- /*
99
- * Utility class to disable transitions during theme switching.
100
- * Apply this class to the root element before switching themes,
101
- * then remove it after a short delay to prevent flash of
102
- * animated content during the color scheme change.
103
- *
104
- * Example usage:
105
- * document.documentElement.classList.add('c15t-no-transitions');
106
- * // Switch theme...
107
- * requestAnimationFrame(() => {
108
- * document.documentElement.classList.remove('c15t-no-transitions');
109
- * });
110
- */
111
- .c15t-no-transitions,
112
- .c15t-no-transitions *,
113
- .c15t-no-transitions *::before,
114
- .c15t-no-transitions *::after {
115
- transition: none !important;
116
- animation: none !important;
117
- }
8
+ :root,:host,.c15t-theme-root{--c15t-border: hsl(0, 0%, 90%);--c15t-border-hover: hsl(0, 0%, 85%);--c15t-duration-fast: 80ms;--c15t-duration-normal: 150ms;--c15t-duration-slow: 200ms;--c15t-easing: cubic-bezier(0.4, 0, 0.2, 1);--c15t-easing-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);--c15t-easing-out: cubic-bezier(0.215, 0.61, 0.355, 1);--c15t-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);--c15t-font-family: system-ui, -apple-system, sans-serif;--c15t-font-size-base: 1rem;--c15t-font-size-lg: 1.125rem;--c15t-font-size-sm: 0.875rem;--c15t-font-weight-medium: 500;--c15t-font-weight-normal: 400;--c15t-font-weight-semibold: 600;--c15t-line-height-normal: 1.5;--c15t-line-height-relaxed: 1.75;--c15t-line-height-tight: 1.25;--c15t-overlay: hsla(0, 0%, 0%, 0.5);--c15t-primary: hsl(228, 100%, 60%);--c15t-primary-hover: hsl(228, 100%, 55%);--c15t-radius-full: 9999px;--c15t-radius-lg: 0.75rem;--c15t-radius-md: 0.5rem;--c15t-radius-sm: 0.25rem;--c15t-shadow-lg: 0 8px 24px hsla(0, 0%, 0%, 0.12);--c15t-shadow-md: 0 4px 12px hsla(0, 0%, 0%, 0.08);--c15t-shadow-sm: 0 1px 2px hsla(0, 0%, 0%, 0.05);--c15t-space-lg: 1.5rem;--c15t-space-md: 1rem;--c15t-space-sm: 0.5rem;--c15t-space-xl: 2rem;--c15t-space-xs: 0.25rem;--c15t-surface: hsl(0, 0%, 100%);--c15t-surface-hover: hsl(0, 0%, 98%);--c15t-switch-thumb: hsl(0, 0%, 100%);--c15t-switch-track: hsl(0, 0%, 85%);--c15t-switch-track-active: hsl(228, 100%, 60%);--c15t-text: hsl(0, 0%, 10%);--c15t-text-muted: hsl(0, 0%, 40%);--c15t-text-on-primary: hsl(0, 0%, 100%);}
9
+
10
+ :root.dark,:host(.dark),.dark .c15t-theme-root,:root.c15t-dark,:host(.c15t-dark),.c15t-dark .c15t-theme-root{--c15t-border: hsl(0, 0%, 20%);--c15t-border-hover: hsl(0, 0%, 25%);--c15t-duration-fast: 80ms;--c15t-duration-normal: 150ms;--c15t-duration-slow: 200ms;--c15t-easing: cubic-bezier(0.4, 0, 0.2, 1);--c15t-easing-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);--c15t-easing-out: cubic-bezier(0.215, 0.61, 0.355, 1);--c15t-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);--c15t-font-family: system-ui, -apple-system, sans-serif;--c15t-font-size-base: 1rem;--c15t-font-size-lg: 1.125rem;--c15t-font-size-sm: 0.875rem;--c15t-font-weight-medium: 500;--c15t-font-weight-normal: 400;--c15t-font-weight-semibold: 600;--c15t-line-height-normal: 1.5;--c15t-line-height-relaxed: 1.75;--c15t-line-height-tight: 1.25;--c15t-overlay: hsla(0, 0%, 0%, 0.7);--c15t-primary: hsl(228, 100%, 70%);--c15t-primary-hover: hsl(228, 100%, 65%);--c15t-radius-full: 9999px;--c15t-radius-lg: 0.75rem;--c15t-radius-md: 0.5rem;--c15t-radius-sm: 0.25rem;--c15t-shadow-lg: 0 8px 24px hsla(0, 0%, 0%, 0.12);--c15t-shadow-md: 0 4px 12px hsla(0, 0%, 0%, 0.08);--c15t-shadow-sm: 0 1px 2px hsla(0, 0%, 0%, 0.05);--c15t-space-lg: 1.5rem;--c15t-space-md: 1rem;--c15t-space-sm: 0.5rem;--c15t-space-xl: 2rem;--c15t-space-xs: 0.25rem;--c15t-surface: hsl(0, 0%, 7%);--c15t-surface-hover: hsl(0, 0%, 10%);--c15t-switch-thumb: hsl(0, 0%, 93%);--c15t-switch-track: hsl(0, 0%, 25%);--c15t-switch-track-active: hsl(228, 100%, 70%);--c15t-text: hsl(0, 0%, 93%);--c15t-text-muted: hsl(0, 0%, 60%);--c15t-text-on-primary: hsl(0, 0%, 100%);}
11
+ .c15t-no-transitions,.c15t-no-transitions *,.c15t-no-transitions *::before,.c15t-no-transitions *::after{transition: none !important;animation: none !important;}
118
12
 
119
13
  /* primitives/button vars */
120
14
  :root, :host{--button-primary:var(--c15t-primary);--button-primary-dark:var(--c15t-primary);--button-primary-hover:var(--c15t-primary-hover);--button-primary-hover-dark:var(--c15t-primary-hover);--button-neutral:var(--c15t-text-muted);--button-neutral-dark:var(--c15t-text-muted);--button-neutral-hover:var(--c15t-text);--button-neutral-hover-dark:var(--c15t-text);--button-neutral-soft:var(--c15t-surface-hover);--button-neutral-soft-dark:var(--c15t-surface-hover);--button-focus-ring:var(--c15t-primary);--button-focus-ring-dark:var(--c15t-primary);--button-text:var(--c15t-text);--button-text-dark:var(--c15t-text);--button-text-hover:var(--c15t-text);--button-text-hover-dark:var(--c15t-text);--button-background-color:var(--c15t-surface);--button-background-color-dark:var(--c15t-surface);--button-border:var(--c15t-border);--button-border-dark:var(--c15t-border);--button-hover-overlay:var(--c15t-surface-hover);--button-hover-overlay-dark:var(--c15t-surface-hover);--button-primary-hover-tint:color-mix(in srgb, var(--c15t-primary) 10%, transparent);--button-neutral-hover-tint:color-mix(in srgb, var(--c15t-text) 10%, transparent);--button-font:var(--c15t-font-family);--button-border-width:1px;--button-border-style:solid;--button-border-color:var(--c15t-border);--button-border-radius:var(--c15t-radius-md);--button-font-weight:var(--c15t-font-weight-medium);--button-font-size:var(--c15t-font-size-sm);--button-line-height:var(--c15t-line-height-tight);--button-transition:opacity var(--c15t-duration-fast) var(--c15t-easing), transform var(--c15t-duration-fast) var(--c15t-easing);--button-hover-transition-color:background-color var(--c15t-duration-fast) var(--c15t-easing);--button-hover-transition-full:background-color var(--c15t-duration-fast) var(--c15t-easing), box-shadow var(--c15t-duration-fast) var(--c15t-easing), color var(--c15t-duration-fast) var(--c15t-easing);--button-cursor:pointer;--button-shadow:var(--c15t-shadow-sm);--button-shadow-dark:var(--c15t-shadow-sm);--button-shadow-primary-focus:0 0 0 2px var(--button-focus-ring);--button-shadow-neutral-focus:0 0 0 2px var(--button-focus-ring);--button-shadow-primary-focus-dark:0 0 0 2px var(--button-focus-ring-dark);--button-shadow-neutral-focus-dark:0 0 0 2px var(--button-focus-ring-dark);--button-shadow-primary:var(--button-shadow), inset 0 0 0 1px var(--button-primary);--button-shadow-primary-dark:var(--button-shadow-dark), inset 0 0 0 1px var(--button-primary-dark);--button-shadow-primary-hover:none;--button-shadow-primary-hover-dark:none;--button-shadow-neutral:var(--button-shadow), inset 0 0 0 1px var(--button-neutral-soft);--button-shadow-neutral-dark:var(--button-shadow-dark), inset 0 0 0 1px var(--button-neutral-soft-dark);--button-shadow-neutral-hover:none;--button-shadow-neutral-hover-dark:none}
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export{createConsentKernel,custom,hosted}from"@c15t/core";export{offline}from"./transports/offline.js";export{ConsentDialog,ConsentWidget}from"./aggregate-components.js";export{ConsentBanner,useConsentBannerSurface}from"./components/prompt/index.js";export{ConsentDialogLink}from"./components/panel-link/index.js";export{ConsentDialogTrigger,ConsentDialogTriggerToolbar}from"./components/panel-trigger/index.js";export{Frame}from"./components/frame/index.js";export{ConsentDraftProvider,useConsentDraft}from"./draft.js";export{useConsentManager}from"./component-hooks/use-manager.js";export{useTranslations}from"./component-hooks/use-translations.js";export{useActiveUI,useBranding,useConsent,useConsents,useDismissNotice,useEffectivePermissions,useExplicitChoice,useHasConsentPolicy,useHasConsentUI,useIABEnabled,useIABSnapshot,useIdentify,useInit,useLocation,useModel,useNoticeDismissal,useOptOutDirectives,useOverrides,usePolicyCategories,usePolicyResolution,usePolicyRule,usePolicyScopeMode,usePreferencesPresentation,usePrivacySignals,usePromptPresentation,usePromptRequirement,usePurposeConsent,useRestrictions,useSaveConsents,useSetActiveUI,useSetLanguage,useSetOverrides,useSnapshot,useSpecialFeatureOptIn,useTCString,useUser,useVendorConsent}from"./hooks.js";export{useIframeBlocker,useNetworkBlocker,usePersistence,useScriptLoader}from"./module-hooks.js";export{ConsentProvider}from"./provider.js";export{defineTheme}from"./types/theme/index.js";
1
+ export{createConsentKernel,custom,hosted}from"@c15t/core";export{offline}from"./transports/offline.js";export{ConsentDialog,ConsentWidget}from"./aggregate-components.js";export{ConsentBanner,useConsentBannerSurface}from"./components/prompt/index.js";export{ConsentDialogLink}from"./components/panel-link/index.js";export{ConsentDialogTrigger,ConsentDialogTriggerToolbar}from"./components/panel-trigger/index.js";export{ConsentGate,Frame}from"./components/consent-gate/index.js";export{ConsentDraftProvider,useConsentDraft,useVendorDraft}from"./draft.js";export{useConsentManager}from"./component-hooks/use-manager.js";export{useTranslations}from"./component-hooks/use-translations.js";export{useActiveUI,useBranding,useConsent,useConsents,useDeclaredVendors,useDismissNotice,useEffectivePermissions,useExplicitChoice,useHasConsentPolicy,useHasConsentUI,useIABEnabled,useIABSnapshot,useIdentify,useInit,useLocation,useModel,useNoticeDismissal,useOptOutDirectives,useOverrides,usePolicyCategories,usePolicyResolution,usePolicyRule,usePolicyScopeMode,usePreferencesPresentation,usePrivacySignals,usePromptPresentation,usePromptRequirement,usePurposeConsent,useRestrictions,useSaveConsents,useSetActiveUI,useSetLanguage,useSetOverrides,useSnapshot,useSpecialFeatureOptIn,useTCString,useUser,useVendorAllowed,useVendorChoice,useVendorConsent}from"./hooks.js";export{useIframeBlocker,useNetworkBlocker,usePersistence,useScriptLoader}from"./module-hooks.js";export{ConsentProvider}from"./provider.js";export{defineTheme}from"./types/theme/index.js";
package/dist/provider.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{Fragment as e,jsx as r,jsxs as n}from"react/jsx-runtime";import{createConsentKernel as t,kernelConfigToInitResponse as i}from"@c15t/core";import{createWindowDebug as o,resolveWindowDebugMode as l}from"@c15t/core/modules/window-debug";import{resolvePolicyRules as s}from"@c15t/schema/types";import{deepMergeTranslations as c}from"@c15t/translations";import{Suspense as u,lazy as a,useContext as d,useEffect as p,useMemo as m,useRef as f,useState as g}from"react";import{KernelContext as v,ProviderServicesContext as h}from"./context.js";import{useColorScheme as y}from"./hooks/use-color-scheme.js";import{usePersistence as k}from"./module-hooks/persistence.js";import{V3ThemeProvider as b}from"./theme-provider.js";import{defaultTranslationConfig as R}from"./utils/default-translation-config.js";let P=a(async()=>({default:(await import("./external-iab-context.js")).ExternalIABProvider})),S=s({countryCode:null,regionCode:null,rules:[{id:"disabled",match:{fallback:!0},model:"opt-out",prompt:"none"}]}),w={language:"en",translations:R.translations.en},C=function(e){if(e)return"externalId"in e?e:{externalId:e.id,identityProvider:e.identityProvider}},O=function(e){if(!e?.messages)return;let r=e.locale??R.defaultLanguage??"en",n=R.translations.en,t=e.messages[r]??e.messages.en??n,i=R.translations[r]??n;return{language:r,translations:c(i,t)}},x=function(e){return e.enabled??!0},j=function(e,r){let n=!1;return{...e,async init(t){if(n)return e.init?.(t)??{};n=!0;let i=await r(t);return i.response?i.response:e.init?.(i.context??t)??{}}}},E=function(e){return"function"==typeof e?.then},L=function(e){let{prefetch:r}=e;return!r||E(r)?{}:r},K=function(e){return void 0!==e&&Object.keys(e).length>0},N=function(e){"production"!==globalThis.process?.env?.NODE_ENV&&console.warn("c15t ConsentProvider: the `prefetch` promise rejected; falling back to the transport init.",e)},D=function(e,r,n,t){let i={...r.initialOverrides??{},...n??{}};K(i)&&e.set.overrides(i),r.initialRecords&&e.getRecordsGeneration()===t&&e.hydrate(r.initialRecords)},q=function(e,r,n){var t,o;let{prefetch:l}=r;return E(l)?j(e,(t=Promise.resolve(l),o=r.overrides,async e=>{let r,l=n()?.getRecordsGeneration();try{r=await t??{}}catch(e){return N(e),{}}let s=i(r);if(s){let e={...s.resolvedOverrides??{},...o??{}};return K(e)&&(s.resolvedOverrides=e),{response:s}}let c=n();return c&&D(c,r,o,l),{context:{overrides:{...e.overrides,...r.initialOverrides??{},...o??{}},user:e.user}}})):e},_=function(e){if("function"!=typeof e.mode)throw Error("c15t ConsentProvider: `mode` is required. Use hosted(), offline(), or custom().");return e.mode},A=function(e){let r=x(e),n=L(e),i=O(e.i18n)??w,o={consentCategories:e.consentCategories,prefetch:n,translations:i},l=_(e)(o),s={current:null},c=q(l,e,()=>s.current),u=t({...n,initialRecords:r?n.initialRecords:void 0,initialPrivacySignals:r?n.initialPrivacySignals:void 0,now:n.now??n.initialRecords?.now??(n.initialRecords?void 0:0),transport:c,initialPolicyResolution:r?n.initialPolicyResolution:S,initialOverrides:{...n.initialOverrides??{},...e.overrides??{}},initialUser:C(e.user)??n.initialUser,initialTranslations:n.initialTranslations??i,initialPolicyPending:n.initialPolicyPending??(r&&!n.initialPolicyResolution)});return s.current=u,u},B=function(e){if(e instanceof Error)return e.message;if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}},I=function(e,r){let n=f(r);p(()=>{n.current=r},[r]),p(()=>{let r=[e.events.on("choice:recorded",({snapshot:e,confirmed:r,actionAt:t})=>{n.current?.onChoiceRecorded?.({actionAt:t,confirmed:r,snapshot:e})}),e.events.on("permissions:changed",({snapshot:e,previous:r})=>{n.current?.onPermissionsChanged?.({previous:r,snapshot:e})}),e.events.on("command:error",e=>{n.current?.onError?.({error:B(e.error)})})];return()=>{for(let e of r)e()}},[e])},T=function(e,r,n,t){let i=f(n),o=f(null),l=f(null),s=f(null);p(()=>{if(!t)return;let n=C(r.user),i=JSON.stringify(n??null);if(null===o.current){o.current=i;return}o.current!==i&&(o.current=i,n&&(async()=>{try{await e.commands.identify(n)}catch{}})())},[e,r.user,t]),p(()=>{if(!t)return;let i=JSON.stringify(r.overrides??{});if(null===l.current){l.current=i;return}l.current!==i&&(l.current=i,e.set.overrides(r.overrides??{}),n&&e.commands.init())},[n,e,r.overrides,t]),p(()=>{!t||i.current===n||(i.current=n,n||e.set.activeUI("none"))},[n,e,t]),p(()=>{if("production"===globalThis.process?.env?.NODE_ENV)return;let e=JSON.stringify({i18n:r.i18n,mode:r.mode?.kind});if(null===s.current){s.current=e;return}s.current!==e&&(s.current=e,console.warn("c15t ConsentProvider: mode and i18n are initial-only options. Remount the provider to apply changes."))},[r])},H=({kernel:e,callbacks:r})=>(I(e,r),null),J=({enabled:e,kernel:r,prepared:n})=>{let t=f(!1),i=f(!1);return p(()=>{if(!e){t.current=!1;return}if(!t.current)if(t.current=!0,n){r.hydrate({now:i.current?Date.now():r.getServerSnapshot().evaluatedAt}),i.current=!0;let{gpc:e}=r.getSnapshot().privacySignals;e.detected&&e.active&&r.set.privacySignals({gpc:!0})}else r.commands.init()},[e,r,n]),null},U=({nonce:e,options:r,scripts:n})=>{let t=d(v),i=f(null),o=f(n),l=f(r),s=f(e);return p(()=>{o.current=n,l.current=r,s.current=e},[e,r,n]),p(()=>{if(!t)return;let e=!1;return(async()=>{let{createScriptLoader:r}=await import("@c15t/core/modules/script-loader");e||(i.current=r({kernel:t,nonce:s.current,onDebug:l.current?.onDebug,scripts:o.current}))})(),()=>{e=!0,i.current?.dispose(),i.current=null}},[t]),p(()=>{i.current?.updateScripts(n)},[n]),null},F=({options:e})=>{let r=d(v),n=f(null),t=f(e);return p(()=>{t.current=e},[e]),p(()=>{if(!r)return;let e=!1;return(async()=>{let{createNetworkBlocker:i}=await import("@c15t/core/modules/network-blocker");if(e)return;let o=t.current;n.current=i({enabled:o.enabled,kernel:r,logBlockedRequests:o.logBlockedRequests,onRequestBlocked:o.onRequestBlocked,rules:o.rules})})(),()=>{e=!0,n.current?.dispose(),n.current=null}},[r]),p(()=>{n.current?.updateRules(e.rules)},[e.rules]),p(()=>{void 0!==e.enabled&&n.current?.setEnabled(e.enabled)},[e.enabled]),null},G=({options:e,clearRef:r})=>{let n=k(e);return p(()=>(r.current=n.clear,()=>{r.current=null}),[n,r]),null},M=({pkg:e,mode:r})=>(p(()=>{let n=o({mode:r,pkg:e});return()=>n.dispose()},[r,e]),null),V=({kernel:e})=>(p(()=>{let r=window,n=r.c15tKernel;return r.c15tKernel=e,()=>{if(r.c15tKernel===e){if(n){r.c15tKernel=n;return}delete r.c15tKernel}}},[e]),null),z=({nonce:e,theme:n})=>{let[t,i]=g("");return(p(()=>{let e=!1;return(async()=>{let{defaultTheme:r,generateThemeCSS:t}=await import("@c15t/ui/theme");e||i(t(n??r))})(),()=>{e=!0}},[n]),t)?r("style",{id:"c15t-theme",nonce:e,dangerouslySetInnerHTML:{__html:t}}):null},Q=function(e){if(!1===e.persistence)return!1;let{storageConfig:r}=e,n=!!L(e).initialRecords;return!0===e.persistence||void 0===e.persistence?{skipHydration:n,storageConfig:r}:{...e.persistence,skipHydration:e.persistence.skipHydration??n,storageConfig:e.persistence.storageConfig??r}},W=t=>{let{children:i}=t,o=t.options??{},s=x(o),[c,a]=g(()=>({disabledKernel:t.runtime?void 0:A({...o,enabled:!1}),external:t.runtime,kernel:t.runtime?.kernel??A({...o,enabled:!0})})),{external:d}=c,k=s?c.kernel:c.disabledKernel??c.kernel,R=void 0===d,S=f(null),w=m(()=>({clearRecords:()=>{d?d.clearRecords():S.current?S.current():(k.hydrate({choice:null,noticeDismissal:null,optOutDirectives:[],subject:null}),k.events.emit({type:"records:cleared"}))},getConsentCategories:()=>{let{scope:e}=k.getSnapshot().policyRule,r=o.consentCategories;return["necessary",...e.filter(e=>!r?.length||r.includes(e))]},getPresentation:()=>o.presentation}),[k,o.consentCategories,o.presentation,d]),C=Q(o),{scripts:O,networkBlocker:j}=o,E=o.__debugPkg??"@c15t/react",K=R?l(o.mode):"hosted";T(c.kernel,o,s,R);let N=f(0);p(()=>{if(!R)return;N.current+=1;let e=N.current;return()=>{queueMicrotask(()=>{N.current===e&&(c.kernel.dispose(),c.disabledKernel?.dispose())})}},[c,R]);let D=o.theme,q=m(()=>({colorScheme:o.colorScheme,disableAnimation:o.disableAnimation,noStyle:o.noStyle,scrollLock:o.scrollLock,theme:D,trapFocus:o.trapFocus}),[D,o.noStyle,o.disableAnimation,o.scrollLock,o.trapFocus,o.colorScheme]),_=m(()=>({components:o.components,legalLinks:o.legalLinks,presentation:o.presentation}),[o.components,o.legalLinks,o.presentation]);y(o.colorScheme);let B=n(e,{children:[R?n(e,{children:[r(H,{kernel:k,callbacks:o.callbacks}),r(M,{pkg:E,mode:K}),r(V,{kernel:k}),s&&C?r(G,{options:C,clearRef:S}):null,r(J,{enabled:s,prepared:!!L(o).initialPolicyResolution,kernel:k}),O&&O.length>0?r(U,{nonce:o.nonce,options:o.scriptLoader,scripts:O}):null,s&&j?r(F,{options:j}):null]}):null,d?r(u,{fallback:i,children:r(P,{runtime:d,children:i})}):i]});return r(v.Provider,{value:k,children:r(h.Provider,{value:w,children:n(b,{themeConfig:q,uiConfig:_,children:[r(z,{nonce:o.nonce,theme:D}),B]})})})};export{W as ConsentProvider};
2
+ import{Fragment as e,jsx as r,jsxs as n}from"react/jsx-runtime";import{createConsentKernel as t,declareOwnedVendors as o,extractConsentNamesFromCondition as i,forgetOwnedVendors as l,kernelConfigToInitResponse as s,resolveVendors as c}from"@c15t/core";import{createWindowDebug as u,resolveWindowDebugMode as a}from"@c15t/core/modules/window-debug";import{resolvePolicyRules as d}from"@c15t/schema/types";import{deepMergeTranslations as f}from"@c15t/translations";import{defaultTheme as g,generateThemeCSS as p}from"@c15t/ui/theme";import{useContext as m,useEffect as v,useMemo as h,useRef as y,useState as k}from"react";import{KernelContext as C,ProviderServicesContext as b}from"./context.js";import{ExternalIABProvider as S}from"./external-iab-context.js";import{useColorScheme as w}from"./hooks/use-color-scheme.js";import{useIframeBlocker as R}from"./module-hooks/iframe-blocker.js";import{usePersistence as P}from"./module-hooks/persistence.js";import{V3ThemeProvider as O}from"./theme-provider.js";import{defaultTranslationConfig as x}from"./utils/default-translation-config.js";let j=d({countryCode:null,regionCode:null,rules:[{id:"disabled",match:{fallback:!0},model:"opt-out",prompt:"none"}]}),B={language:"en",translations:x.translations.en},N=function(e){if(e)return"externalId"in e?e:{externalId:e.id,identityProvider:e.identityProvider}},E=function(e){if(!e?.messages)return;let r=e.locale??x.defaultLanguage??"en",n=x.translations.en,t=e.messages[r]??e.messages.en??n,o=x.translations[r]??n;return{language:r,translations:f(o,t)}},K=function(e){return e.enabled??!0},L=function(e,r){let n=!1;return{...e,async init(t){if(n)return e.init?.(t)??{};n=!0;let o=await r(t);return o.response?o.response:e.init?.(o.context??t)??{}}}},D=function(e){return"function"==typeof e?.then},M=function(e){let{prefetch:r}=e;return!r||D(r)?{}:r},_=function(e){return void 0!==e&&Object.keys(e).length>0},T=function(e){"production"!==globalThis.process?.env?.NODE_ENV&&console.warn("c15t ConsentProvider: prefetch rejected; using transport init.",e)},V=function(e,r,n,t){let o={...r.initialOverrides??{},...n??{}};_(o)&&e.set.overrides(o),r.initialRecords&&e.getRecordsGeneration()===t&&e.hydrate(r.initialRecords)},q=function(e,r,n){var t,o;let{prefetch:i}=r;return D(i)?L(e,(t=Promise.resolve(i),o=r.overrides,async e=>{let r,i=n()?.getRecordsGeneration();try{r=await t??{}}catch(e){return T(e),{}}let l=s(r);if(l){let e={...l.resolvedOverrides??{},...o??{}};return _(e)&&(l.resolvedOverrides=e),{response:l}}let c=n();return c&&V(c,r,o,i),{context:{overrides:{...e.overrides,...r.initialOverrides??{},...o??{}},user:e.user}}})):e},J=function(e){if("function"!=typeof e.mode)throw Error("c15t ConsentProvider: set mode to hosted(), offline(), or custom().");return e.mode},A=function(e){"production"!==globalThis.process?.env?.NODE_ENV&&console.warn(e)},H=function(e,r,n){let t=c({config:e.vendors,existing:n.initialVendors?.declared,onWarn:A,owners:r}),o=n.initialVendors?.listVersion??null;return t.length>0||null!==o?{declared:t,listVersion:o}:void 0},I=function(e){let r=K(e),n=M(e),o=E(e.i18n)??B,l={consentCategories:e.consentCategories,prefetch:n,translations:o},s=J(e)(l),c={current:null},u=q(s,e,()=>c.current),a=[...e.scripts??[],...e.networkBlocker?e.networkBlocker.rules??[]:[]],d=H(e,a,n),f=t({...n,consentCategories:e.consentCategories,inferredConsentCategories:[...a.flatMap(e=>i(e.category)),...(d?.declared??[]).flatMap(e=>i(e.category))],initialVendors:d,initialRecords:r?n.initialRecords:void 0,initialPrivacySignals:r?n.initialPrivacySignals:void 0,now:n.now??n.initialRecords?.now??(n.initialRecords?void 0:0),transport:u,initialPolicyResolution:r?n.initialPolicyResolution:j,initialOverrides:{...n.initialOverrides??{},...e.overrides??{}},initialUser:N(e.user)??n.initialUser,initialTranslations:n.initialTranslations??o,initialPolicyPending:n.initialPolicyPending??(r&&!n.initialPolicyResolution)});return c.current=f,f},F=function(e){if(e instanceof Error)return e.message;if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}},U=function(e,r){let n=y(r);v(()=>{n.current=r},[r]),v(()=>{let r=[e.events.on("init:applied",({snapshot:r})=>{let n=r.vendors?.declared??[];n.length>0&&e.set.registerConsentCategories(n.flatMap(e=>i(e.category)))}),e.events.on("choice:recorded",({snapshot:e,confirmed:r,actionAt:t})=>{n.current?.onChoiceRecorded?.({actionAt:t,confirmed:r,snapshot:e})}),e.events.on("permissions:changed",({snapshot:e,previous:r})=>{n.current?.onPermissionsChanged?.({previous:r,snapshot:e})}),e.events.on("command:error",e=>{n.current?.onError?.({error:F(e.error)})})];return()=>{for(let e of r)e()}},[e])},G=function(e,r,n,t){let s=y(n),u=y(null),a=y(null),d=y(null);v(()=>{if(!t)return;let n=N(r.user),o=JSON.stringify(n??null);if(null===u.current){u.current=o;return}u.current!==o&&(u.current=o,n&&(async()=>{try{await e.commands.identify(n)}catch{}})())},[e,r.user,t]),v(()=>{if(!t)return;let o=JSON.stringify(r.overrides??{});if(null===a.current){a.current=o;return}a.current!==o&&(a.current=o,e.set.overrides(r.overrides??{}),n&&e.commands.init())},[n,e,r.overrides,t]),v(()=>{!t||s.current===n||(s.current=n,n||e.set.activeUI("none"))},[n,e,t]);let f=y(null),g=y(Symbol("consent-provider"));v(()=>{if(!t)return;let n=[...r.scripts??[],...r.networkBlocker?r.networkBlocker.rules??[]:[]],l=JSON.stringify([r.vendors??[],n.map(e=>[e.vendor??null,e.category])]);if(null===f.current){f.current=l,o(e,n,g.current);return}if(f.current===l)return;f.current=l;let s=e.getSnapshot().vendors?.declared??[],u=c({config:r.vendors,existing:s.flatMap(e=>{let r="manifest"===e.source?e:e.shadowed;if(r?.source!=="manifest")return[];let{ownerCategory:n,...t}=r;return[t]}),onWarn:A});e.set.vendors({declared:u},{replaceSource:"config"}),o(e,n,g.current);let a=[...u.flatMap(e=>i(e.category)),...n.flatMap(e=>i(e.category))];a.length>0&&e.set.registerConsentCategories(a)},[e,r.networkBlocker,r.scripts,r.vendors,t]),v(()=>()=>{l(e,g.current),f.current=null},[e]),v(()=>{if("production"===globalThis.process?.env?.NODE_ENV)return;let e=JSON.stringify({i18n:r.i18n,mode:r.mode?.kind});if(null===d.current){d.current=e;return}d.current!==e&&(d.current=e,console.warn("c15t ConsentProvider: remount to change mode or i18n."))},[r])},W=({kernel:e,callbacks:r})=>(U(e,r),null),z=({enabled:e,kernel:r,prepared:n})=>{let t=y(!1),o=y(!1);return v(()=>{if(!e){t.current=!1;return}if(!t.current)if(t.current=!0,n){r.hydrate({now:o.current?Date.now():r.getServerSnapshot().evaluatedAt}),o.current=!0;let{gpc:e}=r.getSnapshot().privacySignals;e.detected&&e.active&&r.set.privacySignals({gpc:!0})}else r.commands.init()},[e,r,n]),null},Q=[],X=({clearOnRevocation:e,storageConfig:r,nonce:n,options:t,scripts:o=Q})=>{let i=m(C),l=y(null),s=y(null),c=y(null),u=y({config:e,storageConfig:r}),[a,d]=k(o.length>0),f=y(o),g=y(t),p=y(n);o.length>0&&!a&&d(!0),v(()=>{u.current={config:e,storageConfig:r},f.current=o,g.current=t,p.current=n},[e,r,n,t,o]),v(()=>{if(!i)return;let e=!1;return(async()=>{if(a){let{createScriptLoader:r}=await import("@c15t/core/modules/script-loader");if(e)return;l.current=r({kernel:i,nonce:p.current,onDebug:g.current?.onDebug,scripts:f.current})}let{config:r}=u.current;if(r){let{createClearOnRevocation:n}=await import("@c15t/core/modules/clear-on-revocation");if(e)return;c.current={config:r,create:n},s.current=n({config:r,kernel:i,storageConfig:u.current.storageConfig})}})(),()=>{e=!0,s.current?.dispose(),s.current=null,c.current=null,l.current?.dispose(),l.current=null}},[i,a]);let h=r?.storageKey;return v(()=>{let e=c.current;i&&e&&(s.current?.dispose(),s.current=e.create({config:e.config,kernel:i,storageConfig:{storageKey:h}}))},[i,h]),v(()=>{l.current?.updateScripts(o)},[o]),null},Y=({options:e})=>(R(e),null),Z=({options:e})=>{let r=m(C),n=y(null),t=y(e);return v(()=>{t.current=e},[e]),v(()=>{if(!r)return;let e=!1;return(async()=>{let{createNetworkBlocker:o}=await import("@c15t/core/modules/network-blocker");if(e)return;let i=t.current;n.current=o({enabled:i.enabled,kernel:r,logBlockedRequests:i.logBlockedRequests,onRequestBlocked:i.onRequestBlocked,rules:i.rules})})(),()=>{e=!0,n.current?.dispose(),n.current=null}},[r]),v(()=>{n.current?.updateRules(e.rules)},[e.rules]),v(()=>{void 0!==e.enabled&&n.current?.setEnabled(e.enabled)},[e.enabled]),null},$=({options:e,clearRef:r})=>{let n=P(e);return v(()=>(r.current=n.clear,()=>{r.current=null}),[n,r]),null},ee=({pkg:e,mode:r})=>(v(()=>{let n=u({mode:r,pkg:e});return()=>n.dispose()},[r,e]),null),er=({kernel:e})=>(v(()=>{let r=window,n=r.c15tKernel;return r.c15tKernel=e,()=>{if(r.c15tKernel===e){if(n){r.c15tKernel=n;return}delete r.c15tKernel}}},[e]),null),en=function(e){if(!1===e.persistence)return!1;let{storageConfig:r}=e,n=!!M(e).initialRecords;return!0===e.persistence||void 0===e.persistence?{skipHydration:n,storageConfig:r}:{...e.persistence,skipHydration:e.persistence.skipHydration??n,storageConfig:e.persistence.storageConfig??r}},et=t=>{let{children:o}=t,i=t.options??{},l=K(i),[s,c]=k(()=>({clearOnRevocation:i.clearOnRevocation,disabledKernel:t.runtime?void 0:I({...i,enabled:!1}),external:t.runtime,kernel:t.runtime?.kernel??I({...i,enabled:!0})})),{clearOnRevocation:u,external:d}=s,f=l?s.kernel:s.disabledKernel??s.kernel,m=void 0===d;v(()=>{(m||void 0!==i.consentCategories)&&f.set.consentCategories(i.consentCategories)},[f,m,i.consentCategories]);let R=y(null),P=h(()=>({clearRecords:()=>{d?d.clearRecords():R.current?R.current():(f.hydrate({choice:null,noticeDismissal:null,optOutDirectives:[],subject:null,vendorChoice:null}),f.events.emit({type:"records:cleared"}))},getConsentCategories:()=>{let e=f.getSnapshot();return["necessary",...e.evaluationPolicy.choiceScope??e.policyRule.scope]},getPresentation:()=>i.presentation}),[f,i.presentation,d]),x=en(i),{scripts:j,networkBlocker:B}=i,N=i.__debugPkg??"@c15t/react",E=m?a(i.mode):"hosted";G(s.kernel,i,l,m);let L=y(0);v(()=>{if(!m)return;L.current+=1;let e=L.current;return()=>{queueMicrotask(()=>{L.current===e&&(s.kernel.dispose(),s.disabledKernel?.dispose())})}},[s,m]);let D=i.theme,_=h(()=>p(D??g,i.colorScheme).replace(/</gu,"\\3c "),[D,i.colorScheme]),T=h(()=>({colorScheme:i.colorScheme,disableAnimation:i.disableAnimation,noStyle:i.noStyle,scrollLock:i.scrollLock,theme:D,trapFocus:i.trapFocus}),[D,i.noStyle,i.disableAnimation,i.scrollLock,i.trapFocus,i.colorScheme]),V=h(()=>({components:i.components,legalLinks:i.legalLinks,presentation:i.presentation}),[i.components,i.legalLinks,i.presentation]);w(i.colorScheme);let q=n(e,{children:[m?n(e,{children:[r(W,{kernel:f,callbacks:i.callbacks}),r(ee,{pkg:N,mode:E}),r(er,{kernel:f}),l&&x?r($,{options:x,clearRef:R}):null,r(z,{enabled:l,prepared:!!M(i).initialPolicyResolution,kernel:f}),j&&j.length>0||l&&u?r(X,{clearOnRevocation:l?u:void 0,storageConfig:x?x.storageConfig:i.storageConfig,nonce:i.nonce,options:i.scriptLoader,scripts:j}):null,l&&!1!==i.iframeBlocker?r(Y,{options:i.iframeBlocker}):null,l&&B?r(Z,{options:B}):null]}):null,d?r(S,{runtime:d,children:o}):o]});return r(C.Provider,{value:f,children:r(b.Provider,{value:P,children:n(O,{themeConfig:T,uiConfig:V,children:[r("style",{id:"c15t-theme",nonce:i.nonce,dangerouslySetInnerHTML:{__html:_}}),q]})})})};export{et as ConsentProvider};