@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,21 +2,31 @@
2
2
  title: Clearbit
3
3
  description: Load the Clearbit enrichment tag only after marketing consent with
4
4
  the c15t clearbit helper, and check it in DevTools.
5
+ seoTitle: Clearbit cookie consent with c15t
6
+ seoDescription: Load Clearbit only with marketing consent, because Clearbit
7
+ identifies visitors and their companies. Set it up with the c15t clearbit
8
+ helper.
5
9
  icon: clearbit
6
10
  group: integrations
7
11
  ---
8
12
 
13
+ The c15t `clearbit` helper keeps the Clearbit tag, `tags.js`, off the page until
14
+ `marketing` has consent. The category is `marketing`, not `measurement`, because
15
+ Clearbit identifies visitors and their companies. The helper sends no consent
16
+ signal to Clearbit. If the visitor withdraws consent, c15t removes the script
17
+ element. By default, c15t also reloads the page.
18
+
9
19
  ## Configure Clearbit
10
20
 
11
21
  Use the publishable key from your Clearbit tag installation. Do not put a
12
22
  secret Clearbit API key in browser code.
13
23
 
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` |
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` |
20
30
 
21
31
  ```ts title="src/consent-scripts.ts"
22
32
  import { clearbit } from '@c15t/integrations/clearbit';
@@ -31,51 +41,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
31
41
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
32
42
 
33
43
  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.
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.
36
47
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
37
48
  point for your framework below. These are edits to that provider, not a second
38
49
  provider.
39
50
 
40
51
  **Next.js**
41
52
 
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
- ```
53
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
54
+ `next.config.ts`:
48
55
 
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:
56
+ ```ts title="c15t.config.ts"
57
+ import { defineConsentConfig } from 'c15t/next';
58
+ import { scripts } from './src/consent-scripts';
52
59
 
53
- ```tsx
54
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
55
- {children}
56
- </ConsentRoot>
60
+ export default defineConsentConfig({ scripts });
57
61
  ```
58
62
 
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
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
62
67
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
63
68
 
64
69
  **TanStack Start**
65
70
 
66
71
  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):
72
+ `ConsentRoot` as a top-level prop. Keep the loader from the
73
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
69
74
 
70
75
  ```tsx title="src/routes/__root.tsx"
71
76
  import { scripts } from '../consent-scripts';
72
77
 
73
- <ConsentRoot
74
- state={consent}
75
- backendURL={backendURL}
76
- initRoute={false}
77
- scripts={scripts}
78
- >
78
+ <ConsentRoot state={consent} scripts={scripts}>
79
79
  ```
80
80
 
81
81
  Import vendor helpers in the root route module, not in a server function.
@@ -94,8 +94,8 @@ import { scripts } from './consent-scripts';
94
94
  <ConsentProvider options={{ mode, scripts }}>
95
95
  ```
96
96
 
97
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
98
- 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,
99
99
  dialog and preferences link inside the provider. See
100
100
  [React scripts and embeds](../frameworks/react/scripts.md).
101
101
 
@@ -124,15 +124,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
124
124
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
125
125
 
126
126
  ```ts title="src/main.ts"
127
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
127
128
  import { scripts } from './consent-scripts';
128
129
 
129
130
  app.use(c15tVue, {
130
- backendURL: 'https://your-project.inth.app',
131
+ mode: manifest(),
131
132
  scripts,
132
133
  });
133
134
  ```
134
135
 
135
- Keep your existing backend URL and other options. The plugin starts one
136
+ Keep your existing `mode` and other options. The plugin starts one
136
137
  script loader when the app mounts, after it has applied the visitor's stored
137
138
  choice. Do not also call `createScriptLoader` from a component. See
138
139
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -140,12 +141,11 @@ choice. Do not also call `createScriptLoader` from a component. See
140
141
  **Astro**
141
142
 
142
143
  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.
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.
147
147
 
148
- ```ts title="src/consent-client.ts"
148
+ ```ts title="src/c15t.client.ts"
149
149
  import type { C15tClientOptionsExtension } from 'c15t/astro';
150
150
  import { scripts } from './consent-scripts';
151
151
 
@@ -165,15 +165,13 @@ pass them as a top-level prop:
165
165
 
