@c15t/react 3.0.0-alpha.9 → 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 (147) hide show
  1. package/AGENTS.md +7 -9
  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/shared/primitives/button.js +1 -1
  20. package/dist/components/shared/surface-styles.js +1 -1
  21. package/dist/consent-gate.js +1 -1
  22. package/dist/context/index.js +1 -1
  23. package/dist/devtools.js +1 -1
  24. package/dist/iab/styles.tw3.css +2 -2
  25. package/dist/iab-dialog-deferred.js +2 -0
  26. package/dist/iab.js +1 -1
  27. package/dist/index-parts/consent-gate.js +1 -1
  28. package/dist/index-parts/core.js +1 -1
  29. package/dist/index-parts/frame.js +1 -0
  30. package/dist/index-parts/hosted.js +1 -0
  31. package/dist/index-parts/offline.js +1 -0
  32. package/dist/index-parts/presets.js +1 -0
  33. package/dist/index.js +1 -1
  34. package/dist/modes.js +1 -0
  35. package/dist/panel-link.js +1 -1
  36. package/dist/panel-trigger.js +1 -1
  37. package/dist/provider.js +1 -1
  38. package/dist/styles.tw3.css +2 -2
  39. package/dist/transports/hosted.js +1 -0
  40. package/dist/transports/manifest.js +1 -0
  41. package/dist/utils/deferred-module.js +1 -1
  42. package/dist/version.js +1 -1
  43. package/dist-types/chunk-warming.d.ts +7 -6
  44. package/dist-types/components/consent-gate/frame.d.ts +19 -0
  45. package/dist-types/components/consent-gate/index.d.ts +3 -19
  46. package/dist-types/components/iab-prompt/iab-prompt.d.ts +1 -1
  47. package/dist-types/components/panel/index.d.ts +1 -1
  48. package/dist-types/components/panel-trigger/toolbar-loader.d.ts +34 -0
  49. package/dist-types/components/preferences/index.d.ts +1 -1
  50. package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
  51. package/dist-types/components/prompt/index.d.ts +1 -1
  52. package/dist-types/components/shared/surface-styles.d.ts +26 -2
  53. package/dist-types/consent-gate.d.ts +1 -1
  54. package/dist-types/context/index.d.ts +3 -3
  55. package/dist-types/context.d.ts +2 -0
  56. package/dist-types/gpp.d.ts +1 -1
  57. package/dist-types/iab-dialog-deferred.d.ts +36 -0
  58. package/dist-types/iab.d.ts +3 -2
  59. package/dist-types/index-parts/consent-gate.d.ts +1 -1
  60. package/dist-types/index-parts/core.d.ts +1 -2
  61. package/dist-types/index-parts/frame.d.ts +7 -0
  62. package/dist-types/index-parts/hosted.d.ts +7 -0
  63. package/dist-types/index-parts/offline.d.ts +7 -0
  64. package/dist-types/index-parts/presets.d.ts +7 -0
  65. package/dist-types/index.d.ts +5 -1
  66. package/dist-types/modes.d.ts +26 -0
  67. package/dist-types/panel-link.d.ts +1 -1
  68. package/dist-types/panel-trigger.d.ts +1 -1
  69. package/dist-types/provider.d.ts +3 -3
  70. package/dist-types/transports/hosted.d.ts +36 -0
  71. package/dist-types/transports/manifest.d.ts +48 -0
  72. package/dist-types/version.d.ts +1 -1
  73. package/docs/README.md +7 -9
  74. package/docs/concepts/choose-your-setup.md +45 -10
  75. package/docs/concepts/consent-categories.md +1 -1
  76. package/docs/concepts/consent-state.md +5 -2
  77. package/docs/concepts/data-fetching.md +100 -42
  78. package/docs/concepts/modes.md +281 -0
  79. package/docs/customization/dark-mode.md +1 -1
  80. package/docs/customization/motion.md +2 -2
  81. package/docs/customization/recipes.md +4 -4
  82. package/docs/customization/slots.md +25 -25
  83. package/docs/customization/stylesheets.md +12 -14
  84. package/docs/customization/tailwind.md +17 -11
  85. package/docs/customization/tokens.md +36 -7
  86. package/docs/frameworks/react/components/consent-banner.md +14 -10
  87. package/docs/frameworks/react/components/consent-dialog.md +14 -10
  88. package/docs/frameworks/react/components/consent-provider.md +51 -44
  89. package/docs/frameworks/react/components.md +14 -10
  90. package/docs/frameworks/react/content-security-policy.md +21 -12
  91. package/docs/frameworks/react/hooks.md +2 -2
  92. package/docs/frameworks/react/iab.md +20 -2
  93. package/docs/frameworks/react/quickstart.md +63 -97
  94. package/docs/frameworks/react/rendering.md +168 -94
  95. package/docs/frameworks/react/scripts.md +19 -28
  96. package/docs/frameworks/react/troubleshooting.md +57 -25
  97. package/docs/frameworks/react/upgrade-v3.md +110 -62
  98. package/docs/guides/banner-experiments.md +21 -6
  99. package/docs/guides/troubleshooting.md +89 -25
  100. package/docs/guides/verify-consent.md +23 -8
  101. package/docs/integrations/adobe-analytics.md +60 -64
  102. package/docs/integrations/ahrefs-analytics.md +58 -63
  103. package/docs/integrations/amplitude.md +60 -64
  104. package/docs/integrations/clearbit.md +59 -63
  105. package/docs/integrations/cloudflare-web-analytics.md +56 -60
  106. package/docs/integrations/cloudflare-zaraz.md +55 -57
  107. package/docs/integrations/crisp.md +64 -69
  108. package/docs/integrations/databuddy.md +62 -64
  109. package/docs/integrations/fathom-analytics.md +56 -60
  110. package/docs/integrations/front-chat.md +56 -60
  111. package/docs/integrations/google-maps.md +25 -13
  112. package/docs/integrations/google-tag-manager.md +153 -77
  113. package/docs/integrations/google-tag.md +134 -78
  114. package/docs/integrations/heap.md +56 -60
  115. package/docs/integrations/hightouch.md +55 -60
  116. package/docs/integrations/hotjar.md +60 -64
  117. package/docs/integrations/intercom.md +55 -60
  118. package/docs/integrations/klaviyo.md +65 -66
  119. package/docs/integrations/linkedin-insights.md +58 -63
  120. package/docs/integrations/logrocket.md +55 -60
  121. package/docs/integrations/matomo-analytics.md +58 -60
  122. package/docs/integrations/meta-pixel.md +56 -60
  123. package/docs/integrations/microsoft-clarity.md +57 -60
  124. package/docs/integrations/microsoft-uet.md +58 -61
  125. package/docs/integrations/mixpanel-analytics.md +73 -75
  126. package/docs/integrations/one-dollar-stats.md +53 -59
  127. package/docs/integrations/openai-pixel.md +58 -60
  128. package/docs/integrations/overview.md +59 -42
  129. package/docs/integrations/pinterest-tag.md +56 -60
  130. package/docs/integrations/pirsch.md +54 -60
  131. package/docs/integrations/plausible-analytics.md +55 -60
  132. package/docs/integrations/posthog.md +56 -60
  133. package/docs/integrations/promptwatch.md +57 -63
  134. package/docs/integrations/reddit-pixel.md +57 -60
  135. package/docs/integrations/rudderstack.md +65 -67
  136. package/docs/integrations/rybbit-analytics.md +70 -75
  137. package/docs/integrations/segment.md +56 -60
  138. package/docs/integrations/sentry.md +65 -60
  139. package/docs/integrations/snapchat-pixel.md +54 -60
  140. package/docs/integrations/tiktok-pixel.md +59 -63
  141. package/docs/integrations/umami-analytics.md +54 -60
  142. package/docs/integrations/vercel-analytics.md +53 -59
  143. package/docs/integrations/vercel-speed-insights.md +317 -0
  144. package/docs/integrations/x-pixel.md +57 -63
  145. package/docs/integrations/youtube.md +25 -13
  146. package/package.json +18 -8
  147. package/docs/upgrade-v3.md +0 -429
