@c15t/scripts 3.0.0-alpha.1 → 3.0.0-alpha.3

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 (300) hide show
  1. package/AGENTS.md +129 -59
  2. package/README.md +8 -29
  3. package/SKILL.md +33 -0
  4. package/dist/adobe-analytics.js +2 -0
  5. package/dist/ahrefs-analytics.js +2 -0
  6. package/dist/amplitude.js +2 -0
  7. package/dist/clearbit.js +2 -0
  8. package/dist/cloudflare-web-analytics.js +2 -0
  9. package/dist/cloudflare-zaraz.js +2 -0
  10. package/dist/crisp.js +2 -0
  11. package/dist/databuddy.js +2 -0
  12. package/dist/e2e-test-utils.js +2 -137
  13. package/dist/engine/compile.js +2 -89
  14. package/dist/engine/runtime.js +2 -448
  15. package/dist/events.js +2 -0
  16. package/dist/fathom-analytics.js +2 -0
  17. package/dist/front-chat.js +2 -0
  18. package/dist/google-tag-manager.js +2 -0
  19. package/dist/google-tag.js +2 -0
  20. package/dist/heap.js +2 -0
  21. package/dist/hightouch.js +2 -0
  22. package/dist/hotjar.js +2 -0
  23. package/dist/intercom.js +2 -0
  24. package/dist/klaviyo.js +2 -0
  25. package/dist/linkedin-insights.js +2 -0
  26. package/dist/logrocket.js +2 -0
  27. package/dist/matomo-analytics.js +2 -0
  28. package/dist/meta-pixel.js +2 -0
  29. package/dist/microsoft-clarity.js +2 -0
  30. package/dist/microsoft-uet.js +2 -0
  31. package/dist/mixpanel-analytics.js +2 -0
  32. package/dist/one-dollar-stats.js +2 -0
  33. package/dist/openai-pixel.js +2 -0
  34. package/dist/pinterest-tag.js +2 -0
  35. package/dist/pirsch.js +2 -0
  36. package/dist/plausible-analytics.js +2 -0
  37. package/dist/posthog.js +2 -0
  38. package/dist/promptwatch.js +2 -0
  39. package/dist/reddit-pixel.js +2 -0
  40. package/dist/registry.js +2 -392
  41. package/dist/resolve.js +2 -33
  42. package/dist/rudderstack.js +2 -0
  43. package/dist/rybbit-analytics.js +2 -0
  44. package/dist/segment.js +2 -0
  45. package/dist/snapchat-pixel.js +2 -0
  46. package/dist/tiktok-pixel.js +2 -0
  47. package/dist/types.js +2 -16
  48. package/dist/umami-analytics.js +2 -0
  49. package/dist/vendors/_shared/attributes.js +2 -14
  50. package/dist/vendors/_shared/google-consent.js +2 -27
  51. package/dist/vendors/_shared/install-builders.js +2 -21
  52. package/dist/vendors/_shared/required-id.js +2 -0
  53. package/dist/vendors/_shared/script-url.js +2 -28
  54. package/dist/vendors/ads-and-pixels/linkedin-insights.js +2 -48
  55. package/dist/vendors/ads-and-pixels/meta-pixel.js +2 -153
  56. package/dist/vendors/ads-and-pixels/microsoft-uet.js +2 -110
  57. package/dist/vendors/ads-and-pixels/openai-pixel.js +2 -88
  58. package/dist/vendors/ads-and-pixels/pinterest-tag.js +2 -0
  59. package/dist/vendors/ads-and-pixels/reddit-pixel.js +2 -107
  60. package/dist/vendors/ads-and-pixels/snapchat-pixel.js +2 -87
  61. package/dist/vendors/ads-and-pixels/tiktok-pixel.js +2 -89
  62. package/dist/vendors/ads-and-pixels/x-pixel.js +2 -48
  63. package/dist/vendors/analytics/adobe-analytics.js +2 -49
  64. package/dist/vendors/analytics/ahrefs-analytics.js +2 -27
  65. package/dist/vendors/analytics/amplitude.js +2 -134
  66. package/dist/vendors/analytics/clearbit.js +2 -28
  67. package/dist/vendors/analytics/cloudflare-web-analytics.js +2 -32
  68. package/dist/vendors/analytics/databuddy.js +2 -103
  69. package/dist/vendors/analytics/fathom-analytics.js +2 -35
  70. package/dist/vendors/analytics/google-tag.js +2 -66
  71. package/dist/vendors/analytics/heap.js +2 -134
  72. package/dist/vendors/analytics/hightouch.js +2 -109
  73. package/dist/vendors/analytics/hotjar.js +2 -44
  74. package/dist/vendors/analytics/logrocket.js +2 -58
  75. package/dist/vendors/analytics/matomo-analytics.js +2 -191
  76. package/dist/vendors/analytics/microsoft-clarity.js +2 -100
  77. package/dist/vendors/analytics/mixpanel-analytics.js +2 -93
  78. package/dist/vendors/analytics/one-dollar-stats.js +2 -0
  79. package/dist/vendors/analytics/pirsch.js +2 -67
  80. package/dist/vendors/analytics/plausible-analytics.js +2 -81
  81. package/dist/vendors/analytics/posthog.js +2 -200
  82. package/dist/vendors/analytics/promptwatch.js +2 -29
  83. package/dist/vendors/analytics/rudderstack.js +2 -183
  84. package/dist/vendors/analytics/rybbit-analytics.js +2 -63
  85. package/dist/vendors/analytics/segment.js +2 -56
  86. package/dist/vendors/analytics/umami-analytics.js +2 -39
  87. package/dist/vendors/analytics/vercel-analytics.js +2 -53
  88. package/dist/vendors/email-and-sms/klaviyo.js +2 -0
  89. package/dist/vendors/functional/crisp.js +2 -100
  90. package/dist/vendors/functional/front-chat.js +2 -0
  91. package/dist/vendors/functional/intercom.js +2 -45
  92. package/dist/vendors/tag-managers/cloudflare-zaraz.js +2 -98
  93. package/dist/vendors/tag-managers/google-tag-manager.js +2 -59
  94. package/dist/vercel-analytics.js +2 -0
  95. package/dist/x-pixel.js +2 -0
  96. package/dist-types/adobe-analytics.d.ts +2 -0
  97. package/dist-types/ahrefs-analytics.d.ts +2 -0
  98. package/dist-types/amplitude.d.ts +2 -0
  99. package/dist-types/clearbit.d.ts +2 -0
  100. package/dist-types/cloudflare-web-analytics.d.ts +2 -0
  101. package/dist-types/cloudflare-zaraz.d.ts +2 -0
  102. package/dist-types/crisp.d.ts +2 -0
  103. package/dist-types/databuddy.d.ts +2 -0
  104. package/dist-types/e2e-test-utils.d.ts +2 -0
  105. package/dist-types/engine/compile.d.ts +2 -3
  106. package/dist-types/engine/runtime.d.ts +2 -3
  107. package/dist-types/events.d.ts +2 -0
  108. package/dist-types/fathom-analytics.d.ts +2 -0
  109. package/dist-types/front-chat.d.ts +2 -0
  110. package/dist-types/google-tag-manager.d.ts +2 -0
  111. package/dist-types/google-tag.d.ts +2 -0
  112. package/dist-types/heap.d.ts +2 -0
  113. package/dist-types/hightouch.d.ts +2 -0
  114. package/dist-types/hotjar.d.ts +2 -0
  115. package/dist-types/intercom.d.ts +2 -0
  116. package/dist-types/klaviyo.d.ts +2 -0
  117. package/dist-types/linkedin-insights.d.ts +2 -0
  118. package/dist-types/logrocket.d.ts +2 -0
  119. package/dist-types/matomo-analytics.d.ts +2 -0
  120. package/dist-types/meta-pixel.d.ts +2 -0
  121. package/dist-types/microsoft-clarity.d.ts +2 -0
  122. package/dist-types/microsoft-uet.d.ts +2 -0
  123. package/dist-types/mixpanel-analytics.d.ts +2 -0
  124. package/dist-types/one-dollar-stats.d.ts +2 -0
  125. package/dist-types/openai-pixel.d.ts +2 -0
  126. package/dist-types/pinterest-tag.d.ts +2 -0
  127. package/dist-types/pirsch.d.ts +2 -0
  128. package/dist-types/plausible-analytics.d.ts +2 -0
  129. package/dist-types/posthog.d.ts +2 -0
  130. package/dist-types/promptwatch.d.ts +2 -0
  131. package/dist-types/reddit-pixel.d.ts +2 -0
  132. package/dist-types/registry.d.ts +2 -458
  133. package/dist-types/resolve.d.ts +2 -9
  134. package/dist-types/rudderstack.d.ts +2 -0
  135. package/dist-types/rybbit-analytics.d.ts +2 -0
  136. package/dist-types/segment.d.ts +2 -0
  137. package/dist-types/snapchat-pixel.d.ts +2 -0
  138. package/dist-types/tiktok-pixel.d.ts +2 -0
  139. package/dist-types/types.d.ts +2 -314
  140. package/dist-types/umami-analytics.d.ts +2 -0
  141. package/dist-types/vendors/_shared/attributes.d.ts +2 -35
  142. package/dist-types/vendors/_shared/google-consent.d.ts +2 -47
  143. package/dist-types/vendors/_shared/install-builders.d.ts +2 -30
  144. package/dist-types/vendors/_shared/required-id.d.ts +2 -0
  145. package/dist-types/vendors/_shared/script-url.d.ts +2 -75
  146. package/dist-types/vendors/ads-and-pixels/linkedin-insights.d.ts +2 -92
  147. package/dist-types/vendors/ads-and-pixels/meta-pixel.d.ts +2 -289
  148. package/dist-types/vendors/ads-and-pixels/microsoft-uet.d.ts +2 -105
  149. package/dist-types/vendors/ads-and-pixels/openai-pixel.d.ts +2 -211
  150. package/dist-types/vendors/ads-and-pixels/pinterest-tag.d.ts +2 -0
  151. package/dist-types/vendors/ads-and-pixels/reddit-pixel.d.ts +2 -210
  152. package/dist-types/vendors/ads-and-pixels/snapchat-pixel.d.ts +2 -171
  153. package/dist-types/vendors/ads-and-pixels/tiktok-pixel.d.ts +2 -106
  154. package/dist-types/vendors/ads-and-pixels/x-pixel.d.ts +2 -183
  155. package/dist-types/vendors/analytics/adobe-analytics.d.ts +2 -75
  156. package/dist-types/vendors/analytics/ahrefs-analytics.d.ts +2 -62
  157. package/dist-types/vendors/analytics/amplitude.d.ts +2 -234
  158. package/dist-types/vendors/analytics/clearbit.d.ts +2 -60
  159. package/dist-types/vendors/analytics/cloudflare-web-analytics.d.ts +2 -67
  160. package/dist-types/vendors/analytics/databuddy.d.ts +2 -147
  161. package/dist-types/vendors/analytics/fathom-analytics.d.ts +2 -90
  162. package/dist-types/vendors/analytics/google-tag.d.ts +2 -93
  163. package/dist-types/vendors/analytics/heap.d.ts +2 -316
  164. package/dist-types/vendors/analytics/hightouch.d.ts +2 -285
  165. package/dist-types/vendors/analytics/hotjar.d.ts +2 -73
  166. package/dist-types/vendors/analytics/logrocket.d.ts +2 -101
  167. package/dist-types/vendors/analytics/matomo-analytics.d.ts +2 -41
  168. package/dist-types/vendors/analytics/microsoft-clarity.d.ts +2 -97
  169. package/dist-types/vendors/analytics/mixpanel-analytics.d.ts +2 -113
  170. package/dist-types/vendors/analytics/one-dollar-stats.d.ts +2 -0
  171. package/dist-types/vendors/analytics/pirsch.d.ts +2 -96
  172. package/dist-types/vendors/analytics/plausible-analytics.d.ts +2 -122
  173. package/dist-types/vendors/analytics/posthog.d.ts +2 -175
  174. package/dist-types/vendors/analytics/promptwatch.d.ts +2 -36
  175. package/dist-types/vendors/analytics/rudderstack.d.ts +2 -330
  176. package/dist-types/vendors/analytics/rybbit-analytics.d.ts +2 -82
  177. package/dist-types/vendors/analytics/segment.d.ts +2 -158
  178. package/dist-types/vendors/analytics/umami-analytics.d.ts +2 -93
  179. package/dist-types/vendors/analytics/vercel-analytics.d.ts +2 -66
  180. package/dist-types/vendors/email-and-sms/klaviyo.d.ts +2 -0
  181. package/dist-types/vendors/functional/crisp.d.ts +2 -78
  182. package/dist-types/vendors/functional/front-chat.d.ts +2 -0
  183. package/dist-types/vendors/functional/intercom.d.ts +2 -135
  184. package/dist-types/vendors/tag-managers/cloudflare-zaraz.d.ts +2 -39
  185. package/dist-types/vendors/tag-managers/google-tag-manager.d.ts +2 -94
  186. package/dist-types/vercel-analytics.d.ts +2 -0
  187. package/dist-types/x-pixel.d.ts +2 -0
  188. package/docs/README.md +129 -59
  189. package/docs/assets/v3/bottom-bar.png +0 -0
  190. package/docs/assets/v3/brand-card.png +0 -0
  191. package/docs/assets/v3/brand-preferences.png +0 -0
  192. package/docs/assets/v3/choice-wall.png +0 -0
  193. package/docs/assets/v3/headless-bar-html.png +0 -0
  194. package/docs/assets/v3/headless-bar-mobile.png +0 -0
  195. package/docs/assets/v3/headless-bar.png +0 -0
  196. package/docs/assets/v3/slim-bar.png +0 -0
  197. package/docs/concepts/choose-your-setup.md +87 -0
  198. package/docs/concepts/consent-categories.md +84 -0
  199. package/docs/concepts/consent-state.md +357 -0
  200. package/docs/{guides → concepts}/data-fetching.md +31 -27
  201. package/docs/concepts/how-consent-works.md +123 -0
  202. package/docs/concepts/policies.md +71 -0
  203. package/docs/customization/class-names.md +202 -0
  204. package/docs/customization/dark-mode.md +157 -0
  205. package/docs/customization/motion.md +119 -0
  206. package/docs/customization/overview.md +67 -33
  207. package/docs/customization/recipes.md +839 -47
  208. package/docs/customization/slots.md +216 -35
  209. package/docs/customization/stylesheets.md +147 -0
  210. package/docs/customization/tailwind.md +842 -0
  211. package/docs/customization/tokens.md +166 -36
  212. package/docs/customization/translations.md +61 -3
  213. package/docs/frameworks/astro/embeds.md +160 -0
  214. package/docs/frameworks/astro/network-blocker.md +86 -0
  215. package/docs/frameworks/astro/scripts.md +146 -0
  216. package/docs/frameworks/html/embeds.md +142 -0
  217. package/docs/frameworks/html/network-blocker.md +105 -0
  218. package/docs/frameworks/html/scripts.md +164 -0
  219. package/docs/frameworks/javascript/scripts.md +119 -0
  220. package/docs/frameworks/next/embeds.md +90 -0
  221. package/docs/frameworks/next/network-blocker.md +153 -0
  222. package/docs/frameworks/next/scripts.md +196 -0
  223. package/docs/frameworks/nuxt/embeds.md +81 -0
  224. package/docs/frameworks/nuxt/network-blocker.md +97 -0
  225. package/docs/frameworks/nuxt/scripts.md +89 -0
  226. package/docs/frameworks/react/embeds.md +89 -0
  227. package/docs/frameworks/react/network-blocker.md +140 -0
  228. package/docs/frameworks/react/scripts.md +115 -0
  229. package/docs/frameworks/svelte/embeds.md +96 -0
  230. package/docs/frameworks/svelte/network-blocker.md +141 -0
  231. package/docs/frameworks/svelte/scripts.md +137 -0
  232. package/docs/frameworks/sveltekit/embeds.md +103 -0
  233. package/docs/frameworks/sveltekit/network-blocker.md +149 -0
  234. package/docs/frameworks/sveltekit/scripts.md +141 -0
  235. package/docs/frameworks/tanstack-start/embeds.md +96 -0
  236. package/docs/frameworks/tanstack-start/network-blocker.md +145 -0
  237. package/docs/frameworks/tanstack-start/scripts.md +103 -0
  238. package/docs/frameworks/vue/embeds.md +84 -0
  239. package/docs/frameworks/vue/network-blocker.md +99 -0
  240. package/docs/frameworks/vue/scripts.md +93 -0
  241. package/docs/guides/banner-experiments.md +654 -0
  242. package/docs/guides/troubleshooting.md +120 -47
  243. package/docs/guides/verify-consent.md +81 -49
  244. package/docs/integrations/adobe-analytics.md +168 -160
  245. package/docs/integrations/ahrefs-analytics.md +153 -155
  246. package/docs/integrations/amplitude.md +163 -157
  247. package/docs/integrations/building-integrations.md +136 -37
  248. package/docs/integrations/clearbit.md +155 -155
  249. package/docs/integrations/cloudflare-web-analytics.md +157 -157
  250. package/docs/integrations/cloudflare-zaraz.md +210 -262
  251. package/docs/integrations/crisp.md +165 -159
  252. package/docs/integrations/databuddy.md +158 -174
  253. package/docs/integrations/fathom-analytics.md +159 -157
  254. package/docs/integrations/front-chat.md +322 -0
  255. package/docs/integrations/google-maps.md +119 -84
  256. package/docs/integrations/google-tag-manager.md +179 -164
  257. package/docs/integrations/google-tag.md +164 -161
  258. package/docs/integrations/heap.md +164 -156
  259. package/docs/integrations/hightouch.md +162 -158
  260. package/docs/integrations/hotjar.md +160 -156
  261. package/docs/integrations/intercom.md +184 -154
  262. package/docs/integrations/klaviyo.md +486 -0
  263. package/docs/integrations/linkedin-insights.md +175 -151
  264. package/docs/integrations/logrocket.md +161 -157
  265. package/docs/integrations/matomo-analytics.md +189 -179
  266. package/docs/integrations/meta-pixel.md +189 -151
  267. package/docs/integrations/microsoft-clarity.md +164 -156
  268. package/docs/integrations/microsoft-uet.md +149 -155
  269. package/docs/integrations/mixpanel-analytics.md +156 -161
  270. package/docs/integrations/one-dollar-stats.md +306 -0
  271. package/docs/integrations/openai-pixel.md +205 -302
  272. package/docs/integrations/overview.md +143 -83
  273. package/docs/integrations/pinterest-tag.md +329 -0
  274. package/docs/integrations/pirsch.md +170 -160
  275. package/docs/integrations/plausible-analytics.md +173 -159
  276. package/docs/integrations/posthog.md +227 -242
  277. package/docs/integrations/promptwatch.md +155 -155
  278. package/docs/integrations/reddit-pixel.md +186 -158
  279. package/docs/integrations/rudderstack.md +202 -187
  280. package/docs/integrations/rybbit-analytics.md +172 -161
  281. package/docs/integrations/segment.md +183 -155
  282. package/docs/integrations/snapchat-pixel.md +187 -157
  283. package/docs/integrations/tiktok-pixel.md +172 -151
  284. package/docs/integrations/umami-analytics.md +164 -159
  285. package/docs/integrations/vercel-analytics.md +167 -158
  286. package/docs/integrations/x-pixel.md +177 -151
  287. package/docs/integrations/youtube.md +122 -87
  288. package/docs/upgrade-v3.md +490 -354
  289. package/package.json +12 -236
  290. package/dist-types/__tests__/helpers.d.ts +0 -141
  291. package/docs/assets/v3/brand-bar.png +0 -0
  292. package/docs/assets/v3/mobile-card.png +0 -0
  293. package/docs/assets/v3/preferences.png +0 -0
  294. package/docs/frameworks/javascript/script-loader.md +0 -94
  295. package/docs/frameworks/next/script-loader.md +0 -210
  296. package/docs/frameworks/react/script-loader.md +0 -63
  297. package/docs/guides/consent-state.md +0 -60
  298. package/docs/guides/deployment-modes.md +0 -75
  299. package/docs/integrations/clear-on-revocation.md +0 -167
  300. package/docs/integrations/granular-consent.md +0 -208