166
166
  ```svelte title="src/App.svelte"
167
167
  <script lang="ts">
168
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
168
+ import { ConsentProvider, manifest } from '@c15t/svelte';
169
169
  import { scripts } from './consent-scripts';
170
-
171
- const mode = hosted({ url: 'https://your-project.inth.app' });
172
170
  </script>
173
171
 
174
- <ConsentManagerProvider {mode} {scripts}>
172
+ <ConsentProvider mode={manifest()} {scripts}>
175
173
  <!-- Keep your application, consent UI and preferences link here. -->
176
- </ConsentManagerProvider>
174
+ </ConsentProvider>
177
175
  ```
178
176
 
179
177
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -181,22 +179,21 @@ The provider owns the loader and disposes it on unmount.
181
179
 
182
180
  **SvelteKit**
183
181
 
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).
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).
186
184
 
187
185
  ```svelte title="src/routes/+layout.svelte"
188
186
  <script lang="ts">
189
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
187
+ import { ConsentRoot } from '@c15t/svelte';
190
188
  import { scripts } from '../consent-scripts';
191
189
 
192
190
  let { children, data } = $props();
193
- const mode = hosted({ url: 'https://your-project.inth.app' });
194
191
  </script>
195
192
 
196
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
193
+ <ConsentRoot state={data.consent} {scripts}>
197
194
  {@render children()}
198
195
  <!-- Keep your consent UI and preferences link here. -->
199
- </ConsentManagerProvider>
196
+ </ConsentRoot>
200
197
  ```
201
198
 
202
199
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -223,20 +220,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
223
220
 
224
221
  **JavaScript**
225
222
 
226
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
227
- URL:
223
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
228
224
 
229
225
  ```ts
230
- import { init } from '@c15t/browser';
226
+ import { init, manifest } from '@c15t/browser';
231
227
  import { scripts } from './consent-scripts';
232
228
 
233
229
  const consent = init({
234
- backendURL: 'https://your-project.inth.app',
230
+ mode: manifest(),
235
231
  scripts,
236
232
  });
237
233
  ```
238
234
 
239
- Keep the backend URL from your quickstart. With
235
+ Keep the mode from your quickstart. With
240
236
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
241
237
  A kernel you create yourself needs a loader from
242
238
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -244,10 +240,10 @@ A kernel you create yourself needs a loader from
244
240
 
245
241
  ## Options
246
242
 
247
- | Option | Default | Behavior |
248
- | ---------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
249
- | `publishableKey` | Required | Publishable key. The helper trims it and URL-encodes it into the default loader URL. Empty or non-string values throw. |
250
- | `scriptUrl` | `https://tag.clearbitscripts.com/v1/<publishableKey>/tags.js` | Loader URL override. A blank value falls back to the default. |
243
+ | Option | Default | Behavior |
244
+ | ---------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
245
+ | `publishableKey` | Required | Publishable key. The helper trims it and URL-encodes it into the default loader URL. Empty or non-string values log an error and the script does not load. |
246
+ | `scriptUrl` | `https://tag.clearbitscripts.com/v1/<publishableKey>/tags.js` | Loader URL override. A blank value falls back to the default. |
251
247
 
252
248
  ## Loading and revocation
253
249
 
@@ -284,8 +280,8 @@ permission before each of your own event calls. The reload does not delete
284
280
  cookies the vendor already set; see
285
281
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
286
282
 
287
- The helper sets `vendor` to its script ID, so once you declare that vendor a
288
- visitor can turn it off inside an allowed category. See
283
+ The helper lists its vendor by name in the preference dialog, so a visitor can
284
+ turn it off inside an allowed category. See
289
285
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
290
286
  [consent verification guide](../guides/verify-consent.md) covers navigation,
291
287
  expiry and hosting checks.
@@ -2,22 +2,32 @@
2
2
  title: Cloudflare Web Analytics
3
3
  description: Load the Cloudflare Web Analytics beacon only after measurement
4
4
  consent with the c15t cloudflareWebAnalytics helper, and check it in DevTools.
5
+ seoTitle: Cloudflare Web Analytics cookie consent with c15t
6
+ seoDescription: Load the Cloudflare Web Analytics beacon only with measurement
7
+ consent. Set it up with the c15t cloudflareWebAnalytics helper.
5
8
  icon: cloudflare-web-analytics
6
9
  group: integrations
7
10
  ---
8
11
 