@@ -3,22 +3,30 @@ title: Umami Analytics
3
3
  description: Load the Umami Analytics tracker only after measurement consent
4
4
  with the c15t umamiAnalytics helper, point it at a self-hosted instance, and
5
5
  check it in DevTools.
6
+ seoTitle: Umami Analytics cookie consent with c15t
7
+ seoDescription: Load the Umami tracker only with measurement consent. Set it up
8
+ with the c15t umamiAnalytics helper and check it in DevTools.
6
9
  icon: umami-analytics
7
10
  group: integrations
8
11
  ---
9
12
 
13
+ The c15t `umamiAnalytics` helper keeps the Umami tracker off the page until
14
+ `measurement` has consent. The helper sends no consent signal to Umami. If the
15
+ visitor withdraws consent, c15t removes the script element. By default, c15t
16
+ also reloads the page.
17
+
10
18
  ## Configure Umami Analytics
11
19
 
12
20
  Copy the website ID from your Umami tracking code. The helper passes it to the
13
21
  script as `data-website-id`. For a self-hosted Umami instance, set `scriptUrl`
14
22
  to your instance's tracker script.
15
23
 
16
- | Package manager | Command |
17
- | :-------------- | :------------------------------------- |
18
- | npm | `npm install @c15t/integrations@alpha` |
19
- | pnpm | `pnpm add @c15t/integrations@alpha` |
20
- | yarn | `yarn add @c15t/integrations@alpha` |
21
- | bun | `bun add @c15t/integrations@alpha` |
24
+ | Package manager | Command |
25
+ | :-------------- | :------------------------------- |
26
+ | npm | `npm install @c15t/integrations` |
27
+ | pnpm | `pnpm add @c15t/integrations` |
28
+ | yarn | `yarn add @c15t/integrations` |
29
+ | bun | `bun add @c15t/integrations` |
22
30
 
