@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.
- package/AGENTS.md +10 -12
- package/README.md +41 -70
- package/SKILL.md +1 -1
- package/dist/aggregate-components.js +1 -1
- package/dist/components/consent-gate/atoms.js +1 -1
- package/dist/components/consent-gate/frame.js +2 -0
- package/dist/components/consent-gate/index.js +1 -1
- package/dist/components/iab-panel/atoms/root.js +1 -1
- package/dist/components/iab-panel/iab-panel.js +1 -1
- package/dist/components/iab-prompt/atoms/root.js +1 -1
- package/dist/components/iab-prompt/iab-prompt.js +1 -1
- package/dist/components/panel/atoms/root.js +1 -1
- package/dist/components/panel-trigger/atoms/root.js +1 -1
- package/dist/components/panel-trigger/panel-trigger.js +1 -1
- package/dist/components/panel-trigger/toolbar-loader.js +2 -0
- package/dist/components/preferences/atoms/root.js +1 -1
- package/dist/components/prompt/atoms/early-tap-script.js +2 -0
- package/dist/components/prompt/atoms/root.js +1 -1
- package/dist/components/prompt/prompt.js +1 -1
- package/dist/components/shared/dialog-sheets.js +1 -0
- package/dist/components/shared/first-paint-sheets.js +1 -0
- package/dist/components/shared/iab-dialog-sheets.js +1 -0
- package/dist/components/shared/iab-first-paint-sheets.js +1 -0
- package/dist/components/shared/primitives/button.js +1 -1
- package/dist/components/shared/surface-styles.js +2 -0
- package/dist/consent-gate.js +1 -1
- package/dist/context/index.js +1 -1
- package/dist/devtools.js +1 -1
- package/dist/hooks/use-iab-policy-guard.js +1 -0
- package/dist/iab/styles.tw3.css +2 -2
- package/dist/iab-context.js +1 -1
- package/dist/iab-dialog-deferred.js +2 -0
- package/dist/iab.js +1 -1
- package/dist/index-parts/consent-gate.js +1 -1
- package/dist/index-parts/core.js +1 -1
- package/dist/index-parts/frame.js +1 -0
- package/dist/index-parts/hosted.js +1 -0
- package/dist/index-parts/offline.js +1 -0
- package/dist/index-parts/presets.js +1 -0
- package/dist/index.js +1 -1
- package/dist/modes.js +1 -0
- package/dist/panel-link.js +1 -1
- package/dist/panel-trigger.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/styles.tw3.css +2 -2
- package/dist/transports/hosted.js +1 -0
- package/dist/transports/manifest.js +1 -0
- package/dist/utils/deferred-module.js +1 -1
- package/dist/version.js +1 -1
- package/dist-types/chunk-warming.d.ts +7 -6
- package/dist-types/components/consent-gate/frame.d.ts +19 -0
- package/dist-types/components/consent-gate/index.d.ts +3 -19
- package/dist-types/components/iab-prompt/iab-prompt.d.ts +1 -1
- package/dist-types/components/panel/index.d.ts +1 -1
- package/dist-types/components/panel-trigger/toolbar-loader.d.ts +34 -0
- package/dist-types/components/preferences/index.d.ts +1 -1
- package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
- package/dist-types/components/prompt/index.d.ts +1 -1
- package/dist-types/components/shared/dialog-sheets.d.ts +9 -0
- package/dist-types/components/shared/first-paint-sheets.d.ts +8 -0
- package/dist-types/components/shared/iab-dialog-sheets.d.ts +3 -0
- package/dist-types/components/shared/iab-first-paint-sheets.d.ts +3 -0
- package/dist-types/components/shared/surface-styles.d.ts +60 -0
- package/dist-types/consent-gate.d.ts +1 -1
- package/dist-types/context/index.d.ts +3 -3
- package/dist-types/context.d.ts +2 -0
- package/dist-types/gpp.d.ts +1 -1
- package/dist-types/hooks/use-iab-policy-guard.d.ts +35 -0
- package/dist-types/iab-dialog-deferred.d.ts +36 -0
- package/dist-types/iab.d.ts +3 -2
- package/dist-types/index-parts/consent-gate.d.ts +1 -1
- package/dist-types/index-parts/core.d.ts +1 -2
- package/dist-types/index-parts/frame.d.ts +7 -0
- package/dist-types/index-parts/hosted.d.ts +7 -0
- package/dist-types/index-parts/offline.d.ts +7 -0
- package/dist-types/index-parts/presets.d.ts +7 -0
- package/dist-types/index.d.ts +5 -1
- package/dist-types/modes.d.ts +26 -0
- package/dist-types/panel-link.d.ts +1 -1
- package/dist-types/panel-trigger.d.ts +1 -1
- package/dist-types/provider.d.ts +22 -4
- package/dist-types/transports/hosted.d.ts +36 -0
- package/dist-types/transports/manifest.d.ts +48 -0
- package/dist-types/ui-config-context.d.ts +4 -0
- package/dist-types/version.d.ts +1 -1
- package/docs/README.md +10 -12
- package/docs/concepts/choose-your-setup.md +45 -8
- package/docs/concepts/consent-categories.md +1 -1
- package/docs/concepts/consent-state.md +5 -2
- package/docs/concepts/data-fetching.md +100 -40
- package/docs/concepts/modes.md +281 -0
- package/docs/customization/dark-mode.md +1 -1
- package/docs/customization/motion.md +2 -2
- package/docs/customization/overview.md +3 -2
- package/docs/customization/recipes.md +4 -4
- package/docs/customization/slots.md +25 -25
- package/docs/customization/stylesheets.md +161 -50
- package/docs/customization/tailwind.md +71 -50
- package/docs/customization/tokens.md +42 -13
- package/docs/frameworks/react/components/consent-banner.md +14 -12
- package/docs/frameworks/react/components/consent-dialog.md +15 -13
- package/docs/frameworks/react/components/consent-provider.md +51 -46
- package/docs/frameworks/react/components.md +16 -13
- package/docs/frameworks/react/compose.md +3 -3
- package/docs/frameworks/react/content-security-policy.md +35 -12
- package/docs/frameworks/react/customize.md +21 -13
- package/docs/frameworks/react/hooks.md +2 -2
- package/docs/frameworks/react/iab.md +56 -6
- package/docs/frameworks/react/quickstart.md +65 -99
- package/docs/frameworks/react/rendering.md +170 -94
- package/docs/frameworks/react/scripts.md +19 -30
- package/docs/frameworks/react/troubleshooting.md +100 -32
- package/docs/frameworks/react/upgrade-v3.md +133 -79
- package/docs/frameworks/react/vendor-consent.md +19 -7
- package/docs/guides/banner-experiments.md +21 -8
- package/docs/guides/troubleshooting.md +90 -26
- package/docs/guides/verify-consent.md +23 -8
- package/docs/integrations/adobe-analytics.md +60 -64
- package/docs/integrations/ahrefs-analytics.md +58 -63
- package/docs/integrations/amplitude.md +60 -64
- package/docs/integrations/clearbit.md +59 -63
- package/docs/integrations/cloudflare-web-analytics.md +56 -60
- package/docs/integrations/cloudflare-zaraz.md +55 -57
- package/docs/integrations/crisp.md +64 -69
- package/docs/integrations/databuddy.md +62 -64
- package/docs/integrations/fathom-analytics.md +56 -60
- package/docs/integrations/front-chat.md +56 -60
- package/docs/integrations/google-maps.md +25 -13
- package/docs/integrations/google-tag-manager.md +153 -77
- package/docs/integrations/google-tag.md +134 -78
- package/docs/integrations/heap.md +56 -60
- package/docs/integrations/hightouch.md +55 -60
- package/docs/integrations/hotjar.md +60 -64
- package/docs/integrations/intercom.md +55 -60
- package/docs/integrations/klaviyo.md +65 -66
- package/docs/integrations/linkedin-insights.md +58 -63
- package/docs/integrations/logrocket.md +55 -60
- package/docs/integrations/matomo-analytics.md +58 -60
- package/docs/integrations/meta-pixel.md +56 -60
- package/docs/integrations/microsoft-clarity.md +57 -60
- package/docs/integrations/microsoft-uet.md +58 -61
- package/docs/integrations/mixpanel-analytics.md +73 -75
- package/docs/integrations/one-dollar-stats.md +53 -59
- package/docs/integrations/openai-pixel.md +58 -60
- package/docs/integrations/overview.md +59 -42
- package/docs/integrations/pinterest-tag.md +56 -60
- package/docs/integrations/pirsch.md +54 -60
- package/docs/integrations/plausible-analytics.md +55 -60
- package/docs/integrations/posthog.md +56 -60
- package/docs/integrations/promptwatch.md +57 -63
- package/docs/integrations/reddit-pixel.md +57 -60
- package/docs/integrations/rudderstack.md +65 -67
- package/docs/integrations/rybbit-analytics.md +70 -75
- package/docs/integrations/segment.md +56 -60
- package/docs/integrations/sentry.md +65 -60
- package/docs/integrations/snapchat-pixel.md +54 -60
- package/docs/integrations/tiktok-pixel.md +59 -63
- package/docs/integrations/umami-analytics.md +54 -60
- package/docs/integrations/vercel-analytics.md +53 -59
- package/docs/integrations/vercel-speed-insights.md +317 -0
- package/docs/integrations/x-pixel.md +57 -63
- package/docs/integrations/youtube.md +25 -13
- package/package.json +18 -8
- 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
|
|
17
|
-
| pnpm | `pnpm add @c15t/integrations
|
|
18
|
-
| yarn | `yarn add @c15t/integrations
|
|
19
|
-
| bun | `bun add @c15t/integrations
|
|
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
|
|
35
|
-
Next.js guide, add the helper to that array instead of creating a
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
```ts title="c15t.config.ts"
|
|
56
|
+
import { defineConsentConfig } from 'c15t/next';
|
|
57
|
+
import { scripts } from './src/consent-scripts';
|
|
52
58
|
|
|
53
|
-
|
|
54
|
-
<ConsentRoot state={state} config={consentConfig} scripts={scripts}>
|
|
55
|
-
{children}
|
|
56
|
-
</ConsentRoot>
|
|
59
|
+
export default defineConsentConfig({ scripts });
|
|
57
60
|
```
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
68
|
-
|
|
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 `
|
|
98
|
-
|
|
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
|
-
|
|
130
|
+
mode: manifest(),
|
|
131
131
|
scripts,
|
|
132
132
|
});
|
|
133
133
|
```
|
|
134
134
|
|
|
135
|
-
Keep your existing
|
|
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),
|
|
144
|
-
integration
|
|
145
|
-
|
|
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/
|
|
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 {
|
|
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
|
-
<
|
|
171
|
+
<ConsentProvider mode={manifest()} {scripts}>
|
|
175
172
|
<!-- Keep your application, consent UI and preferences link here. -->
|
|
176
|
-
</
|
|
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
|
|
185
|
-
and
|
|
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 {
|
|
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
|
-
<
|
|
192
|
+
<ConsentRoot state={data.consent} {scripts}>
|
|
197
193
|
{@render children()}
|
|
198
194
|
<!-- Keep your consent UI and preferences link here. -->
|
|
199
|
-
</
|
|
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
|
|
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
|
-
|
|
229
|
+
mode: manifest(),
|
|
235
230
|
scripts,
|
|
236
231
|
});
|
|
237
232
|
```
|
|
238
233
|
|
|
239
|
-
Keep the
|
|
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
|
|
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
|
|
294
|
-
|
|
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
|
|
17
|
-
| pnpm | `pnpm add @c15t/integrations
|
|
18
|
-
| yarn | `yarn add @c15t/integrations
|
|
19
|
-
| bun | `bun add @c15t/integrations
|
|
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
|
|
35
|
-
Next.js guide, add the helper to that array instead of creating a
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
```ts title="c15t.config.ts"
|
|
57
|
+
import { defineConsentConfig } from 'c15t/next';
|
|
58
|
+
import { scripts } from './src/consent-scripts';
|
|
52
59
|
|
|
53
|
-
|
|
54
|
-
<ConsentRoot state={state} config={consentConfig} scripts={scripts}>
|
|
55
|
-
{children}
|
|
56
|
-
</ConsentRoot>
|
|
60
|
+
export default defineConsentConfig({ scripts });
|
|
57
61
|
```
|
|
58
62
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
68
|
-
|
|
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 `
|
|
98
|
-
|
|
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
|
-
|
|
131
|
+
mode: manifest(),
|
|
131
132
|
scripts,
|
|
132
133
|
});
|
|
133
134
|
```
|
|
134
135
|
|
|
135
|
-
Keep your existing
|
|
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),
|
|
144
|
-
integration
|
|
145
|
-
|
|
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/
|
|
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 {
|
|
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
|
-
<
|
|
172
|
+
<ConsentProvider mode={manifest()} {scripts}>
|
|
175
173
|
<!-- Keep your application, consent UI and preferences link here. -->
|
|
176
|
-
</
|
|
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
|
|
185
|
-
and
|
|
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 {
|
|
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
|
-
<
|
|
193
|
+
<ConsentRoot state={data.consent} {scripts}>
|
|
197
194
|
{@render children()}
|
|
198
195
|
<!-- Keep your consent UI and preferences link here. -->
|
|
199
|
-
</
|
|
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
|
|
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
|
-
|
|
230
|
+
mode: manifest(),
|
|
235
231
|
scripts,
|
|
236
232
|
});
|
|
237
233
|
```
|
|
238
234
|
|
|
239
|
-
Keep the
|
|
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
|
|
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
|
|
293
|
-
|
|
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.
|