@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,39 +1,53 @@
1
1
  ---
2
2
  title: Mixpanel
3
- description: Configure Mixpanel with c15t v3, understand measurement permission
4
- and verify loading and revocation.
3
+ description: Load the Mixpanel SDK on every page with the c15t mixpanelAnalytics
4
+ helper, which switches Mixpanel tracking on and off with measurement consent,
5
+ and check it in DevTools.
6
+ icon: mixpanel
5
7
  group: integrations
6
8
  ---
7
9
 
8
10
  ## Configure Mixpanel
9
11
 
10
- Replace the example with your 32-character hexadecimal Mixpanel project token. The helper initializes the default Mixpanel instance; named instances and `people.*` queue helpers are outside its contract.
12
+ Copy the 32-character project token from your Mixpanel installation snippet,
13
+ where it is passed to `mixpanel.init`. Remove that snippet.
11
14
 
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` |
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` |
18
21
 
19
22
  ```ts title="src/consent-scripts.ts"
20
- import { mixpanelAnalytics } from '@c15t/scripts/mixpanel-analytics';
21
-
22
- export const scripts = [mixpanelAnalytics({
23
- token: '0123456789abcdef0123456789abcdef',
24
- initOptions: { opt_out_tracking_by_default: true },
25
- })];
23
+ import { mixpanelAnalytics } from '@c15t/integrations/mixpanel-analytics';
24
+
25
+ export const scripts = [
26
+ mixpanelAnalytics({
27
+ token: '0123456789abcdef0123456789abcdef',
28
+ initOptions: { opt_out_tracking_by_default: true },
29
+ }),
30
+ ];
26
31
  ```
27
32
 
33
+ Mixpanel initializes as soon as its SDK loads, before the helper's first
34
+ opt-in or opt-out call. `opt_out_tracking_by_default` starts a visitor who has
35
+ not opted in as opted out, so nothing is tracked during that gap. That
36
+ includes `track` calls your code queued before the SDK loaded, which replay
37
+ during initialization.
38
+
28
39
  ## Register the scripts
29
40
 