23
31
  ```ts title="src/consent-scripts.ts"
24
32
  import { umamiAnalytics } from '@c15t/integrations/umami-analytics';
@@ -33,51 +41,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
33
41
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
34
42
 
35
43
  The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
36
- quickstart already created a scripts file, such as `lib/scripts.ts` in the
37
- Next.js guide, add the helper to that array instead of creating a second file.
44
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
45
+ in the Next.js guide, add the helper to that array instead of creating a
46
+ second file.
38
47
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
39
48
  point for your framework below. These are edits to that provider, not a second
40
49
  provider.
41
50
 
42
51
  **Next.js**
43
52
 
44
- Import the configuration into the client boundary from your router guide:
45
-
46
- ```ts
47
- import { ConsentRoot } from 'c15t/next';
48
- import { scripts } from './consent-scripts';
49
- ```
53
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
54
+ `next.config.ts`:
50
55
 
51
- Keep the server-resolved `state` and shared `consentConfig` from your
52
- router guide. Its manifest, init and save URLs stay in effect. Add
53
- `scripts` as a top-level prop on the existing root:
56
+ ```ts title="c15t.config.ts"
57
+ import { defineConsentConfig } from 'c15t/next';
58
+ import { scripts } from './src/consent-scripts';
54
59
 
55
- ```tsx
56
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
57
- {children}
58
- </ConsentRoot>
60
+ export default defineConsentConfig({ scripts });
59
61
  ```
60
62
 
