@c15t/scripts 3.0.0-alpha.1 → 3.0.0-alpha.3
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 +129 -59
- package/README.md +8 -29
- package/SKILL.md +33 -0
- package/dist/adobe-analytics.js +2 -0
- package/dist/ahrefs-analytics.js +2 -0
- package/dist/amplitude.js +2 -0
- package/dist/clearbit.js +2 -0
- package/dist/cloudflare-web-analytics.js +2 -0
- package/dist/cloudflare-zaraz.js +2 -0
- package/dist/crisp.js +2 -0
- package/dist/databuddy.js +2 -0
- package/dist/e2e-test-utils.js +2 -137
- package/dist/engine/compile.js +2 -89
- package/dist/engine/runtime.js +2 -448
- package/dist/events.js +2 -0
- package/dist/fathom-analytics.js +2 -0
- package/dist/front-chat.js +2 -0
- package/dist/google-tag-manager.js +2 -0
- package/dist/google-tag.js +2 -0
- package/dist/heap.js +2 -0
- package/dist/hightouch.js +2 -0
- package/dist/hotjar.js +2 -0
- package/dist/intercom.js +2 -0
- package/dist/klaviyo.js +2 -0
- package/dist/linkedin-insights.js +2 -0
- package/dist/logrocket.js +2 -0
- package/dist/matomo-analytics.js +2 -0
- package/dist/meta-pixel.js +2 -0
- package/dist/microsoft-clarity.js +2 -0
- package/dist/microsoft-uet.js +2 -0
- package/dist/mixpanel-analytics.js +2 -0
- package/dist/one-dollar-stats.js +2 -0
- package/dist/openai-pixel.js +2 -0
- package/dist/pinterest-tag.js +2 -0
- package/dist/pirsch.js +2 -0
- package/dist/plausible-analytics.js +2 -0
- package/dist/posthog.js +2 -0
- package/dist/promptwatch.js +2 -0
- package/dist/reddit-pixel.js +2 -0
- package/dist/registry.js +2 -392
- package/dist/resolve.js +2 -33
- package/dist/rudderstack.js +2 -0
- package/dist/rybbit-analytics.js +2 -0
- package/dist/segment.js +2 -0
- package/dist/snapchat-pixel.js +2 -0
- package/dist/tiktok-pixel.js +2 -0
- package/dist/types.js +2 -16
- package/dist/umami-analytics.js +2 -0
- package/dist/vendors/_shared/attributes.js +2 -14
- package/dist/vendors/_shared/google-consent.js +2 -27
- package/dist/vendors/_shared/install-builders.js +2 -21
- package/dist/vendors/_shared/required-id.js +2 -0
- package/dist/vendors/_shared/script-url.js +2 -28
- package/dist/vendors/ads-and-pixels/linkedin-insights.js +2 -48
- package/dist/vendors/ads-and-pixels/meta-pixel.js +2 -153
- package/dist/vendors/ads-and-pixels/microsoft-uet.js +2 -110
- package/dist/vendors/ads-and-pixels/openai-pixel.js +2 -88
- package/dist/vendors/ads-and-pixels/pinterest-tag.js +2 -0
- package/dist/vendors/ads-and-pixels/reddit-pixel.js +2 -107
- package/dist/vendors/ads-and-pixels/snapchat-pixel.js +2 -87
- package/dist/vendors/ads-and-pixels/tiktok-pixel.js +2 -89
- package/dist/vendors/ads-and-pixels/x-pixel.js +2 -48
- package/dist/vendors/analytics/adobe-analytics.js +2 -49
- package/dist/vendors/analytics/ahrefs-analytics.js +2 -27
- package/dist/vendors/analytics/amplitude.js +2 -134
- package/dist/vendors/analytics/clearbit.js +2 -28
- package/dist/vendors/analytics/cloudflare-web-analytics.js +2 -32
- package/dist/vendors/analytics/databuddy.js +2 -103
- package/dist/vendors/analytics/fathom-analytics.js +2 -35
- package/dist/vendors/analytics/google-tag.js +2 -66
- package/dist/vendors/analytics/heap.js +2 -134
- package/dist/vendors/analytics/hightouch.js +2 -109
- package/dist/vendors/analytics/hotjar.js +2 -44
- package/dist/vendors/analytics/logrocket.js +2 -58
- package/dist/vendors/analytics/matomo-analytics.js +2 -191
- package/dist/vendors/analytics/microsoft-clarity.js +2 -100
- package/dist/vendors/analytics/mixpanel-analytics.js +2 -93
- package/dist/vendors/analytics/one-dollar-stats.js +2 -0
- package/dist/vendors/analytics/pirsch.js +2 -67
- package/dist/vendors/analytics/plausible-analytics.js +2 -81
- package/dist/vendors/analytics/posthog.js +2 -200
- package/dist/vendors/analytics/promptwatch.js +2 -29
- package/dist/vendors/analytics/rudderstack.js +2 -183
- package/dist/vendors/analytics/rybbit-analytics.js +2 -63
- package/dist/vendors/analytics/segment.js +2 -56
- package/dist/vendors/analytics/umami-analytics.js +2 -39
- package/dist/vendors/analytics/vercel-analytics.js +2 -53
- package/dist/vendors/email-and-sms/klaviyo.js +2 -0
- package/dist/vendors/functional/crisp.js +2 -100
- package/dist/vendors/functional/front-chat.js +2 -0
- package/dist/vendors/functional/intercom.js +2 -45
- package/dist/vendors/tag-managers/cloudflare-zaraz.js +2 -98
- package/dist/vendors/tag-managers/google-tag-manager.js +2 -59
- package/dist/vercel-analytics.js +2 -0
- package/dist/x-pixel.js +2 -0
- package/dist-types/adobe-analytics.d.ts +2 -0
- package/dist-types/ahrefs-analytics.d.ts +2 -0
- package/dist-types/amplitude.d.ts +2 -0
- package/dist-types/clearbit.d.ts +2 -0
- package/dist-types/cloudflare-web-analytics.d.ts +2 -0
- package/dist-types/cloudflare-zaraz.d.ts +2 -0
- package/dist-types/crisp.d.ts +2 -0
- package/dist-types/databuddy.d.ts +2 -0
- package/dist-types/e2e-test-utils.d.ts +2 -0
- package/dist-types/engine/compile.d.ts +2 -3
- package/dist-types/engine/runtime.d.ts +2 -3
- package/dist-types/events.d.ts +2 -0
- package/dist-types/fathom-analytics.d.ts +2 -0
- package/dist-types/front-chat.d.ts +2 -0
- package/dist-types/google-tag-manager.d.ts +2 -0
- package/dist-types/google-tag.d.ts +2 -0
- package/dist-types/heap.d.ts +2 -0
- package/dist-types/hightouch.d.ts +2 -0
- package/dist-types/hotjar.d.ts +2 -0
- package/dist-types/intercom.d.ts +2 -0
- package/dist-types/klaviyo.d.ts +2 -0
- package/dist-types/linkedin-insights.d.ts +2 -0
- package/dist-types/logrocket.d.ts +2 -0
- package/dist-types/matomo-analytics.d.ts +2 -0
- package/dist-types/meta-pixel.d.ts +2 -0
- package/dist-types/microsoft-clarity.d.ts +2 -0
- package/dist-types/microsoft-uet.d.ts +2 -0
- package/dist-types/mixpanel-analytics.d.ts +2 -0
- package/dist-types/one-dollar-stats.d.ts +2 -0
- package/dist-types/openai-pixel.d.ts +2 -0
- package/dist-types/pinterest-tag.d.ts +2 -0
- package/dist-types/pirsch.d.ts +2 -0
- package/dist-types/plausible-analytics.d.ts +2 -0
- package/dist-types/posthog.d.ts +2 -0
- package/dist-types/promptwatch.d.ts +2 -0
- package/dist-types/reddit-pixel.d.ts +2 -0
- package/dist-types/registry.d.ts +2 -458
- package/dist-types/resolve.d.ts +2 -9
- package/dist-types/rudderstack.d.ts +2 -0
- package/dist-types/rybbit-analytics.d.ts +2 -0
- package/dist-types/segment.d.ts +2 -0
- package/dist-types/snapchat-pixel.d.ts +2 -0
- package/dist-types/tiktok-pixel.d.ts +2 -0
- package/dist-types/types.d.ts +2 -314
- package/dist-types/umami-analytics.d.ts +2 -0
- package/dist-types/vendors/_shared/attributes.d.ts +2 -35
- package/dist-types/vendors/_shared/google-consent.d.ts +2 -47
- package/dist-types/vendors/_shared/install-builders.d.ts +2 -30
- package/dist-types/vendors/_shared/required-id.d.ts +2 -0
- package/dist-types/vendors/_shared/script-url.d.ts +2 -75
- package/dist-types/vendors/ads-and-pixels/linkedin-insights.d.ts +2 -92
- package/dist-types/vendors/ads-and-pixels/meta-pixel.d.ts +2 -289
- package/dist-types/vendors/ads-and-pixels/microsoft-uet.d.ts +2 -105
- package/dist-types/vendors/ads-and-pixels/openai-pixel.d.ts +2 -211
- package/dist-types/vendors/ads-and-pixels/pinterest-tag.d.ts +2 -0
- package/dist-types/vendors/ads-and-pixels/reddit-pixel.d.ts +2 -210
- package/dist-types/vendors/ads-and-pixels/snapchat-pixel.d.ts +2 -171
- package/dist-types/vendors/ads-and-pixels/tiktok-pixel.d.ts +2 -106
- package/dist-types/vendors/ads-and-pixels/x-pixel.d.ts +2 -183
- package/dist-types/vendors/analytics/adobe-analytics.d.ts +2 -75
- package/dist-types/vendors/analytics/ahrefs-analytics.d.ts +2 -62
- package/dist-types/vendors/analytics/amplitude.d.ts +2 -234
- package/dist-types/vendors/analytics/clearbit.d.ts +2 -60
- package/dist-types/vendors/analytics/cloudflare-web-analytics.d.ts +2 -67
- package/dist-types/vendors/analytics/databuddy.d.ts +2 -147
- package/dist-types/vendors/analytics/fathom-analytics.d.ts +2 -90
- package/dist-types/vendors/analytics/google-tag.d.ts +2 -93
- package/dist-types/vendors/analytics/heap.d.ts +2 -316
- package/dist-types/vendors/analytics/hightouch.d.ts +2 -285
- package/dist-types/vendors/analytics/hotjar.d.ts +2 -73
- package/dist-types/vendors/analytics/logrocket.d.ts +2 -101
- package/dist-types/vendors/analytics/matomo-analytics.d.ts +2 -41
- package/dist-types/vendors/analytics/microsoft-clarity.d.ts +2 -97
- package/dist-types/vendors/analytics/mixpanel-analytics.d.ts +2 -113
- package/dist-types/vendors/analytics/one-dollar-stats.d.ts +2 -0
- package/dist-types/vendors/analytics/pirsch.d.ts +2 -96
- package/dist-types/vendors/analytics/plausible-analytics.d.ts +2 -122
- package/dist-types/vendors/analytics/posthog.d.ts +2 -175
- package/dist-types/vendors/analytics/promptwatch.d.ts +2 -36
- package/dist-types/vendors/analytics/rudderstack.d.ts +2 -330
- package/dist-types/vendors/analytics/rybbit-analytics.d.ts +2 -82
- package/dist-types/vendors/analytics/segment.d.ts +2 -158
- package/dist-types/vendors/analytics/umami-analytics.d.ts +2 -93
- package/dist-types/vendors/analytics/vercel-analytics.d.ts +2 -66
- package/dist-types/vendors/email-and-sms/klaviyo.d.ts +2 -0
- package/dist-types/vendors/functional/crisp.d.ts +2 -78
- package/dist-types/vendors/functional/front-chat.d.ts +2 -0
- package/dist-types/vendors/functional/intercom.d.ts +2 -135
- package/dist-types/vendors/tag-managers/cloudflare-zaraz.d.ts +2 -39
- package/dist-types/vendors/tag-managers/google-tag-manager.d.ts +2 -94
- package/dist-types/vercel-analytics.d.ts +2 -0
- package/dist-types/x-pixel.d.ts +2 -0
- package/docs/README.md +129 -59
- package/docs/assets/v3/bottom-bar.png +0 -0
- package/docs/assets/v3/brand-card.png +0 -0
- package/docs/assets/v3/brand-preferences.png +0 -0
- package/docs/assets/v3/choice-wall.png +0 -0
- package/docs/assets/v3/headless-bar-html.png +0 -0
- package/docs/assets/v3/headless-bar-mobile.png +0 -0
- package/docs/assets/v3/headless-bar.png +0 -0
- package/docs/assets/v3/slim-bar.png +0 -0
- package/docs/concepts/choose-your-setup.md +87 -0
- package/docs/concepts/consent-categories.md +84 -0
- package/docs/concepts/consent-state.md +357 -0
- package/docs/{guides → concepts}/data-fetching.md +31 -27
- package/docs/concepts/how-consent-works.md +123 -0
- package/docs/concepts/policies.md +71 -0
- package/docs/customization/class-names.md +202 -0
- package/docs/customization/dark-mode.md +157 -0
- package/docs/customization/motion.md +119 -0
- package/docs/customization/overview.md +67 -33
- package/docs/customization/recipes.md +839 -47
- package/docs/customization/slots.md +216 -35
- package/docs/customization/stylesheets.md +147 -0
- package/docs/customization/tailwind.md +842 -0
- package/docs/customization/tokens.md +166 -36
- package/docs/customization/translations.md +61 -3
- package/docs/frameworks/astro/embeds.md +160 -0
- package/docs/frameworks/astro/network-blocker.md +86 -0
- package/docs/frameworks/astro/scripts.md +146 -0
- package/docs/frameworks/html/embeds.md +142 -0
- package/docs/frameworks/html/network-blocker.md +105 -0
- package/docs/frameworks/html/scripts.md +164 -0
- package/docs/frameworks/javascript/scripts.md +119 -0
- package/docs/frameworks/next/embeds.md +90 -0
- package/docs/frameworks/next/network-blocker.md +153 -0
- package/docs/frameworks/next/scripts.md +196 -0
- package/docs/frameworks/nuxt/embeds.md +81 -0
- package/docs/frameworks/nuxt/network-blocker.md +97 -0
- package/docs/frameworks/nuxt/scripts.md +89 -0
- package/docs/frameworks/react/embeds.md +89 -0
- package/docs/frameworks/react/network-blocker.md +140 -0
- package/docs/frameworks/react/scripts.md +115 -0
- package/docs/frameworks/svelte/embeds.md +96 -0
- package/docs/frameworks/svelte/network-blocker.md +141 -0
- package/docs/frameworks/svelte/scripts.md +137 -0
- package/docs/frameworks/sveltekit/embeds.md +103 -0
- package/docs/frameworks/sveltekit/network-blocker.md +149 -0
- package/docs/frameworks/sveltekit/scripts.md +141 -0
- package/docs/frameworks/tanstack-start/embeds.md +96 -0
- package/docs/frameworks/tanstack-start/network-blocker.md +145 -0
- package/docs/frameworks/tanstack-start/scripts.md +103 -0
- package/docs/frameworks/vue/embeds.md +84 -0
- package/docs/frameworks/vue/network-blocker.md +99 -0
- package/docs/frameworks/vue/scripts.md +93 -0
- package/docs/guides/banner-experiments.md +654 -0
- package/docs/guides/troubleshooting.md +120 -47
- package/docs/guides/verify-consent.md +81 -49
- package/docs/integrations/adobe-analytics.md +168 -160
- package/docs/integrations/ahrefs-analytics.md +153 -155
- package/docs/integrations/amplitude.md +163 -157
- package/docs/integrations/building-integrations.md +136 -37
- package/docs/integrations/clearbit.md +155 -155
- package/docs/integrations/cloudflare-web-analytics.md +157 -157
- package/docs/integrations/cloudflare-zaraz.md +210 -262
- package/docs/integrations/crisp.md +165 -159
- package/docs/integrations/databuddy.md +158 -174
- package/docs/integrations/fathom-analytics.md +159 -157
- package/docs/integrations/front-chat.md +322 -0
- package/docs/integrations/google-maps.md +119 -84
- package/docs/integrations/google-tag-manager.md +179 -164
- package/docs/integrations/google-tag.md +164 -161
- package/docs/integrations/heap.md +164 -156
- package/docs/integrations/hightouch.md +162 -158
- package/docs/integrations/hotjar.md +160 -156
- package/docs/integrations/intercom.md +184 -154
- package/docs/integrations/klaviyo.md +486 -0
- package/docs/integrations/linkedin-insights.md +175 -151
- package/docs/integrations/logrocket.md +161 -157
- package/docs/integrations/matomo-analytics.md +189 -179
- package/docs/integrations/meta-pixel.md +189 -151
- package/docs/integrations/microsoft-clarity.md +164 -156
- package/docs/integrations/microsoft-uet.md +149 -155
- package/docs/integrations/mixpanel-analytics.md +156 -161
- package/docs/integrations/one-dollar-stats.md +306 -0
- package/docs/integrations/openai-pixel.md +205 -302
- package/docs/integrations/overview.md +143 -83
- package/docs/integrations/pinterest-tag.md +329 -0
- package/docs/integrations/pirsch.md +170 -160
- package/docs/integrations/plausible-analytics.md +173 -159
- package/docs/integrations/posthog.md +227 -242
- package/docs/integrations/promptwatch.md +155 -155
- package/docs/integrations/reddit-pixel.md +186 -158
- package/docs/integrations/rudderstack.md +202 -187
- package/docs/integrations/rybbit-analytics.md +172 -161
- package/docs/integrations/segment.md +183 -155
- package/docs/integrations/snapchat-pixel.md +187 -157
- package/docs/integrations/tiktok-pixel.md +172 -151
- package/docs/integrations/umami-analytics.md +164 -159
- package/docs/integrations/vercel-analytics.md +167 -158
- package/docs/integrations/x-pixel.md +177 -151
- package/docs/integrations/youtube.md +122 -87
- package/docs/upgrade-v3.md +490 -354
- package/package.json +12 -236
- package/dist-types/__tests__/helpers.d.ts +0 -141
- package/docs/assets/v3/brand-bar.png +0 -0
- package/docs/assets/v3/mobile-card.png +0 -0
- package/docs/assets/v3/preferences.png +0 -0
- package/docs/frameworks/javascript/script-loader.md +0 -94
- package/docs/frameworks/next/script-loader.md +0 -210
- package/docs/frameworks/react/script-loader.md +0 -63
- package/docs/guides/consent-state.md +0 -60
- package/docs/guides/deployment-modes.md +0 -75
- package/docs/integrations/clear-on-revocation.md +0 -167
- package/docs/integrations/granular-consent.md +0 -208
|
@@ -2,18 +2,22 @@
|
|
|
2
2
|
title: YouTube
|
|
3
3
|
description: Gate YouTube embeds with c15t v3 in Next.js, TanStack Start, React,
|
|
4
4
|
Nuxt, Vue, Astro, Svelte, SvelteKit or JavaScript.
|
|
5
|
+
icon: youtube
|
|
5
6
|
group: integrations
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
## Configure the video
|
|
9
10
|
|
|
10
11
|
Use the ID of an embeddable video and the category matching its purpose in your
|
|
11
|
-
policy.
|
|
12
|
+
policy. This page uses `marketing` because the YouTube player can set
|
|
13
|
+
advertising identifiers. The framework quickstarts gate their demo video on
|
|
14
|
+
`measurement` instead; either works if your policy says so. The current v3 adapters use consent-gated iframes rather than the v2
|
|
12
15
|
`YouTubeEmbed` convenience component.
|
|
13
16
|
|
|
14
17
|
```ts title="src/embed-config.ts"
|
|
15
18
|
export const embedCategory = 'marketing' as const;
|
|
16
|
-
export const embedURL =
|
|
19
|
+
export const embedURL =
|
|
20
|
+
'https://www.youtube-nocookie.com/embed/VIDEO_ID?playsinline=1';
|
|
17
21
|
export const embedTitle = 'Product walkthrough';
|
|
18
22
|
export const embedAspectRatio = '16 / 9';
|
|
19
23
|
```
|
|
@@ -108,64 +112,66 @@ on revocation. Keep your existing consent styles and preferences dialog.
|
|
|
108
112
|
|
|
109
113
|
**Nuxt**
|
|
110
114
|
|
|
111
|
-
|
|
115
|
+
The Nuxt module registers `ConsentGate` and `ConsentPreferencesLink`, so
|
|
116
|
+
this component imports only the embed configuration.
|
|
112
117
|
|
|
113
118
|
```vue title="app/components/ConsentEmbed.vue"
|
|
114
119
|
<script setup lang="ts">
|
|
115
120
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from '../../src/embed-config';
|
|
116
|
-
|
|
117
|
-
const snapshot = useConsentSnapshot();
|
|
118
|
-
const activeUI = useConsentActiveUI();
|
|
119
121
|
</script>
|
|
120
122
|
|
|
121
123
|
<template>
|
|
122
|
-
<
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
124
|
+
<ConsentGate :category="embedCategory">
|
|
125
|
+
<iframe
|
|
126
|
+
:src="embedURL"
|
|
127
|
+
:title="embedTitle"
|
|
128
|
+
loading="lazy"
|
|
129
|
+
allowfullscreen
|
|
130
|
+
:style="{ width: '100%', aspectRatio: embedAspectRatio, minHeight: '200px', border: 0 }"
|
|
131
|
+
/>
|
|
132
|
+
<template #placeholder>
|
|
133
|
+
<p>Allow {{ embedCategory }} to load this content.</p>
|
|
134
|
+
<ConsentPreferencesLink>Open privacy settings</ConsentPreferencesLink>
|
|
135
|
+
</template>
|
|
136
|
+
</ConsentGate>
|
|
133
137
|
</template>
|
|
134
138
|
```
|
|
135
139
|
|
|
136
|
-
|
|
137
|
-
|
|
140
|
+
`ConsentGate` keeps the iframe out of the server HTML and the DOM while
|
|
141
|
+
permission is denied, and removes it on revocation. See
|
|
142
|
+
[Nuxt scripts and embeds](../frameworks/nuxt/scripts.md).
|
|
138
143
|
|
|
139
144
|
**Vue**
|
|
140
145
|
|
|
141
|
-
|
|
146
|
+
Render this component inside the app that installed the c15t Vue plugin.
|
|
142
147
|
|
|
143
148
|
```vue title="src/ConsentEmbed.vue"
|
|
144
149
|
<script setup lang="ts">
|
|
145
|
-
import
|
|
150
|
+
import ConsentGate from 'c15t/vue/runtime/components/consent-gate.vue';
|
|
151
|
+
import ConsentPreferencesLink from 'c15t/vue/runtime/components/consent-preferences-link.vue';
|
|
146
152
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
|
|
147
|
-
|
|
148
|
-
const snapshot = useConsentSnapshot();
|
|
149
|
-
const activeUI = useConsentActiveUI();
|
|
150
153
|
</script>
|
|
151
154
|
|
|
152
155
|
<template>
|
|
153
|
-
<
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
156
|
+
<ConsentGate :category="embedCategory">
|
|
157
|
+
<iframe
|
|
158
|
+
:src="embedURL"
|
|
159
|
+
:title="embedTitle"
|
|
160
|
+
loading="lazy"
|
|
161
|
+
allowfullscreen
|
|
162
|
+
:style="{ width: '100%', aspectRatio: embedAspectRatio, minHeight: '200px', border: 0 }"
|
|
163
|
+
/>
|
|
164
|
+
<template #placeholder>
|
|
165
|
+
<p>Allow {{ embedCategory }} to load this content.</p>
|
|
166
|
+
<ConsentPreferencesLink>Open privacy settings</ConsentPreferencesLink>
|
|
167
|
+
</template>
|
|
168
|
+
</ConsentGate>
|
|
164
169
|
</template>
|
|
165
170
|
```
|
|
166
171
|
|
|
167
|
-
|
|
168
|
-
|
|
172
|
+
`ConsentGate` keeps the iframe out of the DOM while permission is denied,
|
|
173
|
+
and removes it on revocation. See
|
|
174
|
+
[Vue scripts and embeds](../frameworks/vue/scripts.md).
|
|
169
175
|
|
|
170
176
|
**Astro**
|
|
171
177
|
|
|
@@ -176,7 +182,7 @@ Add this component to pages using your consent-enabled base layout:
|
|
|
176
182
|
<c15t-consent-embed style="display: block"></c15t-consent-embed>
|
|
177
183
|
|
|
178
184
|
<script>
|
|
179
|
-
import { getConsentClient } from '
|
|
185
|
+
import { getConsentClient } from 'c15t/astro/client';
|
|
180
186
|
import { mountConsentEmbed } from '../consent-embed';
|
|
181
187
|
|
|
182
188
|
class ConsentEmbed extends HTMLElement {
|
|
@@ -274,16 +280,37 @@ The Svelte `ConsentGate` waits until the browser is mounted and the category is
|
|
|
274
280
|
allowed. Its default placeholder opens preferences. Revocation removes the
|
|
275
281
|
iframe.
|
|
276
282
|
|
|
283
|
+
**HTML**
|
|
284
|
+
|
|
285
|
+
The c15t script tag gates iframes that name a category. Put the embed's URL
|
|
286
|
+
in `data-src` instead of `src`, using the values from the configuration on
|
|
287
|
+
this page:
|
|
288
|
+
|
|
289
|
+
```html
|
|
290
|
+
<iframe
|
|
291
|
+
data-src="https://www.youtube-nocookie.com/embed/VIDEO_ID?playsinline=1"
|
|
292
|
+
data-category="measurement"
|
|
293
|
+
title="Product video"
|
|
294
|
+
loading="lazy"
|
|
295
|
+
allowfullscreen
|
|
296
|
+
></iframe>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
c15t sets `src` once the category is allowed and removes it on revocation.
|
|
300
|
+
Without `src` the iframe loads nothing, so hide it with CSS and show a link
|
|
301
|
+
to `#c15t-preferences` in its place. See
|
|
302
|
+
[HTML embeds](../frameworks/html/embeds.md).
|
|
303
|
+
|
|
277
304
|
**JavaScript**
|
|
278
305
|
|
|
279
|
-
Use the shared browser helper below with your existing
|
|
306
|
+
Use the shared browser helper below with your existing client. Put an
|
|
280
307
|
empty container where the embed should appear:
|
|
281
308
|
|
|
282
309
|
```html
|
|
283
310
|
<div id="consent-embed"></div>
|
|
284
311
|
```
|
|
285
312
|
|
|
286
|
-
In your browser entry point, after
|
|
313
|
+
In your browser entry point, after `init()`:
|
|
287
314
|
|
|
288
315
|
```ts
|
|
289
316
|
import { mountConsentEmbed } from './consent-embed';
|
|
@@ -291,13 +318,16 @@ import { mountConsentEmbed } from './consent-embed';
|
|
|
291
318
|
const container = document.querySelector<HTMLElement>('#consent-embed');
|
|
292
319
|
if (!container) throw new Error('Missing consent embed container');
|
|
293
320
|
|
|
294
|
-
const disposeEmbed = mountConsentEmbed(container, kernel,
|
|
321
|
+
const disposeEmbed = mountConsentEmbed(container, consent.kernel, () =>
|
|
322
|
+
consent.openDialog(),
|
|
323
|
+
);
|
|
295
324
|
```
|
|
296
325
|
|
|
297
|
-
`
|
|
298
|
-
|
|
299
|
-
`disposeEmbed()` when the page or component is
|
|
300
|
-
|
|
326
|
+
`consent` is the client from `init()` in your quickstart. With
|
|
327
|
+
`createConsentRuntime`, pass `runtime.kernel` and your own function that
|
|
328
|
+
opens preferences. Call `disposeEmbed()` when the page or component is
|
|
329
|
+
destroyed. Iframe markup with `data-src` and `data-category` also works
|
|
330
|
+
without the helper, because both setups gate iframes by default.
|
|
301
331
|
|
|
302
332
|
## Browser helper for Astro and JavaScript
|
|
303
333
|
|
|
@@ -306,51 +336,56 @@ when permission allows it, keeps an existing player mounted across unrelated
|
|
|
306
336
|
snapshot updates, and removes it on revocation.
|
|
307
337
|
|
|
308
338
|
```ts title="src/consent-embed.ts"
|
|
309
|
-
import {
|
|
339
|
+
import {
|
|
340
|
+
embedCategory,
|
|
341
|
+
embedURL,
|
|
342
|
+
embedTitle,
|
|
343
|
+
embedAspectRatio,
|
|
344
|
+
} from './embed-config';
|
|
310
345
|
|
|
311
346
|
type EmbedKernel = {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
347
|
+
getSnapshot: () => {
|
|
348
|
+
effectivePermissions: Record<typeof embedCategory, boolean>;
|
|
349
|
+
};
|
|
350
|
+
subscribe: (listener: () => void) => () => void;
|
|
316
351
|
};
|
|
317
352
|
|
|
318
353
|
export function mountConsentEmbed(
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
354
|
+
container: HTMLElement,
|
|
355
|
+
kernel: EmbedKernel,
|
|
356
|
+
openPreferences: () => void
|
|
322
357
|
) {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
358
|
+
const render = () => {
|
|
359
|
+
if (kernel.getSnapshot().effectivePermissions[embedCategory]) {
|
|
360
|
+
if (container.querySelector('iframe')) return;
|
|
361
|
+
const frame = document.createElement('iframe');
|
|
362
|
+
frame.src = embedURL;
|
|
363
|
+
frame.title = embedTitle;
|
|
364
|
+
frame.loading = 'lazy';
|
|
365
|
+
frame.allowFullscreen = true;
|
|
366
|
+
Object.assign(frame.style, {
|
|
367
|
+
width: '100%',
|
|
368
|
+
aspectRatio: embedAspectRatio,
|
|
369
|
+
minHeight: '200px',
|
|
370
|
+
border: '0',
|
|
371
|
+
});
|
|
372
|
+
container.replaceChildren(frame);
|
|
373
|
+
} else {
|
|
374
|
+
if (container.querySelector('button')) return;
|
|
375
|
+
const button = document.createElement('button');
|
|
376
|
+
button.type = 'button';
|
|
377
|
+
button.textContent = 'Open privacy settings to view this content';
|
|
378
|
+
button.onclick = openPreferences;
|
|
379
|
+
container.replaceChildren(button);
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
render();
|
|
384
|
+
const unsubscribe = kernel.subscribe(render);
|
|
385
|
+
return () => {
|
|
386
|
+
unsubscribe();
|
|
387
|
+
container.replaceChildren();
|
|
388
|
+
};
|
|
354
389
|
}
|
|
355
390
|
```
|
|
356
391
|
|
|
@@ -381,8 +416,8 @@ Set playback options in the iframe URL. For example, append `start=36` to begin
|
|
|
381
416
|
and reserve at least a 200-by-200-pixel player area.
|
|
382
417
|
|
|
383
418
|
React and Svelte `ConsentGate` components provide a blocked-state placeholder and
|
|
384
|
-
consent action. Their `placeholder` APIs differ
|
|
385
|
-
takes a snippet. Keep a clear way to reopen preferences when customizing them.
|
|
419
|
+
consent action. Their `placeholder` APIs differ. React takes a node, and
|
|
420
|
+
Svelte takes a snippet. Keep a clear way to reopen preferences when customizing them.
|
|
386
421
|
The Vue and browser examples show that action explicitly. `loading="lazy"` delays an
|
|
387
422
|
allowed iframe for performance; it does not implement consent gating.
|
|
388
423
|
|
|
@@ -391,7 +426,7 @@ allowed iframe for performance; it does not implement consent gating.
|
|
|
391
426
|
Add `data-vendor="youtube"` next to `data-category` and declare a `youtube`
|
|
392
427
|
vendor in the runtime's `vendors` option or the backend manifest to let visitors
|
|
393
428
|
turn YouTube off while keeping the rest of the category on. See
|
|
394
|
-
[
|
|
429
|
+
[vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
|
|
395
430
|
|
|
396
431
|
Each example keeps the iframe absent until the category is allowed. After
|
|
397
432
|
permission, the iframe can load. Revoking permission removes the iframe and its
|