@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.
Files changed (164) hide show
  1. package/AGENTS.md +10 -12
  2. package/README.md +41 -70
  3. package/SKILL.md +1 -1
  4. package/dist/aggregate-components.js +1 -1
  5. package/dist/components/consent-gate/atoms.js +1 -1
  6. package/dist/components/consent-gate/frame.js +2 -0
  7. package/dist/components/consent-gate/index.js +1 -1
  8. package/dist/components/iab-panel/atoms/root.js +1 -1
  9. package/dist/components/iab-panel/iab-panel.js +1 -1
  10. package/dist/components/iab-prompt/atoms/root.js +1 -1
  11. package/dist/components/iab-prompt/iab-prompt.js +1 -1
  12. package/dist/components/panel/atoms/root.js +1 -1
  13. package/dist/components/panel-trigger/atoms/root.js +1 -1
  14. package/dist/components/panel-trigger/panel-trigger.js +1 -1
  15. package/dist/components/panel-trigger/toolbar-loader.js +2 -0
  16. package/dist/components/preferences/atoms/root.js +1 -1
  17. package/dist/components/prompt/atoms/early-tap-script.js +2 -0
  18. package/dist/components/prompt/atoms/root.js +1 -1
  19. package/dist/components/prompt/prompt.js +1 -1
  20. package/dist/components/shared/dialog-sheets.js +1 -0
  21. package/dist/components/shared/first-paint-sheets.js +1 -0
  22. package/dist/components/shared/iab-dialog-sheets.js +1 -0
  23. package/dist/components/shared/iab-first-paint-sheets.js +1 -0
  24. package/dist/components/shared/primitives/button.js +1 -1
  25. package/dist/components/shared/surface-styles.js +2 -0
  26. package/dist/consent-gate.js +1 -1
  27. package/dist/context/index.js +1 -1
  28. package/dist/devtools.js +1 -1
  29. package/dist/hooks/use-iab-policy-guard.js +1 -0
  30. package/dist/iab/styles.tw3.css +2 -2
  31. package/dist/iab-context.js +1 -1
  32. package/dist/iab-dialog-deferred.js +2 -0
  33. package/dist/iab.js +1 -1
  34. package/dist/index-parts/consent-gate.js +1 -1
  35. package/dist/index-parts/core.js +1 -1
  36. package/dist/index-parts/frame.js +1 -0
  37. package/dist/index-parts/hosted.js +1 -0
  38. package/dist/index-parts/offline.js +1 -0
  39. package/dist/index-parts/presets.js +1 -0
  40. package/dist/index.js +1 -1
  41. package/dist/modes.js +1 -0
  42. package/dist/panel-link.js +1 -1
  43. package/dist/panel-trigger.js +1 -1
  44. package/dist/provider.js +1 -1
  45. package/dist/styles.tw3.css +2 -2
  46. package/dist/transports/hosted.js +1 -0
  47. package/dist/transports/manifest.js +1 -0
  48. package/dist/utils/deferred-module.js +1 -1
  49. package/dist/version.js +1 -1
  50. package/dist-types/chunk-warming.d.ts +7 -6
  51. package/dist-types/components/consent-gate/frame.d.ts +19 -0
  52. package/dist-types/components/consent-gate/index.d.ts +3 -19
  53. package/dist-types/components/iab-prompt/iab-prompt.d.ts +1 -1
  54. package/dist-types/components/panel/index.d.ts +1 -1
  55. package/dist-types/components/panel-trigger/toolbar-loader.d.ts +34 -0
  56. package/dist-types/components/preferences/index.d.ts +1 -1
  57. package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
  58. package/dist-types/components/prompt/index.d.ts +1 -1
  59. package/dist-types/components/shared/dialog-sheets.d.ts +9 -0
  60. package/dist-types/components/shared/first-paint-sheets.d.ts +8 -0
  61. package/dist-types/components/shared/iab-dialog-sheets.d.ts +3 -0
  62. package/dist-types/components/shared/iab-first-paint-sheets.d.ts +3 -0
  63. package/dist-types/components/shared/surface-styles.d.ts +60 -0
  64. package/dist-types/consent-gate.d.ts +1 -1
  65. package/dist-types/context/index.d.ts +3 -3
  66. package/dist-types/context.d.ts +2 -0
  67. package/dist-types/gpp.d.ts +1 -1
  68. package/dist-types/hooks/use-iab-policy-guard.d.ts +35 -0
  69. package/dist-types/iab-dialog-deferred.d.ts +36 -0
  70. package/dist-types/iab.d.ts +3 -2
  71. package/dist-types/index-parts/consent-gate.d.ts +1 -1
  72. package/dist-types/index-parts/core.d.ts +1 -2
  73. package/dist-types/index-parts/frame.d.ts +7 -0
  74. package/dist-types/index-parts/hosted.d.ts +7 -0
  75. package/dist-types/index-parts/offline.d.ts +7 -0
  76. package/dist-types/index-parts/presets.d.ts +7 -0
  77. package/dist-types/index.d.ts +5 -1
  78. package/dist-types/modes.d.ts +26 -0
  79. package/dist-types/panel-link.d.ts +1 -1
  80. package/dist-types/panel-trigger.d.ts +1 -1
  81. package/dist-types/provider.d.ts +22 -4
  82. package/dist-types/transports/hosted.d.ts +36 -0
  83. package/dist-types/transports/manifest.d.ts +48 -0
  84. package/dist-types/ui-config-context.d.ts +4 -0
  85. package/dist-types/version.d.ts +1 -1
  86. package/docs/README.md +10 -12
  87. package/docs/concepts/choose-your-setup.md +45 -8
  88. package/docs/concepts/consent-categories.md +1 -1
  89. package/docs/concepts/consent-state.md +5 -2
  90. package/docs/concepts/data-fetching.md +100 -40
  91. package/docs/concepts/modes.md +281 -0
  92. package/docs/customization/dark-mode.md +1 -1
  93. package/docs/customization/motion.md +2 -2
  94. package/docs/customization/overview.md +3 -2
  95. package/docs/customization/recipes.md +4 -4
  96. package/docs/customization/slots.md +25 -25
  97. package/docs/customization/stylesheets.md +161 -50
  98. package/docs/customization/tailwind.md +71 -50
  99. package/docs/customization/tokens.md +42 -13
  100. package/docs/frameworks/react/components/consent-banner.md +14 -12
  101. package/docs/frameworks/react/components/consent-dialog.md +15 -13
  102. package/docs/frameworks/react/components/consent-provider.md +51 -46
  103. package/docs/frameworks/react/components.md +16 -13
  104. package/docs/frameworks/react/compose.md +3 -3
  105. package/docs/frameworks/react/content-security-policy.md +35 -12
  106. package/docs/frameworks/react/customize.md +21 -13
  107. package/docs/frameworks/react/hooks.md +2 -2
  108. package/docs/frameworks/react/iab.md +56 -6
  109. package/docs/frameworks/react/quickstart.md +65 -99
  110. package/docs/frameworks/react/rendering.md +170 -94
  111. package/docs/frameworks/react/scripts.md +19 -30
  112. package/docs/frameworks/react/troubleshooting.md +100 -32
  113. package/docs/frameworks/react/upgrade-v3.md +133 -79
  114. package/docs/frameworks/react/vendor-consent.md +19 -7
  115. package/docs/guides/banner-experiments.md +21 -8
  116. package/docs/guides/troubleshooting.md +90 -26
  117. package/docs/guides/verify-consent.md +23 -8
  118. package/docs/integrations/adobe-analytics.md +60 -64
  119. package/docs/integrations/ahrefs-analytics.md +58 -63
  120. package/docs/integrations/amplitude.md +60 -64
  121. package/docs/integrations/clearbit.md +59 -63
  122. package/docs/integrations/cloudflare-web-analytics.md +56 -60
  123. package/docs/integrations/cloudflare-zaraz.md +55 -57
  124. package/docs/integrations/crisp.md +64 -69
  125. package/docs/integrations/databuddy.md +62 -64
  126. package/docs/integrations/fathom-analytics.md +56 -60
  127. package/docs/integrations/front-chat.md +56 -60
  128. package/docs/integrations/google-maps.md +25 -13
  129. package/docs/integrations/google-tag-manager.md +153 -77
  130. package/docs/integrations/google-tag.md +134 -78
  131. package/docs/integrations/heap.md +56 -60
  132. package/docs/integrations/hightouch.md +55 -60
  133. package/docs/integrations/hotjar.md +60 -64
  134. package/docs/integrations/intercom.md +55 -60
  135. package/docs/integrations/klaviyo.md +65 -66
  136. package/docs/integrations/linkedin-insights.md +58 -63
  137. package/docs/integrations/logrocket.md +55 -60
  138. package/docs/integrations/matomo-analytics.md +58 -60
  139. package/docs/integrations/meta-pixel.md +56 -60
  140. package/docs/integrations/microsoft-clarity.md +57 -60
  141. package/docs/integrations/microsoft-uet.md +58 -61
  142. package/docs/integrations/mixpanel-analytics.md +73 -75
  143. package/docs/integrations/one-dollar-stats.md +53 -59
  144. package/docs/integrations/openai-pixel.md +58 -60
  145. package/docs/integrations/overview.md +59 -42
  146. package/docs/integrations/pinterest-tag.md +56 -60
  147. package/docs/integrations/pirsch.md +54 -60
  148. package/docs/integrations/plausible-analytics.md +55 -60
  149. package/docs/integrations/posthog.md +56 -60
  150. package/docs/integrations/promptwatch.md +57 -63
  151. package/docs/integrations/reddit-pixel.md +57 -60
  152. package/docs/integrations/rudderstack.md +65 -67
  153. package/docs/integrations/rybbit-analytics.md +70 -75
  154. package/docs/integrations/segment.md +56 -60
  155. package/docs/integrations/sentry.md +65 -60
  156. package/docs/integrations/snapchat-pixel.md +54 -60
  157. package/docs/integrations/tiktok-pixel.md +59 -63
  158. package/docs/integrations/umami-analytics.md +54 -60
  159. package/docs/integrations/vercel-analytics.md +53 -59
  160. package/docs/integrations/vercel-speed-insights.md +317 -0
  161. package/docs/integrations/x-pixel.md +57 -63
  162. package/docs/integrations/youtube.md +25 -13
  163. package/package.json +18 -8
  164. 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@alpha` |
20
- | pnpm | `pnpm add @c15t/integrations@alpha` |
21
- | yarn | `yarn add @c15t/integrations@alpha` |
22
- | bun | `bun add @c15t/integrations@alpha` |
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 created a scripts file, such as `lib/scripts.ts` in the
44
- Next.js guide, add the helper to that array instead of creating a second file.
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
- Import the configuration into the client boundary from your router guide:
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
- Keep the server-resolved `state` and shared `consentConfig` from your
59
- router guide. Its manifest, init and save URLs stay in effect. Add
60
- `scripts` as a top-level prop on the existing root:
67
+ ```ts title="c15t.config.ts"
68
+ import { defineConsentConfig } from 'c15t/next';
69
+ import { scripts } from './src/consent-scripts';
61
70
 
