@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
@@ -2,22 +2,34 @@
2
2
  title: Matomo Analytics
3
3
  description: Load Matomo after measurement consent with the c15t matomoAnalytics
4
4
  helper, or use Matomo's own consent mode, and check each mode in DevTools.
5
+ seoTitle: Matomo cookie consent with c15t
6
+ seoDescription: Load Matomo only after measurement consent, or load it on every
7
+ page and use the Matomo consent API. Set it up with the c15t matomoAnalytics
8
+ helper.
5
9
  icon: matomo
6
10
  group: integrations
7
11
  ---
8
12
 
13
+ By default, the c15t `matomoAnalytics` helper keeps Matomo off the page until
14
+ `measurement` has consent. In this mode, the helper sends no consent signal to
15
+ Matomo. With `defaultConsent`, the helper loads `matomo.js` on every page,
16
+ before the visitor chooses. The helper then uses the Matomo consent API. It
17
+ calls `requireConsent` while `measurement` has no consent, `setConsentGiven`
18
+ while it has consent, and `forgetConsentGiven` after the visitor withdraws
19
+ consent.
20
+
9
21
  ## Configure Matomo Analytics
10
22
 
11
23
  Copy the site ID and your Matomo URL from the Matomo tracking code. For Matomo
12
24
  Cloud, pass `cloudId`, for example `'your-site.matomo.cloud'`, instead of
13
25
  `matomoUrl`.
14
26
 
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` |
27
+ | Package manager | Command |
28
+ | :-------------- | :------------------------------- |
29
+ | npm | `npm install @c15t/integrations` |
30
+ | pnpm | `pnpm add @c15t/integrations` |
31
+ | yarn | `yarn add @c15t/integrations` |
32
+ | bun | `bun add @c15t/integrations` |
21
33
 
22
34
  ```ts title="src/consent-scripts.ts"
23
35
  import { matomoAnalytics } from '@c15t/integrations/matomo-analytics';
@@ -34,51 +46,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
34
46
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
35
47
 
36
48
  The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
37
- quickstart already created a scripts file, such as `lib/scripts.ts` in the
38
- Next.js guide, add the helper to that array instead of creating a second file.
49
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
50
+ in the Next.js guide, add the helper to that array instead of creating a
51
+ second file.
39
52
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
40
53
  point for your framework below. These are edits to that provider, not a second
41
54
  provider.
42
55
 
43
56
  **Next.js**
44
57
 
45
- Import the configuration into the client boundary from your router guide:
46
-
47
- ```ts
48
- import { ConsentRoot } from 'c15t/next';
49
- import { scripts } from './consent-scripts';
50
- ```
58
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
59
+ `next.config.ts`:
51
60
 
52
- Keep the server-resolved `state` and shared `consentConfig` from your
53
- router guide. Its manifest, init and save URLs stay in effect. Add
54
- `scripts` as a top-level prop on the existing root:
61
+ ```ts title="c15t.config.ts"
62
+ import { defineConsentConfig } from 'c15t/next';
63
+ import { scripts } from './src/consent-scripts';
55
64
 
56
- ```tsx
57
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
58
- {children}
59
- </ConsentRoot>
65
+ export default defineConsentConfig({ scripts });
60
66
  ```
61
67
 
62
- App Router, Pages Router and static export all use this `ConsentRoot` in
63
- the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
64
- because a Server Component cannot pass script callbacks to it. See
68
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
69
+ same call. `ConsentRoot` reads the config in the browser, so the layout
70
+ keeps passing only `state`. App Router, Pages Router and static export all
71
+ read the same file. See
65
72
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
66
73
 
67
74
  **TanStack Start**
68
75
 
69
76
  Import the configuration into your root route and pass it to the existing
70
- `ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
71
- `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
77
+ `ConsentRoot` as a top-level prop. Keep the loader from the
78
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
72
79
 
73
80
  ```tsx title="src/routes/__root.tsx"
74
81
  import { scripts } from '../consent-scripts';
75
82
 
76
- <ConsentRoot
77
- state={consent}
78
- backendURL={backendURL}
79
- initRoute={false}
80
- scripts={scripts}
81
- >
83
+ <ConsentRoot state={consent} scripts={scripts}>
82
84
  ```
83
85
 
84
86
  Import vendor helpers in the root route module, not in a server function.
@@ -97,8 +99,8 @@ import { scripts } from './consent-scripts';
97
99
  <ConsentProvider options={{ mode, scripts }}>
98
100
  ```
