@c15t/react 2.0.0-rc.1 → 2.0.0-rc.12
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 +13 -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 +368 -0
- package/docs/callbacks.md +184 -0
- package/docs/components/consent-banner.md +269 -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 +133 -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 +94 -0
- package/docs/iab/consent-dialog.md +134 -0
- package/docs/iab/overview.md +126 -0
- package/docs/iab/use-gvl-data.md +20 -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 +147 -0
- package/docs/policy-packs.md +240 -0
- package/docs/quickstart.md +155 -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,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Optimization
|
|
3
|
+
description: Improve c15t startup performance in React with prefetching, proxy rewrites, and rendering tradeoffs.
|
|
4
|
+
lastModified: 2026-04-14
|
|
5
|
+
---
|
|
6
|
+
Use this guide when you care about banner visibility speed, route static-ness, and reducing backend round-trip cost.
|
|
7
|
+
|
|
8
|
+
## Start Here
|
|
9
|
+
|
|
10
|
+
Apply the optimizations in this order:
|
|
11
|
+
|
|
12
|
+
|Situation|Use|Why|Tradeoff|
|
|
13
|
+
|--|--|--|--|
|
|
14
|
+
|Any production app using hosted mode|Same-origin `/api/c15t` proxy|Lowers browser startup overhead and keeps the backend origin out of client config|Requires framework or platform proxy setup|
|
|
15
|
+
|Banner speed matters on cold loads|`buildPrefetchScript()`|Starts `/init` before your app hydrates|Still a browser-side fetch, not SSR|
|
|
16
|
+
|Your app navigates client-side|Keep the provider mounted at the app root|Avoids remounting and re-running init work|Requires provider placement discipline|
|
|
17
|
+
|You cannot proxy and must stay cross-origin|`<link rel="preconnect">`|Starts DNS/TLS work earlier|Smaller gain than same-origin proxying|
|
|
18
|
+
|You are using Next.js and want SSR or static-route-specific guidance|Next.js optimization docs|Covers `C15tPrefetch`, `fetchInitialData()`, and rendering tradeoffs|Next-specific|
|
|
19
|
+
|
|
20
|
+
> ℹ️ **Info:**
|
|
21
|
+
> Treat same-origin proxying as the baseline optimization. The others are situational layers you add when startup timing or route behavior justifies them.
|
|
22
|
+
|
|
23
|
+
## 1) Prefer Same-Origin Proxy
|
|
24
|
+
|
|
25
|
+
Proxy c15t requests through your app server so the browser calls your own origin instead of a third-party domain.
|
|
26
|
+
|
|
27
|
+
How you configure this depends on your framework — Vite has `server.proxy`, Remix has resource routes, and most deployment platforms support rewrite rules.
|
|
28
|
+
|
|
29
|
+
Then use:
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
<ConsentManagerProvider options={{ backendURL: '/api/c15t', mode: 'hosted' }}>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Why this helps:
|
|
36
|
+
|
|
37
|
+
* Same-origin requests avoid extra DNS/TLS setup in many deployments
|
|
38
|
+
* Ad blockers are less likely to block your init endpoint
|
|
39
|
+
* You can change backend infrastructure without touching client code
|
|
40
|
+
|
|
41
|
+
If you can only do one optimization, do this one first.
|
|
42
|
+
|
|
43
|
+
## 2) Prefetch Init Data Early
|
|
44
|
+
|
|
45
|
+
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>`.
|
|
46
|
+
|
|
47
|
+
In production benchmarks with a same-origin rewrite, prefetching strategies show measurable improvement over client-only init:
|
|
48
|
+
|
|
49
|
+
|Strategy|Scripts loaded|Data request starts|Banner visible|
|
|
50
|
+
|--|--|--|--|
|
|
51
|
+
|Client-only (no prefetch)|baseline|baseline|baseline|
|
|
52
|
+
|Browser prefetch|\~1.3x faster|\~2.6x earlier|\~1.25x faster|
|
|
53
|
+
|Server prefetch|\~2x faster|before page loads|\~1.9x faster|
|
|
54
|
+
|
|
55
|
+
Use this when:
|
|
56
|
+
|
|
57
|
+
* The app is client-rendered
|
|
58
|
+
* You want a faster first banner without introducing SSR complexity
|
|
59
|
+
* You control the HTML template or document `<head>`
|
|
60
|
+
|
|
61
|
+
### Inline Script Prefetch
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
import { buildPrefetchScript } from 'c15t';
|
|
65
|
+
|
|
66
|
+
const prefetchScript = buildPrefetchScript({
|
|
67
|
+
backendURL: '/api/c15t',
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// In your HTML template or root component:
|
|
71
|
+
<head>
|
|
72
|
+
<script dangerouslySetInnerHTML={{ __html: prefetchScript }} />
|
|
73
|
+
</head>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Then initialize your provider normally. Matching prefetched data is consumed automatically by the runtime during first store initialization:
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
import {
|
|
80
|
+
ConsentManagerProvider,
|
|
81
|
+
ConsentBanner,
|
|
82
|
+
ConsentDialog,
|
|
83
|
+
} from '@c15t/react';
|
|
84
|
+
|
|
85
|
+
export default function App({ children }: { children: React.ReactNode }) {
|
|
86
|
+
return (
|
|
87
|
+
<ConsentManagerProvider
|
|
88
|
+
options={{
|
|
89
|
+
mode: 'hosted',
|
|
90
|
+
backendURL: '/api/c15t',
|
|
91
|
+
}}
|
|
92
|
+
>
|
|
93
|
+
<ConsentBanner />
|
|
94
|
+
<ConsentDialog />
|
|
95
|
+
{children}
|
|
96
|
+
</ConsentManagerProvider>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
> ℹ️ **Info:**
|
|
102
|
+
> 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.
|
|
103
|
+
|
|
104
|
+
## Keep The Provider Mounted Across Navigation
|
|
105
|
+
|
|
106
|
+
Mount the consent provider at the app root so route transitions do not remount it.
|
|
107
|
+
|
|
108
|
+
Why this helps:
|
|
109
|
+
|
|
110
|
+
* Avoids re-running init work on client-side navigation
|
|
111
|
+
* Prevents extra callback churn from remount cycles
|
|
112
|
+
* Keeps banner/dialog state stable between route transitions
|
|
113
|
+
|
|
114
|
+
Mount `ConsentManagerProvider` as high in the tree as possible so route transitions do not recreate it.
|
|
115
|
+
|
|
116
|
+
## Animation Performance
|
|
117
|
+
|
|
118
|
+
The default motion tokens are tuned for speed-first product UI:
|
|
119
|
+
|
|
120
|
+
|Token|Duration|Used for|
|
|
121
|
+
|--|--|--|
|
|
122
|
+
|`fast`|80ms|Banner slide + overlay, card scale, button hover, widget entry/exit|
|
|
123
|
+
|`normal`|150ms|Accordion, switch toggle|
|
|
124
|
+
|`slow`|200ms|Dialog trigger snap, tab indicator|
|
|
125
|
+
|
|
126
|
+
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.
|
|
127
|
+
|
|
128
|
+
To customize motion durations and easing, see [Styling](/docs/frameworks/react/styling/overview).
|
|
129
|
+
|
|
130
|
+
## Reduce Network Overhead
|
|
131
|
+
|
|
132
|
+
If your browser must call a cross-origin backend URL directly, add `preconnect` so the browser can warm up the connection earlier. This is a fallback optimization when same-origin proxying is not possible.
|
|
133
|
+
|
|
134
|
+
If you must use a cross-origin backend URL, add preconnect so the browser starts DNS/TLS early:
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
<head>
|
|
138
|
+
<link rel="preconnect" href="https://your-instance.c15t.dev" crossOrigin="" />
|
|
139
|
+
</head>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Next.js-Specific SSR And Static Routes
|
|
143
|
+
|
|
144
|
+
This page is intentionally React-generic. If you are using Next.js and need SSR or static-route-specific guidance:
|
|
145
|
+
|
|
146
|
+
* See [Next.js Optimization](/docs/frameworks/next/optimization) for the static-vs-dynamic decision guide
|
|
147
|
+
* See [Next.js Server-Side Data Fetching](/docs/frameworks/next/server-side) for `fetchInitialData()`
|
|
@@ -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.
|