@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
@@ -2,21 +2,29 @@
2
2
  title: Snapchat Pixel
3
3
  description: Load the Snapchat Pixel only after marketing consent with the c15t
4
4
  snapchatPixel helper, guard snaptr event calls, and check it in DevTools.
5
+ seoTitle: Snapchat Pixel cookie consent with c15t
6
+ seoDescription: Load the Snapchat Pixel only with marketing consent. The c15t
7
+ snapchatPixel helper keeps scevent.min.js off the page until then.
5
8
  icon: snapchat
6
9
  group: integrations
7
10
  ---
8
11
 
12
+ The c15t `snapchatPixel` helper keeps the Snapchat Pixel off the page until
13
+ `marketing` has consent. Until then, c15t does not define `snaptr`. The helper
14
+ sends no consent signal to Snapchat. If the visitor withdraws consent, c15t
15
+ removes the script element. By default, c15t also reloads the page.
16
+
9
17
  ## Configure the Snapchat Pixel
10
18
 
11
19
  Copy the pixel ID from Snapchat Ads Manager. The helper passes it to
12
20
  `snaptr('init', ...)`.
13
21
 
14
- | Package manager | Command |
15
- | :-------------- | :------------------------------------- |
16
- | npm | `npm install @c15t/integrations@alpha` |
17
- | pnpm | `pnpm add @c15t/integrations@alpha` |
18
- | yarn | `yarn add @c15t/integrations@alpha` |
19
- | bun | `bun add @c15t/integrations@alpha` |
22
+ | Package manager | Command |
23
+ | :-------------- | :------------------------------- |
24
+ | npm | `npm install @c15t/integrations` |
25
+ | pnpm | `pnpm add @c15t/integrations` |
26
+ | yarn | `yarn add @c15t/integrations` |
27
+ | bun | `bun add @c15t/integrations` |
20
28
 
21
29
  ```ts title="src/consent-scripts.ts"
22
30
  import { snapchatPixel } from '@c15t/integrations/snapchat-pixel';
@@ -31,51 +39,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
31
39
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
32
40
 
33
41
  The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
34
- quickstart already created a scripts file, such as `lib/scripts.ts` in the
35
- Next.js guide, add the helper to that array instead of creating a second file.
42
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
43
+ in the Next.js guide, add the helper to that array instead of creating a
44
+ second file.
36
45
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
37
46
  point for your framework below. These are edits to that provider, not a second
38
47
  provider.
39
48
 
40
49
  **Next.js**
41
50
 
42
- Import the configuration into the client boundary from your router guide:
43
-
44
- ```ts
45
- import { ConsentRoot } from 'c15t/next';
46
- import { scripts } from './consent-scripts';
47
- ```
51
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
52
+ `next.config.ts`:
48
53
 
49
- Keep the server-resolved `state` and shared `consentConfig` from your
50
- router guide. Its manifest, init and save URLs stay in effect. Add
51
- `scripts` as a top-level prop on the existing root:
54
+ ```ts title="c15t.config.ts"
55
+ import { defineConsentConfig } from 'c15t/next';
56
+ import { scripts } from './src/consent-scripts';
52
57
 
53
- ```tsx
54
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
55
- {children}
56
- </ConsentRoot>
58
+ export default defineConsentConfig({ scripts });
57
59
  ```
58
60
 
59
- App Router, Pages Router and static export all use this `ConsentRoot` in
60
- the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
61
- because a Server Component cannot pass script callbacks to it. See
61
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
62
+ same call. `ConsentRoot` reads the config in the browser, so the layout
63
+ keeps passing only `state`. App Router, Pages Router and static export all
64
+ read the same file. See
62
65
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
63
66
 
64
67
  **TanStack Start**
65
68
 
66
69
  Import the configuration into your root route and pass it to the existing
67
- `ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
68
- `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
70
+ `ConsentRoot` as a top-level prop. Keep the loader from the
71
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
69
72
 
