@c15t/react 2.0.0-rc.4 → 2.0.0-rc.6
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/dist/components/consent-banner/atoms/overlay.cjs +1 -1
- 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/components.cjs +1 -1
- package/dist/components/consent-banner/components.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-banner/error-boundary.cjs +1 -1
- package/dist/components/consent-banner/index.cjs +1 -1
- package/dist/components/consent-banner/index.js +1 -1
- package/dist/components/consent-dialog/atoms/card.cjs +1 -1
- package/dist/components/consent-dialog/atoms/card.js +1 -1
- package/dist/components/consent-dialog/atoms/overlay.cjs +1 -1
- package/dist/components/consent-dialog/atoms/overlay.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/index.cjs +1 -1
- package/dist/components/consent-dialog/index.js +1 -1
- package/dist/components/consent-dialog-link/index.cjs +1 -1
- package/dist/components/consent-dialog-link/index.js +1 -1
- package/dist/components/consent-dialog-trigger/atoms/button.cjs +1 -1
- package/dist/components/consent-dialog-trigger/atoms/icon.cjs +1 -1
- package/dist/components/consent-dialog-trigger/atoms/icon.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-dialog-trigger/atoms/text.cjs +1 -1
- package/dist/components/consent-dialog-trigger/atoms/text.js +1 -1
- package/dist/components/consent-dialog-trigger/consent-dialog-trigger.cjs +1 -1
- package/dist/components/consent-dialog-trigger/consent-dialog-trigger.js +1 -1
- package/dist/components/consent-dialog-trigger/index.cjs +1 -1
- package/dist/components/consent-dialog-trigger/index.js +1 -1
- package/dist/components/consent-dialog-trigger/types.cjs +1 -1
- package/dist/components/consent-dialog-trigger/use-draggable.cjs +1 -1
- package/dist/components/consent-dialog-trigger/use-draggable.js +1 -1
- package/dist/components/consent-preferences-link/consent-preferences-link.cjs +1 -1
- package/dist/components/consent-preferences-link/index.cjs +1 -1
- package/dist/components/consent-preferences-link/index.js +1 -1
- package/dist/components/consent-widget/atoms/accordion.cjs +1 -1
- package/dist/components/consent-widget/atoms/accordion.js +1 -1
- 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/atoms/footer.cjs +1 -1
- package/dist/components/consent-widget/atoms/root.cjs +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/consent-widget/index.cjs +1 -1
- package/dist/components/consent-widget/index.js +1 -1
- package/dist/components/consent-widget/types.cjs +1 -1
- package/dist/components/frame/atoms.cjs +1 -1
- package/dist/components/frame/frame.cjs +1 -1
- package/dist/components/frame/frame.js +1 -1
- package/dist/components/frame/index.cjs +1 -1
- package/dist/components/frame/index.js +1 -1
- package/dist/components/frame/types.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/button-group.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/card.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/description.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/footer.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/header.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/overlay.cjs +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/atoms/title.cjs +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-banner/index.cjs +1 -1
- package/dist/components/iab-consent-banner/index.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/card.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/content.cjs +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/header.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/header.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/overlay.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/purpose-item.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/purpose-item.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/atoms/stack-item.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/stack-item.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/tabs.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/tabs.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/vendor-list.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/vendor-list.js +1 -1
- package/dist/components/iab-consent-dialog/hooks/use-gvl-data.cjs +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/iab-consent-dialog/index.cjs +1 -1
- package/dist/components/iab-consent-dialog/index.js +1 -1
- package/dist/components/iab-consent-dialog/types.cjs +1 -1
- package/dist/components/iab-consent-dialog/use-iab-translations.cjs +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/libs/polymorphic.cjs +1 -1
- package/dist/components/shared/libs/recursive-clone-children.cjs +1 -1
- package/dist/components/shared/libs/slot.cjs +1 -0
- package/dist/components/shared/libs/slot.js +1 -0
- package/dist/components/shared/libs/use-controllable-state.cjs +1 -0
- package/dist/components/shared/libs/use-controllable-state.js +1 -0
- package/dist/components/shared/primitives/box.cjs +1 -1
- package/dist/components/shared/primitives/box.js +1 -1
- package/dist/components/shared/primitives/button.cjs +1 -1
- package/dist/components/shared/primitives/button.js +1 -1
- package/dist/components/shared/primitives/button.types.cjs +1 -1
- package/dist/components/shared/primitives/legal-links/index.cjs +1 -1
- package/dist/components/shared/primitives/legal-links/index.js +1 -1
- package/dist/components/shared/ui/accordion/accordion.cjs +1 -1
- package/dist/components/shared/ui/accordion/accordion.js +1 -1
- package/dist/components/shared/ui/accordion/accordion.types.cjs +1 -1
- package/dist/components/shared/ui/accordion/index.cjs +1 -1
- package/dist/components/shared/ui/animated-collapse/animated-collapse.cjs +1 -1
- package/dist/components/shared/ui/animated-collapse/index.cjs +1 -1
- package/dist/components/shared/ui/animated-collapse/index.js +1 -1
- package/dist/components/shared/ui/button/button.cjs +1 -1
- package/dist/components/shared/ui/button/button.js +1 -1
- package/dist/components/shared/ui/button/button.types.cjs +1 -1
- package/dist/components/shared/ui/button/index.cjs +1 -1
- package/dist/components/shared/ui/collapsible/collapsible.cjs +1 -0
- package/dist/components/shared/ui/collapsible/collapsible.js +1 -0
- package/dist/components/shared/ui/collapsible/index.cjs +1 -0
- package/dist/components/shared/ui/collapsible/index.js +1 -0
- package/dist/components/shared/ui/dialog/dialog.cjs +1 -0
- package/dist/components/shared/ui/dialog/dialog.js +1 -0
- package/dist/components/shared/ui/dialog/index.cjs +1 -0
- package/dist/components/shared/ui/dialog/index.js +1 -0
- package/dist/components/shared/ui/icon.cjs +1 -1
- package/dist/components/shared/ui/logo.cjs +1 -1
- package/dist/components/shared/ui/preference-item/index.cjs +1 -0
- package/dist/components/shared/ui/preference-item/index.js +1 -0
- package/dist/components/shared/ui/preference-item/preference-item.cjs +1 -0
- package/dist/components/shared/ui/preference-item/preference-item.js +1 -0
- package/dist/components/shared/ui/switch/index.cjs +1 -1
- package/dist/components/shared/ui/switch/switch.cjs +1 -1
- package/dist/components/shared/ui/switch/switch.js +1 -1
- package/dist/components/shared/ui/switch/switch.types.cjs +1 -1
- package/dist/components/shared/ui/tabs/index.cjs +1 -0
- package/dist/components/shared/ui/tabs/index.js +1 -0
- package/dist/components/shared/ui/tabs/tabs.cjs +1 -0
- package/dist/components/shared/ui/tabs/tabs.js +1 -0
- package/dist/context/consent-manager-context.cjs +1 -1
- package/dist/context/consent-tracking-context.cjs +1 -1
- package/dist/context/theme-context.cjs +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-color-scheme.cjs +1 -1
- package/dist/hooks/use-component-config.cjs +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-focus-trap.cjs +1 -1
- package/dist/hooks/use-focus-trap.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/hooks/use-reduced-motion.cjs +1 -1
- package/dist/hooks/use-reduced-motion.js +1 -1
- package/dist/hooks/use-scroll-lock.cjs +1 -1
- package/dist/hooks/use-scroll-lock.js +1 -1
- package/dist/hooks/use-ssr-status.cjs +1 -1
- package/dist/hooks/use-styles.cjs +1 -1
- package/dist/hooks/use-text-direction.cjs +1 -1
- package/dist/hooks/use-theme.cjs +1 -1
- package/dist/hooks/use-theme.js +1 -1
- package/dist/hooks/use-translations.cjs +1 -1
- package/dist/iab/styles.css +1 -0
- package/dist/iab.cjs +1 -0
- package/dist/iab.js +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/primitives/accordion.cjs +1 -0
- package/dist/primitives/accordion.js +1 -0
- package/dist/primitives/button.cjs +1 -0
- package/dist/primitives/button.js +1 -0
- package/dist/primitives/collapsible.cjs +1 -0
- package/dist/primitives/collapsible.js +1 -0
- package/dist/primitives/dialog.cjs +1 -0
- package/dist/primitives/dialog.js +1 -0
- package/dist/primitives/preference-item.cjs +1 -0
- package/dist/primitives/preference-item.js +1 -0
- package/dist/primitives/switch.cjs +1 -0
- package/dist/primitives/switch.js +1 -0
- package/dist/primitives/tabs.cjs +1 -0
- package/dist/primitives/tabs.js +1 -0
- package/dist/primitives.cjs +1 -0
- package/dist/primitives.js +1 -0
- 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/server/normalize-url.cjs +1 -1
- package/dist/server/types.cjs +1 -1
- package/dist/styles.css +1 -0
- package/dist/types/consent-manager.cjs +1 -1
- package/dist/types/theme/index.cjs +1 -1
- package/dist/types/theme/style-keys.cjs +1 -1
- package/dist/types/theme/style-types.cjs +1 -1
- package/dist/utils/cn.cjs +1 -1
- package/dist/utils/merge-styles.cjs +1 -1
- package/dist/utils/test-helpers.cjs +1 -1
- package/dist/utils/test-helpers.js +1 -1
- package/dist/utils/theme-utils.cjs +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/{dist → dist-types}/components/consent-banner/atoms/overlay.d.ts +1 -2
- package/{dist → dist-types}/components/consent-banner/atoms/root.d.ts +2 -3
- package/{dist → dist-types}/components/consent-banner/components.d.ts +1 -2
- 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 +1 -2
- package/{dist → dist-types}/components/consent-dialog/atoms/card.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/atoms/overlay.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/atoms/root.d.ts +2 -3
- package/{dist → dist-types}/components/consent-dialog/consent-dialog.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/index.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog-link/index.d.ts +0 -1
- 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 +2 -3
- 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 → dist-types}/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
- package/{dist → dist-types}/components/consent-preferences-link/index.d.ts +0 -1
- package/dist-types/components/consent-widget/atoms/accordion.d.ts +27 -0
- package/{dist → dist-types}/components/consent-widget/atoms/button.d.ts +1 -2
- package/{dist → dist-types}/components/consent-widget/atoms/footer.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/consent-widget/consent-widget.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/index.d.ts +1 -2
- package/{dist → dist-types}/components/consent-widget/types.d.ts +0 -1
- package/{dist → dist-types}/components/frame/atoms.d.ts +2 -3
- package/{dist → dist-types}/components/frame/frame.d.ts +0 -1
- package/{dist → dist-types}/components/frame/index.d.ts +1 -2
- 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 +1 -2
- 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-types/components/iab-consent-dialog/atoms/tabs.d.ts +12 -0
- 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 +1 -2
- 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-types/components/shared/libs/slot.d.ts +6 -0
- package/dist-types/components/shared/libs/use-controllable-state.d.ts +7 -0
- 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-types/components/shared/ui/accordion/accordion.d.ts +74 -0
- 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 +2 -3
- 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-types/components/shared/ui/collapsible/collapsible.d.ts +20 -0
- package/dist-types/components/shared/ui/collapsible/index.d.ts +1 -0
- package/dist-types/components/shared/ui/dialog/dialog.d.ts +29 -0
- package/dist-types/components/shared/ui/dialog/index.d.ts +1 -0
- 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-types/components/shared/ui/preference-item/index.d.ts +1 -0
- package/dist-types/components/shared/ui/preference-item/preference-item.d.ts +33 -0
- package/{dist → dist-types}/components/shared/ui/switch/index.d.ts +0 -1
- package/dist-types/components/shared/ui/switch/switch.d.ts +20 -0
- package/{dist → dist-types}/components/shared/ui/switch/switch.types.d.ts +1 -2
- package/dist-types/components/shared/ui/tabs/index.d.ts +1 -0
- package/dist-types/components/shared/ui/tabs/tabs.d.ts +28 -0
- 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 +9 -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-types/iab.d.ts +24 -0
- package/{dist → dist-types}/index.d.ts +4 -5
- package/dist-types/primitives/accordion.d.ts +1 -0
- package/dist-types/primitives/button.d.ts +1 -0
- package/dist-types/primitives/collapsible.d.ts +1 -0
- package/dist-types/primitives/dialog.d.ts +1 -0
- package/dist-types/primitives/preference-item.d.ts +1 -0
- package/dist-types/primitives/switch.d.ts +1 -0
- package/dist-types/primitives/tabs.d.ts +1 -0
- package/dist-types/primitives.d.ts +7 -0
- 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 +423 -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 +117 -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 +146 -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 +115 -0
- package/docs/styling/tokens.md +214 -0
- package/docs/troubleshooting.md +137 -0
- package/package.json +48 -36
- package/client/components/iab-consent-banner.js +0 -4
- package/client/components/iab-consent-dialog.js +0 -4
- 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-link/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-preferences-link/consent-preferences-link.d.ts.map +0 -1
- package/dist/components/consent-preferences-link/index.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/accordion.d.ts +0 -46
- 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-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/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 +0 -40
- 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/accordion/accordion.d.ts +0 -110
- 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 +0 -45
- 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/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/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/index.d.ts.map +0 -1
- package/dist/server/normalize-url.d.ts.map +0 -1
- package/dist/server/types.d.ts.map +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,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Building Headless Components
|
|
3
|
+
description: Build policy-aware custom consent components in React using the headless hooks and policy-pack tooling.
|
|
4
|
+
---
|
|
5
|
+
Building headless components is easier now because c15t exposes policy-aware primitives instead of forcing you to reconstruct banner rules by hand.
|
|
6
|
+
|
|
7
|
+
The headless stack is:
|
|
8
|
+
|
|
9
|
+
* `useHeadlessConsentUI()` for policy-aware banner/dialog actions, ordering, layout, and primary actions hints
|
|
10
|
+
* `useConsentManager()` for runtime state, categories, selected consent state, and policy metadata
|
|
11
|
+
* `useTranslations()` for the resolved copy
|
|
12
|
+
* `offlinePolicy.policyPacks` for offline previews that behave like backend policy resolution
|
|
13
|
+
|
|
14
|
+
> ℹ️ **Info:**
|
|
15
|
+
> This guide is about building your own components while still respecting resolved policy-pack behavior. For the general headless overview, see Headless Mode.
|
|
16
|
+
|
|
17
|
+
## What the Headless Tooling Gives You
|
|
18
|
+
|
|
19
|
+
The main win is that your custom UI can stay aligned with policy packs without duplicating policy logic in your components.
|
|
20
|
+
|
|
21
|
+
`useHeadlessConsentUI()` already resolves:
|
|
22
|
+
|
|
23
|
+
* which actions are allowed
|
|
24
|
+
* the order those actions should render in
|
|
25
|
+
* grouped actions from policy `layout`
|
|
26
|
+
* layout `direction` (`row` or `column`)
|
|
27
|
+
* the primary actions
|
|
28
|
+
* UI profile and scroll-lock hints
|
|
29
|
+
* whether the banner or dialog should currently be visible
|
|
30
|
+
|
|
31
|
+
That means your component mostly focuses on markup and design-system concerns instead of re-implementing policy interpretation.
|
|
32
|
+
|
|
33
|
+
## Provider Setup for Local Policy Testing
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
import type { ReactNode } from 'react';
|
|
37
|
+
import {
|
|
38
|
+
ConsentManagerProvider,
|
|
39
|
+
policyPackPresets,
|
|
40
|
+
} from '@c15t/react';
|
|
41
|
+
|
|
42
|
+
export function ConsentManager({ children }: { children: ReactNode }) {
|
|
43
|
+
return (
|
|
44
|
+
<ConsentManagerProvider
|
|
45
|
+
options={{
|
|
46
|
+
mode: 'offline',
|
|
47
|
+
offlinePolicy: {
|
|
48
|
+
policyPacks: [
|
|
49
|
+
policyPackPresets.californiaOptOut(),
|
|
50
|
+
policyPackPresets.europeOptIn(),
|
|
51
|
+
policyPackPresets.worldNoBanner(),
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
overrides: {
|
|
55
|
+
country: 'US',
|
|
56
|
+
region: 'CA',
|
|
57
|
+
},
|
|
58
|
+
}}
|
|
59
|
+
>
|
|
60
|
+
{children}
|
|
61
|
+
</ConsentManagerProvider>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Policy-Aware Banner Example
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
import { useHeadlessConsentUI, useTranslations } from '@c15t/react/headless';
|
|
70
|
+
|
|
71
|
+
export function CustomConsentBanner() {
|
|
72
|
+
const { banner, openDialog, performAction } = useHeadlessConsentUI();
|
|
73
|
+
const translations = useTranslations();
|
|
74
|
+
|
|
75
|
+
if (!banner.isVisible) return null;
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<aside className="rounded-xl border bg-white p-6 shadow-lg">
|
|
79
|
+
<h2 className="text-lg font-semibold">{translations.cookieBanner.title}</h2>
|
|
80
|
+
<p className="mt-2 text-sm text-gray-600">
|
|
81
|
+
{translations.cookieBanner.description}
|
|
82
|
+
</p>
|
|
83
|
+
|
|
84
|
+
<div className="mt-4 space-y-2">
|
|
85
|
+
{banner.actionGroups.map((group, index) => (
|
|
86
|
+
<div key={`${group.join('-')}-${index}`} className="flex gap-2">
|
|
87
|
+
{group.map((action) => (
|
|
88
|
+
<button
|
|
89
|
+
key={action}
|
|
90
|
+
type="button"
|
|
91
|
+
className={banner.primaryActions.includes(action) ? 'btn-primary' : 'btn-secondary'}
|
|
92
|
+
onClick={() => {
|
|
93
|
+
if (action === 'customize') {
|
|
94
|
+
openDialog();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
void performAction(action, { surface: 'banner' });
|
|
98
|
+
}}
|
|
99
|
+
>
|
|
100
|
+
{action === 'accept'
|
|
101
|
+
? translations.common.acceptAll
|
|
102
|
+
: action === 'reject'
|
|
103
|
+
? translations.common.rejectAll
|
|
104
|
+
: translations.common.customize}
|
|
105
|
+
</button>
|
|
106
|
+
))}
|
|
107
|
+
</div>
|
|
108
|
+
))}
|
|
109
|
+
</div>
|
|
110
|
+
</aside>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Category List That Respects the Resolved Policy
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
import {
|
|
119
|
+
useConsentManager,
|
|
120
|
+
useHeadlessConsentUI,
|
|
121
|
+
useTranslations,
|
|
122
|
+
} from '@c15t/react/headless';
|
|
123
|
+
|
|
124
|
+
export function CustomConsentDialog() {
|
|
125
|
+
const { dialog, performDialogAction, saveCustomPreferences } = useHeadlessConsentUI();
|
|
126
|
+
const {
|
|
127
|
+
consentTypes,
|
|
128
|
+
consentCategories,
|
|
129
|
+
consents,
|
|
130
|
+
selectedConsents,
|
|
131
|
+
setSelectedConsent,
|
|
132
|
+
} = useConsentManager();
|
|
133
|
+
const translations = useTranslations();
|
|
134
|
+
|
|
135
|
+
if (!dialog.isVisible) return null;
|
|
136
|
+
|
|
137
|
+
const displayedTypes = consentTypes.filter(
|
|
138
|
+
(type) => type.display && consentCategories.includes(type.name)
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
<section className="rounded-xl border bg-white p-6 shadow-xl">
|
|
143
|
+
<h2 className="text-lg font-semibold">
|
|
144
|
+
{translations.consentManagerDialog.title}
|
|
145
|
+
</h2>
|
|
146
|
+
|
|
147
|
+
<div className="mt-4 space-y-3">
|
|
148
|
+
{displayedTypes.map((type) => (
|
|
149
|
+
<label key={type.name} className="flex items-start justify-between gap-4">
|
|
150
|
+
<div>
|
|
151
|
+
<p className="font-medium">
|
|
152
|
+
{translations.consentTypes[type.name]?.title ?? type.name}
|
|
153
|
+
</p>
|
|
154
|
+
<p className="text-sm text-gray-600">{type.description}</p>
|
|
155
|
+
</div>
|
|
156
|
+
<input
|
|
157
|
+
type="checkbox"
|
|
158
|
+
checked={selectedConsents[type.name] ?? consents[type.name] ?? false}
|
|
159
|
+
disabled={type.disabled}
|
|
160
|
+
onChange={(event) =>
|
|
161
|
+
setSelectedConsent(type.name, event.target.checked)
|
|
162
|
+
}
|
|
163
|
+
/>
|
|
164
|
+
</label>
|
|
165
|
+
))}
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<div className="mt-4 flex gap-2">
|
|
169
|
+
{dialog.orderedActions.map((action) => (
|
|
170
|
+
<button
|
|
171
|
+
key={action}
|
|
172
|
+
type="button"
|
|
173
|
+
onClick={() => {
|
|
174
|
+
if (action === 'customize') {
|
|
175
|
+
void saveCustomPreferences();
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
void performDialogAction(action);
|
|
179
|
+
}}
|
|
180
|
+
>
|
|
181
|
+
{action === 'accept'
|
|
182
|
+
? translations.common.acceptAll
|
|
183
|
+
: action === 'reject'
|
|
184
|
+
? translations.common.rejectAll
|
|
185
|
+
: translations.common.save}
|
|
186
|
+
</button>
|
|
187
|
+
))}
|
|
188
|
+
</div>
|
|
189
|
+
</section>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## What a Policy-Aware Headless Component Should Respect
|
|
195
|
+
|
|
196
|
+
When you build custom banner or dialog components, make sure they use:
|
|
197
|
+
|
|
198
|
+
* `activeUI` or `banner.isVisible` / `dialog.isVisible` for visibility
|
|
199
|
+
* `allowedActions`, `orderedActions`, or `actionGroups` instead of hard-coding buttons
|
|
200
|
+
* `primaryActions` for visual emphasis
|
|
201
|
+
* `consentCategories` when deciding which category toggles to render
|
|
202
|
+
* `policyDecision` when you want to debug why a specific UI state was chosen
|
|
203
|
+
|
|
204
|
+
If you ignore those values, your custom UI can drift away from the resolved policy pack even though the underlying consent engine is configured correctly.
|
|
205
|
+
|
|
206
|
+
## Test Custom UI Against the Resolved Policy
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
import {
|
|
210
|
+
getEffectivePolicy,
|
|
211
|
+
type PolicyUIState,
|
|
212
|
+
validateUIAgainstPolicy,
|
|
213
|
+
} from 'c15t';
|
|
214
|
+
|
|
215
|
+
const policy = getEffectivePolicy(initData);
|
|
216
|
+
|
|
217
|
+
const bannerState: PolicyUIState = {
|
|
218
|
+
mode: 'banner',
|
|
219
|
+
actions: ['accept', 'reject', 'customize'],
|
|
220
|
+
layout: 'split',
|
|
221
|
+
uiProfile: 'compact',
|
|
222
|
+
scrollLock: false,
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
const issues = validateUIAgainstPolicy({
|
|
226
|
+
policy,
|
|
227
|
+
state: bannerState,
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
expect(issues).toEqual([]);
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Validation and Testing
|
|
234
|
+
|
|
235
|
+
If you are building a reusable headless component library, validate your rendered UI against the resolved runtime policy in tests.
|
|
236
|
+
|
|
237
|
+
The core package exposes:
|
|
238
|
+
|
|
239
|
+
* `getEffectivePolicy(initData)` to read the resolved policy from `/init`
|
|
240
|
+
* `validateUIAgainstPolicy({ policy, state })` to detect mismatches such as wrong actions, layout, or mode
|
|
241
|
+
|
|
242
|
+
This is useful when your design system renders custom button arrangements and you want tests to catch policy drift early.
|
|
243
|
+
|
|
244
|
+
> ℹ️ **Info:**
|
|
245
|
+
> Use this together with Policy Packs when you want to preview multiple regional experiences locally.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Callbacks
|
|
3
|
+
description: React to consent lifecycle events - initialization, consent changes, errors, and revocation reloads.
|
|
4
|
+
---
|
|
5
|
+
Callbacks let you run custom code at key points in the consent lifecycle. Define them in the provider's `callbacks` option, or register them dynamically via `useConsentManager()`.
|
|
6
|
+
|
|
7
|
+
## Configuration
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { type ReactNode } from 'react';
|
|
11
|
+
import { ConsentManagerProvider } from '@c15t/react';
|
|
12
|
+
|
|
13
|
+
export function ConsentManager({ children }: { children: ReactNode }) {
|
|
14
|
+
return (
|
|
15
|
+
<ConsentManagerProvider
|
|
16
|
+
options={{
|
|
17
|
+
mode: 'hosted',
|
|
18
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
19
|
+
callbacks: {
|
|
20
|
+
onBannerFetched: ({ jurisdiction, location, translations }) => {
|
|
21
|
+
console.log('Jurisdiction:', jurisdiction);
|
|
22
|
+
console.log('Country:', location.countryCode);
|
|
23
|
+
console.log('Language:', translations.language);
|
|
24
|
+
},
|
|
25
|
+
onConsentSet: ({ preferences }) => {
|
|
26
|
+
// Fire analytics event
|
|
27
|
+
analytics.track('consent_updated', { preferences });
|
|
28
|
+
},
|
|
29
|
+
onError: ({ error }) => {
|
|
30
|
+
errorReporter.captureMessage(error);
|
|
31
|
+
},
|
|
32
|
+
onBeforeConsentRevocationReload: ({ preferences }) => {
|
|
33
|
+
// Flush pending analytics before page reloads
|
|
34
|
+
analytics.flush();
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
}}
|
|
38
|
+
>
|
|
39
|
+
{children}
|
|
40
|
+
</ConsentManagerProvider>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Available Callbacks
|
|
46
|
+
|
|
47
|
+
### `onBannerFetched`
|
|
48
|
+
|
|
49
|
+
Called when the consent banner data is fetched from the backend (or loaded from SSR data). The payload includes jurisdiction info, location data, and resolved translations.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
onBannerFetched: ({ jurisdiction, location, translations }) => {
|
|
53
|
+
// jurisdiction: 'GDPR' | 'CCPA' | { code: 'GDPR', message: '...' } | ...
|
|
54
|
+
// location: { countryCode: 'DE', regionCode: 'BY' }
|
|
55
|
+
// translations: { language: 'de', translations: {...} }
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### `onConsentSet`
|
|
60
|
+
|
|
61
|
+
Called whenever consent preferences are saved - whether by user action (`saveConsents()`), automatic defaults, or on initialization when no jurisdiction is detected.
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
onConsentSet: ({ preferences }) => {
|
|
65
|
+
// preferences: { necessary: true, measurement: true, marketing: false, ... }
|
|
66
|
+
if (preferences.measurement) {
|
|
67
|
+
loadAnalytics();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### `onError`
|
|
73
|
+
|
|
74
|
+
Called when an error occurs during consent operations (e.g., API request failure). If no `onError` callback is provided, errors are logged to `console.error`.
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
onError: ({ error }) => {
|
|
78
|
+
// error: string describing what went wrong
|
|
79
|
+
Sentry.captureMessage(`Consent error: ${error}`);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `onBeforeConsentRevocationReload`
|
|
84
|
+
|
|
85
|
+
Called synchronously before the page reloads due to consent revocation. This is your last chance to run cleanup before the reload. Keep this callback fast - avoid async operations.
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
onBeforeConsentRevocationReload: ({ preferences }) => {
|
|
89
|
+
// Flush any pending data
|
|
90
|
+
navigator.sendBeacon('/api/flush', JSON.stringify({ session: sessionId }));
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Dynamic Registration
|
|
95
|
+
|
|
96
|
+
Register or update callbacks at runtime using `setCallback()`:
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
import { useEffect } from 'react';
|
|
100
|
+
import { useConsentManager } from '@c15t/react';
|
|
101
|
+
|
|
102
|
+
function ConsentAnalytics() {
|
|
103
|
+
const { setCallback } = useConsentManager();
|
|
104
|
+
|
|
105
|
+
useEffect(() => {
|
|
106
|
+
setCallback('onConsentSet', ({ preferences }) => {
|
|
107
|
+
analytics.track('consent_changed', preferences);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
return () => {
|
|
111
|
+
setCallback('onConsentSet', undefined);
|
|
112
|
+
};
|
|
113
|
+
}, [setCallback]);
|
|
114
|
+
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ConsentBanner
|
|
3
|
+
description: A pre-built consent banner that appears when user consent is needed. Supports custom layout, button arrangement, and full compound component composition.
|
|
4
|
+
---
|
|
5
|
+
`ConsentBanner` is a ready-to-use consent banner that appears automatically in **opt-in jurisdictions** (like GDPR) where explicit consent is required before tracking. In opt-out jurisdictions (like CCPA), the banner won't appear — users get an opt-out mechanism instead. It includes reject, accept, and customize buttons with configurable layout.
|
|
6
|
+
|
|
7
|
+
## Basic Usage
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { ConsentManagerProvider, ConsentBanner } from '@c15t/react';
|
|
11
|
+
|
|
12
|
+
export function ConsentManager() {
|
|
13
|
+
return (
|
|
14
|
+
<ConsentManagerProvider options={{ mode: 'hosted', backendURL: 'https://your-instance.c15t.dev' }}>
|
|
15
|
+
<ConsentBanner />
|
|
16
|
+
</ConsentManagerProvider>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Customizing Content
|
|
22
|
+
|
|
23
|
+
Override the default title, description, and button labels:
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
<ConsentBanner
|
|
27
|
+
title="We value your privacy"
|
|
28
|
+
description="We use cookies to enhance your browsing experience and analyze site traffic."
|
|
29
|
+
acceptButtonText="Accept all"
|
|
30
|
+
rejectButtonText="Reject all"
|
|
31
|
+
customizeButtonText="Manage preferences"
|
|
32
|
+
/>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Button Layout
|
|
36
|
+
|
|
37
|
+
The `layout` prop controls button arrangement. Each item is either a button ID or an array of button IDs (which groups them together):
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
{/* Default: reject and accept grouped, customize separate */}
|
|
41
|
+
<ConsentBanner layout={[['reject', 'accept'], 'customize']} />
|
|
42
|
+
|
|
43
|
+
{/* All buttons in one group */}
|
|
44
|
+
<ConsentBanner layout={[['reject', 'customize', 'accept']]} />
|
|
45
|
+
|
|
46
|
+
{/* Accept first, then reject and customize grouped */}
|
|
47
|
+
<ConsentBanner layout={['accept', ['reject', 'customize']]} />
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
To stack groups vertically, pair the same grouped layout with `direction="column"`:
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<ConsentBanner
|
|
54
|
+
layout={['customize', ['reject', 'accept']]}
|
|
55
|
+
direction="column"
|
|
56
|
+
/>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Policy-Driven UI Profile
|
|
60
|
+
|
|
61
|
+
When using backend runtime policies, `policy.ui.uiProfile` can control banner action presentation:
|
|
62
|
+
|
|
63
|
+
* `compact` — default desktop sizing
|
|
64
|
+
* `balanced` — auto-fills compact and grouped layouts with moderate emphasis
|
|
65
|
+
* `strict` — always fills action controls for explicit, high-clarity layouts
|
|
66
|
+
|
|
67
|
+
## Theme-Level Button Styling
|
|
68
|
+
|
|
69
|
+
Use the provider `theme` prop to control how stock consent actions look:
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
<ConsentManagerProvider
|
|
73
|
+
options={{
|
|
74
|
+
theme: {
|
|
75
|
+
consentActions: {
|
|
76
|
+
default: { mode: 'stroke' },
|
|
77
|
+
accept: { variant: 'primary', mode: 'stroke' },
|
|
78
|
+
customize: { variant: 'neutral', mode: 'ghost' },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
}}
|
|
82
|
+
>
|
|
83
|
+
<ConsentBanner />
|
|
84
|
+
</ConsentManagerProvider>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Policy packs control grouping, ordering, and direction. The theme controls button appearance.
|
|
88
|
+
|
|
89
|
+
### Primary Button
|
|
90
|
+
|
|
91
|
+
Highlight specific button(s) as the primary action:
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
{/* Single primary */}
|
|
95
|
+
<ConsentBanner primaryButton="accept" />
|
|
96
|
+
|
|
97
|
+
{/* Multiple primaries */}
|
|
98
|
+
<ConsentBanner primaryButton={['accept', 'customize']} />
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Legal Links
|
|
102
|
+
|
|
103
|
+
Control which legal links appear in the banner description:
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
{/* Show all configured links (default) */}
|
|
107
|
+
<ConsentBanner legalLinks={undefined} />
|
|
108
|
+
|
|
109
|
+
{/* Show no links */}
|
|
110
|
+
<ConsentBanner legalLinks={null} />
|
|
111
|
+
|
|
112
|
+
{/* Show specific links */}
|
|
113
|
+
<ConsentBanner legalLinks={['privacyPolicy', 'cookiePolicy']} />
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
> ℹ️ **Info:**
|
|
117
|
+
> Legal link URLs are configured in the ConsentManagerProvider options via the legalLinks prop, not on the banner itself.
|
|
118
|
+
|
|
119
|
+
## Compound Components
|
|
120
|
+
|
|
121
|
+
Build fully custom banner layouts using sub-components:
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
<ConsentBanner.Root>
|
|
125
|
+
<ConsentBanner.Overlay />
|
|
126
|
+
<ConsentBanner.Card>
|
|
127
|
+
<ConsentBanner.Header>
|
|
128
|
+
<ConsentBanner.Title />
|
|
129
|
+
<ConsentBanner.Description />
|
|
130
|
+
</ConsentBanner.Header>
|
|
131
|
+
<ConsentBanner.Footer>
|
|
132
|
+
<ConsentBanner.FooterSubGroup>
|
|
133
|
+
<ConsentBanner.RejectButton />
|
|
134
|
+
<ConsentBanner.AcceptButton />
|
|
135
|
+
</ConsentBanner.FooterSubGroup>
|
|
136
|
+
<ConsentBanner.CustomizeButton />
|
|
137
|
+
</ConsentBanner.Footer>
|
|
138
|
+
</ConsentBanner.Card>
|
|
139
|
+
</ConsentBanner.Root>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
* `ConsentBanner.Root` — Outermost container, provides theme context
|
|
143
|
+
* `ConsentBanner.Card` — Main content card with optional focus trapping
|
|
144
|
+
* `ConsentBanner.Header` — Contains title and description
|
|
145
|
+
* `ConsentBanner.Title` — Heading, defaults to translation `consentBanner.title`
|
|
146
|
+
* `ConsentBanner.Description` — Description text, supports `legalLinks` prop
|
|
147
|
+
* `ConsentBanner.Footer` — Action buttons container
|
|
148
|
+
* `ConsentBanner.FooterSubGroup` — Groups related buttons together
|
|
149
|
+
* `ConsentBanner.RejectButton` — Rejects all consent
|
|
150
|
+
* `ConsentBanner.CustomizeButton` — Opens the consent dialog
|
|
151
|
+
* `ConsentBanner.AcceptButton` — Accepts all consent
|
|
152
|
+
* `ConsentBanner.Overlay` — Optional backdrop overlay
|
|
153
|
+
|
|
154
|
+
## Props
|
|
155
|
+
|
|
156
|
+
### ConsentBannerProps
|
|
157
|
+
|
|
158
|
+
|Property|Type|Description|Default|Required|
|
|
159
|
+
|:--|:--|:--|:--|:--:|
|
|
160
|
+
|noStyle|boolean \|undefined|When true, removes all default styling from the component|false|Optional|
|
|
161
|
+
|title|ReactNode|Content to display as the banner's title|undefined|Optional|
|
|
162
|
+
|description|ReactNode|Content to display as the banner's description|undefined|Optional|
|
|
163
|
+
|rejectButtonText|ReactNode|Content to display on the reject button|undefined|Optional|
|
|
164
|
+
|customizeButtonText|ReactNode|Content to display on the customize button|undefined|Optional|
|
|
165
|
+
|acceptButtonText|ReactNode|Content to display on the accept button|undefined|Optional|
|
|
166
|
+
|scrollLock|boolean \|undefined|When true, the consent banner will lock the scroll of the page|false|Optional|
|
|
167
|
+
|trapFocus|boolean \|undefined|When true, the consent banner will trap focus|true|Optional|
|
|
168
|
+
|disableAnimation|boolean \|undefined|When true, disables the entrance/exit animations|false|Optional|
|
|
169
|
+
|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|
|
|
170
|
+
|layout|ConsentBannerLayout \|undefined|Defines the layout of buttons in the footer. Allows reordering and grouping of buttons.|-|Optional|
|
|
171
|
+
|direction|PolicyUiActionDirection \|undefined|Defines how footer button groups flow.|-|Optional|
|
|
172
|
+
|primaryButton|ConsentBannerButton \|undefined|Specifies which button(s) should be highlighted as the primary action.|-|Optional|
|
|
173
|
+
|models|Model \|undefined|Which consent models this banner responds to.|\['opt-in']|Optional|
|
|
174
|
+
|uiSource|string \|undefined|Override the UI source identifier sent with consent API calls.|'banner'|Optional|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ConsentDialogLink
|
|
3
|
+
description: An inline trigger for opening the consent dialog from footers, legal pages, and account settings.
|
|
4
|
+
---
|
|
5
|
+
`ConsentDialogLink` is an inline trigger for opening the consent dialog from places like site footers, legal pages, or account settings. It is unstyled by default, so it inherits your app's typography and link/button styles.
|
|
6
|
+
|
|
7
|
+
## Basic Usage
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { ConsentDialogLink } from '@c15t/react/components/consent-dialog-link';
|
|
11
|
+
|
|
12
|
+
export function SiteFooter() {
|
|
13
|
+
return (
|
|
14
|
+
<footer>
|
|
15
|
+
<ConsentDialogLink>
|
|
16
|
+
Your privacy settings
|
|
17
|
+
</ConsentDialogLink>
|
|
18
|
+
</footer>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Footer Link (unstyled by default)
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
<footer>
|
|
27
|
+
<ConsentDialogLink>
|
|
28
|
+
Your privacy settings
|
|
29
|
+
</ConsentDialogLink>
|
|
30
|
+
</footer>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Render as an Anchor
|
|
34
|
+
|
|
35
|
+
Use `asChild` to keep semantic anchor markup while still opening the dialog:
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
<ConsentDialogLink asChild>
|
|
39
|
+
<a href="#privacy-settings">Manage Preferences</a>
|
|
40
|
+
</ConsentDialogLink>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Optional Styling Control
|
|
44
|
+
|
|
45
|
+
The component defaults to `noStyle={true}`. Set it to `false` if you want c15t button styles:
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<ConsentDialogLink noStyle={false}>
|
|
49
|
+
Privacy Settings
|
|
50
|
+
</ConsentDialogLink>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Props
|
|
54
|
+
|
|
55
|
+
### ConsentDialogLinkProps
|
|
56
|
+
|
|
57
|
+
|Property|Type|Description|Default|Required|
|
|
58
|
+
|:--|:--|:--|:--|:--:|
|
|
59
|
+
|children|ReactNode|Custom trigger content, for example "Your privacy settings" or "Manage preferences".|-|✅ Required|
|
|
@@ -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|
|