62
- ```tsx
63
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
64
- {children}
65
- </ConsentRoot>
71
+ export default defineConsentConfig({ scripts });
66
72
  ```
67
73
 
68
- App Router, Pages Router and static export all use this `ConsentRoot` in
69
- the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
70
- because a Server Component cannot pass script callbacks to it. See
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, `backendURL` and
77
- `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
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 `hosted({ url: 'https://your-project.inth.app' })` value
107
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
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
- backendURL: 'https://your-project.inth.app',
142
+ mode: manifest(),
140
143
  scripts,
141
144
  });
142
145
  ```
143
146
 
144
- Keep your existing backend URL and other options. The plugin starts one
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), the module that the
153
- integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
154
- framework integration in `astro.config.mjs` as they are. If the module
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/consent-client.ts"
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 { ConsentManagerProvider, hosted } from '@c15t/svelte';
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
- <ConsentManagerProvider {mode} {scripts}>
183
+ <ConsentProvider mode={manifest()} {scripts}>
184
184
  <!-- Keep your application, consent UI and preferences link here. -->
185
- </ConsentManagerProvider>
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 provider. Keep the server load
194
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
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 { ConsentManagerProvider, hosted } from '@c15t/svelte';
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
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
204
+ <ConsentRoot state={data.consent} {scripts}>
206
205
  {@render children()}