70
73
  ```tsx title="src/routes/__root.tsx"
71
74
  import { scripts } from '../consent-scripts';
72
75
 
73
- <ConsentRoot
74
- state={consent}
75
- backendURL={backendURL}
76
- initRoute={false}
77
- scripts={scripts}
78
- >
76
+ <ConsentRoot state={consent} scripts={scripts}>
79
77
  ```
80
78
 
81
79
  Import vendor helpers in the root route module, not in a server function.
@@ -94,8 +92,8 @@ import { scripts } from './consent-scripts';
94
92
  <ConsentProvider options={{ mode, scripts }}>
95
93
  ```
96
94
 
97
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
98
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
95
+ `mode` is the `manifest()` value from the
96
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
99
97
  dialog and preferences link inside the provider. See
100
98
  [React scripts and embeds](../frameworks/react/scripts.md).
101
99
 
@@ -124,15 +122,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
124
122
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
125
123
 
126
124
  ```ts title="src/main.ts"
125
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
127
126
  import { scripts } from './consent-scripts';
128
127
 
129
128
  app.use(c15tVue, {
130
- backendURL: 'https://your-project.inth.app',
129
+ mode: manifest(),
131
130
  scripts,
132
131
  });
133
132
  ```
134
133
 
135
- Keep your existing backend URL and other options. The plugin starts one
134
+ Keep your existing `mode` and other options. The plugin starts one
136
135
  script loader when the app mounts, after it has applied the visitor's stored
137
136
  choice. Do not also call `createScriptLoader` from a component. See
138
137
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -140,12 +139,11 @@ choice. Do not also call `createScriptLoader` from a component. See
140
139
  **Astro**
141
140
 
142
141
  Add the scripts to the client entrypoint from the
143
- [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
144
- integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
145
- framework integration in `astro.config.mjs` as they are. If the module
146
- already exports scripts, combine the two arrays.
142
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
143
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
144
+ If the module already exports scripts, combine the two arrays.
147
145
 
148
- ```ts title="src/consent-client.ts"
146
+ ```ts title="src/c15t.client.ts"
149
147
  import type { C15tClientOptionsExtension } from 'c15t/astro';
150
148
  import { scripts } from './consent-scripts';
151
149
 
@@ -165,15 +163,13 @@ pass them as a top-level prop:
165
163
 
166
164
  ```svelte title="src/App.svelte"
167
165
  <script lang="ts">
168
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
166
+ import { ConsentProvider, manifest } from '@c15t/svelte';
169
167
  import { scripts } from './consent-scripts';
170
-
171
- const mode = hosted({ url: 'https://your-project.inth.app' });
172
168
  </script>
173
169
 
174
- <ConsentManagerProvider {mode} {scripts}>
170
+ <ConsentProvider mode={manifest()} {scripts}>
175
171
  <!-- Keep your application, consent UI and preferences link here. -->
176
- </ConsentManagerProvider>
172
+ </ConsentProvider>
177
173
  ```
178
174
 
179
175
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -181,22 +177,21 @@ The provider owns the loader and disposes it on unmount.
181
177
 
182
178
  **SvelteKit**
183
179
 
184
- Add the scripts to the existing root layout provider. Keep the server load
185
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
180
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
181
+ handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
186
182
 
187
183
  ```svelte title="src/routes/+layout.svelte"
188
184
  <script lang="ts">
189
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
185
+ import { ConsentRoot } from '@c15t/svelte';
190
186
  import { scripts } from '../consent-scripts';
191
187
 
192
188
  let { children, data } = $props();
193
- const mode = hosted({ url: 'https://your-project.inth.app' });
194
189
  </script>
195
190
 
196
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
191
+ <ConsentRoot state={data.consent} {scripts}>
197
192
  {@render children()}
198
193
  <!-- Keep your consent UI and preferences link here. -->
199
- </ConsentManagerProvider>
194
+ </ConsentRoot>
200
195
  ```
201
196
 
202
197
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -223,20 +218,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
223
218
 
224
219
  **JavaScript**
225
220
 
226
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
227
- URL:
221
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
228
222
 
229
223
  ```ts