99
101
 
100
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
101
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
102
+ `mode` is the `manifest()` value from the
103
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
102
104
  dialog and preferences link inside the provider. See
103
105
  [React scripts and embeds](../frameworks/react/scripts.md).
104
106
 
@@ -127,15 +129,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
127
129
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
128
130
 
129
131
  ```ts title="src/main.ts"
132
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
130
133
  import { scripts } from './consent-scripts';
131
134
 
132
135
  app.use(c15tVue, {
133
- backendURL: 'https://your-project.inth.app',
136
+ mode: manifest(),
134
137
  scripts,
135
138
  });
136
139
  ```
137
140
 
138
- Keep your existing backend URL and other options. The plugin starts one
141
+ Keep your existing `mode` and other options. The plugin starts one
139
142
  script loader when the app mounts, after it has applied the visitor's stored
140
143
  choice. Do not also call `createScriptLoader` from a component. See
141
144
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -143,12 +146,11 @@ choice. Do not also call `createScriptLoader` from a component. See
143
146
  **Astro**
144
147
 
145
148
  Add the scripts to the client entrypoint from the
146
- [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
147
- integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
148
- framework integration in `astro.config.mjs` as they are. If the module
149
- already exports scripts, combine the two arrays.
149
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
150
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
151
+ If the module already exports scripts, combine the two arrays.
150
152
 
151
- ```ts title="src/consent-client.ts"
153
+ ```ts title="src/c15t.client.ts"
152
154
  import type { C15tClientOptionsExtension } from 'c15t/astro';
153
155
  import { scripts } from './consent-scripts';
154
156
 
@@ -168,15 +170,13 @@ pass them as a top-level prop:
168
170
 
169
171
  ```svelte title="src/App.svelte"
170
172
  <script lang="ts">
171
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
173
+ import { ConsentProvider, manifest } from '@c15t/svelte';
172
174
  import { scripts } from './consent-scripts';
173
-
174
- const mode = hosted({ url: 'https://your-project.inth.app' });
175
175
  </script>
176
176
 
177
- <ConsentManagerProvider {mode} {scripts}>
177
+ <ConsentProvider mode={manifest()} {scripts}>
178
178
  <!-- Keep your application, consent UI and preferences link here. -->
179
- </ConsentManagerProvider>
179
+ </ConsentProvider>
180
180
  ```
181
181
 
182
182
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -184,22 +184,21 @@ The provider owns the loader and disposes it on unmount.
184
184
 
185
185
  **SvelteKit**
186
186
 
187
- Add the scripts to the existing root layout provider. Keep the server load
188
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
187
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
188
+ handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
189
189
 
190
190
  ```svelte title="src/routes/+layout.svelte"
191
191
  <script lang="ts">
192
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
192
+ import { ConsentRoot } from '@c15t/svelte';
193
193
  import { scripts } from '../consent-scripts';
194
194
 
195
195
  let { children, data } = $props();
196
- const mode = hosted({ url: 'https://your-project.inth.app' });
197
196
  </script>
198
197
 
199
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
198
+ <ConsentRoot state={data.consent} {scripts}>
200
199
  {@render children()}
201
200
  <!-- Keep your consent UI and preferences link here. -->
202
- </ConsentManagerProvider>
201
+ </ConsentRoot>
203
202
  ```
204
203
 
205
204
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -226,20 +225,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
226
225
 
227
226
  **JavaScript**
228
227
 
229
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
230
- URL:
228
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
231
229
 
232
230
  ```ts
233
- import { init } from '@c15t/browser';
231
+ import { init, manifest } from '@c15t/browser';
234
232
  import { scripts } from './consent-scripts';
235
233
 
236
234
  const consent = init({
237
- backendURL: 'https://your-project.inth.app',
235
+ mode: manifest(),
238
236
  scripts,
239
237
  });
240
238
  ```
241
239
 
242
- Keep the backend URL from your quickstart. With
240
+ Keep the mode from your quickstart. With
243
241
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
244
242
  A kernel you create yourself needs a loader from
245
243
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -252,7 +250,7 @@ A kernel you create yourself needs a loader from
252
250
  | `matomoUrl` | None | Self-hosted Matomo base URL. The helper loads `<matomoUrl>/matomo.js` and sends hits to `<matomoUrl>/matomo.php`. |
253
251
  | `cloudId` | None | Matomo Cloud ID, used when `matomoUrl` is not set. A value ending in `.matomo.cloud` becomes `https://<cloudId>`. Any other value becomes `https://cdn.matomo.cloud/<cloudId>`. |
254
252
  | `trackerUrl` | `matomo.php` on the Matomo origin | Tracker endpoint override. |
255
- | `scriptUrl` | `matomo.js` on the Matomo origin | Loader URL override. Without `matomoUrl` or `cloudId`, set both `trackerUrl` and `scriptUrl`, or the helper throws. |
253
+ | `scriptUrl` | `matomo.js` on the Matomo origin | Loader URL override. Without `matomoUrl` or `cloudId`, set both `trackerUrl` and `scriptUrl`, or the helper logs an error and the script does not load. |
256
254
  | `siteId` | `1` | Site ID queued with `setSiteId`. |
257
255
  | `trackPageView` | `true` | Queues `trackPageView`. The table below shows when. |
258
256
  | `enableLinkTracking` | `false` | Queues `enableLinkTracking`. |
@@ -304,8 +302,8 @@ permission before each of your own event calls. The reload does not delete
304
302
  cookies the vendor already set; see
305
303
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
306
304
 
307
- The helper sets `vendor` to its script ID, so once you declare that vendor a
308
- visitor can turn it off inside an allowed category. See
305
+ The helper lists its vendor by name in the preference dialog, so a visitor can
306
+ turn it off inside an allowed category. See
309
307
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
310
308
  [consent verification guide](../guides/verify-consent.md) covers navigation,
311
309
  expiry and hosting checks.
@@ -2,22 +2,32 @@
2
2
  title: Meta Pixel
3
3
  description: Load the Meta Pixel only after marketing consent with the c15t
4
4
  metaPixel helper, guard fbq event calls, and check it in DevTools.
5
+ seoTitle: Meta Pixel cookie consent with c15t
6
+ seoDescription: Load the Meta Pixel only with marketing consent. The c15t
7
+ metaPixel helper sends fbq consent grant and revoke signals for you.
5
8
  icon: meta
6
9
  group: integrations
7
10
  ---
8
11
 
12
+ The c15t `metaPixel` helper keeps the Meta Pixel off the page until `marketing`
13
+ has consent. Until then, c15t does not define `fbq`. When `marketing` has
14
+ consent, the helper queues `fbq('consent', 'grant')` before `init` and the page
15
+ view. If the visitor withdraws consent, the helper calls
16
+ `fbq('consent', 'revoke')`. The script stays on the page. By default, c15t also
17
+ reloads the page.
18
+
9
19
  ## Configure the Meta Pixel
10
20
 
11
21
  Copy the pixel ID from Meta Events Manager. Remove the original pixel snippet,
12
22
  its `<noscript>` tracking image and any tag-manager entry that loads the same
13
23
  pixel.
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 { metaPixel } from '@c15t/integrations/meta-pixel';
@@ -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
- | `pixelId` | Required | Pixel ID passed to `fbq('init', ...)`. The helper trims it. Empty or whitespace-only values throw. |
246
+ | `pixelId` | Required | Pixel ID passed to `fbq('init', ...)`. The helper trims it. Empty or whitespace-only values log an error and the script does not load. |
251
247
  | `initOptions` | None | Object passed as the third argument to `fbq('init', ...)`. |
252
248
  | `trackPageView` | `true` | Queues `fbq('track', 'PageView')` after `init`. Set `false` to send page views yourself. |
253
249
  | `dataProcessingOptions` | None | `{ options, country?, state? }`. Queues `fbq('dataProcessingOptions', ...)` before `init`, for example `{ options: ['LDU'], country: 1, state: 1000 }` for Limited Data Use in California. |
@@ -316,8 +312,8 @@ permission before each of your own event calls. The reload does not delete
316
312
  cookies the vendor already set; see
317
313
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
318
314
 
319
- The helper sets `vendor` to its script ID, so once you declare that vendor a
320
- visitor can turn it off inside an allowed category. See
315
+ The helper lists its vendor by name in the preference dialog, so a visitor can
316
+ turn it off inside an allowed category. See
321
317
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
322
318
  [consent verification guide](../guides/verify-consent.md) covers navigation,
323
319
  expiry and hosting checks.