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

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 (406) hide show
  1. package/AGENTS.md +96 -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/panel/atoms/card.js +1 -1
  27. package/dist/components/panel/atoms/overlay.js +1 -1
  28. package/dist/components/panel/atoms/root.js +1 -1
  29. package/dist/components/panel/panel.js +1 -1
  30. package/dist/components/panel-trigger/atoms/button.js +1 -1
  31. package/dist/components/panel-trigger/atoms/icon.js +1 -1
  32. package/dist/components/panel-trigger/atoms/root.js +1 -1
  33. package/dist/components/panel-trigger/atoms/toolbar.js +1 -1
  34. package/dist/components/panel-trigger/atoms/trigger-icons.js +1 -0
  35. package/dist/components/panel-trigger/panel-trigger-toolbar.js +1 -1
  36. package/dist/components/panel-trigger/panel-trigger.js +1 -1
  37. package/dist/components/preferences/atoms/accordion.js +1 -1
  38. package/dist/components/preferences/atoms/root.js +1 -1
  39. package/dist/components/preferences/atoms/vendor-list.js +1 -0
  40. package/dist/components/preferences/index.js +1 -1
  41. package/dist/components/prompt/atoms/early-tap-script.js +2 -0
  42. package/dist/components/prompt/atoms/overlay.js +1 -1
  43. package/dist/components/prompt/atoms/root.js +1 -1
  44. package/dist/components/prompt/components.js +1 -1
  45. package/dist/components/prompt/policy-actions.js +1 -1
  46. package/dist/components/prompt/prompt.js +1 -1
  47. package/dist/components/shared/dialog-sheets.js +1 -0
  48. package/dist/components/shared/first-paint-sheets.js +1 -0
  49. package/dist/components/shared/iab-dialog-sheets.js +1 -0
  50. package/dist/components/shared/iab-first-paint-sheets.js +1 -0
  51. package/dist/components/shared/libs/compose-refs.js +1 -0
  52. package/dist/components/shared/libs/slot.js +1 -1
  53. package/dist/components/shared/primitives/button.js +1 -1
  54. package/dist/components/shared/primitives/legal-links/index.js +1 -1
  55. package/dist/components/shared/streamed-surface.js +2 -0
  56. package/dist/components/shared/surface-styles.js +2 -0
  57. package/dist/components/shared/ui/dialog/dialog.js +1 -1
  58. package/dist/components/shared/ui/icon.js +1 -1
  59. package/dist/components/shared/ui/logo.js +1 -1
  60. package/dist/components/shared/ui/preference-item/preference-item.js +1 -1
  61. package/dist/consent-gate.js +2 -0
  62. package/dist/consent-theme.js +1 -0
  63. package/dist/context/consent-tracking-context.js +1 -1
  64. package/dist/context/index.js +1 -1
  65. package/dist/context.js +1 -1
  66. package/dist/devtools-launcher.js +2 -0
  67. package/dist/devtools.js +1 -1
  68. package/dist/draft-context.js +2 -0
  69. package/dist/draft.js +1 -1
  70. package/dist/external-iab-context.js +1 -1
  71. package/dist/gpp.js +2 -0
  72. package/dist/headless.js +1 -1
  73. package/dist/hooks/use-color-scheme.js +1 -1
  74. package/dist/hooks/use-committed-ref.js +2 -0
  75. package/dist/hooks/use-focus-trap.js +1 -1
  76. package/dist/hooks/use-headless-iab-consent-ui.js +1 -1
  77. package/dist/hooks/use-iab-policy-guard.js +1 -0
  78. package/dist/hooks/use-late-entry.js +2 -0
  79. package/dist/hooks.js +1 -1
  80. package/dist/iab/styles.tw3.css +5 -45
  81. package/dist/iab-context.js +1 -1
  82. package/dist/index-parts/consent-banner.js +1 -0
  83. package/dist/index-parts/consent-dialog-link.js +1 -0
  84. package/dist/index-parts/consent-dialog-trigger.js +1 -0
  85. package/dist/index-parts/consent-dialog.js +1 -0
  86. package/dist/index-parts/consent-gate.js +1 -0
  87. package/dist/index-parts/core.js +1 -0
  88. package/dist/index-parts/draft.js +1 -0
  89. package/dist/index-parts/frame.js +1 -0
  90. package/dist/index-parts/hooks.js +1 -0
  91. package/dist/index-parts/hosted.js +1 -0
  92. package/dist/index-parts/module-hooks.js +1 -0
  93. package/dist/index-parts/offline.js +1 -0
  94. package/dist/index-parts/presets.js +1 -0
  95. package/dist/index-parts/provider.js +1 -0
  96. package/dist/index-parts/theme.js +1 -0
  97. package/dist/index-parts/translations.js +1 -0
  98. package/dist/index.js +1 -1
  99. package/dist/kernel-selector.js +1 -0
  100. package/dist/modes.js +1 -0
  101. package/dist/module-hooks/iframe-blocker.js +1 -1
  102. package/dist/module-hooks/network-blocker.js +1 -1
  103. package/dist/module-hooks/network-hold.js +2 -0
  104. package/dist/module-hooks/persistence.js +1 -1
  105. package/dist/panel-link.js +1 -1
  106. package/dist/panel-trigger.js +1 -1
  107. package/dist/panel.js +1 -1
  108. package/dist/postcss-tailwind3.js +1 -0
  109. package/dist/preferences.js +1 -2
  110. package/dist/provider.js +1 -1
  111. package/dist/server/fetch-ssr-data.js +1 -1
  112. package/dist/server/headers.js +1 -1
  113. package/dist/server/normalize-url.js +1 -1
  114. package/dist/styles.tw3.css +33 -51
  115. package/dist/transports/hosted.js +1 -0
  116. package/dist/transports/manifest.js +1 -0
  117. package/dist/transports/offline.js +1 -1
  118. package/dist/utils/deferred-module.js +2 -0
  119. package/dist/utils/merge-slot-props.js +1 -1
  120. package/dist/utils/theme-utils.js +1 -1
  121. package/dist/version.js +1 -1
  122. package/dist-types/aggregate-components.d.ts +2 -2
  123. package/dist-types/chunk-warming.d.ts +45 -8
  124. package/dist-types/component-hooks/use-headless-consent-ui.d.ts +5 -5
  125. package/dist-types/component-hooks/use-headless-iab-consent-ui.d.ts +2 -2
  126. package/dist-types/components/consent-gate/atoms.d.ts +11 -0
  127. package/dist-types/components/consent-gate/consent-gate.d.ts +2 -0
  128. package/dist-types/components/consent-gate/frame.d.ts +19 -0
  129. package/dist-types/components/consent-gate/index.d.ts +25 -0
  130. package/dist-types/components/{frame → consent-gate}/types.d.ts +7 -7
  131. package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
  132. package/dist-types/components/consent-preferences-link/index.d.ts +1 -1
  133. package/dist-types/components/iab-panel/atoms/feature-item.d.ts +28 -0
  134. package/dist-types/components/iab-panel/atoms/purpose-item.d.ts +5 -2
  135. package/dist-types/components/iab-panel/atoms/stack-item.d.ts +7 -2
  136. package/dist-types/components/iab-panel/atoms/vendor-list.d.ts +1 -1
  137. package/dist-types/components/iab-panel/iab-panel.d.ts +3 -3
  138. package/dist-types/components/iab-panel/index.d.ts +29 -26
  139. package/dist-types/components/iab-panel/use-iab-translations.d.ts +4 -0
  140. package/dist-types/components/iab-prompt/iab-prompt.d.ts +3 -3
  141. package/dist-types/components/iab-prompt/index.d.ts +19 -19
  142. package/dist-types/components/panel/atoms/card.d.ts +5 -4
  143. package/dist-types/components/panel/atoms/overlay.d.ts +1 -1
  144. package/dist-types/components/panel/index.d.ts +8 -8
  145. package/dist-types/components/panel/panel.d.ts +3 -3
  146. package/dist-types/components/panel-link/index.d.ts +1 -1
  147. package/dist-types/components/panel-trigger/atoms/button.d.ts +1 -1
  148. package/dist-types/components/panel-trigger/atoms/icon.d.ts +1 -1
  149. package/dist-types/components/panel-trigger/atoms/root.d.ts +2 -2
  150. package/dist-types/components/panel-trigger/atoms/toolbar.d.ts +2 -2
  151. package/dist-types/components/panel-trigger/atoms/trigger-icons.d.ts +25 -0
  152. package/dist-types/components/panel-trigger/index.d.ts +4 -4
  153. package/dist-types/components/panel-trigger/panel-trigger-toolbar.d.ts +1 -1
  154. package/dist-types/components/panel-trigger/panel-trigger.d.ts +9 -17
  155. package/dist-types/components/panel-trigger/types.d.ts +1 -1
  156. package/dist-types/components/preferences/atoms/accordion.d.ts +6 -4
  157. package/dist-types/components/preferences/atoms/button.d.ts +1 -1
  158. package/dist-types/components/preferences/atoms/footer.d.ts +1 -1
  159. package/dist-types/components/preferences/atoms/root.d.ts +1 -1
  160. package/dist-types/components/preferences/atoms/vendor-list.d.ts +23 -0
  161. package/dist-types/components/preferences/index.d.ts +14 -12
  162. package/dist-types/components/preferences/policy-actions.d.ts +2 -2
  163. package/dist-types/components/preferences/preferences.d.ts +1 -1
  164. package/dist-types/components/preferences/types.d.ts +1 -1
  165. package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
  166. package/dist-types/components/prompt/atoms/root.d.ts +4 -0
  167. package/dist-types/components/prompt/components.d.ts +9 -3
  168. package/dist-types/components/prompt/index.d.ts +12 -12
  169. package/dist-types/components/prompt/policy-actions.d.ts +2 -2
  170. package/dist-types/components/prompt/prompt.d.ts +5 -1
  171. package/dist-types/components/shared/dialog-sheets.d.ts +9 -0
  172. package/dist-types/components/shared/first-paint-sheets.d.ts +8 -0
  173. package/dist-types/components/shared/iab-dialog-sheets.d.ts +3 -0
  174. package/dist-types/components/shared/iab-first-paint-sheets.d.ts +3 -0
  175. package/dist-types/components/shared/libs/compose-refs.d.ts +20 -0
  176. package/dist-types/components/shared/policy-actions.d.ts +2 -2
  177. package/dist-types/components/shared/primitives/box.d.ts +1 -1
  178. package/dist-types/components/shared/primitives/button.d.ts +2 -2
  179. package/dist-types/components/shared/primitives/button.types.d.ts +1 -1
  180. package/dist-types/components/shared/streamed-surface.d.ts +23 -0
  181. package/dist-types/components/shared/surface-styles.d.ts +36 -0
  182. package/dist-types/components/shared/ui/accordion/accordion.d.ts +2 -2
  183. package/dist-types/components/shared/ui/accordion/index.d.ts +2 -2
  184. package/dist-types/components/shared/ui/animated-collapse/index.d.ts +2 -2
  185. package/dist-types/components/shared/ui/branding.d.ts +1 -1
  186. package/dist-types/components/shared/ui/button/button.d.ts +1 -1
  187. package/dist-types/components/shared/ui/button/index.d.ts +2 -2
  188. package/dist-types/components/shared/ui/collapsible/index.d.ts +1 -1
  189. package/dist-types/components/shared/ui/dialog/index.d.ts +1 -1
  190. package/dist-types/components/shared/ui/icon.d.ts +2 -1
  191. package/dist-types/components/shared/ui/logo.d.ts +0 -10
  192. package/dist-types/components/shared/ui/preference-item/index.d.ts +1 -1
  193. package/dist-types/components/shared/ui/preference-item/preference-item.d.ts +13 -0
  194. package/dist-types/components/shared/ui/switch/index.d.ts +2 -2
  195. package/dist-types/components/shared/ui/switch/switch.d.ts +1 -1
  196. package/dist-types/components/shared/ui/tabs/index.d.ts +1 -1
  197. package/dist-types/consent-gate.d.ts +1 -0
  198. package/dist-types/consent-theme.d.ts +38 -0
  199. package/dist-types/context/consent-tracking-context.d.ts +10 -0
  200. package/dist-types/context/index.d.ts +3 -3
  201. package/dist-types/context/theme-context.d.ts +3 -3
  202. package/dist-types/context.d.ts +25 -1
  203. package/dist-types/devtools-launcher.d.ts +29 -0
  204. package/dist-types/devtools.d.ts +13 -2
  205. package/dist-types/draft-context.d.ts +31 -0
  206. package/dist-types/draft.d.ts +81 -9
  207. package/dist-types/gpp.d.ts +27 -0
  208. package/dist-types/headless.d.ts +6 -7
  209. package/dist-types/hooks/use-committed-ref.d.ts +24 -0
  210. package/dist-types/hooks/use-focus-trap.d.ts +3 -1
  211. package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +1 -1
  212. package/dist-types/hooks/use-iab-manager.d.ts +5 -5
  213. package/dist-types/hooks/use-iab-policy-guard.d.ts +35 -0
  214. package/dist-types/hooks/use-late-entry.d.ts +14 -0
  215. package/dist-types/hooks/use-theme.d.ts +1 -1
  216. package/dist-types/hooks.d.ts +106 -11
  217. package/dist-types/iab.d.ts +7 -7
  218. package/dist-types/index-parts/consent-banner.d.ts +7 -0
  219. package/dist-types/index-parts/consent-dialog-link.d.ts +7 -0
  220. package/dist-types/index-parts/consent-dialog-trigger.d.ts +7 -0
  221. package/dist-types/index-parts/consent-dialog.d.ts +7 -0
  222. package/dist-types/index-parts/consent-gate.d.ts +7 -0
  223. package/dist-types/index-parts/core.d.ts +7 -0
  224. package/dist-types/index-parts/draft.d.ts +7 -0
  225. package/dist-types/index-parts/frame.d.ts +7 -0
  226. package/dist-types/index-parts/hooks.d.ts +7 -0
  227. package/dist-types/index-parts/hosted.d.ts +7 -0
  228. package/dist-types/index-parts/module-hooks.d.ts +7 -0
  229. package/dist-types/index-parts/offline.d.ts +7 -0
  230. package/dist-types/index-parts/presets.d.ts +7 -0
  231. package/dist-types/index-parts/provider.d.ts +7 -0
  232. package/dist-types/index-parts/theme.d.ts +8 -0
  233. package/dist-types/index-parts/translations.d.ts +7 -0
  234. package/dist-types/index.d.ts +32 -28
  235. package/dist-types/kernel-selector.d.ts +68 -0
  236. package/dist-types/modes.d.ts +26 -0
  237. package/dist-types/module-hooks/iframe-blocker.d.ts +33 -1
  238. package/dist-types/module-hooks/network-blocker.d.ts +23 -0
  239. package/dist-types/module-hooks/network-hold.d.ts +47 -0
  240. package/dist-types/module-hooks.d.ts +4 -4
  241. package/dist-types/panel-link.d.ts +1 -1
  242. package/dist-types/panel-trigger.d.ts +1 -1
  243. package/dist-types/panel.d.ts +13 -1
  244. package/dist-types/postcss-tailwind3.d.ts +21 -0
  245. package/dist-types/preferences.d.ts +12 -1
  246. package/dist-types/primitives/accordion.d.ts +1 -1
  247. package/dist-types/primitives/button.d.ts +1 -1
  248. package/dist-types/primitives/collapsible.d.ts +1 -1
  249. package/dist-types/primitives/dialog.d.ts +1 -1
  250. package/dist-types/primitives/preference-item.d.ts +1 -1
  251. package/dist-types/primitives/switch.d.ts +1 -1
  252. package/dist-types/primitives/tabs.d.ts +1 -1
  253. package/dist-types/primitives.d.ts +7 -7
  254. package/dist-types/prompt.d.ts +1 -1
  255. package/dist-types/provider.d.ts +169 -28
  256. package/dist-types/server/fetch-ssr-data.d.ts +1 -1
  257. package/dist-types/server/headers.d.ts +14 -4
  258. package/dist-types/server/index.d.ts +5 -5
  259. package/dist-types/server/normalize-url.d.ts +14 -7
  260. package/dist-types/server/types.d.ts +12 -1
  261. package/dist-types/theme-provider.d.ts +2 -2
  262. package/dist-types/transports/hosted.d.ts +36 -0
  263. package/dist-types/transports/manifest.d.ts +48 -0
  264. package/dist-types/transports/offline.d.ts +7 -16
  265. package/dist-types/types/index.d.ts +3 -3
  266. package/dist-types/types/manager.d.ts +1 -1
  267. package/dist-types/types/theme/index.d.ts +1 -1
  268. package/dist-types/ui-config-context.d.ts +14 -2
  269. package/dist-types/utils/deferred-module.d.ts +13 -0
  270. package/dist-types/utils/index.d.ts +4 -4
  271. package/dist-types/utils/merge-slot-props.d.ts +17 -3
  272. package/dist-types/utils/merge-styles.d.ts +1 -1
  273. package/dist-types/utils/theme-utils.d.ts +18 -3
  274. package/dist-types/version.d.ts +1 -1
  275. package/docs/README.md +96 -70
  276. package/docs/assets/v3/bottom-bar.png +0 -0
  277. package/docs/assets/v3/brand-card.png +0 -0
  278. package/docs/assets/v3/brand-preferences.png +0 -0
  279. package/docs/assets/v3/choice-wall.png +0 -0
  280. package/docs/assets/v3/headless-bar-html.png +0 -0
  281. package/docs/assets/v3/headless-bar-mobile.png +0 -0
  282. package/docs/assets/v3/headless-bar.png +0 -0
  283. package/docs/assets/v3/slim-bar.png +0 -0
  284. package/docs/concepts/choose-your-setup.md +138 -0
  285. package/docs/concepts/consent-categories.md +84 -0
  286. package/docs/concepts/consent-state.md +421 -0
  287. package/docs/concepts/data-fetching.md +270 -0
  288. package/docs/concepts/how-consent-works.md +123 -0
  289. package/docs/concepts/modes.md +278 -0
  290. package/docs/{frameworks/react/concepts/policy-presets.md → concepts/policies.md} +8 -60
  291. package/docs/customization/class-names.md +202 -0
  292. package/docs/customization/dark-mode.md +157 -0
  293. package/docs/customization/motion.md +128 -0
  294. package/docs/customization/overview.md +68 -33
  295. package/docs/customization/recipes.md +838 -47
  296. package/docs/customization/slots.md +217 -35
  297. package/docs/customization/stylesheets.md +248 -0
  298. package/docs/customization/tailwind.md +863 -0
  299. package/docs/customization/tokens.md +167 -36
  300. package/docs/customization/translations.md +87 -3
  301. package/docs/frameworks/react/callbacks.md +118 -0
  302. package/docs/frameworks/react/clear-on-revocation.md +106 -0
  303. package/docs/frameworks/react/components/consent-banner.md +48 -27
  304. package/docs/frameworks/react/components/consent-dialog-link.md +13 -11
  305. package/docs/frameworks/react/components/consent-dialog-trigger.md +86 -76
  306. package/docs/frameworks/react/components/consent-dialog.md +111 -58
  307. package/docs/frameworks/react/components/{frame.md → consent-gate.md} +70 -49
  308. package/docs/frameworks/react/components/consent-provider.md +140 -0
  309. package/docs/frameworks/react/components/consent-widget.md +69 -24
  310. package/docs/frameworks/react/components/dev-tools.md +76 -85
  311. package/docs/frameworks/react/components.md +113 -0
  312. package/docs/frameworks/react/compose.md +354 -0
  313. package/docs/frameworks/react/content-security-policy.md +143 -0
  314. package/docs/frameworks/react/customize.md +258 -0
  315. package/docs/frameworks/react/embeds.md +89 -0
  316. package/docs/frameworks/react/gpp.md +163 -0
  317. package/docs/frameworks/react/headless.md +4 -4
  318. package/docs/frameworks/react/hooks.md +70 -0
  319. package/docs/frameworks/react/iab.md +259 -0
  320. package/docs/frameworks/react/network-blocker.md +140 -0
  321. package/docs/frameworks/react/quickstart.md +220 -102
  322. package/docs/frameworks/react/rendering.md +263 -0
  323. package/docs/frameworks/react/scripts.md +114 -0
  324. package/docs/frameworks/react/translations.md +155 -0
  325. package/docs/frameworks/react/troubleshooting.md +188 -61
  326. package/docs/frameworks/react/upgrade-v3.md +651 -0
  327. package/docs/frameworks/react/vendor-consent.md +188 -0
  328. package/docs/guides/banner-experiments.md +672 -0
  329. package/docs/guides/troubleshooting.md +192 -54
  330. package/docs/guides/verify-consent.md +96 -49
  331. package/docs/integrations/adobe-analytics.md +177 -183
  332. package/docs/integrations/ahrefs-analytics.md +162 -178
  333. package/docs/integrations/amplitude.md +172 -180
  334. package/docs/integrations/building-integrations.md +137 -33
  335. package/docs/integrations/clearbit.md +164 -178
  336. package/docs/integrations/cloudflare-web-analytics.md +166 -180
  337. package/docs/integrations/cloudflare-zaraz.md +333 -0
  338. package/docs/integrations/crisp.md +174 -182
  339. package/docs/integrations/databuddy.md +167 -197
  340. package/docs/integrations/fathom-analytics.md +168 -180
  341. package/docs/integrations/front-chat.md +308 -0
  342. package/docs/integrations/google-maps.md +142 -108
  343. package/docs/integrations/google-tag-manager.md +258 -185
  344. package/docs/integrations/google-tag.md +226 -182
  345. package/docs/integrations/heap.md +173 -179
  346. package/docs/integrations/hightouch.md +171 -181
  347. package/docs/integrations/hotjar.md +169 -179
  348. package/docs/integrations/intercom.md +193 -177
  349. package/docs/integrations/klaviyo.md +473 -0
  350. package/docs/integrations/linkedin-insights.md +184 -174
  351. package/docs/integrations/logrocket.md +170 -180
  352. package/docs/integrations/matomo-analytics.md +198 -202
  353. package/docs/integrations/meta-pixel.md +198 -174
  354. package/docs/integrations/microsoft-clarity.md +173 -179
  355. package/docs/integrations/microsoft-uet.md +158 -178
  356. package/docs/integrations/mixpanel-analytics.md +165 -184
  357. package/docs/integrations/one-dollar-stats.md +292 -0
  358. package/docs/integrations/openai-pixel.md +214 -325
  359. package/docs/integrations/overview.md +152 -83
  360. package/docs/integrations/pinterest-tag.md +315 -0
  361. package/docs/integrations/pirsch.md +179 -183
  362. package/docs/integrations/plausible-analytics.md +182 -182
  363. package/docs/integrations/posthog.md +323 -264
  364. package/docs/integrations/promptwatch.md +164 -178
  365. package/docs/integrations/reddit-pixel.md +195 -181
  366. package/docs/integrations/rudderstack.md +211 -210
  367. package/docs/integrations/rybbit-analytics.md +181 -184
  368. package/docs/integrations/segment.md +192 -178
  369. package/docs/integrations/sentry.md +402 -0
  370. package/docs/integrations/snapchat-pixel.md +196 -180
  371. package/docs/integrations/tiktok-pixel.md +181 -174
  372. package/docs/integrations/umami-analytics.md +173 -182
  373. package/docs/integrations/vercel-analytics.md +176 -181
  374. package/docs/integrations/x-pixel.md +186 -174
  375. package/docs/integrations/youtube.md +150 -111
  376. package/package.json +48 -17
  377. package/dist/component-hooks/use-manager.js +0 -2
  378. package/dist/components/frame/atoms.js +0 -1
  379. package/dist/components/frame/frame.js +0 -2
  380. package/dist/components/frame/index.js +0 -2
  381. package/dist/frame.js +0 -2
  382. package/dist/ui-save.js +0 -1
  383. package/dist-types/component-hooks/use-manager.d.ts +0 -40
  384. package/dist-types/components/frame/atoms.d.ts +0 -11
  385. package/dist-types/components/frame/frame.d.ts +0 -2
  386. package/dist-types/components/frame/index.d.ts +0 -24
  387. package/dist-types/frame.d.ts +0 -1
  388. package/dist-types/ui-save.d.ts +0 -5
  389. package/docs/assets/v3/brand-bar.png +0 -0
  390. package/docs/assets/v3/mobile-card.png +0 -0
  391. package/docs/assets/v3/preferences.png +0 -0
  392. package/docs/frameworks/react/components/consent-manager-provider.md +0 -71
  393. package/docs/frameworks/react/concepts/consent-categories.md +0 -33
  394. package/docs/frameworks/react/hooks/use-consent-manager/overview.md +0 -58
  395. package/docs/frameworks/react/iab/overview.md +0 -53
  396. package/docs/frameworks/react/script-loader.md +0 -63
  397. package/docs/frameworks/react/styling/overview.md +0 -217
  398. package/docs/guides/consent-state.md +0 -60
  399. package/docs/guides/data-fetching.md +0 -163
  400. package/docs/guides/deployment-modes.md +0 -63
  401. package/docs/integrations/clear-on-revocation.md +0 -167
  402. package/docs/upgrade-v3.md +0 -334
  403. package/readme.json +0 -48
  404. package/src/iab/styles.css +0 -11
  405. package/src/styles.css +0 -10
  406. /package/dist/components/{frame → consent-gate}/types.js +0 -0