30
41
  Complete your [framework quickstart](https://c15t.com/docs/frameworks) first. Keep its Inth
31
42
  endpoint, policy, styles and consent UI. Remove the vendor's original script,
32
- SDK initializer or tag-manager entry so c15t owns loading once.
43
+ SDK initializer or tag-manager entry, so the vendor loads only through c15t.
33
44
 
34
- The `scripts` export in `src/consent-scripts.ts` is a configuration, not an
35
- initializer. Add it to your existing consent owner using the registration point
36
- below. These are partial edits to that owner, not additional providers.
45
+ The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
46
+ quickstart already created a scripts file, such as `lib/scripts.ts` in the
47
+ Next.js guide, add the helper to that array instead of creating a second file.
48
+ The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
49
+ point for your framework below. These are edits to that provider, not a second
50
+ provider.
37
51
 
38
52
  **Next.js**
39
53
 
@@ -54,158 +68,106 @@ router guide. Its manifest, init and save URLs stay in effect. Add
54
68
  </ConsentRoot>
55
69
  ```
56
70
 
57
- For a Pages Router or static-export setup using `ConsentProvider`, add
58
- `scripts` to its existing `options` instead. Keep the router-specific setup
59
- from [Next.js script loading](../frameworks/next/script-loader.md).
71
+ App Router, Pages Router and static export all use this `ConsentRoot` in
72
+ the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
73
+ because a Server Component cannot pass script callbacks to it. See
74
+ [Next.js scripts and embeds](../frameworks/next/scripts.md).
60
75
 
61
76
  **TanStack Start**
62
77
 
63
- In your existing root route component, import the scripts alongside
64
- `ConsentRoot`. Keep the server loader from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart).
78
+ Import the configuration into your root route and pass it to the existing
79
+ `ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
80
+ `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
65
81
 
66
- ```tsx
67
- import { Outlet } from '@tanstack/react-router';
68
- import { ConsentRoot } from 'c15t/tanstack-start';
82
+ ```tsx title="src/routes/__root.tsx"
69
83
  import { scripts } from '../consent-scripts';
70
84
 
71
- function Root() {
72
- const state = Route.useLoaderData();
73
- return (
74
- <ConsentRoot state={state} backendURL={backendURL} initRoute={false} scripts={scripts}>
75
- <Outlet />
76
- {/* Keep your consent banner, dialog and preferences link here. */}
77
- </ConsentRoot>
78
- );
79
- }
85
+ <ConsentRoot
86
+ state={consent}
87
+ backendURL={backendURL}
88
+ initRoute={false}
89
+ scripts={scripts}
90
+ >
80
91
  ```
81
92
 
82
- This edits the existing route. `Route` and `backendURL` come from its setup;
83
- keep the document shell and head components if they are part of your root.
84
- `initRoute={false}` keeps the quickstart's direct-backend initialization.
85
- If your app mounts a consent server route, retain its existing `initRoute`
86
- instead. Do not return script callbacks from a server function or route loader.
93
+ Import vendor helpers in the root route module, not in a server function.
94
+ A server function's return value must be serializable, and script
95
+ configurations carry callbacks. See
96
+ [TanStack Start scripts](../frameworks/tanstack-start/scripts.md).
87
97
 
88
98
  **React**
89
99
 
90
- Import the scripts into your existing provider component:
100
+ Add the configuration to the existing `ConsentProvider` options, next to
101
+ `mode`:
91
102
 
92
- ```ts
93
- import { ConsentProvider } from 'c15t/react';
103
+ ```tsx title="src/consent.tsx"
94
104
  import { scripts } from './consent-scripts';
95
- ```
96
105
 
97
- Keep the existing options and add `scripts`:
98
-
99
- ```tsx
100
- <ConsentProvider options={{ ...consentOptions, scripts }}>
101
- {children}
102
- </ConsentProvider>
106
+ <ConsentProvider options={{ mode, scripts }}>
103
107
  ```
104
108
 
105
- Here `consentOptions` is your existing configuration, including
106
- `mode: hosted({ url: backendURL })`. Keep the banner, dialog and preferences
107
- link inside the provider. See [React script loading](../frameworks/react/script-loader.md).
109
+ `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
110
+ from the [React quickstart](https://c15t.com/docs/frameworks/react/quickstart). Keep the banner,
111
+ dialog and preferences link inside the provider. See
112
+ [React scripts and embeds](../frameworks/react/scripts.md).
108
113
 
109
114
  **Nuxt**
110
115
 
111
- Attach one loader from the root `app.vue`, after the Nuxt module has
112
- started its browser runtime. This keeps vendor callbacks in application code rather
113
- than serialized `nuxt.config.ts` runtime configuration.
116
+ Register the scripts under the `c15t` key in `app/app.config.ts`. Adjust the
117
+ relative import to where you created `consent-scripts.ts`:
114
118
 
115
- ```vue title="app/app.vue"
116
- <script setup lang="ts">
117
- import { onUnmounted } from 'vue';
118
- import { createScriptLoader } from 'c15t/modules/script-loader';
119
+ ```ts title="app/app.config.ts"
119
120
  import { scripts } from '../src/consent-scripts';
120
121
 
121
- const nuxtApp = useNuxtApp();
122
- const kernel = useConsentKernel();
123
- let loader: ReturnType<typeof createScriptLoader> | undefined;
124
-
125
- const removeMountedHook = nuxtApp.hook('app:mounted', () => {
126
- loader = createScriptLoader({ kernel, scripts });
122
+ export default defineAppConfig({
123
+ c15t: { scripts },
127
124
  });
128
- onUnmounted(() => {
129
- removeMountedHook();
130
- loader?.dispose();
131
- });
132
- </script>
133
-
134
- <template>
135
- <ConsentRoot />
136
- <NuxtPage />
137
- </template>
138
125
  ```
139
126
 
140
- Merge the setup code into your root and retain its footer and preferences
141
- link. `useConsentKernel` is auto-imported by the c15t Nuxt module. Adjust the
142
- relative script import if your `app.vue` is at the project root. This loader
143
- waits until the module has applied browser persistence and privacy signals,
144
- then reads the current snapshot and observes future changes. Do not also register these scripts
145
- in another loader. See the [Nuxt quickstart](https://c15t.com/docs/frameworks/nuxt/quickstart).
127
+ The Nuxt module merges this over its options in `nuxt.config.ts` and starts
128
+ one script loader in the browser after hydration, once it has applied the
129
+ visitor's stored choice and privacy signals. Keep `scripts` out of
130
+ `nuxt.config.ts`, which reaches the browser as JSON and drops the vendor
131
+ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
132
+ [Nuxt scripts and embeds](../frameworks/nuxt/scripts.md).
146
133
 
147
134
  **Vue**
148
135
 
149
- Use the kernel already provided by the Vue plugin. Merge this setup into
150
- `App.vue`, whose lifetime covers the application:
136
+ Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
151
137
 
152
- ```vue title="src/App.vue"
153
- <script setup lang="ts">
154
- import { onMounted, onUnmounted } from 'vue';
155
- import { createScriptLoader } from 'c15t/modules/script-loader';
156
- import { useConsentKernel } from 'c15t/vue/vue-plugin';
157
- import ConsentRoot from 'c15t/vue/consent-root';
138
+ ```ts title="src/main.ts"
158
139
  import { scripts } from './consent-scripts';
159
140
 
160
- const kernel = useConsentKernel();
161
- let loader: ReturnType<typeof createScriptLoader> | undefined;
162
-
163
- onMounted(() => {
164
- loader = createScriptLoader({ kernel, scripts });
141
+ app.use(c15tVue, {
142
+ backendURL: 'https://your-project.inth.app',
143
+ scripts,
165
144
  });
166
- onUnmounted(() => loader?.dispose());
167
- </script>
168
-
169
- <template>
170
- <ConsentRoot />
171
- <main>Your application</main>
172
- </template>
173
145
  ```
174
146
 
175
- Keep your existing page content and preferences link. The plugin still owns
176
- the kernel and persistence; this component owns only the vendor loader.
177
- Do not register the same scripts in plugin configuration as well. See the
178
- [Vue quickstart](https://c15t.com/docs/frameworks/vue/quickstart).
147
+ Keep your existing backend URL and other options. The plugin starts one
148
+ script loader when the app mounts, after it has applied the visitor's stored
149
+ choice. Do not also call `createScriptLoader` from a component. See
150
+ [Vue scripts and embeds](../frameworks/vue/scripts.md).
179
151
 
180
152
  **Astro**
181
153
 
182
- Point the existing Astro integration at a client module. Keep its `mode`,
183
- `ui` and framework integration from the [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart).
184
- Import `fileURLToPath` in your Astro configuration:
185
-
186
- ```js title="astro.config.mjs"
187
- import { fileURLToPath } from 'node:url';
188
- ```
154
+ Add the scripts to the client entrypoint from the
155
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
156
+ integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
157
+ framework integration in `astro.config.mjs` as they are. If the module
158
+ already exports scripts, combine the two arrays.
189
159
 
190
- Add this option to the existing `c15t({ ... })` call. Resolve the path from
191
- the configuration file because Astro injects the import into a virtual module:
192
-
193
- ```js
194
- clientEntrypoint: fileURLToPath(new URL('./src/c15t.client.ts', import.meta.url)),
195
- ```
196
-
197
- Export the scripts from that module:
198
-
199
- ```ts title="src/c15t.client.ts"
200
- import type { C15tClientOptionsExtension } from '@c15t/astro';
160
+ ```ts title="src/consent-client.ts"
161
+ import type { C15tClientOptionsExtension } from 'c15t/astro';
201
162
  import { scripts } from './consent-scripts';
202
163
 
203
164
  export default { scripts } satisfies C15tClientOptionsExtension;
204
165
  ```
205
166
 
206
- The integration passes this extension to its shared browser runtime. Vendor
207
- helpers contain callbacks, so do not put them in the serialized `scripts`
208
- option in `astro.config.mjs`. Keep one runtime across consent islands and
167
+ Vendor helpers contain callbacks, and the integration options in
168
+ `astro.config.mjs` are serialized into the page, so do not put helpers in
169
+ the integration's `scripts` option. The integration passes the client
170
+ entrypoint to the one runtime every page shares, including across
209
171
  `ClientRouter` navigation.
210
172
 
211
173
  **Svelte**
@@ -218,9 +180,7 @@ pass them as a top-level prop:
218
180
  import { ConsentManagerProvider, hosted } from '@c15t/svelte';
219
181
  import { scripts } from './consent-scripts';
220
182
 
221
- const backendURL = import.meta.env.VITE_C15T_BACKEND_URL;
222
- if (!backendURL) throw new Error('Set VITE_C15T_BACKEND_URL');
223
- const mode = hosted({ url: backendURL });
183
+ const mode = hosted({ url: 'https://your-project.inth.app' });
224
184
  </script>
225
185
 
226
186
  <ConsentManagerProvider {mode} {scripts}>
@@ -242,7 +202,7 @@ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.
242
202
  import { scripts } from '../consent-scripts';
243
203
 
244
204
  let { children, data } = $props();
245
- const mode = hosted({ url: data.backendURL });
205
+ const mode = hosted({ url: 'https://your-project.inth.app' });
246
206
  </script>
247
207
 
248
208
  <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
@@ -251,45 +211,80 @@ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.
251
211
  </ConsentManagerProvider>
252
212
  ```
253
213
 
254
- Import vendor helpers in the layout component, not in `+layout.server.ts`.
255
- For static hosting, keep your browser-only `mode` setup and omit request
256
- prefetch; the `scripts` prop stays the same. If you pass an externally owned
214
+ Import vendor helpers in the layout component, not in `+layout.server.ts`:
215
+ a server load cannot send functions to the browser. Prerendered, static and
216
+ SPA-mode pages use the same `scripts` prop. If you pass an externally owned
257
217
  `runtime` to the provider, register scripts when creating that runtime instead.
258
218
 
259
- **JavaScript**
260
-
261
- Attach the loader to your existing kernel before calling
262
- `kernel.commands.init()`:
219
+ **HTML**
263
220
 
264
- ```ts
265
- import { createScriptLoader } from 'c15t/modules/script-loader';
266
- import { scripts } from './consent-scripts';
221
+ The helpers in `@c15t/integrations` are ES modules that need a bundler. On a
222
+ page that loads the c15t script tag, paste the vendor's own snippet instead
223
+ and keep it inert until its category is allowed:
267
224
 
268
- const loader = createScriptLoader({ kernel, scripts });
225
+ ```html
226
+ <script type="text/plain" data-c15t-category="measurement">
227
+ // The vendor's snippet, unchanged
228
+ </script>
269
229
  ```
270
230
 
271
- Call `loader.dispose()` when that application instance is destroyed.
272
- `kernel` is the hosted kernel from your quickstart. A provider-owned kernel
273
- already has a loader; do not attach a second one. See
274
- [JavaScript script loading](../frameworks/javascript/script-loader.md).
231
+ Use the category this guide names for the vendor. c15t runs the snippet
232
+ once that category is allowed, and reloads the page when the visitor
233
+ withdraws it. Helper options on this page, such as `loadMode`, do not apply
234
+ to a pasted snippet. See [HTML scripts](../frameworks/html/scripts.md).
275
235
 
276
- ## Options
236
+ **JavaScript**
277
237
 
278
- | Option | Behavior |
279
- | ------------- | ----------------------------------------------------------------------------------------------------- |
280
- | `token` | Required 32-character hexadecimal project token. |
281
- | `initOptions` | Optional JSON-serializable SDK options. This example starts tracking opted out during initialization. |
282
- | `scriptUrl` | Optional loader override. |
238
+ Pass the scripts to `init()` from `@c15t/browser`, next to your backend
239
+ URL:
283
240
 
284
- ## Consent behavior
241
+ ```ts
242
+ import { init } from '@c15t/browser';
243
+ import { scripts } from './consent-scripts';
285
244
 
286
- This helper sets `alwaysLoad: true`: Mixpanel is requested even while measurement is denied. It calls `opt_in_tracking` or `opt_out_tracking` after loading and on permission changes. The example uses [Mixpanel's default opt-out setting](https://docs.mixpanel.com/docs/tracking-methods/sdks/javascript) to cover SDK initialization. This is not a no-request-before-consent setup.
245
+ const consent = init({
246
+ backendURL: 'https://your-project.inth.app',
247
+ scripts,
248
+ });
249
+ ```
287
250
 
288
- ## Verify the integration
251
+ Keep the backend URL from your quickstart. With
252
+ `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
253
+ A kernel you create yourself needs a loader from
254
+ `c15t/modules/script-loader`. Attach one loader per kernel. See
255
+ [JavaScript scripts](../frameworks/javascript/scripts.md).
289
256
 
290
- Expect a loader request before permission. Check that tracking starts only when allowed, that revocation calls opt-out, and that your own `track` calls stop. Remove any separately initialized Mixpanel SDK.
257
+ ## Options
291
258
 
292
- Use a fresh session with an opt-in policy to check initial denial. Then grant
293
- `measurement`, revoke it, and reload. Inspect both network requests and future
294
- application events. Removing a script cannot undo code or requests that already
295
- ran. Follow the [consent verification guide](../guides/verify-consent.md).
259
+ | Option | Default | Behavior |
260
+ | ------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
261
+ | `token` | Required | 32-character hexadecimal project token. Surrounding whitespace is trimmed; any other value throws. |
262
+ | `initOptions` | `{}` | Mixpanel config passed to `init`. Use JSON-serializable values only. |
263
+ | `scriptUrl` | `https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js` | Loader URL override. |
264
+
265
+ ## Loading and revocation
266
+
267
+ `mixpanelAnalytics` uses the `measurement` category with `alwaysLoad`, so the
268
+ Mixpanel SDK loads on every page, before any choice. When the SDK loads, the
269
+ helper calls `mixpanel.opt_in_tracking()` if measurement is allowed and
270
+ `mixpanel.opt_out_tracking()` if not. It calls the matching method again on
271
+ each later consent change. The SDK stays on the page after revocation.
272
+
273
+ Before the SDK loads, the helper queues `track`, `identify`, `reset`,
274
+ `register`, `opt_in_tracking` and `opt_out_tracking` on the default instance.
275
+ Named instances and `people.*` calls are not queued.
276
+
277
+ ## Verify Mixpanel
278
+
279
+ 1. In a private window with an opt-in policy, load the page. The request to
280
+ `cdn.mxpnl.com` appears before you choose. In the console,
281
+ `mixpanel.has_opted_out_tracking()` returns `true`.
282
+ 2. Click Reject, then reload. The SDK loads again and still reports opted
283
+ out. Call `mixpanel.track('Test')`; no tracking request goes to Mixpanel.
284
+ 3. Open Privacy settings and allow measurement. Without a reload,
285
+ `has_opted_out_tracking()` returns `false` and tracking requests appear.
286
+ 4. Turn measurement off again and save. c15t reloads the page, and the new
287
+ page loads the SDK opted out.
288
+
289
+ See the [consent verification guide](../guides/verify-consent.md) for
290
+ navigation and hosting checks.