@c15t/react 2.0.0-rc.4 → 2.0.0-rc.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/consent-banner/atoms/root.cjs +1 -1
- package/dist/components/consent-banner/atoms/root.js +1 -1
- package/dist/components/consent-banner/consent-banner.cjs +1 -1
- package/dist/components/consent-banner/consent-banner.js +1 -1
- package/dist/components/consent-dialog/atoms/root.cjs +1 -1
- package/dist/components/consent-dialog/atoms/root.js +1 -1
- package/dist/components/consent-dialog/consent-dialog.cjs +1 -1
- package/dist/components/consent-dialog/consent-dialog.js +1 -1
- package/dist/components/consent-dialog-trigger/atoms/root.cjs +1 -1
- package/dist/components/consent-dialog-trigger/atoms/root.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/consent-widget.cjs +1 -1
- package/dist/components/consent-widget/consent-widget.js +1 -1
- package/dist/components/frame/frame.cjs +1 -1
- package/dist/components/frame/frame.js +1 -1
- package/dist/components/iab-consent-banner/atoms/root.cjs +1 -1
- package/dist/components/iab-consent-banner/atoms/root.js +1 -1
- package/dist/components/iab-consent-banner/iab-consent-banner.cjs +1 -1
- package/dist/components/iab-consent-banner/iab-consent-banner.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/footer.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/footer.js +1 -1
- package/dist/components/iab-consent-dialog/atoms/root.cjs +1 -1
- package/dist/components/iab-consent-dialog/atoms/root.js +1 -1
- package/dist/components/iab-consent-dialog/iab-consent-dialog.cjs +1 -1
- package/dist/components/iab-consent-dialog/iab-consent-dialog.js +1 -1
- package/dist/components/shared/libs/policy-actions.cjs +1 -0
- package/dist/components/shared/libs/policy-actions.js +1 -0
- package/dist/components/shared/primitives/button.cjs +1 -1
- package/dist/components/shared/primitives/button.js +1 -1
- package/dist/headless.cjs +1 -1
- package/dist/headless.js +1 -1
- package/dist/hooks/index.cjs +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/use-consent-dialog-trigger.cjs +1 -0
- package/dist/hooks/use-consent-dialog-trigger.js +1 -0
- package/dist/hooks/use-consent-manager.cjs +1 -1
- package/dist/hooks/use-consent-manager.js +1 -1
- package/dist/hooks/use-headless-consent-ui.cjs +1 -0
- package/dist/hooks/use-headless-consent-ui.js +1 -0
- package/dist/hooks/use-headless-iab-consent-ui.cjs +1 -0
- package/dist/hooks/use-headless-iab-consent-ui.js +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/providers/consent-manager-provider.cjs +1 -1
- package/dist/providers/consent-manager-provider.js +1 -1
- package/dist/server/fetch-ssr-data.cjs +1 -1
- package/dist/server/fetch-ssr-data.js +1 -1
- package/dist/server/headers.cjs +1 -1
- package/dist/server/headers.js +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/init-cache-key.cjs +1 -0
- package/dist/server/init-cache-key.js +1 -0
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/{dist → dist-types}/components/consent-banner/atoms/overlay.d.ts +0 -1
- package/{dist → dist-types}/components/consent-banner/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/consent-banner/components.d.ts +0 -1
- package/{dist → dist-types}/components/consent-banner/consent-banner.d.ts +8 -7
- package/{dist → dist-types}/components/consent-banner/error-boundary.d.ts +0 -1
- package/{dist → dist-types}/components/consent-banner/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog/atoms/card.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog/atoms/overlay.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/consent-dialog.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-link/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/atoms/button.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/atoms/icon.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/atoms/root.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/atoms/text.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/consent-dialog-trigger.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-dialog-trigger/types.d.ts +1 -2
- package/{dist → dist-types}/components/consent-dialog-trigger/use-draggable.d.ts +1 -2
- package/{dist → dist-types}/components/consent-preferences-link/consent-preferences-link.d.ts +0 -1
- package/{dist → dist-types}/components/consent-preferences-link/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/atoms/accordion.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/atoms/button.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/atoms/footer.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/atoms/root.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/consent-widget.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/index.d.ts +0 -1
- package/{dist → dist-types}/components/consent-widget/types.d.ts +0 -1
- package/{dist → dist-types}/components/frame/atoms.d.ts +1 -2
- package/{dist → dist-types}/components/frame/frame.d.ts +0 -1
- package/{dist → dist-types}/components/frame/index.d.ts +0 -1
- package/{dist → dist-types}/components/frame/types.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-banner/atoms/button-group.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/card.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/description.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/footer.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/header.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/overlay.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-banner/atoms/title.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-banner/iab-consent-banner.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-banner/index.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/card.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/content.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/footer.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/header.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/overlay.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/purpose-item.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/root.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/stack-item.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/tabs.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/atoms/vendor-list.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-dialog/hooks/use-gvl-data.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/iab-consent-dialog.d.ts +1 -2
- package/{dist → dist-types}/components/iab-consent-dialog/index.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/types.d.ts +0 -1
- package/{dist → dist-types}/components/iab-consent-dialog/use-iab-translations.d.ts +0 -1
- package/dist-types/components/shared/libs/policy-actions.d.ts +26 -0
- package/{dist → dist-types}/components/shared/libs/polymorphic.d.ts +0 -1
- package/{dist → dist-types}/components/shared/libs/recursive-clone-children.d.ts +0 -1
- package/{dist → dist-types}/components/shared/primitives/box.d.ts +0 -1
- package/{dist → dist-types}/components/shared/primitives/button.d.ts +5 -2
- package/{dist → dist-types}/components/shared/primitives/button.types.d.ts +17 -1
- package/{dist → dist-types}/components/shared/primitives/legal-links/index.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/accordion/accordion.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/accordion/accordion.types.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/accordion/index.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/animated-collapse/animated-collapse.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/animated-collapse/index.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/button/button.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/button/button.types.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/button/index.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/icon.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/logo.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/switch/index.d.ts +0 -1
- package/{dist → dist-types}/components/shared/ui/switch/switch.d.ts +1 -2
- package/{dist → dist-types}/components/shared/ui/switch/switch.types.d.ts +1 -2
- package/{dist → dist-types}/context/consent-manager-context.d.ts +1 -2
- package/{dist → dist-types}/context/consent-tracking-context.d.ts +0 -1
- package/{dist → dist-types}/context/theme-context.d.ts +0 -1
- package/dist-types/headless.d.ts +10 -0
- package/{dist → dist-types}/hooks/index.d.ts +3 -1
- package/{dist → dist-types}/hooks/use-color-scheme.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-component-config.d.ts +1 -2
- package/dist-types/hooks/use-consent-dialog-trigger.d.ts +10 -0
- package/{dist → dist-types}/hooks/use-consent-manager.d.ts +1 -2
- package/{dist → dist-types}/hooks/use-focus-trap.d.ts +0 -1
- package/dist-types/hooks/use-headless-consent-ui.d.ts +46 -0
- package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +41 -0
- package/{dist → dist-types}/hooks/use-reduced-motion.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-scroll-lock.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-ssr-status.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-styles.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-text-direction.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-theme.d.ts +0 -1
- package/{dist → dist-types}/hooks/use-translations.d.ts +1 -2
- package/{dist → dist-types}/index.d.ts +5 -3
- package/{dist → dist-types}/providers/consent-manager-provider.d.ts +0 -1
- package/{dist → dist-types}/server/fetch-ssr-data.d.ts +1 -2
- package/{dist → dist-types}/server/headers.d.ts +2 -2
- package/{dist → dist-types}/server/index.d.ts +1 -1
- package/dist-types/server/init-cache-key.d.ts +21 -0
- package/{dist → dist-types}/server/normalize-url.d.ts +0 -1
- package/{dist → dist-types}/server/types.d.ts +1 -2
- package/{dist → dist-types}/types/consent-manager.d.ts +8 -2
- package/{dist → dist-types}/types/theme/index.d.ts +0 -1
- package/dist-types/types/theme/style-keys.d.ts +1 -0
- package/{dist → dist-types}/types/theme/style-types.d.ts +4 -3
- package/{dist → dist-types}/utils/cn.d.ts +1 -2
- package/{dist → dist-types}/utils/merge-styles.d.ts +0 -1
- package/{dist → dist-types}/utils/test-helpers.d.ts +0 -1
- package/{dist → dist-types}/utils/theme-utils.d.ts +1 -2
- package/dist-types/version.d.ts +1 -0
- package/docs/README.md +76 -0
- package/docs/building-headless-components.md +245 -0
- package/docs/callbacks.md +117 -0
- package/docs/components/consent-banner.md +174 -0
- package/docs/components/consent-dialog-link.md +59 -0
- package/docs/components/consent-dialog-trigger.md +103 -0
- package/docs/components/consent-dialog.md +137 -0
- package/docs/components/consent-manager-provider.md +422 -0
- package/docs/components/consent-widget.md +78 -0
- package/docs/components/dev-tools.md +63 -0
- package/docs/components/frame.md +73 -0
- package/docs/concepts/client-modes.md +163 -0
- package/docs/concepts/consent-categories.md +97 -0
- package/docs/concepts/consent-models.md +112 -0
- package/docs/concepts/cookie-management.md +122 -0
- package/docs/concepts/glossary.md +23 -0
- package/docs/concepts/initialization-flow.md +141 -0
- package/docs/concepts/policy-packs.md +227 -0
- package/docs/headless.md +184 -0
- package/docs/hooks/use-color-scheme.md +40 -0
- package/docs/hooks/use-consent-manager/checking-consent.md +94 -0
- package/docs/hooks/use-consent-manager/location-info.md +95 -0
- package/docs/hooks/use-consent-manager/overview.md +390 -0
- package/docs/hooks/use-consent-manager/setting-consent.md +92 -0
- package/docs/hooks/use-draggable.md +57 -0
- package/docs/hooks/use-focus-trap.md +41 -0
- package/docs/hooks/use-reduced-motion.md +35 -0
- package/docs/hooks/use-ssr-status.md +31 -0
- package/docs/hooks/use-text-direction.md +49 -0
- package/docs/hooks/use-translations.md +116 -0
- package/docs/iab/consent-banner.md +95 -0
- package/docs/iab/consent-dialog.md +135 -0
- package/docs/iab/overview.md +119 -0
- package/docs/iab/use-gvl-data.md +208 -0
- package/docs/iframe-blocking.md +107 -0
- package/docs/integrations/databuddy.md +186 -0
- package/docs/integrations/google-tag-manager.md +153 -0
- package/docs/integrations/google-tag.md +149 -0
- package/docs/integrations/linkedin-insights.md +109 -0
- package/docs/integrations/meta-pixel.md +342 -0
- package/docs/integrations/microsoft-uet.md +112 -0
- package/docs/integrations/overview.md +89 -0
- package/docs/integrations/posthog.md +177 -0
- package/docs/integrations/tiktok-pixel.md +113 -0
- package/docs/integrations/x-pixel.md +143 -0
- package/docs/internationalization.md +197 -0
- package/docs/network-blocker.md +178 -0
- package/docs/optimization.md +117 -0
- package/docs/policy-packs.md +240 -0
- package/docs/quickstart.md +136 -0
- package/docs/script-loader.md +300 -0
- package/docs/server-side.md +153 -0
- package/docs/styling/classnames.md +84 -0
- package/docs/styling/color-scheme.md +82 -0
- package/docs/styling/css-variables.md +92 -0
- package/docs/styling/overview.md +315 -0
- package/docs/styling/slots.md +93 -0
- package/docs/styling/tailwind.md +86 -0
- package/docs/styling/tokens.md +214 -0
- package/docs/troubleshooting.md +137 -0
- package/package.json +28 -24
- package/dist/components/consent-banner/atoms/overlay.d.ts.map +0 -1
- package/dist/components/consent-banner/atoms/root.d.ts.map +0 -1
- package/dist/components/consent-banner/components.d.ts.map +0 -1
- package/dist/components/consent-banner/consent-banner.d.ts.map +0 -1
- package/dist/components/consent-banner/error-boundary.d.ts.map +0 -1
- package/dist/components/consent-banner/index.d.ts.map +0 -1
- package/dist/components/consent-dialog/atoms/card.d.ts.map +0 -1
- package/dist/components/consent-dialog/atoms/overlay.d.ts.map +0 -1
- package/dist/components/consent-dialog/atoms/root.d.ts.map +0 -1
- package/dist/components/consent-dialog/consent-dialog.d.ts.map +0 -1
- package/dist/components/consent-dialog/index.d.ts.map +0 -1
- package/dist/components/consent-dialog-link/index.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/atoms/button.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/atoms/icon.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/atoms/root.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/atoms/text.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/consent-dialog-trigger.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/index.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/types.d.ts.map +0 -1
- package/dist/components/consent-dialog-trigger/use-draggable.d.ts.map +0 -1
- package/dist/components/consent-preferences-link/consent-preferences-link.d.ts.map +0 -1
- package/dist/components/consent-preferences-link/index.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/accordion.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/button.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/footer.d.ts.map +0 -1
- package/dist/components/consent-widget/atoms/root.d.ts.map +0 -1
- package/dist/components/consent-widget/consent-widget.d.ts.map +0 -1
- package/dist/components/consent-widget/index.d.ts.map +0 -1
- package/dist/components/consent-widget/types.d.ts.map +0 -1
- package/dist/components/frame/atoms.d.ts.map +0 -1
- package/dist/components/frame/frame.d.ts.map +0 -1
- package/dist/components/frame/index.d.ts.map +0 -1
- package/dist/components/frame/types.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/button-group.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/card.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/description.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/footer.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/header.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/overlay.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/root.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/atoms/title.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/iab-consent-banner.d.ts.map +0 -1
- package/dist/components/iab-consent-banner/index.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/card.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/content.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/footer.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/header.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/overlay.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/purpose-item.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/root.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/stack-item.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/tabs.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/atoms/vendor-list.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/hooks/use-gvl-data.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/iab-consent-dialog.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/index.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/types.d.ts.map +0 -1
- package/dist/components/iab-consent-dialog/use-iab-translations.d.ts.map +0 -1
- package/dist/components/shared/libs/polymorphic.d.ts.map +0 -1
- package/dist/components/shared/libs/recursive-clone-children.d.ts.map +0 -1
- package/dist/components/shared/primitives/box.d.ts.map +0 -1
- package/dist/components/shared/primitives/button.d.ts.map +0 -1
- package/dist/components/shared/primitives/button.types.d.ts.map +0 -1
- package/dist/components/shared/primitives/legal-links/index.d.ts.map +0 -1
- package/dist/components/shared/ui/accordion/accordion.d.ts.map +0 -1
- package/dist/components/shared/ui/accordion/accordion.types.d.ts.map +0 -1
- package/dist/components/shared/ui/accordion/index.d.ts.map +0 -1
- package/dist/components/shared/ui/animated-collapse/animated-collapse.d.ts.map +0 -1
- package/dist/components/shared/ui/animated-collapse/index.d.ts.map +0 -1
- package/dist/components/shared/ui/button/button.d.ts.map +0 -1
- package/dist/components/shared/ui/button/button.types.d.ts.map +0 -1
- package/dist/components/shared/ui/button/index.d.ts.map +0 -1
- package/dist/components/shared/ui/icon.d.ts.map +0 -1
- package/dist/components/shared/ui/logo.d.ts.map +0 -1
- package/dist/components/shared/ui/switch/index.d.ts.map +0 -1
- package/dist/components/shared/ui/switch/switch.d.ts.map +0 -1
- package/dist/components/shared/ui/switch/switch.types.d.ts.map +0 -1
- package/dist/context/consent-manager-context.d.ts.map +0 -1
- package/dist/context/consent-tracking-context.d.ts.map +0 -1
- package/dist/context/theme-context.d.ts.map +0 -1
- package/dist/headless.d.ts +0 -8
- package/dist/headless.d.ts.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/use-color-scheme.d.ts.map +0 -1
- package/dist/hooks/use-component-config.d.ts.map +0 -1
- package/dist/hooks/use-consent-manager.d.ts.map +0 -1
- package/dist/hooks/use-focus-trap.d.ts.map +0 -1
- package/dist/hooks/use-reduced-motion.d.ts.map +0 -1
- package/dist/hooks/use-scroll-lock.d.ts.map +0 -1
- package/dist/hooks/use-ssr-status.d.ts.map +0 -1
- package/dist/hooks/use-styles.d.ts.map +0 -1
- package/dist/hooks/use-text-direction.d.ts.map +0 -1
- package/dist/hooks/use-theme.d.ts.map +0 -1
- package/dist/hooks/use-translations.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/providers/consent-manager-provider.d.ts.map +0 -1
- package/dist/server/fetch-ssr-data.d.ts.map +0 -1
- package/dist/server/headers.d.ts.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/normalize-url.d.ts.map +0 -1
- package/dist/server/types.d.ts.map +0 -1
- package/dist/types/consent-manager.d.ts.map +0 -1
- package/dist/types/theme/index.d.ts.map +0 -1
- package/dist/types/theme/style-keys.d.ts +0 -2
- package/dist/types/theme/style-keys.d.ts.map +0 -1
- package/dist/types/theme/style-types.d.ts.map +0 -1
- package/dist/utils/cn.d.ts.map +0 -1
- package/dist/utils/merge-styles.d.ts.map +0 -1
- package/dist/utils/test-helpers.d.ts.map +0 -1
- package/dist/utils/theme-utils.d.ts.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
package/docs/headless.md
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Headless Mode
|
|
3
|
+
description: Build fully custom consent UI using only hooks - no pre-built components required.
|
|
4
|
+
---
|
|
5
|
+
c15t's headless mode means using the hooks (`useConsentManager`, `useTranslations`, etc.) without any pre-built UI components. This gives you complete control over the consent experience.
|
|
6
|
+
|
|
7
|
+
There are three levels of customization:
|
|
8
|
+
|
|
9
|
+
1. **Props** - Use pre-built components with custom text and configuration
|
|
10
|
+
2. **noStyle** - Use pre-built components with their structure but strip all styles
|
|
11
|
+
3. **Headless** - Use only hooks and build the entire UI yourself
|
|
12
|
+
|
|
13
|
+
## When to Go Headless
|
|
14
|
+
|
|
15
|
+
Go headless when:
|
|
16
|
+
|
|
17
|
+
* Your design system requires complete control over markup
|
|
18
|
+
* You need a consent flow that doesn't fit the banner/dialog pattern
|
|
19
|
+
* You want to embed consent choices inline rather than as overlays
|
|
20
|
+
|
|
21
|
+
Use `noStyle` instead when:
|
|
22
|
+
|
|
23
|
+
* The component structure works but the styling doesn't
|
|
24
|
+
* You want to apply your own CSS/Tailwind without fighting defaults
|
|
25
|
+
|
|
26
|
+
> ℹ️ **Info:**
|
|
27
|
+
> Need a policy-aware implementation guide? See Building Headless Components.
|
|
28
|
+
|
|
29
|
+
## Full Example: Custom Consent Banner
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { useConsentManager, useTranslations } from '@c15t/react';
|
|
33
|
+
|
|
34
|
+
function CustomConsentBanner() {
|
|
35
|
+
const {
|
|
36
|
+
activeUI,
|
|
37
|
+
consents,
|
|
38
|
+
consentCategories,
|
|
39
|
+
consentTypes,
|
|
40
|
+
saveConsents,
|
|
41
|
+
setSelectedConsent,
|
|
42
|
+
selectedConsents,
|
|
43
|
+
} = useConsentManager();
|
|
44
|
+
const translations = useTranslations();
|
|
45
|
+
|
|
46
|
+
if (activeUI !== 'banner') return null;
|
|
47
|
+
|
|
48
|
+
const displayedTypes = consentTypes.filter(
|
|
49
|
+
(t) => consentCategories.includes(t.name) && t.display
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<div className="fixed bottom-0 inset-x-0 bg-white border-t p-6 shadow-lg z-50">
|
|
54
|
+
<h2 className="text-lg font-semibold">
|
|
55
|
+
{translations.cookieBanner.title}
|
|
56
|
+
</h2>
|
|
57
|
+
<p className="text-sm text-gray-600 mt-1">
|
|
58
|
+
{translations.cookieBanner.description}
|
|
59
|
+
</p>
|
|
60
|
+
|
|
61
|
+
<div className="mt-4 space-y-3">
|
|
62
|
+
{displayedTypes.map((type) => (
|
|
63
|
+
<label key={type.name} className="flex items-center gap-3">
|
|
64
|
+
<input
|
|
65
|
+
type="checkbox"
|
|
66
|
+
checked={selectedConsents[type.name] ?? consents[type.name] ?? false}
|
|
67
|
+
disabled={type.disabled}
|
|
68
|
+
onChange={(e) => setSelectedConsent(type.name, e.target.checked)}
|
|
69
|
+
/>
|
|
70
|
+
<div>
|
|
71
|
+
<span className="font-medium">
|
|
72
|
+
{translations.consentTypes[type.name]?.title ?? type.name}
|
|
73
|
+
</span>
|
|
74
|
+
<p className="text-xs text-gray-500">{type.description}</p>
|
|
75
|
+
</div>
|
|
76
|
+
</label>
|
|
77
|
+
))}
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<div className="mt-4 flex gap-3">
|
|
81
|
+
<button
|
|
82
|
+
onClick={() => saveConsents('necessary')}
|
|
83
|
+
className="px-4 py-2 border rounded"
|
|
84
|
+
>
|
|
85
|
+
{translations.common.rejectAll}
|
|
86
|
+
</button>
|
|
87
|
+
<button
|
|
88
|
+
onClick={() => saveConsents('custom')}
|
|
89
|
+
className="px-4 py-2 border rounded"
|
|
90
|
+
>
|
|
91
|
+
{translations.common.save}
|
|
92
|
+
</button>
|
|
93
|
+
<button
|
|
94
|
+
onClick={() => saveConsents('all')}
|
|
95
|
+
className="px-4 py-2 bg-blue-600 text-white rounded"
|
|
96
|
+
>
|
|
97
|
+
{translations.common.acceptAll}
|
|
98
|
+
</button>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Usage with Provider
|
|
106
|
+
|
|
107
|
+
The headless UI still needs a `ConsentManagerProvider`:
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
import { type ReactNode } from 'react';
|
|
111
|
+
import { ConsentManagerProvider } from '@c15t/react';
|
|
112
|
+
|
|
113
|
+
export function ConsentManager({ children }: { children: ReactNode }) {
|
|
114
|
+
return (
|
|
115
|
+
<ConsentManagerProvider
|
|
116
|
+
options={{
|
|
117
|
+
mode: 'hosted',
|
|
118
|
+
backendURL: 'https://your-instance.c15t.dev',
|
|
119
|
+
consentCategories: ['necessary', 'measurement', 'marketing'],
|
|
120
|
+
}}
|
|
121
|
+
>
|
|
122
|
+
<CustomConsentBanner />
|
|
123
|
+
{children}
|
|
124
|
+
</ConsentManagerProvider>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Custom Dialog
|
|
130
|
+
|
|
131
|
+
Build a custom consent dialog for detailed category management:
|
|
132
|
+
|
|
133
|
+
```tsx
|
|
134
|
+
import { useConsentManager, useTranslations } from '@c15t/react';
|
|
135
|
+
|
|
136
|
+
function CustomConsentDialog() {
|
|
137
|
+
const {
|
|
138
|
+
activeUI,
|
|
139
|
+
setActiveUI,
|
|
140
|
+
consentTypes,
|
|
141
|
+
consentCategories,
|
|
142
|
+
selectedConsents,
|
|
143
|
+
consents,
|
|
144
|
+
setSelectedConsent,
|
|
145
|
+
saveConsents,
|
|
146
|
+
has,
|
|
147
|
+
} = useConsentManager();
|
|
148
|
+
const translations = useTranslations();
|
|
149
|
+
|
|
150
|
+
if (activeUI !== 'dialog') return null;
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
<div className="fixed inset-0 z-50 flex items-center justify-center">
|
|
154
|
+
<div className="absolute inset-0 bg-black/50" onClick={() => setActiveUI('none')} />
|
|
155
|
+
<div className="relative bg-white rounded-xl p-6 max-w-md w-full">
|
|
156
|
+
<h2 className="text-lg font-semibold">{translations.consentManagerDialog.title}</h2>
|
|
157
|
+
|
|
158
|
+
{consentTypes
|
|
159
|
+
.filter((t) => consentCategories.includes(t.name))
|
|
160
|
+
.map((type) => (
|
|
161
|
+
<div key={type.name} className="flex items-center justify-between py-3 border-b">
|
|
162
|
+
<div>
|
|
163
|
+
<p className="font-medium">{translations.consentTypes[type.name]?.title}</p>
|
|
164
|
+
<p className="text-sm text-gray-500">{type.description}</p>
|
|
165
|
+
</div>
|
|
166
|
+
<input
|
|
167
|
+
type="checkbox"
|
|
168
|
+
checked={selectedConsents[type.name] ?? consents[type.name] ?? false}
|
|
169
|
+
disabled={type.disabled}
|
|
170
|
+
onChange={(e) => setSelectedConsent(type.name, e.target.checked)}
|
|
171
|
+
/>
|
|
172
|
+
</div>
|
|
173
|
+
))}
|
|
174
|
+
|
|
175
|
+
<div className="mt-4 flex justify-end gap-2">
|
|
176
|
+
<button onClick={() => saveConsents('necessary')}>Reject</button>
|
|
177
|
+
<button onClick={() => saveConsents('custom')}>Save</button>
|
|
178
|
+
<button onClick={() => saveConsents('all')}>Accept All</button>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: useColorScheme
|
|
3
|
+
description: Manage light/dark mode preferences for consent components.
|
|
4
|
+
---
|
|
5
|
+
`useColorScheme()` manages the color scheme preference for c15t components. It sets up the appropriate CSS class and media query listeners.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { useColorScheme } from '@c15t/react';
|
|
9
|
+
|
|
10
|
+
function ThemeManager() {
|
|
11
|
+
useColorScheme('system'); // Follow system preference
|
|
12
|
+
}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Parameters
|
|
16
|
+
|
|
17
|
+
|Value|Behavior|
|
|
18
|
+
|--|--|
|
|
19
|
+
|`'light'`|Force light mode|
|
|
20
|
+
|`'dark'`|Force dark mode|
|
|
21
|
+
|`'system'`|Follow `prefers-color-scheme` media query|
|
|
22
|
+
|`null`|Disable - c15t won't manage color scheme|
|
|
23
|
+
|`undefined`|No-op|
|
|
24
|
+
|
|
25
|
+
## Provider-Level Configuration
|
|
26
|
+
|
|
27
|
+
You can also set the color scheme on the provider without using this hook:
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
<ConsentManagerProvider
|
|
31
|
+
options={{
|
|
32
|
+
colorScheme: 'system',
|
|
33
|
+
// ...
|
|
34
|
+
}}
|
|
35
|
+
>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## System Preference Detection
|
|
39
|
+
|
|
40
|
+
When set to `'system'`, the hook listens for changes to the `prefers-color-scheme` media query and updates automatically when the user changes their OS theme.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Checking Consent
|
|
3
|
+
description: Use has() for flexible consent checks with AND, OR, and NOT logic. Check if any consent exists with hasConsented().
|
|
4
|
+
---
|
|
5
|
+
## has(condition)
|
|
6
|
+
|
|
7
|
+
The `has()` method evaluates whether the current consent state satisfies a condition. It supports simple category checks and complex logical expressions.
|
|
8
|
+
|
|
9
|
+
### Simple Check
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
const { has } = useConsentManager();
|
|
13
|
+
|
|
14
|
+
if (has('measurement')) {
|
|
15
|
+
// User has granted measurement consent
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### AND Logic
|
|
20
|
+
|
|
21
|
+
All conditions must be true:
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
has({ and: ['measurement', 'marketing'] })
|
|
25
|
+
// true only if BOTH measurement AND marketing are granted
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### OR Logic
|
|
29
|
+
|
|
30
|
+
At least one condition must be true:
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
has({ or: ['measurement', 'marketing'] })
|
|
34
|
+
// true if EITHER measurement OR marketing is granted
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### NOT Logic
|
|
38
|
+
|
|
39
|
+
Negates a condition:
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
has({ not: 'marketing' })
|
|
43
|
+
// true if marketing consent is NOT granted
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Nested Conditions
|
|
47
|
+
|
|
48
|
+
Combine operators for complex logic:
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
has({
|
|
52
|
+
and: [
|
|
53
|
+
'necessary',
|
|
54
|
+
{ or: ['measurement', 'marketing'] },
|
|
55
|
+
{ not: 'functionality' },
|
|
56
|
+
],
|
|
57
|
+
})
|
|
58
|
+
// true if: necessary AND (measurement OR marketing) AND NOT functionality
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### HasCondition Type
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
type HasCondition<CategoryType> =
|
|
65
|
+
| CategoryType // "measurement"
|
|
66
|
+
| { and: HasCondition[] | HasCondition } // { and: ["a", "b"] }
|
|
67
|
+
| { or: HasCondition[] | HasCondition } // { or: ["a", "b"] }
|
|
68
|
+
| { not: HasCondition } // { not: "a" }
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## hasConsented()
|
|
72
|
+
|
|
73
|
+
Returns `true` if the user has made any consent choice (accepted, rejected, or customized). Returns `false` if no consent has been recorded yet.
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
const { hasConsented } = useConsentManager();
|
|
77
|
+
|
|
78
|
+
if (hasConsented()) {
|
|
79
|
+
// User has previously made a consent choice
|
|
80
|
+
} else {
|
|
81
|
+
// First visit — no consent recorded
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## getDisplayedConsents()
|
|
86
|
+
|
|
87
|
+
Returns the consent types that should be displayed in the UI (based on active `consentCategories` and each type's `display` property):
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
const { getDisplayedConsents } = useConsentManager();
|
|
91
|
+
|
|
92
|
+
const visibleCategories = getDisplayedConsents();
|
|
93
|
+
// Returns ConsentType[] with name, description, defaultValue, etc.
|
|
94
|
+
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Location Info
|
|
3
|
+
description: Access detected jurisdiction, country, and region. Override geolocation for testing.
|
|
4
|
+
---
|
|
5
|
+
## locationInfo
|
|
6
|
+
|
|
7
|
+
The `locationInfo` state contains the user's detected geographic information:
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
const { locationInfo } = useConsentManager();
|
|
11
|
+
|
|
12
|
+
if (locationInfo) {
|
|
13
|
+
console.log(locationInfo.jurisdiction); // 'GDPR', 'CCPA', etc.
|
|
14
|
+
console.log(locationInfo.countryCode); // 'DE', 'US', etc.
|
|
15
|
+
console.log(locationInfo.regionCode); // 'BY', 'CA', etc.
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`locationInfo` is `null` until the backend responds with geolocation data (or in offline mode if no overrides are set).
|
|
20
|
+
|
|
21
|
+
## Jurisdiction Codes
|
|
22
|
+
|
|
23
|
+
|Code|Region|Consent Model|
|
|
24
|
+
|--|--|--|
|
|
25
|
+
|`GDPR`|European Union|opt-in|
|
|
26
|
+
|`UK_GDPR`|United Kingdom|opt-in|
|
|
27
|
+
|`CH`|Switzerland|opt-in|
|
|
28
|
+
|`BR`|Brazil (LGPD)|opt-in|
|
|
29
|
+
|`APPI`|Japan|opt-in|
|
|
30
|
+
|`PIPA`|South Korea|opt-in|
|
|
31
|
+
|`PIPEDA`|Canada (excl. Quebec)|opt-out|
|
|
32
|
+
|`QC_LAW25`|Quebec, Canada|opt-in|
|
|
33
|
+
|`CCPA`|California, USA|opt-out|
|
|
34
|
+
|`AU`|Australia|opt-out|
|
|
35
|
+
|`NONE`|No jurisdiction|null model|
|
|
36
|
+
|
|
37
|
+
## setOverrides()
|
|
38
|
+
|
|
39
|
+
Override detected values for testing or manual configuration. This triggers a re-fetch of consent banner data with the new values:
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
const { setOverrides } = useConsentManager();
|
|
43
|
+
|
|
44
|
+
// Override country (triggers jurisdiction detection)
|
|
45
|
+
await setOverrides({ country: 'DE' });
|
|
46
|
+
|
|
47
|
+
// Override language
|
|
48
|
+
await setOverrides({ language: 'de' });
|
|
49
|
+
|
|
50
|
+
// Override both
|
|
51
|
+
await setOverrides({ country: 'US', region: 'CA', language: 'es' });
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## setLocationInfo()
|
|
55
|
+
|
|
56
|
+
Directly set location info without triggering a re-fetch:
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
const { setLocationInfo } = useConsentManager();
|
|
60
|
+
|
|
61
|
+
setLocationInfo({
|
|
62
|
+
jurisdiction: 'GDPR',
|
|
63
|
+
countryCode: 'DE',
|
|
64
|
+
regionCode: 'BY',
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Testing Different Jurisdictions
|
|
69
|
+
|
|
70
|
+
A development-only component for testing consent behavior across jurisdictions:
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
function JurisdictionTester() {
|
|
74
|
+
const { setOverrides, model, locationInfo } = useConsentManager();
|
|
75
|
+
|
|
76
|
+
const testCases = [
|
|
77
|
+
{ label: 'GDPR', country: 'DE' },
|
|
78
|
+
{ label: 'CCPA', country: 'US', region: 'CA' },
|
|
79
|
+
{ label: 'PIPEDA', country: 'CA', region: undefined },
|
|
80
|
+
{ label: 'QC_LAW25', country: 'CA', region: 'QC' },
|
|
81
|
+
{ label: 'NONE', country: 'US', region: 'TX' },
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div>
|
|
86
|
+
<p>Current: {locationInfo?.jurisdiction ?? 'none'} → model: {model}</p>
|
|
87
|
+
{testCases.map((tc) => (
|
|
88
|
+
<button key={tc.label} onClick={() => setOverrides({ country: tc.country, region: tc.region })}>
|
|
89
|
+
Test as {tc.label}
|
|
90
|
+
</button>
|
|
91
|
+
))}
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
```
|