@@ -1,31 +1,31 @@
1
1
  ---
2
- title: Overview
2
+ title: Integrations
3
3
  description: Find all c15t integrations for analytics, tag managers,
4
- advertising, chat and embedded content.
4
+ advertising, email and SMS, chat and embedded content.
5
5
  group: integrations
6
6
  ---
7
7
 
8
8
  ## Choose an integration
9
9
 
10
- Use the vendor helper from `@c15t/scripts` with your existing c15t provider or
11
- script loader. Every helper returns a script configuration; importing one does
12
- not install the vendor. Start with your [framework quickstart](https://c15t.com/docs/frameworks)
13
- to connect Inth and render consent UI, then follow the vendor guide.
10
+ Each vendor helper in `@c15t/integrations` returns a script configuration that you
11
+ register with your c15t provider. Importing a helper installs nothing on its
12
+ own. Set up consent with your [framework quickstart](https://v3.c15t.com/docs/frameworks) first,
13
+ then follow the vendor guide.
14
14
 
15
- | Package manager | Command |
16
- | :-------------- | :-------------------------- |
17
- | npm | `npm install @c15t/scripts` |
18
- | pnpm | `pnpm add @c15t/scripts` |
19
- | yarn | `yarn add @c15t/scripts` |
20
- | 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` |
21
21
 
22
- `@c15t/scripts` is a separate add-on. Keep the main `c15t` package for imports
23
- such as `c15t/react` and `c15t/next`.
22
+ `@c15t/integrations` is a separate package. Keep importing c15t itself from `c15t`,
23
+ for example `c15t/react` or `c15t/next`.
24
24
 
25
- Browse integrations by service type below. The tables distinguish helpers that
26
- wait for permission from helpers
27
- that load immediately and send consent signals. Read the vendor's revocation
28
- behavior before choosing either approach.
25
+ The Loading behavior column shows when each helper requests the vendor. Most
26
+ wait for the category to be allowed. A few load on every page and pass the
27
+ permission to the vendor's own consent API, so the browser contacts the vendor
28
+ before a choice.
29
29
 
30
30
  ## Embeds
31
31
 
@@ -34,78 +34,147 @@ behavior before choosing either approach.
34
34
  | [Google Maps](./google-maps.md) | Framework-specific consent-gated map iframe | Iframe mounts only while the chosen permission is allowed |
35
35
  | [YouTube](./youtube.md) | Framework-specific consent-gated video iframe | Iframe mounts only while the chosen permission is allowed |
36
36
 
37
- Both guides include all nine framework examples. React and Svelte use `Frame`;
37
+ Both guides include all nine framework examples. React and Svelte use `ConsentGate`;
38
38
  Vue conditionally renders the iframe, and Astro and JavaScript use the existing
39
- kernel to control its DOM lifecycle. Embeds do not require `@c15t/scripts`.
39
+ kernel to control its DOM lifecycle. Embeds do not require `@c15t/integrations`.
40
40
 
41
41
  ## Tag managers
42
42
 
43
- | Integration | Helper | Category | Loading behavior |
44
- | --------------------------------------------- | ------------------ | ----------- | ------------------------------------ |
45
- | [Google Tag Manager](./google-tag-manager.md) | `googleTagManager` | `necessary` | Always loads; signals Google consent |
43
+ | Integration | Helper | Category | Loading behavior |
44
+ | --------------------------------------------- | ------------------ | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
45
+ | [Cloudflare Zaraz](./cloudflare-zaraz.md) | `cloudflareZaraz` | `necessary` | Always runs; syncs purposes, Zaraz runs the tools |
46
+ | [Google Tag Manager](./google-tag-manager.md) | `googleTagManager` | `necessary`; `measurement` or `marketing` when gated | Always loads and signals Google consent by default; `loadMode: 'after-consent'` waits for permission |
46
47
 
47
48
  ## Analytics
48
49
 
49
- | Integration | Helper | Category | Loading behavior |
50
- | --------------------------------------------------------- | ------------------------ | -------------------------- | -------------------------------------------------------- |
51
- | [Google Tag](./google-tag.md) | `gtag` | `measurement or marketing` | Always loads; signals Google consent |
52
- | [Ahrefs Analytics](./ahrefs-analytics.md) | `ahrefsAnalytics` | `measurement` | Waits for effective permission |
53
- | [Adobe Analytics](./adobe-analytics.md) | `adobeAnalytics` | `measurement` | Waits for effective permission |
54
- | [Amplitude](./amplitude.md) | `amplitude` | `measurement` | Waits for effective permission |
55
- | [Cloudflare Web Analytics](./cloudflare-web-analytics.md) | `cloudflareWebAnalytics` | `measurement` | Waits for effective permission |
56
- | [Clearbit](./clearbit.md) | `clearbit` | `marketing` | Waits for effective permission |
57
- | [Microsoft Clarity](./microsoft-clarity.md) | `clarity` | `measurement` | Gated initially; retains SDK and signals storage consent |
58
- | [Databuddy](./databuddy.md) | `databuddy` | `measurement` | Always loads; switches SDK configuration |
59
- | [Fathom Analytics](./fathom-analytics.md) | `fathomAnalytics` | `measurement` | Waits for effective permission |
60
- | [Heap](./heap.md) | `heap` | `measurement` | Waits for effective permission |
61
- | [Matomo Analytics](./matomo-analytics.md) | `matomoAnalytics` | `measurement` | Gated by default; optional consent mode |
62
- | [Mixpanel](./mixpanel-analytics.md) | `mixpanelAnalytics` | `measurement` | Always loads; calls opt-in and opt-out APIs |
63
- | [Hotjar](./hotjar.md) | `hotjar` | `measurement` | Waits for effective permission |
64
- | [Hightouch](./hightouch.md) | `hightouch` | `measurement` | Waits for effective permission |
65
- | [LogRocket](./logrocket.md) | `logRocket` | `measurement` | Waits for effective permission |
66
- | [Plausible Analytics](./plausible-analytics.md) | `plausibleAnalytics` | `measurement` | Waits for effective permission |
67
- | [PostHog](./posthog.md) | `posthog` | `measurement` | Configurable; default always loads |
68
- | [Promptwatch](./promptwatch.md) | `promptwatch` | `measurement` | Waits for effective permission |
69
- | [Pirsch](./pirsch.md) | `pirsch` | `measurement` | Waits for effective permission |
70
- | [RudderStack](./rudderstack.md) | `rudderstack` | `measurement` | Gated by default; optional destination consent mode |
71
- | [Segment](./segment.md) | `segment` | `measurement` | Waits for effective permission |
72
- | [Rybbit Analytics](./rybbit-analytics.md) | `rybbitAnalytics` | `measurement` | Waits for effective permission |
73
- | [Umami Analytics](./umami-analytics.md) | `umamiAnalytics` | `measurement` | Waits for effective permission |
74
- | [Vercel Analytics](./vercel-analytics.md) | `vercelAnalytics` | `measurement` | Waits for effective permission |
75
-
76
- ## Functionality
77
-
78
- | Integration | Helper | Category | Loading behavior |
79
- | ------------------------- | ---------- | --------------- | ------------------------------ |
80
- | [Crisp](./crisp.md) | `crisp` | `functionality` | Waits for effective permission |
81
- | [Intercom](./intercom.md) | `intercom` | `functionality` | Waits for effective permission |
50
+ | Integration | Helper | Category | Loading behavior |
51
+ | --------------------------------------------------------- | ------------------------ | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
52
+ | [Google Tag](./google-tag.md) | `gtag` | `measurement` or `marketing` | Always loads and signals Google consent by default; `loadMode: 'after-consent'` waits for permission |
53
+ | [Ahrefs Analytics](./ahrefs-analytics.md) | `ahrefsAnalytics` | `measurement` | Waits for effective permission |
54
+ | [Adobe Analytics](./adobe-analytics.md) | `adobeAnalytics` | `measurement` | Waits for effective permission |
55
+ | [Amplitude](./amplitude.md) | `amplitude` | `measurement` | Waits for effective permission; opts the SDK out on revocation |
56
+ | [Cloudflare Web Analytics](./cloudflare-web-analytics.md) | `cloudflareWebAnalytics` | `measurement` | Waits for effective permission |
57
+ | [Clearbit](./clearbit.md) | `clearbit` | `marketing` | Waits for effective permission |
58
+ | [Microsoft Clarity](./microsoft-clarity.md) | `clarity` | `measurement` | Gated initially; keeps the SDK and signals storage consent |
59
+ | [Databuddy](./databuddy.md) | `databuddy` | `measurement` | Always loads; switches the SDK's disabled flag |
60
+ | [Fathom Analytics](./fathom-analytics.md) | `fathomAnalytics` | `measurement` | Waits for effective permission |
61
+ | [Heap](./heap.md) | `heap` | `measurement` | Waits for effective permission |
62
+ | [Matomo Analytics](./matomo-analytics.md) | `matomoAnalytics` | `measurement` | Gated by default; optional consent mode |
63
+ | [Mixpanel](./mixpanel-analytics.md) | `mixpanelAnalytics` | `measurement` | Always loads; calls opt-in and opt-out APIs |
64
+ | [OneDollarStats](./one-dollar-stats.md) | `oneDollarStats` | `measurement` | Waits for effective permission |
65
+ | [Hotjar](./hotjar.md) | `hotjar` | `measurement` | Waits for effective permission |
66
+ | [Hightouch](./hightouch.md) | `hightouch` | `measurement` | Waits for effective permission |
67
+ | [LogRocket](./logrocket.md) | `logRocket` | `measurement` | Waits for effective permission |
68
+ | [Plausible Analytics](./plausible-analytics.md) | `plausibleAnalytics` | `measurement` | Waits for effective permission |
69
+ | [PostHog](./posthog.md) | `posthog` | `measurement` | Configurable; defaults to always loading and calling opt-in and opt-out APIs |
70
+ | [Promptwatch](./promptwatch.md) | `promptwatch` | `measurement` | Waits for effective permission |
71
+ | [Pirsch](./pirsch.md) | `pirsch` | `measurement` | Waits for effective permission |
72
+ | [RudderStack](./rudderstack.md) | `rudderstack` | `measurement` | Gated by default; optional destination consent mode |
73
+ | [Segment](./segment.md) | `segment` | `measurement` | Waits for effective permission |
74
+ | [Sentry](./sentry.md) | `sentry` | `necessary`; Replay and user data `measurement` | Configurable; defaults to always loading and loads Replay after permission |
75
+ | [Rybbit Analytics](./rybbit-analytics.md) | `rybbitAnalytics` | `measurement` | Waits for effective permission |
76
+ | [Umami Analytics](./umami-analytics.md) | `umamiAnalytics` | `measurement` | Waits for effective permission |
77
+ | [Vercel Analytics](./vercel-analytics.md) | `vercelAnalytics` | `measurement` | Waits for effective permission |
78
+
79
+ ## Chat and support
80
+
81
+ | Integration | Helper | Category | Loading behavior |
82
+ | ----------------------------- | ----------- | --------------- | ------------------------------ |
83
+ | [Crisp](./crisp.md) | `crisp` | `functionality` | Waits for effective permission |
84
+ | [Front Chat](./front-chat.md) | `frontChat` | `functionality` | Waits for effective permission |
85
+ | [Intercom](./intercom.md) | `intercom` | `functionality` | Waits for effective permission |
86
+
87
+ ## Email and SMS
88
+
89
+ | Integration | Helper | Category | Loading behavior |
90
+ | ----------------------- | --------- | ----------------------------- | ---------------------------------------------------------- |
91
+ | [Klaviyo](./klaviyo.md) | `klaviyo` | `marketing` and `measurement` | Waits for both; optional forms-only mode needs `marketing` |
82
92
 
83
93
  ## Ads and pixels
84
94
 
85
- | Integration | Helper | Category | Loading behavior |
86
- | ---------------------------------------------- | ------------------ | ----------- | ------------------------------------------------- |
87
- | [Meta Pixel](./meta-pixel.md) | `metaPixel` | `marketing` | Waits for effective permission |
88
- | [OpenAI Pixel](./openai-pixel.md) | `openaiPixel` | `marketing` | Gated initially; retains SDK and signals consent |
89
- | [Reddit Pixel](./reddit-pixel.md) | `redditPixel` | `marketing` | Gated initially; retains SDK and switches cookies |
90
- | [TikTok Pixel](./tiktok-pixel.md) | `tiktokPixel` | `marketing` | Gated initially; retains SDK and signals consent |
91
- | [LinkedIn Insight Tag](./linkedin-insights.md) | `linkedinInsights` | `marketing` | Waits for effective permission |
92
- | [Microsoft UET](./microsoft-uet.md) | `microsoftUet` | `marketing` | Always loads; signals ad storage consent |
93
- | [Snapchat Pixel](./snapchat-pixel.md) | `snapchatPixel` | `marketing` | Waits for effective permission |
94
- | [X Pixel](./x-pixel.md) | `xPixel` | `marketing` | Waits for effective permission |
95
-
96
- ## Keep one owner per vendor
97
-
98
- Remove direct snippets, tracking images, framework plugins and duplicate
99
- SDK initializers before adding a helper. A vendor loaded outside c15t is not
100
- controlled by the configuration here. Tag managers and data pipelines can load
101
- other destinations, which need their own consent settings.
102
-
103
- Initial loading and later event calls are separate. Some helpers keep an SDK
104
- loaded to send consent updates. Others remove their script element without a
105
- vendor stop callback. Neither approach can reverse code or requests that already
106
- ran. Guard application events and verify automatic tracking after revocation.
107
-
108
- Use [custom integrations](./building-integrations.md) for a service
109
- without a helper, or an SDK your application already owns. Follow
110
- [consent verification](../guides/verify-consent.md) for fresh sessions, rejection,
111
- acceptance, revocation and navigation.
95
+ | Integration | Helper | Category | Loading behavior |
96
+ | ---------------------------------------------- | ------------------ | ----------- | ---------------------------------------------------------------- |
97
+ | [Meta Pixel](./meta-pixel.md) | `metaPixel` | `marketing` | Gated initially; keeps the SDK and signals consent |
98
+ | [OpenAI Pixel](./openai-pixel.md) | `openaiPixel` | `marketing` | Gated initially; keeps the SDK and signals consent |
99
+ | [Pinterest Tag](./pinterest-tag.md) | `pinterestTag` | `marketing` | Gated initially; keeps the tag and signals consent |
100
+ | [Reddit Pixel](./reddit-pixel.md) | `redditPixel` | `marketing` | Gated initially; keeps the pixel and toggles first-party cookies |
101
+ | [TikTok Pixel](./tiktok-pixel.md) | `tiktokPixel` | `marketing` | Gated initially; keeps the SDK and signals consent |
102
+ | [LinkedIn Insight Tag](./linkedin-insights.md) | `linkedinInsights` | `marketing` | Waits for effective permission |
103
+ | [Microsoft UET](./microsoft-uet.md) | `microsoftUet` | `marketing` | Always loads; signals ad storage consent |
104
+ | [Snapchat Pixel](./snapchat-pixel.md) | `snapchatPixel` | `marketing` | Waits for effective permission |
105
+ | [X Pixel](./x-pixel.md) | `xPixel` | `marketing` | Waits for effective permission |
106
+
107
+ ## Load each vendor once
108
+
109
+ Remove the vendor's own snippet, tracking image, framework plugin or tag
110
+ manager entry before adding its helper. c15t cannot gate a copy it did not
111
+ load. Tag managers and data pipelines such as Segment can load further
112
+ destinations, which need consent settings of their own.
113
+
114
+ Framework packages are loaders too. To move their vendors to c15t, see
115
+ [migrate from `@next/third-parties`](https://v3.c15t.com/docs/frameworks/next/scripts#migrate-from-nextthird-parties)
116
+ for Next.js, and
117
+ [migrate from `@nuxt/scripts`](https://v3.c15t.com/docs/frameworks/nuxt/scripts#migrate-from-nuxtscripts)
118
+ or [migrate from `nuxt-gtag`](https://v3.c15t.com/docs/frameworks/nuxt/scripts#migrate-from-nuxt-gtag)
119
+ for Nuxt.
120
+
121
+ When a visitor turns off a category they had allowed, c15t reloads the page so
122
+ that code which already ran stops. Each vendor guide lists what its helper does
123
+ on revocation and how to check it.
124
+
125
+ ## Vendor switches and cookie cleanup
126
+
127
+ Every helper sets a `vendor` slug, so once you declare that vendor a visitor
128
+ can allow its category and still switch the vendor off. Gating also leaves
129
+ behind the cookies a vendor already wrote; `clearOnRevocation` deletes them
130
+ when their category is denied. Each framework documents both in its Scripts
131
+ and embeds group:
132
+
133
+ | Framework | Vendor consent | Clear on revocation |
134
+ | -------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
135
+ | Next.js | [Vendor consent](https://v3.c15t.com/docs/frameworks/next/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/next/clear-on-revocation) |
136
+ | TanStack Start | [Vendor consent](https://v3.c15t.com/docs/frameworks/tanstack-start/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/tanstack-start/clear-on-revocation) |
137
+ | React | [Vendor consent](../frameworks/react/vendor-consent.md) | [Clear on revocation](../frameworks/react/clear-on-revocation.md) |
138
+ | Nuxt | [Vendor consent](https://v3.c15t.com/docs/frameworks/nuxt/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/nuxt/clear-on-revocation) |
139
+ | Vue | [Vendor consent](https://v3.c15t.com/docs/frameworks/vue/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/vue/clear-on-revocation) |
140
+ | Astro | [Vendor consent](https://v3.c15t.com/docs/frameworks/astro/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/astro/clear-on-revocation) |
141
+ | Svelte | [Vendor consent](https://v3.c15t.com/docs/frameworks/svelte/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/svelte/clear-on-revocation) |
142
+ | SvelteKit | [Vendor consent](https://v3.c15t.com/docs/frameworks/sveltekit/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/sveltekit/clear-on-revocation) |
143
+ | HTML | [Vendor consent](https://v3.c15t.com/docs/frameworks/html/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/html/clear-on-revocation) |
144
+ | JavaScript | [Vendor consent](https://v3.c15t.com/docs/frameworks/javascript/vendor-consent) | [Clear on revocation](https://v3.c15t.com/docs/frameworks/javascript/clear-on-revocation) |
145
+
146
+ ## Send events only to allowed integrations
147
+
148
+ `createEventDispatcher` from `@c15t/integrations/events` sends one named event to
149
+ every registered integration that has an event API and is allowed right now.
150
+ It drops events while measurement is denied, and one vendor's error does not
151
+ stop delivery to the others:
152
+
153
+ ```ts
154
+ import { createEventDispatcher } from '@c15t/integrations/events';
155
+
156
+ const events = createEventDispatcher({
157
+ scripts,
158
+ getSnapshot: () => runtime.kernel.getSnapshot(),
159
+ pageviews: ['segment'],
160
+ });
161
+
162
+ events.track('docs_search', { resultCount: 4 });
163
+ events.pageview(location.pathname);
164
+ ```
165
+
166
+ Pass the same `scripts` you registered and a function that returns the live
167
+ consent snapshot. `track` supports Google Tag Manager, Google Tag, PostHog,
168
+ Mixpanel, Segment, Hightouch, Heap, Amplitude, LogRocket, Adobe Analytics,
169
+ Databuddy, Plausible, Fathom, Pirsch, Microsoft Clarity, Hotjar, Vercel
170
+ Analytics, OneDollarStats, Umami, Rybbit, RudderStack and Matomo.
171
+ `pageview` sends single-page-app page views only to the integrations named in
172
+ `pageviews`: PostHog, Segment or Hightouch. Call it from your router's
173
+ navigation hook. The first call records the path without sending, and repeated
174
+ paths or hash-only changes are skipped.
175
+
176
+ ## Add a vendor without a helper
177
+
178
+ Use [custom integrations](./building-integrations.md) for a
179
+ vendor without a helper, or an SDK your app already loads. Test every
180
+ integration with the [consent verification guide](../guides/verify-consent.md).
@@ -0,0 +1,315 @@
1
+ ---
2
+ title: Pinterest Tag
3
+ description: Load the Pinterest Tag only after marketing consent with the c15t
4
+ pinterestTag helper, guard pintrk event calls, and check it in DevTools.
5
+ icon: pinterest
6
+ group: integrations
7
+ ---
8
+
9
+ ## Configure the Pinterest Tag
10
+
11
+ Copy the numeric tag ID from Pinterest Ads Manager. Remove Pinterest's base
12
+ code and its `<noscript>` image. The helper does not emit that image, because
13
+ it fires without JavaScript and c15t cannot gate it.
14
+
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` |
21
+
22
+ ```ts title="src/consent-scripts.ts"
23
+ import { pinterestTag } from '@c15t/integrations/pinterest-tag';
24
+
25
+ export const scripts = [pinterestTag({ tagId: '2613654212508' })];
26
+ ```
27
+
28
+ ## Register the scripts
29
+
30
+ Complete your [framework quickstart](https://v3.c15t.com/docs/frameworks) first. Keep its Inth
31
+ endpoint, policy, styles and consent UI. Remove the vendor's original script,
32
+ SDK initializer or tag-manager entry, so the vendor loads only through c15t.
33
+
34
+ The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
35
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
36
+ in the Next.js guide, add the helper to that array instead of creating a
37
+ second file.
38
+ The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
39
+ point for your framework below. These are edits to that provider, not a second
40
+ provider.
41
+
42
+ **Next.js**
43
+
44
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
45
+ `next.config.ts`:
46
+
47
+ ```ts title="c15t.config.ts"
48
+ import { defineConsentConfig } from 'c15t/next';
49
+ import { scripts } from './src/consent-scripts';
50
+
51
+ export default defineConsentConfig({ scripts });
52
+ ```
53
+
54
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
55
+ same call. `ConsentRoot` reads the config in the browser, so the layout
56
+ keeps passing only `state`. App Router, Pages Router and static export all
57
+ read the same file. See
58
+ [Next.js scripts and embeds](https://v3.c15t.com/docs/frameworks/next/scripts).
59
+
60
+ **TanStack Start**
61
+
62
+ Import the configuration into your root route and pass it to the existing
63
+ `ConsentRoot` as a top-level prop. Keep the loader from the
64
+ [TanStack Start quickstart](https://v3.c15t.com/docs/frameworks/tanstack-start/quickstart):
65
+
66
+ ```tsx title="src/routes/__root.tsx"
67
+ import { scripts } from '../consent-scripts';
68
+
69
+ <ConsentRoot state={consent} scripts={scripts}>
70
+ ```
71
+
72
+ Import vendor helpers in the root route module, not in a server function.
73
+ A server function's return value must be serializable, and script
74
+ configurations carry callbacks. See
75
+ [TanStack Start scripts](https://v3.c15t.com/docs/frameworks/tanstack-start/scripts).
76
+
77
+ **React**
78
+
79
+ Add the configuration to the existing `ConsentProvider` options, next to
80
+ `mode`:
81
+
82
+ ```tsx title="src/consent.tsx"
83
+ import { scripts } from './consent-scripts';
84
+
85
+ <ConsentProvider options={{ mode, scripts }}>
86
+ ```
87
+
88
+ `mode` is the `manifest()` value from the
89
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
90
+ dialog and preferences link inside the provider. See
91
+ [React scripts and embeds](../frameworks/react/scripts.md).
92
+
93
+ **Nuxt**
94
+
95
+ Register the scripts under the `c15t` key in `app/app.config.ts`. Adjust the
96
+ relative import to where you created `consent-scripts.ts`:
97
+
98
+ ```ts title="app/app.config.ts"
99
+ import { scripts } from '../src/consent-scripts';
100
+
101
+ export default defineAppConfig({
102
+ c15t: { scripts },
103
+ });
104
+ ```
105
+
106
+ The Nuxt module merges this over its options in `nuxt.config.ts` and starts
107
+ one script loader in the browser after hydration, once it has applied the
108
+ visitor's stored choice and privacy signals. Keep `scripts` out of
109
+ `nuxt.config.ts`, which reaches the browser as JSON and drops the vendor
110
+ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
111
+ [Nuxt scripts and embeds](https://v3.c15t.com/docs/frameworks/nuxt/scripts).
112
+
113
+ **Vue**
114
+
115
+ Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
116
+
117
+ ```ts title="src/main.ts"
118
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
119
+ import { scripts } from './consent-scripts';
120
+
121
+ app.use(c15tVue, {
122
+ mode: manifest(),
123
+ scripts,
124
+ });
125
+ ```
126
+
127
+ Keep your existing `mode` and other options. The plugin starts one
128
+ script loader when the app mounts, after it has applied the visitor's stored
129
+ choice. Do not also call `createScriptLoader` from a component. See
130
+ [Vue scripts and embeds](https://v3.c15t.com/docs/frameworks/vue/scripts).
131
+
132
+ **Astro**
133
+
134
+ Add the scripts to the client entrypoint from the
135
+ [Astro quickstart](https://v3.c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
136
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
137
+ If the module already exports scripts, combine the two arrays.
138
+
139
+ ```ts title="src/c15t.client.ts"
140
+ import type { C15tClientOptionsExtension } from 'c15t/astro';
141
+ import { scripts } from './consent-scripts';
142
+
143
+ export default { scripts } satisfies C15tClientOptionsExtension;
144
+ ```
145
+
146
+ Vendor helpers contain callbacks, and the integration options in
147
+ `astro.config.mjs` are serialized into the page, so do not put helpers in
148
+ the integration's `scripts` option. The integration passes the client
149
+ entrypoint to the one runtime every page shares, including across
150
+ `ClientRouter` navigation.
151
+
152
+ **Svelte**
153
+
154
+ Import the scripts in the component that owns your existing provider and
155
+ pass them as a top-level prop:
156
+
157
+ ```svelte title="src/App.svelte"
158
+ <script lang="ts">
159
+ import { ConsentProvider, manifest } from '@c15t/svelte';
160
+ import { scripts } from './consent-scripts';
161
+ </script>
162
+
163
+ <ConsentProvider mode={manifest()} {scripts}>
164
+ <!-- Keep your application, consent UI and preferences link here. -->
165
+ </ConsentProvider>
166
+ ```
167
+
168
+ Retain the styles and consent UI from the [Svelte quickstart](https://v3.c15t.com/docs/frameworks/svelte/quickstart).
169
+ The provider owns the loader and disposes it on unmount.
170
+
171
+ **SvelteKit**
172
+
173
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
174
+ handle and the layout load from the [SvelteKit quickstart](https://v3.c15t.com/docs/frameworks/sveltekit/quickstart).
175
+
176
+ ```svelte title="src/routes/+layout.svelte"
177
+ <script lang="ts">
178
+ import { ConsentRoot } from '@c15t/svelte';
179
+ import { scripts } from '../consent-scripts';
180
+
181
+ let { children, data } = $props();
182
+ </script>
183
+
184
+ <ConsentRoot state={data.consent} {scripts}>
185
+ {@render children()}
186
+ <!-- Keep your consent UI and preferences link here. -->
187
+ </ConsentRoot>
188
+ ```
189
+
190
+ Import vendor helpers in the layout component, not in `+layout.server.ts`:
191
+ a server load cannot send functions to the browser. Prerendered, static and
192
+ SPA-mode pages use the same `scripts` prop. If you pass an externally owned
193
+ `runtime` to the provider, register scripts when creating that runtime instead.
194
+
195
+ **HTML**
196
+
197
+ The helpers in `@c15t/integrations` are ES modules that need a bundler. On a
198
+ page that loads the c15t script tag, paste the vendor's own snippet instead
199
+ and keep it inert until its category is allowed:
200
+
201
+ ```html
202
+ <script type="text/plain" data-c15t-category="measurement">
203
+ // The vendor's snippet, unchanged
204
+ </script>
205
+ ```
206
+
207
+ Use the category this guide names for the vendor. c15t runs the snippet
208
+ once that category is allowed, and reloads the page when the visitor
209
+ withdraws it. Helper options on this page, such as `loadMode`, do not apply
210
+ to a pasted snippet. See [HTML scripts](https://v3.c15t.com/docs/frameworks/html/scripts).
211
+
212
+ **JavaScript**
213
+
214
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
215
+
216
+ ```ts
217
+ import { init, manifest } from '@c15t/browser';
218
+ import { scripts } from './consent-scripts';
219
+
220
+ const consent = init({
221
+ mode: manifest(),
222
+ scripts,
223
+ });
224
+ ```
225
+
226
+ Keep the mode from your quickstart. With
227
+ `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
228
+ A kernel you create yourself needs a loader from
229
+ `c15t/modules/script-loader`. Attach one loader per kernel. See
230
+ [JavaScript scripts](https://v3.c15t.com/docs/frameworks/javascript/scripts).
231
+
232
+ ## Options
233
+
234
+ | Option | Default | Behavior |
235
+ | ---------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
236
+ | `tagId` | Required | Tag ID passed to `pintrk('load', ...)`. The helper trims it. Empty or whitespace-only values log an error and the script does not load. |
237
+ | `loadOptions` | None | Object passed as the third argument to `pintrk('load', ...)`, such as `em` or `external_id` for enhanced match. Pass user data only when your app has the permission it needs. |
238
+ | `trackPageVisit` | `true` | Queues `pintrk('page')` after `load`. Set `false` to send page visits yourself. |
239
+ | `scriptUrl` | `https://s.pinimg.com/ct/core.js` | Loader URL override. A blank value falls back to the default. |
240
+
241
+ ## Loading and revocation
242
+
243
+ `pinterestTag` uses the `marketing` category. Before marketing is allowed, c15t
244
+ defines no `pintrk` function and loads nothing from Pinterest. When marketing
245
+ becomes allowed, the helper queues `load`, `pintrk('setconsent', true)` and
246
+ the page visit, then loads `core.js`.
247
+
248
+ On revocation the helper keeps the tag and calls
249
+ `pintrk('setconsent', false)`, which Pinterest documents as stopping events
250
+ and clearing its first-party storage. If the visitor allows marketing again
251
+ before the page reloads, the helper calls `pintrk('setconsent', true)`.
252
+
253
+ ## Guard your own pintrk calls
254
+
255
+ The helper sends the page visit. Events your code sends, such as `checkout` or
256
+ `lead`, need their own check. After revocation `window.pintrk` still exists, so
257
+ its presence does not mean marketing is allowed. Check the permission first,
258
+ then that the tag has loaded:
259
+
260
+ ```ts title="src/track-checkout.ts"
261
+ export function trackCheckout(marketingAllowed: boolean, orderId: string) {
262
+ if (!marketingAllowed || typeof window.pintrk !== 'function') return;
263
+ window.pintrk('track', 'checkout', {
264
+ currency: 'USD',
265
+ event_id: orderId,
266
+ order_id: orderId,
267
+ value: 99.99,
268
+ line_items: [{ product_id: '1414', product_quantity: 1 }],
269
+ });
270
+ }
271
+ ```
272
+
273
+ Pass the current marketing permission from your framework, for example
274
+ `useConsent('marketing')` in React. Put product details in `line_items`, and
275
+ set `event_id` to deduplicate against the Conversions API. Pinterest reports
276
+ conversions only for its 20 event types. It keeps other event names for
277
+ audience targeting.
278
+
279
+ `@c15t/integrations/pinterest-tag` also exports `pinterestTagEvent`, a typed wrapper
280
+ around `pintrk('track', ...)`. It does nothing until `pintrk` exists and does
281
+ not check permission, so apply the same guard before calling it. Its optional
282
+ third argument receives Pinterest's `(didInit, error)` result.
283
+
284
+ ## Verify the Pinterest Tag
285
+
286
+ After you allow marketing, `core.js` loads from `s.pinimg.com` and Pinterest
287
+ Tag Helper shows the page visit. Trigger one guarded event and check that Tag
288
+ Helper records it. Then revoke marketing. Until the page reloads, calling
289
+ `trackCheckout` sends nothing.
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.