12
+ The c15t `cloudflareWebAnalytics` helper keeps the Cloudflare Web Analytics
13
+ beacon, `beacon.min.js`, off the page until `measurement` has consent.
14
+ Cloudflare says that the beacon sets no cookies, but c15t still waits for
15
+ consent. The helper sends no consent signal to Cloudflare. If the visitor
16
+ withdraws consent, c15t removes the script element. By default, c15t also
17
+ reloads the page.
18
+
9
19
  ## Configure Cloudflare Web Analytics
10
20
 
11
21
  Copy the beacon token from the Web Analytics installation snippet. If
12
22
  Cloudflare adds the beacon to this site automatically, turn that off so the
13
23
  page has one beacon and c15t controls it.
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 { cloudflareWebAnalytics } from '@c15t/integrations/cloudflare-web-analytics';
@@ -32,51 +42,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
32
42
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
33
43
 
34
44
  The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
35
- quickstart already created a scripts file, such as `lib/scripts.ts` in the
36
- Next.js guide, add the helper to that array instead of creating a second file.
45
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
46
+ in the Next.js guide, add the helper to that array instead of creating a
47
+ second file.
37
48
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
38
49
  point for your framework below. These are edits to that provider, not a second
39
50
  provider.
40
51
 
41
52
  **Next.js**
42
53
 
43
- Import the configuration into the client boundary from your router guide:
44
-
45
- ```ts
46
- import { ConsentRoot } from 'c15t/next';
47
- import { scripts } from './consent-scripts';
48
- ```
54
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
55
+ `next.config.ts`:
49
56
 
50
- Keep the server-resolved `state` and shared `consentConfig` from your
51
- router guide. Its manifest, init and save URLs stay in effect. Add
52
- `scripts` as a top-level prop on the existing root:
57
+ ```ts title="c15t.config.ts"
58
+ import { defineConsentConfig } from 'c15t/next';
59
+ import { scripts } from './src/consent-scripts';
53
60
 
54
- ```tsx
55
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
56
- {children}
57
- </ConsentRoot>
61
+ export default defineConsentConfig({ scripts });
58
62
  ```
59
63
 
60
- App Router, Pages Router and static export all use this `ConsentRoot` in
61
- the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
62
- because a Server Component cannot pass script callbacks to it. See
64
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
65
+ same call. `ConsentRoot` reads the config in the browser, so the layout
66
+ keeps passing only `state`. App Router, Pages Router and static export all
67
+ read the same file. See
63
68
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
64
69
 
65
70
  **TanStack Start**
66
71
 
67
72
  Import the configuration into your root route and pass it to the existing
68
- `ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
69
- `initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
73
+ `ConsentRoot` as a top-level prop. Keep the loader from the
74
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
70
75
 
71
76
  ```tsx title="src/routes/__root.tsx"
72
77
  import { scripts } from '../consent-scripts';
73
78
 
74
- <ConsentRoot
75
- state={consent}
76
- backendURL={backendURL}
77
- initRoute={false}
78
- scripts={scripts}
79
- >
79
+ <ConsentRoot state={consent} scripts={scripts}>
80
80
  ```
81
81
 
82
82
  Import vendor helpers in the root route module, not in a server function.
@@ -95,8 +95,8 @@ import { scripts } from './consent-scripts';
95
95
  <ConsentProvider options={{ mode, scripts }}>
96
96
  ```
97
97
 
98
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
99
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
98
+ `mode` is the `manifest()` value from the
99
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
100
100
  dialog and preferences link inside the provider. See
101
101
  [React scripts and embeds](../frameworks/react/scripts.md).
102
102
 
@@ -125,15 +125,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
125
125
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
126
126
 
127
127
  ```ts title="src/main.ts"
128
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
128
129
  import { scripts } from './consent-scripts';
129
130
 
130
131
  app.use(c15tVue, {
131
- backendURL: 'https://your-project.inth.app',
132
+ mode: manifest(),
132
133
  scripts,
133
134
  });
134
135
  ```
135
136
 
136
- Keep your existing backend URL and other options. The plugin starts one
137
+ Keep your existing `mode` and other options. The plugin starts one
137
138
  script loader when the app mounts, after it has applied the visitor's stored
138
139
  choice. Do not also call `createScriptLoader` from a component. See
139
140
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -141,12 +142,11 @@ choice. Do not also call `createScriptLoader` from a component. See
141
142
  **Astro**