61
- App Router, Pages Router and static export all use this `ConsentRoot` in
62
- the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
63
- because a Server Component cannot pass script callbacks to it. See
63
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
64
+ same call. `ConsentRoot` reads the config in the browser, so the layout
65
+ keeps passing only `state`. App Router, Pages Router and static export all
66
+ read the same file. See
64
67
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
65
68
 
66
69
  **TanStack Start**
67
70
 
68
71
  Import the configuration into your root route and pass it to the existing
69
- `ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
70
- `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
72
+ `ConsentRoot` as a top-level prop. Keep the loader from the
73
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
71
74
 
72
75
  ```tsx title="src/routes/__root.tsx"
73
76
  import { scripts } from '../consent-scripts';
74
77
 
75
- <ConsentRoot
76
- state={consent}
77
- backendURL={backendURL}
78
- initRoute={false}
79
- scripts={scripts}
80
- >
78
+ <ConsentRoot state={consent} scripts={scripts}>
81
79
  ```
82
80
 
83
81
  Import vendor helpers in the root route module, not in a server function.
@@ -96,8 +94,8 @@ import { scripts } from './consent-scripts';
96
94
  <ConsentProvider options={{ mode, scripts }}>
97
95
  ```
98
96
 
99
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
100
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
97
+ `mode` is the `manifest()` value from the
98
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
101
99
  dialog and preferences link inside the provider. See
102
100
  [React scripts and embeds](../frameworks/react/scripts.md).
103
101
 
@@ -126,15 +124,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
126
124
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
127
125
 
128
126
  ```ts title="src/main.ts"
127
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
129
128
  import { scripts } from './consent-scripts';
130
129
 
131
130
  app.use(c15tVue, {
132
- backendURL: 'https://your-project.inth.app',
131
+ mode: manifest(),
133
132
  scripts,
134
133
  });
135
134
  ```
136
135
 
137
- Keep your existing backend URL and other options. The plugin starts one
136
+ Keep your existing `mode` and other options. The plugin starts one
138
137
  script loader when the app mounts, after it has applied the visitor's stored
139
138
  choice. Do not also call `createScriptLoader` from a component. See
140
139
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -142,12 +141,11 @@ choice. Do not also call `createScriptLoader` from a component. See
142
141
  **Astro**
143
142
 
144
143
  Add the scripts to the client entrypoint from the
145
- [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
146
- integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
147
- framework integration in `astro.config.mjs` as they are. If the module
148
- already exports scripts, combine the two arrays.
144
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
145
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
146
+ If the module already exports scripts, combine the two arrays.
149
147
 
150
- ```ts title="src/consent-client.ts"
148
+ ```ts title="src/c15t.client.ts"
151
149
  import type { C15tClientOptionsExtension } from 'c15t/astro';
152
150
  import { scripts } from './consent-scripts';
153
151
 
@@ -167,15 +165,13 @@ pass them as a top-level prop:
167
165
 
168
166
  ```svelte title="src/App.svelte"
169
167
  <script lang="ts">
170
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
168
+ import { ConsentProvider, manifest } from '@c15t/svelte';
171
169
  import { scripts } from './consent-scripts';
172
-
173
- const mode = hosted({ url: 'https://your-project.inth.app' });
174
170
  </script>
175
171
 
176
- <ConsentManagerProvider {mode} {scripts}>
172
+ <ConsentProvider mode={manifest()} {scripts}>
177
173
  <!-- Keep your application, consent UI and preferences link here. -->
178
- </ConsentManagerProvider>
174
+ </ConsentProvider>
179
175
  ```
180
176
 
181
177
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -183,22 +179,21 @@ The provider owns the loader and disposes it on unmount.
183
179
 
184
180
  **SvelteKit**
185
181
 
186
- Add the scripts to the existing root layout provider. Keep the server load
187
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
182
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
183
+ handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
188
184
 
189
185
  ```svelte title="src/routes/+layout.svelte"
190
186
  <script lang="ts">
191
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
187
+ import { ConsentRoot } from '@c15t/svelte';
192
188
  import { scripts } from '../consent-scripts';
