@c15t/react 3.0.0-alpha.0 → 3.0.0-alpha.10
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 +96 -69
- package/README.md +21 -17
- package/SKILL.md +34 -0
- package/dist/aggregate-components.js +1 -1
- package/dist/chunk-warming.js +1 -1
- package/dist/component-hooks/use-headless-consent-ui.js +1 -1
- package/dist/component-hooks/use-headless-iab-consent-ui.js +1 -1
- package/dist/component-hooks/use-panel-trigger.js +1 -1
- package/dist/components/consent-gate/atoms.js +1 -0
- package/dist/components/consent-gate/consent-gate.js +2 -0
- package/dist/components/consent-gate/frame.js +2 -0
- package/dist/components/consent-gate/index.js +2 -0
- package/dist/components/consent-preferences-link/consent-preferences-link.js +1 -1
- package/dist/components/iab-panel/atoms/card.js +1 -1
- package/dist/components/iab-panel/atoms/feature-item.js +2 -0
- package/dist/components/iab-panel/atoms/header.js +1 -1
- package/dist/components/iab-panel/atoms/purpose-item.js +1 -1
- package/dist/components/iab-panel/atoms/root.js +1 -1
- package/dist/components/iab-panel/atoms/stack-item.js +1 -1
- package/dist/components/iab-panel/atoms/vendor-list.js +1 -1
- package/dist/components/iab-panel/hooks/use-gvl-data.js +1 -1
- package/dist/components/iab-panel/iab-panel.js +1 -1
- package/dist/components/iab-panel/index.js +1 -1
- package/dist/components/iab-prompt/atoms/overlay.js +1 -1
- package/dist/components/iab-prompt/atoms/root.js +1 -1
- package/dist/components/panel/atoms/card.js +1 -1
- package/dist/components/panel/atoms/overlay.js +1 -1
- package/dist/components/panel/atoms/root.js +1 -1
- package/dist/components/panel/panel.js +1 -1
- package/dist/components/panel-trigger/atoms/button.js +1 -1
- package/dist/components/panel-trigger/atoms/icon.js +1 -1
- package/dist/components/panel-trigger/atoms/root.js +1 -1
- package/dist/components/panel-trigger/atoms/toolbar.js +1 -1
- package/dist/components/panel-trigger/atoms/trigger-icons.js +1 -0
- package/dist/components/panel-trigger/panel-trigger-toolbar.js +1 -1
- package/dist/components/panel-trigger/panel-trigger.js +1 -1
- package/dist/components/preferences/atoms/accordion.js +1 -1
- package/dist/components/preferences/atoms/root.js +1 -1
- package/dist/components/preferences/atoms/vendor-list.js +1 -0
- package/dist/components/preferences/index.js +1 -1
- package/dist/components/prompt/atoms/early-tap-script.js +2 -0
- package/dist/components/prompt/atoms/overlay.js +1 -1
- package/dist/components/prompt/atoms/root.js +1 -1
- package/dist/components/prompt/components.js +1 -1
- package/dist/components/prompt/policy-actions.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/libs/compose-refs.js +1 -0
- package/dist/components/shared/libs/slot.js +1 -1
- package/dist/components/shared/primitives/button.js +1 -1
- package/dist/components/shared/primitives/legal-links/index.js +1 -1
- package/dist/components/shared/streamed-surface.js +2 -0
- package/dist/components/shared/surface-styles.js +2 -0
- package/dist/components/shared/ui/dialog/dialog.js +1 -1
- package/dist/components/shared/ui/icon.js +1 -1
- package/dist/components/shared/ui/logo.js +1 -1
- package/dist/components/shared/ui/preference-item/preference-item.js +1 -1
- package/dist/consent-gate.js +2 -0
- package/dist/consent-theme.js +1 -0
- package/dist/context/consent-tracking-context.js +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context.js +1 -1
- package/dist/devtools-launcher.js +2 -0
- package/dist/devtools.js +1 -1
- package/dist/draft-context.js +2 -0
- package/dist/draft.js +1 -1
- package/dist/external-iab-context.js +1 -1
- package/dist/gpp.js +2 -0
- package/dist/headless.js +1 -1
- package/dist/hooks/use-color-scheme.js +1 -1
- package/dist/hooks/use-committed-ref.js +2 -0
- package/dist/hooks/use-focus-trap.js +1 -1
- package/dist/hooks/use-headless-iab-consent-ui.js +1 -1
- package/dist/hooks/use-iab-policy-guard.js +1 -0
- package/dist/hooks/use-late-entry.js +2 -0
- package/dist/hooks.js +1 -1
- package/dist/iab/styles.tw3.css +5 -151
- package/dist/iab-context.js +1 -1
- package/dist/index-parts/consent-banner.js +1 -0
- package/dist/index-parts/consent-dialog-link.js +1 -0
- package/dist/index-parts/consent-dialog-trigger.js +1 -0
- package/dist/index-parts/consent-dialog.js +1 -0
- package/dist/index-parts/consent-gate.js +1 -0
- package/dist/index-parts/core.js +1 -0
- package/dist/index-parts/draft.js +1 -0
- package/dist/index-parts/frame.js +1 -0
- package/dist/index-parts/hooks.js +1 -0
- package/dist/index-parts/hosted.js +1 -0
- package/dist/index-parts/module-hooks.js +1 -0
- package/dist/index-parts/offline.js +1 -0
- package/dist/index-parts/presets.js +1 -0
- package/dist/index-parts/provider.js +1 -0
- package/dist/index-parts/theme.js +1 -0
- package/dist/index-parts/translations.js +1 -0
- package/dist/index.js +1 -1
- package/dist/kernel-selector.js +1 -0
- package/dist/modes.js +1 -0
- package/dist/module-hooks/iframe-blocker.js +1 -1
- package/dist/module-hooks/network-blocker.js +1 -1
- package/dist/module-hooks/network-hold.js +2 -0
- package/dist/module-hooks/persistence.js +1 -1
- package/dist/panel-link.js +1 -1
- package/dist/panel-trigger.js +1 -1
- package/dist/panel.js +1 -1
- package/dist/postcss-tailwind3.js +1 -0
- package/dist/preferences.js +1 -2
- package/dist/provider.js +1 -1
- package/dist/server/fetch-ssr-data.js +1 -1
- package/dist/server/headers.js +1 -1
- package/dist/server/normalize-url.js +1 -1
- package/dist/styles.tw3.css +35 -159
- package/dist/transports/hosted.js +1 -0
- package/dist/transports/manifest.js +1 -0
- package/dist/transports/offline.js +1 -1
- package/dist/utils/deferred-module.js +2 -0
- package/dist/utils/merge-slot-props.js +1 -1
- package/dist/utils/theme-utils.js +1 -1
- package/dist/version.js +1 -1
- package/dist-types/aggregate-components.d.ts +2 -2
- package/dist-types/chunk-warming.d.ts +45 -8
- package/dist-types/component-hooks/use-headless-consent-ui.d.ts +5 -5
- package/dist-types/component-hooks/use-headless-iab-consent-ui.d.ts +2 -2
- package/dist-types/components/consent-gate/atoms.d.ts +11 -0
- package/dist-types/components/consent-gate/consent-gate.d.ts +2 -0
- package/dist-types/components/consent-gate/frame.d.ts +19 -0
- package/dist-types/components/consent-gate/index.d.ts +25 -0
- package/dist-types/components/{frame → consent-gate}/types.d.ts +7 -7
- package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
- package/dist-types/components/consent-preferences-link/index.d.ts +1 -1
- package/dist-types/components/iab-panel/atoms/feature-item.d.ts +28 -0
- package/dist-types/components/iab-panel/atoms/purpose-item.d.ts +5 -2
- package/dist-types/components/iab-panel/atoms/stack-item.d.ts +7 -2
- package/dist-types/components/iab-panel/atoms/vendor-list.d.ts +1 -1
- package/dist-types/components/iab-panel/iab-panel.d.ts +3 -3
- package/dist-types/components/iab-panel/index.d.ts +29 -26
- package/dist-types/components/iab-panel/use-iab-translations.d.ts +4 -0
- package/dist-types/components/iab-prompt/iab-prompt.d.ts +3 -3
- package/dist-types/components/iab-prompt/index.d.ts +19 -19
- package/dist-types/components/panel/atoms/card.d.ts +5 -4
- package/dist-types/components/panel/atoms/overlay.d.ts +1 -1
- package/dist-types/components/panel/index.d.ts +8 -8
- package/dist-types/components/panel/panel.d.ts +3 -3
- package/dist-types/components/panel-link/index.d.ts +1 -1
- package/dist-types/components/panel-trigger/atoms/button.d.ts +1 -1
- package/dist-types/components/panel-trigger/atoms/icon.d.ts +1 -1
- package/dist-types/components/panel-trigger/atoms/root.d.ts +2 -2
- package/dist-types/components/panel-trigger/atoms/toolbar.d.ts +2 -2
- package/dist-types/components/panel-trigger/atoms/trigger-icons.d.ts +25 -0
- package/dist-types/components/panel-trigger/index.d.ts +4 -4
- package/dist-types/components/panel-trigger/panel-trigger-toolbar.d.ts +1 -1
- package/dist-types/components/panel-trigger/panel-trigger.d.ts +9 -17
- package/dist-types/components/panel-trigger/types.d.ts +1 -1
- package/dist-types/components/preferences/atoms/accordion.d.ts +6 -4
- package/dist-types/components/preferences/atoms/button.d.ts +1 -1
- package/dist-types/components/preferences/atoms/footer.d.ts +1 -1
- package/dist-types/components/preferences/atoms/root.d.ts +1 -1
- package/dist-types/components/preferences/atoms/vendor-list.d.ts +23 -0
- package/dist-types/components/preferences/index.d.ts +14 -12
- package/dist-types/components/preferences/policy-actions.d.ts +2 -2
- package/dist-types/components/preferences/preferences.d.ts +1 -1
- package/dist-types/components/preferences/types.d.ts +1 -1
- package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
- package/dist-types/components/prompt/atoms/root.d.ts +4 -0
- package/dist-types/components/prompt/components.d.ts +9 -3
- package/dist-types/components/prompt/index.d.ts +12 -12
- package/dist-types/components/prompt/policy-actions.d.ts +2 -2
- package/dist-types/components/prompt/prompt.d.ts +5 -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/libs/compose-refs.d.ts +20 -0
- package/dist-types/components/shared/policy-actions.d.ts +2 -2
- package/dist-types/components/shared/primitives/box.d.ts +1 -1
- package/dist-types/components/shared/primitives/button.d.ts +2 -2
- package/dist-types/components/shared/primitives/button.types.d.ts +1 -1
- package/dist-types/components/shared/streamed-surface.d.ts +23 -0
- package/dist-types/components/shared/surface-styles.d.ts +36 -0
- package/dist-types/components/shared/ui/accordion/accordion.d.ts +2 -2
- package/dist-types/components/shared/ui/accordion/index.d.ts +2 -2
- package/dist-types/components/shared/ui/animated-collapse/index.d.ts +2 -2
- package/dist-types/components/shared/ui/branding.d.ts +1 -1
- package/dist-types/components/shared/ui/button/button.d.ts +1 -1
- package/dist-types/components/shared/ui/button/index.d.ts +2 -2
- package/dist-types/components/shared/ui/collapsible/index.d.ts +1 -1
- package/dist-types/components/shared/ui/dialog/index.d.ts +1 -1
- package/dist-types/components/shared/ui/icon.d.ts +2 -1
- package/dist-types/components/shared/ui/logo.d.ts +0 -10
- package/dist-types/components/shared/ui/preference-item/index.d.ts +1 -1
- package/dist-types/components/shared/ui/preference-item/preference-item.d.ts +13 -0
- package/dist-types/components/shared/ui/switch/index.d.ts +2 -2
- package/dist-types/components/shared/ui/switch/switch.d.ts +1 -1
- package/dist-types/components/shared/ui/tabs/index.d.ts +1 -1
- package/dist-types/consent-gate.d.ts +1 -0
- package/dist-types/consent-theme.d.ts +38 -0
- package/dist-types/context/consent-tracking-context.d.ts +10 -0
- package/dist-types/context/index.d.ts +3 -3
- package/dist-types/context/theme-context.d.ts +3 -3
- package/dist-types/context.d.ts +25 -1
- package/dist-types/devtools-launcher.d.ts +29 -0
- package/dist-types/devtools.d.ts +13 -2
- package/dist-types/draft-context.d.ts +31 -0
- package/dist-types/draft.d.ts +81 -9
- package/dist-types/gpp.d.ts +27 -0
- package/dist-types/headless.d.ts +6 -7
- package/dist-types/hooks/use-committed-ref.d.ts +24 -0
- package/dist-types/hooks/use-focus-trap.d.ts +3 -1
- package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +1 -1
- package/dist-types/hooks/use-iab-manager.d.ts +5 -5
- package/dist-types/hooks/use-iab-policy-guard.d.ts +35 -0
- package/dist-types/hooks/use-late-entry.d.ts +14 -0
- package/dist-types/hooks/use-theme.d.ts +1 -1
- package/dist-types/hooks.d.ts +106 -11
- package/dist-types/iab.d.ts +7 -7
- package/dist-types/index-parts/consent-banner.d.ts +7 -0
- package/dist-types/index-parts/consent-dialog-link.d.ts +7 -0
- package/dist-types/index-parts/consent-dialog-trigger.d.ts +7 -0
- package/dist-types/index-parts/consent-dialog.d.ts +7 -0
- package/dist-types/index-parts/consent-gate.d.ts +7 -0
- package/dist-types/index-parts/core.d.ts +7 -0
- package/dist-types/index-parts/draft.d.ts +7 -0
- package/dist-types/index-parts/frame.d.ts +7 -0
- package/dist-types/index-parts/hooks.d.ts +7 -0
- package/dist-types/index-parts/hosted.d.ts +7 -0
- package/dist-types/index-parts/module-hooks.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-parts/provider.d.ts +7 -0
- package/dist-types/index-parts/theme.d.ts +8 -0
- package/dist-types/index-parts/translations.d.ts +7 -0
- package/dist-types/index.d.ts +32 -28
- package/dist-types/kernel-selector.d.ts +68 -0
- package/dist-types/modes.d.ts +26 -0
- package/dist-types/module-hooks/iframe-blocker.d.ts +33 -1
- package/dist-types/module-hooks/network-blocker.d.ts +23 -0
- package/dist-types/module-hooks/network-hold.d.ts +47 -0
- package/dist-types/module-hooks.d.ts +4 -4
- package/dist-types/panel-link.d.ts +1 -1
- package/dist-types/panel-trigger.d.ts +1 -1
- package/dist-types/panel.d.ts +13 -1
- package/dist-types/postcss-tailwind3.d.ts +21 -0
- package/dist-types/preferences.d.ts +12 -1
- package/dist-types/primitives/accordion.d.ts +1 -1
- package/dist-types/primitives/button.d.ts +1 -1
- package/dist-types/primitives/collapsible.d.ts +1 -1
- package/dist-types/primitives/dialog.d.ts +1 -1
- package/dist-types/primitives/preference-item.d.ts +1 -1
- package/dist-types/primitives/switch.d.ts +1 -1
- package/dist-types/primitives/tabs.d.ts +1 -1
- package/dist-types/primitives.d.ts +7 -7
- package/dist-types/prompt.d.ts +1 -1
- package/dist-types/provider.d.ts +174 -28
- package/dist-types/server/fetch-ssr-data.d.ts +1 -1
- package/dist-types/server/headers.d.ts +14 -4
- package/dist-types/server/index.d.ts +5 -5
- package/dist-types/server/normalize-url.d.ts +14 -7
- package/dist-types/server/types.d.ts +12 -1
- package/dist-types/theme-provider.d.ts +2 -2
- package/dist-types/transports/hosted.d.ts +36 -0
- package/dist-types/transports/manifest.d.ts +48 -0
- package/dist-types/transports/offline.d.ts +7 -16
- package/dist-types/types/index.d.ts +3 -3
- package/dist-types/types/manager.d.ts +1 -1
- package/dist-types/types/theme/index.d.ts +1 -1
- package/dist-types/ui-config-context.d.ts +14 -2
- package/dist-types/utils/deferred-module.d.ts +13 -0
- package/dist-types/utils/index.d.ts +4 -4
- package/dist-types/utils/merge-slot-props.d.ts +17 -3
- package/dist-types/utils/merge-styles.d.ts +1 -1
- package/dist-types/utils/theme-utils.d.ts +18 -3
- package/dist-types/version.d.ts +1 -1
- package/docs/README.md +96 -69
- 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 +138 -0
- package/docs/concepts/consent-categories.md +84 -0
- package/docs/concepts/consent-state.md +421 -0
- package/docs/concepts/data-fetching.md +270 -0
- package/docs/concepts/how-consent-works.md +123 -0
- package/docs/concepts/modes.md +278 -0
- package/docs/{frameworks/react/concepts/policy-presets.md → concepts/policies.md} +8 -60
- package/docs/customization/class-names.md +202 -0
- package/docs/customization/dark-mode.md +157 -0
- package/docs/customization/motion.md +128 -0
- package/docs/customization/overview.md +68 -33
- package/docs/customization/recipes.md +838 -47
- package/docs/customization/slots.md +217 -35
- package/docs/customization/stylesheets.md +248 -0
- package/docs/customization/tailwind.md +863 -0
- package/docs/customization/tokens.md +167 -36
- package/docs/customization/translations.md +87 -3
- package/docs/frameworks/react/callbacks.md +118 -0
- package/docs/frameworks/react/clear-on-revocation.md +106 -0
- package/docs/frameworks/react/components/consent-banner.md +48 -27
- package/docs/frameworks/react/components/consent-dialog-link.md +13 -11
- package/docs/frameworks/react/components/consent-dialog-trigger.md +86 -76
- package/docs/frameworks/react/components/consent-dialog.md +111 -58
- package/docs/frameworks/react/components/{frame.md → consent-gate.md} +70 -49
- package/docs/frameworks/react/components/consent-provider.md +140 -0
- package/docs/frameworks/react/components/consent-widget.md +69 -24
- package/docs/frameworks/react/components/dev-tools.md +76 -85
- package/docs/frameworks/react/components.md +113 -0
- package/docs/frameworks/react/compose.md +354 -0
- package/docs/frameworks/react/content-security-policy.md +143 -0
- package/docs/frameworks/react/customize.md +258 -0
- package/docs/frameworks/react/embeds.md +89 -0
- package/docs/frameworks/react/gpp.md +163 -0
- package/docs/frameworks/react/headless.md +4 -4
- package/docs/frameworks/react/hooks.md +70 -0
- package/docs/frameworks/react/iab.md +259 -0
- package/docs/frameworks/react/network-blocker.md +140 -0
- package/docs/frameworks/react/quickstart.md +220 -102
- package/docs/frameworks/react/rendering.md +263 -0
- package/docs/frameworks/react/scripts.md +114 -0
- package/docs/frameworks/react/translations.md +155 -0
- package/docs/frameworks/react/troubleshooting.md +188 -61
- package/docs/frameworks/react/upgrade-v3.md +651 -0
- package/docs/frameworks/react/vendor-consent.md +188 -0
- package/docs/guides/banner-experiments.md +672 -0
- package/docs/guides/troubleshooting.md +192 -54
- package/docs/guides/verify-consent.md +96 -49
- package/docs/integrations/adobe-analytics.md +177 -183
- package/docs/integrations/ahrefs-analytics.md +162 -178
- package/docs/integrations/amplitude.md +172 -180
- package/docs/integrations/building-integrations.md +137 -33
- package/docs/integrations/clearbit.md +164 -178
- package/docs/integrations/cloudflare-web-analytics.md +166 -180
- package/docs/integrations/cloudflare-zaraz.md +333 -0
- package/docs/integrations/crisp.md +174 -182
- package/docs/integrations/databuddy.md +167 -197
- package/docs/integrations/fathom-analytics.md +168 -180
- package/docs/integrations/front-chat.md +308 -0
- package/docs/integrations/google-maps.md +142 -108
- package/docs/integrations/google-tag-manager.md +258 -185
- package/docs/integrations/google-tag.md +226 -182
- package/docs/integrations/heap.md +173 -179
- package/docs/integrations/hightouch.md +171 -181
- package/docs/integrations/hotjar.md +169 -179
- package/docs/integrations/intercom.md +193 -177
- package/docs/integrations/klaviyo.md +473 -0
- package/docs/integrations/linkedin-insights.md +184 -174
- package/docs/integrations/logrocket.md +170 -180
- package/docs/integrations/matomo-analytics.md +198 -202
- package/docs/integrations/meta-pixel.md +198 -174
- package/docs/integrations/microsoft-clarity.md +173 -179
- package/docs/integrations/microsoft-uet.md +158 -178
- package/docs/integrations/mixpanel-analytics.md +165 -184
- package/docs/integrations/one-dollar-stats.md +292 -0
- package/docs/integrations/openai-pixel.md +214 -325
- package/docs/integrations/overview.md +152 -83
- package/docs/integrations/pinterest-tag.md +315 -0
- package/docs/integrations/pirsch.md +179 -183
- package/docs/integrations/plausible-analytics.md +182 -182
- package/docs/integrations/posthog.md +323 -264
- package/docs/integrations/promptwatch.md +164 -178
- package/docs/integrations/reddit-pixel.md +195 -181
- package/docs/integrations/rudderstack.md +211 -210
- package/docs/integrations/rybbit-analytics.md +181 -184
- package/docs/integrations/segment.md +192 -178
- package/docs/integrations/sentry.md +402 -0
- package/docs/integrations/snapchat-pixel.md +196 -180
- package/docs/integrations/tiktok-pixel.md +181 -174
- package/docs/integrations/umami-analytics.md +173 -182
- package/docs/integrations/vercel-analytics.md +176 -181
- package/docs/integrations/x-pixel.md +186 -174
- package/docs/integrations/youtube.md +150 -111
- package/package.json +48 -17
- package/dist/component-hooks/use-manager.js +0 -2
- package/dist/components/frame/atoms.js +0 -1
- package/dist/components/frame/frame.js +0 -2
- package/dist/components/frame/index.js +0 -2
- package/dist/frame.js +0 -2
- package/dist/ui-save.js +0 -1
- package/dist-types/component-hooks/use-manager.d.ts +0 -40
- package/dist-types/components/frame/atoms.d.ts +0 -11
- package/dist-types/components/frame/frame.d.ts +0 -2
- package/dist-types/components/frame/index.d.ts +0 -24
- package/dist-types/frame.d.ts +0 -1
- package/dist-types/ui-save.d.ts +0 -5
- 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/react/components/consent-manager-provider.md +0 -62
- package/docs/frameworks/react/concepts/consent-categories.md +0 -33
- package/docs/frameworks/react/hooks/use-consent-manager/overview.md +0 -58
- package/docs/frameworks/react/iab/overview.md +0 -53
- package/docs/frameworks/react/script-loader.md +0 -55
- package/docs/frameworks/react/styling/overview.md +0 -207
- package/docs/guides/consent-state.md +0 -60
- package/docs/guides/data-fetching.md +0 -163
- package/docs/guides/deployment-modes.md +0 -63
- package/docs/upgrade-v3.md +0 -334
- package/readme.json +0 -48
- package/src/iab/styles.css +0 -11
- package/src/styles.css +0 -10
- /package/dist/components/{frame → consent-gate}/types.js +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Vendor consent
|
|
3
|
+
description: Let visitors allow a category such as marketing in a React app and
|
|
4
|
+
still turn off one vendor in it, with the vendors option on ConsentProvider
|
|
5
|
+
and useVendorAllowed.
|
|
6
|
+
group: frameworks
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## How vendor consent works
|
|
10
|
+
|
|
11
|
+
A visitor allows marketing, then switches off X Pixel. Other marketing
|
|
12
|
+
scripts load; X Pixel does not. c15t loads a script, network request or
|
|
13
|
+
iframe that names a vendor only when both are true:
|
|
14
|
+
|
|
15
|
+
* Its category is allowed.
|
|
16
|
+
* The visitor has not switched its vendor off.
|
|
17
|
+
|
|
18
|
+
A vendor switch never grants a category. With marketing denied, X Pixel stays
|
|
19
|
+
blocked whatever its own switch says. You do not need IAB TCF for this. Under
|
|
20
|
+
an `iab` policy, c15t ignores vendor slugs and takes vendor consent from the
|
|
21
|
+
TC string instead; see [IAB TCF](./iab.md).
|
|
22
|
+
|
|
23
|
+
## Declare the vendors
|
|
24
|
+
|
|
25
|
+
Built-in `@c15t/integrations` helpers already list their vendor by name, so
|
|
26
|
+
you only declare a vendor for a script of your own, or to replace a helper's
|
|
27
|
+
name and privacy policy.
|
|
28
|
+
|
|
29
|
+
Declare the vendors next to the scripts in `src/scripts.ts`, using the `vendor`
|
|
30
|
+
slug each script already carries:
|
|
31
|
+
|
|
32
|
+
```ts title="src/scripts.ts (partial)"
|
|
33
|
+
import type { Vendor } from 'c15t';
|
|
34
|
+
|
|
35
|
+
export const vendors: Vendor[] = [
|
|
36
|
+
{
|
|
37
|
+
id: 'x-pixel',
|
|
38
|
+
name: 'X Pixel',
|
|
39
|
+
category: 'marketing',
|
|
40
|
+
privacyPolicyUrl: 'https://x.com/privacy',
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Then add them to the provider options in `src/consent.tsx`:
|
|
46
|
+
|
|
47
|
+
```tsx title="src/consent.tsx (partial)"
|
|
48
|
+
import { scripts, vendors } from './scripts';
|
|
49
|
+
|
|
50
|
+
<ConsentProvider options={{ mode, scripts, vendors }}>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`vendors` is a live option, like `scripts`: passing a new list replaces the
|
|
54
|
+
declared vendors. A provider that borrows a `runtime` does not accept
|
|
55
|
+
`vendors`; declare them in `createConsentRuntime({ vendors })` instead.
|
|
56
|
+
|
|
57
|
+
## Vendor fields
|
|
58
|
+
|
|
59
|
+
| Field | Required | Behavior |
|
|
60
|
+
| ----------------------------------------- | -------- | --------------------------------------------------------------------------- |
|
|
61
|
+
| `id` | Yes | Lowercase slug of up to 64 characters: letters, digits, `.`, `_` and `-`. |
|
|
62
|
+
| `name` | Yes | Name shown in the preference dialog. |
|
|
63
|
+
| `category` | Yes | A category, or a condition such as `{ or: ['measurement', 'marketing'] }`. |
|
|
64
|
+
| `privacyPolicyUrl` | Yes | Link shown next to the vendor. |
|
|
65
|
+
| `description`, `legalName`, `homepageUrl` | No | Extra detail shown on the vendor card. |
|
|
66
|
+
| `disabled` | No | List the vendor without a switch. A stored denial for it no longer applies. |
|
|
67
|
+
|
|
68
|
+
The `id` must match the `vendor` slug on the script. Every `@c15t/integrations`
|
|
69
|
+
helper sets `vendor` to its script ID, so `xPixel()` is `x-pixel`, `gtag()`
|
|
70
|
+
is `gtag` and `cloudflareZaraz()` is `cloudflare-zaraz`. Each
|
|
71
|
+
[vendor guide](../../integrations/overview.md) names its slug.
|
|
72
|
+
|
|
73
|
+
You don't need to declare a helper's vendor. Each helper also sets
|
|
74
|
+
`vendorDetails` on its script: the vendor's name, privacy policy, homepage
|
|
75
|
+
and legal entity. The dialog lists the vendor with its own switch from
|
|
76
|
+
those. Declare the vendor in `vendors` to replace them, for example to link
|
|
77
|
+
your own data processing notice, or when you self-host a tool such as
|
|
78
|
+
Matomo, Umami, Plausible or PostHog and the vendor's privacy policy doesn't
|
|
79
|
+
cover your install. A declaration replaces `vendorDetails` as a whole and
|
|
80
|
+
doesn't merge with it.
|
|
81
|
+
|
|
82
|
+
Your own scripts can set `vendorDetails` too. A script with a `vendor` slug
|
|
83
|
+
and no `name` and `privacyPolicyUrl` from any source still loads with its
|
|
84
|
+
category, but the dialog has no switch for it. In development, c15t logs a
|
|
85
|
+
console warning that names the slug. Production builds skip the warning.
|
|
86
|
+
|
|
87
|
+
A self-hosted backend can declare vendors too. `/init` returns them and c15t
|
|
88
|
+
merges them with the vendors in code. When both declare the same `id`, the
|
|
89
|
+
code declaration wins.
|
|
90
|
+
|
|
91
|
+
## Gate scripts, requests and iframes by vendor
|
|
92
|
+
|
|
93
|
+
Put the vendor slug on each target:
|
|
94
|
+
|
|
95
|
+
| Target | Field |
|
|
96
|
+
| -------------------- | ----------------------------------------- |
|
|
97
|
+
| Script configuration | `vendor: 'x-pixel'` |
|
|
98
|
+
| Network blocker rule | `vendor: 'x-pixel'` |
|
|
99
|
+
| Iframe blocker | `data-vendor="x-pixel"` on the `<iframe>` |
|
|
100
|
+
|
|
101
|
+
An iframe with `data-vendor` and no `data-category` is gated on the vendor
|
|
102
|
+
alone. A script with `alwaysLoad` still loads when its vendor is off. Its
|
|
103
|
+
callbacks receive `info.vendor.granted`, so the SDK can stop itself. The
|
|
104
|
+
Google Consent Mode, RudderStack and Cloudflare Zaraz helpers do this for
|
|
105
|
+
you. While their vendor is off, they send every optional category as denied.
|
|
106
|
+
|
|
107
|
+
`ConsentGate` checks a category only. To render a component only while one
|
|
108
|
+
vendor is allowed, read `useVendorAllowed('youtube')` and render it when the
|
|
109
|
+
hook returns `true`. [Embeds](./embeds.md) covers the iframe
|
|
110
|
+
blocker's `data-vendor` attribute.
|
|
111
|
+
|
|
112
|
+
## What the preference dialog shows
|
|
113
|
+
|
|
114
|
+
`ConsentDialog` and `ConsentWidget` list each declared vendor under its
|
|
115
|
+
category, with its own switch.
|
|
116
|
+
|
|
117
|
+
The dialog lists only vendors that have a `name` and a `privacyPolicyUrl`.
|
|
118
|
+
A vendor's switch is disabled while its category is off. Save records the
|
|
119
|
+
vendors the visitor changed. Accept All and Reject All clear every vendor
|
|
120
|
+
denial, so each vendor follows its category again. The labels come from
|
|
121
|
+
`consentManagerDialog.vendors` in the translations: `title`,
|
|
122
|
+
`privacyPolicy`, `disabledByCategory` and `switchLabel`.
|
|
123
|
+
|
|
124
|
+
## Build your own vendor switch
|
|
125
|
+
|
|
126
|
+
`useVendorDraft()` from `c15t/react` reads and stages vendor switches on the
|
|
127
|
+
same draft the category switches use, so one save records both.
|
|
128
|
+
`useVendorAllowed(id)` returns whether a vendor may run now: it is declared,
|
|
129
|
+
its category is allowed and the visitor has not switched it off.
|
|
130
|
+
|
|
131
|
+
```tsx title="src/x-pixel-switch.tsx (partial)"
|
|
132
|
+
import { useVendorAllowed, useVendorDraft } from 'c15t/react';
|
|
133
|
+
|
|
134
|
+
const { vendors, setVendor, save } = useVendorDraft();
|
|
135
|
+
const xPixelAllowed = useVendorAllowed('x-pixel');
|
|
136
|
+
|
|
137
|
+
<input
|
|
138
|
+
type="checkbox"
|
|
139
|
+
checked={vendors['x-pixel'] ?? true}
|
|
140
|
+
onChange={(event) => setVendor('x-pixel', event.target.checked)}
|
|
141
|
+
/>
|
|
142
|
+
<button type="button" onClick={() => save()}>Save</button>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`save()` resolves `{ ok: false }` without recording anything when the policy
|
|
146
|
+
or the vendor list changed under the edit. Call `reset()` to start again.
|
|
147
|
+
`useDeclaredVendors()` returns the declared vendors, and `useVendorChoice()`
|
|
148
|
+
returns the recorded vendor decision, or `null` before the visitor made one.
|
|
149
|
+
|
|
150
|
+
A vendor reads as allowed only when it is declared, its category is allowed
|
|
151
|
+
and the visitor has not switched it off. An id that nothing declares, in
|
|
152
|
+
`vendors`, on a script or iframe, or from the backend, reads as not allowed.
|
|
153
|
+
A typo such as `x-pixle` or a vendor you forgot to declare never looks like
|
|
154
|
+
consent. In development, c15t logs a console warning that names the id.
|
|
155
|
+
|
|
156
|
+
## What c15t stores
|
|
157
|
+
|
|
158
|
+
c15t stores only the vendors a visitor switched off, and sends the full
|
|
159
|
+
vendor map to the backend with the consent record. Under an opt-out policy,
|
|
160
|
+
every vendor starts on. Turning a vendor off that was on reloads the page,
|
|
161
|
+
the same as withdrawing a category, so code the vendor already ran stops.
|
|
162
|
+
|
|
163
|
+
## What switching a vendor off does not do
|
|
164
|
+
|
|
165
|
+
* It does not delete cookies the vendor already set.
|
|
166
|
+
[Clear on revocation](./clear-on-revocation.md) does not run, because the
|
|
167
|
+
category stays allowed. Delete the vendor's cookies from the script's
|
|
168
|
+
`onConsentChange` when `info.vendor.granted` is `false`.
|
|
169
|
+
* It does not expire. The switch stays off until the visitor changes it or
|
|
170
|
+
uses Accept All or Reject All, even across a policy change.
|
|
171
|
+
* Adding a vendor does not ask returning visitors again. A new vendor starts
|
|
172
|
+
on inside an allowed category. Change the policy's `copyRevision` if a new
|
|
173
|
+
vendor should prompt again.
|
|
174
|
+
|
|
175
|
+
## Verify vendor consent
|
|
176
|
+
|
|
177
|
+
Test the production build in a private window with DevTools Network open and
|
|
178
|
+
filtered to `ads-twitter.com`:
|
|
179
|
+
|
|
180
|
+
1. Register `xPixel()`. Open Privacy settings. The marketing row lists X
|
|
181
|
+
Pixel with a switch.
|
|
182
|
+
2. Allow marketing and save. `uwt.js` loads.
|
|
183
|
+
3. Open Privacy settings, switch X Pixel off and save. c15t reloads the
|
|
184
|
+
page. After the reload there is no `uwt.js` request, and other marketing
|
|
185
|
+
scripts still load.
|
|
186
|
+
4. Reload again. The X Pixel switch is still off.
|
|
187
|
+
5. Turn marketing off. The X Pixel switch is disabled.
|
|
188
|
+
6. Open Privacy settings and click Accept All. `uwt.js` loads again.
|