@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
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Google Maps
|
|
3
|
-
description:
|
|
3
|
+
description: Gate a Google Maps iframe embed with c15t v3 so the map loads only
|
|
4
|
+
after the visitor allows its consent category, in Next.js, TanStack Start,
|
|
5
|
+
React, Nuxt, Vue, Astro, Svelte, SvelteKit, HTML or JavaScript.
|
|
6
|
+
icon: google-maps
|
|
4
7
|
group: integrations
|
|
5
8
|
---
|
|
6
9
|
|
|
@@ -11,7 +14,8 @@ application; this example uses functionality permission.
|
|
|
11
14
|
|
|
12
15
|
```ts title="src/embed-config.ts"
|
|
13
16
|
export const embedCategory = 'functionality' as const;
|
|
14
|
-
export const embedURL =
|
|
17
|
+
export const embedURL =
|
|
18
|
+
'https://www.google.com/maps/embed?pb=YOUR_EMBED_PARAMETERS';
|
|
15
19
|
export const embedTitle = 'Map showing our office location';
|
|
16
20
|
export const embedAspectRatio = '4 / 3';
|
|
17
21
|
```
|
|
@@ -22,7 +26,7 @@ address and a directions link outside the consent-gated embed.
|
|
|
22
26
|
## Add the embed to your framework
|
|
23
27
|
|
|
24
28
|
Create `src/embed-config.ts` using the configuration on this page, then select
|
|
25
|
-
your framework. Keep the existing [consent setup](https://c15t.com/docs/frameworks), its policy
|
|
29
|
+
your framework. Keep the existing [consent setup](https://v3.c15t.com/docs/frameworks), its policy
|
|
26
30
|
and preferences UI. These examples do not create a second consent provider.
|
|
27
31
|
|
|
28
32
|
**Next.js**
|
|
@@ -32,12 +36,12 @@ Render this component inside your existing consent boundary or provider.
|
|
|
32
36
|
```tsx title="src/consent-embed.tsx"
|
|
33
37
|
'use client';
|
|
34
38
|
|
|
35
|
-
import {
|
|
39
|
+
import { ConsentGate } from 'c15t/next';
|
|
36
40
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
|
|
37
41
|
|
|
38
42
|
export function ConsentEmbed() {
|
|
39
43
|
return (
|
|
40
|
-
<
|
|
44
|
+
<ConsentGate category={embedCategory}>
|
|
41
45
|
<iframe
|
|
42
46
|
src={embedURL}
|
|
43
47
|
title={embedTitle}
|
|
@@ -45,12 +49,12 @@ export function ConsentEmbed() {
|
|
|
45
49
|
allowFullScreen
|
|
46
50
|
style={{ width: '100%', aspectRatio: embedAspectRatio, minHeight: 200, border: 0 }}
|
|
47
51
|
/>
|
|
48
|
-
</
|
|
52
|
+
</ConsentGate>
|
|
49
53
|
);
|
|
50
54
|
}
|
|
51
55
|
```
|
|
52
56
|
|
|
53
|
-
`
|
|
57
|
+
`ConsentGate` keeps the iframe absent while permission is denied and removes it
|
|
54
58
|
on revocation. Keep your existing consent styles and preferences dialog.
|
|
55
59
|
|
|
56
60
|
**TanStack Start**
|
|
@@ -58,12 +62,12 @@ on revocation. Keep your existing consent styles and preferences dialog.
|
|
|
58
62
|
Render this component inside your existing consent boundary or provider.
|
|
59
63
|
|
|
60
64
|
```tsx title="src/consent-embed.tsx"
|
|
61
|
-
import {
|
|
65
|
+
import { ConsentGate } from 'c15t/tanstack-start';
|
|
62
66
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
|
|
63
67
|
|
|
64
68
|
export function ConsentEmbed() {
|
|
65
69
|
return (
|
|
66
|
-
<
|
|
70
|
+
<ConsentGate category={embedCategory}>
|
|
67
71
|
<iframe
|
|
68
72
|
src={embedURL}
|
|
69
73
|
title={embedTitle}
|
|
@@ -71,12 +75,12 @@ export function ConsentEmbed() {
|
|
|
71
75
|
allowFullScreen
|
|
72
76
|
style={{ width: '100%', aspectRatio: embedAspectRatio, minHeight: 200, border: 0 }}
|
|
73
77
|
/>
|
|
74
|
-
</
|
|
78
|
+
</ConsentGate>
|
|
75
79
|
);
|
|
76
80
|
}
|
|
77
81
|
```
|
|
78
82
|
|
|
79
|
-
`
|
|
83
|
+
`ConsentGate` keeps the iframe absent while permission is denied and removes it
|
|
80
84
|
on revocation. Keep your existing consent styles and preferences dialog.
|
|
81
85
|
|
|
82
86
|
**React**
|
|
@@ -84,12 +88,12 @@ on revocation. Keep your existing consent styles and preferences dialog.
|
|
|
84
88
|
Render this component inside your existing consent boundary or provider.
|
|
85
89
|
|
|
86
90
|
```tsx title="src/consent-embed.tsx"
|
|
87
|
-
import {
|
|
91
|
+
import { ConsentGate } from 'c15t/react';
|
|
88
92
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
|
|
89
93
|
|
|
90
94
|
export function ConsentEmbed() {
|
|
91
95
|
return (
|
|
92
|
-
<
|
|
96
|
+
<ConsentGate category={embedCategory}>
|
|
93
97
|
<iframe
|
|
94
98
|
src={embedURL}
|
|
95
99
|
title={embedTitle}
|
|
@@ -97,74 +101,75 @@ export function ConsentEmbed() {
|
|
|
97
101
|
allowFullScreen
|
|
98
102
|
style={{ width: '100%', aspectRatio: embedAspectRatio, minHeight: 200, border: 0 }}
|
|
99
103
|
/>
|
|
100
|
-
</
|
|
104
|
+
</ConsentGate>
|
|
101
105
|
);
|
|
102
106
|
}
|
|
103
107
|
```
|
|
104
108
|
|
|
105
|
-
`
|
|
109
|
+
`ConsentGate` keeps the iframe absent while permission is denied and removes it
|
|
106
110
|
on revocation. Keep your existing consent styles and preferences dialog.
|
|
107
111
|
|
|
108
112
|
**Nuxt**
|
|
109
113
|
|
|
110
|
-
|
|
114
|
+
The Nuxt module registers `ConsentGate` and `ConsentDialogLink`, so
|
|
115
|
+
this component imports only the embed configuration.
|
|
111
116
|
|
|
112
117
|
```vue title="app/components/ConsentEmbed.vue"
|
|
113
118
|
<script setup lang="ts">
|
|
114
119
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from '../../src/embed-config';
|
|
115
|
-
|
|
116
|
-
const snapshot = useConsentSnapshot();
|
|
117
|
-
const activeUI = useConsentActiveUI();
|
|
118
120
|
</script>
|
|
119
121
|
|
|
120
122
|
<template>
|
|
121
|
-
<
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
123
|
+
<ConsentGate :category="embedCategory">
|
|
124
|
+
<iframe
|
|
125
|
+
:src="embedURL"
|
|
126
|
+
:title="embedTitle"
|
|
127
|
+
loading="lazy"
|
|
128
|
+
allowfullscreen
|
|
129
|
+
:style="{ width: '100%', aspectRatio: embedAspectRatio, minHeight: '200px', border: 0 }"
|
|
130
|
+
/>
|
|
131
|
+
<template #placeholder>
|
|
132
|
+
<p>Allow {{ embedCategory }} to load this content.</p>
|
|
133
|
+
<ConsentDialogLink>Open privacy settings</ConsentDialogLink>
|
|
134
|
+
</template>
|
|
135
|
+
</ConsentGate>
|
|
132
136
|
</template>
|
|
133
137
|
```
|
|
134
138
|
|
|
135
|
-
|
|
136
|
-
|
|
139
|
+
`ConsentGate` keeps the iframe out of the server HTML and the DOM while
|
|
140
|
+
permission is denied, and removes it on revocation. See
|
|
141
|
+
[Nuxt scripts and embeds](https://v3.c15t.com/docs/frameworks/nuxt/scripts).
|
|
137
142
|
|
|
138
143
|
**Vue**
|
|
139
144
|
|
|
140
|
-
|
|
145
|
+
Render this component inside the app that installed the c15t Vue plugin.
|
|
141
146
|
|
|
142
147
|
```vue title="src/ConsentEmbed.vue"
|
|
143
148
|
<script setup lang="ts">
|
|
144
|
-
import {
|
|
149
|
+
import { ConsentDialogLink, ConsentGate } from 'c15t/vue/vue-plugin';
|
|
145
150
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
|
|
146
|
-
|
|
147
|
-
const snapshot = useConsentSnapshot();
|
|
148
|
-
const activeUI = useConsentActiveUI();
|
|
149
151
|
</script>
|
|
150
152
|
|
|
151
153
|
<template>
|
|
152
|
-
<
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
<ConsentGate :category="embedCategory">
|
|
155
|
+
<iframe
|
|
156
|
+
:src="embedURL"
|
|
157
|
+
:title="embedTitle"
|
|
158
|
+
loading="lazy"
|
|
159
|
+
allowfullscreen
|
|
160
|
+
:style="{ width: '100%', aspectRatio: embedAspectRatio, minHeight: '200px', border: 0 }"
|
|
161
|
+
/>
|
|
162
|
+
<template #placeholder>
|
|
163
|
+
<p>Allow {{ embedCategory }} to load this content.</p>
|
|
164
|
+
<ConsentDialogLink>Open privacy settings</ConsentDialogLink>
|
|
165
|
+
</template>
|
|
166
|
+
</ConsentGate>
|
|
163
167
|
</template>
|
|
164
168
|
```
|
|
165
169
|
|
|
166
|
-
|
|
167
|
-
|
|
170
|
+
`ConsentGate` keeps the iframe out of the DOM while permission is denied,
|
|
171
|
+
and removes it on revocation. See
|
|
172
|
+
[Vue scripts and embeds](https://v3.c15t.com/docs/frameworks/vue/scripts).
|
|
168
173
|
|
|
169
174
|
**Astro**
|
|
170
175
|
|
|
@@ -175,7 +180,7 @@ Add this component to pages using your consent-enabled base layout:
|
|
|
175
180
|
<c15t-consent-embed style="display: block"></c15t-consent-embed>
|
|
176
181
|
|
|
177
182
|
<script>
|
|
178
|
-
import { getConsentClient } from '
|
|
183
|
+
import { getConsentClient } from 'c15t/astro/client';
|
|
179
184
|
import { mountConsentEmbed } from '../consent-embed';
|
|
180
185
|
|
|
181
186
|
class ConsentEmbed extends HTMLElement {
|
|
@@ -217,16 +222,16 @@ runtime for this embed.
|
|
|
217
222
|
|
|
218
223
|
**Svelte**
|
|
219
224
|
|
|
220
|
-
Render this component inside the existing `
|
|
225
|
+
Render this component inside the existing `ConsentProvider`.
|
|
221
226
|
The provider from your quickstart supplies its consent state.
|
|
222
227
|
|
|
223
228
|
```svelte title="src/ConsentEmbed.svelte"
|
|
224
229
|
<script lang="ts">
|
|
225
|
-
import {
|
|
230
|
+
import { ConsentGate } from '@c15t/svelte';
|
|
226
231
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
|
|
227
232
|
</script>
|
|
228
233
|
|
|
229
|
-
<
|
|
234
|
+
<ConsentGate category={embedCategory}>
|
|
230
235
|
<iframe
|
|
231
236
|
src={embedURL}
|
|
232
237
|
title={embedTitle}
|
|
@@ -237,25 +242,25 @@ The provider from your quickstart supplies its consent state.
|
|
|
237
242
|
style:min-height="200px"
|
|
238
243
|
style:border="0"
|
|
239
244
|
></iframe>
|
|
240
|
-
</
|
|
245
|
+
</ConsentGate>
|
|
241
246
|
```
|
|
242
247
|
|
|
243
|
-
The Svelte `
|
|
248
|
+
The Svelte `ConsentGate` waits until the browser is mounted and the category is
|
|
244
249
|
allowed. Its default placeholder opens preferences. Revocation removes the
|
|
245
250
|
iframe.
|
|
246
251
|
|
|
247
252
|
**SvelteKit**
|
|
248
253
|
|
|
249
|
-
Render this component inside the existing `
|
|
250
|
-
Keep the SvelteKit root
|
|
254
|
+
Render this component inside the existing `ConsentRoot`.
|
|
255
|
+
Keep the SvelteKit root and its server-resolved state unchanged.
|
|
251
256
|
|
|
252
257
|
```svelte title="src/lib/ConsentEmbed.svelte"
|
|
253
258
|
<script lang="ts">
|
|
254
|
-
import {
|
|
259
|
+
import { ConsentGate } from '@c15t/svelte';
|
|
255
260
|
import { embedCategory, embedURL, embedTitle, embedAspectRatio } from '../embed-config';
|
|
256
261
|
</script>
|
|
257
262
|
|
|
258
|
-
<
|
|
263
|
+
<ConsentGate category={embedCategory}>
|
|
259
264
|
<iframe
|
|
260
265
|
src={embedURL}
|
|
261
266
|
title={embedTitle}
|
|
@@ -266,23 +271,44 @@ Keep the SvelteKit root provider and its server prefetch unchanged.
|
|
|
266
271
|
style:min-height="200px"
|
|
267
272
|
style:border="0"
|
|
268
273
|
></iframe>
|
|
269
|
-
</
|
|
274
|
+
</ConsentGate>
|
|
270
275
|
```
|
|
271
276
|
|
|
272
|
-
The Svelte `
|
|
277
|
+
The Svelte `ConsentGate` waits until the browser is mounted and the category is
|
|
273
278
|
allowed. Its default placeholder opens preferences. Revocation removes the
|
|
274
279
|
iframe.
|
|
275
280
|
|
|
281
|
+
**HTML**
|
|
282
|
+
|
|
283
|
+
The c15t script tag gates iframes that name a category. Put the embed's URL
|
|
284
|
+
in `data-src` instead of `src`, using the values from the configuration on
|
|
285
|
+
this page:
|
|
286
|
+
|
|
287
|
+
```html
|
|
288
|
+
<iframe
|
|
289
|
+
data-src="https://www.youtube-nocookie.com/embed/VIDEO_ID?playsinline=1"
|
|
290
|
+
data-category="measurement"
|
|
291
|
+
title="Product video"
|
|
292
|
+
loading="lazy"
|
|
293
|
+
allowfullscreen
|
|
294
|
+
></iframe>
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
c15t sets `src` once the category is allowed and removes it on revocation.
|
|
298
|
+
Without `src` the iframe loads nothing, so hide it with CSS and show a link
|
|
299
|
+
to `#c15t-preferences` in its place. See
|
|
300
|
+
[HTML embeds](https://v3.c15t.com/docs/frameworks/html/embeds).
|
|
301
|
+
|
|
276
302
|
**JavaScript**
|
|
277
303
|
|
|
278
|
-
Use the shared browser helper below with your existing
|
|
304
|
+
Use the shared browser helper below with your existing client. Put an
|
|
279
305
|
empty container where the embed should appear:
|
|
280
306
|
|
|
281
307
|
```html
|
|
282
308
|
<div id="consent-embed"></div>
|
|
283
309
|
```
|
|
284
310
|
|
|
285
|
-
In your browser entry point, after
|
|
311
|
+
In your browser entry point, after `init()`:
|
|
286
312
|
|
|
287
313
|
```ts
|
|
288
314
|
import { mountConsentEmbed } from './consent-embed';
|
|
@@ -290,13 +316,16 @@ import { mountConsentEmbed } from './consent-embed';
|
|
|
290
316
|
const container = document.querySelector<HTMLElement>('#consent-embed');
|
|
291
317
|
if (!container) throw new Error('Missing consent embed container');
|
|
292
318
|
|
|
293
|
-
const disposeEmbed = mountConsentEmbed(container, kernel,
|
|
319
|
+
const disposeEmbed = mountConsentEmbed(container, consent.kernel, () =>
|
|
320
|
+
consent.openDialog(),
|
|
321
|
+
);
|
|
294
322
|
```
|
|
295
323
|
|
|
296
|
-
`
|
|
297
|
-
|
|
298
|
-
`disposeEmbed()` when the page or component is
|
|
299
|
-
|
|
324
|
+
`consent` is the client from `init()` in your quickstart. With
|
|
325
|
+
`createConsentRuntime`, pass `runtime.kernel` and your own function that
|
|
326
|
+
opens preferences. Call `disposeEmbed()` when the page or component is
|
|
327
|
+
destroyed. Iframe markup with `data-src` and `data-category` also works
|
|
328
|
+
without the helper, because both setups gate iframes by default.
|
|
300
329
|
|
|
301
330
|
## Browser helper for Astro and JavaScript
|
|
302
331
|
|
|
@@ -305,51 +334,56 @@ when permission allows it, keeps an existing player mounted across unrelated
|
|
|
305
334
|
snapshot updates, and removes it on revocation.
|
|
306
335
|
|
|
307
336
|
```ts title="src/consent-embed.ts"
|
|
308
|
-
import {
|
|
337
|
+
import {
|
|
338
|
+
embedCategory,
|
|
339
|
+
embedURL,
|
|
340
|
+
embedTitle,
|
|
341
|
+
embedAspectRatio,
|
|
342
|
+
} from './embed-config';
|
|
309
343
|
|
|
310
344
|
type EmbedKernel = {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
345
|
+
getSnapshot: () => {
|
|
346
|
+
effectivePermissions: Record<typeof embedCategory, boolean>;
|
|
347
|
+
};
|
|
348
|
+
subscribe: (listener: () => void) => () => void;
|
|
315
349
|
};
|
|
316
350
|
|
|
317
351
|
export function mountConsentEmbed(
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
352
|
+
container: HTMLElement,
|
|
353
|
+
kernel: EmbedKernel,
|
|
354
|
+
openPreferences: () => void
|
|
321
355
|
) {
|
|
322
|
-
|
|
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
|
-
|
|
356
|
+
const render = () => {
|
|
357
|
+
if (kernel.getSnapshot().effectivePermissions[embedCategory]) {
|
|
358
|
+
if (container.querySelector('iframe')) return;
|
|
359
|
+
const frame = document.createElement('iframe');
|
|
360
|
+
frame.src = embedURL;
|
|
361
|
+
frame.title = embedTitle;
|
|
362
|
+
frame.loading = 'lazy';
|
|
363
|
+
frame.allowFullscreen = true;
|
|
364
|
+
Object.assign(frame.style, {
|
|
365
|
+
width: '100%',
|
|
366
|
+
aspectRatio: embedAspectRatio,
|
|
367
|
+
minHeight: '200px',
|
|
368
|
+
border: '0',
|
|
369
|
+
});
|
|
370
|
+
container.replaceChildren(frame);
|
|
371
|
+
} else {
|
|
372
|
+
if (container.querySelector('button')) return;
|
|
373
|
+
const button = document.createElement('button');
|
|
374
|
+
button.type = 'button';
|
|
375
|
+
button.textContent = 'Open privacy settings to view this content';
|
|
376
|
+
button.onclick = openPreferences;
|
|
377
|
+
container.replaceChildren(button);
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
render();
|
|
382
|
+
const unsubscribe = kernel.subscribe(render);
|
|
383
|
+
return () => {
|
|
384
|
+
unsubscribe();
|
|
385
|
+
container.replaceChildren();
|
|
386
|
+
};
|
|
353
387
|
}
|
|
354
388
|
```
|
|
355
389
|
|