230
- import { init } from '@c15t/browser';
224
+ import { init, manifest } from '@c15t/browser';
231
225
  import { scripts } from './consent-scripts';
232
226
 
233
227
  const consent = init({
234
- backendURL: 'https://your-project.inth.app',
228
+ mode: manifest(),
235
229
  scripts,
236
230
  });
237
231
  ```
238
232
 
239
- Keep the backend URL from your quickstart. With
233
+ Keep the mode from your quickstart. With
240
234
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
241
235
  A kernel you create yourself needs a loader from
242
236
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -246,7 +240,7 @@ A kernel you create yourself needs a loader from
246
240
 
247
241
  | Option | Default | Behavior |
248
242
  | --------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
249
- | `pixelId` | Required | Pixel ID passed to `snaptr('init', ...)`. The helper trims it. Empty or whitespace-only values throw. |
243
+ | `pixelId` | Required | Pixel ID passed to `snaptr('init', ...)`. The helper trims it. Empty or whitespace-only values log an error and the script does not load. |
250
244
  | `initOptions` | None | Object passed as the third argument to `snaptr('init', ...)`, such as `user_email`. Pass user data only when your app has the permission it needs. |
251
245
  | `trackPageView` | `true` | Queues `snaptr('track', 'PAGE_VIEW')` after `init`. Set `false` to send page views yourself. |
252
246
  | `scriptUrl` | `https://sc-static.net/scevent.min.js` | Loader URL override. A blank value falls back to the default. |
@@ -316,8 +310,8 @@ permission before each of your own event calls. The reload does not delete
316
310
  cookies the vendor already set; see
317
311
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
318
312
 
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
313
+ The helper lists its vendor by name in the preference dialog, so a visitor can
314
+ turn it off inside an allowed category. See
321
315
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
322
316
  [consent verification guide](../guides/verify-consent.md) covers navigation,
323
317
  expiry and hosting checks.
@@ -2,20 +2,30 @@
2
2
  title: TikTok Pixel
3
3
  description: Load the TikTok Pixel only after marketing consent with the c15t
4
4
  tiktokPixel helper, guard ttq event calls, and check it in DevTools.
5
+ seoTitle: TikTok Pixel cookie consent with c15t
6
+ seoDescription: Load the TikTok Pixel only with marketing consent. The c15t
7
+ tiktokPixel helper calls grantConsent and revokeConsent for you.
5
8
  icon: tiktok
6
9
  group: integrations
7
10
  ---
8
11
 
12
+ The c15t `tiktokPixel` helper keeps the TikTok Pixel off the page until
13
+ `marketing` has consent. Until then, c15t does not define the `ttq` queue. When
14
+ `marketing` has consent, the helper queues `ttq.grantConsent()` and `ttq.page()`
15
+ before the loader. If the visitor withdraws consent, the helper calls
16
+ `ttq.revokeConsent()`. The pixel stays on the page. By default, c15t also
17
+ reloads the page.
18
+
9
19
  ## Configure the TikTok Pixel
10
20
 
11
21
  Copy your TikTok Pixel ID. The helper adds it to the loader URL as `sdkid`.
12
22
 
13
- | Package manager | Command |
14
- | :-------------- | :------------------------------------- |
15
- | npm | `npm install @c15t/integrations@alpha` |
16
- | pnpm | `pnpm add @c15t/integrations@alpha` |
17
- | yarn | `yarn add @c15t/integrations@alpha` |
18
- | bun | `bun add @c15t/integrations@alpha` |
23
+ | Package manager | Command |
24
+ | :-------------- | :------------------------------- |
25
+ | npm | `npm install @c15t/integrations` |
26
+ | pnpm | `pnpm add @c15t/integrations` |
27
+ | yarn | `yarn add @c15t/integrations` |
28
+ | bun | `bun add @c15t/integrations` |
19
29
 