193
189
 
194
190
  let { children, data } = $props();
195
- const mode = hosted({ url: 'https://your-project.inth.app' });
196
191
  </script>
197
192
 
198
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
193
+ <ConsentRoot state={data.consent} {scripts}>
199
194
  {@render children()}
200
195
  <!-- Keep your consent UI and preferences link here. -->
201
- </ConsentManagerProvider>
196
+ </ConsentRoot>
202
197
  ```
203
198
 
204
199
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -225,20 +220,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
225
220
 
226
221
  **JavaScript**
227
222
 
228
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
229
- URL:
223
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
230
224
 
231
225
  ```ts
232
- import { init } from '@c15t/browser';
226
+ import { init, manifest } from '@c15t/browser';
233
227
  import { scripts } from './consent-scripts';
234
228
 
235
229
  const consent = init({
236
- backendURL: 'https://your-project.inth.app',
230
+ mode: manifest(),
237
231
  scripts,
238
232
  });
239
233
  ```
240
234
 
241
- Keep the backend URL from your quickstart. With
235
+ Keep the mode from your quickstart. With
242
236
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
243
237
  A kernel you create yourself needs a loader from
244
238
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -248,7 +242,7 @@ A kernel you create yourself needs a loader from
248
242
 
249
243
  | Option | Default | Behavior |
250
244
  | ------------ | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
251
- | `websiteId` | Required | Set as `data-website-id`. Empty or whitespace-only values throw. |
245
+ | `websiteId` | Required | Set as `data-website-id`. Empty or whitespace-only values log an error and the script does not load. |
252
246
  | `hostUrl` | None | Host that receives events, set as `data-host-url`. |
253
247
  | `autoTrack` | None | `false` sets `data-auto-track="false"` and stops automatic tracking. |
254
248
  | `domains` | None | Domains to track, set as `data-domains`. Pass a comma-separated string or an array; the helper joins an array with commas. |
@@ -293,8 +287,8 @@ permission before each of your own event calls. The reload does not delete
293
287
  cookies the vendor already set; see
294
288
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
295
289
 
296
- The helper sets `vendor` to its script ID, so once you declare that vendor a
297
- visitor can turn it off inside an allowed category. See
290
+ The helper lists its vendor by name in the preference dialog, so a visitor can
291
+ turn it off inside an allowed category. See
298
292
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
299
293
  [consent verification guide](../guides/verify-consent.md) covers navigation,
300
294
  expiry and hosting checks.
@@ -3,22 +3,30 @@ title: Vercel Analytics
3
3
  description: Load the Vercel Web Analytics script only after measurement consent
4
4
  with the c15t vercelAnalytics helper, choose the debug script, and check it in
5
5
  DevTools.
6
+ seoTitle: Vercel Analytics cookie consent with c15t
7
+ seoDescription: Load Vercel Web Analytics only with measurement consent. Set it
8
+ up with the c15t vercelAnalytics helper and check it in DevTools.
6
9
  icon: vercel-analytics
7
10
  group: integrations
8
11
  ---
9
12
 
13
+ The c15t `vercelAnalytics` helper keeps Vercel Web Analytics off the page until
14
+ `measurement` has consent. Until then, c15t does not define `window.va`. The
15
+ helper sends no consent signal to Vercel. If the visitor withdraws consent, c15t
16
+ removes the script element. By default, c15t also reloads the page.
17
+
10
18
  ## Configure Vercel Analytics
11
19
 
12
20
  Enable Web Analytics for the project in Vercel. Remove the `Analytics`
13
21
  component or `inject()` call from `@vercel/analytics` so c15t loads the
14
22
  script once.
15
23
 
16
- | Package manager | Command |
17
- | :-------------- | :------------------------------------- |
18
- | npm | `npm install @c15t/integrations@alpha` |
19
- | pnpm | `pnpm add @c15t/integrations@alpha` |
20
- | yarn | `yarn add @c15t/integrations@alpha` |
21
- | bun | `bun add @c15t/integrations@alpha` |
24
+ | Package manager | Command |
25
+ | :-------------- | :------------------------------- |
26
+ | npm | `npm install @c15t/integrations` |
27
+ | pnpm | `pnpm add @c15t/integrations` |
28
+ | yarn | `yarn add @c15t/integrations` |
29
+ | bun | `bun add @c15t/integrations` |
22
30
 
23
31
  ```ts title="src/consent-scripts.ts"
