@c15t/react 3.0.0-alpha.8 → 3.0.0
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 +10 -12
- package/README.md +41 -70
- package/SKILL.md +1 -1
- package/dist/aggregate-components.js +1 -1
- package/dist/components/consent-gate/atoms.js +1 -1
- package/dist/components/consent-gate/frame.js +2 -0
- package/dist/components/consent-gate/index.js +1 -1
- package/dist/components/iab-panel/atoms/root.js +1 -1
- package/dist/components/iab-panel/iab-panel.js +1 -1
- package/dist/components/iab-prompt/atoms/root.js +1 -1
- package/dist/components/iab-prompt/iab-prompt.js +1 -1
- package/dist/components/panel/atoms/root.js +1 -1
- package/dist/components/panel-trigger/atoms/root.js +1 -1
- package/dist/components/panel-trigger/panel-trigger.js +1 -1
- package/dist/components/panel-trigger/toolbar-loader.js +2 -0
- package/dist/components/preferences/atoms/root.js +1 -1
- package/dist/components/prompt/atoms/early-tap-script.js +2 -0
- package/dist/components/prompt/atoms/root.js +1 -1
- package/dist/components/prompt/prompt.js +1 -1
- package/dist/components/shared/dialog-sheets.js +1 -0
- package/dist/components/shared/first-paint-sheets.js +1 -0
- package/dist/components/shared/iab-dialog-sheets.js +1 -0
- package/dist/components/shared/iab-first-paint-sheets.js +1 -0
- package/dist/components/shared/primitives/button.js +1 -1
- package/dist/components/shared/surface-styles.js +2 -0
- package/dist/consent-gate.js +1 -1
- package/dist/context/index.js +1 -1
- package/dist/devtools.js +1 -1
- package/dist/hooks/use-iab-policy-guard.js +1 -0
- package/dist/iab/styles.tw3.css +2 -2
- package/dist/iab-context.js +1 -1
- package/dist/iab-dialog-deferred.js +2 -0
- package/dist/iab.js +1 -1
- package/dist/index-parts/consent-gate.js +1 -1
- package/dist/index-parts/core.js +1 -1
- package/dist/index-parts/frame.js +1 -0
- package/dist/index-parts/hosted.js +1 -0
- package/dist/index-parts/offline.js +1 -0
- package/dist/index-parts/presets.js +1 -0
- package/dist/index.js +1 -1
- package/dist/modes.js +1 -0
- package/dist/panel-link.js +1 -1
- package/dist/panel-trigger.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/styles.tw3.css +2 -2
- package/dist/transports/hosted.js +1 -0
- package/dist/transports/manifest.js +1 -0
- package/dist/utils/deferred-module.js +1 -1
- package/dist/version.js +1 -1
- package/dist-types/chunk-warming.d.ts +7 -6
- package/dist-types/components/consent-gate/frame.d.ts +19 -0
- package/dist-types/components/consent-gate/index.d.ts +3 -19
- package/dist-types/components/iab-prompt/iab-prompt.d.ts +1 -1
- package/dist-types/components/panel/index.d.ts +1 -1
- package/dist-types/components/panel-trigger/toolbar-loader.d.ts +34 -0
- package/dist-types/components/preferences/index.d.ts +1 -1
- package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
- package/dist-types/components/prompt/index.d.ts +1 -1
- package/dist-types/components/shared/dialog-sheets.d.ts +9 -0
- package/dist-types/components/shared/first-paint-sheets.d.ts +8 -0
- package/dist-types/components/shared/iab-dialog-sheets.d.ts +3 -0
- package/dist-types/components/shared/iab-first-paint-sheets.d.ts +3 -0
- package/dist-types/components/shared/surface-styles.d.ts +60 -0
- package/dist-types/consent-gate.d.ts +1 -1
- package/dist-types/context/index.d.ts +3 -3
- package/dist-types/context.d.ts +2 -0
- package/dist-types/gpp.d.ts +1 -1
- package/dist-types/hooks/use-iab-policy-guard.d.ts +35 -0
- package/dist-types/iab-dialog-deferred.d.ts +36 -0
- package/dist-types/iab.d.ts +3 -2
- package/dist-types/index-parts/consent-gate.d.ts +1 -1
- package/dist-types/index-parts/core.d.ts +1 -2
- package/dist-types/index-parts/frame.d.ts +7 -0
- package/dist-types/index-parts/hosted.d.ts +7 -0
- package/dist-types/index-parts/offline.d.ts +7 -0
- package/dist-types/index-parts/presets.d.ts +7 -0
- package/dist-types/index.d.ts +5 -1
- package/dist-types/modes.d.ts +26 -0
- package/dist-types/panel-link.d.ts +1 -1
- package/dist-types/panel-trigger.d.ts +1 -1
- package/dist-types/provider.d.ts +22 -4
- package/dist-types/transports/hosted.d.ts +36 -0
- package/dist-types/transports/manifest.d.ts +48 -0
- package/dist-types/ui-config-context.d.ts +4 -0
- package/dist-types/version.d.ts +1 -1
- package/docs/README.md +10 -12
- package/docs/concepts/choose-your-setup.md +45 -8
- package/docs/concepts/consent-categories.md +1 -1
- package/docs/concepts/consent-state.md +5 -2
- package/docs/concepts/data-fetching.md +100 -40
- package/docs/concepts/modes.md +281 -0
- package/docs/customization/dark-mode.md +1 -1
- package/docs/customization/motion.md +2 -2
- package/docs/customization/overview.md +3 -2
- package/docs/customization/recipes.md +4 -4
- package/docs/customization/slots.md +25 -25
- package/docs/customization/stylesheets.md +161 -50
- package/docs/customization/tailwind.md +71 -50
- package/docs/customization/tokens.md +42 -13
- package/docs/frameworks/react/components/consent-banner.md +14 -12
- package/docs/frameworks/react/components/consent-dialog.md +15 -13
- package/docs/frameworks/react/components/consent-provider.md +51 -46
- package/docs/frameworks/react/components.md +16 -13
- package/docs/frameworks/react/compose.md +3 -3
- package/docs/frameworks/react/content-security-policy.md +35 -12
- package/docs/frameworks/react/customize.md +21 -13
- package/docs/frameworks/react/hooks.md +2 -2
- package/docs/frameworks/react/iab.md +56 -6
- package/docs/frameworks/react/quickstart.md +65 -99
- package/docs/frameworks/react/rendering.md +170 -94
- package/docs/frameworks/react/scripts.md +19 -30
- package/docs/frameworks/react/troubleshooting.md +100 -32
- package/docs/frameworks/react/upgrade-v3.md +133 -79
- package/docs/frameworks/react/vendor-consent.md +19 -7
- package/docs/guides/banner-experiments.md +21 -8
- package/docs/guides/troubleshooting.md +90 -26
- package/docs/guides/verify-consent.md +23 -8
- package/docs/integrations/adobe-analytics.md +60 -64
- package/docs/integrations/ahrefs-analytics.md +58 -63
- package/docs/integrations/amplitude.md +60 -64
- package/docs/integrations/clearbit.md +59 -63
- package/docs/integrations/cloudflare-web-analytics.md +56 -60
- package/docs/integrations/cloudflare-zaraz.md +55 -57
- package/docs/integrations/crisp.md +64 -69
- package/docs/integrations/databuddy.md +62 -64
- package/docs/integrations/fathom-analytics.md +56 -60
- package/docs/integrations/front-chat.md +56 -60
- package/docs/integrations/google-maps.md +25 -13
- package/docs/integrations/google-tag-manager.md +153 -77
- package/docs/integrations/google-tag.md +134 -78
- package/docs/integrations/heap.md +56 -60
- package/docs/integrations/hightouch.md +55 -60
- package/docs/integrations/hotjar.md +60 -64
- package/docs/integrations/intercom.md +55 -60
- package/docs/integrations/klaviyo.md +65 -66
- package/docs/integrations/linkedin-insights.md +58 -63
- package/docs/integrations/logrocket.md +55 -60
- package/docs/integrations/matomo-analytics.md +58 -60
- package/docs/integrations/meta-pixel.md +56 -60
- package/docs/integrations/microsoft-clarity.md +57 -60
- package/docs/integrations/microsoft-uet.md +58 -61
- package/docs/integrations/mixpanel-analytics.md +73 -75
- package/docs/integrations/one-dollar-stats.md +53 -59
- package/docs/integrations/openai-pixel.md +58 -60
- package/docs/integrations/overview.md +59 -42
- package/docs/integrations/pinterest-tag.md +56 -60
- package/docs/integrations/pirsch.md +54 -60
- package/docs/integrations/plausible-analytics.md +55 -60
- package/docs/integrations/posthog.md +56 -60
- package/docs/integrations/promptwatch.md +57 -63
- package/docs/integrations/reddit-pixel.md +57 -60
- package/docs/integrations/rudderstack.md +65 -67
- package/docs/integrations/rybbit-analytics.md +70 -75
- package/docs/integrations/segment.md +56 -60
- package/docs/integrations/sentry.md +65 -60
- package/docs/integrations/snapchat-pixel.md +54 -60
- package/docs/integrations/tiktok-pixel.md +59 -63
- package/docs/integrations/umami-analytics.md +54 -60
- package/docs/integrations/vercel-analytics.md +53 -59
- package/docs/integrations/vercel-speed-insights.md +317 -0
- package/docs/integrations/x-pixel.md +57 -63
- package/docs/integrations/youtube.md +25 -13
- package/package.json +18 -8
- package/docs/upgrade-v3.md +0 -429
|
@@ -3,10 +3,22 @@ title: Databuddy
|
|
|
3
3
|
description: Load the Databuddy SDK on every page with the c15t databuddy
|
|
4
4
|
helper, switch its disabled flag and config from measurement consent, and
|
|
5
5
|
check both in DevTools.
|
|
6
|
+
seoTitle: Databuddy cookie consent with c15t
|
|
7
|
+
seoDescription: Keep Databuddy disabled without measurement consent, and turn it
|
|
8
|
+
on with consent. Set it up with the c15t databuddy helper.
|
|
6
9
|
icon: databuddy
|
|
7
10
|
group: integrations
|
|
8
11
|
---
|
|
9
12
|
|
|
13
|
+
The c15t `databuddy` helper loads `databuddy.js` on every page, before the
|
|
14
|
+
visitor chooses. The helper uses `alwaysLoad`, but its category is
|
|
15
|
+
`measurement`. While `measurement` has no consent, the helper sets
|
|
16
|
+
`window.databuddy.options.disabled` to `true`. It also sets
|
|
17
|
+
`window.databuddyConfig` to `configWhenDenied`, unless your page set
|
|
18
|
+
`window.databuddyConfig` first. When `measurement` has consent, the helper
|
|
19
|
+
changes to `configWhenGranted` and sets `disabled` to `false`. If the visitor
|
|
20
|
+
withdraws consent, the helper changes both values back.
|
|
21
|
+
|
|
10
22
|
## Configure Databuddy
|
|
11
23
|
|
|
12
24
|
Copy the client ID from your Databuddy project. The helper passes it to the
|
|
@@ -14,12 +26,12 @@ script as `data-client-id`. Remove any existing Databuddy script and any code
|
|
|
14
26
|
that sets `window.databuddyConfig`. The helper seeds that global only when it
|
|
15
27
|
is absent, so an existing value overrides your initial state.
|
|
16
28
|
|
|
17
|
-
| Package manager | Command
|
|
18
|
-
| :-------------- |
|
|
19
|
-
| npm | `npm install @c15t/integrations
|
|
20
|
-
| pnpm | `pnpm add @c15t/integrations
|
|
21
|
-
| yarn | `yarn add @c15t/integrations
|
|
22
|
-
| bun | `bun add @c15t/integrations
|
|
29
|
+
| Package manager | Command |
|
|
30
|
+
| :-------------- | :------------------------------- |
|
|
31
|
+
| npm | `npm install @c15t/integrations` |
|
|
32
|
+
| pnpm | `pnpm add @c15t/integrations` |
|
|
33
|
+
| yarn | `yarn add @c15t/integrations` |
|
|
34
|
+
| bun | `bun add @c15t/integrations` |
|
|
23
35
|
|
|
24
36
|
```ts title="src/consent-scripts.ts"
|
|
25
37
|
import { databuddy } from '@c15t/integrations/databuddy';
|
|
@@ -40,51 +52,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
|
|
|
40
52
|
SDK initializer or tag-manager entry, so the vendor loads only through c15t.
|
|
41
53
|
|
|
42
54
|
The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
|
|
43
|
-
quickstart already
|
|
44
|
-
Next.js guide, add the helper to that array instead of creating a
|
|
55
|
+
quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
|
|
56
|
+
in the Next.js guide, add the helper to that array instead of creating a
|
|
57
|
+
second file.
|
|
45
58
|
The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
|
|
46
59
|
point for your framework below. These are edits to that provider, not a second
|
|
47
60
|
provider.
|
|
48
61
|
|
|
49
62
|
**Next.js**
|
|
50
63
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
```ts
|
|
54
|
-
import { ConsentRoot } from 'c15t/next';
|
|
55
|
-
import { scripts } from './consent-scripts';
|
|
56
|
-
```
|
|
64
|
+
Add the configuration to `scripts` in `c15t.config.ts`, next to
|
|
65
|
+
`next.config.ts`:
|
|
57
66
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
67
|
+
```ts title="c15t.config.ts"
|
|
68
|
+
import { defineConsentConfig } from 'c15t/next';
|
|
69
|
+
import { scripts } from './src/consent-scripts';
|
|
61
70
|
|
|
62
|
-
|
|
63
|
-
<ConsentRoot state={state} config={consentConfig} scripts={scripts}>
|
|
64
|
-
{children}
|
|
65
|
-
</ConsentRoot>
|
|
71
|
+
export default defineConsentConfig({ scripts });
|
|
66
72
|
```
|
|
67
73
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
Keep the rest of your config, such as `mode` and `routePrefix`, in the
|
|
75
|
+
same call. `ConsentRoot` reads the config in the browser, so the layout
|
|
76
|
+
keeps passing only `state`. App Router, Pages Router and static export all
|
|
77
|
+
read the same file. See
|
|
71
78
|
[Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
|
|
72
79
|
|
|
73
80
|
**TanStack Start**
|
|
74
81
|
|
|
75
82
|
Import the configuration into your root route and pass it to the existing
|
|
76
|
-
`ConsentRoot` as a top-level prop. Keep the loader
|
|
77
|
-
|
|
83
|
+
`ConsentRoot` as a top-level prop. Keep the loader from the
|
|
84
|
+
[TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
|
|
78
85
|
|
|
79
86
|
```tsx title="src/routes/__root.tsx"
|
|
80
87
|
import { scripts } from '../consent-scripts';
|
|
81
88
|
|
|
82
|
-
<ConsentRoot
|
|
83
|
-
state={consent}
|
|
84
|
-
backendURL={backendURL}
|
|
85
|
-
initRoute={false}
|
|
86
|
-
scripts={scripts}
|
|
87
|
-
>
|
|
89
|
+
<ConsentRoot state={consent} scripts={scripts}>
|
|
88
90
|
```
|
|
89
91
|
|
|
90
92
|
Import vendor helpers in the root route module, not in a server function.
|
|
@@ -103,8 +105,8 @@ import { scripts } from './consent-scripts';
|
|
|
103
105
|
<ConsentProvider options={{ mode, scripts }}>
|
|
104
106
|
```
|
|
105
107
|
|
|
106
|
-
`mode` is the `
|
|
107
|
-
|
|
108
|
+
`mode` is the `manifest()` value from the
|
|
109
|
+
[React quickstart](../frameworks/react/quickstart.md). Keep the banner,
|
|
108
110
|
dialog and preferences link inside the provider. See
|
|
109
111
|
[React scripts and embeds](../frameworks/react/scripts.md).
|
|
110
112
|
|
|
@@ -133,15 +135,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
|
|
|
133
135
|
Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
|
|
134
136
|
|
|
135
137
|
```ts title="src/main.ts"
|
|
138
|
+
import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
|
|
136
139
|
import { scripts } from './consent-scripts';
|
|
137
140
|
|
|
138
141
|
app.use(c15tVue, {
|
|
139
|
-
|
|
142
|
+
mode: manifest(),
|
|
140
143
|
scripts,
|
|
141
144
|
});
|
|
142
145
|
```
|
|
143
146
|
|
|
144
|
-
Keep your existing
|
|
147
|
+
Keep your existing `mode` and other options. The plugin starts one
|
|
145
148
|
script loader when the app mounts, after it has applied the visitor's stored
|
|
146
149
|
choice. Do not also call `createScriptLoader` from a component. See
|
|
147
150
|
[Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
|
|
@@ -149,12 +152,11 @@ choice. Do not also call `createScriptLoader` from a component. See
|
|
|
149
152
|
**Astro**
|
|
150
153
|
|
|
151
154
|
Add the scripts to the client entrypoint from the
|
|
152
|
-
[Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart),
|
|
153
|
-
integration
|
|
154
|
-
|
|
155
|
-
already exports scripts, combine the two arrays.
|
|
155
|
+
[Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
|
|
156
|
+
which the integration finds on its own. Keep `astro.config.mjs` as it is.
|
|
157
|
+
If the module already exports scripts, combine the two arrays.
|
|
156
158
|
|
|
157
|
-
```ts title="src/
|
|
159
|
+
```ts title="src/c15t.client.ts"
|
|
158
160
|
import type { C15tClientOptionsExtension } from 'c15t/astro';
|
|
159
161
|
import { scripts } from './consent-scripts';
|
|
160
162
|
|
|
@@ -174,15 +176,13 @@ pass them as a top-level prop:
|
|
|
174
176
|
|
|
175
177
|
```svelte title="src/App.svelte"
|
|
176
178
|
<script lang="ts">
|
|
177
|
-
import {
|
|
179
|
+
import { ConsentProvider, manifest } from '@c15t/svelte';
|
|
178
180
|
import { scripts } from './consent-scripts';
|
|
179
|
-
|
|
180
|
-
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
181
181
|
</script>
|
|
182
182
|
|
|
183
|
-
<
|
|
183
|
+
<ConsentProvider mode={manifest()} {scripts}>
|
|
184
184
|
<!-- Keep your application, consent UI and preferences link here. -->
|
|
185
|
-
</
|
|
185
|
+
</ConsentProvider>
|
|
186
186
|
```
|
|
187
187
|
|
|
188
188
|
Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
|
|
@@ -190,22 +190,21 @@ The provider owns the loader and disposes it on unmount.
|
|
|
190
190
|
|
|
191
191
|
**SvelteKit**
|
|
192
192
|
|
|
193
|
-
Add the scripts to the existing root layout
|
|
194
|
-
and
|
|
193
|
+
Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
|
|
194
|
+
handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
|
|
195
195
|
|
|
196
196
|
```svelte title="src/routes/+layout.svelte"
|
|
197
197
|
<script lang="ts">
|
|
198
|
-
import {
|
|
198
|
+
import { ConsentRoot } from '@c15t/svelte';
|
|
199
199
|
import { scripts } from '../consent-scripts';
|
|
200
200
|
|
|
201
201
|
let { children, data } = $props();
|
|
202
|
-
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
203
202
|
</script>
|
|
204
203
|
|
|
205
|
-
<
|
|
204
|
+
<ConsentRoot state={data.consent} {scripts}>
|
|
206
205
|
{@render children()}
|
|
207
206
|
<!-- Keep your consent UI and preferences link here. -->
|
|
208
|
-
</
|
|
207
|
+
</ConsentRoot>
|
|
209
208
|
```
|
|
210
209
|
|
|
211
210
|
Import vendor helpers in the layout component, not in `+layout.server.ts`:
|
|
@@ -232,20 +231,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
|
|
|
232
231
|
|
|
233
232
|
**JavaScript**
|
|
234
233
|
|
|
235
|
-
Pass the scripts to `init()` from `@c15t/browser`, next to your
|
|
236
|
-
URL:
|
|
234
|
+
Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
|
|
237
235
|
|
|
238
236
|
```ts
|
|
239
|
-
import { init } from '@c15t/browser';
|
|
237
|
+
import { init, manifest } from '@c15t/browser';
|
|
240
238
|
import { scripts } from './consent-scripts';
|
|
241
239
|
|
|
242
240
|
const consent = init({
|
|
243
|
-
|
|
241
|
+
mode: manifest(),
|
|
244
242
|
scripts,
|
|
245
243
|
});
|
|
246
244
|
```
|
|
247
245
|
|
|
248
|
-
Keep the
|
|
246
|
+
Keep the mode from your quickstart. With
|
|
249
247
|
`createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
|
|
250
248
|
A kernel you create yourself needs a loader from
|
|
251
249
|
`c15t/modules/script-loader`. Attach one loader per kernel. See
|
|
@@ -253,13 +251,13 @@ A kernel you create yourself needs a loader from
|
|
|
253
251
|
|
|
254
252
|
## Options
|
|
255
253
|
|
|
256
|
-
| Option | Default | Behavior
|
|
257
|
-
| ------------------- | --------------------------------------- |
|
|
258
|
-
| `clientId` | Required | Set as `data-client-id`. The helper trims it. Empty or whitespace-only values
|
|
259
|
-
| `configWhenGranted` | Required | Object set as `window.databuddyConfig` while measurement is allowed.
|
|
260
|
-
| `configWhenDenied` | Required | Object set as `window.databuddyConfig` while measurement is denied.
|
|
261
|
-
| `apiUrl` | `https://basket.databuddy.cc` | Collection endpoint, set as `data-api-url`.
|
|
262
|
-
| `scriptUrl` | `https://cdn.databuddy.cc/databuddy.js` | Loader URL override. A blank value falls back to the default.
|
|
254
|
+
| Option | Default | Behavior |
|
|
255
|
+
| ------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
|
256
|
+
| `clientId` | Required | Set as `data-client-id`. The helper trims it. Empty or whitespace-only values log an error and the script does not load. |
|
|
257
|
+
| `configWhenGranted` | Required | Object set as `window.databuddyConfig` while measurement is allowed. |
|
|
258
|
+
| `configWhenDenied` | Required | Object set as `window.databuddyConfig` while measurement is denied. |
|
|
259
|
+
| `apiUrl` | `https://basket.databuddy.cc` | Collection endpoint, set as `data-api-url`. |
|
|
260
|
+
| `scriptUrl` | `https://cdn.databuddy.cc/databuddy.js` | Loader URL override. A blank value falls back to the default. |
|
|
263
261
|
|
|
264
262
|
## Loading and revocation
|
|
265
263
|
|
|
@@ -2,22 +2,32 @@
|
|
|
2
2
|
title: Fathom Analytics
|
|
3
3
|
description: Load Fathom Analytics only after measurement consent with the c15t
|
|
4
4
|
fathomAnalytics helper, set its SPA mode, and check it in DevTools.
|
|
5
|
+
seoTitle: Fathom Analytics cookie consent with c15t
|
|
6
|
+
seoDescription: Load Fathom Analytics only with measurement consent. The c15t
|
|
7
|
+
fathomAnalytics helper keeps script.js off the page until then.
|
|
5
8
|
icon: fathom-analytics
|
|
6
9
|
group: integrations
|
|
7
10
|
---
|
|
8
11
|
|
|
12
|
+
The c15t `fathomAnalytics` helper keeps Fathom Analytics off the page until
|
|
13
|
+
`measurement` has consent. Fathom says that it sets no cookies, but c15t still
|
|
14
|
+
does not load Fathom's `script.js` before consent. The helper sends no consent
|
|
15
|
+
signal to Fathom, and it does not call `blockTrackingForMe`. If the visitor
|
|
16
|
+
withdraws consent, c15t removes the script element. By default, c15t also
|
|
17
|
+
reloads the page.
|
|
18
|
+
|
|
9
19
|
## Configure Fathom Analytics
|
|
10
20
|
|
|
11
21
|
Copy the site ID from your Fathom embed code, where it is the `data-site`
|
|
12
22
|
value. If your app changes routes without a full page load, also pass `spa`.
|
|
13
23
|
Without it, the helper leaves Fathom's SPA route tracking off.
|
|
14
24
|
|
|
15
|
-
| Package manager | Command
|
|
16
|
-
| :-------------- |
|
|
17
|
-
| npm | `npm install @c15t/integrations
|
|
18
|
-
| pnpm | `pnpm add @c15t/integrations
|
|
19
|
-
| yarn | `yarn add @c15t/integrations
|
|
20
|
-
| bun | `bun add @c15t/integrations
|
|
25
|
+
| Package manager | Command |
|
|
26
|
+
| :-------------- | :------------------------------- |
|
|
27
|
+
| npm | `npm install @c15t/integrations` |
|
|
28
|
+
| pnpm | `pnpm add @c15t/integrations` |
|
|
29
|
+
| yarn | `yarn add @c15t/integrations` |
|
|
30
|
+
| bun | `bun add @c15t/integrations` |
|
|
21
31
|
|
|
22
32
|
```ts title="src/consent-scripts.ts"
|
|
23
33
|
import { fathomAnalytics } from '@c15t/integrations/fathom-analytics';
|
|
@@ -32,51 +42,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
|
|
|
32
42
|
SDK initializer or tag-manager entry, so the vendor loads only through c15t.
|
|
33
43
|
|
|
34
44
|
The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
|
|
35
|
-
quickstart already
|
|
36
|
-
Next.js guide, add the helper to that array instead of creating a
|
|
45
|
+
quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
|
|
46
|
+
in the Next.js guide, add the helper to that array instead of creating a
|
|
47
|
+
second file.
|
|
37
48
|
The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
|
|
38
49
|
point for your framework below. These are edits to that provider, not a second
|
|
39
50
|
provider.
|
|
40
51
|
|
|
41
52
|
**Next.js**
|
|
42
53
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
```ts
|
|
46
|
-
import { ConsentRoot } from 'c15t/next';
|
|
47
|
-
import { scripts } from './consent-scripts';
|
|
48
|
-
```
|
|
54
|
+
Add the configuration to `scripts` in `c15t.config.ts`, next to
|
|
55
|
+
`next.config.ts`:
|
|
49
56
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
57
|
+
```ts title="c15t.config.ts"
|
|
58
|
+
import { defineConsentConfig } from 'c15t/next';
|
|
59
|
+
import { scripts } from './src/consent-scripts';
|
|
53
60
|
|
|
54
|
-
|
|
55
|
-
<ConsentRoot state={state} config={consentConfig} scripts={scripts}>
|
|
56
|
-
{children}
|
|
57
|
-
</ConsentRoot>
|
|
61
|
+
export default defineConsentConfig({ scripts });
|
|
58
62
|
```
|
|
59
63
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
Keep the rest of your config, such as `mode` and `routePrefix`, in the
|
|
65
|
+
same call. `ConsentRoot` reads the config in the browser, so the layout
|
|
66
|
+
keeps passing only `state`. App Router, Pages Router and static export all
|
|
67
|
+
read the same file. See
|
|
63
68
|
[Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
|
|
64
69
|
|
|
65
70
|
**TanStack Start**
|
|
66
71
|
|
|
67
72
|
Import the configuration into your root route and pass it to the existing
|
|
68
|
-
`ConsentRoot` as a top-level prop. Keep the loader
|
|
69
|
-
|
|
73
|
+
`ConsentRoot` as a top-level prop. Keep the loader from the
|
|
74
|
+
[TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
|
|
70
75
|
|
|
71
76
|
```tsx title="src/routes/__root.tsx"
|
|
72
77
|
import { scripts } from '../consent-scripts';
|
|
73
78
|
|
|
74
|
-
<ConsentRoot
|
|
75
|
-
state={consent}
|
|
76
|
-
backendURL={backendURL}
|
|
77
|
-
initRoute={false}
|
|
78
|
-
scripts={scripts}
|
|
79
|
-
>
|
|
79
|
+
<ConsentRoot state={consent} scripts={scripts}>
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
Import vendor helpers in the root route module, not in a server function.
|
|
@@ -95,8 +95,8 @@ import { scripts } from './consent-scripts';
|
|
|
95
95
|
<ConsentProvider options={{ mode, scripts }}>
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
-
`mode` is the `
|
|
99
|
-
|
|
98
|
+
`mode` is the `manifest()` value from the
|
|
99
|
+
[React quickstart](../frameworks/react/quickstart.md). Keep the banner,
|
|
100
100
|
dialog and preferences link inside the provider. See
|
|
101
101
|
[React scripts and embeds](../frameworks/react/scripts.md).
|
|
102
102
|
|
|
@@ -125,15 +125,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
|
|
|
125
125
|
Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
|
|
126
126
|
|
|
127
127
|
```ts title="src/main.ts"
|
|
128
|
+
import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
|
|
128
129
|
import { scripts } from './consent-scripts';
|
|
129
130
|
|
|
130
131
|
app.use(c15tVue, {
|
|
131
|
-
|
|
132
|
+
mode: manifest(),
|
|
132
133
|
scripts,
|
|
133
134
|
});
|
|
134
135
|
```
|
|
135
136
|
|
|
136
|
-
Keep your existing
|
|
137
|
+
Keep your existing `mode` and other options. The plugin starts one
|
|
137
138
|
script loader when the app mounts, after it has applied the visitor's stored
|
|
138
139
|
choice. Do not also call `createScriptLoader` from a component. See
|
|
139
140
|
[Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
|
|
@@ -141,12 +142,11 @@ choice. Do not also call `createScriptLoader` from a component. See
|
|
|
141
142
|
**Astro**
|
|
142
143
|
|
|
143
144
|
Add the scripts to the client entrypoint from the
|
|
144
|
-
[Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart),
|
|
145
|
-
integration
|
|
146
|
-
|
|
147
|
-
already exports scripts, combine the two arrays.
|
|
145
|
+
[Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
|
|
146
|
+
which the integration finds on its own. Keep `astro.config.mjs` as it is.
|
|
147
|
+
If the module already exports scripts, combine the two arrays.
|
|
148
148
|
|
|
149
|
-
```ts title="src/
|
|
149
|
+
```ts title="src/c15t.client.ts"
|
|
150
150
|
import type { C15tClientOptionsExtension } from 'c15t/astro';
|
|
151
151
|
import { scripts } from './consent-scripts';
|
|
152
152
|
|
|
@@ -166,15 +166,13 @@ pass them as a top-level prop:
|
|
|
166
166
|
|
|
167
167
|
```svelte title="src/App.svelte"
|
|
168
168
|
<script lang="ts">
|
|
169
|
-
import {
|
|
169
|
+
import { ConsentProvider, manifest } from '@c15t/svelte';
|
|
170
170
|
import { scripts } from './consent-scripts';
|
|
171
|
-
|
|
172
|
-
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
173
171
|
</script>
|
|
174
172
|
|
|
175
|
-
<
|
|
173
|
+
<ConsentProvider mode={manifest()} {scripts}>
|
|
176
174
|
<!-- Keep your application, consent UI and preferences link here. -->
|
|
177
|
-
</
|
|
175
|
+
</ConsentProvider>
|
|
178
176
|
```
|
|
179
177
|
|
|
180
178
|
Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
|
|
@@ -182,22 +180,21 @@ The provider owns the loader and disposes it on unmount.
|
|
|
182
180
|
|
|
183
181
|
**SvelteKit**
|
|
184
182
|
|
|
185
|
-
Add the scripts to the existing root layout
|
|
186
|
-
and
|
|
183
|
+
Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
|
|
184
|
+
handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
|
|
187
185
|
|
|
188
186
|
```svelte title="src/routes/+layout.svelte"
|
|
189
187
|
<script lang="ts">
|
|
190
|
-
import {
|
|
188
|
+
import { ConsentRoot } from '@c15t/svelte';
|
|
191
189
|
import { scripts } from '../consent-scripts';
|
|
192
190
|
|
|
193
191
|
let { children, data } = $props();
|
|
194
|
-
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
195
192
|
</script>
|
|
196
193
|
|
|
197
|
-
<
|
|
194
|
+
<ConsentRoot state={data.consent} {scripts}>
|
|
198
195
|
{@render children()}
|
|
199
196
|
<!-- Keep your consent UI and preferences link here. -->
|
|
200
|
-
</
|
|
197
|
+
</ConsentRoot>
|
|
201
198
|
```
|
|
202
199
|
|
|
203
200
|
Import vendor helpers in the layout component, not in `+layout.server.ts`:
|
|
@@ -224,20 +221,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
|
|
|
224
221
|
|
|
225
222
|
**JavaScript**
|
|
226
223
|
|
|
227
|
-
Pass the scripts to `init()` from `@c15t/browser`, next to your
|
|
228
|
-
URL:
|
|
224
|
+
Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
|
|
229
225
|
|
|
230
226
|
```ts
|
|
231
|
-
import { init } from '@c15t/browser';
|
|
227
|
+
import { init, manifest } from '@c15t/browser';
|
|
232
228
|
import { scripts } from './consent-scripts';
|
|
233
229
|
|
|
234
230
|
const consent = init({
|
|
235
|
-
|
|
231
|
+
mode: manifest(),
|
|
236
232
|
scripts,
|
|
237
233
|
});
|
|
238
234
|
```
|
|
239
235
|
|
|
240
|
-
Keep the
|
|
236
|
+
Keep the mode from your quickstart. With
|
|
241
237
|
`createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
|
|
242
238
|
A kernel you create yourself needs a loader from
|
|
243
239
|
`c15t/modules/script-loader`. Attach one loader per kernel. See
|
|
@@ -247,7 +243,7 @@ A kernel you create yourself needs a loader from
|
|
|
247
243
|
|
|
248
244
|
| Option | Default | Behavior |
|
|
249
245
|
| ----------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
250
|
-
| `site` | Required | Site ID, set as `data-site`. The helper trims it. Empty or whitespace-only values
|
|
246
|
+
| `site` | Required | Site ID, set as `data-site`. The helper trims it. Empty or whitespace-only values log an error and the script does not load. |
|
|
251
247
|
| `spa` | None | `'auto'`, `'history'` or `'hash'`, set as `data-spa`. When omitted, the script has no `data-spa` attribute and SPA route tracking stays off. |
|
|
252
248
|
| `auto` | None | Sets `data-auto` to `'true'` or `'false'` to control automatic page views. When omitted, Fathom's default applies. |
|
|
253
249
|
| `canonical` | None | Sets `data-canonical` to control canonical URL tracking. When omitted, Fathom's default applies. |
|
|
@@ -288,8 +284,8 @@ permission before each of your own event calls. The reload does not delete
|
|
|
288
284
|
cookies the vendor already set; see
|
|
289
285
|
[clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
|
|
290
286
|
|
|
291
|
-
The helper
|
|
292
|
-
|
|
287
|
+
The helper lists its vendor by name in the preference dialog, so a visitor can
|
|
288
|
+
turn it off inside an allowed category. See
|
|
293
289
|
[vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
|
|
294
290
|
[consent verification guide](../guides/verify-consent.md) covers navigation,
|
|
295
291
|
expiry and hosting checks.
|