@c15t/react 3.0.0-alpha.1 → 3.0.0-alpha.11

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 (413) hide show
  1. package/AGENTS.md +97 -70
  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 -0
  10. package/dist/components/consent-gate/consent-gate.js +2 -0
  11. package/dist/components/consent-gate/frame.js +2 -0
  12. package/dist/components/consent-gate/index.js +2 -0
  13. package/dist/components/consent-preferences-link/consent-preferences-link.js +1 -1
  14. package/dist/components/iab-panel/atoms/card.js +1 -1
  15. package/dist/components/iab-panel/atoms/feature-item.js +2 -0
  16. package/dist/components/iab-panel/atoms/header.js +1 -1
  17. package/dist/components/iab-panel/atoms/purpose-item.js +1 -1
  18. package/dist/components/iab-panel/atoms/root.js +1 -1
  19. package/dist/components/iab-panel/atoms/stack-item.js +1 -1
  20. package/dist/components/iab-panel/atoms/vendor-list.js +1 -1
  21. package/dist/components/iab-panel/hooks/use-gvl-data.js +1 -1
  22. package/dist/components/iab-panel/iab-panel.js +1 -1
  23. package/dist/components/iab-panel/index.js +1 -1
  24. package/dist/components/iab-prompt/atoms/overlay.js +1 -1
  25. package/dist/components/iab-prompt/atoms/root.js +1 -1
  26. package/dist/components/iab-prompt/iab-prompt.js +1 -1
  27. package/dist/components/panel/atoms/card.js +1 -1
  28. package/dist/components/panel/atoms/overlay.js +1 -1
  29. package/dist/components/panel/atoms/root.js +1 -1
  30. package/dist/components/panel/panel.js +1 -1
  31. package/dist/components/panel-trigger/atoms/button.js +1 -1
  32. package/dist/components/panel-trigger/atoms/icon.js +1 -1
  33. package/dist/components/panel-trigger/atoms/root.js +1 -1
  34. package/dist/components/panel-trigger/atoms/toolbar.js +1 -1
  35. package/dist/components/panel-trigger/atoms/trigger-icons.js +1 -0
  36. package/dist/components/panel-trigger/panel-trigger-toolbar.js +1 -1
  37. package/dist/components/panel-trigger/panel-trigger.js +1 -1
  38. package/dist/components/panel-trigger/toolbar-loader.js +2 -0
  39. package/dist/components/preferences/atoms/accordion.js +1 -1
  40. package/dist/components/preferences/atoms/root.js +1 -1
  41. package/dist/components/preferences/atoms/vendor-list.js +1 -0
  42. package/dist/components/preferences/index.js +1 -1
  43. package/dist/components/prompt/atoms/early-tap-script.js +2 -0
  44. package/dist/components/prompt/atoms/overlay.js +1 -1
  45. package/dist/components/prompt/atoms/root.js +1 -1
  46. package/dist/components/prompt/components.js +1 -1
  47. package/dist/components/prompt/policy-actions.js +1 -1
  48. package/dist/components/prompt/prompt.js +1 -1
  49. package/dist/components/shared/dialog-sheets.js +1 -0
  50. package/dist/components/shared/first-paint-sheets.js +1 -0
  51. package/dist/components/shared/iab-dialog-sheets.js +1 -0
  52. package/dist/components/shared/iab-first-paint-sheets.js +1 -0
  53. package/dist/components/shared/libs/compose-refs.js +1 -0
  54. package/dist/components/shared/libs/slot.js +1 -1
  55. package/dist/components/shared/primitives/button.js +1 -1
  56. package/dist/components/shared/primitives/legal-links/index.js +1 -1
  57. package/dist/components/shared/streamed-surface.js +2 -0
  58. package/dist/components/shared/surface-styles.js +2 -0
  59. package/dist/components/shared/ui/dialog/dialog.js +1 -1
  60. package/dist/components/shared/ui/icon.js +1 -1
  61. package/dist/components/shared/ui/logo.js +1 -1
  62. package/dist/components/shared/ui/preference-item/preference-item.js +1 -1
  63. package/dist/consent-gate.js +2 -0
  64. package/dist/consent-theme.js +1 -0
  65. package/dist/context/consent-tracking-context.js +1 -1
  66. package/dist/context/index.js +1 -1
  67. package/dist/context.js +1 -1
  68. package/dist/devtools-launcher.js +2 -0
  69. package/dist/devtools.js +1 -1
  70. package/dist/draft-context.js +2 -0
  71. package/dist/draft.js +1 -1
  72. package/dist/external-iab-context.js +1 -1
  73. package/dist/gpp.js +2 -0
  74. package/dist/headless.js +1 -1
  75. package/dist/hooks/use-color-scheme.js +1 -1
  76. package/dist/hooks/use-committed-ref.js +2 -0
  77. package/dist/hooks/use-focus-trap.js +1 -1
  78. package/dist/hooks/use-headless-iab-consent-ui.js +1 -1
  79. package/dist/hooks/use-iab-policy-guard.js +1 -0
  80. package/dist/hooks/use-late-entry.js +2 -0
  81. package/dist/hooks.js +1 -1
  82. package/dist/iab/styles.tw3.css +5 -45
  83. package/dist/iab-context.js +1 -1
  84. package/dist/iab-dialog-deferred.js +2 -0
  85. package/dist/iab.js +1 -1
  86. package/dist/index-parts/consent-banner.js +1 -0
  87. package/dist/index-parts/consent-dialog-link.js +1 -0
  88. package/dist/index-parts/consent-dialog-trigger.js +1 -0
  89. package/dist/index-parts/consent-dialog.js +1 -0
  90. package/dist/index-parts/consent-gate.js +1 -0
  91. package/dist/index-parts/core.js +1 -0
  92. package/dist/index-parts/draft.js +1 -0
  93. package/dist/index-parts/frame.js +1 -0
  94. package/dist/index-parts/hooks.js +1 -0
  95. package/dist/index-parts/hosted.js +1 -0
  96. package/dist/index-parts/module-hooks.js +1 -0
  97. package/dist/index-parts/offline.js +1 -0
  98. package/dist/index-parts/presets.js +1 -0
  99. package/dist/index-parts/provider.js +1 -0
  100. package/dist/index-parts/theme.js +1 -0
  101. package/dist/index-parts/translations.js +1 -0
  102. package/dist/index.js +1 -1
  103. package/dist/kernel-selector.js +1 -0
  104. package/dist/modes.js +1 -0
  105. package/dist/module-hooks/iframe-blocker.js +1 -1
  106. package/dist/module-hooks/network-blocker.js +1 -1
  107. package/dist/module-hooks/network-hold.js +2 -0
  108. package/dist/module-hooks/persistence.js +1 -1
  109. package/dist/panel-link.js +1 -1
  110. package/dist/panel-trigger.js +1 -1
  111. package/dist/panel.js +1 -1
  112. package/dist/postcss-tailwind3.js +1 -0
  113. package/dist/preferences.js +1 -2
  114. package/dist/provider.js +1 -1
  115. package/dist/server/fetch-ssr-data.js +1 -1
  116. package/dist/server/headers.js +1 -1
  117. package/dist/server/normalize-url.js +1 -1
  118. package/dist/styles.tw3.css +33 -51
  119. package/dist/transports/hosted.js +1 -0
  120. package/dist/transports/manifest.js +1 -0
  121. package/dist/transports/offline.js +1 -1
  122. package/dist/utils/deferred-module.js +2 -0
  123. package/dist/utils/merge-slot-props.js +1 -1
  124. package/dist/utils/theme-utils.js +1 -1
  125. package/dist/version.js +1 -1
  126. package/dist-types/aggregate-components.d.ts +2 -2
  127. package/dist-types/chunk-warming.d.ts +42 -8
  128. package/dist-types/component-hooks/use-headless-consent-ui.d.ts +5 -5
  129. package/dist-types/component-hooks/use-headless-iab-consent-ui.d.ts +2 -2
  130. package/dist-types/components/consent-gate/atoms.d.ts +11 -0
  131. package/dist-types/components/consent-gate/consent-gate.d.ts +2 -0
  132. package/dist-types/components/consent-gate/frame.d.ts +19 -0
  133. package/dist-types/components/consent-gate/index.d.ts +25 -0
  134. package/dist-types/components/{frame → consent-gate}/types.d.ts +7 -7
  135. package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
  136. package/dist-types/components/consent-preferences-link/index.d.ts +1 -1
  137. package/dist-types/components/iab-panel/atoms/feature-item.d.ts +28 -0
  138. package/dist-types/components/iab-panel/atoms/purpose-item.d.ts +5 -2
  139. package/dist-types/components/iab-panel/atoms/stack-item.d.ts +7 -2
  140. package/dist-types/components/iab-panel/atoms/vendor-list.d.ts +1 -1
  141. package/dist-types/components/iab-panel/iab-panel.d.ts +3 -3
  142. package/dist-types/components/iab-panel/index.d.ts +29 -26
  143. package/dist-types/components/iab-panel/use-iab-translations.d.ts +4 -0
  144. package/dist-types/components/iab-prompt/iab-prompt.d.ts +3 -3
  145. package/dist-types/components/iab-prompt/index.d.ts +19 -19
  146. package/dist-types/components/panel/atoms/card.d.ts +5 -4
  147. package/dist-types/components/panel/atoms/overlay.d.ts +1 -1
  148. package/dist-types/components/panel/index.d.ts +8 -8
  149. package/dist-types/components/panel/panel.d.ts +3 -3
  150. package/dist-types/components/panel-link/index.d.ts +1 -1
  151. package/dist-types/components/panel-trigger/atoms/button.d.ts +1 -1
  152. package/dist-types/components/panel-trigger/atoms/icon.d.ts +1 -1
  153. package/dist-types/components/panel-trigger/atoms/root.d.ts +2 -2
  154. package/dist-types/components/panel-trigger/atoms/toolbar.d.ts +2 -2
  155. package/dist-types/components/panel-trigger/atoms/trigger-icons.d.ts +25 -0
  156. package/dist-types/components/panel-trigger/index.d.ts +4 -4
  157. package/dist-types/components/panel-trigger/panel-trigger-toolbar.d.ts +1 -1
  158. package/dist-types/components/panel-trigger/panel-trigger.d.ts +9 -17
  159. package/dist-types/components/panel-trigger/toolbar-loader.d.ts +34 -0
  160. package/dist-types/components/panel-trigger/types.d.ts +1 -1
  161. package/dist-types/components/preferences/atoms/accordion.d.ts +6 -4
  162. package/dist-types/components/preferences/atoms/button.d.ts +1 -1
  163. package/dist-types/components/preferences/atoms/footer.d.ts +1 -1
  164. package/dist-types/components/preferences/atoms/root.d.ts +1 -1
  165. package/dist-types/components/preferences/atoms/vendor-list.d.ts +23 -0
  166. package/dist-types/components/preferences/index.d.ts +14 -12
  167. package/dist-types/components/preferences/policy-actions.d.ts +2 -2
  168. package/dist-types/components/preferences/preferences.d.ts +1 -1
  169. package/dist-types/components/preferences/types.d.ts +1 -1
  170. package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
  171. package/dist-types/components/prompt/atoms/root.d.ts +4 -0
  172. package/dist-types/components/prompt/components.d.ts +9 -3
  173. package/dist-types/components/prompt/index.d.ts +12 -12
  174. package/dist-types/components/prompt/policy-actions.d.ts +2 -2
  175. package/dist-types/components/prompt/prompt.d.ts +5 -1
  176. package/dist-types/components/shared/dialog-sheets.d.ts +9 -0
  177. package/dist-types/components/shared/first-paint-sheets.d.ts +8 -0
  178. package/dist-types/components/shared/iab-dialog-sheets.d.ts +3 -0
  179. package/dist-types/components/shared/iab-first-paint-sheets.d.ts +3 -0
  180. package/dist-types/components/shared/libs/compose-refs.d.ts +20 -0
  181. package/dist-types/components/shared/policy-actions.d.ts +2 -2
  182. package/dist-types/components/shared/primitives/box.d.ts +1 -1
  183. package/dist-types/components/shared/primitives/button.d.ts +2 -2
  184. package/dist-types/components/shared/primitives/button.types.d.ts +1 -1
  185. package/dist-types/components/shared/streamed-surface.d.ts +23 -0
  186. package/dist-types/components/shared/surface-styles.d.ts +60 -0
  187. package/dist-types/components/shared/ui/accordion/accordion.d.ts +2 -2
  188. package/dist-types/components/shared/ui/accordion/index.d.ts +2 -2
  189. package/dist-types/components/shared/ui/animated-collapse/index.d.ts +2 -2
  190. package/dist-types/components/shared/ui/branding.d.ts +1 -1
  191. package/dist-types/components/shared/ui/button/button.d.ts +1 -1
  192. package/dist-types/components/shared/ui/button/index.d.ts +2 -2
  193. package/dist-types/components/shared/ui/collapsible/index.d.ts +1 -1
  194. package/dist-types/components/shared/ui/dialog/index.d.ts +1 -1
  195. package/dist-types/components/shared/ui/icon.d.ts +2 -1
  196. package/dist-types/components/shared/ui/logo.d.ts +0 -10
  197. package/dist-types/components/shared/ui/preference-item/index.d.ts +1 -1
  198. package/dist-types/components/shared/ui/preference-item/preference-item.d.ts +13 -0
  199. package/dist-types/components/shared/ui/switch/index.d.ts +2 -2
  200. package/dist-types/components/shared/ui/switch/switch.d.ts +1 -1
  201. package/dist-types/components/shared/ui/tabs/index.d.ts +1 -1
  202. package/dist-types/consent-gate.d.ts +1 -0
  203. package/dist-types/consent-theme.d.ts +38 -0
  204. package/dist-types/context/consent-tracking-context.d.ts +10 -0
  205. package/dist-types/context/index.d.ts +3 -3
  206. package/dist-types/context/theme-context.d.ts +3 -3
  207. package/dist-types/context.d.ts +25 -1
  208. package/dist-types/devtools-launcher.d.ts +29 -0
  209. package/dist-types/devtools.d.ts +13 -2
  210. package/dist-types/draft-context.d.ts +31 -0
  211. package/dist-types/draft.d.ts +81 -9
  212. package/dist-types/gpp.d.ts +27 -0
  213. package/dist-types/headless.d.ts +6 -7
  214. package/dist-types/hooks/use-committed-ref.d.ts +24 -0
  215. package/dist-types/hooks/use-focus-trap.d.ts +3 -1
  216. package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +1 -1
  217. package/dist-types/hooks/use-iab-manager.d.ts +5 -5
  218. package/dist-types/hooks/use-iab-policy-guard.d.ts +35 -0
  219. package/dist-types/hooks/use-late-entry.d.ts +14 -0
  220. package/dist-types/hooks/use-theme.d.ts +1 -1
  221. package/dist-types/hooks.d.ts +106 -11
  222. package/dist-types/iab-dialog-deferred.d.ts +36 -0
  223. package/dist-types/iab.d.ts +8 -7
  224. package/dist-types/index-parts/consent-banner.d.ts +7 -0
  225. package/dist-types/index-parts/consent-dialog-link.d.ts +7 -0
  226. package/dist-types/index-parts/consent-dialog-trigger.d.ts +7 -0
  227. package/dist-types/index-parts/consent-dialog.d.ts +7 -0
  228. package/dist-types/index-parts/consent-gate.d.ts +7 -0
  229. package/dist-types/index-parts/core.d.ts +7 -0
  230. package/dist-types/index-parts/draft.d.ts +7 -0
  231. package/dist-types/index-parts/frame.d.ts +7 -0
  232. package/dist-types/index-parts/hooks.d.ts +7 -0
  233. package/dist-types/index-parts/hosted.d.ts +7 -0
  234. package/dist-types/index-parts/module-hooks.d.ts +7 -0
  235. package/dist-types/index-parts/offline.d.ts +7 -0
  236. package/dist-types/index-parts/presets.d.ts +7 -0
  237. package/dist-types/index-parts/provider.d.ts +7 -0
  238. package/dist-types/index-parts/theme.d.ts +8 -0
  239. package/dist-types/index-parts/translations.d.ts +7 -0
  240. package/dist-types/index.d.ts +32 -28
  241. package/dist-types/kernel-selector.d.ts +68 -0
  242. package/dist-types/modes.d.ts +26 -0
  243. package/dist-types/module-hooks/iframe-blocker.d.ts +33 -1
  244. package/dist-types/module-hooks/network-blocker.d.ts +23 -0
  245. package/dist-types/module-hooks/network-hold.d.ts +47 -0
  246. package/dist-types/module-hooks.d.ts +4 -4
  247. package/dist-types/panel-link.d.ts +1 -1
  248. package/dist-types/panel-trigger.d.ts +1 -1
  249. package/dist-types/panel.d.ts +13 -1
  250. package/dist-types/postcss-tailwind3.d.ts +21 -0
  251. package/dist-types/preferences.d.ts +12 -1
  252. package/dist-types/primitives/accordion.d.ts +1 -1
  253. package/dist-types/primitives/button.d.ts +1 -1
  254. package/dist-types/primitives/collapsible.d.ts +1 -1
  255. package/dist-types/primitives/dialog.d.ts +1 -1
  256. package/dist-types/primitives/preference-item.d.ts +1 -1
  257. package/dist-types/primitives/switch.d.ts +1 -1
  258. package/dist-types/primitives/tabs.d.ts +1 -1
  259. package/dist-types/primitives.d.ts +7 -7
  260. package/dist-types/prompt.d.ts +1 -1
  261. package/dist-types/provider.d.ts +169 -28
  262. package/dist-types/server/fetch-ssr-data.d.ts +1 -1
  263. package/dist-types/server/headers.d.ts +14 -4
  264. package/dist-types/server/index.d.ts +5 -5
  265. package/dist-types/server/normalize-url.d.ts +14 -7
  266. package/dist-types/server/types.d.ts +12 -1
  267. package/dist-types/theme-provider.d.ts +2 -2
  268. package/dist-types/transports/hosted.d.ts +36 -0
  269. package/dist-types/transports/manifest.d.ts +48 -0
  270. package/dist-types/transports/offline.d.ts +7 -16
  271. package/dist-types/types/index.d.ts +3 -3
  272. package/dist-types/types/manager.d.ts +1 -1
  273. package/dist-types/types/theme/index.d.ts +1 -1
  274. package/dist-types/ui-config-context.d.ts +14 -2
  275. package/dist-types/utils/deferred-module.d.ts +13 -0
  276. package/dist-types/utils/index.d.ts +4 -4
  277. package/dist-types/utils/merge-slot-props.d.ts +17 -3
  278. package/dist-types/utils/merge-styles.d.ts +1 -1
  279. package/dist-types/utils/theme-utils.d.ts +18 -3
  280. package/dist-types/version.d.ts +1 -1
  281. package/docs/README.md +97 -70
  282. package/docs/assets/v3/bottom-bar.png +0 -0
  283. package/docs/assets/v3/brand-card.png +0 -0
  284. package/docs/assets/v3/brand-preferences.png +0 -0
  285. package/docs/assets/v3/choice-wall.png +0 -0
  286. package/docs/assets/v3/headless-bar-html.png +0 -0
  287. package/docs/assets/v3/headless-bar-mobile.png +0 -0
  288. package/docs/assets/v3/headless-bar.png +0 -0
  289. package/docs/assets/v3/slim-bar.png +0 -0
  290. package/docs/concepts/choose-your-setup.md +141 -0
  291. package/docs/concepts/consent-categories.md +84 -0
  292. package/docs/concepts/consent-state.md +421 -0
  293. package/docs/concepts/data-fetching.md +284 -0
  294. package/docs/concepts/how-consent-works.md +123 -0
  295. package/docs/concepts/modes.md +281 -0
  296. package/docs/{frameworks/react/concepts/policy-presets.md → concepts/policies.md} +8 -60
  297. package/docs/customization/class-names.md +202 -0
  298. package/docs/customization/dark-mode.md +157 -0
  299. package/docs/customization/motion.md +128 -0
  300. package/docs/customization/overview.md +68 -33
  301. package/docs/customization/recipes.md +838 -47
  302. package/docs/customization/slots.md +217 -35
  303. package/docs/customization/stylesheets.md +248 -0
  304. package/docs/customization/tailwind.md +863 -0
  305. package/docs/customization/tokens.md +167 -36
  306. package/docs/customization/translations.md +87 -3
  307. package/docs/frameworks/react/callbacks.md +118 -0
  308. package/docs/frameworks/react/clear-on-revocation.md +106 -0
  309. package/docs/frameworks/react/components/consent-banner.md +48 -27
  310. package/docs/frameworks/react/components/consent-dialog-link.md +13 -11
  311. package/docs/frameworks/react/components/consent-dialog-trigger.md +86 -76
  312. package/docs/frameworks/react/components/consent-dialog.md +111 -58
  313. package/docs/frameworks/react/components/{frame.md → consent-gate.md} +70 -49
  314. package/docs/frameworks/react/components/consent-provider.md +143 -0
  315. package/docs/frameworks/react/components/consent-widget.md +69 -24
  316. package/docs/frameworks/react/components/dev-tools.md +76 -85
  317. package/docs/frameworks/react/components.md +113 -0
  318. package/docs/frameworks/react/compose.md +354 -0
  319. package/docs/frameworks/react/content-security-policy.md +149 -0
  320. package/docs/frameworks/react/customize.md +258 -0
  321. package/docs/frameworks/react/embeds.md +89 -0
  322. package/docs/frameworks/react/gpp.md +163 -0
  323. package/docs/frameworks/react/headless.md +4 -4
  324. package/docs/frameworks/react/hooks.md +70 -0
  325. package/docs/frameworks/react/iab.md +278 -0
  326. package/docs/frameworks/react/network-blocker.md +140 -0
  327. package/docs/frameworks/react/quickstart.md +171 -107
  328. package/docs/frameworks/react/rendering.md +285 -0
  329. package/docs/frameworks/react/scripts.md +114 -0
  330. package/docs/frameworks/react/translations.md +155 -0
  331. package/docs/frameworks/react/troubleshooting.md +189 -61
  332. package/docs/frameworks/react/upgrade-v3.md +652 -0
  333. package/docs/frameworks/react/vendor-consent.md +188 -0
  334. package/docs/guides/banner-experiments.md +688 -0
  335. package/docs/guides/troubleshooting.md +192 -54
  336. package/docs/guides/verify-consent.md +96 -49
  337. package/docs/integrations/adobe-analytics.md +177 -183
  338. package/docs/integrations/ahrefs-analytics.md +162 -178
  339. package/docs/integrations/amplitude.md +172 -180
  340. package/docs/integrations/building-integrations.md +137 -33
  341. package/docs/integrations/clearbit.md +164 -178
  342. package/docs/integrations/cloudflare-web-analytics.md +166 -180
  343. package/docs/integrations/cloudflare-zaraz.md +333 -0
  344. package/docs/integrations/crisp.md +174 -182
  345. package/docs/integrations/databuddy.md +167 -197
  346. package/docs/integrations/fathom-analytics.md +168 -180
  347. package/docs/integrations/front-chat.md +308 -0
  348. package/docs/integrations/google-maps.md +142 -108
  349. package/docs/integrations/google-tag-manager.md +258 -185
  350. package/docs/integrations/google-tag.md +226 -182
  351. package/docs/integrations/heap.md +173 -179
  352. package/docs/integrations/hightouch.md +171 -181
  353. package/docs/integrations/hotjar.md +169 -179
  354. package/docs/integrations/intercom.md +193 -177
  355. package/docs/integrations/klaviyo.md +473 -0
  356. package/docs/integrations/linkedin-insights.md +184 -174
  357. package/docs/integrations/logrocket.md +170 -180
  358. package/docs/integrations/matomo-analytics.md +198 -202
  359. package/docs/integrations/meta-pixel.md +198 -174
  360. package/docs/integrations/microsoft-clarity.md +173 -179
  361. package/docs/integrations/microsoft-uet.md +158 -178
  362. package/docs/integrations/mixpanel-analytics.md +165 -184
  363. package/docs/integrations/one-dollar-stats.md +292 -0
  364. package/docs/integrations/openai-pixel.md +214 -325
  365. package/docs/integrations/overview.md +153 -83
  366. package/docs/integrations/pinterest-tag.md +315 -0
  367. package/docs/integrations/pirsch.md +179 -183
  368. package/docs/integrations/plausible-analytics.md +182 -182
  369. package/docs/integrations/posthog.md +323 -264
  370. package/docs/integrations/promptwatch.md +164 -178
  371. package/docs/integrations/reddit-pixel.md +195 -181
  372. package/docs/integrations/rudderstack.md +211 -210
  373. package/docs/integrations/rybbit-analytics.md +181 -184
  374. package/docs/integrations/segment.md +192 -178
  375. package/docs/integrations/sentry.md +402 -0
  376. package/docs/integrations/snapchat-pixel.md +196 -180
  377. package/docs/integrations/tiktok-pixel.md +181 -174
  378. package/docs/integrations/umami-analytics.md +173 -182
  379. package/docs/integrations/vercel-analytics.md +176 -181
  380. package/docs/integrations/vercel-speed-insights.md +306 -0
  381. package/docs/integrations/x-pixel.md +186 -174
  382. package/docs/integrations/youtube.md +150 -111
  383. package/package.json +48 -17
  384. package/dist/component-hooks/use-manager.js +0 -2
  385. package/dist/components/frame/atoms.js +0 -1
  386. package/dist/components/frame/frame.js +0 -2
  387. package/dist/components/frame/index.js +0 -2
  388. package/dist/frame.js +0 -2
  389. package/dist/ui-save.js +0 -1
  390. package/dist-types/component-hooks/use-manager.d.ts +0 -40
  391. package/dist-types/components/frame/atoms.d.ts +0 -11
  392. package/dist-types/components/frame/frame.d.ts +0 -2
  393. package/dist-types/components/frame/index.d.ts +0 -24
  394. package/dist-types/frame.d.ts +0 -1
  395. package/dist-types/ui-save.d.ts +0 -5
  396. package/docs/assets/v3/brand-bar.png +0 -0
  397. package/docs/assets/v3/mobile-card.png +0 -0
  398. package/docs/assets/v3/preferences.png +0 -0
  399. package/docs/frameworks/react/components/consent-manager-provider.md +0 -71
  400. package/docs/frameworks/react/concepts/consent-categories.md +0 -33
  401. package/docs/frameworks/react/hooks/use-consent-manager/overview.md +0 -58
  402. package/docs/frameworks/react/iab/overview.md +0 -53
  403. package/docs/frameworks/react/script-loader.md +0 -63
  404. package/docs/frameworks/react/styling/overview.md +0 -217
  405. package/docs/guides/consent-state.md +0 -60
  406. package/docs/guides/data-fetching.md +0 -163
  407. package/docs/guides/deployment-modes.md +0 -63
  408. package/docs/integrations/clear-on-revocation.md +0 -167
  409. package/docs/upgrade-v3.md +0 -334
  410. package/readme.json +0 -48
  411. package/src/iab/styles.css +0 -11
  412. package/src/styles.css +0 -10
  413. /package/dist/components/{frame → consent-gate}/types.js +0 -0
