@c15t/react 2.2.1 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +88 -141
- package/README.md +2 -2
- package/dist/aggregate-components.js +2 -0
- package/dist/chunk-warming.js +1 -0
- package/dist/component-hooks/use-headless-consent-ui.js +2 -0
- package/dist/component-hooks/use-headless-iab-consent-ui.js +2 -0
- package/dist/component-hooks/use-manager.js +2 -0
- package/dist/component-hooks/use-panel-trigger.js +2 -0
- package/dist/component-hooks/use-translations.js +2 -0
- package/dist/components/consent-preferences-link/consent-preferences-link.js +2 -1
- package/dist/components/consent-preferences-link/index.js +1 -0
- package/dist/components/frame/atoms.js +1 -1
- package/dist/components/frame/frame.js +2 -1
- package/dist/components/frame/index.js +2 -1
- package/dist/components/iab-panel/atoms/card.js +2 -0
- package/dist/components/iab-panel/atoms/content.js +2 -0
- package/dist/components/iab-panel/atoms/footer.js +2 -0
- package/dist/components/iab-panel/atoms/header.js +2 -0
- package/dist/components/iab-panel/atoms/overlay.js +2 -0
- package/dist/components/iab-panel/atoms/purpose-item.js +2 -0
- package/dist/components/iab-panel/atoms/root.js +2 -0
- package/dist/components/iab-panel/atoms/stack-item.js +2 -0
- package/dist/components/iab-panel/atoms/tabs.js +2 -0
- package/dist/components/iab-panel/atoms/vendor-list.js +2 -0
- package/dist/components/iab-panel/hooks/use-display-model.js +2 -0
- package/dist/components/iab-panel/hooks/use-gvl-data.js +2 -0
- package/dist/components/iab-panel/iab-panel.js +2 -0
- package/dist/components/iab-panel/index.js +2 -0
- package/dist/components/iab-panel/use-iab-translations.js +1 -0
- package/dist/components/iab-prompt/atoms/button-group.js +2 -0
- package/dist/components/iab-prompt/atoms/card.js +2 -0
- package/dist/components/iab-prompt/atoms/description.js +2 -0
- package/dist/components/iab-prompt/atoms/footer.js +2 -0
- package/dist/components/iab-prompt/atoms/header.js +2 -0
- package/dist/components/iab-prompt/atoms/overlay.js +2 -0
- package/dist/components/iab-prompt/atoms/root.js +2 -0
- package/dist/components/iab-prompt/atoms/title.js +2 -0
- package/dist/components/iab-prompt/iab-prompt.js +2 -0
- package/dist/components/iab-prompt/index.js +2 -0
- package/dist/components/panel/atoms/card.js +2 -0
- package/dist/components/panel/atoms/overlay.js +1 -0
- package/dist/components/panel/atoms/root.js +2 -0
- package/dist/components/panel/index.js +2 -0
- package/dist/components/panel/panel.js +2 -0
- package/dist/components/{consent-dialog-link → panel-link}/index.js +1 -0
- package/dist/components/panel-trigger/atoms/button.js +2 -0
- package/dist/components/panel-trigger/atoms/icon.js +2 -0
- package/dist/components/panel-trigger/atoms/root.js +2 -0
- package/dist/components/panel-trigger/atoms/text.js +2 -0
- package/dist/components/panel-trigger/atoms/toolbar.js +2 -0
- package/dist/components/panel-trigger/index.js +2 -0
- package/dist/components/panel-trigger/panel-trigger-toolbar.js +2 -0
- package/dist/components/panel-trigger/panel-trigger.js +2 -0
- package/dist/components/panel-trigger/use-draggable.js +2 -0
- package/dist/components/preferences/atoms/accordion.js +1 -0
- package/dist/components/preferences/atoms/button.js +1 -0
- package/dist/components/preferences/atoms/footer.js +1 -0
- package/dist/components/preferences/atoms/root.js +2 -0
- package/dist/components/preferences/index.js +2 -0
- package/dist/components/preferences/policy-actions.js +2 -0
- package/dist/components/preferences/preferences.js +2 -0
- package/dist/components/prompt/atoms/overlay.js +1 -0
- package/dist/components/prompt/atoms/root.js +2 -0
- package/dist/components/prompt/components.js +1 -0
- package/dist/components/prompt/error-boundary.js +2 -0
- package/dist/components/prompt/index.js +2 -0
- package/dist/components/prompt/policy-actions.js +2 -0
- package/dist/components/prompt/prompt.js +2 -0
- package/dist/components/prompt/resolve-banner-primary-actions.js +1 -0
- package/dist/components/prompt/surface-context.js +2 -0
- package/dist/components/prompt/use-banner-copy.js +2 -0
- package/dist/components/shared/libs/recursive-clone-children.js +1 -1
- package/dist/components/shared/libs/slot.js +1 -1
- package/dist/components/shared/libs/use-controllable-state.js +1 -1
- package/dist/components/shared/policy-actions.js +2 -1
- package/dist/components/shared/primitives/box.js +2 -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/ui/accordion/accordion.js +2 -1
- package/dist/components/shared/ui/animated-collapse/animated-collapse.js +2 -1
- package/dist/components/shared/ui/branding.js +1 -1
- package/dist/components/shared/ui/button/button.js +1 -1
- package/dist/components/shared/ui/collapsible/collapsible.js +2 -1
- package/dist/components/shared/ui/dialog/dialog.js +2 -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 +2 -1
- package/dist/components/shared/ui/switch/switch.js +1 -1
- package/dist/components/shared/ui/tabs/tabs.js +2 -1
- package/dist/context/consent-tracking-context.js +1 -0
- package/dist/context/iab-context-value.js +1 -0
- package/dist/context/index.js +1 -0
- package/dist/context/theme-context.js +2 -1
- package/dist/context.js +1 -0
- package/dist/devtools.js +2 -0
- package/dist/draft.js +2 -0
- package/dist/external-iab-context.js +2 -0
- package/dist/frame.js +2 -0
- package/dist/headless.js +1 -1
- package/dist/hooks/use-color-scheme.js +2 -1
- package/dist/hooks/use-component-config.js +2 -1
- package/dist/hooks/use-focus-trap.js +2 -1
- package/dist/hooks/use-headless-iab-consent-ui.js +2 -1
- package/dist/hooks/use-iab-manager.js +2 -0
- package/dist/hooks/use-is-hydrated.js +2 -0
- package/dist/hooks/use-reduced-motion.js +2 -1
- package/dist/hooks/use-scroll-lock.js +2 -1
- package/dist/hooks/use-text-direction.js +2 -1
- package/dist/hooks/use-theme.js +2 -1
- package/dist/hooks.js +1 -0
- package/dist/iab/styles.css +1 -1
- package/dist/iab/styles.tw3.css +133 -19
- package/dist/iab-context.js +2 -0
- package/dist/iab.js +1 -1
- package/dist/index.js +1 -1
- package/dist/module-hooks/iframe-blocker.js +2 -0
- package/dist/module-hooks/network-blocker.js +2 -0
- package/dist/module-hooks/persistence.js +2 -0
- package/dist/module-hooks/script-loader.js +2 -0
- package/dist/module-hooks/shared.js +2 -0
- package/dist/module-hooks.js +2 -0
- package/dist/panel-link.js +2 -0
- package/dist/panel-trigger.js +2 -0
- package/dist/panel.js +2 -0
- package/dist/preferences.js +2 -0
- package/dist/primitives.js +1 -1
- package/dist/prompt.js +2 -0
- package/dist/provider.js +2 -0
- package/dist/server/fetch-ssr-data.js +1 -1
- package/dist/server/headers.js +1 -1
- package/dist/server/init-cache-key.js +1 -1
- package/dist/server/normalize-url.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/styles.tw3.css +173 -29
- package/dist/theme-provider.js +2 -0
- package/dist/transports/offline.js +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/theme/index.js +1 -1
- package/dist/types/theme/style-types.js +1 -1
- package/dist/ui-config-context.js +2 -0
- package/dist/ui-save.js +1 -0
- package/dist/utils/cn.js +1 -1
- package/dist/utils/default-translation-config.js +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/merge-slot-props.js +1 -0
- package/dist/utils/merge-styles.js +1 -1
- package/dist/utils/theme-utils.js +1 -1
- package/dist/version.js +1 -1
- package/dist-types/aggregate-components.d.ts +4 -0
- package/dist-types/chunk-warming.d.ts +19 -0
- package/dist-types/component-hooks/use-headless-consent-ui.d.ts +68 -0
- package/dist-types/component-hooks/use-headless-iab-consent-ui.d.ts +22 -0
- package/dist-types/component-hooks/use-manager.d.ts +40 -0
- package/dist-types/component-hooks/use-panel-trigger.d.ts +20 -0
- package/dist-types/component-hooks/use-translations.d.ts +2 -0
- package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
- package/dist-types/components/frame/atoms.d.ts +5 -5
- package/dist-types/components/frame/types.d.ts +3 -2
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/card.d.ts +2 -1
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/content.d.ts +1 -1
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/footer.d.ts +1 -1
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/header.d.ts +1 -1
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/overlay.d.ts +1 -1
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/purpose-item.d.ts +7 -1
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/root.d.ts +3 -2
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/stack-item.d.ts +1 -1
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/tabs.d.ts +1 -1
- package/dist-types/components/{iab-consent-dialog → iab-panel}/atoms/vendor-list.d.ts +2 -3
- package/dist-types/components/iab-panel/hooks/use-display-model.d.ts +18 -0
- package/dist-types/components/iab-panel/hooks/use-gvl-data.d.ts +17 -0
- package/dist-types/components/{iab-consent-dialog/iab-consent-dialog.d.ts → iab-panel/iab-panel.d.ts} +10 -3
- package/dist-types/components/{iab-consent-dialog → iab-panel}/index.d.ts +3 -2
- package/dist-types/components/iab-panel/types.d.ts +1 -0
- package/dist-types/components/{iab-consent-dialog → iab-panel}/use-iab-translations.d.ts +3 -1
- package/dist-types/components/{iab-consent-banner → iab-prompt}/atoms/button-group.d.ts +1 -1
- package/dist-types/components/{iab-consent-banner → iab-prompt}/atoms/card.d.ts +2 -1
- package/dist-types/components/{iab-consent-banner → iab-prompt}/atoms/description.d.ts +1 -1
- package/dist-types/components/{iab-consent-banner → iab-prompt}/atoms/footer.d.ts +2 -1
- package/dist-types/components/{iab-consent-banner → iab-prompt}/atoms/header.d.ts +2 -1
- package/dist-types/components/{iab-consent-banner → iab-prompt}/atoms/overlay.d.ts +1 -1
- package/dist-types/components/{iab-consent-banner → iab-prompt}/atoms/root.d.ts +3 -2
- package/dist-types/components/{iab-consent-banner → iab-prompt}/atoms/title.d.ts +1 -1
- package/dist-types/components/{iab-consent-banner/iab-consent-banner.d.ts → iab-prompt/iab-prompt.d.ts} +10 -4
- package/dist-types/components/{iab-consent-banner → iab-prompt}/index.d.ts +1 -1
- package/dist-types/components/{consent-dialog → panel}/atoms/card.d.ts +15 -15
- package/dist-types/components/{consent-dialog → panel}/atoms/overlay.d.ts +24 -8
- package/dist-types/components/{consent-dialog → panel}/atoms/root.d.ts +4 -3
- package/dist-types/components/{consent-dialog → panel}/index.d.ts +13 -8
- package/dist-types/components/{consent-dialog/consent-dialog.d.ts → panel/panel.d.ts} +6 -5
- package/dist-types/components/{consent-dialog-trigger → panel-trigger}/atoms/button.d.ts +2 -1
- package/dist-types/components/{consent-dialog-trigger → panel-trigger}/atoms/icon.d.ts +1 -16
- package/dist-types/components/{consent-dialog-trigger → panel-trigger}/atoms/root.d.ts +11 -23
- package/dist-types/components/{consent-dialog-trigger → panel-trigger}/atoms/text.d.ts +0 -11
- package/dist-types/components/{consent-dialog-trigger → panel-trigger}/atoms/toolbar.d.ts +15 -4
- package/dist-types/components/{consent-dialog-trigger → panel-trigger}/index.d.ts +2 -2
- package/dist-types/components/{consent-dialog-trigger/consent-dialog-trigger-toolbar.d.ts → panel-trigger/panel-trigger-toolbar.d.ts} +0 -23
- package/dist-types/components/{consent-dialog-trigger/consent-dialog-trigger.d.ts → panel-trigger/panel-trigger.d.ts} +8 -4
- package/dist-types/components/{consent-dialog-trigger → panel-trigger}/types.d.ts +16 -7
- package/dist-types/components/{consent-dialog-trigger → panel-trigger}/use-draggable.d.ts +2 -9
- package/dist-types/components/{consent-widget → preferences}/atoms/accordion.d.ts +5 -5
- package/dist-types/components/{consent-widget → preferences}/atoms/footer.d.ts +3 -3
- package/dist-types/components/{consent-widget → preferences}/atoms/root.d.ts +1 -1
- package/dist-types/components/{consent-widget → preferences}/index.d.ts +11 -9
- package/dist-types/components/preferences/policy-actions.d.ts +10 -0
- package/dist-types/components/{consent-banner → prompt}/atoms/overlay.d.ts +1 -1
- package/dist-types/components/prompt/atoms/root.d.ts +78 -0
- package/dist-types/components/{consent-banner → prompt}/components.d.ts +99 -14
- package/dist-types/components/{consent-banner → prompt}/error-boundary.d.ts +3 -1
- package/dist-types/components/{consent-banner → prompt}/index.d.ts +18 -10
- package/dist-types/components/prompt/policy-actions.d.ts +12 -0
- package/dist-types/components/{consent-banner/consent-banner.d.ts → prompt/prompt.d.ts} +36 -10
- package/dist-types/components/prompt/resolve-banner-primary-actions.d.ts +14 -0
- package/dist-types/components/prompt/surface-context.d.ts +45 -0
- package/dist-types/components/prompt/use-banner-copy.d.ts +16 -0
- package/dist-types/components/shared/libs/polymorphic.d.ts +2 -2
- package/dist-types/components/shared/libs/recursive-clone-children.d.ts +2 -2
- package/dist-types/components/shared/libs/slot.d.ts +1 -1
- package/dist-types/components/shared/libs/use-controllable-state.d.ts +1 -1
- package/dist-types/components/shared/policy-actions.d.ts +8 -3
- package/dist-types/components/shared/primitives/box.d.ts +3 -1
- package/dist-types/components/shared/primitives/button.d.ts +4 -37
- package/dist-types/components/shared/primitives/button.types.d.ts +3 -1
- package/dist-types/components/shared/primitives/legal-links/index.d.ts +7 -11
- package/dist-types/components/shared/ui/accordion/accordion.d.ts +45 -12
- package/dist-types/components/shared/ui/accordion/accordion.types.d.ts +1 -1
- package/dist-types/components/shared/ui/animated-collapse/animated-collapse.d.ts +1 -1
- package/dist-types/components/shared/ui/branding.d.ts +12 -12
- package/dist-types/components/shared/ui/button/button.d.ts +19 -25
- package/dist-types/components/shared/ui/button/button.types.d.ts +2 -2
- package/dist-types/components/shared/ui/collapsible/collapsible.d.ts +18 -1
- package/dist-types/components/shared/ui/dialog/dialog.d.ts +6 -6
- package/dist-types/components/shared/ui/icon.d.ts +1 -1
- package/dist-types/components/shared/ui/logo.d.ts +0 -21
- package/dist-types/components/shared/ui/preference-item/preference-item.d.ts +46 -2
- package/dist-types/components/shared/ui/switch/switch.d.ts +19 -8
- package/dist-types/components/shared/ui/tabs/tabs.d.ts +19 -2
- package/dist-types/context/iab-context-value.d.ts +37 -0
- package/dist-types/context/index.d.ts +3 -0
- package/dist-types/context/theme-context.d.ts +2 -2
- package/dist-types/context.d.ts +17 -0
- package/dist-types/devtools.d.ts +54 -0
- package/dist-types/draft.d.ts +31 -0
- package/dist-types/external-iab-context.d.ts +29 -0
- package/dist-types/frame.d.ts +1 -0
- package/dist-types/headless.d.ts +12 -8
- package/dist-types/hooks/use-color-scheme.d.ts +1 -1
- package/dist-types/hooks/use-component-config.d.ts +2 -2
- package/dist-types/hooks/use-focus-trap.d.ts +2 -2
- package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +7 -8
- package/dist-types/hooks/use-iab-manager.d.ts +52 -0
- package/dist-types/hooks/use-is-hydrated.d.ts +8 -0
- package/dist-types/hooks/use-reduced-motion.d.ts +1 -1
- package/dist-types/hooks/use-scroll-lock.d.ts +1 -1
- package/dist-types/hooks/use-text-direction.d.ts +1 -1
- package/dist-types/hooks/use-theme.d.ts +2 -1
- package/dist-types/hooks.d.ts +148 -0
- package/dist-types/iab-context.d.ts +28 -0
- package/dist-types/iab.d.ts +14 -8
- package/dist-types/index.d.ts +61 -22
- package/dist-types/module-hooks/iframe-blocker.d.ts +6 -0
- package/dist-types/module-hooks/network-blocker.d.ts +9 -0
- package/dist-types/module-hooks/persistence.d.ts +4 -0
- package/dist-types/module-hooks/script-loader.d.ts +6 -0
- package/dist-types/module-hooks/shared.d.ts +2 -0
- package/dist-types/module-hooks.d.ts +4 -0
- package/dist-types/panel-link.d.ts +1 -0
- package/dist-types/panel-trigger.d.ts +1 -0
- package/dist-types/panel.d.ts +1 -0
- package/dist-types/preferences.d.ts +1 -0
- package/dist-types/prompt.d.ts +1 -0
- package/dist-types/provider.d.ts +144 -0
- package/dist-types/server/fetch-ssr-data.d.ts +2 -2
- package/dist-types/server/headers.d.ts +3 -3
- package/dist-types/server/init-cache-key.d.ts +3 -3
- package/dist-types/server/normalize-url.d.ts +2 -2
- package/dist-types/server/types.d.ts +1 -1
- package/dist-types/theme-provider.d.ts +10 -0
- package/dist-types/transports/offline.d.ts +18 -0
- package/dist-types/types/index.d.ts +3 -0
- package/dist-types/types/manager.d.ts +15 -0
- package/dist-types/types/slots.d.ts +5 -0
- package/dist-types/types/theme/index.d.ts +0 -1
- package/dist-types/types/theme/style-types.d.ts +3 -9
- package/dist-types/ui-config-context.d.ts +9 -0
- package/dist-types/ui-save.d.ts +5 -0
- package/dist-types/utils/cn.d.ts +1 -1
- package/dist-types/utils/default-translation-config.d.ts +6 -0
- package/dist-types/utils/index.d.ts +4 -0
- package/dist-types/utils/merge-slot-props.d.ts +14 -0
- package/dist-types/utils/merge-styles.d.ts +1 -1
- package/dist-types/utils/theme-utils.d.ts +2 -2
- package/dist-types/version.d.ts +1 -1
- package/docs/README.md +88 -141
- package/docs/assets/v3/brand-bar.png +0 -0
- package/docs/assets/v3/brand-card.png +0 -0
- package/docs/assets/v3/choice-wall.png +0 -0
- package/docs/assets/v3/mobile-card.png +0 -0
- package/docs/assets/v3/preferences.png +0 -0
- package/docs/customization/overview.md +45 -0
- package/docs/customization/recipes.md +79 -0
- package/docs/customization/slots.md +55 -0
- package/docs/customization/tokens.md +76 -0
- package/docs/customization/translations.md +49 -0
- package/docs/frameworks/react/components/consent-banner.md +219 -202
- package/docs/frameworks/react/components/consent-dialog-link.md +88 -35
- package/docs/frameworks/react/components/consent-dialog-trigger.md +74 -134
- package/docs/frameworks/react/components/consent-dialog.md +170 -135
- package/docs/frameworks/react/components/consent-manager-provider.md +41 -249
- package/docs/frameworks/react/components/consent-widget.md +154 -118
- package/docs/frameworks/react/components/dev-tools.md +198 -33
- package/docs/frameworks/react/components/frame.md +120 -42
- package/docs/frameworks/react/concepts/consent-categories.md +24 -89
- package/docs/frameworks/react/concepts/policy-presets.md +123 -0
- package/docs/frameworks/react/headless.md +91 -185
- package/docs/frameworks/react/hooks/use-consent-manager/overview.md +39 -153
- package/docs/frameworks/react/iab/overview.md +33 -108
- package/docs/frameworks/react/quickstart.md +116 -112
- package/docs/frameworks/react/script-loader.md +35 -535
- package/docs/frameworks/react/styling/overview.md +160 -255
- package/docs/frameworks/react/troubleshooting.md +47 -119
- package/docs/guides/consent-state.md +60 -0
- package/docs/guides/data-fetching.md +163 -0
- package/docs/guides/deployment-modes.md +63 -0
- package/docs/guides/troubleshooting.md +68 -0
- package/docs/guides/verify-consent.md +62 -0
- package/docs/integrations/adobe-analytics.md +239 -105
- package/docs/integrations/ahrefs-analytics.md +238 -104
- package/docs/integrations/amplitude.md +219 -157
- package/docs/integrations/building-integrations.md +32 -224
- package/docs/integrations/clearbit.md +247 -86
- package/docs/integrations/cloudflare-web-analytics.md +250 -84
- package/docs/integrations/crisp.md +251 -97
- package/docs/integrations/databuddy.md +259 -153
- package/docs/integrations/fathom-analytics.md +239 -96
- package/docs/integrations/google-maps.md +328 -207
- package/docs/integrations/google-tag-manager.md +248 -96
- package/docs/integrations/google-tag.md +261 -90
- package/docs/integrations/heap.md +222 -149
- package/docs/integrations/hightouch.md +225 -131
- package/docs/integrations/hotjar.md +239 -90
- package/docs/integrations/intercom.md +239 -98
- package/docs/integrations/linkedin-insights.md +243 -113
- package/docs/integrations/logrocket.md +241 -123
- package/docs/integrations/matomo-analytics.md +256 -111
- package/docs/integrations/meta-pixel.md +197 -324
- package/docs/integrations/microsoft-clarity.md +233 -114
- package/docs/integrations/microsoft-uet.md +245 -110
- package/docs/integrations/mixpanel-analytics.md +252 -87
- package/docs/integrations/openai-pixel.md +441 -0
- package/docs/integrations/overview.md +95 -133
- package/docs/integrations/pirsch.md +249 -96
- package/docs/integrations/plausible-analytics.md +241 -100
- package/docs/integrations/posthog.md +353 -214
- package/docs/integrations/promptwatch.md +251 -81
- package/docs/integrations/reddit-pixel.md +226 -173
- package/docs/integrations/rudderstack.md +244 -187
- package/docs/integrations/rybbit-analytics.md +244 -91
- package/docs/integrations/segment.md +238 -92
- package/docs/integrations/snapchat-pixel.md +240 -110
- package/docs/integrations/tiktok-pixel.md +249 -81
- package/docs/integrations/umami-analytics.md +242 -95
- package/docs/integrations/vercel-analytics.md +242 -90
- package/docs/integrations/x-pixel.md +238 -104
- package/docs/integrations/youtube.md +354 -142
- package/docs/upgrade-v3.md +334 -0
- package/iab/styles.css +1 -1
- package/iab/styles.tw3.css +1 -1
- package/package.json +187 -102
- package/readme.json +1 -1
- package/src/iab/styles.css +1 -1
- package/src/iab/styles.tw3.css +1 -1
- package/src/styles.css +1 -1
- package/src/styles.tw3.css +1 -1
- package/styles.css +1 -1
- package/styles.tw3.css +1 -1
- package/client/components/consent-banner.js +0 -4
- package/client/components/consent-dialog-link.js +0 -3
- package/client/components/consent-dialog-trigger.js +0 -3
- package/client/components/consent-dialog.js +0 -4
- package/client/components/consent-widget.js +0 -4
- package/client/components/frame.js +0 -3
- package/client/components/integrations.js +0 -3
- package/dist/components/consent-banner/atoms/overlay.cjs +0 -1
- package/dist/components/consent-banner/atoms/overlay.js +0 -1
- package/dist/components/consent-banner/atoms/root.cjs +0 -1
- package/dist/components/consent-banner/atoms/root.js +0 -1
- package/dist/components/consent-banner/components.cjs +0 -1
- package/dist/components/consent-banner/components.js +0 -1
- package/dist/components/consent-banner/consent-banner.cjs +0 -1
- package/dist/components/consent-banner/consent-banner.js +0 -1
- package/dist/components/consent-banner/error-boundary.cjs +0 -1
- package/dist/components/consent-banner/error-boundary.js +0 -1
- package/dist/components/consent-banner/index.cjs +0 -1
- package/dist/components/consent-banner/index.js +0 -1
- package/dist/components/consent-banner/policy-actions.cjs +0 -1
- package/dist/components/consent-banner/policy-actions.js +0 -1
- package/dist/components/consent-dialog/atoms/card.cjs +0 -1
- package/dist/components/consent-dialog/atoms/card.js +0 -1
- package/dist/components/consent-dialog/atoms/overlay.cjs +0 -1
- package/dist/components/consent-dialog/atoms/overlay.js +0 -1
- package/dist/components/consent-dialog/atoms/root.cjs +0 -1
- package/dist/components/consent-dialog/atoms/root.js +0 -1
- package/dist/components/consent-dialog/consent-dialog.cjs +0 -1
- package/dist/components/consent-dialog/consent-dialog.js +0 -1
- package/dist/components/consent-dialog/index.cjs +0 -1
- package/dist/components/consent-dialog/index.js +0 -1
- package/dist/components/consent-dialog-link/index.cjs +0 -1
- package/dist/components/consent-dialog-trigger/atoms/button.cjs +0 -1
- package/dist/components/consent-dialog-trigger/atoms/button.js +0 -1
- package/dist/components/consent-dialog-trigger/atoms/icon.cjs +0 -1
- package/dist/components/consent-dialog-trigger/atoms/icon.js +0 -1
- package/dist/components/consent-dialog-trigger/atoms/root.cjs +0 -1
- package/dist/components/consent-dialog-trigger/atoms/root.js +0 -1
- package/dist/components/consent-dialog-trigger/atoms/text.cjs +0 -1
- package/dist/components/consent-dialog-trigger/atoms/text.js +0 -1
- package/dist/components/consent-dialog-trigger/atoms/toolbar.cjs +0 -1
- package/dist/components/consent-dialog-trigger/atoms/toolbar.js +0 -1
- package/dist/components/consent-dialog-trigger/consent-dialog-trigger-toolbar.cjs +0 -1
- package/dist/components/consent-dialog-trigger/consent-dialog-trigger-toolbar.js +0 -1
- package/dist/components/consent-dialog-trigger/consent-dialog-trigger.cjs +0 -1
- package/dist/components/consent-dialog-trigger/consent-dialog-trigger.js +0 -1
- package/dist/components/consent-dialog-trigger/index.cjs +0 -1
- package/dist/components/consent-dialog-trigger/index.js +0 -1
- package/dist/components/consent-dialog-trigger/types.cjs +0 -1
- package/dist/components/consent-dialog-trigger/use-draggable.cjs +0 -1
- package/dist/components/consent-dialog-trigger/use-draggable.js +0 -1
- package/dist/components/consent-preferences-link/consent-preferences-link.cjs +0 -1
- package/dist/components/consent-preferences-link/index.cjs +0 -1
- package/dist/components/consent-widget/atoms/accordion.cjs +0 -1
- package/dist/components/consent-widget/atoms/accordion.js +0 -1
- package/dist/components/consent-widget/atoms/button.cjs +0 -1
- package/dist/components/consent-widget/atoms/button.js +0 -1
- package/dist/components/consent-widget/atoms/footer.cjs +0 -1
- package/dist/components/consent-widget/atoms/footer.js +0 -1
- package/dist/components/consent-widget/atoms/root.cjs +0 -1
- package/dist/components/consent-widget/atoms/root.js +0 -1
- package/dist/components/consent-widget/consent-widget.cjs +0 -1
- package/dist/components/consent-widget/consent-widget.js +0 -1
- package/dist/components/consent-widget/index.cjs +0 -1
- package/dist/components/consent-widget/index.js +0 -1
- package/dist/components/consent-widget/policy-actions.cjs +0 -1
- package/dist/components/consent-widget/policy-actions.js +0 -1
- package/dist/components/consent-widget/types.cjs +0 -1
- package/dist/components/frame/atoms.cjs +0 -1
- package/dist/components/frame/frame.cjs +0 -1
- package/dist/components/frame/index.cjs +0 -1
- package/dist/components/frame/types.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/button-group.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/button-group.js +0 -1
- package/dist/components/iab-consent-banner/atoms/card.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/card.js +0 -1
- package/dist/components/iab-consent-banner/atoms/description.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/description.js +0 -1
- package/dist/components/iab-consent-banner/atoms/footer.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/footer.js +0 -1
- package/dist/components/iab-consent-banner/atoms/header.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/header.js +0 -1
- package/dist/components/iab-consent-banner/atoms/overlay.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/overlay.js +0 -1
- package/dist/components/iab-consent-banner/atoms/root.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/root.js +0 -1
- package/dist/components/iab-consent-banner/atoms/title.cjs +0 -1
- package/dist/components/iab-consent-banner/atoms/title.js +0 -1
- package/dist/components/iab-consent-banner/iab-consent-banner.cjs +0 -1
- package/dist/components/iab-consent-banner/iab-consent-banner.js +0 -1
- package/dist/components/iab-consent-banner/index.cjs +0 -1
- package/dist/components/iab-consent-banner/index.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/card.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/card.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/content.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/content.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/footer.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/footer.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/header.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/header.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/overlay.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/overlay.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/purpose-item.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/purpose-item.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/root.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/root.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/stack-item.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/stack-item.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/tabs.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/tabs.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/vendor-list.cjs +0 -1
- package/dist/components/iab-consent-dialog/atoms/vendor-list.js +0 -1
- package/dist/components/iab-consent-dialog/hooks/use-gvl-data.cjs +0 -1
- package/dist/components/iab-consent-dialog/hooks/use-gvl-data.js +0 -1
- package/dist/components/iab-consent-dialog/iab-consent-dialog.cjs +0 -1
- package/dist/components/iab-consent-dialog/iab-consent-dialog.js +0 -1
- package/dist/components/iab-consent-dialog/index.cjs +0 -1
- package/dist/components/iab-consent-dialog/index.js +0 -1
- package/dist/components/iab-consent-dialog/types.cjs +0 -1
- package/dist/components/iab-consent-dialog/use-iab-translations.cjs +0 -1
- package/dist/components/iab-consent-dialog/use-iab-translations.js +0 -1
- package/dist/components/integrations/google-map.cjs +0 -1
- package/dist/components/integrations/google-map.js +0 -1
- package/dist/components/integrations/index.cjs +0 -1
- package/dist/components/integrations/index.js +0 -1
- package/dist/components/integrations/shared.cjs +0 -1
- package/dist/components/integrations/shared.js +0 -1
- package/dist/components/integrations/youtube-embed.cjs +0 -1
- package/dist/components/integrations/youtube-embed.js +0 -1
- package/dist/components/shared/libs/polymorphic.cjs +0 -1
- package/dist/components/shared/libs/recursive-clone-children.cjs +0 -1
- package/dist/components/shared/libs/slot.cjs +0 -1
- package/dist/components/shared/libs/use-controllable-state.cjs +0 -1
- package/dist/components/shared/policy-actions.cjs +0 -1
- package/dist/components/shared/primitives/box.cjs +0 -1
- package/dist/components/shared/primitives/button.cjs +0 -1
- package/dist/components/shared/primitives/button.types.cjs +0 -1
- package/dist/components/shared/primitives/legal-links/index.cjs +0 -1
- package/dist/components/shared/ui/accordion/accordion.cjs +0 -1
- package/dist/components/shared/ui/accordion/accordion.types.cjs +0 -1
- package/dist/components/shared/ui/accordion/index.cjs +0 -1
- package/dist/components/shared/ui/animated-collapse/animated-collapse.cjs +0 -1
- package/dist/components/shared/ui/animated-collapse/index.cjs +0 -1
- package/dist/components/shared/ui/branding.cjs +0 -1
- package/dist/components/shared/ui/button/button.cjs +0 -1
- package/dist/components/shared/ui/button/button.types.cjs +0 -1
- package/dist/components/shared/ui/button/index.cjs +0 -1
- package/dist/components/shared/ui/collapsible/collapsible.cjs +0 -1
- package/dist/components/shared/ui/collapsible/index.cjs +0 -1
- package/dist/components/shared/ui/dialog/dialog.cjs +0 -1
- package/dist/components/shared/ui/dialog/index.cjs +0 -1
- package/dist/components/shared/ui/icon.cjs +0 -1
- package/dist/components/shared/ui/logo.cjs +0 -1
- package/dist/components/shared/ui/preference-item/index.cjs +0 -1
- package/dist/components/shared/ui/preference-item/preference-item.cjs +0 -1
- package/dist/components/shared/ui/switch/index.cjs +0 -1
- package/dist/components/shared/ui/switch/switch.cjs +0 -1
- package/dist/components/shared/ui/switch/switch.types.cjs +0 -1
- package/dist/components/shared/ui/tabs/index.cjs +0 -1
- package/dist/components/shared/ui/tabs/tabs.cjs +0 -1
- package/dist/context/consent-manager-context.cjs +0 -1
- package/dist/context/consent-manager-context.js +0 -1
- package/dist/context/consent-tracking-context.cjs +0 -1
- package/dist/context/theme-context.cjs +0 -1
- package/dist/headless.cjs +0 -1
- package/dist/hooks/index.cjs +0 -1
- package/dist/hooks/index.js +0 -1
- package/dist/hooks/use-color-scheme.cjs +0 -1
- package/dist/hooks/use-component-config.cjs +0 -1
- package/dist/hooks/use-consent-dialog-trigger.cjs +0 -1
- package/dist/hooks/use-consent-dialog-trigger.js +0 -1
- package/dist/hooks/use-consent-manager.cjs +0 -1
- package/dist/hooks/use-consent-manager.js +0 -1
- package/dist/hooks/use-consent-script.cjs +0 -1
- package/dist/hooks/use-consent-script.js +0 -1
- package/dist/hooks/use-focus-trap.cjs +0 -1
- package/dist/hooks/use-headless-consent-ui.cjs +0 -1
- package/dist/hooks/use-headless-consent-ui.js +0 -1
- package/dist/hooks/use-headless-iab-consent-ui.cjs +0 -1
- package/dist/hooks/use-reduced-motion.cjs +0 -1
- package/dist/hooks/use-scroll-lock.cjs +0 -1
- package/dist/hooks/use-ssr-status.cjs +0 -1
- package/dist/hooks/use-ssr-status.js +0 -1
- package/dist/hooks/use-styles.cjs +0 -1
- package/dist/hooks/use-styles.js +0 -1
- package/dist/hooks/use-text-direction.cjs +0 -1
- package/dist/hooks/use-theme.cjs +0 -1
- package/dist/hooks/use-translations.cjs +0 -1
- package/dist/hooks/use-translations.js +0 -1
- package/dist/iab.cjs +0 -1
- package/dist/index.cjs +0 -1
- package/dist/primitives/accordion.cjs +0 -1
- package/dist/primitives/button.cjs +0 -1
- package/dist/primitives/collapsible.cjs +0 -1
- package/dist/primitives/dialog.cjs +0 -1
- package/dist/primitives/preference-item.cjs +0 -1
- package/dist/primitives/switch.cjs +0 -1
- package/dist/primitives/tabs.cjs +0 -1
- package/dist/primitives.cjs +0 -1
- package/dist/providers/consent-manager-provider.cjs +0 -1
- package/dist/providers/consent-manager-provider.js +0 -1
- package/dist/server/fetch-ssr-data.cjs +0 -1
- package/dist/server/headers.cjs +0 -1
- package/dist/server/index.cjs +0 -1
- package/dist/server/init-cache-key.cjs +0 -1
- package/dist/server/normalize-url.cjs +0 -1
- package/dist/server/types.cjs +0 -1
- package/dist/types/consent-manager.cjs +0 -1
- package/dist/types/theme/index.cjs +0 -1
- package/dist/types/theme/style-keys.cjs +0 -1
- package/dist/types/theme/style-types.cjs +0 -1
- package/dist/utils/cn.cjs +0 -1
- package/dist/utils/merge-styles.cjs +0 -1
- package/dist/utils/test-helpers.cjs +0 -1
- package/dist/utils/test-helpers.js +0 -1
- package/dist/utils/theme-utils.cjs +0 -1
- package/dist/version.cjs +0 -1
- package/dist-types/components/consent-banner/atoms/root.d.ts +0 -126
- package/dist-types/components/consent-banner/policy-actions.d.ts +0 -11
- package/dist-types/components/consent-widget/policy-actions.d.ts +0 -11
- package/dist-types/components/iab-consent-dialog/hooks/use-gvl-data.d.ts +0 -27
- package/dist-types/components/iab-consent-dialog/types.d.ts +0 -72
- package/dist-types/components/integrations/google-map.d.ts +0 -82
- package/dist-types/components/integrations/index.d.ts +0 -2
- package/dist-types/components/integrations/shared.d.ts +0 -12
- package/dist-types/components/integrations/youtube-embed.d.ts +0 -95
- package/dist-types/context/consent-manager-context.d.ts +0 -31
- package/dist-types/hooks/index.d.ts +0 -12
- package/dist-types/hooks/use-consent-dialog-trigger.d.ts +0 -10
- package/dist-types/hooks/use-consent-manager.d.ts +0 -27
- package/dist-types/hooks/use-consent-script.d.ts +0 -80
- package/dist-types/hooks/use-headless-consent-ui.d.ts +0 -46
- package/dist-types/hooks/use-ssr-status.d.ts +0 -57
- package/dist-types/hooks/use-styles.d.ts +0 -21
- package/dist-types/hooks/use-translations.d.ts +0 -28
- package/dist-types/providers/consent-manager-provider.d.ts +0 -40
- package/dist-types/types/consent-manager.d.ts +0 -39
- package/dist-types/types/theme/style-keys.d.ts +0 -1
- package/dist-types/utils/test-helpers.d.ts +0 -31
- package/docs/frameworks/react/building-headless-components.md +0 -370
- package/docs/frameworks/react/callbacks.md +0 -186
- package/docs/frameworks/react/concepts/client-modes.md +0 -177
- package/docs/frameworks/react/concepts/consent-models.md +0 -113
- package/docs/frameworks/react/concepts/cookie-management.md +0 -122
- package/docs/frameworks/react/concepts/glossary.md +0 -24
- package/docs/frameworks/react/concepts/initialization-flow.md +0 -149
- package/docs/frameworks/react/concepts/policy-packs.md +0 -228
- package/docs/frameworks/react/hooks/use-color-scheme.md +0 -41
- package/docs/frameworks/react/hooks/use-consent-manager/checking-consent.md +0 -96
- package/docs/frameworks/react/hooks/use-consent-manager/location-info.md +0 -97
- package/docs/frameworks/react/hooks/use-consent-manager/setting-consent.md +0 -94
- package/docs/frameworks/react/hooks/use-draggable.md +0 -59
- package/docs/frameworks/react/hooks/use-focus-trap.md +0 -42
- package/docs/frameworks/react/hooks/use-reduced-motion.md +0 -37
- package/docs/frameworks/react/hooks/use-ssr-status.md +0 -32
- package/docs/frameworks/react/hooks/use-text-direction.md +0 -50
- package/docs/frameworks/react/hooks/use-translations.md +0 -55
- package/docs/frameworks/react/iab/consent-banner.md +0 -91
- package/docs/frameworks/react/iab/consent-dialog.md +0 -129
- package/docs/frameworks/react/iab/use-gvl-data.md +0 -21
- package/docs/frameworks/react/iframe-blocking.md +0 -106
- package/docs/frameworks/react/internationalization.md +0 -207
- package/docs/frameworks/react/network-blocker.md +0 -140
- package/docs/frameworks/react/optimization.md +0 -148
- package/docs/frameworks/react/policy-packs.md +0 -242
- package/docs/frameworks/react/server-side.md +0 -158
- package/docs/frameworks/react/styling/classnames.md +0 -94
- package/docs/frameworks/react/styling/color-scheme.md +0 -84
- package/docs/frameworks/react/styling/css-variables.md +0 -53
- package/docs/frameworks/react/styling/slots.md +0 -94
- package/docs/frameworks/react/styling/tailwind.md +0 -119
- package/docs/frameworks/react/styling/tokens.md +0 -156
- package/docs/shared/concepts/client-modes.md +0 -103
- package/docs/shared/concepts/consent-categories.md +0 -41
- package/docs/shared/concepts/consent-models.md +0 -72
- package/docs/shared/concepts/cookie-management.md +0 -88
- package/docs/shared/concepts/glossary.md +0 -24
- package/docs/shared/concepts/initialization-flow.md +0 -105
- package/docs/shared/concepts/policy-packs.md +0 -225
- package/docs/shared/react/components/consent-banner.md +0 -242
- package/docs/shared/react/components/consent-dialog-link.md +0 -45
- package/docs/shared/react/components/consent-dialog-trigger.md +0 -185
- package/docs/shared/react/components/consent-dialog.md +0 -119
- package/docs/shared/react/components/consent-manager-provider.md +0 -225
- package/docs/shared/react/components/consent-widget.md +0 -121
- package/docs/shared/react/components/dev-tools.md +0 -81
- package/docs/shared/react/components/frame.md +0 -52
- package/docs/shared/react/guides/building-headless-components.md +0 -110
- package/docs/shared/react/guides/callbacks.md +0 -89
- package/docs/shared/react/guides/headless.md +0 -31
- package/docs/shared/react/guides/iframe-blocking.md +0 -65
- package/docs/shared/react/guides/internationalization.md +0 -123
- package/docs/shared/react/guides/network-blocker.md +0 -72
- package/docs/shared/react/guides/optimization.md +0 -44
- package/docs/shared/react/guides/policy-packs.md +0 -173
- package/docs/shared/react/guides/script-loader.md +0 -311
- package/docs/shared/react/hooks/use-color-scheme.md +0 -31
- package/docs/shared/react/hooks/use-consent-manager/checking-consent.md +0 -95
- package/docs/shared/react/hooks/use-consent-manager/location-info.md +0 -96
- package/docs/shared/react/hooks/use-consent-manager/overview.md +0 -74
- package/docs/shared/react/hooks/use-consent-manager/setting-consent.md +0 -93
- package/docs/shared/react/hooks/use-draggable.md +0 -30
- package/docs/shared/react/hooks/use-focus-trap.md +0 -20
- package/docs/shared/react/hooks/use-reduced-motion.md +0 -33
- package/docs/shared/react/hooks/use-ssr-status.md +0 -16
- package/docs/shared/react/hooks/use-text-direction.md +0 -38
- package/docs/shared/react/hooks/use-translations.md +0 -15
- package/docs/shared/react/iab/consent-banner.md +0 -60
- package/docs/shared/react/iab/consent-dialog.md +0 -76
- package/docs/shared/react/iab/overview.md +0 -80
- package/docs/shared/react/iab/use-gvl-data.md +0 -21
- package/docs/shared/react/styling/classnames.md +0 -93
- package/docs/shared/react/styling/color-scheme.md +0 -35
- package/docs/shared/react/styling/css-variables.md +0 -53
- package/docs/shared/react/styling/overview.md +0 -261
- package/docs/shared/react/styling/slots.md +0 -93
- package/docs/shared/react/styling/stylesheet-entrypoint.md +0 -8
- package/docs/shared/react/styling/tailwind.md +0 -88
- package/docs/shared/react/styling/tokens.md +0 -155
- package/docs/shared/troubleshooting.md +0 -82
- /package/dist/components/{consent-dialog-trigger → iab-panel}/types.js +0 -0
- /package/dist/components/{consent-widget → panel-trigger}/types.js +0 -0
- /package/dist/components/{iab-consent-dialog → preferences}/types.js +0 -0
- /package/dist/types/{consent-manager.js → manager.js} +0 -0
- /package/dist/types/{theme/style-keys.js → slots.js} +0 -0
- /package/dist-types/components/{consent-dialog-link → panel-link}/index.d.ts +0 -0
- /package/dist-types/components/{consent-widget → preferences}/atoms/button.d.ts +0 -0
- /package/dist-types/components/{consent-widget/consent-widget.d.ts → preferences/preferences.d.ts} +0 -0
- /package/dist-types/components/{consent-widget → preferences}/types.d.ts +0 -0
|
@@ -1,270 +1,62 @@
|
|
|
1
1
|
---
|
|
2
|
-
title:
|
|
3
|
-
description:
|
|
4
|
-
makes consent state available to all child components.
|
|
2
|
+
title: ConsentProvider
|
|
3
|
+
description: Configure the v3 consent runtime and share its state with child components.
|
|
5
4
|
group: frameworks
|
|
6
5
|
---
|
|
7
|
-
`ConsentManagerProvider` is the root component for the c15t consent system. It initializes the consent store, detects the user's jurisdiction, resolves translations, and provides consent state to all child components via React context.
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
## Basic Usage
|
|
7
|
+
## Mount one provider
|
|
12
8
|
|
|
13
9
|
```tsx
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
10
|
+
import type { ReactNode } from 'react';
|
|
11
|
+
import { ConsentProvider, ConsentBanner, ConsentDialog, ConsentDialogLink, hosted } from 'c15t/react';
|
|
12
|
+
|
|
13
|
+
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
16
14
|
|
|
17
|
-
export
|
|
15
|
+
export function Consent({ children }: { children: ReactNode }) {
|
|
18
16
|
return (
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
mode: 'hosted',
|
|
22
|
-
backendURL: 'https://your-instance.c15t.dev',
|
|
23
|
-
consentCategories: ['necessary', 'measurement', 'marketing'],
|
|
24
|
-
}}
|
|
25
|
-
>
|
|
17
|
+
<ConsentProvider options={{ mode }}>
|
|
18
|
+
{children}
|
|
26
19
|
<ConsentBanner />
|
|
27
20
|
<ConsentDialog />
|
|
28
|
-
|
|
29
|
-
</
|
|
21
|
+
<ConsentDialogLink>Privacy settings</ConsentDialogLink>
|
|
22
|
+
</ConsentProvider>
|
|
30
23
|
);
|
|
31
24
|
}
|
|
32
25
|
```
|
|
33
26
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|:--|:--|
|
|
38
|
-
|Type Name|\`CommonInlineStoreOptions\`|
|
|
39
|
-
|Source Path|\`./packages/ui/src/theme/options.ts\`|
|
|
40
|
-
|
|
41
|
-
\*ExtractedTypeTable: Could not extract "CommonInlineStoreOptions" from "./packages/ui/src/theme/options.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*
|
|
42
|
-
|
|
43
|
-
|Property|Value|
|
|
44
|
-
|:--|:--|
|
|
45
|
-
|Type Name|\`ConsentManagerContentOptions\`|
|
|
46
|
-
|Source Path|\`./packages/ui/src/theme/options.ts\`|
|
|
47
|
-
|
|
48
|
-
\*ExtractedTypeTable: Could not extract "ConsentManagerContentOptions" from "./packages/ui/src/theme/options.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*
|
|
49
|
-
|
|
50
|
-
|Property|Value|
|
|
51
|
-
|:--|:--|
|
|
52
|
-
|Type Name|\`UIOptions\`|
|
|
53
|
-
|Source Path|\`./packages/ui/src/theme/types.ts\`|
|
|
54
|
-
|
|
55
|
-
\*ExtractedTypeTable: Could not extract "UIOptions" from "./packages/ui/src/theme/types.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*
|
|
56
|
-
|
|
57
|
-
## Mode: hosted vs offline
|
|
58
|
-
|
|
59
|
-
```tsx
|
|
60
|
-
// Hosted mode — persists to hosted backend
|
|
61
|
-
<ConsentManagerProvider
|
|
62
|
-
options={{
|
|
63
|
-
mode: 'hosted',
|
|
64
|
-
backendURL: 'https://your-instance.c15t.dev',
|
|
65
|
-
}}
|
|
66
|
-
>
|
|
67
|
-
|
|
68
|
-
// Offline mode — local cookie storage only
|
|
69
|
-
<ConsentManagerProvider
|
|
70
|
-
options={{
|
|
71
|
-
mode: 'offline',
|
|
72
|
-
}}
|
|
73
|
-
>
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
See [Client Modes](/docs/frameworks/react/concepts/client-modes) for a detailed comparison.
|
|
77
|
-
|
|
78
|
-
## Content Security Policy
|
|
79
|
-
|
|
80
|
-
c15t injects a `<style id="c15t-theme">` element for your theme tokens, and the script loader injects a `<script>` element per consented vendor. Under a nonce-based Content Security Policy, both are blocked unless they carry your nonce.
|
|
81
|
-
|
|
82
|
-
Pass it once through the `nonce` option and c15t applies it to everything it injects:
|
|
83
|
-
|
|
84
|
-
```tsx
|
|
85
|
-
<ConsentManagerProvider
|
|
86
|
-
options={{
|
|
87
|
-
mode: 'offline',
|
|
88
|
-
nonce: yourRequestNonce,
|
|
89
|
-
}}
|
|
90
|
-
>
|
|
91
|
-
{children}
|
|
92
|
-
</ConsentManagerProvider>
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
A `nonce` set on an individual script definition still wins, so you can override a single vendor without changing the provider.
|
|
96
|
-
|
|
97
|
-
> 📝 **Note:**
|
|
98
|
-
> Browsers hide the nonce content attribute once a policy is active. Inspecting the element shows no nonce="", but element.nonce still returns the value — this is expected and not a sign that c15t dropped it.
|
|
99
|
-
|
|
100
|
-
### Inline style attributes
|
|
101
|
-
|
|
102
|
-
The `nonce` option covers the elements c15t injects. It cannot cover inline `style="..."` attributes, which several components rely on — a nonce never authorizes a style attribute, because nonces apply to elements only.
|
|
103
|
-
|
|
104
|
-
Style attributes are governed by `style-src-attr`, and when that directive is absent CSP falls back to `style-src`. A nonce-based style policy therefore blocks them:
|
|
105
|
-
|
|
106
|
-
```http
|
|
107
|
-
style-src 'self' 'nonce-abc123';
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
To keep the nonce requirement for stylesheets while still allowing style attributes, set `style-src-attr` explicitly:
|
|
27
|
+
Replace the URL with your Inth project endpoint. Import the adapter stylesheet
|
|
28
|
+
once at the app root. In Next.js this component needs a client boundary; prefer
|
|
29
|
+
the framework's `ConsentRoot` when passing server-resolved state.
|
|
111
30
|
|
|
112
|
-
|
|
113
|
-
style-src 'self' 'nonce-abc123';
|
|
114
|
-
style-src-attr 'unsafe-inline';
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
> ⚠️ **Warning:**
|
|
118
|
-
> 'unsafe-inline' on style-src-attr permits any inline style attribute on the page. That is weaker than a nonce, but far narrower than replacing your nonce-based style-src with 'unsafe-inline', which would additionally authorize arbitrary injected \<style> elements. Note that adding 'unsafe-inline' alongside a nonce achieves nothing — a directive that specifies a nonce ignores it. If your threat model does not allow this, expect components that use inline styles to render unstyled.
|
|
119
|
-
|
|
120
|
-
## Legal Links
|
|
121
|
-
|
|
122
|
-
`legalLinks` defines the URLs shown in consent UI text (banner, dialog, and widget where applicable).
|
|
123
|
-
Configure only the links you want to expose.
|
|
124
|
-
|
|
125
|
-
```tsx
|
|
126
|
-
<ConsentManagerProvider
|
|
127
|
-
options={{
|
|
128
|
-
backendURL: 'https://your-instance.c15t.dev',
|
|
129
|
-
legalLinks: {
|
|
130
|
-
privacyPolicy: {
|
|
131
|
-
href: '/privacy',
|
|
132
|
-
target: '_self',
|
|
133
|
-
},
|
|
134
|
-
cookiePolicy: {
|
|
135
|
-
href: '/cookies',
|
|
136
|
-
target: '_self',
|
|
137
|
-
},
|
|
138
|
-
termsOfService: {
|
|
139
|
-
href: 'https://example.com/terms',
|
|
140
|
-
target: '_blank',
|
|
141
|
-
rel: 'noopener noreferrer',
|
|
142
|
-
label: 'Terms of Service',
|
|
143
|
-
},
|
|
144
|
-
},
|
|
145
|
-
}}
|
|
146
|
-
>
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
Notes:
|
|
150
|
-
|
|
151
|
-
* Omitting a key (for example `termsOfService`) hides that link.
|
|
152
|
-
* `label` overrides the translated text for that single link.
|
|
153
|
-
* Use `_self` for internal pages and `_blank` + `rel="noopener noreferrer"` for external pages.
|
|
154
|
-
* Control which of the configured links render in each component via the component's `legalLinks` prop.
|
|
155
|
-
|
|
156
|
-
## Overrides
|
|
157
|
-
|
|
158
|
-
`overrides` lets you force location/language signals instead of browser or network detection.
|
|
159
|
-
This is useful for QA, local development, and preview environments.
|
|
160
|
-
|
|
161
|
-
```tsx
|
|
162
|
-
<ConsentManagerProvider
|
|
163
|
-
options={{
|
|
164
|
-
backendURL: 'https://your-instance.c15t.dev',
|
|
165
|
-
overrides: {
|
|
166
|
-
country: 'DE',
|
|
167
|
-
region: 'BY',
|
|
168
|
-
language: 'de-DE',
|
|
169
|
-
},
|
|
170
|
-
}}
|
|
171
|
-
>
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
You can also override Global Privacy Control (GPC) behavior during testing:
|
|
175
|
-
|
|
176
|
-
```tsx
|
|
177
|
-
<ConsentManagerProvider
|
|
178
|
-
options={{
|
|
179
|
-
backendURL: 'https://your-instance.c15t.dev',
|
|
180
|
-
overrides: {
|
|
181
|
-
gpc: true,
|
|
182
|
-
},
|
|
183
|
-
}}
|
|
184
|
-
>
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
> ⚠️ **Warning:**
|
|
188
|
-
> Treat overrides as an environment/testing tool. Avoid hard-coding production overrides unless that behavior is intentional for your deployment.
|
|
189
|
-
|
|
190
|
-
## Policy Packs
|
|
191
|
-
|
|
192
|
-
In hosted mode (recommended), the backend resolves the correct policy automatically — no frontend policy config needed:
|
|
193
|
-
|
|
194
|
-
```tsx
|
|
195
|
-
<ConsentManagerProvider
|
|
196
|
-
options={{
|
|
197
|
-
backendURL: 'https://your-instance.c15t.dev',
|
|
198
|
-
}}
|
|
199
|
-
>
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
### Fallback: Offline Policies
|
|
203
|
-
|
|
204
|
-
When no backend is available, `ConsentManagerProvider` accepts `offlinePolicy.policyPacks` for local policy resolution during development, testing, previews, or temporary backend outages:
|
|
205
|
-
|
|
206
|
-
```tsx
|
|
207
|
-
<ConsentManagerProvider
|
|
208
|
-
options={{
|
|
209
|
-
mode: 'offline',
|
|
210
|
-
offlinePolicy: {
|
|
211
|
-
i18n: {
|
|
212
|
-
defaultProfile: 'default',
|
|
213
|
-
messages: {
|
|
214
|
-
default: {
|
|
215
|
-
translations: {
|
|
216
|
-
en: { cookieBanner: { title: 'Privacy choices' } },
|
|
217
|
-
},
|
|
218
|
-
},
|
|
219
|
-
qc: {
|
|
220
|
-
fallbackLanguage: 'fr',
|
|
221
|
-
translations: {
|
|
222
|
-
en: { cookieBanner: { title: 'Quebec Privacy Settings' } },
|
|
223
|
-
fr: { cookieBanner: { title: 'Paramètres de confidentialité du Québec' } },
|
|
224
|
-
},
|
|
225
|
-
},
|
|
226
|
-
},
|
|
227
|
-
},
|
|
228
|
-
policyPacks: [
|
|
229
|
-
{
|
|
230
|
-
id: 'qc_opt_in',
|
|
231
|
-
match: { regions: [{ country: 'CA', region: 'QC' }] },
|
|
232
|
-
i18n: { messageProfile: 'qc' },
|
|
233
|
-
consent: { model: 'opt-in', expiryDays: 365 },
|
|
234
|
-
ui: { mode: 'banner' },
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
id: 'default_world',
|
|
238
|
-
match: { isDefault: true },
|
|
239
|
-
consent: { model: 'none' },
|
|
240
|
-
ui: { mode: 'none' },
|
|
241
|
-
},
|
|
242
|
-
],
|
|
243
|
-
},
|
|
244
|
-
overrides: {
|
|
245
|
-
country: 'CA',
|
|
246
|
-
region: 'QC',
|
|
247
|
-
},
|
|
248
|
-
}}
|
|
249
|
-
>
|
|
250
|
-
```
|
|
31
|
+
## Provider responsibilities
|
|
251
32
|
|
|
252
|
-
|
|
33
|
+
The provider owns initialization, persistence, configured script loading and
|
|
34
|
+
subscriptions. Keep it mounted across client navigation. Its initial mode and
|
|
35
|
+
prefetch configuration belong to the runtime's creation, not a per-render
|
|
36
|
+
mechanism for switching visitors or backends.
|
|
253
37
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
38
|
+
| Option | Purpose |
|
|
39
|
+
| --------------------- | --------------------------------------------------------------- |
|
|
40
|
+
| `mode` | Hosted, offline or custom transport factory |
|
|
41
|
+
| `scripts` | Consent-managed script configurations |
|
|
42
|
+
| `callbacks` | Choice, permission and error events |
|
|
43
|
+
| `theme`, `components` | Theme tokens and component slot attributes |
|
|
44
|
+
| `presentation` | Prompt and preferences layout behavior |
|
|
45
|
+
| `i18n` | Languages and message overrides |
|
|
46
|
+
| `storageConfig` | Browser record storage configuration |
|
|
47
|
+
| `enabled` | Set false only when intentionally bypassing consent enforcement |
|
|
260
48
|
|
|
261
|
-
|
|
49
|
+
`enabled: false` grants categories and allows gated loading while suppressing
|
|
50
|
+
consent UI. It is not a way to fix failed initialization or hide a banner in
|
|
51
|
+
production.
|
|
262
52
|
|
|
263
|
-
##
|
|
53
|
+
## Observe changes without inventing choices
|
|
264
54
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|Source Path|\`./packages/react/src/types/consent-manager.ts\`|
|
|
55
|
+
`onChoiceRecorded` reports explicit accept, reject and save actions.
|
|
56
|
+
`onPermissionsChanged` also covers changes caused by policy, expiry or privacy
|
|
57
|
+
signals. Hydration and notice dismissal do not become explicit choices.
|
|
269
58
|
|
|
270
|
-
|
|
59
|
+
An externally owned runtime can be passed through `runtime`. Its owner must
|
|
60
|
+
start and dispose it. A provider borrowing that runtime must not initialize or
|
|
61
|
+
dispose a second copy. See [consent state](../../../guides/consent-state.md) and
|
|
62
|
+
[deployment modes](../../../guides/deployment-modes.md).
|
|
@@ -1,138 +1,174 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: ConsentWidget
|
|
3
|
-
description:
|
|
4
|
-
privacy
|
|
3
|
+
description: Embed the c15t preference center inline with ConsentWidget on a
|
|
4
|
+
React privacy page, with draft toggles that record a choice only on Save.
|
|
5
5
|
group: frameworks
|
|
6
6
|
---
|
|
7
|
-
`ConsentWidget` is a standalone, inline consent management widget. Unlike `ConsentDialog` (which is a modal), the widget embeds directly in your page layout - ideal for privacy settings pages, account preferences, or any page where users should be able to manage consent without a modal overlay.
|
|
8
7
|
|
|
9
|
-
##
|
|
8
|
+
## Embed the preference center inline
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
`ConsentWidget` renders the preference center in the page flow instead of in
|
|
11
|
+
a modal: the category switches and the Reject all, Accept all and Save
|
|
12
|
+
actions, without a title, backdrop or portal. Use it on a privacy or
|
|
13
|
+
settings page where the visitor expects the controls to be part of the
|
|
14
|
+
content. Render it anywhere inside the `ConsentProvider` from your
|
|
15
|
+
[quickstart](../quickstart.md); keep `ConsentDialog` mounted as well so the
|
|
16
|
+
banner's Customize button and preference links still have a dialog to open.
|
|
17
|
+
|
|
18
|
+
```tsx title="src/pages/privacy.tsx"
|
|
19
|
+
import { ConsentWidget } from 'c15t/react';
|
|
13
20
|
|
|
14
|
-
export function
|
|
21
|
+
export function PrivacyPage() {
|
|
15
22
|
return (
|
|
16
|
-
|
|
17
|
-
<h1>Privacy
|
|
18
|
-
<p>
|
|
19
|
-
<
|
|
20
|
-
|
|
23
|
+
<main>
|
|
24
|
+
<h1>Privacy</h1>
|
|
25
|
+
<p>Choose which optional categories this site may use.</p>
|
|
26
|
+
<section aria-labelledby="cookie-preferences">
|
|
27
|
+
<h2 id="cookie-preferences">Cookie preferences</h2>
|
|
28
|
+
<ConsentWidget />
|
|
29
|
+
</section>
|
|
30
|
+
</main>
|
|
21
31
|
);
|
|
22
32
|
}
|
|
23
33
|
```
|
|
24
34
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
<ConsentWidget
|
|
29
|
-
hideBranding
|
|
30
|
-
legalLinks={['privacyPolicy', 'cookiePolicy']}
|
|
31
|
-
noStyle={false}
|
|
32
|
-
disableAnimation={false}
|
|
33
|
-
/>
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Accordion Behavior
|
|
37
|
-
|
|
38
|
-
Each consent category is rendered as an expandable accordion item. Clicking the category header expands it to show a description and any associated services. Users can toggle individual categories on or off using the switch control. The `necessary` category is always enabled and cannot be toggled.
|
|
39
|
-
|
|
40
|
-
## Styling First
|
|
41
|
-
|
|
42
|
-
> ℹ️ **Info:**
|
|
43
|
-
> Most widget customization should stay in the stock component. Use theme tokens and slots such as consentWidgetAccordion, consentWidgetFooter, consentWidgetFooterSubGroup, and toggle before reaching for compound components. See Styling Overview.
|
|
44
|
-
|
|
45
|
-
```tsx
|
|
46
|
-
<ConsentManagerProvider
|
|
47
|
-
options={{
|
|
48
|
-
theme: {
|
|
49
|
-
colors: {
|
|
50
|
-
surface: '#fffdf8',
|
|
51
|
-
surfaceHover: '#f6f3ee',
|
|
52
|
-
},
|
|
53
|
-
slots: {
|
|
54
|
-
consentWidgetAccordion: 'rounded-3xl border border-black/10',
|
|
55
|
-
consentWidgetFooter: 'border-t border-black/10 px-6',
|
|
56
|
-
consentWidgetFooterSubGroup: 'gap-3',
|
|
57
|
-
toggle: 'shadow-sm',
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
}}
|
|
61
|
-
>
|
|
62
|
-
<ConsentWidget />
|
|
63
|
-
</ConsentManagerProvider>
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Use `consentWidgetFooter` for styling the whole action area, such as border and padding. Use `consentWidgetFooterSubGroup` for spacing or alignment inside nested button groups.
|
|
67
|
-
|
|
68
|
-
Widget copy should be changed through `ConsentManagerProvider.options.i18n` so the inline UI stays aligned with the rest of the consent experience.
|
|
69
|
-
|
|
70
|
-
## Advanced: Compound Components
|
|
35
|
+
The widget uses the provider's policy, translations and transport. It does
|
|
36
|
+
not need a second `ConsentProvider`, and it does not open or close the banner
|
|
37
|
+
or dialog by itself.
|
|
71
38
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
```tsx
|
|
75
|
-
<ConsentWidget.Root>
|
|
76
|
-
<ConsentWidget.Accordion type="multiple">
|
|
77
|
-
<ConsentWidget.AccordionItems />
|
|
78
|
-
</ConsentWidget.Accordion>
|
|
79
|
-
<ConsentWidget.PolicyActions />
|
|
80
|
-
</ConsentWidget.Root>
|
|
81
|
-
```
|
|
39
|
+
## Props
|
|
82
40
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
`
|
|
41
|
+
| Prop | Type | Default | Description |
|
|
42
|
+
| ------------------ | --------- | ---------- | ----------------------------------------------------------------------------------------------------------- |
|
|
43
|
+
| `hideBranding` | `boolean` | `true` | A standalone widget hides the "Secured by" tag. Pass `false` to show it. |
|
|
44
|
+
| `uiSource` | `string` | `'widget'` | Source identifier recorded with saves made from this widget. Inside `ConsentDialog` it inherits `'dialog'`. |
|
|
45
|
+
| `disableAnimation` | `boolean` | `false` | Skips animations in the widget's parts. |
|
|
46
|
+
| `noStyle` | `boolean` | `false` | Removes the built-in styling from every part. |
|
|
47
|
+
|
|
48
|
+
## Behavior
|
|
49
|
+
|
|
50
|
+
The widget is the preference center without the modal around it: an
|
|
51
|
+
accordion with one row per category, each with a switch, followed by the
|
|
52
|
+
Reject all, Accept all and Save actions. `ConsentDialog` renders this same
|
|
53
|
+
widget inside its card. Standalone, the widget renders in place, takes part
|
|
54
|
+
in server rendering, and does not touch the active surface, so it suits a
|
|
55
|
+
privacy page or an account settings screen.
|
|
56
|
+
|
|
57
|
+
The rows are `necessary` plus the categories in the active policy's scope,
|
|
58
|
+
narrowed to the provider `options.consentCategories` when that list is non-empty.
|
|
59
|
+
The `necessary` switch is on and disabled. Row titles and descriptions come
|
|
60
|
+
from `consentTypes.<category>.title` and `.description`; the action labels
|
|
61
|
+
from `common.rejectAll`, `common.acceptAll` and `common.save`. One row is
|
|
62
|
+
expanded at a time.
|
|
63
|
+
|
|
64
|
+
### Draft and save
|
|
65
|
+
|
|
66
|
+
Switches edit a draft, not the visitor's permissions. Nothing is recorded
|
|
67
|
+
until Save. The draft seeds each category from the recorded choice; without
|
|
68
|
+
one it uses `presentation.preferences.defaults` from the provider options,
|
|
69
|
+
and without that it is on under an opt-out rule and on only for the rule's
|
|
70
|
+
preselected categories under an opt-in rule. Save records the displayed
|
|
71
|
+
categories, then reseeds the draft from the new record. Accept all and
|
|
72
|
+
Reject all record immediately without a separate Save. A save answers a
|
|
73
|
+
choice prompt, so an open choice banner closes; it does not dismiss a
|
|
74
|
+
`notice` prompt, which keeps its own acknowledgement record. Unsaved toggles
|
|
75
|
+
are lost when the widget unmounts.
|
|
76
|
+
|
|
77
|
+
When the policy changes in a way that affects the choice while the draft has
|
|
78
|
+
unsaved toggles, the widget shows an alert, "The privacy policy changed.
|
|
79
|
+
Review the current choices before saving.", with a Review choices button
|
|
80
|
+
that resets the draft. Save is refused until then. A draft without unsaved
|
|
81
|
+
toggles reseeds silently.
|
|
82
|
+
|
|
83
|
+
A saved grant that the current policy or a privacy signal such as Global
|
|
84
|
+
Privacy Control overrides shows a note under its row: "Your saved choice is
|
|
85
|
+
restricted by the current privacy settings." The switch still reflects the
|
|
86
|
+
saved value; the effective permission is off.
|
|
87
|
+
|
|
88
|
+
### Actions
|
|
89
|
+
|
|
90
|
+
The preference center always renders Reject all, Accept all and Save, with
|
|
91
|
+
Save as the primary action. `presentation.preferences.layout`,
|
|
92
|
+
`primaryActions`, `direction` and `uiProfile` in the provider options
|
|
93
|
+
reorder and restyle them; a layout that omits one of the three has it
|
|
94
|
+
restored. Customize and dismiss actions never render here.
|
|
95
|
+
|
|
96
|
+
### When consent is not owed
|
|
97
|
+
|
|
98
|
+
Without a resolved policy rule the widget renders nothing and appears as
|
|
99
|
+
soon as a rule resolves, without a remount. A rule with `model: 'none'` and
|
|
100
|
+
an empty `rights` list renders nothing; a `none` rule that lists any right,
|
|
101
|
+
such as `['disclosure']`, renders the widget and Save completes without
|
|
102
|
+
writing a consent record.
|
|
103
|
+
|
|
104
|
+
For a fully custom preference center, `useConsentDraft()` returns the same
|
|
105
|
+
draft: `values`, `displayedCategories`, `isDirty`, `isStale`, `set`,
|
|
106
|
+
`update`, `acceptAll`, `rejectAll`, `save` and `reset`.
|
|
107
|
+
|
|
108
|
+
`useConsentDraft` and `ConsentDraftProvider` import from `c15t/react`.
|
|
109
|
+
|
|
110
|
+
## Accessibility
|
|
111
|
+
|
|
112
|
+
Each row is a disclosure: a button that expands the category description
|
|
113
|
+
and a switch beside it, so a visitor can read the description without
|
|
114
|
+
changing the choice. Each switch has the category title as its accessible
|
|
115
|
+
name. The policy-change alert uses `role="alert"`, and a restriction note is
|
|
116
|
+
an `output` element linked to its switch through `aria-describedby`. The
|
|
117
|
+
root's `dir` attribute follows the active language.
|
|
118
|
+
|
|
119
|
+
## Composition
|
|
120
|
+
|
|
121
|
+
Every part is available as `ConsentWidget.<Part>`. `Root` provides the
|
|
122
|
+
draft and accepts `noStyle`, `disableAnimation` and `uiSource`. `Accordion`
|
|
123
|
+
and `AccordionItems` render the stock rows; `AccordionItem`,
|
|
124
|
+
`AccordionTrigger`, `AccordionTriggerInner`, `AccordionContent`,
|
|
125
|
+
`AccordionArrow` and `Switch` build your own. `PolicyActions` renders the
|
|
126
|
+
resolved actions in `Footer` and `FooterSubGroup` and accepts `renderAction`
|
|
127
|
+
to replace one button; `AcceptAllButton`, `RejectButton`, `SaveButton` and
|
|
128
|
+
`CustomizeButton` are the individual buttons.
|
|
129
|
+
|
|
130
|
+
`Accordion` is controlled: pass `value` and `onValueChange`, or no
|
|
131
|
+
category description ever opens. The stock `ConsentWidget` holds that state
|
|
132
|
+
for you. In this component, `ConsentWidget` comes from the same import as
|
|
133
|
+
the example at the top of the page:
|
|
101
134
|
|
|
102
135
|
```tsx
|
|
103
|
-
|
|
104
|
-
```
|
|
136
|
+
import { useState } from 'react';
|
|
105
137
|
|
|
106
|
-
|
|
138
|
+
export function PreferenceCenter() {
|
|
139
|
+
const [open, setOpen] = useState<string[]>([]);
|
|
107
140
|
|
|
108
|
-
|
|
109
|
-
<ConsentWidget.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
}}
|
|
122
|
-
/>
|
|
141
|
+
return (
|
|
142
|
+
<ConsentWidget.Root>
|
|
143
|
+
<ConsentWidget.Accordion
|
|
144
|
+
value={open}
|
|
145
|
+
onValueChange={(next) => setOpen(Array.isArray(next) ? next : [next])}
|
|
146
|
+
>
|
|
147
|
+
<ConsentWidget.AccordionItems />
|
|
148
|
+
</ConsentWidget.Accordion>
|
|
149
|
+
<ConsentWidget.PolicyActions />
|
|
150
|
+
</ConsentWidget.Root>
|
|
151
|
+
);
|
|
152
|
+
}
|
|
123
153
|
```
|
|
124
154
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
155
|
+
Provider component slots for the stock structure are `manager.root`,
|
|
156
|
+
`manager.footer`, `manager.actionGroup`, `accordion.root`,
|
|
157
|
+
`accordion.triggerRow`, `accordion.title`, `accordion.control`,
|
|
158
|
+
`accordion-item.root`, `accordion-item.trigger`, `accordion-item.content`
|
|
159
|
+
and `tag.manager`.
|
|
160
|
+
|
|
161
|
+
The compound parts import from `c15t/react` as properties of `ConsentWidget`.
|
|
162
|
+
See [Styling](../styling/overview.md) for slots and tokens.
|
|
163
|
+
|
|
164
|
+
## Verify
|
|
165
|
+
|
|
166
|
+
Visit the page with the widget. Use a displayed optional category whose permission is
|
|
167
|
+
not restricted by policy or privacy signals such as GPC. One row per displayed
|
|
168
|
+
category appears, with `necessary` on and disabled. Turn that category on:
|
|
169
|
+
`useConsent('<category>')`
|
|
170
|
+
elsewhere on the page still reports the old value. Choose Save: it now
|
|
171
|
+
reports `true`. An open choice banner closes when the save answers its
|
|
172
|
+
prompt; a notice banner stays open until acknowledged. Reload the page: the
|
|
173
|
+
switch keeps the saved value. Without a saved choice or configured draft
|
|
174
|
+
defaults, optional switches start on under an opt-out rule.
|