@@ -1,38 +1,48 @@
1
1
  ---
2
2
  title: Adobe Analytics
3
- description: Configure Adobe Analytics with c15t v3, understand measurement
4
- permission and verify loading and revocation.
3
+ description: Load an Adobe Data Collection Tags property only after measurement
4
+ consent with the c15t adobeAnalytics helper, and check its extensions in
5
+ DevTools.
6
+ icon: adobe-analytics
5
7
  group: integrations
6
8
  ---
7
9
 
8
10
  ## Configure Adobe Analytics
9
11
 
10
- Copy the full HTTPS embed URL for your Adobe Data Collection property environment. Replace the example URL; Adobe does not have a shared Analytics loader that only needs an account ID.
12
+ Copy the full embed URL for your property environment from the Adobe Data
13
+ Collection embed code. Adobe has no shared loader that takes only an account
14
+ ID, so `adobeAnalytics` needs the whole URL. Remove the original embed code.
11
15
 
12
- | Package manager | Command |
13
- | :-------------- | :-------------------------- |
14
- | npm | `npm install @c15t/scripts` |
15
- | pnpm | `pnpm add @c15t/scripts` |
16
- | yarn | `yarn add @c15t/scripts` |
17
- | bun | `bun add @c15t/scripts` |
16
+ | Package manager | Command |
17
+ | :-------------- | :------------------------------------- |
18
+ | npm | `npm install @c15t/integrations@alpha` |
19
+ | pnpm | `pnpm add @c15t/integrations@alpha` |
20
+ | yarn | `yarn add @c15t/integrations@alpha` |
21
+ | bun | `bun add @c15t/integrations@alpha` |
18
22
 