20
30
  ```ts title="src/consent-scripts.ts"
21
31
  import { tiktokPixel } from '@c15t/integrations/tiktok-pixel';
@@ -30,51 +40,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
30
40
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
31
41
 
32
42
  The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
33
- quickstart already created a scripts file, such as `lib/scripts.ts` in the
34
- Next.js guide, add the helper to that array instead of creating a second file.
43
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
44
+ in the Next.js guide, add the helper to that array instead of creating a
45
+ second file.
35
46
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
36
47
  point for your framework below. These are edits to that provider, not a second
37
48
  provider.
38
49
 
39
50
  **Next.js**
40
51
 
41
- Import the configuration into the client boundary from your router guide:
42
-
43
- ```ts
44
- import { ConsentRoot } from 'c15t/next';
45
- import { scripts } from './consent-scripts';
46
- ```
52
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
53
+ `next.config.ts`:
47
54
 
48
- Keep the server-resolved `state` and shared `consentConfig` from your
49
- router guide. Its manifest, init and save URLs stay in effect. Add
50
- `scripts` as a top-level prop on the existing root:
55
+ ```ts title="c15t.config.ts"
56
+ import { defineConsentConfig } from 'c15t/next';
57
+ import { scripts } from './src/consent-scripts';
51
58
 
52
- ```tsx
53
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
54
- {children}
55
- </ConsentRoot>
59
+ export default defineConsentConfig({ scripts });
56
60
  ```
57
61
 
58
- App Router, Pages Router and static export all use this `ConsentRoot` in
59
- the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
60
- because a Server Component cannot pass script callbacks to it. See
62
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
63
+ same call. `ConsentRoot` reads the config in the browser, so the layout
64
+ keeps passing only `state`. App Router, Pages Router and static export all
65
+ read the same file. See
61
66
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
62
67
 
63
68
  **TanStack Start**
64
69
 
65
70
  Import the configuration into your root route and pass it to the existing
66
- `ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
67
- `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
71
+ `ConsentRoot` as a top-level prop. Keep the loader from the
72
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
68
73
 
69
74
  ```tsx title="src/routes/__root.tsx"
70
75
  import { scripts } from '../consent-scripts';
71
76
 
72
- <ConsentRoot
73
- state={consent}
74
- backendURL={backendURL}
75
- initRoute={false}
76
- scripts={scripts}
77
- >
77
+ <ConsentRoot state={consent} scripts={scripts}>
78
78
  ```
79
79
 
80
80
  Import vendor helpers in the root route module, not in a server function.
@@ -93,8 +93,8 @@ import { scripts } from './consent-scripts';
93
93
  <ConsentProvider options={{ mode, scripts }}>
94
94
  ```
95
95
 
96
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
97
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
96
+ `mode` is the `manifest()` value from the
97
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
98
98
  dialog and preferences link inside the provider. See
99
99
  [React scripts and embeds](../frameworks/react/scripts.md).
100
100
 
@@ -123,15 +123,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
123
123
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
124
124
 
125
125
  ```ts title="src/main.ts"
126
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
126
127
  import { scripts } from './consent-scripts';
127
128
 
128
129
  app.use(c15tVue, {
129
- backendURL: 'https://your-project.inth.app',
130
+ mode: manifest(),
130
131
  scripts,
131
132
  });
132
133
  ```
133
134
 
134
- Keep your existing backend URL and other options. The plugin starts one
135
+ Keep your existing `mode` and other options. The plugin starts one
135
136
  script loader when the app mounts, after it has applied the visitor's stored
136
137
  choice. Do not also call `createScriptLoader` from a component. See
137
138
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -139,12 +140,11 @@ choice. Do not also call `createScriptLoader` from a component. See
139
140
  **Astro**
140
141
 
141
142
  Add the scripts to the client entrypoint from the
142
- [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
143
- integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
144
- framework integration in `astro.config.mjs` as they are. If the module
145
- already exports scripts, combine the two arrays.
143
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
144
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
145
+ If the module already exports scripts, combine the two arrays.
146
146
 
147
- ```ts title="src/consent-client.ts"
147
+ ```ts title="src/c15t.client.ts"
148
148
  import type { C15tClientOptionsExtension } from 'c15t/astro';
149
149
  import { scripts } from './consent-scripts';
150
150
 
@@ -164,15 +164,13 @@ pass them as a top-level prop:
164
164
 
165
165
  ```svelte title="src/App.svelte"