@@ -1,217 +1,157 @@
1
1
  ---
2
2
  title: RudderStack
3
- description: Gate the RudderStack browser SDK or map c15t categories to
4
- destination consent IDs.
3
+ description: Load the RudderStack JavaScript SDK after measurement consent with
4
+ the c15t rudderstack helper, or map c15t categories to destination consent
5
+ IDs, and check each mode.
6
+ icon: rudderstack
5
7
  group: integrations
6
8
  ---
7
9
 
8
10
  ## Configure RudderStack
9
11
 
10
- Copy the source write key and HTTPS data plane URL from your RudderStack source.
11
- The default helper waits for measurement permission before loading the SDK.
12
+ Copy the source write key and the HTTPS data plane URL from your RudderStack
13
+ source. Keep control-plane credentials out of the browser.
12
14
 
13
- | Package manager | Command |
14
- | :-------------- | :-------------------------- |
15
- | npm | `npm install @c15t/scripts` |
16
- | pnpm | `pnpm add @c15t/scripts` |
17
- | yarn | `yarn add @c15t/scripts` |
18
- | bun | `bun add @c15t/scripts` |
15
+ | Package manager | Command |
16
+ | :-------------- | :------------------------------------- |
17
+ | npm | `npm install @c15t/integrations@alpha` |
18
+ | pnpm | `pnpm add @c15t/integrations@alpha` |
19
+ | yarn | `yarn add @c15t/integrations@alpha` |
20
+ | bun | `bun add @c15t/integrations@alpha` |
19
21
 