19
23
  ```ts title="src/consent-scripts.ts"
20
- import { adobeAnalytics } from '@c15t/scripts/adobe-analytics';
21
-
22
- export const scripts = [adobeAnalytics({
23
- scriptUrl: 'https://assets.adobedtm.com/YOUR_ORG/YOUR_PROPERTY/launch-production.min.js',
24
- })];
24
+ import { adobeAnalytics } from '@c15t/integrations/adobe-analytics';
25
+
26
+ export const scripts = [
27
+ adobeAnalytics({
28
+ scriptUrl:
29
+ 'https://assets.adobedtm.com/YOUR_ORG/YOUR_PROPERTY/launch-production.min.js',
30
+ }),
31
+ ];
25
32
  ```
26
33
 
27
34
  ## Register the scripts
28
35
 
29
36
  Complete your [framework quickstart](https://c15t.com/docs/frameworks) first. Keep its Inth
30
37
  endpoint, policy, styles and consent UI. Remove the vendor's original script,
31
- SDK initializer or tag-manager entry so c15t owns loading once.
38
+ SDK initializer or tag-manager entry, so the vendor loads only through c15t.
32
39
 
33
- The `scripts` export in `src/consent-scripts.ts` is a configuration, not an
34
- initializer. Add it to your existing consent owner using the registration point
35
- below. These are partial edits to that owner, not additional providers.
40
+ The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
41
+ quickstart already created a scripts file, such as `lib/scripts.ts` in the
42
+ Next.js guide, add the helper to that array instead of creating a 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.
36
46
 
37
47
  **Next.js**
38
48
 
@@ -53,158 +63,106 @@ router guide. Its manifest, init and save URLs stay in effect. Add
53
63
  </ConsentRoot>
54
64
  ```
55
65
 
56
- For a Pages Router or static-export setup using `ConsentProvider`, add
57
- `scripts` to its existing `options` instead. Keep the router-specific setup
58
- from [Next.js script loading](../frameworks/next/script-loader.md).
66
+ App Router, Pages Router and static export all use this `ConsentRoot` in
67
+ the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
68
+ because a Server Component cannot pass script callbacks to it. See
69
+ [Next.js scripts and embeds](../frameworks/next/scripts.md).
59
70
 
60
71
  **TanStack Start**
61
72
 
62
- In your existing root route component, import the scripts alongside
63
- `ConsentRoot`. Keep the server loader from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart).
73
+ Import the configuration into your root route and pass it to the existing
74
+ `ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
75
+ `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
64
76
 
65
- ```tsx
66
- import { Outlet } from '@tanstack/react-router';
67
- import { ConsentRoot } from 'c15t/tanstack-start';
77
+ ```tsx title="src/routes/__root.tsx"
68
78
  import { scripts } from '../consent-scripts';
69
79
 
70
- function Root() {
71
- const state = Route.useLoaderData();
72
- return (
73
- <ConsentRoot state={state} backendURL={backendURL} initRoute={false} scripts={scripts}>
74
- <Outlet />
75
- {/* Keep your consent banner, dialog and preferences link here. */}
76
- </ConsentRoot>
77
- );
78
- }
80
+ <ConsentRoot
81
+ state={consent}
82
+ backendURL={backendURL}
83
+ initRoute={false}
84
+ scripts={scripts}
85
+ >
79
86
  ```
80
87
 
81
- This edits the existing route. `Route` and `backendURL` come from its setup;
82
- keep the document shell and head components if they are part of your root.
83
- `initRoute={false}` keeps the quickstart's direct-backend initialization.
84
- If your app mounts a consent server route, retain its existing `initRoute`
85
- instead. Do not return script callbacks from a server function or route loader.
88
+ Import vendor helpers in the root route module, not in a server function.
89
+ A server function's return value must be serializable, and script
90
+ configurations carry callbacks. See
91
+ [TanStack Start scripts](../frameworks/tanstack-start/scripts.md).
86
92
 
87
93
  **React**
88
94
 
89
- Import the scripts into your existing provider component:
95
+ Add the configuration to the existing `ConsentProvider` options, next to
96
+ `mode`:
90
97
 
91
- ```ts
92
- import { ConsentProvider } from 'c15t/react';
98
+ ```tsx title="src/consent.tsx"
93
99
  import { scripts } from './consent-scripts';
94
- ```
95
100
 
96
- Keep the existing options and add `scripts`:
97
-
98
- ```tsx
99
- <ConsentProvider options={{ ...consentOptions, scripts }}>
100
- {children}
101
- </ConsentProvider>
101
+ <ConsentProvider options={{ mode, scripts }}>
102
102
  ```
103
103
 
104
- Here `consentOptions` is your existing configuration, including
105
- `mode: hosted({ url: backendURL })`. Keep the banner, dialog and preferences
106
- link inside the provider. See [React script loading](../frameworks/react/script-loader.md).
104
+ `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
105
+ from the [React quickstart](https://c15t.com/docs/frameworks/react/quickstart). Keep the banner,
106
+ dialog and preferences link inside the provider. See
107
+ [React scripts and embeds](../frameworks/react/scripts.md).
107
108
 
108
109
  **Nuxt**
109
110
 
110
- Attach one loader from the root `app.vue`, after the Nuxt module has
111
- started its browser runtime. This keeps vendor callbacks in application code rather
112
- than serialized `nuxt.config.ts` runtime configuration.
111
+ Register the scripts under the `c15t` key in `app/app.config.ts`. Adjust the
112
+ relative import to where you created `consent-scripts.ts`:
113
113
 
114
- ```vue title="app/app.vue"
115
- <script setup lang="ts">
116
- import { onUnmounted } from 'vue';
117
- import { createScriptLoader } from 'c15t/modules/script-loader';
114
+ ```ts title="app/app.config.ts"
118
115
  import { scripts } from '../src/consent-scripts';
119
116
 
120
- const nuxtApp = useNuxtApp();
121
- const kernel = useConsentKernel();
122
- let loader: ReturnType<typeof createScriptLoader> | undefined;
123
-
124
- const removeMountedHook = nuxtApp.hook('app:mounted', () => {
125
- loader = createScriptLoader({ kernel, scripts });
117
+ export default defineAppConfig({
118
+ c15t: { scripts },
126
119
  });
127
- onUnmounted(() => {
128
- removeMountedHook();
129
- loader?.dispose();
130
- });
131
- </script>
132
-
133
- <template>
134
- <ConsentRoot />
135
- <NuxtPage />
136
- </template>
137
120
  ```
138
121
 
139
- Merge the setup code into your root and retain its footer and preferences
140
- link. `useConsentKernel` is auto-imported by the c15t Nuxt module. Adjust the
141
- relative script import if your `app.vue` is at the project root. This loader
142
- waits until the module has applied browser persistence and privacy signals,
143
- then reads the current snapshot and observes future changes. Do not also register these scripts
144
- in another loader. See the [Nuxt quickstart](https://c15t.com/docs/frameworks/nuxt/quickstart).
122
+ The Nuxt module merges this over its options in `nuxt.config.ts` and starts
123
+ one script loader in the browser after hydration, once it has applied the
124
+ visitor's stored choice and privacy signals. Keep `scripts` out of
125
+ `nuxt.config.ts`, which reaches the browser as JSON and drops the vendor
126
+ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
127
+ [Nuxt scripts and embeds](../frameworks/nuxt/scripts.md).
145
128
 
146
129
  **Vue**
147
130
 
148
- Use the kernel already provided by the Vue plugin. Merge this setup into
149
- `App.vue`, whose lifetime covers the application:
131
+ Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
150
132
 
151
- ```vue title="src/App.vue"
152
- <script setup lang="ts">
153
- import { onMounted, onUnmounted } from 'vue';
154
- import { createScriptLoader } from 'c15t/modules/script-loader';
155
- import { useConsentKernel } from 'c15t/vue/vue-plugin';
156
- import ConsentRoot from 'c15t/vue/consent-root';
133
+ ```ts title="src/main.ts"
157
134
  import { scripts } from './consent-scripts';
158
135
 
159
- const kernel = useConsentKernel();
160
- let loader: ReturnType<typeof createScriptLoader> | undefined;
161
-
162
- onMounted(() => {
163
- loader = createScriptLoader({ kernel, scripts });
136
+ app.use(c15tVue, {
137
+ backendURL: 'https://your-project.inth.app',
138
+ scripts,
164
139
  });
165
- onUnmounted(() => loader?.dispose());
166
- </script>
167
-
168
- <template>
169
- <ConsentRoot />
170
- <main>Your application</main>
171
- </template>
172
140
  ```
173
141
 
174
- Keep your existing page content and preferences link. The plugin still owns
175
- the kernel and persistence; this component owns only the vendor loader.
176
- Do not register the same scripts in plugin configuration as well. See the
177
- [Vue quickstart](https://c15t.com/docs/frameworks/vue/quickstart).
142
+ Keep your existing backend URL and other options. The plugin starts one
143
+ script loader when the app mounts, after it has applied the visitor's stored
144
+ choice. Do not also call `createScriptLoader` from a component. See
145
+ [Vue scripts and embeds](../frameworks/vue/scripts.md).
178
146
 
179
147
  **Astro**
180
148
 
181
- Point the existing Astro integration at a client module. Keep its `mode`,
182
- `ui` and framework integration from the [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart).
183
- Import `fileURLToPath` in your Astro configuration:
184
-
185
- ```js title="astro.config.mjs"
186
- import { fileURLToPath } from 'node:url';
187
- ```
188
-
189
- Add this option to the existing `c15t({ ... })` call. Resolve the path from
190
- the configuration file because Astro injects the import into a virtual module:
191
-
192
- ```js
193
- clientEntrypoint: fileURLToPath(new URL('./src/c15t.client.ts', import.meta.url)),
194
- ```
195
-
196
- Export the scripts from that module:
149
+ Add the scripts to the client entrypoint from the
150
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
151
+ integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
152
+ framework integration in `astro.config.mjs` as they are. If the module
153
+ already exports scripts, combine the two arrays.
197
154
 
198
- ```ts title="src/c15t.client.ts"
199
- import type { C15tClientOptionsExtension } from '@c15t/astro';
155
+ ```ts title="src/consent-client.ts"
156
+ import type { C15tClientOptionsExtension } from 'c15t/astro';
200
157
  import { scripts } from './consent-scripts';
201
158
 
202
159
  export default { scripts } satisfies C15tClientOptionsExtension;
203
160
  ```
204
161
 
205
- The integration passes this extension to its shared browser runtime. Vendor
206
- helpers contain callbacks, so do not put them in the serialized `scripts`
207
- option in `astro.config.mjs`. Keep one runtime across consent islands and
162
+ Vendor helpers contain callbacks, and the integration options in
163
+ `astro.config.mjs` are serialized into the page, so do not put helpers in
164
+ the integration's `scripts` option. The integration passes the client
165
+ entrypoint to the one runtime every page shares, including across
208
166
  `ClientRouter` navigation.
209
167
 
210
168
  **Svelte**
@@ -217,9 +175,7 @@ pass them as a top-level prop:
217
175
  import { ConsentManagerProvider, hosted } from '@c15t/svelte';
218
176
  import { scripts } from './consent-scripts';
219
177
 
220
- const backendURL = import.meta.env.VITE_C15T_BACKEND_URL;
221
- if (!backendURL) throw new Error('Set VITE_C15T_BACKEND_URL');
222
- const mode = hosted({ url: backendURL });
178
+ const mode = hosted({ url: 'https://your-project.inth.app' });
223
179
  </script>
224
180
 
225
181
  <ConsentManagerProvider {mode} {scripts}>
@@ -241,7 +197,7 @@ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.
241
197
  import { scripts } from '../consent-scripts';
242
198
 
243
199
  let { children, data } = $props();
244
- const mode = hosted({ url: data.backendURL });
200
+ const mode = hosted({ url: 'https://your-project.inth.app' });
245
201
  </script>
246
202
 
247
203
  <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
@@ -250,45 +206,97 @@ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.
250
206
  </ConsentManagerProvider>
251
207
  ```
252
208
 
253
- Import vendor helpers in the layout component, not in `+layout.server.ts`.
254
- For static hosting, keep your browser-only `mode` setup and omit request
255
- prefetch; the `scripts` prop stays the same. If you pass an externally owned
209
+ Import vendor helpers in the layout component, not in `+layout.server.ts`:
210
+ a server load cannot send functions to the browser. Prerendered, static and
211
+ SPA-mode pages use the same `scripts` prop. If you pass an externally owned
256
212
  `runtime` to the provider, register scripts when creating that runtime instead.
257
213
 
258
- **JavaScript**
259
-
260
- Attach the loader to your existing kernel before calling
261
- `kernel.commands.init()`:
214
+ **HTML**
262
215
 
263
- ```ts
264
- import { createScriptLoader } from 'c15t/modules/script-loader';
265
- import { scripts } from './consent-scripts';
216
+ The helpers in `@c15t/integrations` are ES modules that need a bundler. On a
217
+ page that loads the c15t script tag, paste the vendor's own snippet instead
218
+ and keep it inert until its category is allowed:
266
219
 
267
- const loader = createScriptLoader({ kernel, scripts });
220
+ ```html
221
+ <script type="text/plain" data-c15t-category="measurement">
222
+ // The vendor's snippet, unchanged
223
+ </script>
268
224
  ```
269
225
 
270
- Call `loader.dispose()` when that application instance is destroyed.
271
- `kernel` is the hosted kernel from your quickstart. A provider-owned kernel
272
- already has a loader; do not attach a second one. See
273
- [JavaScript script loading](../frameworks/javascript/script-loader.md).
226
+ Use the category this guide names for the vendor. c15t runs the snippet
227
+ once that category is allowed, and reloads the page when the visitor
228
+ withdraws it. Helper options on this page, such as `loadMode`, do not apply
229
+ to a pasted snippet. See [HTML scripts](../frameworks/html/scripts.md).
274
230
 
275
- ## Options
231
+ **JavaScript**
276
232
 
277
- | Option | Behavior |
278
- | -------------------- | ------------------------------------------------------------------------ |
279
- | `scriptUrl` | Required full HTTPS property embed URL. Invalid or non-HTTPS URLs throw. |
280
- | `async` | Defaults to `true`. |
281
- | `seedAdobeDataLayer` | Defaults to `true`. Creates `window.adobeDataLayer` only if absent. |
233
+ Pass the scripts to `init()` from `@c15t/browser`, next to your backend
234
+ URL:
282
235
 
283
- ## Consent behavior
236
+ ```ts
237
+ import { init } from '@c15t/browser';
238
+ import { scripts } from './consent-scripts';
284
239
 
285
- Measurement permission gates the property loader. Rules and extensions inside the Adobe property may load other services. Review those destinations and their purposes too; this helper does not assign separate consent categories to individual Adobe rules.
240
+ const consent = init({
241
+ backendURL: 'https://your-project.inth.app',
242
+ scripts,
243
+ });
244
+ ```
286
245
 
287
- ## Verify the integration
246
+ Keep the backend URL from your quickstart. With
247
+ `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
248
+ A kernel you create yourself needs a loader from
249
+ `c15t/modules/script-loader`. Attach one loader per kernel. See
250
+ [JavaScript scripts](../frameworks/javascript/scripts.md).
288
251
 
289
- Confirm the environment URL is correct and inspect requests from every enabled extension. Check that revoking permission stops application data-layer events; the helper does not call an Adobe shutdown API.
252
+ ## Options
290
253
 
291
- Use a fresh session with an opt-in policy to check initial denial. Then grant
292
- `measurement`, revoke it, and reload. Inspect both network requests and future
293
- application events. Removing a script cannot undo code or requests that already
294
- ran. Follow the [consent verification guide](../guides/verify-consent.md).
254
+ | Option | Default | Behavior |
255
+ | -------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
256
+ | `scriptUrl` | Required | Full `https:` embed URL of the Tags property environment. Self-hosted embeds work. The helper trims the value. Empty, unparseable and non-`https:` URLs throw. |
257
+ | `async` | `true` | Loads the Tags library asynchronously. Set `false` only for a legacy synchronous deployment. |
258
+ | `seedAdobeDataLayer` | `true` | Sets `window.adobeDataLayer` to an empty array before the library loads, only when the global is undefined. |
259
+
260
+ ## Loading and revocation
261
+
262
+ `adobeAnalytics` uses the `measurement` category. The property embed loads
263
+ only while measurement is allowed. On revocation the helper removes the script
264
+ element and calls no Adobe API.
265
+
266
+ The property can load Adobe Analytics, Web SDK and other extensions through its
267
+ rules. c15t sees only the embed script, so every extension runs under the one
268
+ measurement permission. If a rule loads a service with another purpose, such
269
+ as advertising, configure that rule in Adobe to respect your consent model too.
270
+
271
+ ## Verify Adobe Analytics
272
+
273
+ After you allow measurement, the request for your embed URL appears, then the
274
+ requests from the extensions the property enables. `window._satellite` exists
275
+ once the Tags library runs. Check that each extension's requests match the
276
+ measurement purpose.
277
+
278
+ Test in a private window with an opt-in policy. Open DevTools Network, disable
279
+ the cache and filter by the vendor's domain:
280
+
281
+ 1. Load the page. No request goes to the vendor before you choose.
282
+ 2. Click Reject, then reload. There is still no vendor request.
283
+ 3. Open Privacy settings and allow the helper's category. The vendor script
284
+ loads without a page reload.
285
+ 4. Turn the category off again and save. c15t reloads the page, and the new
286
+ page makes no vendor request.
287
+
288
+ c15t reloads on revocation because removing a script element does not stop
289
+ code that already ran. The vendor's listeners, timers and queued events stay
290
+ alive until the page unloads. If you set `reloadOnConsentRevoked: false`, stop
291
+ the vendor yourself. Register a callback-only script whose `onConsentChange`
292
+ calls the vendor's opt-out API, as shown in
293
+ [custom integrations](./building-integrations.md), and check the
294
+ permission before each of your own event calls. The reload does not delete
295
+ cookies the vendor already set; see
296
+ [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
297
+
298
+ The helper sets `vendor` to its script ID, so once you declare that vendor a
299
+ visitor can turn it off inside an allowed category. See
300
+ [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
301
+ [consent verification guide](../guides/verify-consent.md) covers navigation,
302
+ expiry and hosting checks.