166
166
  <script lang="ts">
167
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
167
+ import { ConsentProvider, manifest } from '@c15t/svelte';
168
168
  import { scripts } from './consent-scripts';
169
-
170
- const mode = hosted({ url: 'https://your-project.inth.app' });
171
169
  </script>
172
170
 
173
- <ConsentManagerProvider {mode} {scripts}>
171
+ <ConsentProvider mode={manifest()} {scripts}>
174
172
  <!-- Keep your application, consent UI and preferences link here. -->
175
- </ConsentManagerProvider>
173
+ </ConsentProvider>
176
174
  ```
177
175
 
178
176
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -180,22 +178,21 @@ The provider owns the loader and disposes it on unmount.
180
178
 
181
179
  **SvelteKit**
182
180
 
183
- Add the scripts to the existing root layout provider. Keep the server load
184
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
181
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
182
+ handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
185
183
 
186
184
  ```svelte title="src/routes/+layout.svelte"
187
185
  <script lang="ts">
188
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
186
+ import { ConsentRoot } from '@c15t/svelte';
189
187
  import { scripts } from '../consent-scripts';
190
188
 
191
189
  let { children, data } = $props();
192
- const mode = hosted({ url: 'https://your-project.inth.app' });
193
190
  </script>
194
191
 
195
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
192
+ <ConsentRoot state={data.consent} {scripts}>
196
193
  {@render children()}
197
194
  <!-- Keep your consent UI and preferences link here. -->
198
- </ConsentManagerProvider>
195
+ </ConsentRoot>
199
196
  ```
200
197
 
201
198
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -222,20 +219,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
222
219
 
223
220
  **JavaScript**
224
221
 
225
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
226
- URL:
222
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
227
223
 
228
224
  ```ts
229
- import { init } from '@c15t/browser';
225
+ import { init, manifest } from '@c15t/browser';
230
226
  import { scripts } from './consent-scripts';
231
227
 
232
228
  const consent = init({
233
- backendURL: 'https://your-project.inth.app',
229
+ mode: manifest(),
234
230
  scripts,
235
231
  });
236
232
  ```
237
233
 
238
- Keep the backend URL from your quickstart. With
234
+ Keep the mode from your quickstart. With
239
235
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
240
236
  A kernel you create yourself needs a loader from
241
237
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -243,10 +239,10 @@ A kernel you create yourself needs a loader from
243
239
 
244
240
  ## Options
245
241
 
246
- | Option | Default | Behavior |
247
- | ----------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
248
- | `pixelId` | Required | Pixel ID sent in the loader URL. The helper trims it. Empty or whitespace-only values throw. |
249
- | `scriptSrc` | `https://analytics.tiktok.com/i18n/pixel/events.js` | Loader base URL override. The helper appends `?sdkid=<pixelId>&lib=ttq`. A blank value falls back to the default. |
242
+ | Option | Default | Behavior |
243
+ | ----------- | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
244
+ | `pixelId` | Required | Pixel ID sent in the loader URL. The helper trims it. Empty or whitespace-only values log an error and the script does not load. |
245
+ | `scriptSrc` | `https://analytics.tiktok.com/i18n/pixel/events.js` | Loader base URL override. The helper appends `?sdkid=<pixelId>&lib=ttq`. A blank value falls back to the default. |
250
246
 
251
247
  ## Loading and revocation
252
248
 
@@ -305,8 +301,8 @@ permission before each of your own event calls. The reload does not delete
305
301
  cookies the vendor already set; see
306
302
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
307
303
 
308
- The helper sets `vendor` to its script ID, so once you declare that vendor a
309
- visitor can turn it off inside an allowed category. See
304
+ The helper lists its vendor by name in the preference dialog, so a visitor can
305
+ turn it off inside an allowed category. See
310
306
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
311
307
  [consent verification guide](../guides/verify-consent.md) covers navigation,
312
308
  expiry and hosting checks.