24
32
  import { vercelAnalytics } from '@c15t/integrations/vercel-analytics';
@@ -33,51 +41,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
33
41
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
34
42
 
35
43
  The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
36
- quickstart already created a scripts file, such as `lib/scripts.ts` in the
37
- Next.js guide, add the helper to that array instead of creating a second file.
44
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
45
+ in the Next.js guide, add the helper to that array instead of creating a
46
+ second file.
38
47
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
39
48
  point for your framework below. These are edits to that provider, not a second
40
49
  provider.
41
50
 
42
51
  **Next.js**
43
52
 
44
- Import the configuration into the client boundary from your router guide:
45
-
46
- ```ts
47
- import { ConsentRoot } from 'c15t/next';
48
- import { scripts } from './consent-scripts';
49
- ```
53
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
54
+ `next.config.ts`:
50
55
 
51
- Keep the server-resolved `state` and shared `consentConfig` from your
52
- router guide. Its manifest, init and save URLs stay in effect. Add
53
- `scripts` as a top-level prop on the existing root:
56
+ ```ts title="c15t.config.ts"
57
+ import { defineConsentConfig } from 'c15t/next';
58
+ import { scripts } from './src/consent-scripts';
54
59
 
55
- ```tsx
56
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
57
- {children}
58
- </ConsentRoot>
60
+ export default defineConsentConfig({ scripts });
59
61
  ```
60
62
 
61
- App Router, Pages Router and static export all use this `ConsentRoot` in
62
- the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
63
- because a Server Component cannot pass script callbacks to it. See
63
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
64
+ same call. `ConsentRoot` reads the config in the browser, so the layout
65
+ keeps passing only `state`. App Router, Pages Router and static export all
66
+ read the same file. See
64
67
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
65
68
 
66
69
  **TanStack Start**
67
70
 
68
71
  Import the configuration into your root route and pass it to the existing
69
- `ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
70
- `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
72
+ `ConsentRoot` as a top-level prop. Keep the loader from the
73
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
71
74
 
72
75
  ```tsx title="src/routes/__root.tsx"
73
76
  import { scripts } from '../consent-scripts';
74
77
 
75
- <ConsentRoot
76
- state={consent}
77
- backendURL={backendURL}
78
- initRoute={false}
79
- scripts={scripts}
80
- >
78
+ <ConsentRoot state={consent} scripts={scripts}>
81
79
  ```
82
80
 
83
81
  Import vendor helpers in the root route module, not in a server function.
@@ -96,8 +94,8 @@ import { scripts } from './consent-scripts';
96
94
  <ConsentProvider options={{ mode, scripts }}>
97
95
  ```
98
96
 
99
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
100
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
97
+ `mode` is the `manifest()` value from the
98
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
101
99
  dialog and preferences link inside the provider. See
102
100
  [React scripts and embeds](../frameworks/react/scripts.md).
103
101
 
@@ -126,15 +124,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
126
124
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
127
125
 
128
126
  ```ts title="src/main.ts"
127
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
129
128
  import { scripts } from './consent-scripts';
130
129
 
131
130
  app.use(c15tVue, {
132
- backendURL: 'https://your-project.inth.app',
131
+ mode: manifest(),
133
132
  scripts,
134
133
  });
135
134
  ```
136
135
 
