@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,30 @@
2
2
  title: Hightouch
3
3
  description: Load the Hightouch Events browser SDK only after measurement
4
4
  consent with the c15t hightouch helper, and check page events in DevTools.
5
+ seoTitle: Hightouch cookie consent with c15t
6
+ seoDescription: Load the Hightouch Events SDK only with measurement consent. The
7
+ c15t hightouch helper creates the htevents queue only with consent.
5
8
  icon: hightouch
6
9
  group: integrations
7
10
  ---
8
11
 
12
+ The c15t `hightouch` helper keeps the Hightouch Events browser SDK off the page
13
+ until `measurement` has consent. Until then, c15t does not create the
14
+ `window.htevents` queue or load `events.min.js`. The helper sends no consent
15
+ signal to Hightouch. If the visitor withdraws consent, c15t removes the script
16
+ element. By default, c15t also reloads the page.
17
+
9
18
  ## Configure Hightouch
10
19
 
11
20
  Copy the write key from your Hightouch Event Source. Remove the original
12
21
  Hightouch snippet.
13
22
 
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` |
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` |
20
29
 
21
30
  ```ts title="src/consent-scripts.ts"
22
31
  import { hightouch } from '@c15t/integrations/hightouch';
@@ -31,51 +40,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
31
40
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
32
41
 
33
42
  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.
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.
36
46
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
37
47
  point for your framework below. These are edits to that provider, not a second
38
48
  provider.
39
49
 
40
50
  **Next.js**
41
51
 
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
- ```
52
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
53
+ `next.config.ts`:
48
54
 
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:
55
+ ```ts title="c15t.config.ts"
56
+ import { defineConsentConfig } from 'c15t/next';
57
+ import { scripts } from './src/consent-scripts';
52
58
 
53
- ```tsx
54
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
55
- {children}
56
- </ConsentRoot>
59
+ export default defineConsentConfig({ scripts });
57
60
  ```
58
61
 
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
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
62
66
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
63
67
 
64
68
  **TanStack Start**
65
69
 
66
70
  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):
71
+ `ConsentRoot` as a top-level prop. Keep the loader from the
72
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
69
73
 
70
74
  ```tsx title="src/routes/__root.tsx"
71
75
  import { scripts } from '../consent-scripts';
72
76
 
73
- <ConsentRoot
74
- state={consent}
75
- backendURL={backendURL}
76
- initRoute={false}
77
- scripts={scripts}
78
- >
77
+ <ConsentRoot state={consent} scripts={scripts}>
79
78
  ```
80
79
 
81
80
  Import vendor helpers in the root route module, not in a server function.
@@ -94,8 +93,8 @@ import { scripts } from './consent-scripts';
94
93
  <ConsentProvider options={{ mode, scripts }}>
95
94
  ```
96
95
 
97
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
98
- 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,
99
98
  dialog and preferences link inside the provider. See
100
99
  [React scripts and embeds](../frameworks/react/scripts.md).
101
100
 
@@ -124,15 +123,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
124
123
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
125
124
 
126
125
  ```ts title="src/main.ts"
126
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
127
127
  import { scripts } from './consent-scripts';
128
128
 
129
129
  app.use(c15tVue, {
130
- backendURL: 'https://your-project.inth.app',
130
+ mode: manifest(),
131
131
  scripts,
132
132
  });
133
133
  ```
134
134
 
135
- Keep your existing backend URL and other options. The plugin starts one
135
+ Keep your existing `mode` and other options. The plugin starts one
136
136
  script loader when the app mounts, after it has applied the visitor's stored
137
137
  choice. Do not also call `createScriptLoader` from a component. See
138
138
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -140,12 +140,11 @@ choice. Do not also call `createScriptLoader` from a component. See
140
140
  **Astro**
141
141
 
142
142
  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.
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.
147
146
 
148
- ```ts title="src/consent-client.ts"
147
+ ```ts title="src/c15t.client.ts"
149
148
  import type { C15tClientOptionsExtension } from 'c15t/astro';
150
149
  import { scripts } from './consent-scripts';
151
150
 
@@ -165,15 +164,13 @@ pass them as a top-level prop:
165
164
 
166
165
  ```svelte title="src/App.svelte"
167
166
  <script lang="ts">
168
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
167
+ import { ConsentProvider, manifest } from '@c15t/svelte';
169
168
  import { scripts } from './consent-scripts';
170
-
171
- const mode = hosted({ url: 'https://your-project.inth.app' });
172
169
  </script>
173
170
 
174
- <ConsentManagerProvider {mode} {scripts}>
171
+ <ConsentProvider mode={manifest()} {scripts}>
175
172
  <!-- Keep your application, consent UI and preferences link here. -->
176
- </ConsentManagerProvider>
173
+ </ConsentProvider>
177
174
  ```
178
175
 
179
176
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -181,22 +178,21 @@ The provider owns the loader and disposes it on unmount.
181
178
 
182
179
  **SvelteKit**
183
180
 
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).
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).
186
183
 
187
184
  ```svelte title="src/routes/+layout.svelte"
188
185
  <script lang="ts">
189
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
186
+ import { ConsentRoot } from '@c15t/svelte';
190
187
  import { scripts } from '../consent-scripts';
191
188
 
192
189
  let { children, data } = $props();
193
- const mode = hosted({ url: 'https://your-project.inth.app' });
194
190
  </script>
195
191
 
196
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
192
+ <ConsentRoot state={data.consent} {scripts}>
197
193
  {@render children()}
198
194
  <!-- Keep your consent UI and preferences link here. -->
199
- </ConsentManagerProvider>
195
+ </ConsentRoot>
200
196
  ```
