@c15t/react 2.0.0-rc.3 → 2.0.0-rc.5
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/client/components/consent-banner.js +4 -0
- package/client/components/consent-dialog-link.js +3 -0
- package/client/components/consent-dialog-trigger.js +3 -0
- package/client/components/consent-dialog.js +4 -0
- package/client/components/consent-widget.js +4 -0
- package/client/components/frame.js +3 -0
- package/client/components/iab-consent-banner.js +4 -0
- package/client/components/iab-consent-dialog.js +4 -0
- package/dist/components/consent-banner/atoms/root.cjs +1 -1
- package/dist/components/consent-banner/atoms/root.js +1 -1
- package/dist/components/consent-banner/consent-banner.cjs +1 -1
- package/dist/components/consent-banner/consent-banner.js +1 -1
- package/dist/components/consent-dialog/atoms/root.cjs +1 -1
- package/dist/components/consent-dialog/atoms/root.js +1 -1
- package/dist/components/consent-dialog/consent-dialog.cjs +1 -1
- package/dist/components/consent-dialog/consent-dialog.js +1 -1
- package/dist/components/consent-dialog-link/index.cjs +1 -0
- package/dist/components/consent-dialog-link/index.js +1 -0
- package/dist/components/consent-dialog-trigger/atoms/button.cjs +1 -1
- package/dist/components/consent-dialog-trigger/atoms/button.js +1 -1
- package/dist/components/consent-dialog-trigger/atoms/root.cjs +1 -1
- package/dist/components/consent-dialog-trigger/atoms/root.js +1 -1
- package/dist/components/consent-preferences-link/consent-preferences-link.cjs +1 -0
- package/dist/components/consent-preferences-link/consent-preferences-link.js +1 -0
- package/dist/components/consent-preferences-link/index.cjs +1 -0
- package/dist/components/consent-preferences-link/index.js +1 -0
- package/dist/components/consent-widget/atoms/button.cjs +1 -1
- package/dist/components/consent-widget/atoms/button.js +1 -1
- package/dist/components/consent-widget/consent-widget.cjs +1 -1
- package/dist/components/consent-widget/consent-widget.js +1 -1
- package/dist/components/frame/frame.cjs +1 -1
- package/dist/components/frame/frame.js +1 -1
- package/dist/components/iab-consent-banner/atoms/root.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/root.js +1 -1
- package/dist/components/iab-consent-banner/iab-consent-banner.cjs +1 -1
- package/dist/components/iab-consent-banner/iab-consent-banner.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/footer.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/footer.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/root.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/root.js +1 -1
- package/dist/components/iab-consent-dialog/iab-consent-dialog.cjs +1 -1
- package/dist/components/iab-consent-dialog/iab-consent-dialog.js +1 -1
- package/dist/components/shared/libs/policy-actions.cjs +1 -0
- package/dist/components/shared/libs/policy-actions.js +1 -0
- package/dist/components/shared/primitives/button.cjs +1 -1
- package/dist/components/shared/primitives/button.js +1 -1
- package/dist/headless.cjs +1 -1
- package/dist/headless.js +1 -1
- package/dist/hooks/index.cjs +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/use-consent-dialog-trigger.cjs +1 -0
- package/dist/hooks/use-consent-dialog-trigger.js +1 -0
- package/dist/hooks/use-consent-manager.cjs +1 -1
- package/dist/hooks/use-consent-manager.js +1 -1
- package/dist/hooks/use-headless-consent-ui.cjs +1 -0
- package/dist/hooks/use-headless-consent-ui.js +1 -0
- package/dist/hooks/use-headless-iab-consent-ui.cjs +1 -0
- package/dist/hooks/use-headless-iab-consent-ui.js +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/providers/consent-manager-provider.cjs +1 -1
- package/dist/providers/consent-manager-provider.js +1 -1
- package/dist/server/fetch-ssr-data.cjs +1 -1
- package/dist/server/fetch-ssr-data.js +1 -1
- package/dist/server/headers.cjs +1 -1
- package/dist/server/headers.js +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/init-cache-key.cjs +1 -0
- package/dist/server/init-cache-key.js +1 -0
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/{dist → dist-types}/components/consent-banner/atoms/overlay.d.ts +0 -1
- package/{dist → dist-types}/components/consent-banner/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/consent-banner/components.d.ts +0 -1
- package/{dist → dist-types}/components/consent-banner/consent-banner.d.ts +8 -7
- package/{dist → dist-types}/components/consent-banner/error-boundary.d.ts +0 -1
- package/{dist → dist-types}/components/consent-banner/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog/atoms/card.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog/atoms/overlay.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/consent-dialog.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/index.d.ts +0 -1
- package/dist-types/components/consent-dialog-link/index.d.ts +1 -0
- package/{dist → dist-types}/components/consent-dialog-trigger/atoms/button.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/atoms/icon.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/atoms/root.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/atoms/text.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/consent-dialog-trigger.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/types.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog-trigger/use-draggable.d.ts +1 -2
- package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +15 -0
- package/dist-types/components/consent-preferences-link/index.d.ts +1 -0
- package/{dist → dist-types}/components/consent-widget/atoms/accordion.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/atoms/button.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/atoms/footer.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/atoms/root.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/consent-widget.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/types.d.ts +0 -1
- package/{dist → dist-types}/components/frame/atoms.d.ts +1 -2
- package/{dist → dist-types}/components/frame/frame.d.ts +0 -1
- package/{dist → dist-types}/components/frame/index.d.ts +0 -1
- package/{dist → dist-types}/components/frame/types.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-banner/atoms/button-group.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/card.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/description.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/footer.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/header.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/overlay.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-banner/atoms/title.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/iab-consent-banner.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-banner/index.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/card.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/content.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/footer.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/header.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/overlay.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/purpose-item.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/stack-item.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/tabs.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/vendor-list.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-dialog/hooks/use-gvl-data.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/iab-consent-dialog.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-dialog/index.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/types.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/use-iab-translations.d.ts +0 -1
- package/dist-types/components/shared/libs/policy-actions.d.ts +26 -0
- package/{dist → dist-types}/components/shared/libs/polymorphic.d.ts +0 -1
- package/{dist → dist-types}/components/shared/libs/recursive-clone-children.d.ts +0 -1
- package/{dist → dist-types}/components/shared/primitives/box.d.ts +0 -1
- package/{dist → dist-types}/components/shared/primitives/button.d.ts +5 -2
- package/{dist → dist-types}/components/shared/primitives/button.types.d.ts +17 -1
- package/{dist → dist-types}/components/shared/primitives/legal-links/index.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/accordion/accordion.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/accordion/accordion.types.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/accordion/index.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/animated-collapse/animated-collapse.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/animated-collapse/index.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/button/button.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/button/button.types.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/button/index.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/icon.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/logo.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/switch/index.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/switch/switch.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/switch/switch.types.d.ts +1 -2
- package/{dist → dist-types}/context/consent-manager-context.d.ts +1 -2
- package/{dist → dist-types}/context/consent-tracking-context.d.ts +0 -1
- package/{dist → dist-types}/context/theme-context.d.ts +0 -1
- package/dist-types/headless.d.ts +10 -0
- package/{dist → dist-types}/hooks/index.d.ts +3 -1
- package/{dist → dist-types}/hooks/use-color-scheme.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-component-config.d.ts +1 -2
- package/dist-types/hooks/use-consent-dialog-trigger.d.ts +10 -0
- package/{dist → dist-types}/hooks/use-consent-manager.d.ts +1 -2
- package/{dist → dist-types}/hooks/use-focus-trap.d.ts +0 -1
- package/dist-types/hooks/use-headless-consent-ui.d.ts +46 -0
- package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +41 -0
- package/{dist → dist-types}/hooks/use-reduced-motion.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-scroll-lock.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-ssr-status.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-styles.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-text-direction.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-theme.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-translations.d.ts +1 -2
- package/{dist → dist-types}/index.d.ts +6 -3
- package/{dist → dist-types}/providers/consent-manager-provider.d.ts +0 -1
- package/{dist → dist-types}/server/fetch-ssr-data.d.ts +1 -2
- package/{dist → dist-types}/server/headers.d.ts +2 -2
- package/{dist → dist-types}/server/index.d.ts +1 -1
- package/dist-types/server/init-cache-key.d.ts +21 -0
- package/{dist → dist-types}/server/normalize-url.d.ts +0 -1
- package/{dist → dist-types}/server/types.d.ts +1 -2
- package/{dist → dist-types}/types/consent-manager.d.ts +8 -2
- package/{dist → dist-types}/types/theme/index.d.ts +0 -1
- package/dist-types/types/theme/style-keys.d.ts +1 -0
- package/{dist → dist-types}/types/theme/style-types.d.ts +4 -3
- package/{dist → dist-types}/utils/cn.d.ts +1 -2
- package/{dist → dist-types}/utils/merge-styles.d.ts +0 -1
- package/{dist → dist-types}/utils/test-helpers.d.ts +0 -1
- package/{dist → dist-types}/utils/theme-utils.d.ts +1 -2
- package/dist-types/version.d.ts +1 -0
- package/docs/README.md +76 -0
- package/docs/building-headless-components.md +245 -0
- package/docs/callbacks.md +117 -0
- package/docs/components/consent-banner.md +174 -0
- package/docs/components/consent-dialog-link.md +59 -0
- package/docs/components/consent-dialog-trigger.md +103 -0
- package/docs/components/consent-dialog.md +137 -0
- package/docs/components/consent-manager-provider.md +422 -0
- package/docs/components/consent-widget.md +78 -0
- package/docs/components/dev-tools.md +63 -0
- package/docs/components/frame.md +73 -0
- package/docs/concepts/client-modes.md +163 -0
- package/docs/concepts/consent-categories.md +97 -0
- package/docs/concepts/consent-models.md +112 -0
- package/docs/concepts/cookie-management.md +122 -0
- package/docs/concepts/glossary.md +23 -0
- package/docs/concepts/initialization-flow.md +141 -0
- package/docs/concepts/policy-packs.md +227 -0
- package/docs/headless.md +184 -0
- package/docs/hooks/use-color-scheme.md +40 -0
- package/docs/hooks/use-consent-manager/checking-consent.md +94 -0
- package/docs/hooks/use-consent-manager/location-info.md +95 -0
- package/docs/hooks/use-consent-manager/overview.md +390 -0
- package/docs/hooks/use-consent-manager/setting-consent.md +92 -0
- package/docs/hooks/use-draggable.md +57 -0
- package/docs/hooks/use-focus-trap.md +41 -0
- package/docs/hooks/use-reduced-motion.md +35 -0
- package/docs/hooks/use-ssr-status.md +31 -0
- package/docs/hooks/use-text-direction.md +49 -0
- package/docs/hooks/use-translations.md +116 -0
- package/docs/iab/consent-banner.md +95 -0
- package/docs/iab/consent-dialog.md +135 -0
- package/docs/iab/overview.md +119 -0
- package/docs/iab/use-gvl-data.md +208 -0
- package/docs/iframe-blocking.md +107 -0
- package/docs/integrations/databuddy.md +186 -0
- package/docs/integrations/google-tag-manager.md +153 -0
- package/docs/integrations/google-tag.md +149 -0
- package/docs/integrations/linkedin-insights.md +109 -0
- package/docs/integrations/meta-pixel.md +342 -0
- package/docs/integrations/microsoft-uet.md +112 -0
- package/docs/integrations/overview.md +89 -0
- package/docs/integrations/posthog.md +177 -0
- package/docs/integrations/tiktok-pixel.md +113 -0
- package/docs/integrations/x-pixel.md +143 -0
- package/docs/internationalization.md +197 -0
- package/docs/network-blocker.md +178 -0
- package/docs/optimization.md +117 -0
- package/docs/policy-packs.md +240 -0
- package/docs/quickstart.md +136 -0
- package/docs/script-loader.md +300 -0
- package/docs/server-side.md +153 -0
- package/docs/styling/classnames.md +84 -0
- package/docs/styling/color-scheme.md +82 -0
- package/docs/styling/css-variables.md +92 -0
- package/docs/styling/overview.md +315 -0
- package/docs/styling/slots.md +93 -0
- package/docs/styling/tailwind.md +86 -0
- package/docs/styling/tokens.md +214 -0
- package/docs/troubleshooting.md +137 -0
- package/package.json +64 -17
- package/dist/components/__tests__/active-ui-transitions.e2e.test.cjs +0 -1
- package/dist/components/__tests__/active-ui-transitions.e2e.test.js +0 -1
- package/dist/components/__tests__/consent-flow.e2e.test.cjs +0 -1
- package/dist/components/__tests__/consent-flow.e2e.test.js +0 -1
- package/dist/components/__tests__/models-prop.e2e.test.cjs +0 -1
- package/dist/components/__tests__/models-prop.e2e.test.js +0 -1
- package/dist/components/__tests__/ui-source-tracking.e2e.test.cjs +0 -1
- package/dist/components/__tests__/ui-source-tracking.e2e.test.js +0 -1
- package/dist/components/consent-banner/atoms/overlay.d.ts.map +0 -1
- package/dist/components/consent-banner/atoms/root.d.ts.map +0 -1
- package/dist/components/consent-banner/components.d.ts.map +0 -1
- package/dist/components/consent-banner/consent-banner.d.ts.map +0 -1
- package/dist/components/consent-banner/error-boundary.d.ts.map +0 -1
- package/dist/components/consent-banner/index.d.ts.map +0 -1
- package/dist/components/consent-dialog/atoms/card.d.ts.map +0 -1
- package/dist/components/consent-dialog/atoms/overlay.d.ts.map +0 -1
- package/dist/components/consent-dialog/atoms/root.d.ts.map +0 -1
- package/dist/components/consent-dialog/consent-dialog.d.ts.map +0 -1
- package/dist/components/consent-dialog/index.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/atoms/button.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/atoms/icon.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/atoms/root.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/atoms/text.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/consent-dialog-trigger.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/index.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/types.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/use-draggable.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/accordion.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/button.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/footer.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/root.d.ts.map +0 -1
- package/dist/components/consent-widget/consent-widget.d.ts.map +0 -1
- package/dist/components/consent-widget/index.d.ts.map +0 -1
- package/dist/components/consent-widget/types.d.ts.map +0 -1
- package/dist/components/frame/atoms.d.ts.map +0 -1
- package/dist/components/frame/frame.d.ts.map +0 -1
- package/dist/components/frame/index.d.ts.map +0 -1
- package/dist/components/frame/types.d.ts.map +0 -1
- package/dist/components/iab/__tests__/e2e-setup.cjs +0 -1
- package/dist/components/iab/__tests__/e2e-setup.js +0 -1
- package/dist/components/iab/__tests__/fixtures/mock-consent-state.cjs +0 -1
- package/dist/components/iab/__tests__/fixtures/mock-consent-state.d.ts +0 -212
- package/dist/components/iab/__tests__/fixtures/mock-consent-state.d.ts.map +0 -1
- package/dist/components/iab/__tests__/fixtures/mock-consent-state.js +0 -1
- package/dist/components/iab/__tests__/iab-banner.e2e.test.cjs +0 -1
- package/dist/components/iab/__tests__/iab-banner.e2e.test.js +0 -1
- package/dist/components/iab/__tests__/iab-consent-flow.e2e.test.cjs +0 -1
- package/dist/components/iab/__tests__/iab-consent-flow.e2e.test.js +0 -1
- package/dist/components/iab/__tests__/iab-events.e2e.test.cjs +0 -1
- package/dist/components/iab/__tests__/iab-events.e2e.test.js +0 -1
- package/dist/components/iab/__tests__/iab-gvl.e2e.test.cjs +0 -1
- package/dist/components/iab/__tests__/iab-gvl.e2e.test.js +0 -1
- package/dist/components/iab/__tests__/iab-preference-center.e2e.test.cjs +0 -1
- package/dist/components/iab/__tests__/iab-preference-center.e2e.test.js +0 -1
- package/dist/components/iab/__tests__/iab-storage.e2e.test.cjs +0 -1
- package/dist/components/iab/__tests__/iab-storage.e2e.test.js +0 -1
- package/dist/components/iab/__tests__/iab-stub.e2e.test.cjs +0 -1
- package/dist/components/iab/__tests__/iab-stub.e2e.test.js +0 -1
- package/dist/components/iab/__tests__/iab-tcfapi.e2e.test.cjs +0 -1
- package/dist/components/iab/__tests__/iab-tcfapi.e2e.test.js +0 -1
- package/dist/components/iab/__tests__/msw-handlers.cjs +0 -1
- package/dist/components/iab/__tests__/msw-handlers.js +0 -1
- package/dist/components/iab-consent-banner/__tests__/iab-consent-banner.test.cjs +0 -1
- package/dist/components/iab-consent-banner/__tests__/iab-consent-banner.test.js +0 -1
- package/dist/components/iab-consent-banner/atoms/button-group.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/card.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/description.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/footer.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/header.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/overlay.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/root.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/title.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/iab-consent-banner.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/index.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/__tests__/legitimate-interest-ui.test.cjs +0 -1
- package/dist/components/iab-consent-dialog/__tests__/legitimate-interest-ui.test.js +0 -1
- package/dist/components/iab-consent-dialog/__tests__/preference-center.test.cjs +0 -1
- package/dist/components/iab-consent-dialog/__tests__/preference-center.test.js +0 -1
- package/dist/components/iab-consent-dialog/__tests__/purposes-tab.test.cjs +0 -1
- package/dist/components/iab-consent-dialog/__tests__/purposes-tab.test.js +0 -1
- package/dist/components/iab-consent-dialog/__tests__/vendors-tab.test.cjs +0 -1
- package/dist/components/iab-consent-dialog/__tests__/vendors-tab.test.js +0 -1
- package/dist/components/iab-consent-dialog/atoms/card.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/content.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/footer.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/header.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/overlay.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/purpose-item.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/root.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/stack-item.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/tabs.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/vendor-list.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/hooks/use-gvl-data.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/iab-consent-dialog.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/index.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/types.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/use-iab-translations.d.ts.map +0 -1
- package/dist/components/shared/libs/polymorphic.d.ts.map +0 -1
- package/dist/components/shared/libs/recursive-clone-children.d.ts.map +0 -1
- package/dist/components/shared/primitives/box.d.ts.map +0 -1
- package/dist/components/shared/primitives/button.d.ts.map +0 -1
- package/dist/components/shared/primitives/button.types.d.ts.map +0 -1
- package/dist/components/shared/primitives/legal-links/index.d.ts.map +0 -1
- package/dist/components/shared/ui/__tests__/primitives.test.cjs +0 -1
- package/dist/components/shared/ui/__tests__/primitives.test.js +0 -1
- package/dist/components/shared/ui/accordion/accordion.d.ts.map +0 -1
- package/dist/components/shared/ui/accordion/accordion.types.d.ts.map +0 -1
- package/dist/components/shared/ui/accordion/index.d.ts.map +0 -1
- package/dist/components/shared/ui/animated-collapse/animated-collapse.d.ts.map +0 -1
- package/dist/components/shared/ui/animated-collapse/index.d.ts.map +0 -1
- package/dist/components/shared/ui/button/button.d.ts.map +0 -1
- package/dist/components/shared/ui/button/button.types.d.ts.map +0 -1
- package/dist/components/shared/ui/button/index.d.ts.map +0 -1
- package/dist/components/shared/ui/icon.d.ts.map +0 -1
- package/dist/components/shared/ui/logo.d.ts.map +0 -1
- package/dist/components/shared/ui/switch/index.d.ts.map +0 -1
- package/dist/components/shared/ui/switch/switch.d.ts.map +0 -1
- package/dist/components/shared/ui/switch/switch.types.d.ts.map +0 -1
- package/dist/context/consent-manager-context.d.ts.map +0 -1
- package/dist/context/consent-tracking-context.d.ts.map +0 -1
- package/dist/context/theme-context.d.ts.map +0 -1
- package/dist/headless.d.ts +0 -8
- package/dist/headless.d.ts.map +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-cleans-up-system-preference-listener-on-unmount-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-cleans-up-system-preference-listener-on-unmount-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-handles-default-theme-based-on-document-class-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-handles-default-theme-based-on-document-class-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-responds-to-system-preference-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-responds-to-system-preference-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-sets-dark-theme-correctly-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-sets-dark-theme-correctly-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-updates-theme-when-default-theme-changes-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-updates-theme-when-default-theme-changes-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-updates-theme-when-system-preference-changes-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-updates-theme-when-system-preference-changes-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-consent-manager.test.tsx/useConsentManager-provides-manager-object-when-configured-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-consent-manager.test.tsx/useConsentManager-provides-manager-object-when-configured-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-handles-string-className-correctly-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-handles-string-className-correctly-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-merges-theme-and-component-styles-correctly-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-merges-theme-and-component-styles-correctly-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-should-remove-base-default-styles-but-keep-theme-and-component-classNames-when-noStyle--true-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-should-remove-base-default-styles-but-keep-theme-and-component-classNames-when-noStyle--true-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-should-remove-default-styles-but-keep-custom-classNames-when-theme-object-provides-noStyle--true-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-should-remove-default-styles-but-keep-custom-classNames-when-theme-object-provides-noStyle--true-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-theme.test.tsx/useTheme-local-theme-takes-precedence-over-global-theme-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-theme.test.tsx/useTheme-local-theme-takes-precedence-over-global-theme-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-Custom-English-instead-of-English-when-German-is-selected-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-Custom-English-instead-of-English-when-German-is-selected-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-falls-back-to-English-when-selected-language-is-not-available-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-falls-back-to-English-when-selected-language-is-not-available-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-merges-custom-translations-with-defaults-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-merges-custom-translations-with-defaults-1.js +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-returns-English-translations-by-default-1.cjs +0 -1
- package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-returns-English-translations-by-default-1.js +0 -1
- package/dist/hooks/__tests__/use-color-scheme.test.cjs +0 -1
- package/dist/hooks/__tests__/use-color-scheme.test.js +0 -1
- package/dist/hooks/__tests__/use-consent-manager.test.cjs +0 -1
- package/dist/hooks/__tests__/use-consent-manager.test.js +0 -1
- package/dist/hooks/__tests__/use-focus-trap.test.cjs +0 -1
- package/dist/hooks/__tests__/use-focus-trap.test.js +0 -1
- package/dist/hooks/__tests__/use-scroll-lock.test.cjs +0 -1
- package/dist/hooks/__tests__/use-scroll-lock.test.js +0 -1
- package/dist/hooks/__tests__/use-styles.test.cjs +0 -1
- package/dist/hooks/__tests__/use-styles.test.js +0 -1
- package/dist/hooks/__tests__/use-theme.test.cjs +0 -1
- package/dist/hooks/__tests__/use-theme.test.js +0 -1
- package/dist/hooks/__tests__/use-translations.test.cjs +0 -1
- package/dist/hooks/__tests__/use-translations.test.js +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/use-color-scheme.d.ts.map +0 -1
- package/dist/hooks/use-component-config.d.ts.map +0 -1
- package/dist/hooks/use-consent-manager.d.ts.map +0 -1
- package/dist/hooks/use-focus-trap.d.ts.map +0 -1
- package/dist/hooks/use-reduced-motion.d.ts.map +0 -1
- package/dist/hooks/use-scroll-lock.d.ts.map +0 -1
- package/dist/hooks/use-ssr-status.d.ts.map +0 -1
- package/dist/hooks/use-styles.d.ts.map +0 -1
- package/dist/hooks/use-text-direction.d.ts.map +0 -1
- package/dist/hooks/use-theme.d.ts.map +0 -1
- package/dist/hooks/use-translations.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/mockServiceWorker.js +0 -349
- package/dist/providers/__tests__/__screenshots__/provider-basic.test.tsx/ConsentManagerProvider-Basic-Request-Behavior-should-make-a-new-request-when-core-options-change-1.cjs +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-basic.test.tsx/ConsentManagerProvider-Basic-Request-Behavior-should-make-a-new-request-when-core-options-change-1.js +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-basic.test.tsx/ConsentManagerProvider-Basic-Request-Behavior-should-not-make-additional-requests-when-props-change-but-core-options-remain-same-1.cjs +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-basic.test.tsx/ConsentManagerProvider-Basic-Request-Behavior-should-not-make-additional-requests-when-props-change-but-core-options-remain-same-1.js +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-basic.test.tsx/ConsentManagerProvider-Basic-Request-Behavior-should-only-make-one-initial-request-for-consent-banner-status-1.cjs +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-basic.test.tsx/ConsentManagerProvider-Basic-Request-Behavior-should-only-make-one-initial-request-for-consent-banner-status-1.js +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-handle-rapid-re-renders-without-blocking-children-1.cjs +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-handle-rapid-re-renders-without-blocking-children-1.js +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-not-block-SSR-provider-content-when-SSR-provider-wraps-ConsentManager-1.cjs +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-not-block-SSR-provider-content-when-SSR-provider-wraps-ConsentManager-1.js +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-render-children-immediately-without-blocking-during-hydration-1.cjs +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-render-children-immediately-without-blocking-during-hydration-1.js +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-use-startTransition-for-non-blocking-state-updates-during-hydration-1.cjs +0 -1
- package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-use-startTransition-for-non-blocking-state-updates-during-hydration-1.js +0 -1
- package/dist/providers/__tests__/provider-basic.test.cjs +0 -1
- package/dist/providers/__tests__/provider-basic.test.js +0 -1
- package/dist/providers/__tests__/provider-context.test.cjs +0 -1
- package/dist/providers/__tests__/provider-context.test.js +0 -1
- package/dist/providers/__tests__/provider-errors.test.cjs +0 -1
- package/dist/providers/__tests__/provider-errors.test.js +0 -1
- package/dist/providers/__tests__/provider-hydration.test.cjs +0 -1
- package/dist/providers/__tests__/provider-hydration.test.js +0 -1
- package/dist/providers/__tests__/test-helpers.cjs +0 -1
- package/dist/providers/__tests__/test-helpers.js +0 -1
- package/dist/providers/consent-manager-provider.d.ts.map +0 -1
- package/dist/server/fetch-ssr-data.d.ts.map +0 -1
- package/dist/server/headers.d.ts.map +0 -1
- package/dist/server/headers.test.cjs +0 -1
- package/dist/server/headers.test.d.ts +0 -2
- package/dist/server/headers.test.d.ts.map +0 -1
- package/dist/server/headers.test.js +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/normalize-url.d.ts.map +0 -1
- package/dist/server/normalize-url.test.cjs +0 -1
- package/dist/server/normalize-url.test.d.ts +0 -2
- package/dist/server/normalize-url.test.d.ts.map +0 -1
- package/dist/server/normalize-url.test.js +0 -1
- package/dist/server/types.d.ts.map +0 -1
- package/dist/static/image/ConsentManagerProvider-Basic-Request-Behavior-should-make-a-new-request-when-core-options-change-1.png +0 -0
- package/dist/static/image/ConsentManagerProvider-Basic-Request-Behavior-should-not-make-additional-requests-when-props-change-but-core-options-remain-same-1.png +0 -0
- package/dist/static/image/ConsentManagerProvider-Basic-Request-Behavior-should-only-make-one-initial-request-for-consent-banner-status-1.png +0 -0
- package/dist/static/image/ConsentManagerProvider-Hydration-Behavior-should-handle-rapid-re-renders-without-blocking-children-1.png +0 -0
- package/dist/static/image/ConsentManagerProvider-Hydration-Behavior-should-not-block-SSR-provider-content-when-SSR-provider-wraps-ConsentManager-1.png +0 -0
- package/dist/static/image/ConsentManagerProvider-Hydration-Behavior-should-render-children-immediately-without-blocking-during-hydration-1.png +0 -0
- package/dist/static/image/ConsentManagerProvider-Hydration-Behavior-should-use-startTransition-for-non-blocking-state-updates-during-hydration-1.png +0 -0
- package/dist/static/image/useColorScheme-cleans-up-system-preference-listener-on-unmount-1.png +0 -0
- package/dist/static/image/useColorScheme-handles-default-theme-based-on-document-class-1.png +0 -0
- package/dist/static/image/useColorScheme-responds-to-system-preference-1.png +0 -0
- package/dist/static/image/useColorScheme-sets-dark-theme-correctly-1.png +0 -0
- package/dist/static/image/useColorScheme-updates-theme-when-default-theme-changes-1.png +0 -0
- package/dist/static/image/useColorScheme-updates-theme-when-system-preference-changes-1.png +0 -0
- package/dist/static/image/useConsentManager-provides-manager-object-when-configured-1.png +0 -0
- package/dist/static/image/useStyles-handles-string-className-correctly-1.png +0 -0
- package/dist/static/image/useStyles-merges-theme-and-component-styles-correctly-1.png +0 -0
- package/dist/static/image/useStyles-should-remove-base-default-styles-but-keep-theme-and-component-classNames-when-noStyle--true-1.png +0 -0
- package/dist/static/image/useStyles-should-remove-default-styles-but-keep-custom-classNames-when-theme-object-provides-noStyle--true-1.png +0 -0
- package/dist/static/image/useTheme-local-theme-takes-precedence-over-global-theme-1.png +0 -0
- package/dist/static/image/useTranslations-Custom-English-instead-of-English-when-German-is-selected-1.png +0 -0
- package/dist/static/image/useTranslations-falls-back-to-English-when-selected-language-is-not-available-1.png +0 -0
- package/dist/static/image/useTranslations-merges-custom-translations-with-defaults-1.png +0 -0
- package/dist/static/image/useTranslations-returns-English-translations-by-default-1.png +0 -0
- package/dist/test-setup.browser.cjs +0 -1
- package/dist/test-setup.browser.d.ts +0 -8
- package/dist/test-setup.browser.d.ts.map +0 -1
- package/dist/test-setup.browser.js +0 -1
- package/dist/types/consent-manager.d.ts.map +0 -1
- package/dist/types/theme/index.d.ts.map +0 -1
- package/dist/types/theme/style-keys.d.ts +0 -2
- package/dist/types/theme/style-keys.d.ts.map +0 -1
- package/dist/types/theme/style-types.d.ts.map +0 -1
- package/dist/utils/cn.d.ts.map +0 -1
- package/dist/utils/merge-styles.d.ts.map +0 -1
- package/dist/utils/test-helpers.d.ts.map +0 -1
- package/dist/utils/theme-utils.d.ts.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ConsentDialogTrigger
|
|
3
|
+
description: A floating, draggable button that lets users re-open the consent dialog at any time.
|
|
4
|
+
---
|
|
5
|
+
`ConsentDialogTrigger` is a floating button that opens the consent dialog when clicked. Users can drag it to any corner of the screen, and the position persists across sessions. Use it to give users a persistent way to manage their privacy settings.
|
|
6
|
+
|
|
7
|
+
## Basic Usage
|
|
8
|
+
|
|
9
|
+
Use standalone or via the `showTrigger` prop on `ConsentDialog`:
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { ConsentDialogTrigger } from '@c15t/react';
|
|
13
|
+
|
|
14
|
+
// Standalone
|
|
15
|
+
<ConsentDialogTrigger />
|
|
16
|
+
|
|
17
|
+
// Via ConsentDialog
|
|
18
|
+
<ConsentDialog showTrigger />
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
For inline footer links (instead of a floating button), use [`ConsentDialogLink`](/docs/frameworks/react/components/consent-dialog-link).
|
|
22
|
+
|
|
23
|
+
## Icon Options
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
{/* Built-in icons */}
|
|
27
|
+
<ConsentDialogTrigger icon="branding" /> {/* c15t logo (default) */}
|
|
28
|
+
<ConsentDialogTrigger icon="fingerprint" /> {/* Privacy icon */}
|
|
29
|
+
<ConsentDialogTrigger icon="settings" /> {/* Gear icon */}
|
|
30
|
+
|
|
31
|
+
{/* Custom icon */}
|
|
32
|
+
<ConsentDialogTrigger icon={<MyCustomIcon />} />
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Visibility
|
|
36
|
+
|
|
37
|
+
Control when the trigger is visible:
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
{/* Always visible (default) */}
|
|
41
|
+
<ConsentDialogTrigger showWhen="always" />
|
|
42
|
+
|
|
43
|
+
{/* Only after user has made a consent choice */}
|
|
44
|
+
<ConsentDialogTrigger showWhen="after-consent" />
|
|
45
|
+
|
|
46
|
+
{/* Hidden (control visibility programmatically) */}
|
|
47
|
+
<ConsentDialogTrigger showWhen="never" />
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Position
|
|
51
|
+
|
|
52
|
+
Set the default corner and control persistence:
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<ConsentDialogTrigger
|
|
56
|
+
defaultPosition="bottom-left"
|
|
57
|
+
persistPosition={true} // Remembers user's drag position
|
|
58
|
+
onPositionChange={(position) => console.log('Moved to:', position)}
|
|
59
|
+
/>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Size
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
<ConsentDialogTrigger size="sm" /> {/* Small */}
|
|
66
|
+
<ConsentDialogTrigger size="md" /> {/* Medium (default) */}
|
|
67
|
+
<ConsentDialogTrigger size="lg" /> {/* Large */}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Compound Components
|
|
71
|
+
|
|
72
|
+
Build fully custom trigger layouts using sub-components:
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
<ConsentDialogTrigger.Root defaultPosition="bottom-right">
|
|
76
|
+
<ConsentDialogTrigger.Button size="md">
|
|
77
|
+
<ConsentDialogTrigger.Icon icon="settings" />
|
|
78
|
+
<ConsentDialogTrigger.Text>Privacy</ConsentDialogTrigger.Text>
|
|
79
|
+
</ConsentDialogTrigger.Button>
|
|
80
|
+
</ConsentDialogTrigger.Root>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
* `ConsentDialogTrigger.Root` — Portal wrapper with drag handling and position persistence
|
|
84
|
+
* `ConsentDialogTrigger.Button` — Draggable button element with size variants
|
|
85
|
+
* `ConsentDialogTrigger.Icon` — Icon display (branding, fingerprint, settings, or custom)
|
|
86
|
+
* `ConsentDialogTrigger.Text` — Optional text label
|
|
87
|
+
|
|
88
|
+
## Props
|
|
89
|
+
|
|
90
|
+
### ConsentDialogTriggerProps
|
|
91
|
+
|
|
92
|
+
|Property|Type|Description|Default|Required|
|
|
93
|
+
|:--|:--|:--|:--|:--:|
|
|
94
|
+
|icon|TriggerIcon|Icon to display in the trigger button.|'branding'|Optional|
|
|
95
|
+
|defaultPosition|CornerPosition \|undefined|Default corner position for the trigger. User can drag to any corner and the position will be remembered.|'bottom-right'|Optional|
|
|
96
|
+
|persistPosition|boolean \|undefined|Whether to persist the user's position preference in localStorage.|true|Optional|
|
|
97
|
+
|ariaLabel|string \|undefined|Accessible label for the trigger button.|'Open privacy settings'|Optional|
|
|
98
|
+
|className|string \|undefined|Additional CSS class names.|-|Optional|
|
|
99
|
+
|noStyle|boolean \|undefined|When true, removes default styling.|false|Optional|
|
|
100
|
+
|showWhen|TriggerVisibility \|undefined|Controls when the trigger is visible.|'always'|Optional|
|
|
101
|
+
|size|TriggerSize \|undefined|Size of the trigger button.|'md'|Optional|
|
|
102
|
+
|onClick|(() => void) \|undefined|Callback fired when the trigger is clicked (before opening dialog).|-|Optional|
|
|
103
|
+
|onPositionChange|((position: CornerPosition) => void) \|undefined|Callback fired when the corner position changes.|-|Optional|
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ConsentDialog
|
|
3
|
+
description: A modal dialog where users can toggle individual consent categories.
|
|
4
|
+
---
|
|
5
|
+
`ConsentDialog` is a modal that shows toggles for each consent category. In **opt-in jurisdictions**, it typically opens when users click "Customize" on `ConsentBanner`. It can also be controlled programmatically for use on settings pages regardless of jurisdiction.
|
|
6
|
+
|
|
7
|
+
## Basic Usage
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { ConsentManagerProvider, ConsentBanner, ConsentDialog } from '@c15t/react';
|
|
11
|
+
|
|
12
|
+
export function ConsentManager() {
|
|
13
|
+
return (
|
|
14
|
+
<ConsentManagerProvider options={{ mode: 'hosted', backendURL: 'https://your-instance.c15t.dev' }}>
|
|
15
|
+
<ConsentBanner />
|
|
16
|
+
<ConsentDialog />
|
|
17
|
+
</ConsentManagerProvider>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Controlled State
|
|
23
|
+
|
|
24
|
+
By default, the dialog follows `activeUI === 'dialog'` from the consent store. Use the `open` prop for manual control:
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { useState } from 'react';
|
|
28
|
+
|
|
29
|
+
function SettingsPage() {
|
|
30
|
+
const [open, setOpen] = useState(false);
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<>
|
|
34
|
+
<button onClick={() => setOpen(true)}>Privacy Settings</button>
|
|
35
|
+
<ConsentDialog open={open} />
|
|
36
|
+
</>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Or use the hook to open it programmatically:
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { useConsentManager } from '@c15t/react';
|
|
45
|
+
|
|
46
|
+
function PrivacyLink() {
|
|
47
|
+
const { setActiveUI } = useConsentManager();
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<button onClick={() => setActiveUI('dialog')}>
|
|
51
|
+
Manage cookies
|
|
52
|
+
</button>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Floating Trigger
|
|
58
|
+
|
|
59
|
+
Add a floating button that lets users re-open the dialog after dismissing the banner:
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
{/* Default trigger */}
|
|
63
|
+
<ConsentDialog showTrigger />
|
|
64
|
+
|
|
65
|
+
{/* Custom trigger */}
|
|
66
|
+
<ConsentDialog
|
|
67
|
+
showTrigger={{
|
|
68
|
+
icon: 'settings',
|
|
69
|
+
defaultPosition: 'bottom-left',
|
|
70
|
+
showWhen: 'after-consent',
|
|
71
|
+
size: 'sm',
|
|
72
|
+
}}
|
|
73
|
+
/>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Branding
|
|
77
|
+
|
|
78
|
+
Hide the c15t branding in the dialog footer:
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
<ConsentDialog hideBranding />
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Compound Components
|
|
85
|
+
|
|
86
|
+
Build fully custom dialog layouts using sub-components:
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
<ConsentDialog.Root>
|
|
90
|
+
<ConsentDialog.Overlay />
|
|
91
|
+
<ConsentDialog.Card>
|
|
92
|
+
<ConsentDialog.Header>
|
|
93
|
+
<ConsentDialog.HeaderTitle />
|
|
94
|
+
<ConsentDialog.HeaderDescription />
|
|
95
|
+
</ConsentDialog.Header>
|
|
96
|
+
<ConsentDialog.Content>
|
|
97
|
+
<ConsentWidget />
|
|
98
|
+
</ConsentDialog.Content>
|
|
99
|
+
<ConsentDialog.Footer />
|
|
100
|
+
</ConsentDialog.Card>
|
|
101
|
+
</ConsentDialog.Root>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
* `ConsentDialog.Root` — Portal container with focus trap, scroll lock, and animation
|
|
105
|
+
* `ConsentDialog.Card` — Main dialog card
|
|
106
|
+
* `ConsentDialog.Header` — Contains title and description
|
|
107
|
+
* `ConsentDialog.HeaderTitle` — Dialog title
|
|
108
|
+
* `ConsentDialog.HeaderDescription` — Description with optional `legalLinks`
|
|
109
|
+
* `ConsentDialog.Content` — Main content area (typically contains `ConsentWidget`)
|
|
110
|
+
* `ConsentDialog.Footer` — Footer with optional branding (`hideBranding` prop)
|
|
111
|
+
* `ConsentDialog.Overlay` — Backdrop overlay
|
|
112
|
+
|
|
113
|
+
For a quick pre-composed layout, use the shorthand card:
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
<ConsentDialog.Root>
|
|
117
|
+
<ConsentDialog.ConsentCustomizationCard />
|
|
118
|
+
</ConsentDialog.Root>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Props
|
|
122
|
+
|
|
123
|
+
### ConsentDialogProps
|
|
124
|
+
|
|
125
|
+
|Property|Type|Description|Default|Required|
|
|
126
|
+
|:--|:--|:--|:--|:--:|
|
|
127
|
+
|theme|undefined|Theme configuration override (deprecated)|-|Optional|
|
|
128
|
+
|disableAnimation|boolean \|undefined|Disables all animations when true|-|Optional|
|
|
129
|
+
|noStyle|boolean \|undefined|Removes default styles when true|-|Optional|
|
|
130
|
+
|scrollLock|boolean \|undefined|Locks the scroll when true|-|Optional|
|
|
131
|
+
|trapFocus|boolean \|undefined|Traps keyboard focus within a dialog when true|-|Optional|
|
|
132
|
+
|open|boolean \|undefined|Control the open state. If omitted the dialog follows \`useConsentManager().activeUI === 'dialog'\`.|-|Optional|
|
|
133
|
+
|legalLinks|(keyof LegalLinksTranslations)\[] \|null \|undefined|Controls which legal links to display. Options: \`undefined\` (default): Shows all available legal links; \`null\`: Explicitly hides all legal links; Array of keys: Shows only the specified legal links|-|Optional|
|
|
134
|
+
|hideBranding|boolean \|undefined|Controls whether to hide the branding in the dialog footer.|-|Optional|
|
|
135
|
+
|showTrigger|ConsentDialogTriggerProps \|undefined|Show a floating trigger button to resurface the consent dialog. Useful for allowing users to re-open the dialog after dismissing. Options: \`true\` - Show trigger with default settings; \`false\` - Hide trigger (default); \`ConsentDialogTriggerProps\` - Show trigger with custom props|false|Optional|
|
|
136
|
+
|models|Model \|undefined|Which consent models this dialog responds to.|\['opt-in', 'opt-out']|Optional|
|
|
137
|
+
|uiSource|string \|undefined|Override the UI source identifier sent with consent API calls.|'dialog'|Optional|
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ConsentManagerProvider
|
|
3
|
+
description: The root provider component that initializes the consent system and makes consent state available to all child components.
|
|
4
|
+
---
|
|
5
|
+
`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.
|
|
6
|
+
|
|
7
|
+
Every other c15t component and hook must be rendered inside this provider.
|
|
8
|
+
|
|
9
|
+
## Basic Usage
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { type ReactNode } from 'react';
|
|
13
|
+
import { ConsentManagerProvider, ConsentBanner, ConsentDialog } from '@c15t/react';
|
|
14
|
+
|
|
15
|
+
export default function ConsentManager({ children }: { children: ReactNode }) {
|
|
16
|
+
return (
|
|
17
|
+
<ConsentManagerProvider
|
|
18
|
+
options={{
|
|
19
|
+
mode: 'hosted',
|
|
20
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
21
|
+
consentCategories: ['necessary', 'measurement', 'marketing'],
|
|
22
|
+
}}
|
|
23
|
+
>
|
|
24
|
+
<ConsentBanner />
|
|
25
|
+
<ConsentDialog />
|
|
26
|
+
{children}
|
|
27
|
+
</ConsentManagerProvider>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Options Reference
|
|
33
|
+
|
|
34
|
+
### CommonInlineStoreOptions
|
|
35
|
+
|
|
36
|
+
|Property|Type|Description|Default|Required|
|
|
37
|
+
|:--|:--|:--|:--|:--:|
|
|
38
|
+
|enabled|boolean \|undefined|Whether c15t should be active.|true|Optional|
|
|
39
|
+
|callbacks|[Callbacks \|undefined](https://v2.c15t.com/docs/frameworks/react/callbacks)|Event callbacks for consent actions.|-|Optional|
|
|
40
|
+
|scripts|[Script \|undefined](https://v2.c15t.com/docs/frameworks/react/script-loader)|Dynamically load scripts based on consent state.|-|Optional|
|
|
41
|
+
|legalLinks|Object \|undefined|Configuration for the legal links.|-|Optional|
|
|
42
|
+
|storageConfig|StorageConfig \|undefined|Storage configuration for consent persistence.|-|Optional|
|
|
43
|
+
|user|User \|undefined|The user's information. Usually your own internal ID for the user from your auth provider.|-|Optional|
|
|
44
|
+
|overrides|Overrides \|undefined|Forcefully set values like country, region, language for the consent manager. These values will override the values detected from the browser.|-|Optional|
|
|
45
|
+
|networkBlocker|[NetworkBlockerConfig \|undefined](https://v2.c15t.com/docs/frameworks/react/network-blocker)|Configuration for the network request blocker.|-|Optional|
|
|
46
|
+
|iab|[IABConfig \|undefined](https://v2.c15t.com/docs/frameworks/react/iab/overview)|IAB TCF 2.3 configuration.|-|Optional|
|
|
47
|
+
|ssrData|[Object \|undefined](https://v2.c15t.com/docs/frameworks/react/server-side)|SSR-prefetched data for hydration.|-|Optional|
|
|
48
|
+
|
|
49
|
+
#### `callbacks` Callbacks
|
|
50
|
+
|
|
51
|
+
Event callbacks for consent actions.
|
|
52
|
+
|
|
53
|
+
|Property|Type|Description|Default|Required|
|
|
54
|
+
|:--|:--|:--|:--|:--:|
|
|
55
|
+
|onBannerFetched|Callback\<OnBannerFetchedPayload> \|undefined|Called when the consent banner is fetched.|-|Optional|
|
|
56
|
+
|onConsentSet|Callback\<OnConsentSetPayload> \|undefined|Called when the consent is set.|-|Optional|
|
|
57
|
+
|onError|Callback\<OnErrorPayload> \|undefined|Called when an error occurs.|-|Optional|
|
|
58
|
+
|onBeforeConsentRevocationReload|Callback\<OnConsentSetPayload> \|undefined|Called before the page reloads when consent is revoked.|-|Optional|
|
|
59
|
+
|
|
60
|
+
#### `scripts` Script
|
|
61
|
+
|
|
62
|
+
Dynamically load scripts based on consent state.
|
|
63
|
+
|
|
64
|
+
|Property|Type|Description|Default|Required|
|
|
65
|
+
|:--|:--|:--|:--|:--:|
|
|
66
|
+
|id|string|Unique identifier for the script|-|✅ Required|
|
|
67
|
+
|src|string \|undefined|URL of the script to load|-|Optional|
|
|
68
|
+
|textContent|string \|undefined|Inline JavaScript code to execute|-|Optional|
|
|
69
|
+
|category|HasCondition\<AllConsentNames>|Consent category or condition required to load this script|-|✅ Required|
|
|
70
|
+
|callbackOnly|boolean \|undefined|Whether this is a callback-only script that doesn't need to load an external resource. When true, no script tag will be added to the DOM, only callbacks will be executed.|-|Optional|
|
|
71
|
+
|persistAfterConsentRevoked|boolean \|undefined|Whether the script should persist after consent is revoked.|-|Optional|
|
|
72
|
+
|alwaysLoad|boolean \|undefined|Whether the script should always load regardless of consent state. This is useful for scripts like Google Tag Manager or PostHog that manage their own consent state internally. The script will load immediately and never be unloaded based on consent changes. Note: When using this option, you are responsible for ensuring the script itself respects user consent preferences through its own consent management.|-|Optional|
|
|
73
|
+
|fetchPriority|"high" \|"low" \|"auto" \|undefined|Priority hint for browser resource loading|-|Optional|
|
|
74
|
+
|attributes|Record\<string, string> \|undefined|Additional attributes to add to the script element|-|Optional|
|
|
75
|
+
|async|boolean \|undefined|Whether to use async loading|-|Optional|
|
|
76
|
+
|defer|boolean \|undefined|Whether to defer script loading|-|Optional|
|
|
77
|
+
|nonce|string \|undefined|Content Security Policy nonce|-|Optional|
|
|
78
|
+
|anonymizeId|boolean \|undefined|Whether to use an anonymized ID for the script element, this helps ensure the script is not blocked by ad blockers|-|Optional|
|
|
79
|
+
|target|"head" \|"body" \|undefined|Where to inject the script element in the DOM. Options: \`'head'\`: Scripts are appended to \`\<head>\` (default); \`'body'\`: Scripts are appended to \`\<body>\`|-|Optional|
|
|
80
|
+
|onBeforeLoad|((info: ScriptCallbackInfo) => void) \|undefined|Callback executed before the script is loaded|-|Optional|
|
|
81
|
+
|onLoad|((info: ScriptCallbackInfo) => void) \|undefined|Callback executed when the script loads successfully|-|Optional|
|
|
82
|
+
|onError|((info: ScriptCallbackInfo) => void) \|undefined|Callback executed if the script fails to load|-|Optional|
|
|
83
|
+
|onConsentChange|((info: ScriptCallbackInfo) => void) \|undefined|Callback executed whenever the consent store is changed. This callback only applies to scripts already loaded.|-|Optional|
|
|
84
|
+
|vendorId|string \|number \|undefined|IAB TCF vendor ID - links script to a registered vendor. When in IAB mode, the script will only load if this vendor has consent. Takes precedence over \`category\` when in IAB mode. Use custom vendor IDs (string or number) to gate non-IAB vendors too.|-|Optional|
|
|
85
|
+
|iabPurposes|number\[] \|undefined|IAB TCF purpose IDs this script requires consent for. When in IAB mode and no vendorId is set, the script will only load if ALL specified purposes have consent.|-|Optional|
|
|
86
|
+
|iabLegIntPurposes|number\[] \|undefined|IAB TCF legitimate interest purpose IDs. These purposes can operate under legitimate interest instead of consent. The script loads if all iabPurposes have consent OR all iabLegIntPurposes have legitimate interest established.|-|Optional|
|
|
87
|
+
|iabSpecialFeatures|number\[] \|undefined|IAB TCF special feature IDs this script requires. Options: 1: Use precise geolocation data; 2: Actively scan device characteristics for identification|-|Optional|
|
|
88
|
+
|
|
89
|
+
#### `legalLinks`
|
|
90
|
+
|
|
91
|
+
Configuration for the legal links.
|
|
92
|
+
|
|
93
|
+
|Property|Type|Description|Default|Required|
|
|
94
|
+
|:--|:--|:--|:--|:--:|
|
|
95
|
+
|privacyPolicy|LegalLink \|undefined|-|-|✅ Required|
|
|
96
|
+
|cookiePolicy|LegalLink \|undefined|-|-|✅ Required|
|
|
97
|
+
|termsOfService|LegalLink \|undefined|-|-|✅ Required|
|
|
98
|
+
|
|
99
|
+
#### `storageConfig` StorageConfig
|
|
100
|
+
|
|
101
|
+
Storage configuration for consent persistence.
|
|
102
|
+
|
|
103
|
+
|Property|Type|Description|Default|Required|
|
|
104
|
+
|:--|:--|:--|:--|:--:|
|
|
105
|
+
|storageKey|string \|undefined|Custom storage key for localStorage and cookies|-|Optional|
|
|
106
|
+
|crossSubdomain|boolean \|undefined|Enable cross-subdomain cookies by default|-|Optional|
|
|
107
|
+
|defaultDomain|string \|undefined|Custom default domain for cookies|-|Optional|
|
|
108
|
+
|defaultExpiryDays|number \|undefined|Default cookie expiration in days|-|Optional|
|
|
109
|
+
|
|
110
|
+
#### `user` User
|
|
111
|
+
|
|
112
|
+
The user's information. Usually your own internal ID for the user from your auth provider.
|
|
113
|
+
|
|
114
|
+
|Property|Type|Description|Default|Required|
|
|
115
|
+
|:--|:--|:--|:--|:--:|
|
|
116
|
+
|id|string|Usually your own internal ID for the user from your auth provider|-|✅ Required|
|
|
117
|
+
|identityProvider|string \|undefined|The identity provider of the user. Usually the name of the identity provider e.g. 'clerk', 'auth0', 'custom', etc.|-|Optional|
|
|
118
|
+
|
|
119
|
+
#### `overrides` Overrides
|
|
120
|
+
|
|
121
|
+
Forcefully set values like country, region, language for the consent manager. These values will override the values detected from the browser.
|
|
122
|
+
|
|
123
|
+
|Property|Type|Description|Default|Required|
|
|
124
|
+
|:--|:--|:--|:--|:--:|
|
|
125
|
+
|country|string \|undefined|Country code to forcefully set|-|Optional|
|
|
126
|
+
|region|string \|undefined|Region code to forcefully set|-|Optional|
|
|
127
|
+
|language|string \|undefined|Language code to forcefully set|-|Optional|
|
|
128
|
+
|gpc|boolean \|undefined|Override the Global Privacy Control (GPC) signal. When \`true\`, simulates GPC being active (opt-out of marketing/measurement). When \`false\`, suppresses the real browser GPC signal. When \`undefined\`, falls back to the browser's \`navigator.globalPrivacyControl\`.|-|Optional|
|
|
129
|
+
|
|
130
|
+
#### `networkBlocker` NetworkBlockerConfig
|
|
131
|
+
|
|
132
|
+
Configuration for the network request blocker.
|
|
133
|
+
|
|
134
|
+
|Property|Type|Description|Default|Required|
|
|
135
|
+
|:--|:--|:--|:--|:--:|
|
|
136
|
+
|enabled|boolean \|undefined|Whether the network blocker is enabled.|-|Optional|
|
|
137
|
+
|initialConsents|ConsentState \|undefined|The consent state snapshot that is currently used for blocking logic.|-|Optional|
|
|
138
|
+
|logBlockedRequests|boolean \|undefined|Whether to automatically log blocked requests to the console.|-|Optional|
|
|
139
|
+
|onRequestBlocked|((info: BlockedRequestInfo) => void) \|undefined|Callback invoked whenever a request is blocked.|-|Optional|
|
|
140
|
+
|rules|NetworkBlockerRule|Domain rules that determine which requests should be blocked.|-|✅ Required|
|
|
141
|
+
|
|
142
|
+
#### `iab` IABConfig
|
|
143
|
+
|
|
144
|
+
IAB TCF 2.3 configuration.
|
|
145
|
+
|
|
146
|
+
|Property|Type|Description|Default|Required|
|
|
147
|
+
|:--|:--|:--|:--|:--:|
|
|
148
|
+
|enabled|boolean|Enable IAB TCF 2.3 mode. Note: Only works in 'hosted' client mode (legacy alias: 'c15t') because it requires a backend. Options: Fetch GVL from gvl.consent.io; Initialize \_\_tcfapi CMP API; Generate TC Strings for IAB compliance|-|✅ Required|
|
|
149
|
+
|cmpId|number \|undefined|CMP ID registered with IAB Europe. When using consent.io as the backend, this is automatically provided via the \`/init\` endpoint — no client-side configuration needed. Only set this if you self-host and have your own CMP registration. A valid (non-zero) CMP ID is required for IAB TCF compliance.|-|Optional|
|
|
150
|
+
|cmpVersion|string \|number \|undefined|CMP version. When omitted, defaults to package version from \`\~/cmp-defaults\` (which uses \~/version).|-|Optional|
|
|
151
|
+
|vendors|number\[] \|undefined|IAB-registered vendor IDs to include (optional). Used to scope the vendor list when fetching GVL or when hosted fallback paths are used (e.g. if GVL fetch fails).|-|Optional|
|
|
152
|
+
|customVendors|NonIABVendor \|undefined|Custom vendors not registered with IAB. These are displayed separately in the consent UI with a note that they have different privacy practices than IAB vendors.|-|Optional|
|
|
153
|
+
|publisherCountryCode|string \|undefined|Publisher country code (2-letter ISO).|-|Optional|
|
|
154
|
+
|isServiceSpecific|boolean \|undefined|Whether consent is service-specific (not global).|-|Optional|
|
|
155
|
+
|gvl|Object \|undefined \|null|Pre-loaded Global Vendor List for testing or SSR. Options: Testing (avoids network calls and mocking complexity); SSR (use server-fetched GVL); Offline/air-gapped deployments|-|Optional|
|
|
156
|
+
|
|
157
|
+
#### `ssrData`
|
|
158
|
+
|
|
159
|
+
SSR-prefetched data for hydration.
|
|
160
|
+
|
|
161
|
+
|Property|Type|Description|Default|Required|
|
|
162
|
+
|:--|:--|:--|:--|:--:|
|
|
163
|
+
|init|Object \|undefined \|null|Init endpoint response with jurisdiction, location, translations, and optional GVL.|-|✅ Required|
|
|
164
|
+
|gvl|Object \|undefined \|null|Global Vendor List data for IAB TCF mode. Note: When init returns 200 without gvl, client IAB settings are overridden to disabled.|-|Optional|
|
|
165
|
+
|metadata|SSRInitRequestMetadata \|undefined|Optional metadata for debugging SSR transport behavior.|-|Optional|
|
|
166
|
+
|
|
167
|
+
### ConsentManagerContentOptions
|
|
168
|
+
|
|
169
|
+
|Property|Type|Description|Default|Required|
|
|
170
|
+
|:--|:--|:--|:--|:--:|
|
|
171
|
+
|i18n|I18nConfig \|undefined|Preferred i18n configuration in c15t v2.|-|Optional|
|
|
172
|
+
|translations|[TranslationConfig \|undefined](https://v2.c15t.com/docs/frameworks/react/internationalization)|Translation configuration to seed the store with.|-|Optional|
|
|
173
|
+
|consentCategories|[AllConsentNames \|undefined](https://v2.c15t.com/docs/frameworks/react/concepts/consent-categories)|Consent categories to show in the consent banner.|-|Optional|
|
|
174
|
+
|
|
175
|
+
#### `i18n` I18nConfig
|
|
176
|
+
|
|
177
|
+
Preferred i18n configuration in c15t v2.
|
|
178
|
+
|
|
179
|
+
|Property|Type|Description|Default|Required|
|
|
180
|
+
|:--|:--|:--|:--|:--:|
|
|
181
|
+
|messages|Record\<string, Partial\<Translations>> \|undefined|Translation message map keyed by language code (\`en\`, \`de\`, \`fr\`, ...).|-|✅ Required|
|
|
182
|
+
|locale|string \|undefined|Preferred language code used as the initial fallback locale.|-|Optional|
|
|
183
|
+
|detectBrowserLanguage|boolean \|undefined|Whether to auto-detect from browser language settings.|-|Optional|
|
|
184
|
+
|
|
185
|
+
#### `translations` TranslationConfig
|
|
186
|
+
|
|
187
|
+
Translation configuration to seed the store with.
|
|
188
|
+
|
|
189
|
+
|Property|Type|Description|Default|Required|
|
|
190
|
+
|:--|:--|:--|:--|:--:|
|
|
191
|
+
|translations|Record\<string, Partial\<Translations>> \|undefined|-|-|✅ Required|
|
|
192
|
+
|defaultLanguage|string \|undefined|-|-|Optional|
|
|
193
|
+
|disableAutoLanguageSwitch|boolean \|undefined|-|-|Optional|
|
|
194
|
+
|
|
195
|
+
### UIOptions
|
|
196
|
+
|
|
197
|
+
|Property|Type|Description|Default|Required|
|
|
198
|
+
|:--|:--|:--|:--|:--:|
|
|
199
|
+
|theme|[Theme \|undefined](https://v2.c15t.com/docs/frameworks/react/styling/tokens)|Visual theme to apply.|-|Optional|
|
|
200
|
+
|disableAnimation|boolean \|undefined|Whether to disable animations.|false|Optional|
|
|
201
|
+
|scrollLock|boolean \|undefined|Whether to lock scroll when dialogs are open.|false|Optional|
|
|
202
|
+
|trapFocus|boolean \|undefined|Whether to trap focus within dialogs.|true|Optional|
|
|
203
|
+
|colorScheme|["light" \|"dark" \|"system" \|undefined](https://v2.c15t.com/docs/frameworks/react/styling/color-scheme)|Color scheme preference. With this option, you can force the theme to be light, dark or system. Otherwise, the theme will be detected if you have '.dark' classname in your document.|-|Optional|
|
|
204
|
+
|noStyle|[boolean \|undefined](https://v2.c15t.com/docs/frameworks/react/headless)|Whether to disable default styles.|false|Optional|
|
|
205
|
+
|
|
206
|
+
#### `theme` Theme
|
|
207
|
+
|
|
208
|
+
Visual theme to apply.
|
|
209
|
+
|
|
210
|
+
|Property|Type|Description|Default|Required|
|
|
211
|
+
|:--|:--|:--|:--|:--:|
|
|
212
|
+
|colors|ColorTokens \|undefined|Color palette for light mode.|-|Optional|
|
|
213
|
+
|dark|ColorTokens \|undefined|Dark mode color overrides.|-|Optional|
|
|
214
|
+
|typography|TypographyTokens \|undefined|Typography settings for text elements.|-|Optional|
|
|
215
|
+
|spacing|SpacingTokens \|undefined|Spacing scale for internal padding and margins.|-|Optional|
|
|
216
|
+
|radius|RadiusTokens \|undefined|Border radius scale for rounded corners.|-|Optional|
|
|
217
|
+
|shadows|ShadowTokens \|undefined|Box shadow scale for depth and elevation.|-|Optional|
|
|
218
|
+
|motion|MotionTokens \|undefined|Animation and transition timing.|-|Optional|
|
|
219
|
+
|consentActions|Object \|undefined|Semantic button styling for consent actions.|-|Optional|
|
|
220
|
+
|slots|ComponentSlots \|undefined|Component-specific style overrides.|-|Optional|
|
|
221
|
+
|
|
222
|
+
## Mode: hosted vs offline
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
// Hosted mode — persists to hosted backend
|
|
226
|
+
<ConsentManagerProvider
|
|
227
|
+
options={{
|
|
228
|
+
mode: 'hosted',
|
|
229
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
230
|
+
}}
|
|
231
|
+
>
|
|
232
|
+
|
|
233
|
+
// Offline mode — local cookie storage only
|
|
234
|
+
<ConsentManagerProvider
|
|
235
|
+
options={{
|
|
236
|
+
mode: 'offline',
|
|
237
|
+
}}
|
|
238
|
+
>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
See [Client Modes](/docs/frameworks/react/concepts/client-modes) for a detailed comparison.
|
|
242
|
+
|
|
243
|
+
## Legal Links
|
|
244
|
+
|
|
245
|
+
`legalLinks` defines the URLs shown in consent UI text (banner, dialog, and widget where applicable).
|
|
246
|
+
Configure only the links you want to expose.
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
<ConsentManagerProvider
|
|
250
|
+
options={{
|
|
251
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
252
|
+
legalLinks: {
|
|
253
|
+
privacyPolicy: {
|
|
254
|
+
href: '/privacy',
|
|
255
|
+
target: '_self',
|
|
256
|
+
},
|
|
257
|
+
cookiePolicy: {
|
|
258
|
+
href: '/cookies',
|
|
259
|
+
target: '_self',
|
|
260
|
+
},
|
|
261
|
+
termsOfService: {
|
|
262
|
+
href: 'https://example.com/terms',
|
|
263
|
+
target: '_blank',
|
|
264
|
+
rel: 'noopener noreferrer',
|
|
265
|
+
label: 'Terms of Service',
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
}}
|
|
269
|
+
>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Notes:
|
|
273
|
+
|
|
274
|
+
* Omitting a key (for example `termsOfService`) hides that link.
|
|
275
|
+
* `label` overrides the translated text for that single link.
|
|
276
|
+
* Use `_self` for internal pages and `_blank` + `rel="noopener noreferrer"` for external pages.
|
|
277
|
+
* Control which of the configured links render in each component via the component's `legalLinks` prop.
|
|
278
|
+
|
|
279
|
+
## Overrides
|
|
280
|
+
|
|
281
|
+
`overrides` lets you force location/language signals instead of browser or network detection.
|
|
282
|
+
This is useful for QA, local development, and preview environments.
|
|
283
|
+
|
|
284
|
+
```tsx
|
|
285
|
+
<ConsentManagerProvider
|
|
286
|
+
options={{
|
|
287
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
288
|
+
overrides: {
|
|
289
|
+
country: 'DE',
|
|
290
|
+
region: 'BY',
|
|
291
|
+
language: 'de-DE',
|
|
292
|
+
},
|
|
293
|
+
}}
|
|
294
|
+
>
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
You can also override Global Privacy Control (GPC) behavior during testing:
|
|
298
|
+
|
|
299
|
+
```tsx
|
|
300
|
+
<ConsentManagerProvider
|
|
301
|
+
options={{
|
|
302
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
303
|
+
overrides: {
|
|
304
|
+
gpc: true,
|
|
305
|
+
},
|
|
306
|
+
}}
|
|
307
|
+
>
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
> ⚠️ **Warning:**
|
|
311
|
+
> Treat overrides as an environment/testing tool. Avoid hard-coding production overrides unless that behavior is intentional for your deployment.
|
|
312
|
+
|
|
313
|
+
## Policy Packs
|
|
314
|
+
|
|
315
|
+
In hosted mode (recommended), the backend resolves the correct policy automatically — no frontend policy config needed:
|
|
316
|
+
|
|
317
|
+
```tsx
|
|
318
|
+
<ConsentManagerProvider
|
|
319
|
+
options={{
|
|
320
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
321
|
+
}}
|
|
322
|
+
>
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Fallback: Offline Policies
|
|
326
|
+
|
|
327
|
+
When no backend is available, `ConsentManagerProvider` accepts `offlinePolicy.policyPacks` for local policy resolution:
|
|
328
|
+
|
|
329
|
+
```tsx
|
|
330
|
+
<ConsentManagerProvider
|
|
331
|
+
options={{
|
|
332
|
+
mode: 'offline',
|
|
333
|
+
offlinePolicy: {
|
|
334
|
+
i18n: {
|
|
335
|
+
defaultProfile: 'default',
|
|
336
|
+
messages: {
|
|
337
|
+
default: {
|
|
338
|
+
translations: {
|
|
339
|
+
en: { cookieBanner: { title: 'Privacy choices' } },
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
qc: {
|
|
343
|
+
fallbackLanguage: 'fr',
|
|
344
|
+
translations: {
|
|
345
|
+
en: { cookieBanner: { title: 'Quebec Privacy Settings' } },
|
|
346
|
+
fr: { cookieBanner: { title: 'Paramètres de confidentialité du Québec' } },
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
policyPacks: [
|
|
352
|
+
{
|
|
353
|
+
id: 'qc_opt_in',
|
|
354
|
+
match: { regions: [{ country: 'CA', region: 'QC' }] },
|
|
355
|
+
i18n: { messageProfile: 'qc' },
|
|
356
|
+
consent: { model: 'opt-in', expiryDays: 365 },
|
|
357
|
+
ui: { mode: 'banner' },
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
id: 'default_world',
|
|
361
|
+
match: { isDefault: true },
|
|
362
|
+
consent: { model: 'none' },
|
|
363
|
+
ui: { mode: 'none' },
|
|
364
|
+
},
|
|
365
|
+
],
|
|
366
|
+
},
|
|
367
|
+
overrides: {
|
|
368
|
+
country: 'CA',
|
|
369
|
+
region: 'QC',
|
|
370
|
+
},
|
|
371
|
+
}}
|
|
372
|
+
>
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
Notes:
|
|
376
|
+
|
|
377
|
+
* `offlinePolicy` is only used in `offline` mode.
|
|
378
|
+
* `offlinePolicy.i18n` lets offline mode mirror hosted `messageProfile` and profile-local `fallbackLanguage` behavior.
|
|
379
|
+
* Omitting `offlinePolicy.policyPacks` uses the built-in synthetic opt-in fallback banner. Hosted network fallback uses the same opt-in banner.
|
|
380
|
+
* `offlinePolicy: { policyPacks: [] }` is explicit no-banner mode.
|
|
381
|
+
* In hosted mode, backend `policyPacks` remain the source of truth — frontend offline policies never override a live backend decision.
|
|
382
|
+
|
|
383
|
+
Read the full guide at [Policy Packs](/docs/frameworks/react/policy-packs) and the conceptual model at [Policy Packs Concept](/docs/frameworks/react/concepts/policy-packs).
|
|
384
|
+
|
|
385
|
+
## Props
|
|
386
|
+
|
|
387
|
+
### ConsentManagerProviderProps
|
|
388
|
+
|
|
389
|
+
|Property|Type|Description|Default|Required|
|
|
390
|
+
|:--|:--|:--|:--|:--:|
|
|
391
|
+
|children|ReactNode|React children to render within the provider.|-|✅ Required|
|
|
392
|
+
|options|[ConsentManagerOptions](https://v2.c15t.com/docs/frameworks/react/components/consent-manager-provider)|Configuration options for the consent manager. This includes core, React, store, and translation settings.|-|✅ Required|
|
|
393
|
+
|
|
394
|
+
#### `options` ConsentManagerOptions
|
|
395
|
+
|
|
396
|
+
Configuration options for the consent manager. This includes core, React, store, and translation settings.
|
|
397
|
+
|
|
398
|
+
|Property|Type|Description|Default|Required|
|
|
399
|
+
|:--|:--|:--|:--|:--:|
|
|
400
|
+
|store|StoreOptions \|undefined|-|-|Optional|
|
|
401
|
+
|offlinePolicy|OfflinePolicyConfig \|undefined|Top-level offline policy configuration.|-|Optional|
|
|
402
|
+
|storageConfig|StorageConfig \|undefined|Storage configuration for consent persistence|-|Optional|
|
|
403
|
+
|mode|"custom" \|"hosted" \|"c15t" \|"offline" \|undefined|Operating mode - custom endpoint implementation|-|Optional|
|
|
404
|
+
|backendURL|string \|undefined|Backend URL is not used in custom mode|-|Optional|
|
|
405
|
+
|enabled|boolean \|undefined|Whether c15t should be active.|-|Optional|
|
|
406
|
+
|callbacks|Callbacks \|undefined|Event callbacks for consent actions.|-|Optional|
|
|
407
|
+
|scripts|Script \|undefined|Dynamically load scripts based on consent state.|-|Optional|
|
|
408
|
+
|legalLinks|Partial\<Record\<keyof LegalLinksTranslations, LegalLink>> \|undefined|Configuration for the legal links.|-|Optional|
|
|
409
|
+
|user|User \|undefined|The user's information. Usually your own internal ID for the user from your auth provider.|-|Optional|
|
|
410
|
+
|overrides|Overrides \|undefined|Forcefully set values like country, region, language for the consent manager. These values will override the values detected from the browser.|-|Optional|
|
|
411
|
+
|networkBlocker|NetworkBlockerConfig \|undefined|Configuration for the network request blocker.|-|Optional|
|
|
412
|
+
|iab|IABConfig \|undefined|IAB TCF 2.3 configuration.|-|Optional|
|
|
413
|
+
|ssrData|Promise\<SSRInitialData \|undefined> \|undefined|SSR-prefetched data for hydration.|-|Optional|
|
|
414
|
+
|theme|Theme \|undefined|Visual theme to apply.|-|Optional|
|
|
415
|
+
|disableAnimation|boolean \|undefined|Whether to disable animations.|-|Optional|
|
|
416
|
+
|scrollLock|boolean \|undefined|Whether to lock scroll when dialogs are open.|-|Optional|
|
|
417
|
+
|trapFocus|boolean \|undefined|Whether to trap focus within dialogs.|-|Optional|
|
|
418
|
+
|colorScheme|"light" \|"dark" \|"system" \|undefined|Color scheme preference. With this option, you can force the theme to be light, dark or system. Otherwise, the theme will be detected if you have '.dark' classname in your document.|-|Optional|
|
|
419
|
+
|noStyle|boolean \|undefined|Whether to disable default styles.|-|Optional|
|
|
420
|
+
|i18n|I18nConfig \|undefined|Preferred i18n configuration in c15t v2.|-|Optional|
|
|
421
|
+
|translations|TranslationConfig \|undefined|Translation configuration to seed the store with.|-|Optional|
|
|
422
|
+
|consentCategories|AllConsentNames \|undefined|Consent categories to show in the consent banner.|-|Optional|
|