207
206
  <!-- Keep your consent UI and preferences link here. -->
208
- </ConsentManagerProvider>
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 backend
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
- backendURL: 'https://your-project.inth.app',
241
+ mode: manifest(),
244
242
  scripts,
245
243
  });
246
244
  ```
247
245
 
248
- Keep the backend URL from your quickstart. With
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 throw. |
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@alpha` |
18
- | pnpm | `pnpm add @c15t/integrations@alpha` |
19
- | yarn | `yarn add @c15t/integrations@alpha` |
20
- | bun | `bun add @c15t/integrations@alpha` |
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 created a scripts file, such as `lib/scripts.ts` in the
36
- Next.js guide, add the helper to that array instead of creating a second file.
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
- Import the configuration into the client boundary from your router guide:
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
- Keep the server-resolved `state` and shared `consentConfig` from your
51
- router guide. Its manifest, init and save URLs stay in effect. Add
52
- `scripts` as a top-level prop on the existing root:
57
+ ```ts title="c15t.config.ts"
58
+ import { defineConsentConfig } from 'c15t/next';
59
+ import { scripts } from './src/consent-scripts';
53
60
 
54
- ```tsx
55
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
56
- {children}
57
- </ConsentRoot>
61
+ export default defineConsentConfig({ scripts });
58
62
  ```
59
63
 
60
- App Router, Pages Router and static export all use this `ConsentRoot` in
61
- the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
62
- because a Server Component cannot pass script callbacks to it. See
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, `backendURL` and
69
- `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
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 `hosted({ url: 'https://your-project.inth.app' })` value
99
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
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
- backendURL: 'https://your-project.inth.app',
132
+ mode: manifest(),
132
133
  scripts,
133
134
  });
134
135
  ```
135
136
 
136
- Keep your existing backend URL and other options. The plugin starts one
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), the module that the
145
- integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
146
- framework integration in `astro.config.mjs` as they are. If the module
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/consent-client.ts"
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 { ConsentManagerProvider, hosted } from '@c15t/svelte';
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
- <ConsentManagerProvider {mode} {scripts}>
173
+ <ConsentProvider mode={manifest()} {scripts}>
176
174
  <!-- Keep your application, consent UI and preferences link here. -->
177
- </ConsentManagerProvider>
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 provider. Keep the server load
186
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
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 { ConsentManagerProvider, hosted } from '@c15t/svelte';
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
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
194
+ <ConsentRoot state={data.consent} {scripts}>
198
195
  {@render children()}
199
196
  <!-- Keep your consent UI and preferences link here. -->
200
- </ConsentManagerProvider>
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 backend
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
- backendURL: 'https://your-project.inth.app',
231
+ mode: manifest(),
236
232
  scripts,
237
233
  });
238
234
  ```
239
235
 
240
- Keep the backend URL from your quickstart. With
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 throw. |
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 sets `vendor` to its script ID, so once you declare that vendor a
292
- visitor can turn it off inside an allowed category. See
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.