@c15t/react 2.0.0-rc.1 → 2.0.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -3
- 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/dist/components/consent-banner/atoms/overlay.cjs +1 -1
- package/dist/components/consent-banner/atoms/overlay.js +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-banner/policy-actions.cjs +1 -0
- package/dist/components/consent-banner/policy-actions.js +1 -0
- 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 -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/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 -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/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/footer.js +1 -1
- package/dist/components/consent-widget/atoms/root.cjs +1 -1
- package/dist/components/consent-widget/atoms/root.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/consent-widget/index.cjs +1 -1
- package/dist/components/consent-widget/index.js +1 -1
- package/dist/components/consent-widget/policy-actions.cjs +1 -0
- package/dist/components/consent-widget/policy-actions.js +1 -0
- package/dist/components/consent-widget/types.cjs +1 -1
- package/dist/components/frame/atoms.cjs +1 -1
- package/dist/components/frame/atoms.js +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/button-group.js +1 -1
- package/dist/components/iab-consent-banner/atoms/card.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/card.js +1 -1
- package/dist/components/iab-consent-banner/atoms/description.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/description.js +1 -1
- package/dist/components/iab-consent-banner/atoms/footer.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/footer.js +1 -1
- package/dist/components/iab-consent-banner/atoms/header.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/header.js +1 -1
- package/dist/components/iab-consent-banner/atoms/overlay.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/overlay.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/atoms/title.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/title.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-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/card.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/content.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/content.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/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/overlay.js +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/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/policy-actions.cjs +1 -0
- package/dist/components/shared/policy-actions.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/branding.cjs +1 -0
- package/dist/components/shared/ui/branding.js +1 -0
- 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/logo.js +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/index.js +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 +11 -0
- package/dist/iab/styles.tw3.css +14 -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 +10 -0
- package/dist/styles.tw3.css +13 -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 +44 -14
- package/{dist → dist-types}/components/consent-banner/components.d.ts +4 -5
- package/{dist → dist-types}/components/consent-banner/consent-banner.d.ts +14 -8
- package/{dist → dist-types}/components/consent-banner/error-boundary.d.ts +0 -1
- package/{dist → dist-types}/components/consent-banner/index.d.ts +48 -26
- package/dist-types/components/consent-banner/policy-actions.d.ts +11 -0
- package/{dist → dist-types}/components/consent-dialog/atoms/card.d.ts +14 -8
- package/{dist → dist-types}/components/consent-dialog/atoms/overlay.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/consent-dialog.d.ts +2 -3
- package/{dist → dist-types}/components/consent-dialog/index.d.ts +31 -10
- 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 +1 -2
- 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 +2 -3
- 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-types/components/consent-widget/atoms/accordion.d.ts +28 -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 -7
- package/{dist → dist-types}/components/consent-widget/consent-widget.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/index.d.ts +27 -8
- package/dist-types/components/consent-widget/policy-actions.d.ts +11 -0
- package/{dist → dist-types}/components/consent-widget/types.d.ts +2 -3
- 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 +1 -2
- package/{dist → dist-types}/components/frame/types.d.ts +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 → 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-types/components/shared/policy-actions.d.ts +29 -0
- package/{dist → dist-types}/components/shared/primitives/box.d.ts +0 -1
- package/{dist → dist-types}/components/shared/primitives/button.d.ts +4 -1
- 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 +0 -45
- package/{dist → dist-types}/components/shared/ui/accordion/accordion.d.ts +32 -68
- package/{dist → dist-types}/components/shared/ui/accordion/accordion.types.d.ts +0 -1
- 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-types/components/shared/ui/branding.d.ts +27 -0
- 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 +8 -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-types/components/shared/ui/switch/index.d.ts +2 -0
- package/dist-types/components/shared/ui/switch/switch.d.ts +20 -0
- package/{dist → dist-types}/components/shared/ui/switch/switch.types.d.ts +0 -1
- 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 +0 -1
- 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 +0 -1
- package/dist-types/hooks/use-consent-dialog-trigger.d.ts +10 -0
- package/{dist → dist-types}/hooks/use-consent-manager.d.ts +0 -1
- 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 +2 -2
- 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 +0 -1
- package/dist-types/iab.d.ts +24 -0
- package/{dist → dist-types}/index.d.ts +5 -6
- 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 +0 -1
- 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 +0 -1
- package/{dist → dist-types}/types/consent-manager.d.ts +7 -1
- package/{dist → dist-types}/types/theme/index.d.ts +0 -1
- package/{dist → dist-types}/types/theme/style-keys.d.ts +0 -1
- package/{dist → dist-types}/types/theme/style-types.d.ts +2 -1
- package/{dist → dist-types}/utils/cn.d.ts +0 -1
- 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 +266 -0
- package/docs/callbacks.md +184 -0
- package/docs/components/consent-banner.md +298 -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 +177 -0
- package/docs/components/consent-manager-provider.md +425 -0
- package/docs/components/consent-widget.md +160 -0
- package/docs/components/dev-tools.md +63 -0
- package/docs/components/frame.md +73 -0
- package/docs/concepts/client-modes.md +175 -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 +148 -0
- package/docs/concepts/policy-packs.md +227 -0
- package/docs/headless.md +190 -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 +420 -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 +118 -0
- package/docs/iab/consent-banner.md +92 -0
- package/docs/iab/consent-dialog.md +132 -0
- package/docs/iab/overview.md +125 -0
- package/docs/iab/use-gvl-data.md +208 -0
- package/docs/iframe-blocking.md +107 -0
- package/docs/integrations/building-integrations.md +405 -0
- package/docs/integrations/databuddy.md +203 -0
- package/docs/integrations/google-tag-manager.md +153 -0
- package/docs/integrations/google-tag.md +122 -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 +105 -0
- package/docs/integrations/posthog.md +199 -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 +113 -0
- package/docs/policy-packs.md +240 -0
- package/docs/quickstart.md +152 -0
- package/docs/script-loader.md +321 -0
- package/docs/server-side.md +153 -0
- package/docs/styling/classnames.md +92 -0
- package/docs/styling/color-scheme.md +82 -0
- package/docs/styling/css-variables.md +92 -0
- package/docs/styling/overview.md +459 -0
- package/docs/styling/slots.md +127 -0
- package/docs/styling/tailwind.md +113 -0
- package/docs/styling/tokens.md +216 -0
- package/docs/troubleshooting.md +137 -0
- package/iab/styles.css +1 -0
- package/package.json +85 -25
- package/readme.json +6 -0
- package/src/iab/styles.css +11 -0
- package/src/iab/styles.tw3.css +14 -0
- package/src/styles.css +10 -0
- package/src/styles.tw3.css +13 -0
- package/styles.css +1 -0
- 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 +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/__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 +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/__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 +0 -3
- 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/__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.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,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Network Blocker
|
|
3
|
+
description: Block outgoing network requests to third-party domains until the user grants consent for the appropriate category.
|
|
4
|
+
---
|
|
5
|
+
The network blocker intercepts outgoing `fetch` and `XMLHttpRequest` calls and blocks them based on consent state and domain rules. This catches tracking requests that happen outside of script loading - for example, beacon calls, API requests to analytics endpoints, or pixel fires from already-loaded scripts.
|
|
6
|
+
|
|
7
|
+
## Configuration
|
|
8
|
+
|
|
9
|
+
Add `networkBlocker` to your provider options:
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { type ReactNode } from 'react';
|
|
13
|
+
import { ConsentManagerProvider } from '@c15t/react';
|
|
14
|
+
|
|
15
|
+
export function ConsentManager({ children }: { children: ReactNode }) {
|
|
16
|
+
return (
|
|
17
|
+
<ConsentManagerProvider
|
|
18
|
+
options={{
|
|
19
|
+
mode: 'hosted',
|
|
20
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
21
|
+
networkBlocker: {
|
|
22
|
+
rules: [
|
|
23
|
+
{
|
|
24
|
+
id: 'google-analytics',
|
|
25
|
+
domain: 'google-analytics.com',
|
|
26
|
+
category: 'measurement',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'facebook-pixel',
|
|
30
|
+
domain: 'facebook.com',
|
|
31
|
+
pathIncludes: '/tr',
|
|
32
|
+
category: 'marketing',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'analytics-post',
|
|
36
|
+
domain: 'analytics.example.com',
|
|
37
|
+
methods: ['POST'],
|
|
38
|
+
category: 'measurement',
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
}}
|
|
43
|
+
>
|
|
44
|
+
{children}
|
|
45
|
+
</ConsentManagerProvider>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Rule Matching
|
|
51
|
+
|
|
52
|
+
Rules match requests using three criteria:
|
|
53
|
+
|
|
54
|
+
### Domain matching
|
|
55
|
+
|
|
56
|
+
The `domain` field matches the request hostname. Subdomains are automatically included - a rule for `google-analytics.com` also matches `www.google-analytics.com` and `stats.google-analytics.com`.
|
|
57
|
+
|
|
58
|
+
### Path matching
|
|
59
|
+
|
|
60
|
+
The optional `pathIncludes` field requires the request URL path to contain the specified substring. This lets you target specific endpoints without blocking the entire domain.
|
|
61
|
+
|
|
62
|
+
### Method matching
|
|
63
|
+
|
|
64
|
+
The optional `methods` array restricts the rule to specific HTTP methods. If omitted, the rule applies to all methods.
|
|
65
|
+
|
|
66
|
+
## Consent Conditions
|
|
67
|
+
|
|
68
|
+
Like the script loader, `category` accepts a `HasCondition`:
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
// Simple
|
|
72
|
+
{ category: 'measurement' }
|
|
73
|
+
|
|
74
|
+
// Must have both
|
|
75
|
+
{ category: { and: ['measurement', 'marketing'] } }
|
|
76
|
+
|
|
77
|
+
// Must have either
|
|
78
|
+
{ category: { or: ['measurement', 'marketing'] } }
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Monitoring Blocked Requests
|
|
82
|
+
|
|
83
|
+
### Console logging
|
|
84
|
+
|
|
85
|
+
Blocked requests are logged to the console by default. Disable with `logBlockedRequests: false`.
|
|
86
|
+
|
|
87
|
+
### Callback
|
|
88
|
+
|
|
89
|
+
Use `onRequestBlocked` to handle blocked requests programmatically:
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
networkBlocker: {
|
|
93
|
+
rules: [...],
|
|
94
|
+
onRequestBlocked: ({ method, url, rule }) => {
|
|
95
|
+
console.log(`Blocked ${method} ${url} (rule: ${rule?.id})`);
|
|
96
|
+
},
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Runtime Updates
|
|
101
|
+
|
|
102
|
+
Update the network blocker configuration at runtime:
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
import { useConsentManager } from '@c15t/react';
|
|
106
|
+
|
|
107
|
+
function NetworkBlockerManager() {
|
|
108
|
+
const { setNetworkBlocker } = useConsentManager();
|
|
109
|
+
|
|
110
|
+
const addRule = () => {
|
|
111
|
+
setNetworkBlocker({
|
|
112
|
+
rules: [
|
|
113
|
+
{
|
|
114
|
+
id: 'new-tracker',
|
|
115
|
+
domain: 'tracker.example.com',
|
|
116
|
+
category: 'marketing',
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## API Reference
|
|
125
|
+
|
|
126
|
+
### NetworkBlockerRule
|
|
127
|
+
|
|
128
|
+
|Property|Type|Description|Default|Required|
|
|
129
|
+
|:--|:--|:--|:--|:--:|
|
|
130
|
+
|id|string \|undefined|Optional identifier for the rule. Useful for debugging and logging.|-|Optional|
|
|
131
|
+
|domain|string|Domain that this rule applies to.|-|✅ Required|
|
|
132
|
+
|pathIncludes|string \|undefined|Optional path substring that must be present in the request path for the rule to apply.|-|Optional|
|
|
133
|
+
|methods|string\[] \|undefined|Optional list of HTTP methods that this rule applies to. If omitted, the rule applies to all methods.|-|Optional|
|
|
134
|
+
|category|HasCondition\<AllConsentNames>|Consent condition that must be satisfied to allow the request. When this condition is not satisfied, matching requests will be blocked.|-|✅ Required|
|
|
135
|
+
|
|
136
|
+
### NetworkBlockerConfig
|
|
137
|
+
|
|
138
|
+
|Property|Type|Description|Default|Required|
|
|
139
|
+
|:--|:--|:--|:--|:--:|
|
|
140
|
+
|enabled|boolean \|undefined|Whether the network blocker is enabled.|-|Optional|
|
|
141
|
+
|initialConsents|ConsentState \|undefined|The consent state snapshot that is currently used for blocking logic.|-|Optional|
|
|
142
|
+
|logBlockedRequests|boolean \|undefined|Whether to automatically log blocked requests to the console.|-|Optional|
|
|
143
|
+
|onRequestBlocked|Object \|undefined|Callback invoked whenever a request is blocked.|-|Optional|
|
|
144
|
+
|rules|NetworkBlockerRule|Domain rules that determine which requests should be blocked.|-|✅ Required|
|
|
145
|
+
|
|
146
|
+
#### `initialConsents` ConsentState
|
|
147
|
+
|
|
148
|
+
The consent state snapshot that is currently used for blocking logic.
|
|
149
|
+
|
|
150
|
+
|Property|Type|Description|Default|Required|
|
|
151
|
+
|:--|:--|:--|:--|:--:|
|
|
152
|
+
|experience|boolean|-|-|✅ Required|
|
|
153
|
+
|functionality|boolean|-|-|✅ Required|
|
|
154
|
+
|marketing|boolean|-|-|✅ Required|
|
|
155
|
+
|measurement|boolean|-|-|✅ Required|
|
|
156
|
+
|necessary|boolean|-|-|✅ Required|
|
|
157
|
+
|
|
158
|
+
#### `onRequestBlocked`
|
|
159
|
+
|
|
160
|
+
Callback invoked whenever a request is blocked.
|
|
161
|
+
|
|
162
|
+
|Property|Type|Description|Default|Required|
|
|
163
|
+
|:--|:--|:--|:--|:--:|
|
|
164
|
+
|method|string|The HTTP method of the blocked request (e.g. GET, POST).|-|✅ Required|
|
|
165
|
+
|url|string|The URL of the blocked request.|-|✅ Required|
|
|
166
|
+
|rule|NetworkBlockerRule \|undefined|The rule that caused the request to be blocked, if available. Can be undefined when the blocker configuration changed between evaluation and logging.|-|Optional|
|
|
167
|
+
|
|
168
|
+
#### `rules` NetworkBlockerRule
|
|
169
|
+
|
|
170
|
+
Domain rules that determine which requests should be blocked.
|
|
171
|
+
|
|
172
|
+
|Property|Type|Description|Default|Required|
|
|
173
|
+
|:--|:--|:--|:--|:--:|
|
|
174
|
+
|id|string \|undefined|Optional identifier for the rule. Useful for debugging and logging.|-|Optional|
|
|
175
|
+
|domain|string|Domain that this rule applies to.|-|✅ Required|
|
|
176
|
+
|pathIncludes|string \|undefined|Optional path substring that must be present in the request path for the rule to apply.|-|Optional|
|
|
177
|
+
|methods|string\[] \|undefined|Optional list of HTTP methods that this rule applies to. If omitted, the rule applies to all methods.|-|Optional|
|
|
178
|
+
|category|HasCondition\<AllConsentNames>|Consent condition that must be satisfied to allow the request. When this condition is not satisfied, matching requests will be blocked.|-|✅ Required|
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Optimization
|
|
3
|
+
description: Improve c15t startup performance in React with prefetching, proxy rewrites, and rendering tradeoffs.
|
|
4
|
+
lastModified: 2026-03-17
|
|
5
|
+
---
|
|
6
|
+
Use this guide when you care about banner visibility speed, route static-ness, and reducing backend round-trip cost.
|
|
7
|
+
|
|
8
|
+
## 1) Prefer Same-Origin Proxy
|
|
9
|
+
|
|
10
|
+
Proxy c15t requests through your app server so the browser calls your own origin instead of a third-party domain.
|
|
11
|
+
|
|
12
|
+
How you configure this depends on your framework — Vite has `server.proxy`, Remix has resource routes, and most deployment platforms support rewrite rules.
|
|
13
|
+
|
|
14
|
+
Then use:
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
<ConsentManagerProvider options={{ backendURL: '/api/c15t', mode: 'hosted' }}>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Why this helps:
|
|
21
|
+
|
|
22
|
+
* Same-origin requests avoid extra DNS/TLS setup in many deployments
|
|
23
|
+
* Ad blockers are less likely to block your init endpoint
|
|
24
|
+
* You can change backend infrastructure without touching client code
|
|
25
|
+
|
|
26
|
+
## 2) Prefetch Init Data Early
|
|
27
|
+
|
|
28
|
+
Use `buildPrefetchScript()` from the `c15t` core package to start the `/init` request before your app hydrates. Inject the script as early as possible in your HTML `<head>`.
|
|
29
|
+
|
|
30
|
+
In production benchmarks with a same-origin rewrite, prefetching strategies show measurable improvement over client-only init:
|
|
31
|
+
|
|
32
|
+
|Strategy|Scripts loaded|Data request starts|Banner visible|
|
|
33
|
+
|--|--|--|--|
|
|
34
|
+
|Client-only (no prefetch)|baseline|baseline|baseline|
|
|
35
|
+
|Browser prefetch|\~1.3x faster|\~2.6x earlier|\~1.25x faster|
|
|
36
|
+
|Server prefetch|\~2x faster|before page loads|\~1.9x faster|
|
|
37
|
+
|
|
38
|
+
### Inline Script Prefetch
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
import { buildPrefetchScript } from 'c15t';
|
|
42
|
+
|
|
43
|
+
const prefetchScript = buildPrefetchScript({
|
|
44
|
+
backendURL: '/api/c15t',
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// In your HTML template or root component:
|
|
48
|
+
<head>
|
|
49
|
+
<script dangerouslySetInnerHTML={{ __html: prefetchScript }} />
|
|
50
|
+
</head>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Then initialize your provider normally. Matching prefetched data is consumed automatically by the runtime during first store initialization:
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
import {
|
|
57
|
+
ConsentManagerProvider,
|
|
58
|
+
ConsentBanner,
|
|
59
|
+
ConsentDialog,
|
|
60
|
+
} from '@c15t/react';
|
|
61
|
+
|
|
62
|
+
export default function App({ children }: { children: React.ReactNode }) {
|
|
63
|
+
return (
|
|
64
|
+
<ConsentManagerProvider
|
|
65
|
+
options={{
|
|
66
|
+
mode: 'hosted',
|
|
67
|
+
backendURL: '/api/c15t',
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
<ConsentBanner />
|
|
71
|
+
<ConsentDialog />
|
|
72
|
+
{children}
|
|
73
|
+
</ConsentManagerProvider>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
> ℹ️ **Info:**
|
|
79
|
+
> If overrides.gpc conflicts with the browser's ambient GPC signal, the prefetched entry is not reused and c15t falls back to a normal client /init.
|
|
80
|
+
|
|
81
|
+
## Keep The Provider Mounted Across Navigation
|
|
82
|
+
|
|
83
|
+
Mount the consent provider at the app root so route transitions do not remount it.
|
|
84
|
+
|
|
85
|
+
Why this helps:
|
|
86
|
+
|
|
87
|
+
* Avoids re-running init work on client-side navigation
|
|
88
|
+
* Prevents extra callback churn from remount cycles
|
|
89
|
+
* Keeps banner/dialog state stable between route transitions
|
|
90
|
+
|
|
91
|
+
## Animation Performance
|
|
92
|
+
|
|
93
|
+
The default motion tokens are tuned for speed-first product UI:
|
|
94
|
+
|
|
95
|
+
|Token|Duration|Used for|
|
|
96
|
+
|--|--|--|
|
|
97
|
+
|`fast`|80ms|Banner slide + overlay, card scale, button hover, widget entry/exit|
|
|
98
|
+
|`normal`|150ms|Accordion, switch toggle|
|
|
99
|
+
|`slow`|200ms|Dialog trigger snap, tab indicator|
|
|
100
|
+
|
|
101
|
+
These defaults follow the principle that product UI should be fast and purposeful — animations exist for spatial continuity, not decoration. In benchmarks, animation duration contributes a constant floor to "data fetched → banner visible" timing. The default tokens sit at the lower end of standard UI ranges (80-200ms) to minimize that floor.
|
|
102
|
+
|
|
103
|
+
To customize motion durations and easing, see [Styling](/docs/frameworks/react/styling/overview).
|
|
104
|
+
|
|
105
|
+
## Reduce Network Overhead
|
|
106
|
+
|
|
107
|
+
If you must use a cross-origin backend URL, add preconnect so the browser starts DNS/TLS early:
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
<head>
|
|
111
|
+
<link rel="preconnect" href="https://your-instance.c15t.dev" crossOrigin="" />
|
|
112
|
+
</head>
|
|
113
|
+
```
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Policy Packs
|
|
3
|
+
description: Configure regional consent policies in React — hosted mode, presets, and offline fallback.
|
|
4
|
+
---
|
|
5
|
+
Policy packs configure how c15t handles regional consent — which model (opt-in, opt-out, none), which categories, and what UI to show. The backend resolves the right policy automatically based on the visitor's location.
|
|
6
|
+
|
|
7
|
+
**For most apps, you just need a `ConsentManagerProvider` pointing at your backend with presets configured there.** The frontend receives the resolved policy via the `/init` response — no client-side policy config required.
|
|
8
|
+
|
|
9
|
+
When a backend isn't available — local development, static previews, Storybook, automated tests, or as a resilience fallback during a temporary outage — you can pass policies directly to the provider via `offlinePolicy.policyPacks` and c15t resolves them locally.
|
|
10
|
+
|
|
11
|
+
> ℹ️ **Info:**
|
|
12
|
+
> For QA and testing, use the c15t DevTools to simulate different regions and policy responses against your real backend, rather than switching to offline mode.
|
|
13
|
+
|
|
14
|
+
## Hosted Mode (Recommended)
|
|
15
|
+
|
|
16
|
+
When using inth.com or a self-hosted backend, the provider connects automatically. No policy configuration is needed on the frontend:
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
<ConsentManagerProvider
|
|
20
|
+
options={{
|
|
21
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
22
|
+
}}
|
|
23
|
+
>
|
|
24
|
+
<ConsentBanner />
|
|
25
|
+
<ConsentDialog />
|
|
26
|
+
{children}
|
|
27
|
+
</ConsentManagerProvider>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The backend resolves the correct policy based on the visitor's geo data and returns it in the `/init` response. Configure your presets on the backend side.
|
|
31
|
+
|
|
32
|
+
## Offline Presets (Development and Fallback)
|
|
33
|
+
|
|
34
|
+
Use offline presets mainly for local development, Storybook, deterministic tests, or temporary backend outages:
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
import { policyPackPresets } from '@c15t/react';
|
|
38
|
+
|
|
39
|
+
offlinePolicy: {
|
|
40
|
+
i18n: {
|
|
41
|
+
defaultProfile: 'default',
|
|
42
|
+
messages: {
|
|
43
|
+
default: {
|
|
44
|
+
translations: {
|
|
45
|
+
en: { cookieBanner: { title: 'Privacy choices' } },
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
eu: {
|
|
49
|
+
fallbackLanguage: 'en',
|
|
50
|
+
translations: {
|
|
51
|
+
en: { cookieBanner: { title: 'EU GDPR Consent' } },
|
|
52
|
+
fr: { cookieBanner: { title: 'Consentement RGPD' } },
|
|
53
|
+
de: { cookieBanner: { title: 'GDPR-Einwilligung' } },
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
policyPacks: [
|
|
59
|
+
{
|
|
60
|
+
...policyPackPresets.europeOptIn(),
|
|
61
|
+
i18n: { messageProfile: 'eu' },
|
|
62
|
+
},
|
|
63
|
+
policyPackPresets.californiaOptOut(),
|
|
64
|
+
policyPackPresets.worldNoBanner(),
|
|
65
|
+
],
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Available presets:
|
|
70
|
+
|
|
71
|
+
|Preset|Model|Matches|
|
|
72
|
+
|--|--|--|
|
|
73
|
+
|`europeOptIn()`|`opt-in`|EEA + UK countries + geo fallback|
|
|
74
|
+
|`europeIab()`|`iab`|EEA + UK countries + geo fallback (TCF 2.3)|
|
|
75
|
+
|`californiaOptOut()`|`opt-out`|US-CA region|
|
|
76
|
+
|`quebecOptIn()`|`opt-in`|CA-QC region|
|
|
77
|
+
|`worldNoBanner()`|`none`|default fallback|
|
|
78
|
+
|
|
79
|
+
## React Example (Hosted)
|
|
80
|
+
|
|
81
|
+
Point the provider at your backend — policy resolution happens server-side:
|
|
82
|
+
|
|
83
|
+
```tsx
|
|
84
|
+
import type { ReactNode } from 'react';
|
|
85
|
+
import {
|
|
86
|
+
ConsentBanner,
|
|
87
|
+
ConsentDialog,
|
|
88
|
+
ConsentManagerProvider,
|
|
89
|
+
} from '@c15t/react';
|
|
90
|
+
|
|
91
|
+
export function ConsentManager({ children }: { children: ReactNode }) {
|
|
92
|
+
return (
|
|
93
|
+
<ConsentManagerProvider
|
|
94
|
+
options={{
|
|
95
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
96
|
+
}}
|
|
97
|
+
>
|
|
98
|
+
<ConsentBanner />
|
|
99
|
+
<ConsentDialog />
|
|
100
|
+
{children}
|
|
101
|
+
</ConsentManagerProvider>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Offline / Fallback
|
|
107
|
+
|
|
108
|
+
For local development, previews, automated tests, or when the backend is temporarily unreachable, pass policies directly:
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
import type { ReactNode } from 'react';
|
|
112
|
+
import {
|
|
113
|
+
ConsentBanner,
|
|
114
|
+
ConsentDialog,
|
|
115
|
+
ConsentManagerProvider,
|
|
116
|
+
policyPackPresets,
|
|
117
|
+
} from '@c15t/react';
|
|
118
|
+
|
|
119
|
+
export function ConsentManager({ children }: { children: ReactNode }) {
|
|
120
|
+
return (
|
|
121
|
+
<ConsentManagerProvider
|
|
122
|
+
options={{
|
|
123
|
+
mode: 'offline',
|
|
124
|
+
offlinePolicy: {
|
|
125
|
+
policyPacks: [
|
|
126
|
+
policyPackPresets.europeOptIn(),
|
|
127
|
+
policyPackPresets.californiaOptOut(),
|
|
128
|
+
policyPackPresets.worldNoBanner(),
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
overrides: {
|
|
132
|
+
country: 'DE', // Preview as a German visitor
|
|
133
|
+
},
|
|
134
|
+
}}
|
|
135
|
+
>
|
|
136
|
+
<ConsentBanner />
|
|
137
|
+
<ConsentDialog />
|
|
138
|
+
{children}
|
|
139
|
+
</ConsentManagerProvider>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Provider Shape
|
|
145
|
+
|
|
146
|
+
Configure packs through `offlinePolicy.policyPacks`. Add `offlinePolicy.i18n`
|
|
147
|
+
when you want local previews or fallback behavior to mirror hosted policy-profile language behavior:
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
<ConsentManagerProvider
|
|
151
|
+
options={{
|
|
152
|
+
mode: 'offline',
|
|
153
|
+
offlinePolicy: {
|
|
154
|
+
i18n: {
|
|
155
|
+
defaultProfile: 'default',
|
|
156
|
+
messages: {
|
|
157
|
+
default: {
|
|
158
|
+
translations: {
|
|
159
|
+
en: { cookieBanner: { title: 'Privacy choices' } },
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
qc: {
|
|
163
|
+
fallbackLanguage: 'fr',
|
|
164
|
+
translations: {
|
|
165
|
+
en: { cookieBanner: { title: 'Quebec Privacy Settings' } },
|
|
166
|
+
fr: { cookieBanner: { title: 'Paramètres de confidentialité du Québec' } },
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
policyPacks: [
|
|
172
|
+
{
|
|
173
|
+
id: 'qc_opt_in',
|
|
174
|
+
match: { regions: [{ country: 'CA', region: 'QC' }] },
|
|
175
|
+
i18n: { messageProfile: 'qc' },
|
|
176
|
+
consent: { model: 'opt-in', expiryDays: 365 },
|
|
177
|
+
ui: { mode: 'banner' },
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: 'default',
|
|
181
|
+
match: { isDefault: true },
|
|
182
|
+
consent: { model: 'none' },
|
|
183
|
+
ui: { mode: 'none' },
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
overrides: { country: 'CA', region: 'QC' },
|
|
188
|
+
}}
|
|
189
|
+
>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
With that setup, offline mode resolves language the same way as hosted mode:
|
|
193
|
+
|
|
194
|
+
* the active policy profile defines the allowed language set
|
|
195
|
+
* each profile can define its own `fallbackLanguage`
|
|
196
|
+
* built-in translations only fill missing keys for the selected language
|
|
197
|
+
|
|
198
|
+
## Fallback Behavior
|
|
199
|
+
|
|
200
|
+
|Configuration|Result|
|
|
201
|
+
|--|--|
|
|
202
|
+
|`offlinePolicy.policyPacks` omitted|Synthetic opt-in fallback banner (also used for hosted network fallback)|
|
|
203
|
+
|`offlinePolicy: { policyPacks: [] }`|Explicit no-banner mode|
|
|
204
|
+
|Non-empty pack, no match, no default|Explicit no-banner mode|
|
|
205
|
+
|
|
206
|
+
Omitting the option gives you a safe opt-in default for local development and outage scenarios. Providing it tells c15t you want deterministic preview or fallback behavior exactly as configured.
|
|
207
|
+
|
|
208
|
+
## QA and Debugging
|
|
209
|
+
|
|
210
|
+
The best way to test regional consent behavior is with the [c15t DevTools](/docs/frameworks/react/dev-tools). The DevTools Policy panel lets you simulate different countries, regions, and GPC signals against your real backend — no code changes needed.
|
|
211
|
+
|
|
212
|
+
For deeper inspection:
|
|
213
|
+
|
|
214
|
+
* Read `policy` and `policyDecision` from `useConsentManager()` to see the resolved config
|
|
215
|
+
* Open the DevTools Policy panel to inspect matcher resolution and fingerprints
|
|
216
|
+
* Compare your frontend preview with the backend `/init` response before shipping
|
|
217
|
+
|
|
218
|
+
If you need fully deterministic resolution without a backend during testing or preview work (for example, in automated tests or Storybook), pair `offlinePolicy.policyPacks` with `overrides`:
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
options={{
|
|
222
|
+
mode: 'offline',
|
|
223
|
+
offlinePolicy: {
|
|
224
|
+
policyPacks: [
|
|
225
|
+
policyPackPresets.europeOptIn(),
|
|
226
|
+
policyPackPresets.californiaOptOut(),
|
|
227
|
+
policyPackPresets.worldNoBanner(),
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
overrides: {
|
|
231
|
+
country: 'US',
|
|
232
|
+
region: 'CA',
|
|
233
|
+
language: 'en-US',
|
|
234
|
+
gpc: true, // Simulate Global Privacy Control
|
|
235
|
+
},
|
|
236
|
+
}}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
> ℹ️ **Info:**
|
|
240
|
+
> For the full concept model (matchers, scope modes, re-prompting), see Policy Packs concepts. For backend setup, see the self-host guide.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Quickstart
|
|
3
|
+
description: Add consent management to your React app in under 5 minutes.
|
|
4
|
+
lastModified: 2026-02-10
|
|
5
|
+
availableIn:
|
|
6
|
+
- framework: 'javascript'
|
|
7
|
+
url: '/docs/frameworks/javascript/quickstart'
|
|
8
|
+
title: 'JavaScript'
|
|
9
|
+
- framework: 'react'
|
|
10
|
+
url: '/docs/frameworks/react/quickstart'
|
|
11
|
+
title: 'React'
|
|
12
|
+
- framework: 'next'
|
|
13
|
+
url: '/docs/frameworks/next/quickstart'
|
|
14
|
+
title: 'Next.js'
|
|
15
|
+
---
|
|
16
|
+
## Via CLI
|
|
17
|
+
|
|
18
|
+
|Package manager|Command|
|
|
19
|
+
|:--|:--|
|
|
20
|
+
|npm|`npx @c15t/cli@rc`|
|
|
21
|
+
|pnpm|`pnpm dlx @c15t/cli@rc`|
|
|
22
|
+
|yarn|`yarn dlx @c15t/cli@rc`|
|
|
23
|
+
|bun|`bunx @c15t/cli@rc`|
|
|
24
|
+
|
|
25
|
+
## Manual Installation
|
|
26
|
+
|
|
27
|
+
1. **Install package**
|
|
28
|
+
|
|
29
|
+
|Package manager|Command|
|
|
30
|
+
|:--|:--|
|
|
31
|
+
|npm|`npm install @c15t/react`|
|
|
32
|
+
|pnpm|`pnpm add @c15t/react`|
|
|
33
|
+
|yarn|`yarn add @c15t/react`|
|
|
34
|
+
|bun|`bun add @c15t/react`|
|
|
35
|
+
|
|
36
|
+
2. **Import styles** Import the prebuilt component stylesheet in your app-level CSS entrypoint. This is required for styled components to render correctly.
|
|
37
|
+
|
|
38
|
+
```css
|
|
39
|
+
@import "@c15t/react/styles.css";
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Keeping the c15t stylesheet in your global CSS entrypoint makes layer and cascade order explicit. JS/TSX side-effect imports can load in a different order across framework and Tailwind tooling, which makes style regressions harder to debug.
|
|
43
|
+
|
|
44
|
+
> ℹ️ Info:
|
|
45
|
+
>
|
|
46
|
+
> If you are using the headless API or fully custom styling, you can skip this import. src/main.tsx should keep importing ./index.css as usual.
|
|
47
|
+
|
|
48
|
+
3. **Create ConsentManager components** Create a provider component with the consent UI and a wrapper that re-exports it. This initializes the consent store and makes consent state available to all child components.
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
'use client';
|
|
52
|
+
|
|
53
|
+
import { type ReactNode } from 'react';
|
|
54
|
+
import { ConsentManagerProvider, ConsentBanner, ConsentDialog } from '@c15t/react';
|
|
55
|
+
|
|
56
|
+
export default function ConsentManagerClient({ children }: { children: ReactNode }) {
|
|
57
|
+
return (
|
|
58
|
+
<ConsentManagerProvider
|
|
59
|
+
options={{
|
|
60
|
+
mode: 'hosted',
|
|
61
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
62
|
+
consentCategories: ['necessary', 'measurement', 'marketing'],
|
|
63
|
+
// Shows banner during development. Remove for production.
|
|
64
|
+
overrides: { country: 'DE' },
|
|
65
|
+
}}
|
|
66
|
+
>
|
|
67
|
+
<ConsentBanner />
|
|
68
|
+
<ConsentDialog />
|
|
69
|
+
{children}
|
|
70
|
+
</ConsentManagerProvider>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
import type { ReactNode } from 'react';
|
|
77
|
+
import ConsentManagerProvider from './provider';
|
|
78
|
+
|
|
79
|
+
export function ConsentManager({ children }: { children: ReactNode }) {
|
|
80
|
+
return <ConsentManagerProvider>{children}</ConsentManagerProvider>;
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
> ℹ️ Info:
|
|
85
|
+
>
|
|
86
|
+
> Hosted mode is the recommended production setup because the backend resolves jurisdiction and policy, keeps durable consent records, and lets c15t recover from temporary network failures by re-syncing later.
|
|
87
|
+
>
|
|
88
|
+
> ℹ️ Info:
|
|
89
|
+
>
|
|
90
|
+
> Don't have a backend yet? You can use mode: 'offline' for local-only consent storage, but it gives up backend audit history, server-side consent awareness, and automatic jurisdiction detection. Review the browser-only storage consequences before choosing it for production.
|
|
91
|
+
|
|
92
|
+
4. **Mount ConsentManager at the app root** Wrap your existing app tree with ConsentManager so all routes/components can access consent state.
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
import { ConsentManager } from './components/consent-manager';
|
|
96
|
+
|
|
97
|
+
export default function App() {
|
|
98
|
+
return (
|
|
99
|
+
<ConsentManager>
|
|
100
|
+
{/* your existing app */}
|
|
101
|
+
</ConsentManager>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
5. **Verify it works** Start your development server and confirm:
|
|
107
|
+
|
|
108
|
+
A consent banner appears at the bottom of the pageClicking "Customize" opens a dialog with toggles for each consent categoryAfter accepting or rejecting, the banner dismisses and your choice persists across page reloads
|
|
109
|
+
|
|
110
|
+
## Optional: Add DevTools
|
|
111
|
+
|
|
112
|
+
Install DevTools only if you want a runtime inspector while building and debugging:
|
|
113
|
+
|
|
114
|
+
|Package manager|Command|
|
|
115
|
+
|:--|:--|
|
|
116
|
+
|npm|`npm install @c15t/dev-tools`|
|
|
117
|
+
|pnpm|`pnpm add @c15t/dev-tools`|
|
|
118
|
+
|yarn|`yarn add @c15t/dev-tools`|
|
|
119
|
+
|bun|`bun add @c15t/dev-tools`|
|
|
120
|
+
|
|
121
|
+
Then add it inside your existing provider:
|
|
122
|
+
|
|
123
|
+
```tsx title="components/consent-manager/provider.tsx"
|
|
124
|
+
import { DevTools } from '@c15t/dev-tools/react';
|
|
125
|
+
|
|
126
|
+
// ...
|
|
127
|
+
|
|
128
|
+
<ConsentManagerProvider options={...}>
|
|
129
|
+
<ConsentBanner />
|
|
130
|
+
<ConsentDialog />
|
|
131
|
+
{process.env.NODE_ENV !== 'production' && <DevTools />}
|
|
132
|
+
{children}
|
|
133
|
+
</ConsentManagerProvider>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
> ℹ️ **Info:**
|
|
137
|
+
> Want to understand what's happening under the hood? See Initialization Flow for the lifecycle and Cookie Management for script/cookie behavior and revocation handling.
|
|
138
|
+
|
|
139
|
+
## Optional: AI Agents
|
|
140
|
+
|
|
141
|
+
Install c15t agent skills to let AI agents help with styling, i18n, scripts & other configuration.
|
|
142
|
+
|
|
143
|
+
|Package manager|Command|
|
|
144
|
+
|:--|:--|
|
|
145
|
+
|npm|`npx @c15t/cli@rc skills`|
|
|
146
|
+
|pnpm|`pnpm dlx @c15t/cli@rc skills`|
|
|
147
|
+
|yarn|`yarn dlx @c15t/cli@rc skills`|
|
|
148
|
+
|bun|`bunx @c15t/cli@rc skills`|
|
|
149
|
+
|
|
150
|
+
See [AI Agents](/docs/ai-agents) for bundled package docs and agent skills.
|
|
151
|
+
|
|
152
|
+
## Next steps
|