@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.
- package/AGENTS.md +129 -59
- package/README.md +8 -29
- package/SKILL.md +33 -0
- package/dist/adobe-analytics.js +2 -0
- package/dist/ahrefs-analytics.js +2 -0
- package/dist/amplitude.js +2 -0
- package/dist/clearbit.js +2 -0
- package/dist/cloudflare-web-analytics.js +2 -0
- package/dist/cloudflare-zaraz.js +2 -0
- package/dist/crisp.js +2 -0
- package/dist/databuddy.js +2 -0
- package/dist/e2e-test-utils.js +2 -137
- package/dist/engine/compile.js +2 -89
- package/dist/engine/runtime.js +2 -448
- package/dist/events.js +2 -0
- package/dist/fathom-analytics.js +2 -0
- package/dist/front-chat.js +2 -0
- package/dist/google-tag-manager.js +2 -0
- package/dist/google-tag.js +2 -0
- package/dist/heap.js +2 -0
- package/dist/hightouch.js +2 -0
- package/dist/hotjar.js +2 -0
- package/dist/intercom.js +2 -0
- package/dist/klaviyo.js +2 -0
- package/dist/linkedin-insights.js +2 -0
- package/dist/logrocket.js +2 -0
- package/dist/matomo-analytics.js +2 -0
- package/dist/meta-pixel.js +2 -0
- package/dist/microsoft-clarity.js +2 -0
- package/dist/microsoft-uet.js +2 -0
- package/dist/mixpanel-analytics.js +2 -0
- package/dist/one-dollar-stats.js +2 -0
- package/dist/openai-pixel.js +2 -0
- package/dist/pinterest-tag.js +2 -0
- package/dist/pirsch.js +2 -0
- package/dist/plausible-analytics.js +2 -0
- package/dist/posthog.js +2 -0
- package/dist/promptwatch.js +2 -0
- package/dist/reddit-pixel.js +2 -0
- package/dist/registry.js +2 -392
- package/dist/resolve.js +2 -33
- package/dist/rudderstack.js +2 -0
- package/dist/rybbit-analytics.js +2 -0
- package/dist/segment.js +2 -0
- package/dist/snapchat-pixel.js +2 -0
- package/dist/tiktok-pixel.js +2 -0
- package/dist/types.js +2 -16
- package/dist/umami-analytics.js +2 -0
- package/dist/vendors/_shared/attributes.js +2 -14
- package/dist/vendors/_shared/google-consent.js +2 -27
- package/dist/vendors/_shared/install-builders.js +2 -21
- package/dist/vendors/_shared/required-id.js +2 -0
- package/dist/vendors/_shared/script-url.js +2 -28
- package/dist/vendors/ads-and-pixels/linkedin-insights.js +2 -48
- package/dist/vendors/ads-and-pixels/meta-pixel.js +2 -153
- package/dist/vendors/ads-and-pixels/microsoft-uet.js +2 -110
- package/dist/vendors/ads-and-pixels/openai-pixel.js +2 -88
- package/dist/vendors/ads-and-pixels/pinterest-tag.js +2 -0
- package/dist/vendors/ads-and-pixels/reddit-pixel.js +2 -107
- package/dist/vendors/ads-and-pixels/snapchat-pixel.js +2 -87
- package/dist/vendors/ads-and-pixels/tiktok-pixel.js +2 -89
- package/dist/vendors/ads-and-pixels/x-pixel.js +2 -48
- package/dist/vendors/analytics/adobe-analytics.js +2 -49
- package/dist/vendors/analytics/ahrefs-analytics.js +2 -27
- package/dist/vendors/analytics/amplitude.js +2 -134
- package/dist/vendors/analytics/clearbit.js +2 -28
- package/dist/vendors/analytics/cloudflare-web-analytics.js +2 -32
- package/dist/vendors/analytics/databuddy.js +2 -103
- package/dist/vendors/analytics/fathom-analytics.js +2 -35
- package/dist/vendors/analytics/google-tag.js +2 -66
- package/dist/vendors/analytics/heap.js +2 -134
- package/dist/vendors/analytics/hightouch.js +2 -109
- package/dist/vendors/analytics/hotjar.js +2 -44
- package/dist/vendors/analytics/logrocket.js +2 -58
- package/dist/vendors/analytics/matomo-analytics.js +2 -191
- package/dist/vendors/analytics/microsoft-clarity.js +2 -100
- package/dist/vendors/analytics/mixpanel-analytics.js +2 -93
- package/dist/vendors/analytics/one-dollar-stats.js +2 -0
- package/dist/vendors/analytics/pirsch.js +2 -67
- package/dist/vendors/analytics/plausible-analytics.js +2 -81
- package/dist/vendors/analytics/posthog.js +2 -200
- package/dist/vendors/analytics/promptwatch.js +2 -29
- package/dist/vendors/analytics/rudderstack.js +2 -183
- package/dist/vendors/analytics/rybbit-analytics.js +2 -63
- package/dist/vendors/analytics/segment.js +2 -56
- package/dist/vendors/analytics/umami-analytics.js +2 -39
- package/dist/vendors/analytics/vercel-analytics.js +2 -53
- package/dist/vendors/email-and-sms/klaviyo.js +2 -0
- package/dist/vendors/functional/crisp.js +2 -100
- package/dist/vendors/functional/front-chat.js +2 -0
- package/dist/vendors/functional/intercom.js +2 -45
- package/dist/vendors/tag-managers/cloudflare-zaraz.js +2 -98
- package/dist/vendors/tag-managers/google-tag-manager.js +2 -59
- package/dist/vercel-analytics.js +2 -0
- package/dist/x-pixel.js +2 -0
- package/dist-types/adobe-analytics.d.ts +2 -0
- package/dist-types/ahrefs-analytics.d.ts +2 -0
- package/dist-types/amplitude.d.ts +2 -0
- package/dist-types/clearbit.d.ts +2 -0
- package/dist-types/cloudflare-web-analytics.d.ts +2 -0
- package/dist-types/cloudflare-zaraz.d.ts +2 -0
- package/dist-types/crisp.d.ts +2 -0
- package/dist-types/databuddy.d.ts +2 -0
- package/dist-types/e2e-test-utils.d.ts +2 -0
- package/dist-types/engine/compile.d.ts +2 -3
- package/dist-types/engine/runtime.d.ts +2 -3
- package/dist-types/events.d.ts +2 -0
- package/dist-types/fathom-analytics.d.ts +2 -0
- package/dist-types/front-chat.d.ts +2 -0
- package/dist-types/google-tag-manager.d.ts +2 -0
- package/dist-types/google-tag.d.ts +2 -0
- package/dist-types/heap.d.ts +2 -0
- package/dist-types/hightouch.d.ts +2 -0
- package/dist-types/hotjar.d.ts +2 -0
- package/dist-types/intercom.d.ts +2 -0
- package/dist-types/klaviyo.d.ts +2 -0
- package/dist-types/linkedin-insights.d.ts +2 -0
- package/dist-types/logrocket.d.ts +2 -0
- package/dist-types/matomo-analytics.d.ts +2 -0
- package/dist-types/meta-pixel.d.ts +2 -0
- package/dist-types/microsoft-clarity.d.ts +2 -0
- package/dist-types/microsoft-uet.d.ts +2 -0
- package/dist-types/mixpanel-analytics.d.ts +2 -0
- package/dist-types/one-dollar-stats.d.ts +2 -0
- package/dist-types/openai-pixel.d.ts +2 -0
- package/dist-types/pinterest-tag.d.ts +2 -0
- package/dist-types/pirsch.d.ts +2 -0
- package/dist-types/plausible-analytics.d.ts +2 -0
- package/dist-types/posthog.d.ts +2 -0
- package/dist-types/promptwatch.d.ts +2 -0
- package/dist-types/reddit-pixel.d.ts +2 -0
- package/dist-types/registry.d.ts +2 -458
- package/dist-types/resolve.d.ts +2 -9
- package/dist-types/rudderstack.d.ts +2 -0
- package/dist-types/rybbit-analytics.d.ts +2 -0
- package/dist-types/segment.d.ts +2 -0
- package/dist-types/snapchat-pixel.d.ts +2 -0
- package/dist-types/tiktok-pixel.d.ts +2 -0
- package/dist-types/types.d.ts +2 -314
- package/dist-types/umami-analytics.d.ts +2 -0
- package/dist-types/vendors/_shared/attributes.d.ts +2 -35
- package/dist-types/vendors/_shared/google-consent.d.ts +2 -47
- package/dist-types/vendors/_shared/install-builders.d.ts +2 -30
- package/dist-types/vendors/_shared/required-id.d.ts +2 -0
- package/dist-types/vendors/_shared/script-url.d.ts +2 -75
- package/dist-types/vendors/ads-and-pixels/linkedin-insights.d.ts +2 -92
- package/dist-types/vendors/ads-and-pixels/meta-pixel.d.ts +2 -289
- package/dist-types/vendors/ads-and-pixels/microsoft-uet.d.ts +2 -105
- package/dist-types/vendors/ads-and-pixels/openai-pixel.d.ts +2 -211
- package/dist-types/vendors/ads-and-pixels/pinterest-tag.d.ts +2 -0
- package/dist-types/vendors/ads-and-pixels/reddit-pixel.d.ts +2 -210
- package/dist-types/vendors/ads-and-pixels/snapchat-pixel.d.ts +2 -171
- package/dist-types/vendors/ads-and-pixels/tiktok-pixel.d.ts +2 -106
- package/dist-types/vendors/ads-and-pixels/x-pixel.d.ts +2 -183
- package/dist-types/vendors/analytics/adobe-analytics.d.ts +2 -75
- package/dist-types/vendors/analytics/ahrefs-analytics.d.ts +2 -62
- package/dist-types/vendors/analytics/amplitude.d.ts +2 -234
- package/dist-types/vendors/analytics/clearbit.d.ts +2 -60
- package/dist-types/vendors/analytics/cloudflare-web-analytics.d.ts +2 -67
- package/dist-types/vendors/analytics/databuddy.d.ts +2 -147
- package/dist-types/vendors/analytics/fathom-analytics.d.ts +2 -90
- package/dist-types/vendors/analytics/google-tag.d.ts +2 -93
- package/dist-types/vendors/analytics/heap.d.ts +2 -316
- package/dist-types/vendors/analytics/hightouch.d.ts +2 -285
- package/dist-types/vendors/analytics/hotjar.d.ts +2 -73
- package/dist-types/vendors/analytics/logrocket.d.ts +2 -101
- package/dist-types/vendors/analytics/matomo-analytics.d.ts +2 -41
- package/dist-types/vendors/analytics/microsoft-clarity.d.ts +2 -97
- package/dist-types/vendors/analytics/mixpanel-analytics.d.ts +2 -113
- package/dist-types/vendors/analytics/one-dollar-stats.d.ts +2 -0
- package/dist-types/vendors/analytics/pirsch.d.ts +2 -96
- package/dist-types/vendors/analytics/plausible-analytics.d.ts +2 -122
- package/dist-types/vendors/analytics/posthog.d.ts +2 -175
- package/dist-types/vendors/analytics/promptwatch.d.ts +2 -36
- package/dist-types/vendors/analytics/rudderstack.d.ts +2 -330
- package/dist-types/vendors/analytics/rybbit-analytics.d.ts +2 -82
- package/dist-types/vendors/analytics/segment.d.ts +2 -158
- package/dist-types/vendors/analytics/umami-analytics.d.ts +2 -93
- package/dist-types/vendors/analytics/vercel-analytics.d.ts +2 -66
- package/dist-types/vendors/email-and-sms/klaviyo.d.ts +2 -0
- package/dist-types/vendors/functional/crisp.d.ts +2 -78
- package/dist-types/vendors/functional/front-chat.d.ts +2 -0
- package/dist-types/vendors/functional/intercom.d.ts +2 -135
- package/dist-types/vendors/tag-managers/cloudflare-zaraz.d.ts +2 -39
- package/dist-types/vendors/tag-managers/google-tag-manager.d.ts +2 -94
- package/dist-types/vercel-analytics.d.ts +2 -0
- package/dist-types/x-pixel.d.ts +2 -0
- package/docs/README.md +129 -59
- package/docs/assets/v3/bottom-bar.png +0 -0
- package/docs/assets/v3/brand-card.png +0 -0
- package/docs/assets/v3/brand-preferences.png +0 -0
- package/docs/assets/v3/choice-wall.png +0 -0
- package/docs/assets/v3/headless-bar-html.png +0 -0
- package/docs/assets/v3/headless-bar-mobile.png +0 -0
- package/docs/assets/v3/headless-bar.png +0 -0
- package/docs/assets/v3/slim-bar.png +0 -0
- package/docs/concepts/choose-your-setup.md +87 -0
- package/docs/concepts/consent-categories.md +84 -0
- package/docs/concepts/consent-state.md +357 -0
- package/docs/{guides → concepts}/data-fetching.md +31 -27
- package/docs/concepts/how-consent-works.md +123 -0
- package/docs/concepts/policies.md +71 -0
- package/docs/customization/class-names.md +202 -0
- package/docs/customization/dark-mode.md +157 -0
- package/docs/customization/motion.md +119 -0
- package/docs/customization/overview.md +67 -33
- package/docs/customization/recipes.md +839 -47
- package/docs/customization/slots.md +216 -35
- package/docs/customization/stylesheets.md +147 -0
- package/docs/customization/tailwind.md +842 -0
- package/docs/customization/tokens.md +166 -36
- package/docs/customization/translations.md +61 -3
- package/docs/frameworks/astro/embeds.md +160 -0
- package/docs/frameworks/astro/network-blocker.md +86 -0
- package/docs/frameworks/astro/scripts.md +146 -0
- package/docs/frameworks/html/embeds.md +142 -0
- package/docs/frameworks/html/network-blocker.md +105 -0
- package/docs/frameworks/html/scripts.md +164 -0
- package/docs/frameworks/javascript/scripts.md +119 -0
- package/docs/frameworks/next/embeds.md +90 -0
- package/docs/frameworks/next/network-blocker.md +153 -0
- package/docs/frameworks/next/scripts.md +196 -0
- package/docs/frameworks/nuxt/embeds.md +81 -0
- package/docs/frameworks/nuxt/network-blocker.md +97 -0
- package/docs/frameworks/nuxt/scripts.md +89 -0
- package/docs/frameworks/react/embeds.md +89 -0
- package/docs/frameworks/react/network-blocker.md +140 -0
- package/docs/frameworks/react/scripts.md +115 -0
- package/docs/frameworks/svelte/embeds.md +96 -0
- package/docs/frameworks/svelte/network-blocker.md +141 -0
- package/docs/frameworks/svelte/scripts.md +137 -0
- package/docs/frameworks/sveltekit/embeds.md +103 -0
- package/docs/frameworks/sveltekit/network-blocker.md +149 -0
- package/docs/frameworks/sveltekit/scripts.md +141 -0
- package/docs/frameworks/tanstack-start/embeds.md +96 -0
- package/docs/frameworks/tanstack-start/network-blocker.md +145 -0
- package/docs/frameworks/tanstack-start/scripts.md +103 -0
- package/docs/frameworks/vue/embeds.md +84 -0
- package/docs/frameworks/vue/network-blocker.md +99 -0
- package/docs/frameworks/vue/scripts.md +93 -0
- package/docs/guides/banner-experiments.md +654 -0
- package/docs/guides/troubleshooting.md +120 -47
- package/docs/guides/verify-consent.md +81 -49
- package/docs/integrations/adobe-analytics.md +168 -160
- package/docs/integrations/ahrefs-analytics.md +153 -155
- package/docs/integrations/amplitude.md +163 -157
- package/docs/integrations/building-integrations.md +136 -37
- package/docs/integrations/clearbit.md +155 -155
- package/docs/integrations/cloudflare-web-analytics.md +157 -157
- package/docs/integrations/cloudflare-zaraz.md +210 -262
- package/docs/integrations/crisp.md +165 -159
- package/docs/integrations/databuddy.md +158 -174
- package/docs/integrations/fathom-analytics.md +159 -157
- package/docs/integrations/front-chat.md +322 -0
- package/docs/integrations/google-maps.md +119 -84
- package/docs/integrations/google-tag-manager.md +179 -164
- package/docs/integrations/google-tag.md +164 -161
- package/docs/integrations/heap.md +164 -156
- package/docs/integrations/hightouch.md +162 -158
- package/docs/integrations/hotjar.md +160 -156
- package/docs/integrations/intercom.md +184 -154
- package/docs/integrations/klaviyo.md +486 -0
- package/docs/integrations/linkedin-insights.md +175 -151
- package/docs/integrations/logrocket.md +161 -157
- package/docs/integrations/matomo-analytics.md +189 -179
- package/docs/integrations/meta-pixel.md +189 -151
- package/docs/integrations/microsoft-clarity.md +164 -156
- package/docs/integrations/microsoft-uet.md +149 -155
- package/docs/integrations/mixpanel-analytics.md +156 -161
- package/docs/integrations/one-dollar-stats.md +306 -0
- package/docs/integrations/openai-pixel.md +205 -302
- package/docs/integrations/overview.md +143 -83
- package/docs/integrations/pinterest-tag.md +329 -0
- package/docs/integrations/pirsch.md +170 -160
- package/docs/integrations/plausible-analytics.md +173 -159
- package/docs/integrations/posthog.md +227 -242
- package/docs/integrations/promptwatch.md +155 -155
- package/docs/integrations/reddit-pixel.md +186 -158
- package/docs/integrations/rudderstack.md +202 -187
- package/docs/integrations/rybbit-analytics.md +172 -161
- package/docs/integrations/segment.md +183 -155
- package/docs/integrations/snapchat-pixel.md +187 -157
- package/docs/integrations/tiktok-pixel.md +172 -151
- package/docs/integrations/umami-analytics.md +164 -159
- package/docs/integrations/vercel-analytics.md +167 -158
- package/docs/integrations/x-pixel.md +177 -151
- package/docs/integrations/youtube.md +122 -87
- package/docs/upgrade-v3.md +490 -354
- package/package.json +12 -236
- package/dist-types/__tests__/helpers.d.ts +0 -141
- package/docs/assets/v3/brand-bar.png +0 -0
- package/docs/assets/v3/mobile-card.png +0 -0
- package/docs/assets/v3/preferences.png +0 -0
- package/docs/frameworks/javascript/script-loader.md +0 -94
- package/docs/frameworks/next/script-loader.md +0 -210
- package/docs/frameworks/react/script-loader.md +0 -63
- package/docs/guides/consent-state.md +0 -60
- package/docs/guides/deployment-modes.md +0 -75
- package/docs/integrations/clear-on-revocation.md +0 -167
- package/docs/integrations/granular-consent.md +0 -208
|
@@ -1,39 +1,53 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Mixpanel
|
|
3
|
-
description:
|
|
4
|
-
|
|
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
|
-
|
|
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/
|
|
15
|
-
| pnpm | `pnpm add @c15t/
|
|
16
|
-
| yarn | `yarn add @c15t/
|
|
17
|
-
| bun | `bun add @c15t/
|
|
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/
|
|
21
|
-
|
|
22
|
-
export const scripts = [
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
43
|
+
SDK initializer or tag-manager entry, so the vendor loads only through c15t.
|
|
33
44
|
|
|
34
|
-
The
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
58
|
-
`
|
|
59
|
-
|
|
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
|
-
|
|
64
|
-
`ConsentRoot
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
</ConsentRoot>
|
|
78
|
-
);
|
|
79
|
-
}
|
|
85
|
+
<ConsentRoot
|
|
86
|
+
state={consent}
|
|
87
|
+
backendURL={backendURL}
|
|
88
|
+
initRoute={false}
|
|
89
|
+
scripts={scripts}
|
|
90
|
+
>
|
|
80
91
|
```
|
|
81
92
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
100
|
+
Add the configuration to the existing `ConsentProvider` options, next to
|
|
101
|
+
`mode`:
|
|
91
102
|
|
|
92
|
-
```
|
|
93
|
-
import { ConsentProvider } from 'c15t/react';
|
|
103
|
+
```tsx title="src/consent.tsx"
|
|
94
104
|
import { scripts } from './consent-scripts';
|
|
95
|
-
```
|
|
96
105
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
```tsx
|
|
100
|
-
<ConsentProvider options={{ ...consentOptions, scripts }}>
|
|
101
|
-
{children}
|
|
102
|
-
</ConsentProvider>
|
|
106
|
+
<ConsentProvider options={{ mode, scripts }}>
|
|
103
107
|
```
|
|
104
108
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
link inside the provider. See
|
|
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
|
-
|
|
112
|
-
|
|
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
|
-
```
|
|
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
|
-
|
|
122
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
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
|
-
```
|
|
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
|
-
|
|
161
|
-
|
|
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
|
|
176
|
-
the
|
|
177
|
-
Do not
|
|
178
|
-
[Vue
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
191
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
256
|
-
|
|
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
|
-
**
|
|
260
|
-
|
|
261
|
-
Attach the loader to your existing kernel before calling
|
|
262
|
-
`kernel.commands.init()`:
|
|
219
|
+
**HTML**
|
|
263
220
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
225
|
+
```html
|
|
226
|
+
<script type="text/plain" data-c15t-category="measurement">
|
|
227
|
+
// The vendor's snippet, unchanged
|
|
228
|
+
</script>
|
|
269
229
|
```
|
|
270
230
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
[
|
|
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
|
-
|
|
236
|
+
**JavaScript**
|
|
277
237
|
|
|
278
|
-
|
|
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
|
-
|
|
241
|
+
```ts
|
|
242
|
+
import { init } from '@c15t/browser';
|
|
243
|
+
import { scripts } from './consent-scripts';
|
|
285
244
|
|
|
286
|
-
|
|
245
|
+
const consent = init({
|
|
246
|
+
backendURL: 'https://your-project.inth.app',
|
|
247
|
+
scripts,
|
|
248
|
+
});
|
|
249
|
+
```
|
|
287
250
|
|
|
288
|
-
|
|
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
|
-
|
|
257
|
+
## Options
|
|
291
258
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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.
|