142
143
 
143
144
  Add the scripts to the client entrypoint from the
144
- [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
145
- integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
146
- framework integration in `astro.config.mjs` as they are. If the module
147
- already exports scripts, combine the two arrays.
145
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
146
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
147
+ If the module already exports scripts, combine the two arrays.
148
148
 
149
- ```ts title="src/consent-client.ts"
149
+ ```ts title="src/c15t.client.ts"
150
150
  import type { C15tClientOptionsExtension } from 'c15t/astro';
151
151
  import { scripts } from './consent-scripts';
152
152
 
@@ -166,15 +166,13 @@ pass them as a top-level prop:
166
166
 
167
167
  ```svelte title="src/App.svelte"
168
168
  <script lang="ts">
169
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
169
+ import { ConsentProvider, manifest } from '@c15t/svelte';
170
170
  import { scripts } from './consent-scripts';
171
-
172
- const mode = hosted({ url: 'https://your-project.inth.app' });
173
171
  </script>
174
172
 
175
- <ConsentManagerProvider {mode} {scripts}>
173
+ <ConsentProvider mode={manifest()} {scripts}>
176
174
  <!-- Keep your application, consent UI and preferences link here. -->
177
- </ConsentManagerProvider>
175
+ </ConsentProvider>
178
176
  ```
179
177
 
180
178
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -182,22 +180,21 @@ The provider owns the loader and disposes it on unmount.
182
180
 
183
181
  **SvelteKit**
184
182
 
185
- Add the scripts to the existing root layout provider. Keep the server load
186
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
183
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
184
+ handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
187
185
 
188
186
  ```svelte title="src/routes/+layout.svelte"
189
187
  <script lang="ts">
190
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
188
+ import { ConsentRoot } from '@c15t/svelte';
191
189
  import { scripts } from '../consent-scripts';
192
190
 
193
191
  let { children, data } = $props();
194
- const mode = hosted({ url: 'https://your-project.inth.app' });
195
192
  </script>
196
193
 
197
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
194
+ <ConsentRoot state={data.consent} {scripts}>
198
195
  {@render children()}
199
196
  <!-- Keep your consent UI and preferences link here. -->
200
- </ConsentManagerProvider>
197
+ </ConsentRoot>
201
198
  ```
202
199
 
203
200
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -224,20 +221,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
224
221
 
225
222
  **JavaScript**
226
223
 
227
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
228
- URL:
224
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
229
225
 
230
226
  ```ts
231
- import { init } from '@c15t/browser';
227
+ import { init, manifest } from '@c15t/browser';
232
228
  import { scripts } from './consent-scripts';
233
229
 
234
230
  const consent = init({
235
- backendURL: 'https://your-project.inth.app',
231
+ mode: manifest(),
236
232
  scripts,
237
233
  });
238
234
  ```
239
235
 
240
- Keep the backend URL from your quickstart. With
236
+ Keep the mode from your quickstart. With
241
237
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
242
238
  A kernel you create yourself needs a loader from
243
239
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -247,7 +243,7 @@ A kernel you create yourself needs a loader from
247
243
 
248
244
  | Option | Default | Behavior |
249
245
  | ----------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
250
- | `token` | Required | Beacon token, written into the `data-cf-beacon` attribute. The helper trims it. Empty values throw. |
246
+ | `token` | Required | Beacon token, written into the `data-cf-beacon` attribute. The helper trims it. Empty values log an error and the script does not load. |
251
247
  | `spa` | `true` | Written into `data-cf-beacon`. Turns on Cloudflare's route tracking for single-page apps. Set `false` for a site with only full page loads. |
252
248
  | `scriptUrl` | `https://static.cloudflareinsights.com/beacon.min.js` | Loader URL override. |
253
249
 
@@ -285,8 +281,8 @@ permission before each of your own event calls. The reload does not delete
285
281
  cookies the vendor already set; see
286
282
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
287
283
 
288
- The helper sets `vendor` to its script ID, so once you declare that vendor a
289
- visitor can turn it off inside an allowed category. See
284
+ The helper lists its vendor by name in the preference dialog, so a visitor can
285
+ turn it off inside an allowed category. See
290
286
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
291
287
  [consent verification guide](../guides/verify-consent.md) covers navigation,
292
288
  expiry and hosting checks.