201
197
 
202
198
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -223,20 +219,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
223
219
 
224
220
  **JavaScript**
225
221
 
226
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
227
- URL:
222
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
228
223
 
229
224
  ```ts
230
- import { init } from '@c15t/browser';
225
+ import { init, manifest } from '@c15t/browser';
231
226
  import { scripts } from './consent-scripts';
232
227
 
233
228
  const consent = init({
234
- backendURL: 'https://your-project.inth.app',
229
+ mode: manifest(),
235
230
  scripts,
236
231
  });
237
232
  ```
238
233
 
239
- Keep the backend URL from your quickstart. With
234
+ Keep the mode from your quickstart. With
240
235
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
241
236
  A kernel you create yourself needs a loader from
242
237
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -246,7 +241,7 @@ A kernel you create yourself needs a loader from
246
241
 
247
242
  | Option | Default | Behavior |
248
243
  | --------------- | -------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
249
- | `writeKey` | Required | Event Source write key passed to `htevents.load`. The helper trims it. Empty values throw. |
244
+ | `writeKey` | Required | Event Source write key passed to `htevents.load`. The helper trims it. Empty values log an error and the script does not load. |
250
245
  | `apiHost` | None | API host passed in the load options. Without it, the SDK uses `us-east-1.hightouch-events.com`. Set it only for another region or a first-party tracking host. A blank value is dropped. |
251
246
  | `trackPageView` | `true` | Queues `htevents.page()` after `load`. Set `false` when your router sends page calls. |
252
247
  | `scriptUrl` | `https://cdn.hightouch-events.com/browser/release/v1-latest/events.min.js` | Loader URL override. A blank value falls back to the default. |
@@ -290,8 +285,8 @@ permission before each of your own event calls. The reload does not delete
290
285
  cookies the vendor already set; see
291
286
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
292
287
 
293
- The helper sets `vendor` to its script ID, so once you declare that vendor a
294
- visitor can turn it off inside an allowed category. See
288
+ The helper lists its vendor by name in the preference dialog, so a visitor can
289
+ turn it off inside an allowed category. See
295
290
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
296
291
  [consent verification guide](../guides/verify-consent.md) covers navigation,
297
292
  expiry and hosting checks.
@@ -2,21 +2,31 @@
2
2
  title: Hotjar
3
3
  description: Load Hotjar only after measurement consent with the c15t hotjar
4
4
  helper, and check its loader and recordings in DevTools.
5
+ seoTitle: Hotjar cookie consent with c15t
6
+ seoDescription: Load Hotjar only with measurement consent. The c15t hotjar
7
+ helper keeps the Hotjar loader off the page and stops recordings on
8
+ withdrawal.
5
9
  icon: hotjar
6
10
  group: integrations
7
11
  ---
8
12
 
13
+ The c15t `hotjar` helper keeps Hotjar off the page until `measurement` has
14
+ consent. Until then, c15t does not define `window._hjSettings` or `window.hj`.
15
+ The helper sends no consent signal to Hotjar. If the visitor withdraws consent,
16
+ c15t removes the loader script element. By default, c15t also reloads the page.
17
+ The reload stops Hotjar.
18
+
9
19
  ## Configure Hotjar
10
20
 
11
21
  Copy the site ID from your Hotjar tracking code, where it is the `hjid` value.
12
22
  Remove the original tracking 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 { hotjar } from '@c15t/integrations/hotjar';
@@ -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,11 +240,11 @@ A kernel you create yourself needs a loader from
244
240
 
245
241
  ## Options
246
242
 
247
- | Option | Default | Behavior |
248
- | ----------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
249
- | `siteId` | Required | Site ID as a number or string. Set as `window._hjSettings.hjid` and used in the default loader URL. Missing, empty and `0` values throw. |
250
- | `version` | `6` | Script version, set as `window._hjSettings.hjsv` and the `sv` query parameter of the default loader URL. |
251
- | `scriptUrl` | `https://static.hotjar.com/c/hotjar-<siteId>.js?sv=<version>` | Loader URL override. |
243
+ | Option | Default | Behavior |
244
+ | ----------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
245
+ | `siteId` | Required | Site ID as a number or string. Set as `window._hjSettings.hjid` and used in the default loader URL. Missing, empty and `0` values log an error and the script does not load. |
246
+ | `version` | `6` | Script version, set as `window._hjSettings.hjsv` and the `sv` query parameter of the default loader URL. |
247
+ | `scriptUrl` | `https://static.hotjar.com/c/hotjar-<siteId>.js?sv=<version>` | Loader URL override. |
252
248
 
253
249
  ## Loading and revocation
254
250
 
@@ -289,8 +285,8 @@ permission before each of your own event calls. The reload does not delete
289
285
  cookies the vendor already set; see
290
286
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
291
287
 
292
- The helper sets `vendor` to its script ID, so once you declare that vendor a
293
- visitor can turn it off inside an allowed category. See
288
+ The helper lists its vendor by name in the preference dialog, so a visitor can
289
+ turn it off inside an allowed category. See
294
290
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
295
291
  [consent verification guide](../guides/verify-consent.md) covers navigation,
296
292
  expiry and hosting checks.