20
22
  ```ts title="src/consent-scripts.ts"
21
- import { rudderstack } from '@c15t/scripts/rudderstack';
23
+ import { rudderstack } from '@c15t/integrations/rudderstack';
22
24
 
23
25
  export const scripts = [
24
- rudderstack({
25
- writeKey: 'YOUR_SOURCE_WRITE_KEY',
26
- dataPlaneUrl: 'https://your-data-plane.example.com',
27
- }),
26
+ rudderstack({
27
+ writeKey: 'YOUR_SOURCE_WRITE_KEY',
28
+ dataPlaneUrl: 'https://your-data-plane.example.com',
29
+ }),
28
30
  ];
29
31
  ```
30
32
 
31
- Replace both values before running the example. Keep secret control-plane
32
- credentials out of the browser.
33
-
34
33
  ## Register the scripts
35
34
 
36
- Complete your [framework quickstart](https://c15t.com/docs/frameworks) first. Keep its Inth
35
+ Complete your [framework quickstart](https://v3.c15t.com/docs/frameworks) first. Keep its Inth
37
36
  endpoint, policy, styles and consent UI. Remove the vendor's original script,
38
- SDK initializer or tag-manager entry so c15t owns loading once.
37
+ SDK initializer or tag-manager entry, so the vendor loads only through c15t.
39
38
 
40
- The `scripts` export in `src/consent-scripts.ts` is a configuration, not an
41
- initializer. Add it to your existing consent owner using the registration point
42
- below. These are partial edits to that owner, not additional providers.
39
+ The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
40
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
41
+ in the Next.js guide, add the helper to that array instead of creating a
42
+ second file.
43
+ The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
44
+ point for your framework below. These are edits to that provider, not a second
45
+ provider.
43
46
 
44
47
  **Next.js**
45
48
 
46
- Import the configuration into the client boundary from your router guide:
47
-
48
- ```ts
49
- import { ConsentRoot } from 'c15t/next';
50
- import { scripts } from './consent-scripts';
51
- ```
49
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
50
+ `next.config.ts`:
52
51
 
53
- Keep the server-resolved `state` and shared `consentConfig` from your
54
- router guide. Its manifest, init and save URLs stay in effect. Add
55
- `scripts` as a top-level prop on the existing root:
52
+ ```ts title="c15t.config.ts"
53
+ import { defineConsentConfig } from 'c15t/next';
54
+ import { scripts } from './src/consent-scripts';
56
55
 
57
- ```tsx
58
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
59
- {children}
60
- </ConsentRoot>
56
+ export default defineConsentConfig({ scripts });
61
57
  ```
62
58
 
63
- For a Pages Router or static-export setup using `ConsentProvider`, add
64
- `scripts` to its existing `options` instead. Keep the router-specific setup
65
- from [Next.js script loading](https://c15t.com/docs/frameworks/next/script-loader).
59
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
60
+ same call. `ConsentRoot` reads the config in the browser, so the layout
61
+ keeps passing only `state`. App Router, Pages Router and static export all
62
+ read the same file. See
63
+ [Next.js scripts and embeds](https://v3.c15t.com/docs/frameworks/next/scripts).
66
64
 
67
65
  **TanStack Start**
68
66
 
69
- In your existing root route component, import the scripts alongside
70
- `ConsentRoot`. Keep the server loader from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart).
67
+ Import the configuration into your root route and pass it to the existing
68
+ `ConsentRoot` as a top-level prop. Keep the loader from the
69
+ [TanStack Start quickstart](https://v3.c15t.com/docs/frameworks/tanstack-start/quickstart):
71
70
 
72
- ```tsx
73
- import { Outlet } from '@tanstack/react-router';
74
- import { ConsentRoot } from 'c15t/tanstack-start';
71
+ ```tsx title="src/routes/__root.tsx"
75
72
  import { scripts } from '../consent-scripts';
76
73
 
77
- function Root() {
78
- const state = Route.useLoaderData();
79
- return (
80
- <ConsentRoot state={state} backendURL={backendURL} initRoute={false} scripts={scripts}>
81
- <Outlet />
82
- {/* Keep your consent banner, dialog and preferences link here. */}
83
- </ConsentRoot>
84
- );
85
- }
74
+ <ConsentRoot state={consent} scripts={scripts}>
86
75
  ```
87
76
 
88
- This edits the existing route. `Route` and `backendURL` come from its setup;
89
- keep the document shell and head components if they are part of your root.
90
- `initRoute={false}` keeps the quickstart's direct-backend initialization.
91
- If your app mounts a consent server route, retain its existing `initRoute`
92
- instead. Do not return script callbacks from a server function or route loader.
77
+ Import vendor helpers in the root route module, not in a server function.
78
+ A server function's return value must be serializable, and script
79
+ configurations carry callbacks. See
80
+ [TanStack Start scripts](https://v3.c15t.com/docs/frameworks/tanstack-start/scripts).
93
81
 
94
82
  **React**
95
83
 
96
- Import the scripts into your existing provider component:
84
+ Add the configuration to the existing `ConsentProvider` options, next to
85
+ `mode`:
97
86
 
98
- ```ts
99
- import { ConsentProvider } from 'c15t/react';
87
+ ```tsx title="src/consent.tsx"
100
88
  import { scripts } from './consent-scripts';
101
- ```
102
-
103
- Keep the existing options and add `scripts`:
104
89
 
105
- ```tsx
106
- <ConsentProvider options={{ ...consentOptions, scripts }}>
107
- {children}
108
- </ConsentProvider>
90
+ <ConsentProvider options={{ mode, scripts }}>
109
91
  ```
110
92
 
111
- Here `consentOptions` is your existing configuration, including
112
- `mode: hosted({ url: backendURL })`. Keep the banner, dialog and preferences
113
- link inside the provider. See [React script loading](../frameworks/react/script-loader.md).
93
+ `mode` is the `manifest()` value from the
94
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
95
+ dialog and preferences link inside the provider. See
96
+ [React scripts and embeds](../frameworks/react/scripts.md).
114
97
 
115
98
  **Nuxt**
116
99
 
117
- Attach one loader from the root `app.vue`, after the Nuxt module has
118
- started its browser runtime. This keeps vendor callbacks in application code rather
119
- than serialized `nuxt.config.ts` runtime configuration.
100
+ Register the scripts under the `c15t` key in `app/app.config.ts`. Adjust the
101
+ relative import to where you created `consent-scripts.ts`:
120
102
 
121
- ```vue title="app/app.vue"
122
- <script setup lang="ts">
123
- import { onUnmounted } from 'vue';
124
- import { createScriptLoader } from 'c15t/modules/script-loader';
103
+ ```ts title="app/app.config.ts"
125
104
  import { scripts } from '../src/consent-scripts';
126
105
 
127
- const nuxtApp = useNuxtApp();
128
- const kernel = useConsentKernel();
129
- let loader: ReturnType<typeof createScriptLoader> | undefined;
130
-
131
- const removeMountedHook = nuxtApp.hook('app:mounted', () => {
132
- loader = createScriptLoader({ kernel, scripts });
106
+ export default defineAppConfig({
107
+ c15t: { scripts },
133
108
  });
134
- onUnmounted(() => {
135
- removeMountedHook();
136
- loader?.dispose();
137
- });
138
- </script>
139
-
140
- <template>
141
- <ConsentRoot />
142
- <NuxtPage />
143
- </template>
144
109
  ```
145
110
 
146
- Merge the setup code into your root and retain its footer and preferences
147
- link. `useConsentKernel` is auto-imported by the c15t Nuxt module. Adjust the
148
- relative script import if your `app.vue` is at the project root. This loader
149
- waits until the module has applied browser persistence and privacy signals,
150
- then reads the current snapshot and observes future changes. Do not also register these scripts
151
- in another loader. See the [Nuxt quickstart](https://c15t.com/docs/frameworks/nuxt/quickstart).
111
+ The Nuxt module merges this over its options in `nuxt.config.ts` and starts
112
+ one script loader in the browser after hydration, once it has applied the
113
+ visitor's stored choice and privacy signals. Keep `scripts` out of
114
+ `nuxt.config.ts`, which reaches the browser as JSON and drops the vendor
115
+ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
116
+ [Nuxt scripts and embeds](https://v3.c15t.com/docs/frameworks/nuxt/scripts).
152
117
 
153
118
  **Vue**
154
119
 
155
- Use the kernel already provided by the Vue plugin. Merge this setup into
156
- `App.vue`, whose lifetime covers the application:
120
+ Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
157
121
 
158
- ```vue title="src/App.vue"
159
- <script setup lang="ts">
160
- import { onMounted, onUnmounted } from 'vue';
161
- import { createScriptLoader } from 'c15t/modules/script-loader';
162
- import { useConsentKernel } from 'c15t/vue/vue-plugin';
163
- import ConsentRoot from 'c15t/vue/consent-root';
122
+ ```ts title="src/main.ts"
123
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
164
124
  import { scripts } from './consent-scripts';
165
125
 
166
- const kernel = useConsentKernel();
167
- let loader: ReturnType<typeof createScriptLoader> | undefined;
168
-
169
- onMounted(() => {
170
- loader = createScriptLoader({ kernel, scripts });
126
+ app.use(c15tVue, {
127
+ mode: manifest(),
128
+ scripts,
171
129
  });
172
- onUnmounted(() => loader?.dispose());
173
- </script>
174
-
175
- <template>
176
- <ConsentRoot />
177
- <main>Your application</main>
178
- </template>
179
130
  ```
180
131
 
181
- Keep your existing page content and preferences link. The plugin still owns
182
- the kernel and persistence; this component owns only the vendor loader.
183
- Do not register the same scripts in plugin configuration as well. See the
184
- [Vue quickstart](https://c15t.com/docs/frameworks/vue/quickstart).
132
+ Keep your existing `mode` and other options. The plugin starts one
133
+ script loader when the app mounts, after it has applied the visitor's stored
134
+ choice. Do not also call `createScriptLoader` from a component. See
135
+ [Vue scripts and embeds](https://v3.c15t.com/docs/frameworks/vue/scripts).
185
136
 
186
137
  **Astro**
187
138
 
188
- Point the existing Astro integration at a client module. Keep its `mode`,
189
- `ui` and framework integration from the [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart).
190
- Import `fileURLToPath` in your Astro configuration:
191
-
192
- ```js title="astro.config.mjs"
193
- import { fileURLToPath } from 'node:url';
194
- ```
195
-
196
- Add this option to the existing `c15t({ ... })` call. Resolve the path from
197
- the configuration file because Astro injects the import into a virtual module:
198
-
199
- ```js
200
- clientEntrypoint: fileURLToPath(new URL('./src/c15t.client.ts', import.meta.url)),
201
- ```
202
-
203
- Export the scripts from that module:
139
+ Add the scripts to the client entrypoint from the
140
+ [Astro quickstart](https://v3.c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
141
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
142
+ If the module already exports scripts, combine the two arrays.
204
143
 
205
144
  ```ts title="src/c15t.client.ts"
206
- import type { C15tClientOptionsExtension } from '@c15t/astro';
145
+ import type { C15tClientOptionsExtension } from 'c15t/astro';
207
146
  import { scripts } from './consent-scripts';
208
147
 
209
148
  export default { scripts } satisfies C15tClientOptionsExtension;
210
149
  ```
211
150
 
212
- The integration passes this extension to its shared browser runtime. Vendor
213
- helpers contain callbacks, so do not put them in the serialized `scripts`
214
- option in `astro.config.mjs`. Keep one runtime across consent islands and
151
+ Vendor helpers contain callbacks, and the integration options in
152
+ `astro.config.mjs` are serialized into the page, so do not put helpers in
153
+ the integration's `scripts` option. The integration passes the client
154
+ entrypoint to the one runtime every page shares, including across
215
155
  `ClientRouter` navigation.
216
156
 
217
157
  **Svelte**
@@ -221,108 +161,169 @@ pass them as a top-level prop:
221
161
 
222
162
  ```svelte title="src/App.svelte"
223
163
  <script lang="ts">
224
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
164
+ import { ConsentProvider, manifest } from '@c15t/svelte';
225
165
  import { scripts } from './consent-scripts';
226
-
227
- const backendURL = import.meta.env.VITE_C15T_BACKEND_URL;
228
- if (!backendURL) throw new Error('Set VITE_C15T_BACKEND_URL');
229
- const mode = hosted({ url: backendURL });
230
166
  </script>
231
167
 
232
- <ConsentManagerProvider {mode} {scripts}>
168
+ <ConsentProvider mode={manifest()} {scripts}>
233
169
  <!-- Keep your application, consent UI and preferences link here. -->
234
- </ConsentManagerProvider>
170
+ </ConsentProvider>
235
171
  ```
236
172
 
237
- Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
173
+ Retain the styles and consent UI from the [Svelte quickstart](https://v3.c15t.com/docs/frameworks/svelte/quickstart).
238
174
  The provider owns the loader and disposes it on unmount.
239
175
 
240
176
  **SvelteKit**
241
177
 
242
- Add the scripts to the existing root layout provider. Keep the server load
243
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
178
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
179
+ handle and the layout load from the [SvelteKit quickstart](https://v3.c15t.com/docs/frameworks/sveltekit/quickstart).
244
180
 
245
181
  ```svelte title="src/routes/+layout.svelte"
246
182
  <script lang="ts">
247
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
183
+ import { ConsentRoot } from '@c15t/svelte';
248
184
  import { scripts } from '../consent-scripts';
249
185
 
250
186
  let { children, data } = $props();
251
- const mode = hosted({ url: data.backendURL });
252
187
  </script>
253
188
 
254
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
189
+ <ConsentRoot state={data.consent} {scripts}>
255
190
  {@render children()}
256
191
  <!-- Keep your consent UI and preferences link here. -->
257
- </ConsentManagerProvider>
192
+ </ConsentRoot>
258
193
  ```
259
194
 
260
- Import vendor helpers in the layout component, not in `+layout.server.ts`.
261
- For static hosting, keep your browser-only `mode` setup and omit request
262
- prefetch; the `scripts` prop stays the same. If you pass an externally owned
195
+ Import vendor helpers in the layout component, not in `+layout.server.ts`:
196
+ a server load cannot send functions to the browser. Prerendered, static and
197
+ SPA-mode pages use the same `scripts` prop. If you pass an externally owned
263
198
  `runtime` to the provider, register scripts when creating that runtime instead.
264
199
 
200
+ **HTML**
201
+
202
+ The helpers in `@c15t/integrations` are ES modules that need a bundler. On a
203
+ page that loads the c15t script tag, paste the vendor's own snippet instead
204
+ and keep it inert until its category is allowed:
205
+
206
+ ```html
207
+ <script type="text/plain" data-c15t-category="measurement">
208
+ // The vendor's snippet, unchanged
209
+ </script>
210
+ ```
211
+
212
+ Use the category this guide names for the vendor. c15t runs the snippet
213
+ once that category is allowed, and reloads the page when the visitor
214
+ withdraws it. Helper options on this page, such as `loadMode`, do not apply
215
+ to a pasted snippet. See [HTML scripts](https://v3.c15t.com/docs/frameworks/html/scripts).
216
+
265
217
  **JavaScript**
266
218
 
267
- Attach the loader to your existing kernel before calling
268
- `kernel.commands.init()`:
219
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
269
220
 
270
221
  ```ts
271
- import { createScriptLoader } from 'c15t/modules/script-loader';
222
+ import { init, manifest } from '@c15t/browser';
272
223
  import { scripts } from './consent-scripts';
273
224
 
274
- const loader = createScriptLoader({ kernel, scripts });
225
+ const consent = init({
226
+ mode: manifest(),
227
+ scripts,
228
+ });
275
229
  ```
276
230
 
277
- Call `loader.dispose()` when that application instance is destroyed.
278
- `kernel` is the hosted kernel from your quickstart. A provider-owned kernel
279
- already has a loader; do not attach a second one. See
280
- [JavaScript script loading](https://c15t.com/docs/frameworks/javascript/script-loader).
231
+ Keep the mode from your quickstart. With
232
+ `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
233
+ A kernel you create yourself needs a loader from
234
+ `c15t/modules/script-loader`. Attach one loader per kernel. See
235
+ [JavaScript scripts](https://v3.c15t.com/docs/frameworks/javascript/scripts).
281
236
 
282
- ## Map destination consent when loading before permission
237
+ ## Options
283
238
 
284
- `consentManagement` changes the loading contract. The SDK loads immediately,
285
- receives pre-consent configuration, and stays loaded after revocation. c15t
286
- sends consent updates through `rudderanalytics.consent()`.
239
+ | Option | Default | Behavior |
240
+ | ------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
241
+ | `writeKey` | Required | Source write key. Surrounding whitespace is trimmed. An empty value logs an error and the script does not load. |
242
+ | `dataPlaneUrl` | Required | Data plane URL. A missing, invalid or non-HTTPS URL logs an error and the script does not load. |
243
+ | `consentManagement` | None | `{ mapping }` from c15t categories to RudderStack consent IDs. Switches to destination consent mode. |
244
+ | `loadOptions` | `{}` | Third argument to `rudderanalytics.load()`. Use JSON-serializable values only. |
245
+ | `trackPageView` | `true` | Queues `rudderanalytics.page()` before the loader. |
246
+ | `scriptUrl` | `https://cdn.rudderlabs.com/v3/modern/rsa.min.js` | Loader URL override. A non-HTTPS URL throws; a blank value uses the default. |
287
247
 
288
- ```ts title="src/consent-scripts.ts"
289
- import { rudderstack } from '@c15t/scripts/rudderstack';
248
+ ## Loading and revocation
290
249
 
291
- export const scripts = [
292
- rudderstack({
293
- writeKey: 'YOUR_SOURCE_WRITE_KEY',
294
- dataPlaneUrl: 'https://your-data-plane.example.com',
295
- consentManagement: {
296
- mapping: {
297
- measurement: ['product-analytics'],
298
- marketing: ['advertising'],
299
- },
300
- },
301
- }),
302
- ];
303
- ```
250
+ `rudderstack` uses the `measurement` category. `consentManagement` picks the
251
+ mode:
304
252
 
305
- The IDs in this example are placeholders for your destination consent settings.
306
- Allowed c15t categories contribute their IDs to `allowedConsentIds`; denied
307
- categories contribute theirs to `deniedConsentIds`. Test each destination
308
- independently. This mode does not prevent the initial SDK request.
253
+ | Mode | Loads | On consent change | On revocation |
254
+ | ------------------- | ----------------------------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------------- |
255
+ | Default | After measurement is allowed, with `load` and `page` queued | Nothing | Removes the script element and calls no RudderStack API |
256
+ | `consentManagement` | On every page, in RudderStack's pre-consent state | Calls `rudderanalytics.consent()` with the mapped IDs | Keeps the SDK and calls `consent()` with the revoked IDs denied |
309
257
 
310
- ## Options
258
+ ## Map destination consent
259
+
260
+ `consentManagement` loads the RudderStack SDK before the visitor chooses. Use
261
+ it only when every destination in your workspace carries a consent ID from the
262
+ mapping; c15t cannot check destination settings from the browser. Add the
263
+ mapping to the helper call:
264
+
265
+ ```ts
266
+ rudderstack({
267
+ writeKey: 'YOUR_SOURCE_WRITE_KEY',
268
+ dataPlaneUrl: 'https://your-data-plane.example.com',
269
+ consentManagement: {
270
+ mapping: {
271
+ measurement: ['YOUR_ANALYTICS_CONSENT_ID'],
272
+ marketing: ['YOUR_ADVERTISING_CONSENT_ID'],
273
+ },
274
+ },
275
+ });
276
+ ```
311
277
 
312
- | Option | Behavior |
313
- | --------------------------- | ----------------------------------------------------------------------------- |
314
- | `writeKey` | Required non-empty browser source key. |
315
- | `dataPlaneUrl` | Required HTTPS data plane URL. |
316
- | `consentManagement.mapping` | Optional category-to-consent-ID map. Enables pre-consent loading. |
317
- | `loadOptions` | Optional JSON-serializable SDK options; functions are not supported. |
318
- | `trackPageView` | Defaults to `true`, queuing an initial `page()` call. |
319
- | `scriptUrl` | Optional HTTPS loader override. Defaults to the modern v3 RudderStack loader. |
320
-
321
- ## Verify the integration
322
-
323
- In the default mode, confirm denial prevents the initial SDK load. With a
324
- consent mapping, expect the SDK request and inspect the destination consent IDs
325
- instead. The default mode has no vendor shutdown hook after loading, so verify
326
- revocation beyond script removal. In both modes, check routing for duplicate
327
- page events and stop disallowed application events. See
328
- [consent verification](../guides/verify-consent.md).
278
+ The helper sets `preConsent.enabled`, buffered event delivery and
279
+ `consentManagement.provider: 'custom'` in the load options. Storage defaults to
280
+ `{ strategy: 'none' }`; a `preConsent.storage` value in `loadOptions` replaces
281
+ it. Before `load`, the helper queues a `consent()` call. IDs of allowed
282
+ categories go to `allowedConsentIds` and IDs of denied categories go to
283
+ `deniedConsentIds`. A visitor who turns off the `rudderstack` vendor gets every
284
+ mapped ID denied. An empty mapping, or a category with no non-blank IDs, throws.
285
+
286
+ ## Verify RudderStack
287
+
288
+ In the default mode, allowing measurement loads `rsa.min.js` with a
289
+ `data-rsa-write-key` attribute, and a page event goes to your data plane URL.
290
+
291
+ Test in a private window with an opt-in policy. Open DevTools Network, disable
292
+ the cache and filter by the vendor's domain:
293
+
294
+ 1. Load the page. No request goes to the vendor before you choose.
295
+ 2. Click Reject, then reload. There is still no vendor request.
296
+ 3. Open Privacy settings and allow the helper's category. The vendor script
297
+ loads without a page reload.
298
+ 4. Turn the category off again and save. c15t reloads the page, and the new
299
+ page makes no vendor request.
300
+
301
+ c15t reloads on revocation because removing a script element does not stop
302
+ code that already ran. The vendor's listeners, timers and queued events stay
303
+ alive until the page unloads. If you set `reloadOnConsentRevoked: false`, stop
304
+ the vendor yourself. Register a callback-only script whose `onConsentChange`
305
+ calls the vendor's opt-out API, as shown in
306
+ [custom integrations](./building-integrations.md), and check the
307
+ permission before each of your own event calls. The reload does not delete
308
+ cookies the vendor already set; see
309
+ [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
310
+
311
+ The helper sets `vendor` to its script ID, so once you declare that vendor a
312
+ visitor can turn it off inside an allowed category. See
313
+ [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
314
+ [consent verification guide](../guides/verify-consent.md) covers navigation,
315
+ expiry and hosting checks.
316
+
317
+ With `consentManagement`, the SDK loads before the choice, so check your
318
+ destinations instead. Test in a private window with an opt-in policy:
319
+
320
+ 1. Load the page. `rsa.min.js` loads before you choose. Destinations whose
321
+ consent IDs map to a denied category receive no events.
322
+ 2. Open Privacy settings and allow measurement. Without a reload,
323
+ destinations with measurement IDs start receiving events. Destinations
324
+ mapped only to marketing still receive none.
325
+ 3. Turn measurement off and save. c15t reloads the page, and destinations with
326
+ measurement IDs receive no events from the new page.
327
+
328
+ See the [consent verification guide](../guides/verify-consent.md) for
329
+ navigation and hosting checks.