137
- Keep your existing backend URL and other options. The plugin starts one
136
+ Keep your existing `mode` and other options. The plugin starts one
138
137
  script loader when the app mounts, after it has applied the visitor's stored
139
138
  choice. Do not also call `createScriptLoader` from a component. See
140
139
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -142,12 +141,11 @@ choice. Do not also call `createScriptLoader` from a component. See
142
141
  **Astro**
143
142
 
144
143
  Add the scripts to the client entrypoint from the
145
- [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
146
- integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
147
- framework integration in `astro.config.mjs` as they are. If the module
148
- already exports scripts, combine the two arrays.
144
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
145
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
146
+ If the module already exports scripts, combine the two arrays.
149
147
 
150
- ```ts title="src/consent-client.ts"
148
+ ```ts title="src/c15t.client.ts"
151
149
  import type { C15tClientOptionsExtension } from 'c15t/astro';
152
150
  import { scripts } from './consent-scripts';
153
151
 
@@ -167,15 +165,13 @@ pass them as a top-level prop:
167
165
 
168
166
  ```svelte title="src/App.svelte"
169
167
  <script lang="ts">
170
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
168
+ import { ConsentProvider, manifest } from '@c15t/svelte';
171
169
  import { scripts } from './consent-scripts';
172
-
173
- const mode = hosted({ url: 'https://your-project.inth.app' });
174
170
  </script>
175
171
 
176
- <ConsentManagerProvider {mode} {scripts}>
172
+ <ConsentProvider mode={manifest()} {scripts}>
177
173
  <!-- Keep your application, consent UI and preferences link here. -->
178
- </ConsentManagerProvider>
174
+ </ConsentProvider>
179
175
  ```
180
176
 
181
177
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -183,22 +179,21 @@ The provider owns the loader and disposes it on unmount.
183
179
 
184
180
  **SvelteKit**
185
181
 
186
- Add the scripts to the existing root layout provider. Keep the server load
187
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
182
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
183
+ handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
188
184
 
189
185
  ```svelte title="src/routes/+layout.svelte"
190
186
  <script lang="ts">
191
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
187
+ import { ConsentRoot } from '@c15t/svelte';
192
188
  import { scripts } from '../consent-scripts';
193
189
 
194
190
  let { children, data } = $props();
195
- const mode = hosted({ url: 'https://your-project.inth.app' });
196
191
  </script>
197
192
 
198
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
193
+ <ConsentRoot state={data.consent} {scripts}>
199
194
  {@render children()}
200
195
  <!-- Keep your consent UI and preferences link here. -->
201
- </ConsentManagerProvider>
196
+ </ConsentRoot>
202
197
  ```
203
198
 
204
199
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -225,20 +220,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
225
220
 
226
221
  **JavaScript**
227
222
 
228
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
229
- URL:
223
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
230
224
 
231
225
  ```ts
232
- import { init } from '@c15t/browser';
226
+ import { init, manifest } from '@c15t/browser';
233
227
  import { scripts } from './consent-scripts';
234
228
 
235
229
  const consent = init({
236
- backendURL: 'https://your-project.inth.app',
230
+ mode: manifest(),
237
231
  scripts,
238
232
  });
239
233
  ```
240
234
 
241
- Keep the backend URL from your quickstart. With
235
+ Keep the mode from your quickstart. With
242
236
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
243
237
  A kernel you create yourself needs a loader from
244
238
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -295,8 +289,8 @@ permission before each of your own event calls. The reload does not delete
295
289
  cookies the vendor already set; see
296
290
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
297
291
 
298
- The helper sets `vendor` to its script ID, so once you declare that vendor a
299
- visitor can turn it off inside an allowed category. See
292
+ The helper lists its vendor by name in the preference dialog, so a visitor can
293
+ turn it off inside an allowed category. See
300
294
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
301
295
  [consent verification guide](../guides/verify-consent.md) covers navigation,
302
296
  expiry and hosting checks.