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

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 (248) hide show
  1. package/AGENTS.md +91 -67
  2. package/README.md +21 -17
  3. package/SKILL.md +34 -0
  4. package/dist/aggregate-components.js +1 -1
  5. package/dist/chunk-warming.js +1 -1
  6. package/dist/component-hooks/use-headless-consent-ui.js +1 -1
  7. package/dist/component-hooks/use-headless-iab-consent-ui.js +1 -1
  8. package/dist/component-hooks/use-panel-trigger.js +1 -1
  9. package/dist/components/consent-gate/atoms.js +1 -1
  10. package/dist/components/consent-gate/consent-gate.js +1 -1
  11. package/dist/components/consent-preferences-link/consent-preferences-link.js +1 -1
  12. package/dist/components/iab-panel/atoms/card.js +1 -1
  13. package/dist/components/iab-panel/atoms/feature-item.js +2 -0
  14. package/dist/components/iab-panel/atoms/header.js +1 -1
  15. package/dist/components/iab-panel/atoms/purpose-item.js +1 -1
  16. package/dist/components/iab-panel/atoms/stack-item.js +1 -1
  17. package/dist/components/iab-panel/iab-panel.js +1 -1
  18. package/dist/components/iab-panel/index.js +1 -1
  19. package/dist/components/iab-prompt/atoms/overlay.js +1 -1
  20. package/dist/components/iab-prompt/atoms/root.js +1 -1
  21. package/dist/components/panel/atoms/card.js +1 -1
  22. package/dist/components/panel/atoms/overlay.js +1 -1
  23. package/dist/components/panel/atoms/root.js +1 -1
  24. package/dist/components/panel/index.js +1 -1
  25. package/dist/components/panel/panel.js +1 -1
  26. package/dist/components/panel-trigger/atoms/button.js +1 -1
  27. package/dist/components/panel-trigger/atoms/icon.js +1 -1
  28. package/dist/components/panel-trigger/atoms/root.js +1 -1
  29. package/dist/components/panel-trigger/atoms/toolbar.js +1 -1
  30. package/dist/components/panel-trigger/atoms/trigger-icons.js +1 -0
  31. package/dist/components/panel-trigger/panel-trigger-toolbar.js +1 -1
  32. package/dist/components/preferences/atoms/accordion.js +1 -1
  33. package/dist/components/preferences/atoms/root.js +1 -1
  34. package/dist/components/preferences/atoms/vendor-list.js +1 -1
  35. package/dist/components/preferences/index.js +1 -1
  36. package/dist/components/prompt/atoms/overlay.js +1 -1
  37. package/dist/components/prompt/atoms/root.js +1 -1
  38. package/dist/components/prompt/components.js +1 -1
  39. package/dist/components/prompt/policy-actions.js +1 -1
  40. package/dist/components/shared/libs/compose-refs.js +1 -0
  41. package/dist/components/shared/libs/slot.js +1 -1
  42. package/dist/components/shared/primitives/button.js +1 -1
  43. package/dist/components/shared/ui/accordion/accordion.js +1 -1
  44. package/dist/components/shared/ui/collapsible/collapsible.js +1 -1
  45. package/dist/components/shared/ui/dialog/dialog.js +1 -1
  46. package/dist/components/shared/ui/icon.js +1 -1
  47. package/dist/components/shared/ui/logo.js +1 -1
  48. package/dist/components/shared/ui/preference-item/preference-item.js +1 -1
  49. package/dist/components/shared/ui/switch/switch.js +1 -1
  50. package/dist/components/shared/ui/tabs/tabs.js +1 -1
  51. package/dist/consent-theme.js +1 -0
  52. package/dist/context/consent-tracking-context.js +1 -1
  53. package/dist/devtools.js +1 -1
  54. package/dist/draft.js +1 -1
  55. package/dist/external-iab-context.js +1 -1
  56. package/dist/headless.js +1 -1
  57. package/dist/hooks/use-committed-ref.js +2 -0
  58. package/dist/hooks/use-focus-trap.js +1 -1
  59. package/dist/hooks.js +1 -1
  60. package/dist/iab/styles.tw3.css +5 -45
  61. package/dist/iab-context.js +1 -1
  62. package/dist/index.js +1 -1
  63. package/dist/kernel-selector.js +1 -0
  64. package/dist/module-hooks/iframe-blocker.js +1 -1
  65. package/dist/module-hooks/network-blocker.js +1 -1
  66. package/dist/module-hooks/network-hold.js +2 -0
  67. package/dist/module-hooks/persistence.js +1 -1
  68. package/dist/panel.js +1 -1
  69. package/dist/postcss-tailwind3.js +1 -0
  70. package/dist/preferences.js +1 -2
  71. package/dist/provider.js +1 -1
  72. package/dist/server/fetch-ssr-data.js +1 -1
  73. package/dist/server/headers.js +1 -1
  74. package/dist/server/normalize-url.js +1 -1
  75. package/dist/styles.tw3.css +16 -61
  76. package/dist/transports/offline.js +1 -1
  77. package/dist/ui-save.js +1 -1
  78. package/dist/utils/deferred-module.js +1 -1
  79. package/dist/utils/merge-slot-props.js +1 -1
  80. package/dist/utils/theme-utils.js +1 -1
  81. package/dist/version.js +1 -1
  82. package/dist-types/chunk-warming.d.ts +41 -8
  83. package/dist-types/component-hooks/use-headless-consent-ui.d.ts +1 -1
  84. package/dist-types/component-hooks/use-headless-iab-consent-ui.d.ts +1 -1
  85. package/dist-types/components/iab-panel/atoms/feature-item.d.ts +28 -0
  86. package/dist-types/components/iab-panel/atoms/purpose-item.d.ts +4 -1
  87. package/dist-types/components/iab-panel/atoms/stack-item.d.ts +6 -1
  88. package/dist-types/components/iab-panel/iab-panel.d.ts +2 -2
  89. package/dist-types/components/iab-panel/index.d.ts +6 -2
  90. package/dist-types/components/iab-panel/use-iab-translations.d.ts +4 -0
  91. package/dist-types/components/iab-prompt/iab-prompt.d.ts +2 -2
  92. package/dist-types/components/iab-prompt/index.d.ts +2 -2
  93. package/dist-types/components/panel/atoms/card.d.ts +1 -0
  94. package/dist-types/components/panel/index.d.ts +1 -0
  95. package/dist-types/components/panel/panel.d.ts +1 -1
  96. package/dist-types/components/panel-trigger/atoms/trigger-icons.d.ts +20 -0
  97. package/dist-types/components/preferences/index.d.ts +1 -0
  98. package/dist-types/components/prompt/components.d.ts +6 -0
  99. package/dist-types/components/shared/libs/compose-refs.d.ts +20 -0
  100. package/dist-types/components/shared/ui/accordion/accordion.d.ts +1 -0
  101. package/dist-types/components/shared/ui/collapsible/collapsible.d.ts +1 -0
  102. package/dist-types/components/shared/ui/icon.d.ts +2 -1
  103. package/dist-types/components/shared/ui/logo.d.ts +0 -10
  104. package/dist-types/components/shared/ui/preference-item/preference-item.d.ts +14 -0
  105. package/dist-types/components/shared/ui/switch/switch.d.ts +1 -0
  106. package/dist-types/components/shared/ui/tabs/tabs.d.ts +1 -0
  107. package/dist-types/consent-theme.d.ts +38 -0
  108. package/dist-types/context/consent-tracking-context.d.ts +10 -0
  109. package/dist-types/context/theme-context.d.ts +2 -2
  110. package/dist-types/context.d.ts +6 -0
  111. package/dist-types/devtools.d.ts +13 -2
  112. package/dist-types/draft.d.ts +50 -7
  113. package/dist-types/headless.d.ts +0 -1
  114. package/dist-types/hooks/use-committed-ref.d.ts +24 -0
  115. package/dist-types/hooks/use-focus-trap.d.ts +3 -1
  116. package/dist-types/hooks.d.ts +56 -13
  117. package/dist-types/iab.d.ts +1 -1
  118. package/dist-types/index.d.ts +4 -3
  119. package/dist-types/kernel-selector.d.ts +66 -0
  120. package/dist-types/module-hooks/iframe-blocker.d.ts +27 -0
  121. package/dist-types/module-hooks/network-blocker.d.ts +23 -0
  122. package/dist-types/module-hooks/network-hold.d.ts +47 -0
  123. package/dist-types/panel.d.ts +13 -1
  124. package/dist-types/postcss-tailwind3.d.ts +21 -0
  125. package/dist-types/preferences.d.ts +12 -1
  126. package/dist-types/provider.d.ts +62 -12
  127. package/dist-types/server/headers.d.ts +14 -4
  128. package/dist-types/server/normalize-url.d.ts +14 -7
  129. package/dist-types/server/types.d.ts +12 -1
  130. package/dist-types/transports/offline.d.ts +7 -16
  131. package/dist-types/ui-config-context.d.ts +9 -1
  132. package/dist-types/ui-save.d.ts +21 -1
  133. package/dist-types/utils/deferred-module.d.ts +3 -1
  134. package/dist-types/utils/merge-slot-props.d.ts +15 -1
  135. package/dist-types/utils/theme-utils.d.ts +17 -2
  136. package/dist-types/version.d.ts +1 -1
  137. package/docs/README.md +91 -67
  138. package/docs/assets/v3/bottom-bar.png +0 -0
  139. package/docs/assets/v3/brand-card.png +0 -0
  140. package/docs/assets/v3/brand-preferences.png +0 -0
  141. package/docs/assets/v3/choice-wall.png +0 -0
  142. package/docs/assets/v3/headless-bar-html.png +0 -0
  143. package/docs/assets/v3/headless-bar-mobile.png +0 -0
  144. package/docs/assets/v3/headless-bar.png +0 -0
  145. package/docs/assets/v3/slim-bar.png +0 -0
  146. package/docs/concepts/choose-your-setup.md +87 -0
  147. package/docs/{frameworks/react/concepts → concepts}/consent-categories.md +30 -8
  148. package/docs/concepts/consent-state.md +357 -0
  149. package/docs/{guides → concepts}/data-fetching.md +31 -27
  150. package/docs/concepts/how-consent-works.md +123 -0
  151. package/docs/{frameworks/react/concepts/policy-presets.md → concepts/policies.md} +7 -59
  152. package/docs/customization/class-names.md +202 -0
  153. package/docs/customization/dark-mode.md +157 -0
  154. package/docs/customization/motion.md +119 -0
  155. package/docs/customization/overview.md +67 -33
  156. package/docs/customization/recipes.md +839 -47
  157. package/docs/customization/slots.md +216 -35
  158. package/docs/customization/stylesheets.md +147 -0
  159. package/docs/customization/tailwind.md +842 -0
  160. package/docs/customization/tokens.md +166 -36
  161. package/docs/customization/translations.md +61 -3
  162. package/docs/frameworks/react/callbacks.md +118 -0
  163. package/docs/frameworks/react/clear-on-revocation.md +106 -0
  164. package/docs/frameworks/react/components/consent-banner.md +42 -28
  165. package/docs/frameworks/react/components/consent-dialog-link.md +13 -11
  166. package/docs/frameworks/react/components/consent-dialog-trigger.md +81 -76
  167. package/docs/frameworks/react/components/consent-dialog.md +100 -55
  168. package/docs/frameworks/react/components/consent-gate.md +45 -24
  169. package/docs/frameworks/react/components/consent-provider.md +126 -0
  170. package/docs/frameworks/react/components/consent-widget.md +32 -20
  171. package/docs/frameworks/react/components/dev-tools.md +52 -84
  172. package/docs/frameworks/react/components.md +105 -0
  173. package/docs/frameworks/react/compose.md +354 -0
  174. package/docs/frameworks/react/content-security-policy.md +126 -0
  175. package/docs/frameworks/react/customize.md +250 -0
  176. package/docs/frameworks/react/embeds.md +89 -0
  177. package/docs/frameworks/react/hooks.md +65 -0
  178. package/docs/frameworks/react/iab.md +222 -0
  179. package/docs/frameworks/react/network-blocker.md +140 -0
  180. package/docs/frameworks/react/quickstart.md +139 -101
  181. package/docs/frameworks/react/rendering.md +128 -0
  182. package/docs/frameworks/react/scripts.md +115 -0
  183. package/docs/frameworks/react/translations.md +155 -0
  184. package/docs/frameworks/react/troubleshooting.md +92 -47
  185. package/docs/frameworks/react/vendor-consent.md +170 -0
  186. package/docs/guides/banner-experiments.md +654 -0
  187. package/docs/guides/troubleshooting.md +120 -47
  188. package/docs/guides/verify-consent.md +81 -49
  189. package/docs/integrations/adobe-analytics.md +168 -160
  190. package/docs/integrations/ahrefs-analytics.md +153 -155
  191. package/docs/integrations/amplitude.md +163 -157
  192. package/docs/integrations/building-integrations.md +136 -37
  193. package/docs/integrations/clearbit.md +155 -155
  194. package/docs/integrations/cloudflare-web-analytics.md +157 -157
  195. package/docs/integrations/cloudflare-zaraz.md +210 -262
  196. package/docs/integrations/crisp.md +165 -159
  197. package/docs/integrations/databuddy.md +158 -174
  198. package/docs/integrations/fathom-analytics.md +159 -157
  199. package/docs/integrations/front-chat.md +322 -0
  200. package/docs/integrations/google-maps.md +119 -84
  201. package/docs/integrations/google-tag-manager.md +179 -164
  202. package/docs/integrations/google-tag.md +164 -161
  203. package/docs/integrations/heap.md +164 -156
  204. package/docs/integrations/hightouch.md +162 -158
  205. package/docs/integrations/hotjar.md +160 -156
  206. package/docs/integrations/intercom.md +184 -154
  207. package/docs/integrations/klaviyo.md +486 -0
  208. package/docs/integrations/linkedin-insights.md +175 -151
  209. package/docs/integrations/logrocket.md +161 -157
  210. package/docs/integrations/matomo-analytics.md +189 -179
  211. package/docs/integrations/meta-pixel.md +189 -151
  212. package/docs/integrations/microsoft-clarity.md +164 -156
  213. package/docs/integrations/microsoft-uet.md +149 -155
  214. package/docs/integrations/mixpanel-analytics.md +156 -161
  215. package/docs/integrations/one-dollar-stats.md +306 -0
  216. package/docs/integrations/openai-pixel.md +205 -302
  217. package/docs/integrations/overview.md +143 -83
  218. package/docs/integrations/pinterest-tag.md +329 -0
  219. package/docs/integrations/pirsch.md +170 -160
  220. package/docs/integrations/plausible-analytics.md +173 -159
  221. package/docs/integrations/posthog.md +227 -242
  222. package/docs/integrations/promptwatch.md +155 -155
  223. package/docs/integrations/reddit-pixel.md +186 -158
  224. package/docs/integrations/rudderstack.md +202 -187
  225. package/docs/integrations/rybbit-analytics.md +172 -161
  226. package/docs/integrations/segment.md +183 -155
  227. package/docs/integrations/snapchat-pixel.md +187 -157
  228. package/docs/integrations/tiktok-pixel.md +172 -151
  229. package/docs/integrations/umami-analytics.md +164 -159
  230. package/docs/integrations/vercel-analytics.md +167 -158
  231. package/docs/integrations/x-pixel.md +177 -151
  232. package/docs/integrations/youtube.md +122 -87
  233. package/docs/upgrade-v3.md +490 -354
  234. package/package.json +15 -9
  235. package/dist/component-hooks/use-manager.js +0 -2
  236. package/dist-types/component-hooks/use-manager.d.ts +0 -45
  237. package/docs/assets/v3/brand-bar.png +0 -0
  238. package/docs/assets/v3/mobile-card.png +0 -0
  239. package/docs/assets/v3/preferences.png +0 -0
  240. package/docs/frameworks/react/components/consent-manager-provider.md +0 -75
  241. package/docs/frameworks/react/hooks/use-consent-manager/overview.md +0 -58
  242. package/docs/frameworks/react/iab/overview.md +0 -53
  243. package/docs/frameworks/react/script-loader.md +0 -63
  244. package/docs/frameworks/react/styling/overview.md +0 -217
  245. package/docs/guides/consent-state.md +0 -60
  246. package/docs/guides/deployment-modes.md +0 -75
  247. package/docs/integrations/clear-on-revocation.md +0 -167
  248. package/docs/integrations/granular-consent.md +0 -208
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as e}from"react/jsx-runtime";import{createIAB as r}from"@c15t/iab";import{useCallback as t,useContext as n,useEffect as o,useMemo as s,useRef as i,useState as l,useSyncExternalStore as c}from"react";import{KernelContext as u}from"./context.js";import{IABContext as a}from"./context/iab-context-value.js";let d=({children:c,...d})=>{let m=n(u);if(!m)throw Error("IABProvider: no kernel in context. Wrap with <ConsentProvider options={...}> first.");let[p,f]=l("purposes"),[v,b]=l(null),g=i(d),I=i(null),P=i([]);o(()=>{g.current=d},[d]),o(()=>{let e=r({...g.current,kernel:m});I.current=e,b(e);let t=P.current;for(let r of(P.current=[],t))r(e);return()=>{I.current=null,e.dispose()}},[m]);let V=t(e=>{let{current:r}=I;return r?Promise.resolve(e(r)):new Promise((r,t)=>{P.current.push(async n=>{try{await e(n),r()}catch(e){t(e)}})})},[]),h=s(()=>({customVendors:d.customVendors,filtered:!!d.vendors?.length,handle:v,run:V,setTab:f,tab:p}),[v,V,p,d.vendors?.length,d.customVendors]);return e(a.Provider,{value:h,children:c})},m=function(){let e=n(u),r=n(a);if(!e)throw Error("useIAB must be used within <ConsentProvider options={...}> from @c15t/react");let t=c(r=>e.subscribe(r),()=>e.getSnapshot().iab,()=>e.getServerSnapshot().iab);return s(()=>{if(!t)return null;let e=r?.handle,n=r?.run??(r=>e?Promise.resolve(r(e)):Promise.resolve()),o=r=>(...t)=>{e?r(e)(...t):n(e=>r(e)(...t))};return{...t,acceptAll:o(e=>e.acceptAll),config:{cmpId:t.cmpId,enabled:t.enabled},customVendors:r?.customVendors??t.customVendors,gvlReference:t.gvlReference&&r?.filtered?{...t.gvlReference,summary:void 0}:t.gvlReference,isLoadingGVL:t.enabled&&!t.gvl,nonIABVendors:r?.customVendors??t.customVendors,preferenceCenterTab:r?.tab??"purposes",rejectAll:o(e=>e.rejectAll),save:()=>e?e.save():n(e=>e.save()),setPreferenceCenterTab:r?.setTab??(()=>{}),setPurposeConsent:o(e=>e.setPurposeConsent),setPurposeLegitimateInterest:o(e=>e.setPurposeLegitimateInterest),setSpecialFeatureOptIn:o(e=>e.setSpecialFeatureOptIn),setVendorConsent:o(e=>e.setVendorConsent),setVendorLegitimateInterest:o(e=>e.setVendorLegitimateInterest)}},[t,r])};export{d as IABProvider,m as useIAB};
2
+ import{jsx as e}from"react/jsx-runtime";import{createIAB as r}from"@c15t/iab";import{useCallback as t,useContext as n,useEffect as o,useMemo as s,useRef as l,useState as c,useSyncExternalStore as i}from"react";import{KernelContext as u}from"./context.js";import{IABContext as a}from"./context/iab-context-value.js";import{useCommittedRef as d}from"./hooks/use-committed-ref.js";let m=function(e){let[r,t]=c(()=>({kernel:e}));if(r.kernel===e)return r;let n={kernel:e};return t(n),n},p=({children:i,...p})=>{let f=n(u);if(!f)throw Error("IABProvider: no kernel in context. Wrap with <ConsentProvider options={...}> first.");let[h,v]=c("purposes"),g=m(f),b=d(g),[P,I]=c(null),V=P?.selection===g?P.handle:null,A=l(p),x=l(null),k=l(new WeakSet),C=l([]),w=l(!1),S=l(!1);o(()=>{A.current=p},[p]),o(()=>(w.current=!0,S.current=!1,()=>{w.current=!1,queueMicrotask(()=>{if(!w.current)for(let e of(S.current=!0,C.current.splice(0)))e.cancel()})}),[]),o(()=>{let e=k.current;if(e.delete(g),g.kernel.getSnapshot().externalPermissions)return;let t=r({...A.current,kernel:g.kernel});x.current={handle:t,selection:g},I({handle:t,selection:g});let n=C.current;for(let e of(C.current=[],n))e.selection===g?e.run(t):e.cancel();return()=>{x.current=null,e.add(g),t.dispose()}},[g]);let B=t(e=>{let r=b.current!==g,{current:t}=x;if(!r&&t?.selection===g)return Promise.resolve(e(t.handle));let n=new Promise((t,n)=>{if(g.kernel.getSnapshot().externalPermissions)return void n(Error("Consent is managed by an external CMP. Open its preferences instead."));let o=()=>n(new DOMException("IAB provider unmounted or switched to another consent kernel.","AbortError"));r||S.current||k.current.has(g)?o():C.current.push({cancel:o,run:async r=>{try{await e(r),t()}catch(e){n(e)}},selection:g})});return n.catch(()=>{}),n},[b,g]),j=s(()=>({customVendors:p.customVendors,filtered:!!p.vendors?.length,handle:V,run:B,setTab:v,tab:h}),[V,B,h,p.vendors?.length,p.customVendors]);return e(a.Provider,{value:j,children:i})},f=function(){let e=n(u),r=n(a);if(!e)throw Error("useIAB must be used within <ConsentProvider options={...}> from @c15t/react");let t=i(r=>e.subscribe(r),()=>e.getSnapshot().iab,()=>e.getServerSnapshot().iab);return s(()=>{if(!t)return null;let e=r?.handle,n=r?.run??(r=>e?Promise.resolve(r(e)):Promise.resolve()),o=e=>(...r)=>{n(t=>e(t)(...r))};return{...t,acceptAll:o(e=>e.acceptAll),config:{cmpId:t.cmpId,enabled:t.enabled},customVendors:r?.customVendors??t.customVendors,gvlReference:t.gvlReference&&r?.filtered?{...t.gvlReference,summary:void 0}:t.gvlReference,isLoadingGVL:t.enabled&&!t.gvl,nonIABVendors:r?.customVendors??t.customVendors,preferenceCenterTab:r?.tab??"purposes",rejectAll:o(e=>e.rejectAll),save:()=>n(e=>e.save()),setPreferenceCenterTab:r?.setTab??(()=>{}),setPurposeConsent:o(e=>e.setPurposeConsent),setPurposeLegitimateInterest:o(e=>e.setPurposeLegitimateInterest),setSpecialFeatureOptIn:o(e=>e.setSpecialFeatureOptIn),setVendorConsent:o(e=>e.setVendorConsent),setVendorLegitimateInterest:o(e=>e.setVendorLegitimateInterest)}},[t,r])};export{p as IABProvider,f as useIAB};
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{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";
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{useTranslations}from"./component-hooks/use-translations.js";export{useActiveUI,useBranding,useConsent,useConsents,useDeclaredVendors,useDismissNotice,useEffectivePermissions,useExperiment,useExplicitChoice,useHasConsentPolicy,useHasConsentPreferences,useHasConsentUI,useIABEnabled,useIABSnapshot,useIdentify,useInit,useLocation,useModel,useNoticeDismissal,useOverrides,usePolicyCategories,usePolicyResolution,usePolicyRule,usePolicyScopeMode,usePreferencesPresentation,usePrivacySignals,usePromptPresentation,usePromptRequirement,usePurposeConsent,useRegisterConsentCategories,useResolvedPresentation,useResolvedTheme,useRestrictions,useSaveConsents,useSetActiveUI,useSetLanguage,useSetOverrides,useSnapshot,useSpecialFeatureOptIn,useSubscribeToConsentChanges,useTCString,useUser,useVendorAllowed,useVendorChoice,useVendorConsent}from"./hooks.js";export{useIframeBlocker,useNetworkBlocker,usePersistence,useScriptLoader}from"./module-hooks.js";export{ConsentProvider}from"./provider.js";export{ConsentTheme}from"./consent-theme.js";export{defineTheme}from"./types/theme/index.js";
@@ -0,0 +1 @@
1
+ import{evaluateConsent as e}from"@c15t/core";import{useContext as t,useMemo as r,useSyncExternalStore as o}from"react";import{KernelContext as n}from"./context.js";import{defaultTranslationConfig as s}from"./utils/default-translation-config.js";let a=function(){let e=t(n);if(!e)throw Error("c15t: no kernel in context. Wrap your app with <ConsentProvider options={...}> from @c15t/react.");return e},l=function(e){let t=a();return o(e=>t.subscribe(e),()=>e(t.getSnapshot()),()=>e(t.getServerSnapshot()))},u=function(e){let t=a();return o(e=>t.subscribe(e),()=>e(t.getSnapshot(),Date.now()),()=>{let r=t.getServerSnapshot();return e(r,r.evaluatedAt)})},c=function(t){return u((r,o)=>e({category:t},r,o))},i=function(){return l(e=>e.translations?.language??s.defaultLanguage)},p=function(){let e=l(e=>e.evaluationPolicy.choiceScope??e.policyRule.scope);return r(()=>["necessary",...e],[e])};export{c as useCategoryAllowed,p as useDisplayedCategories,u as useGateSelector,a as useKernel,l as useKernelSelector,i as useTranslationLanguage};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{useEffect as e,useRef as r,useState as t}from"react";import{useRequiredKernel as l}from"./shared.js";let o=function(o={}){let c=l(),s=r(null),[i,a]=t(()=>({dispose(){s.current?.dispose(),s.current=null},processAllIframes(){s.current?.processAllIframes()}}));return e(()=>{let e=!1;return(async()=>{let{createIframeBlocker:r}=await import("@c15t/core/modules/iframe-blocker");e||(s.current=r({disableAutomaticBlocking:o.disableAutomaticBlocking,kernel:c}))})(),()=>{e=!0,s.current?.dispose(),s.current=null}},[c,o.disableAutomaticBlocking]),i};export{o as useIframeBlocker};
2
+ import{allConsentNames as e,getEffectiveGateState as t,has as r,isVendorDenied as a}from"@c15t/core";import{useEffect as o,useRef as c,useState as n}from"react";import{useRequiredKernel as u}from"./shared.js";let i=()=>import("@c15t/core/modules/iframe-blocker"),l=function(e={}){let t=u(),r=c(null),[a,l]=n(()=>({dispose(){r.current?.dispose(),r.current=null},processAllIframes(){r.current?.processAllIframes()}}));return o(()=>{let a=!1;return(async()=>{let{createIframeBlocker:o}=await i();a||(r.current=o({disableAutomaticBlocking:e.disableAutomaticBlocking,kernel:t}))})(),()=>{a=!0,r.current?.dispose(),r.current=null}},[t,e.disableAutomaticBlocking]),a},d="iframe[data-category], iframe[data-vendor]",s=function(e){try{return 1===e.nodeType&&"IFRAME"===e.tagName.toUpperCase()}catch{return!1}},f=function(o,c){let n=c.getSnapshot(),u=o.getAttribute("data-category");if(null!==u){if(!e.includes(u))return!1;let{effectivePermissions:a}=t(n);if(!r(u,a))return!1}let i=o.getAttribute("data-vendor");return!i||"iab"===n.model||!(n.vendorChoice?.denied.includes(i)&&(!n.vendors?.declared.some(e=>e.id===i)||a(n,i)))},m=function(e,t){let r=e.getAttribute("src");!(r&&e.matches(d))||f(e,t)||(e.hasAttribute("data-src")||e.setAttribute("data-src",r),e.removeAttribute("src"),e.setAttribute("data-c15t-paused",""))},b=function(e){try{return e.matches(d)}catch{return!1}},y=function(e){let t=new Set;for(let r of e)for(let e of("attributes"===r.type&&s(r.target)&&t.add(r.target),Array.from(r.addedNodes))){if(s(e)){t.add(e);continue}try{if(1===e.nodeType)for(let r of Array.from(e.querySelectorAll("iframe")))t.add(r)}catch{}}return[...t].filter(b)},p=function(e,t){if("u"<typeof document||!document.body)return t(),()=>{};document.querySelector(d)&&t();let r=new MutationObserver(r=>{let a=y(r);if(0!==a.length){for(let t of a)try{m(t,e)}catch{}t()}});return r.observe(document.body,{attributeFilter:["data-category","data-vendor","src"],attributes:!0,childList:!0,subtree:!0}),()=>r.disconnect()},A=function(e={}){let t=u(),{disableAutomaticBlocking:r}=e;o(()=>{let e=!1,a=null,o=!1,c=()=>{},n=()=>{o||(o=!0,(async()=>{let n;try{n=await i()}catch{o=!1;return}e||(c(),a=n.createIframeBlocker({disableAutomaticBlocking:r,kernel:t}))})())};return r?n():c=p(t,n),()=>{e=!0,c(),a?.dispose(),a=null}},[t,r])};export{l as useIframeBlocker,A as useIframeBlockerOnDemand,p as watchGatedIframes};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{useEffect as e,useRef as r,useState as t}from"react";import{useRequiredKernel as l}from"./shared.js";let u=function(u){let n=l(),s=r(null),o=r(u.rules),c=r(u.enabled),[d,a]=t(()=>({dispose(){s.current?.dispose(),s.current=null},setEnabled(e){c.current=e,s.current?.setEnabled(e)},updateRules(e){o.current=e,s.current?.updateRules(e)}}));e(()=>{o.current=u.rules,c.current=u.enabled},[u.enabled,u.rules]);let k=r(!0);return e(()=>{if(k.current){k.current=!1;return}d.updateRules(u.rules)},[d,u.rules]),e(()=>{void 0!==u.enabled&&d.setEnabled(u.enabled)},[d,u.enabled]),e(()=>{let e=!1;return(async()=>{let{createNetworkBlocker:r}=await import("@c15t/core/modules/network-blocker");e||(s.current=r({enabled:c.current,kernel:n,logBlockedRequests:u.logBlockedRequests,onRequestBlocked:u.onRequestBlocked,rules:o.current}))})(),()=>{e=!0,s.current?.dispose(),s.current=null}},[n,u.logBlockedRequests,u.onRequestBlocked]),d};export{u as useNetworkBlocker};
2
+ import{useEffect as e,useRef as r,useState as t}from"react";import{useEarlyNetworkHold as l}from"./network-hold.js";import{useRequiredKernel as u}from"./shared.js";let n=function(n){let o=u(),s=l(n.rules,n.enabled),c=r(null),d=r(n.rules),a=r(n.enabled),[k,b]=t(()=>({dispose(){c.current?.dispose(),c.current=null},setEnabled(e){a.current=e,c.current?.setEnabled(e)},updateRules(e){d.current=e,c.current?.updateRules(e)}}));e(()=>{d.current=n.rules,a.current=n.enabled},[n.enabled,n.rules]);let i=r(!0);return e(()=>{if(i.current){i.current=!1;return}k.updateRules(n.rules)},[k,n.rules]),e(()=>{void 0!==n.enabled&&k.setEnabled(n.enabled)},[k,n.enabled]),e(()=>{let e=!1,r=s.claim(d.current,a.current);return(async()=>{let{createNetworkBlocker:t}=await import("@c15t/core/modules/network-blocker");e||(c.current=t({enabled:a.current,hold:r,kernel:o,logBlockedRequests:n.logBlockedRequests,onRequestBlocked:n.onRequestBlocked,rules:d.current}))})(),()=>{e=!0,c.current?.dispose(),c.current=null,s.unmount()}},[s,o,n.logBlockedRequests,n.onRequestBlocked]),k};export{n as useNetworkBlocker};
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{NOT_HELD as e,holdNetworkRequests as t}from"@c15t/core/modules/network-hold";import{useState as o}from"react";let r=1e4,l=new Set,u=function(o,u){let i,n,c=0,d={claim(o,r){for(let e of(l.delete(d),clearTimeout(n),c+=1,!1===r||i?.held||(i=t(o)),l))e.key===d.key&&e.expire();return i??e},expire(){l.delete(d),clearTimeout(n),i?.block()},key:"",unmount(){let e=c,t=i;queueMicrotask(()=>{c===e&&t?.block()})}};return"u">typeof window&&!1!==u&&(i=t(o),d.key=JSON.stringify(o),l.add(d),n=setTimeout(()=>d.expire(),r)),d},i=function(e,t){let[r]=o(()=>u(e,t));return r};export{r as UNCOMMITTED_HOLD_MS,i as useEarlyNetworkHold};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{createPersistence as e}from"@c15t/core/modules/persistence";import{useEffect as r,useRef as t,useState as n}from"react";import{useRequiredKernel as s}from"./shared.js";let o=function(o={}){let i=s(),c=t(null),[u,a]=n(()=>({clear:()=>c.current?.clear(),dispose:()=>{c.current?.dispose(),c.current=null},hydrate:()=>c.current?.hydrate()??!1}));return r(()=>{let r=e({kernel:i,now:o.now,skipHydration:o.skipHydration,storageConfig:o.storageConfig});return c.current=r,()=>{r.dispose(),c.current=null}},[i,o.now,o.skipHydration,o.storageConfig]),u};export{o as usePersistence};
2
+ import{createPersistence as e}from"@c15t/core/modules/persistence";import{useEffect as r,useRef as n,useState as t}from"react";import{useRequiredKernel as s}from"./shared.js";let o=function(o={}){let c=s(),i=n(null),[u,l]=t(()=>({clear:()=>i.current?.clear(),dispose:()=>{i.current?.dispose(),i.current=null},hydrate:()=>i.current?.hydrate()??!1,reconcile:()=>i.current?.reconcile()??!1}));return r(()=>{let r=e({kernel:c,now:o.now,skipHydration:o.skipHydration,storageConfig:o.storageConfig,sync:o.sync});return i.current=r,()=>{r.dispose(),i.current=null}},[c,o.now,o.skipHydration,o.storageConfig,o.sync]),u};export{o as usePersistence};
package/dist/panel.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- export*from"./components/panel/index.js";
2
+ export{ConsentDialog}from"./aggregate-components.js";
@@ -0,0 +1 @@
1
+ export*from"@c15t/ui/postcss-tailwind3";export{default}from"@c15t/ui/postcss-tailwind3";
@@ -1,2 +1 @@
1
- "use client";
2
- export*from"./components/preferences/index.js";
1
+ export{ConsentWidget}from"./aggregate-components.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,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};
2
+ import{Fragment as e,jsx as r,jsxs as n}from"react/jsx-runtime";import{applyExperimentAssignment as t,applyExperimentTheme as o,createConsentKernel as i,declareOwnedVendors as s,disabledPolicyResolution as l,extractConsentNamesFromCondition as c,forgetOwnedVendors as a,hostExperiment as u,kernelConfigToInitResponse as d,resolveLocalTranslations as p,resolveVendors as m,seedExperiment as g,startExperiment as f,watchRevocationReload as v}from"@c15t/core";import{createWindowDebug as h,resolveWindowDebugMode as y}from"@c15t/core/modules/window-debug";import{connectConsentSource as k}from"@c15t/core/runtime/controls";import{deepMergeTranslations as S}from"@c15t/translations";import{applyThemeSlots as C}from"@c15t/ui/utils";import{useContext as b,useEffect as w,useMemo as x,useRef as R,useState as P,useSyncExternalStore as O}from"react";import{KernelContext as E,ProviderServicesContext as N}from"./context.js";import{ExternalIABProvider as B}from"./external-iab-context.js";import{useColorScheme as D}from"./hooks/use-color-scheme.js";import{useIframeBlockerOnDemand as j}from"./module-hooks/iframe-blocker.js";import{useEarlyNetworkHold as L}from"./module-hooks/network-hold.js";import{usePersistence as V}from"./module-hooks/persistence.js";import{V3ThemeProvider as T}from"./theme-provider.js";import{defaultTranslationConfig as _}from"./utils/default-translation-config.js";let M={language:"en",translations:_.translations.en},q=function(e){if(e)return"externalId"in e?e:{externalId:e.id,identityProvider:e.identityProvider}},A=function(e){if(!e?.messages)return;let r=e.locale??_.defaultLanguage??"en",n=_.translations.en,t=e.messages[r]??e.messages.en??n,o=_.translations[r]??n;return{language:r,translations:S(o,t)}},J=function(e){return e.enabled??!0},K=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)??{}}}},F=function(e){return"function"==typeof e?.then},I=function(e){let{prefetch:r}=e;return!r||F(r)?{}:r},H=function(e){let{prefetch:r}=e;return u(e.experiment,F(r)?void 0:r)},U=function(){"production"!==globalThis.process?.env?.NODE_ENV&&console.warn("c15t ConsentProvider: the streamed consent state carries an experiment, but the provider mounted before it arrived and runs none. Await resolveConsent(), or also pass `experiment` to the provider options.")},G=function(e){return void 0!==e&&Object.keys(e).length>0},W=function(e){"production"!==globalThis.process?.env?.NODE_ENV&&console.warn("c15t ConsentProvider: prefetch rejected; using transport init.",e)},z=function(e,r,n,t){let o={...r.initialOverrides??{},...n??{}};G(o)&&e.set.overrides(o),r.initialRecords&&e.getRecordsGeneration()===t&&e.hydrate(r.initialRecords)},Q=function(e,r,n,t){var o,i,s;let{prefetch:l}=r;return F(l)?K(e,(o=Promise.resolve(l),i=r.overrides,s=void 0!==r.experiment,async e=>{let r,l=n()?.getRecordsGeneration();try{r=await o??{}}catch(e){return W(e),{}}r.experiment&&!s&&U(),t(r);let c=d(r);if(c){let e={...c.resolvedOverrides??{},...i??{}};return G(e)&&(c.resolvedOverrides=e),{response:c}}let a=n();return a&&z(a,r,i,l),{context:{overrides:{...e.overrides,...r.initialOverrides??{},...i??{}},user:e.user}}})):e},X=function(e){if("function"!=typeof e.mode)throw Error("c15t ConsentProvider: set mode to hosted(), offline(), or custom().");return e.mode},Y=function(e){"production"!==globalThis.process?.env?.NODE_ENV&&console.warn(e)},Z=function(e,r,n){let t=m({config:e.vendors,existing:n.initialVendors?.declared,onWarn:Y,owners:r}),o=n.initialVendors?.listVersion??null;return t.length>0||null!==o?{declared:t,listVersion:o}:void 0},$=function(e){let r=J(e),n=I(e),t=A(e.i18n)??M,o=n,s={consentCategories:e.consentCategories,get prefetch(){return o},translations:t,translationsFor:r=>p(r,e.i18n?.messages)},a=X(e)(s),u={current:null},d=Q(a,e,()=>u.current,e=>{o=e}),m=[...e.scripts??[],...e.networkBlocker?e.networkBlocker.rules??[]:[]],f=Z(e,m,n),v=r?g(H(e),n.initialExperiment,!!n.initialPolicyResolution&&!n.initialPolicyPending):{},h=i({...n,consentCategories:e.consentCategories,inferredConsentCategories:[...m.flatMap(e=>c(e.category)),...(f?.declared??[]).flatMap(e=>c(e.category))],initialExperiment:v.initialExperiment,initialExperimentPending:v.initialExperimentPending,initialVendors:f,initialExternalPermissions:r&&e.consentSource?{}:void 0,initialRecords:r&&!e.consentSource?n.initialRecords:void 0,initialPrivacySignals:r?n.initialPrivacySignals:void 0,now:n.now??n.initialRecords?.now??(n.initialRecords?void 0:0),transport:d,initialPolicyResolution:r?n.initialPolicyResolution:l(),initialOverrides:{...n.initialOverrides??{},...e.overrides??{}},initialUser:q(e.user)??n.initialUser,initialTranslations:n.initialTranslations??t,translationOverrides:e.i18n?.messages,initialPolicyPending:!e.consentSource&&(n.initialPolicyPending??(r&&!n.initialPolicyResolution))});return u.current=h,h},ee=function(e){if(e instanceof Error)return e.message;if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}},er=function(e,r,n){let t=R(r),o=R(n);w(()=>{t.current=r,o.current=n},[r,n]),w(()=>v({getOnBeforeReload:()=>t.current?.onBeforeConsentRevocationReload,isEnabled:()=>!1!==o.current,kernel:e}),[e]),w(()=>{let r=[e.events.on("init:applied",({snapshot:r})=>{let n=r.vendors?.declared??[];n.length>0&&e.set.registerConsentCategories(n.flatMap(e=>c(e.category)))}),e.events.on("choice:recorded",({type:e,...r})=>{t.current?.onChoiceRecorded?.(r)}),e.events.on("permissions:changed",({snapshot:e,previous:r})=>{t.current?.onPermissionsChanged?.({previous:r,snapshot:e})}),e.events.on("surface:shown",({type:e,...r})=>{t.current?.onSurfaceShown?.(r)}),e.events.on("command:error",e=>{t.current?.onError?.({error:ee(e.error)})})];return()=>{for(let e of r)e()}},[e])},en=function(e,r,n,t){let o=R(n),i=R(null),l=R(null),u=R(null);w(()=>{if(!t)return;let n=q(r.user),o=JSON.stringify(n??null);if(null===i.current){i.current=o;return}i.current!==o&&(i.current=o,n&&(async()=>{try{await e.commands.identify(n)}catch{}})())},[e,r.user,t]),w(()=>{if(!t)return;let o=JSON.stringify(r.overrides??{});if(null===l.current){l.current=o;return}l.current!==o&&(l.current=o,e.set.overrides(r.overrides??{}),n&&e.commands.init())},[n,e,r.overrides,t]),w(()=>{!t||o.current===n||(o.current=n,n||e.set.activeUI("none"))},[n,e,t]);let d=R(null),p=R(Symbol("consent-provider"));w(()=>{if(!t)return;let n=[...r.scripts??[],...r.networkBlocker?r.networkBlocker.rules??[]:[]],o=JSON.stringify([r.vendors??[],n.map(e=>[e.vendor??null,e.category])]);if(null===d.current){d.current=o,s(e,n,p.current);return}if(d.current===o)return;d.current=o;let i=e.getSnapshot().vendors?.declared??[],l=m({config:r.vendors,existing:i.flatMap(e=>{let r="manifest"===e.source?e:e.shadowed;if(r?.source!=="manifest")return[];let{ownerCategory:n,...t}=r;return[t]}),onWarn:Y});e.set.vendors({declared:l},{replaceSource:"config"}),s(e,n,p.current);let a=[...l.flatMap(e=>c(e.category)),...n.flatMap(e=>c(e.category))];a.length>0&&e.set.registerConsentCategories(a)},[e,r.networkBlocker,r.scripts,r.vendors,t]),w(()=>()=>{a(e,p.current),d.current=null},[e]),w(()=>{if("production"===globalThis.process?.env?.NODE_ENV)return;let e=JSON.stringify({experiment:H(r),i18n:r.i18n,mode:r.mode?.kind});if(null===u.current){u.current=e;return}u.current!==e&&(u.current=e,console.warn("c15t ConsentProvider: remount to change mode, i18n or experiment."))},[r])},et=({kernel:e,callbacks:r,reloadOnConsentRevoked:n})=>(er(e,r,n),null),eo=({enabled:e,kernel:r,prepared:n})=>{let t=R(!1),o=R(!1);return w(()=>{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,r.markLive();let{gpc:e}=r.getSnapshot().privacySignals;e.detected&&e.active&&r.set.privacySignals({gpc:!0})}else r.commands.init()},[e,r,n]),null},ei=[],es=({clearOnRevocation:e,storageConfig:r,nonce:n,options:t,scripts:o=ei})=>{let i=b(E),s=R(null),l=R(null),c=R(null),a=R({config:e,storageConfig:r}),[u,d]=P(o.length>0),p=R(o),m=R(t),g=R(n);o.length>0&&!u&&d(!0),w(()=>{a.current={config:e,storageConfig:r},p.current=o,m.current=t,g.current=n},[e,r,n,t,o]),w(()=>{if(!i)return;let e=!1;return(async()=>{if(u){let{createScriptLoader:r}=await import("@c15t/core/modules/script-loader");if(e)return;s.current=r({kernel:i,nonce:g.current,onDebug:m.current?.onDebug,scripts:p.current})}let{config:r}=a.current;if(r){let{createClearOnRevocation:n}=await import("@c15t/core/modules/clear-on-revocation");if(e)return;c.current={config:r,create:n},l.current=n({config:r,kernel:i,storageConfig:a.current.storageConfig})}})(),()=>{e=!0,l.current?.dispose(),l.current=null,c.current=null,s.current?.dispose(),s.current=null}},[i,u]);let f=r?.storageKey;return w(()=>{let e=c.current;i&&e&&(l.current?.dispose(),l.current=e.create({config:e.config,kernel:i,storageConfig:{storageKey:f}}))},[i,f]),w(()=>{s.current?.updateScripts(o)},[o]),null},el=({options:e})=>(j(e),null),ec=({options:e})=>{let r=b(E),n=R(null),t=R(e),o=L(e.rules,e.enabled);return w(()=>{t.current=e},[e]),w(()=>{if(!r)return;let e=!1,i=o.claim(t.current.rules,t.current.enabled);return(async()=>{let{createNetworkBlocker:o}=await import("@c15t/core/modules/network-blocker");if(e)return;let s=t.current;n.current=o({enabled:s.enabled,hold:i,kernel:r,logBlockedRequests:s.logBlockedRequests,onRequestBlocked:s.onRequestBlocked,rules:s.rules})})(),()=>{e=!0,n.current?.dispose(),n.current=null,o.unmount()}},[o,r]),w(()=>{n.current?.updateRules(e.rules)},[e.rules]),w(()=>{void 0!==e.enabled&&n.current?.setEnabled(e.enabled)},[e.enabled]),null},ea=({options:e,clearRef:r})=>{let n=V(e);return w(()=>(r.current=n.clear,()=>{r.current=null}),[n,r]),null},eu=({experiment:e,kernel:r,options:n})=>(w(()=>f({...n,experiment:e,kernel:r}),[e,r,n]),null),ed=({pkg:e,mode:r})=>(w(()=>{let n=h({mode:r,pkg:e});return()=>n.dispose()},[r,e]),null),ep=function(e){if(!1===e.persistence)return!1;let{storageConfig:r}=e,n=!!I(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}},em=function(e,r,n){let t=e.external?r??e.external:void 0,o=t?.kernel??e.kernel;return{active:o,external:t,rendered:n?o:e.disabledKernel??o}},eg=i=>{let{children:s}=i,l=i.options??{},c=J(l),[a,u]=P(()=>({clearOnRevocation:l.clearOnRevocation,consentSource:l.consentSource,disabledKernel:i.runtime?void 0:$({...l,enabled:!1}),experiment:H(l),experimentOptions:{presentation:l.presentation,storageConfig:l.storageConfig,theme:l.theme},external:i.runtime,kernel:i.runtime?.kernel??$({...l,enabled:!0})})),{clearOnRevocation:d,experiment:p}=a,{active:m,external:g,rendered:f}=em(a,i.runtime,c),v=void 0===g;w(()=>{(v||void 0!==l.consentCategories)&&f.set.consentCategories(l.consentCategories)},[f,v,l.consentCategories]);let h=R(null),S=function({clearRef:e,consentSource:r,enabled:n,experiment:o,externalRuntime:i,kernel:s,presentation:l}){return x(()=>({clearRecords:()=>{i?i.clearRecords():e.current?e.current():(s.hydrate({choice:null,noticeDismissal:null,subject:null,vendorChoice:null}),s.events.emit({type:"records:cleared"}))},getConsentCategories:()=>{let e=s.getSnapshot();return["necessary",...e.evaluationPolicy.choiceScope??e.policyRule.scope]},getPresentation:()=>t(l,o,s.getSnapshot().experiment),setLanguage:e=>{if(e!==s.getSnapshot().overrides.language){if(s.set.language(e),i)return void i.reinit();n&&!r&&s.commands.init()}}}),[e,s,l,o,i,n,r])}({clearRef:h,consentSource:a.consentSource,enabled:c,experiment:p,externalRuntime:g,kernel:f,presentation:l.presentation}),b=a.consentSource?void 0:ep(l),{scripts:j,networkBlocker:L}=l;w(()=>{if(v&&a.consentSource&&c)return k(f,a.consentSource)},[c,f,a,v]);let V=l.__debugPkg??"@c15t/react",_=v?y(l.mode):"hosted";en(m,l,c,v);let M=R(0);w(()=>{if(!v)return;M.current+=1;let e=M.current;return()=>{queueMicrotask(()=>{M.current===e&&(a.kernel.dispose(),a.disabledKernel?.dispose())})}},[a,v]);let q=!v&&void 0!==l.callbacks;w(()=>{"production"!==process.env.NODE_ENV&&q&&console.warn("c15t ConsentProvider: `options.callbacks` is ignored when you pass `runtime`. Pass them to createConsentRuntime({ callbacks }) instead.")},[q]);let A=O(e=>f.subscribe(e),()=>f.getSnapshot().experiment,()=>f.getServerSnapshot().experiment),K=x(()=>o(l.theme,p,A),[l.theme,p,A]);w(()=>{"production"===process.env.NODE_ENV||!K||!["colors","dark","motion","radius","shadows","spacing","typography"].some(e=>e in K)||document.getElementById("c15t-theme")||console.warn("c15t: `theme` tokens are no longer turned into CSS in the browser. Render <ConsentTheme theme={theme} /> on the server, or put the CSS from generateThemeCSS() in your stylesheet. See https://c15t.com/docs/frameworks/react/customize")},[K]);let F=x(()=>({colorScheme:l.colorScheme,disableAnimation:l.disableAnimation,noStyle:l.noStyle,scrollLock:l.scrollLock,theme:K,trapFocus:l.trapFocus}),[K,l.noStyle,l.disableAnimation,l.scrollLock,l.trapFocus,l.colorScheme]),U=x(()=>({components:C(K?.slots,l.components,"className"),experiment:p,legalLinks:l.legalLinks,preloadDialog:l.preloadDialog,presentation:l.presentation,theme:l.theme}),[K?.slots,l.components,p,l.legalLinks,l.preloadDialog,l.presentation,l.theme]);D(l.colorScheme);let G=n(e,{children:[v?n(e,{children:[r(et,{kernel:f,callbacks:l.callbacks,reloadOnConsentRevoked:l.reloadOnConsentRevoked}),r(ed,{pkg:V,mode:_}),c&&b?r(ea,{options:b,clearRef:h}):null,c&&p&&!g&&!a.consentSource?r(eu,{experiment:p,kernel:f,options:a.experimentOptions}):null,r(eo,{enabled:c&&!a.consentSource,prepared:!!I(l).initialPolicyResolution,kernel:f}),j&&j.length>0||c&&d?r(es,{clearOnRevocation:c?d:void 0,storageConfig:b?b.storageConfig:l.storageConfig,nonce:l.nonce,options:l.scriptLoader,scripts:j}):null,c&&!1!==l.iframeBlocker?r(el,{options:l.iframeBlocker}):null,c&&L?r(ec,{options:L}):null]}):null,g?r(B,{runtime:g,children:s}):s]});return r(E.Provider,{value:f,children:r(N.Provider,{value:S,children:r(T,{themeConfig:F,uiConfig:U,children:G})})})};export{eg as ConsentProvider};
@@ -1 +1 @@
1
- import{C15T_VERSION_HEADER as e}from"@c15t/core";import{version as t}from"../version.js";import{extractRelevantHeaders as r}from"./headers.js";import{normalizeBackendURL as o}from"./normalize-url.js";let c=function(){return"u">typeof performance&&"function"==typeof performance.now?performance.now():Date.now()},n=function(e){let t=null,r=!1;for(let o of["x-vercel-cache","cf-cache-status","x-cache","cache-status"]){let c=e.get(o);if(c){t=`${o}=${c}`,r=/\b(?:hit|stale|revalidated|updating)\b/iu.test(c);break}}let o=e.get("age"),c=o?Number.parseInt(o,10):NaN,n=Number.isFinite(c)&&c>0,a=n?`age=${c}`:null;return{detail:t&&a?`${t}, ${a}`:t??a,isHit:r||n}},a=function(e,t){if(!t)return;let r=Object.keys(e);console.log(`[c15t/server] Detected headers: [${r.join(", ")}]`);let o=e["cf-ipcountry"],c=e["x-vercel-ip-country"];o?console.log(`[c15t/server] Country from cf-ipcountry: ${o}`):c&&console.log(`[c15t/server] Country from x-vercel-ip-country: ${c}`)},s=async function(e,t,r,o){let a=c();try{let s=await fetch(`${e}/init`,{cache:"no-store",headers:t,method:"GET"}),l=Math.max(0,Math.round(c()-a)),i=n(s.headers),u={cache:i,requestContext:r,requestDurationMs:l};if(s.ok){let e={init:await s.json(),metadata:u};return o&&(console.log(`[c15t/server] SSR fetch succeeded in ${e.metadata?.requestDurationMs??0}ms`),e.metadata?.cache?.detail&&console.log(`[c15t/server] SSR cache status: ${e.metadata.cache.detail}`)),e}return o&&(console.log(`[c15t/server] SSR fetch failed with status: ${s.status}`),i.detail&&console.log(`[c15t/server] SSR cache status: ${i.detail}`)),{metadata:u}}catch(e){if(o){let t=e instanceof Error?e.message:"Unknown error";console.log(`[c15t/server] SSR fetch error: ${t}`)}return{}}},l=async function(c){var n;let{backendURL:l,headers:i,overrides:u,debug:g}=c;g&&console.log("[c15t/server] SSR fetch starting...");let f=r(i);if(a(f,g),0===Object.keys(f).length){g&&console.log("[c15t/server] No relevant headers found, skipping SSR fetch");return}let d=o(l,i);if(!d){g&&console.log("[c15t/server] Failed to normalize URL, skipping SSR fetch");return}g&&console.log(`[c15t/server] Fetching from: ${d}/init`);let h={[e]:t,...f};u?.country&&(h["x-c15t-country"]=u.country,g&&console.log(`[c15t/server] Country override: ${u.country}`)),u?.region&&(h["x-c15t-region"]=u.region,g&&console.log(`[c15t/server] Region override: ${u.region}`)),u?.language&&(h["accept-language"]=u.language,g&&console.log(`[c15t/server] Language override: ${u.language}`));let v=await s(d,h,{backendURL:(n={backendURL:d,headers:h,overrides:u}).backendURL,country:n.overrides?.country??n.headers["x-c15t-country"]??null,gpc:"1"===n.headers["sec-gpc"],language:n.overrides?.language??n.headers["accept-language"]??null,region:n.overrides?.region??n.headers["x-c15t-region"]??null},g),{init:m}=v;if(!m){g&&console.log("[c15t/server] SSR fetch returned no data");return}return{gvl:m.gvl,init:m,metadata:v.metadata}};export{l as fetchSSRData};
1
+ import{C15T_VERSION_HEADER as e}from"@c15t/core";import{version as r}from"../version.js";import{CLIENT_FORWARDING_HEADERS as t,extractRelevantHeaders as o}from"./headers.js";import{normalizeBackendURL as a}from"./normalize-url.js";let c=function(){return"u">typeof performance&&"function"==typeof performance.now?performance.now():Date.now()},n=function(e){let r=null,t=!1;for(let o of["x-vercel-cache","cf-cache-status","x-cache","cache-status"]){let a=e.get(o);if(a){r=`${o}=${a}`,t=/\b(?:hit|stale|revalidated|updating)\b/iu.test(a);break}}let o=e.get("age"),a=o?Number.parseInt(o,10):NaN,c=Number.isFinite(a)&&a>0,n=c?`age=${a}`:null;return{detail:r&&n?`${r}, ${n}`:r??n,isHit:t||c}},s=function(e,r){if(!r)return;let t=Object.keys(e);console.log(`[c15t/server] Detected headers: [${t.join(", ")}]`);let o=e["cf-ipcountry"],a=e["x-vercel-ip-country"];o?console.log(`[c15t/server] Country from cf-ipcountry: ${o}`):a&&console.log(`[c15t/server] Country from x-vercel-ip-country: ${a}`)},l=async function(e,r,t,o){let a=c();try{let s=await fetch(`${e}/init`,{cache:"no-store",headers:r,method:"GET"}),l=Math.max(0,Math.round(c()-a)),i=n(s.headers),u={cache:i,requestContext:t,requestDurationMs:l};if(s.ok){let e={init:await s.json(),metadata:u};return o&&(console.log(`[c15t/server] SSR fetch succeeded in ${e.metadata?.requestDurationMs??0}ms`),e.metadata?.cache?.detail&&console.log(`[c15t/server] SSR cache status: ${e.metadata.cache.detail}`)),e}return o&&(console.log(`[c15t/server] SSR fetch failed with status: ${s.status}`),i.detail&&console.log(`[c15t/server] SSR cache status: ${i.detail}`)),{metadata:u}}catch(e){if(o){let r=e instanceof Error?e.message:"Unknown error";console.log(`[c15t/server] SSR fetch error: ${r}`)}return{}}},i=async function(c){var n;let{backendURL:i,headers:u,overrides:d,debug:g}=c;g&&console.log("[c15t/server] SSR fetch starting...");let f=o(u,{trustForwardedHeaders:c.trustForwardedHeaders});if(s(f,g),!(Object.keys(f).length>0||t.some(e=>u.has(e)))){g&&console.log("[c15t/server] No relevant headers found, skipping SSR fetch");return}let h=a(i,u,{trustForwardedHeaders:c.trustForwardedHeaders});if(!h){g&&console.log("[c15t/server] Failed to normalize URL, skipping SSR fetch");return}g&&console.log(`[c15t/server] Fetching from: ${h}/init`);let v={[e]:r,...f};d?.country&&(v["x-c15t-country"]=d.country,g&&console.log(`[c15t/server] Country override: ${d.country}`)),d?.region&&(v["x-c15t-region"]=d.region,g&&console.log(`[c15t/server] Region override: ${d.region}`)),d?.language&&(v["accept-language"]=d.language,g&&console.log(`[c15t/server] Language override: ${d.language}`));let m=await l(h,v,{backendURL:(n={backendURL:h,headers:v,overrides:d}).backendURL,country:n.overrides?.country??n.headers["x-c15t-country"]??null,gpc:"1"===n.headers["sec-gpc"],language:n.overrides?.language??n.headers["accept-language"]??null,region:n.overrides?.region??n.headers["x-c15t-region"]??null},g),{init:p}=m;if(!p){g&&console.log("[c15t/server] SSR fetch returned no data");return}return{gvl:p.gvl,init:p,metadata:m.metadata}};export{i as fetchSSRData};
@@ -1 +1 @@
1
- import{CONSENT_REQUEST_HEADER_NAMES as e,extractConsentRequestInputs as r}from"@c15t/schema/types";let t=[...e,"x-c15t-version","user-agent","x-forwarded-host","x-forwarded-for","purpose","sec-purpose","next-router-prefetch","x-middleware-prefetch"],o=function(e){let o={};for(let r of t){let t=e.get(r);t&&(o[r]=t)}let c=r(e);return c.country&&(o["x-c15t-country"]=c.country),c.region&&(o["x-c15t-region"]=c.region),o};export{o as extractRelevantHeaders};
1
+ import{CONSENT_REQUEST_HEADER_NAMES as e,extractConsentRequestInputs as r}from"@c15t/schema/types";let t=[...e,"x-c15t-version","user-agent","x-forwarded-for","purpose","sec-purpose","next-router-prefetch","x-middleware-prefetch"],o=["forwarded","x-forwarded-host","x-forwarded-proto"],a=function(e,a={}){let d={};for(let r of a.trustForwardedHeaders?[...t,...o]:t){let t=e.get(r);t&&(d[r]=t)}let c=r(e);return c.country&&(d["x-c15t-country"]=c.country),c.region&&(d["x-c15t-region"]=c.region),d};export{o as CLIENT_FORWARDING_HEADERS,a as extractRelevantHeaders};
@@ -1 +1 @@
1
- import{resolveBackendURL as t}from"@c15t/schema/types";let e=/^https?:\/\//u,r=function(t){return"/"===t?t:t.endsWith("/")?t.slice(0,-1):t},n=function(t){if(e.test(t))return String(new URL(t)),{isAbsolute:!0,normalizedURL:r(t)};if(t.startsWith("/"))return{isAbsolute:!1,normalizedURL:r(t)};throw Error(`Invalid URL format: ${t}. URL must be absolute (https://...) or relative starting with (/)`)},i=function(e,r){return t(e,r)};export{i as normalizeBackendURL,n as validateBackendURL};
1
+ import{resolveRequestBackendURL as r}from"@c15t/core/server";let e=/^https?:\/\//u,t=function(r){return"/"===r?r:r.endsWith("/")?r.slice(0,-1):r},a=function(r){if(e.test(r))return String(new URL(r)),{isAbsolute:!0,normalizedURL:t(r)};if(r.startsWith("/"))return{isAbsolute:!1,normalizedURL:t(r)};throw Error(`Invalid URL format: ${r}. URL must be absolute (https://...) or relative starting with (/)`)},n=function(e,t,a={}){return r(e,{headers:t,trustForwardedHeaders:a.trustForwardedHeaders})};export{n as normalizeBackendURL,a as validateBackendURL};