@c15t/react 2.2.1 → 2.3.0

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.
Files changed (128) hide show
  1. package/AGENTS.md +6 -3
  2. package/README.md +1 -1
  3. package/dist/components/iab-consent-dialog/atoms/purpose-item.cjs +1 -1
  4. package/dist/components/iab-consent-dialog/atoms/purpose-item.js +1 -1
  5. package/dist/components/iab-consent-dialog/hooks/use-gvl-data.cjs +1 -1
  6. package/dist/components/iab-consent-dialog/hooks/use-gvl-data.js +1 -1
  7. package/dist/components/iab-consent-dialog/iab-consent-dialog.cjs +1 -1
  8. package/dist/components/iab-consent-dialog/iab-consent-dialog.js +1 -1
  9. package/dist/iab/styles.tw3.css +1 -1
  10. package/dist/version.cjs +1 -1
  11. package/dist/version.js +1 -1
  12. package/dist-types/components/consent-banner/components.d.ts +3 -3
  13. package/dist-types/components/consent-banner/consent-banner.d.ts +1 -1
  14. package/dist-types/components/consent-banner/index.d.ts +9 -9
  15. package/dist-types/components/consent-banner/policy-actions.d.ts +2 -2
  16. package/dist-types/components/consent-dialog/atoms/card.d.ts +5 -5
  17. package/dist-types/components/consent-dialog/atoms/overlay.d.ts +1 -1
  18. package/dist-types/components/consent-dialog/consent-dialog.d.ts +2 -2
  19. package/dist-types/components/consent-dialog/index.d.ts +7 -7
  20. package/dist-types/components/consent-dialog-link/index.d.ts +1 -1
  21. package/dist-types/components/consent-dialog-trigger/atoms/button.d.ts +1 -1
  22. package/dist-types/components/consent-dialog-trigger/atoms/icon.d.ts +1 -1
  23. package/dist-types/components/consent-dialog-trigger/atoms/root.d.ts +2 -2
  24. package/dist-types/components/consent-dialog-trigger/atoms/toolbar.d.ts +2 -2
  25. package/dist-types/components/consent-dialog-trigger/consent-dialog-trigger-toolbar.d.ts +1 -1
  26. package/dist-types/components/consent-dialog-trigger/consent-dialog-trigger.d.ts +5 -5
  27. package/dist-types/components/consent-dialog-trigger/index.d.ts +4 -4
  28. package/dist-types/components/consent-dialog-trigger/types.d.ts +1 -1
  29. package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
  30. package/dist-types/components/consent-preferences-link/index.d.ts +1 -1
  31. package/dist-types/components/consent-widget/atoms/accordion.d.ts +3 -3
  32. package/dist-types/components/consent-widget/atoms/button.d.ts +1 -1
  33. package/dist-types/components/consent-widget/atoms/footer.d.ts +1 -1
  34. package/dist-types/components/consent-widget/atoms/root.d.ts +1 -1
  35. package/dist-types/components/consent-widget/consent-widget.d.ts +1 -1
  36. package/dist-types/components/consent-widget/index.d.ts +11 -11
  37. package/dist-types/components/consent-widget/policy-actions.d.ts +2 -2
  38. package/dist-types/components/consent-widget/types.d.ts +1 -1
  39. package/dist-types/components/frame/atoms.d.ts +2 -2
  40. package/dist-types/components/frame/frame.d.ts +1 -1
  41. package/dist-types/components/frame/index.d.ts +3 -3
  42. package/dist-types/components/frame/types.d.ts +1 -1
  43. package/dist-types/components/iab-consent-banner/iab-consent-banner.d.ts +2 -2
  44. package/dist-types/components/iab-consent-banner/index.d.ts +19 -19
  45. package/dist-types/components/iab-consent-dialog/atoms/purpose-item.d.ts +21 -2
  46. package/dist-types/components/iab-consent-dialog/atoms/stack-item.d.ts +1 -1
  47. package/dist-types/components/iab-consent-dialog/atoms/vendor-list.d.ts +1 -1
  48. package/dist-types/components/iab-consent-dialog/hooks/use-gvl-data.d.ts +7 -1
  49. package/dist-types/components/iab-consent-dialog/iab-consent-dialog.d.ts +5 -4
  50. package/dist-types/components/iab-consent-dialog/index.d.ts +25 -25
  51. package/dist-types/components/iab-consent-dialog/use-iab-translations.d.ts +4 -0
  52. package/dist-types/components/integrations/index.d.ts +2 -2
  53. package/dist-types/components/integrations/shared.d.ts +1 -1
  54. package/dist-types/components/integrations/youtube-embed.d.ts +1 -1
  55. package/dist-types/components/shared/policy-actions.d.ts +2 -2
  56. package/dist-types/components/shared/primitives/box.d.ts +1 -1
  57. package/dist-types/components/shared/primitives/button.d.ts +4 -4
  58. package/dist-types/components/shared/primitives/button.types.d.ts +1 -1
  59. package/dist-types/components/shared/primitives/legal-links/index.d.ts +1 -1
  60. package/dist-types/components/shared/ui/accordion/accordion.d.ts +2 -2
  61. package/dist-types/components/shared/ui/accordion/index.d.ts +2 -2
  62. package/dist-types/components/shared/ui/animated-collapse/index.d.ts +2 -2
  63. package/dist-types/components/shared/ui/branding.d.ts +1 -1
  64. package/dist-types/components/shared/ui/button/button.d.ts +1 -1
  65. package/dist-types/components/shared/ui/button/index.d.ts +2 -2
  66. package/dist-types/components/shared/ui/collapsible/index.d.ts +1 -1
  67. package/dist-types/components/shared/ui/dialog/index.d.ts +1 -1
  68. package/dist-types/components/shared/ui/preference-item/index.d.ts +1 -1
  69. package/dist-types/components/shared/ui/switch/index.d.ts +2 -2
  70. package/dist-types/components/shared/ui/switch/switch.d.ts +1 -1
  71. package/dist-types/components/shared/ui/tabs/index.d.ts +1 -1
  72. package/dist-types/context/theme-context.d.ts +1 -1
  73. package/dist-types/headless.d.ts +9 -9
  74. package/dist-types/hooks/index.d.ts +12 -12
  75. package/dist-types/hooks/use-headless-consent-ui.d.ts +1 -1
  76. package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +1 -1
  77. package/dist-types/hooks/use-styles.d.ts +1 -1
  78. package/dist-types/hooks/use-theme.d.ts +1 -1
  79. package/dist-types/iab.d.ts +4 -4
  80. package/dist-types/index.d.ts +20 -20
  81. package/dist-types/primitives/accordion.d.ts +1 -1
  82. package/dist-types/primitives/button.d.ts +1 -1
  83. package/dist-types/primitives/collapsible.d.ts +1 -1
  84. package/dist-types/primitives/dialog.d.ts +1 -1
  85. package/dist-types/primitives/preference-item.d.ts +1 -1
  86. package/dist-types/primitives/switch.d.ts +1 -1
  87. package/dist-types/primitives/tabs.d.ts +1 -1
  88. package/dist-types/primitives.d.ts +7 -7
  89. package/dist-types/providers/consent-manager-provider.d.ts +1 -1
  90. package/dist-types/server/fetch-ssr-data.d.ts +1 -1
  91. package/dist-types/server/index.d.ts +5 -5
  92. package/dist-types/types/theme/index.d.ts +2 -2
  93. package/dist-types/types/theme/style-types.d.ts +1 -1
  94. package/dist-types/utils/merge-styles.d.ts +1 -1
  95. package/dist-types/utils/test-helpers.d.ts +1 -1
  96. package/dist-types/utils/theme-utils.d.ts +1 -1
  97. package/dist-types/version.d.ts +1 -1
  98. package/docs/README.md +6 -3
  99. package/docs/frameworks/react/concepts/client-modes.md +5 -3
  100. package/docs/frameworks/react/concepts/consent-models.md +2 -2
  101. package/docs/frameworks/react/concepts/cookie-management.md +4 -0
  102. package/docs/frameworks/react/concepts/glossary.md +1 -1
  103. package/docs/frameworks/react/concepts/initialization-flow.md +3 -3
  104. package/docs/frameworks/react/concepts/policy-packs.md +4 -2
  105. package/docs/frameworks/react/hooks/use-consent-manager/overview.md +1 -1
  106. package/docs/frameworks/react/iab/consent-banner.md +2 -2
  107. package/docs/frameworks/react/iab/consent-dialog.md +12 -3
  108. package/docs/frameworks/react/iab/overview.md +18 -6
  109. package/docs/frameworks/react/iframe-blocking.md +2 -0
  110. package/docs/frameworks/react/policy-packs.md +1 -1
  111. package/docs/integrations/front-chat.md +178 -0
  112. package/docs/integrations/one-dollar-stats.md +118 -0
  113. package/docs/integrations/overview.md +3 -0
  114. package/docs/integrations/pinterest-tag.md +236 -0
  115. package/docs/shared/concepts/client-modes.md +5 -3
  116. package/docs/shared/concepts/consent-models.md +2 -2
  117. package/docs/shared/concepts/cookie-management.md +4 -0
  118. package/docs/shared/concepts/glossary.md +1 -1
  119. package/docs/shared/concepts/initialization-flow.md +3 -3
  120. package/docs/shared/concepts/policy-packs.md +4 -2
  121. package/docs/shared/react/guides/iframe-blocking.md +2 -0
  122. package/docs/shared/react/guides/policy-packs.md +1 -1
  123. package/docs/shared/react/hooks/use-consent-manager/overview.md +1 -1
  124. package/docs/shared/react/iab/consent-banner.md +1 -1
  125. package/docs/shared/react/iab/consent-dialog.md +11 -2
  126. package/docs/shared/react/iab/overview.md +16 -4
  127. package/package.json +6 -6
  128. package/readme.json +1 -1
@@ -7,17 +7,17 @@
7
7
  * of the consent dialog's parts.
8
8
  */
9
9
  import type { FC } from 'react';
10
- import { IABConsentDialogCard } from './atoms/card';
11
- import { IABConsentDialogContent } from './atoms/content';
12
- import { IABConsentDialogFooter } from './atoms/footer';
13
- import { IABConsentDialogHeader } from './atoms/header';
14
- import { IABConsentDialogOverlay } from './atoms/overlay';
15
- import { PurposeItem } from './atoms/purpose-item';
16
- import { IABConsentDialogRoot } from './atoms/root';
17
- import { StackItem } from './atoms/stack-item';
18
- import { IABConsentDialogTabButton, IABConsentDialogTabs } from './atoms/tabs';
19
- import { VendorList } from './atoms/vendor-list';
20
- import { type IABConsentDialogProps } from './iab-consent-dialog';
10
+ import { IABConsentDialogCard } from './atoms/card.js';
11
+ import { IABConsentDialogContent } from './atoms/content.js';
12
+ import { IABConsentDialogFooter } from './atoms/footer.js';
13
+ import { IABConsentDialogHeader } from './atoms/header.js';
14
+ import { IABConsentDialogOverlay } from './atoms/overlay.js';
15
+ import { PurposeItem } from './atoms/purpose-item.js';
16
+ import { IABConsentDialogRoot } from './atoms/root.js';
17
+ import { StackItem } from './atoms/stack-item.js';
18
+ import { IABConsentDialogTabButton, IABConsentDialogTabs } from './atoms/tabs.js';
19
+ import { VendorList } from './atoms/vendor-list.js';
20
+ import { type IABConsentDialogProps } from './iab-consent-dialog.js';
21
21
  /**
22
22
  * This interface extends the base IABConsentDialog component with additional sub-components
23
23
  * that can be used to compose the consent dialog's structure.
@@ -36,14 +36,14 @@ export interface IABConsentDialogCompoundComponent extends FC<IABConsentDialogPr
36
36
  VendorList: typeof VendorList;
37
37
  }
38
38
  /**
39
- * IAB TCF 2.3 compliant consent dialog dialog component.
39
+ * IAB TCF 2.4 compliant consent dialog dialog component.
40
40
  *
41
41
  * @remarks
42
42
  * This component serves as the main entry point for rendering an IAB-compliant consent dialog.
43
43
  * It provides a structured layout with required IAB TCF elements.
44
44
  *
45
45
  * Key features:
46
- * - IAB TCF 2.3 compliant
46
+ * - IAB TCF 2.4 compliant
47
47
  * - Fully accessible by default
48
48
  * - Customizable appearance
49
49
  * - Compound component pattern support
@@ -76,16 +76,16 @@ export interface IABConsentDialogCompoundComponent extends FC<IABConsentDialogPr
76
76
  */
77
77
  declare const IABConsentDialog: IABConsentDialogCompoundComponent;
78
78
  export default IABConsentDialog;
79
- export { IABConsentDialogCard } from './atoms/card';
80
- export { IABConsentDialogContent } from './atoms/content';
81
- export { IABConsentDialogFooter } from './atoms/footer';
82
- export { IABConsentDialogHeader } from './atoms/header';
83
- export { IABConsentDialogOverlay } from './atoms/overlay';
84
- export { PurposeItem } from './atoms/purpose-item';
85
- export { IABConsentDialogRoot } from './atoms/root';
86
- export { StackItem } from './atoms/stack-item';
87
- export { IABConsentDialogTabButton, IABConsentDialogTabs, } from './atoms/tabs';
88
- export { VendorList } from './atoms/vendor-list';
89
- export { type GVLData, useGVLData } from './hooks/use-gvl-data';
90
- export type { ProcessedPurpose, ProcessedSpecialFeature, ProcessedStack, ProcessedVendor, } from './types';
79
+ export { IABConsentDialogCard } from './atoms/card.js';
80
+ export { IABConsentDialogContent } from './atoms/content.js';
81
+ export { IABConsentDialogFooter } from './atoms/footer.js';
82
+ export { IABConsentDialogHeader } from './atoms/header.js';
83
+ export { IABConsentDialogOverlay } from './atoms/overlay.js';
84
+ export { PurposeItem } from './atoms/purpose-item.js';
85
+ export { IABConsentDialogRoot } from './atoms/root.js';
86
+ export { StackItem } from './atoms/stack-item.js';
87
+ export { IABConsentDialogTabButton, IABConsentDialogTabs, } from './atoms/tabs.js';
88
+ export { VendorList } from './atoms/vendor-list.js';
89
+ export { type GVLData, useGVLData } from './hooks/use-gvl-data.js';
90
+ export type { ProcessedPurpose, ProcessedSpecialFeature, ProcessedStack, ProcessedVendor, } from './types.js';
91
91
  export { IABConsentDialog, type IABConsentDialogProps };
@@ -45,6 +45,10 @@ interface IABTranslations {
45
45
  title: string;
46
46
  tooltip: string;
47
47
  };
48
+ features: {
49
+ title: string;
50
+ description: string;
51
+ };
48
52
  vendorList: {
49
53
  search: string;
50
54
  showingCount: string;
@@ -1,2 +1,2 @@
1
- export { GoogleMap, type GoogleMapCoordinates, type GoogleMapInstance, type GoogleMapOptions, type GoogleMapProps, type GoogleMapsApi, type GoogleMapsLibrary, } from './google-map';
2
- export { YouTubeEmbed, type YouTubeEmbedParams, type YouTubeEmbedProps, type YouTubeSrcSource, type YouTubeVideoIdSource, } from './youtube-embed';
1
+ export { GoogleMap, type GoogleMapCoordinates, type GoogleMapInstance, type GoogleMapOptions, type GoogleMapProps, type GoogleMapsApi, type GoogleMapsLibrary, } from './google-map.js';
2
+ export { YouTubeEmbed, type YouTubeEmbedParams, type YouTubeEmbedProps, type YouTubeSrcSource, type YouTubeVideoIdSource, } from './youtube-embed.js';
@@ -1,6 +1,6 @@
1
1
  import type { AllConsentNames } from 'c15t';
2
2
  import type { ComponentPropsWithoutRef, ReactNode } from 'react';
3
- import { FrameRoot } from '../frame';
3
+ import { FrameRoot } from '../frame/index.js';
4
4
  export declare function IntegrationPlaceholder({ category, children, showButton, ...props }: {
5
5
  category: AllConsentNames;
6
6
  children?: ReactNode;
@@ -1,6 +1,6 @@
1
1
  import type { AllConsentNames } from 'c15t';
2
2
  import { type ComponentPropsWithRef, type ReactNode } from 'react';
3
- import { type FrameProps } from '../frame';
3
+ import { type FrameProps } from '../frame/index.js';
4
4
  export type YouTubeEmbedParams = Record<string, string | number | boolean | null | undefined>;
5
5
  interface YouTubeEmbedBaseProps extends Omit<ComponentPropsWithRef<'iframe'>, 'children' | 'src' | 'title'> {
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { type ComponentType, type ReactNode } from 'react';
2
- import type { HeadlessConsentSurfaceState } from '../../hooks/use-headless-consent-ui';
3
- import type { CSSPropertiesWithVars, CSSVariables } from '../../types/theme';
2
+ import type { HeadlessConsentSurfaceState } from '../../hooks/use-headless-consent-ui.js';
3
+ import type { CSSPropertiesWithVars, CSSVariables } from '../../types/theme/index.js';
4
4
  export interface PolicyActionRenderProps<TAction extends string> {
5
5
  key: string;
6
6
  consentAction: TAction;
@@ -1,5 +1,5 @@
1
1
  import { type HTMLAttributes } from 'react';
2
- import type { ExtendThemeKeys } from '../../../types/theme';
2
+ import type { ExtendThemeKeys } from '../../../types/theme/index.js';
3
3
  /**
4
4
  * Props for the description text component of the CookieBanner.
5
5
  * Extends standard HTML div attributes.
@@ -1,8 +1,8 @@
1
1
  import type { AllConsentNames } from 'c15t';
2
- import { useTheme } from '../../../hooks/use-theme';
3
- import * as Button from '../ui/button';
4
- import type { ButtonVariantsProps } from '../ui/button/button';
5
- import type { ConsentButtonProps } from './button.types';
2
+ import { useTheme } from '../../../hooks/use-theme.js';
3
+ import * as Button from '../ui/button/index.js';
4
+ import type { ButtonVariantsProps } from '../ui/button/button.js';
5
+ import type { ConsentButtonProps } from './button.types.js';
6
6
  type ConsentActionThemeKey = 'accept' | 'reject' | 'customize';
7
7
  /**
8
8
  * Resolves the final variant and mode for a consent button.
@@ -1,6 +1,6 @@
1
1
  import type { ButtonMode } from '@c15t/ui/styles/primitives';
2
2
  import type { ComponentRef, HTMLAttributes, MouseEvent } from 'react';
3
- import type { CSSVariables, ExtendThemeKeys } from '../../../types/theme';
3
+ import type { CSSVariables, ExtendThemeKeys } from '../../../types/theme/index.js';
4
4
  export type ConsentButtonElement = ComponentRef<'button'>;
5
5
  /**
6
6
  * Props for CookieBanner button components.
@@ -1,5 +1,5 @@
1
1
  import type { LegalLinks as LegalLinksType } from 'c15t';
2
- import type { AllThemeKeys } from '../../../../types/theme/style-keys';
2
+ import type { AllThemeKeys } from '../../../../types/theme/style-keys.js';
3
3
  /**
4
4
  * Hook to filter legal links based on the provided links prop.
5
5
  *
@@ -1,8 +1,8 @@
1
1
  import { type AccordionType } from '@c15t/ui/primitives/accordion';
2
2
  import { type AccordionSize, type AccordionVariant, type AccordionVariantsProps, accordionVariants } from '@c15t/ui/styles/primitives/accordion';
3
3
  import { type ButtonHTMLAttributes, type ElementType, type HTMLAttributes } from 'react';
4
- import type { PolymorphicComponentProps } from '../../libs/polymorphic';
5
- import type { ThemeValue } from '../../../../types/theme';
4
+ import type { PolymorphicComponentProps } from '../../libs/polymorphic.js';
5
+ import type { ThemeValue } from '../../../../types/theme/index.js';
6
6
  export type { AccordionSize, AccordionVariant, AccordionVariantsProps };
7
7
  export { accordionVariants };
8
8
  export type AccordionStylesKeys = {
@@ -1,2 +1,2 @@
1
- export * from './accordion';
2
- export * from './accordion.types';
1
+ export * from './accordion.js';
2
+ export * from './accordion.types.js';
@@ -1,2 +1,2 @@
1
- export type { AnimatedCollapseProps } from './animated-collapse';
2
- export { AnimatedCollapse } from './animated-collapse';
1
+ export type { AnimatedCollapseProps } from './animated-collapse.js';
2
+ export { AnimatedCollapse } from './animated-collapse.js';
@@ -1,6 +1,6 @@
1
1
  import type { Branding } from 'c15t';
2
2
  import type { SVGProps } from 'react';
3
- import type { CSSPropertiesWithVars } from '../../../types/theme';
3
+ import type { CSSPropertiesWithVars } from '../../../types/theme/index.js';
4
4
  export type ResolvedBranding = 'c15t' | 'inth' | 'none';
5
5
  export type BrandingVariant = 'footer' | 'dialog-tag' | 'banner-tag';
6
6
  export type BrandingThemeKey = 'consentBannerTag' | 'consentDialogTag' | 'consentWidgetTag' | 'iabConsentBannerTag' | 'iabConsentDialogTag';
@@ -1,6 +1,6 @@
1
1
  import { type ButtonMode, type ButtonSize, type ButtonVariant, type ButtonVariantsProps, buttonVariants } from '@c15t/ui/styles/primitives/button';
2
2
  import { type ButtonHTMLAttributes, type ElementType } from 'react';
3
- import type { PolymorphicComponentProps } from '../../libs/polymorphic';
3
+ import type { PolymorphicComponentProps } from '../../libs/polymorphic.js';
4
4
  export type { ButtonMode, ButtonSize, ButtonVariant, ButtonVariantsProps };
5
5
  export { buttonVariants };
6
6
  export interface ButtonIconProps extends Record<string, unknown> {
@@ -1,2 +1,2 @@
1
- export * from './button';
2
- export * from './button.types';
1
+ export * from './button.js';
2
+ export * from './button.types.js';
@@ -1 +1 @@
1
- export * from './collapsible';
1
+ export * from './collapsible.js';
@@ -1 +1 @@
1
- export * from './dialog';
1
+ export * from './dialog.js';
@@ -1 +1 @@
1
- export * from './preference-item';
1
+ export * from './preference-item.js';
@@ -1,2 +1,2 @@
1
- export * from './switch';
2
- export type { SwitchCSSVariables, SwitchRootCSSVariables, SwitchThumbCSSVariables, SwitchTrackCSSVariables, } from './switch.types';
1
+ export * from './switch.js';
2
+ export type { SwitchCSSVariables, SwitchRootCSSVariables, SwitchThumbCSSVariables, SwitchTrackCSSVariables, } from './switch.types.js';
@@ -1,6 +1,6 @@
1
1
  import { type SwitchSize, type SwitchVariantsProps, switchVariants } from '@c15t/ui/styles/primitives/switch';
2
2
  import { type ButtonHTMLAttributes } from 'react';
3
- import type { AllThemeKeys, ThemeValue } from '../../../../types/theme';
3
+ import type { AllThemeKeys, ThemeValue } from '../../../../types/theme/index.js';
4
4
  export type { SwitchSize, SwitchVariantsProps };
5
5
  export { switchVariants };
6
6
  export type SwitchStylesKeys = {
@@ -1 +1 @@
1
- export * from './tabs';
1
+ export * from './tabs.js';
@@ -1,4 +1,4 @@
1
- import type { Theme } from '../types/theme';
1
+ import type { Theme } from '../types/theme/index.js';
2
2
  /**
3
3
  * Configuration value type for the ThemeContext.
4
4
  *
@@ -1,10 +1,10 @@
1
1
  export { type ConsentManagerInterface, configureConsentManager, defaultTranslationConfig, detectBrowserLanguage, type EuropePolicyMode, mergeTranslationConfigs, type PolicyPackPresets, policyPackPresets, prepareTranslationConfig, } from 'c15t';
2
- export { useColorScheme } from './hooks/use-color-scheme';
3
- export { type ConsentDialogTriggerVisibility, type UseConsentDialogTriggerOptions, type UseConsentDialogTriggerResult, useConsentDialogTrigger, } from './hooks/use-consent-dialog-trigger';
4
- export { useConsentManager } from './hooks/use-consent-manager';
5
- export { ConsentScriptConflictError, type ConsentScriptReadyControls, type ConsentScriptStatus, type ConsentScriptUnmountBehavior, type UseConsentScriptOptions, type UseConsentScriptResult, useConsentScript, } from './hooks/use-consent-script';
6
- export { useFocusTrap } from './hooks/use-focus-trap';
7
- export { type HeadlessConsentBannerAction, type HeadlessConsentBannerState, type HeadlessConsentDialogAction, type HeadlessConsentDialogState, type HeadlessConsentSurface, type HeadlessConsentSurfaceAction, type HeadlessConsentSurfaceState, type HeadlessConsentWriteAction, type UseHeadlessConsentUIResult, useHeadlessConsentUI, } from './hooks/use-headless-consent-ui';
8
- export { useTranslations } from './hooks/use-translations';
9
- export { ConsentManagerProvider } from './providers/consent-manager-provider';
10
- export type { ConsentManagerOptions, ConsentManagerProviderProps, } from './types/consent-manager';
2
+ export { useColorScheme } from './hooks/use-color-scheme.js';
3
+ export { type ConsentDialogTriggerVisibility, type UseConsentDialogTriggerOptions, type UseConsentDialogTriggerResult, useConsentDialogTrigger, } from './hooks/use-consent-dialog-trigger.js';
4
+ export { useConsentManager } from './hooks/use-consent-manager.js';
5
+ export { ConsentScriptConflictError, type ConsentScriptReadyControls, type ConsentScriptStatus, type ConsentScriptUnmountBehavior, type UseConsentScriptOptions, type UseConsentScriptResult, useConsentScript, } from './hooks/use-consent-script.js';
6
+ export { useFocusTrap } from './hooks/use-focus-trap.js';
7
+ export { type HeadlessConsentBannerAction, type HeadlessConsentBannerState, type HeadlessConsentDialogAction, type HeadlessConsentDialogState, type HeadlessConsentSurface, type HeadlessConsentSurfaceAction, type HeadlessConsentSurfaceState, type HeadlessConsentWriteAction, type UseHeadlessConsentUIResult, useHeadlessConsentUI, } from './hooks/use-headless-consent-ui.js';
8
+ export { useTranslations } from './hooks/use-translations.js';
9
+ export { ConsentManagerProvider } from './providers/consent-manager-provider.js';
10
+ export type { ConsentManagerOptions, ConsentManagerProviderProps, } from './types/consent-manager.js';
@@ -1,12 +1,12 @@
1
- export * from './use-component-config';
2
- export * from './use-consent-dialog-trigger';
3
- export * from './use-consent-manager';
4
- export * from './use-consent-script';
5
- export * from './use-focus-trap';
6
- export * from './use-headless-consent-ui';
7
- export * from './use-headless-iab-consent-ui';
8
- export * from './use-reduced-motion';
9
- export * from './use-ssr-status';
10
- export * from './use-text-direction';
11
- export * from './use-theme';
12
- export * from './use-translations';
1
+ export * from './use-component-config.js';
2
+ export * from './use-consent-dialog-trigger.js';
3
+ export * from './use-consent-manager.js';
4
+ export * from './use-consent-script.js';
5
+ export * from './use-focus-trap.js';
6
+ export * from './use-headless-consent-ui.js';
7
+ export * from './use-headless-iab-consent-ui.js';
8
+ export * from './use-reduced-motion.js';
9
+ export * from './use-ssr-status.js';
10
+ export * from './use-text-direction.js';
11
+ export * from './use-theme.js';
12
+ export * from './use-translations.js';
@@ -1,5 +1,5 @@
1
1
  import { type PolicyUiAction, type PolicyUiActionDirection, type PolicyUiActionGroup, type PolicyUiProfile } from '@c15t/ui/utils';
2
- import { useConsentManager } from './use-consent-manager';
2
+ import { useConsentManager } from './use-consent-manager.js';
3
3
  export type HeadlessConsentSurface = 'banner' | 'dialog';
4
4
  export type HeadlessConsentSurfaceAction = PolicyUiAction;
5
5
  export type HeadlessConsentWriteAction = 'accept' | 'reject';
@@ -1,4 +1,4 @@
1
- import { useConsentManager } from './use-consent-manager';
1
+ import { useConsentManager } from './use-consent-manager.js';
2
2
  export type HeadlessIABPreferenceTab = 'purposes' | 'vendors';
3
3
  export type HeadlessIABBannerAction = 'accept' | 'reject' | 'customize';
4
4
  export type HeadlessIABDialogAction = 'accept' | 'reject' | 'customize';
@@ -1,4 +1,4 @@
1
- import type { AllThemeKeys, ClassNameStyle, ThemeValue } from '../types/theme';
1
+ import type { AllThemeKeys, ClassNameStyle, ThemeValue } from '../types/theme/index.js';
2
2
  /**
3
3
  * Hook for retrieving and merging styles from theme context and component props.
4
4
  *
@@ -1 +1 @@
1
- export declare const useTheme: () => import("../context/theme-context").ThemeContextValue;
1
+ export declare const useTheme: () => import("../context/theme-context.js").ThemeContextValue;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * IAB TCF 2.3 React components and hooks.
2
+ * IAB TCF 2.4 React components and hooks.
3
3
  *
4
4
  * This subpath export contains all IAB-specific React UI. It is only
5
5
  * loaded when explicitly imported from '@c15t/react/iab'.
@@ -19,6 +19,6 @@
19
19
  *
20
20
  * @packageDocumentation
21
21
  */
22
- export { IABConsentBanner, type IABConsentBannerProps, } from './components/iab-consent-banner';
23
- export { IABConsentDialog, type IABConsentDialogProps, } from './components/iab-consent-dialog';
24
- export { type HeadlessIABBannerAction, type HeadlessIABBannerState, type HeadlessIABDialogAction, type HeadlessIABDialogState, type HeadlessIABPreferenceTab, type UseHeadlessIABConsentUIResult, useHeadlessIABConsentUI, } from './hooks/use-headless-iab-consent-ui';
22
+ export { IABConsentBanner, type IABConsentBannerProps, } from './components/iab-consent-banner/index.js';
23
+ export { IABConsentDialog, type IABConsentDialogProps, } from './components/iab-consent-dialog/index.js';
24
+ export { type HeadlessIABBannerAction, type HeadlessIABBannerState, type HeadlessIABDialogAction, type HeadlessIABDialogState, type HeadlessIABPreferenceTab, type UseHeadlessIABConsentUIResult, useHeadlessIABConsentUI, } from './hooks/use-headless-iab-consent-ui.js';
@@ -1,22 +1,22 @@
1
1
  export type { AllConsentNames, ConsentManagerInterface, ConsentStoreState, ConsentType, EuropePolicyMode, Overrides, PolicyPackPresets, Translations, } from 'c15t';
2
2
  export { configureConsentManager, defaultTranslationConfig, detectBrowserLanguage, mergeTranslationConfigs, policyPackPresets, prepareTranslationConfig, } from 'c15t';
3
- export { ConsentBanner, type ConsentBannerProps, } from './components/consent-banner';
4
- export * from './components/consent-banner/components';
5
- export { ConsentDialog, type ConsentDialogProps, } from './components/consent-dialog';
6
- export { ConsentDialogLink, type ConsentDialogLinkProps, } from './components/consent-dialog-link';
7
- export { ConsentDialogTrigger, type ConsentDialogTriggerCompound, type ConsentDialogTriggerProps, ConsentDialogTriggerToolbar, type ConsentDialogTriggerToolbarAction, type ConsentDialogTriggerToolbarPreferences, type ConsentDialogTriggerToolbarProps, TriggerButton, type TriggerButtonProps, TriggerIcon, type TriggerIconProps, type TriggerIconType, type TriggerOrientation, TriggerRoot, type TriggerRootProps, type TriggerSize, TriggerText, type TriggerTextProps, type TriggerVisibility, type UseDraggableOptions, type UseDraggableReturn, useDraggable, useTriggerContext, } from './components/consent-dialog-trigger';
8
- export { ConsentWidget, type ConsentWidgetProps, } from './components/consent-widget';
9
- export { Frame, type FrameProps } from './components/frame';
10
- export { GoogleMap, type GoogleMapCoordinates, type GoogleMapInstance, type GoogleMapOptions, type GoogleMapProps, type GoogleMapsApi, type GoogleMapsLibrary, YouTubeEmbed, type YouTubeEmbedParams, type YouTubeEmbedProps, type YouTubeSrcSource, type YouTubeVideoIdSource, } from './components/integrations';
11
- export { ConsentButton } from './components/shared/primitives/button';
12
- export { useColorScheme } from './hooks/use-color-scheme';
13
- export { type ConsentDialogTriggerVisibility, type UseConsentDialogTriggerOptions, type UseConsentDialogTriggerResult, useConsentDialogTrigger, } from './hooks/use-consent-dialog-trigger';
14
- export { useConsentManager } from './hooks/use-consent-manager';
15
- export { ConsentScriptConflictError, type ConsentScriptReadyControls, type ConsentScriptStatus, type ConsentScriptUnmountBehavior, type UseConsentScriptOptions, type UseConsentScriptResult, useConsentScript, } from './hooks/use-consent-script';
16
- export { useFocusTrap } from './hooks/use-focus-trap';
17
- export { type HeadlessConsentBannerAction, type HeadlessConsentBannerState, type HeadlessConsentDialogAction, type HeadlessConsentDialogState, type HeadlessConsentSurface, type HeadlessConsentSurfaceAction, type HeadlessConsentSurfaceState, type HeadlessConsentWriteAction, type UseHeadlessConsentUIResult, useHeadlessConsentUI, } from './hooks/use-headless-consent-ui';
18
- export { useSSRStatus } from './hooks/use-ssr-status';
19
- export { useTranslations } from './hooks/use-translations';
20
- export { ConsentManagerProvider } from './providers/consent-manager-provider';
21
- export type { ConsentManagerOptions, ConsentManagerProviderProps, } from './types/consent-manager';
22
- export type { ColorTokens, ComponentSlots, MotionTokens, RadiusTokens, ShadowTokens, SlotStyle, SpacingTokens, Theme, TypographyTokens, } from './types/theme';
3
+ export { ConsentBanner, type ConsentBannerProps, } from './components/consent-banner/index.js';
4
+ export * from './components/consent-banner/components.js';
5
+ export { ConsentDialog, type ConsentDialogProps, } from './components/consent-dialog/index.js';
6
+ export { ConsentDialogLink, type ConsentDialogLinkProps, } from './components/consent-dialog-link/index.js';
7
+ export { ConsentDialogTrigger, type ConsentDialogTriggerCompound, type ConsentDialogTriggerProps, ConsentDialogTriggerToolbar, type ConsentDialogTriggerToolbarAction, type ConsentDialogTriggerToolbarPreferences, type ConsentDialogTriggerToolbarProps, TriggerButton, type TriggerButtonProps, TriggerIcon, type TriggerIconProps, type TriggerIconType, type TriggerOrientation, TriggerRoot, type TriggerRootProps, type TriggerSize, TriggerText, type TriggerTextProps, type TriggerVisibility, type UseDraggableOptions, type UseDraggableReturn, useDraggable, useTriggerContext, } from './components/consent-dialog-trigger/index.js';
8
+ export { ConsentWidget, type ConsentWidgetProps, } from './components/consent-widget/index.js';
9
+ export { Frame, type FrameProps } from './components/frame/index.js';
10
+ export { GoogleMap, type GoogleMapCoordinates, type GoogleMapInstance, type GoogleMapOptions, type GoogleMapProps, type GoogleMapsApi, type GoogleMapsLibrary, YouTubeEmbed, type YouTubeEmbedParams, type YouTubeEmbedProps, type YouTubeSrcSource, type YouTubeVideoIdSource, } from './components/integrations/index.js';
11
+ export { ConsentButton } from './components/shared/primitives/button.js';
12
+ export { useColorScheme } from './hooks/use-color-scheme.js';
13
+ export { type ConsentDialogTriggerVisibility, type UseConsentDialogTriggerOptions, type UseConsentDialogTriggerResult, useConsentDialogTrigger, } from './hooks/use-consent-dialog-trigger.js';
14
+ export { useConsentManager } from './hooks/use-consent-manager.js';
15
+ export { ConsentScriptConflictError, type ConsentScriptReadyControls, type ConsentScriptStatus, type ConsentScriptUnmountBehavior, type UseConsentScriptOptions, type UseConsentScriptResult, useConsentScript, } from './hooks/use-consent-script.js';
16
+ export { useFocusTrap } from './hooks/use-focus-trap.js';
17
+ export { type HeadlessConsentBannerAction, type HeadlessConsentBannerState, type HeadlessConsentDialogAction, type HeadlessConsentDialogState, type HeadlessConsentSurface, type HeadlessConsentSurfaceAction, type HeadlessConsentSurfaceState, type HeadlessConsentWriteAction, type UseHeadlessConsentUIResult, useHeadlessConsentUI, } from './hooks/use-headless-consent-ui.js';
18
+ export { useSSRStatus } from './hooks/use-ssr-status.js';
19
+ export { useTranslations } from './hooks/use-translations.js';
20
+ export { ConsentManagerProvider } from './providers/consent-manager-provider.js';
21
+ export type { ConsentManagerOptions, ConsentManagerProviderProps, } from './types/consent-manager.js';
22
+ export type { ColorTokens, ComponentSlots, MotionTokens, RadiusTokens, ShadowTokens, SlotStyle, SpacingTokens, Theme, TypographyTokens, } from './types/theme/index.js';
@@ -1 +1 @@
1
- export * from '../components/shared/ui/accordion';
1
+ export * from '../components/shared/ui/accordion/index.js';
@@ -1 +1 @@
1
- export * from '../components/shared/ui/button';
1
+ export * from '../components/shared/ui/button/index.js';
@@ -1 +1 @@
1
- export * from '../components/shared/ui/collapsible';
1
+ export * from '../components/shared/ui/collapsible/index.js';
@@ -1 +1 @@
1
- export * from '../components/shared/ui/dialog';
1
+ export * from '../components/shared/ui/dialog/index.js';
@@ -1 +1 @@
1
- export * from '../components/shared/ui/preference-item';
1
+ export * from '../components/shared/ui/preference-item/index.js';
@@ -1 +1 @@
1
- export * from '../components/shared/ui/switch';
1
+ export * from '../components/shared/ui/switch/index.js';
@@ -1 +1 @@
1
- export * from '../components/shared/ui/tabs';
1
+ export * from '../components/shared/ui/tabs/index.js';
@@ -1,7 +1,7 @@
1
- export * as Accordion from './components/shared/ui/accordion';
2
- export * as Button from './components/shared/ui/button';
3
- export * as Collapsible from './components/shared/ui/collapsible';
4
- export * as Dialog from './components/shared/ui/dialog';
5
- export * as PreferenceItem from './components/shared/ui/preference-item';
6
- export * as Switch from './components/shared/ui/switch';
7
- export * as Tabs from './components/shared/ui/tabs';
1
+ export * as Accordion from './components/shared/ui/accordion/index.js';
2
+ export * as Button from './components/shared/ui/button/index.js';
3
+ export * as Collapsible from './components/shared/ui/collapsible/index.js';
4
+ export * as Dialog from './components/shared/ui/dialog/index.js';
5
+ export * as PreferenceItem from './components/shared/ui/preference-item/index.js';
6
+ export * as Switch from './components/shared/ui/switch/index.js';
7
+ export * as Tabs from './components/shared/ui/tabs/index.js';
@@ -1,4 +1,4 @@
1
- import type { ConsentManagerProviderProps } from '../types/consent-manager';
1
+ import type { ConsentManagerProviderProps } from '../types/consent-manager.js';
2
2
  /**
3
3
  * Clears all cached consent managers and stores.
4
4
  *
@@ -1,5 +1,5 @@
1
1
  import type { SSRInitialData } from 'c15t';
2
- import type { FetchSSRDataOptions } from './types';
2
+ import type { FetchSSRDataOptions } from './types.js';
3
3
  /**
4
4
  * Fetches initial consent data on the server for SSR hydration.
5
5
  *
@@ -24,8 +24,8 @@
24
24
  *
25
25
  * @packageDocumentation
26
26
  */
27
- export { fetchSSRData } from './fetch-ssr-data';
28
- export { extractRelevantHeaders } from './headers';
29
- export { createSSRInitCacheKey } from './init-cache-key';
30
- export { normalizeBackendURL, validateBackendURL } from './normalize-url';
31
- export type { FetchSSRDataOptions, FetchSSRDataOptionsBase, FetchSSRDataResult, } from './types';
27
+ export { fetchSSRData } from './fetch-ssr-data.js';
28
+ export { extractRelevantHeaders } from './headers.js';
29
+ export { createSSRInitCacheKey } from './init-cache-key.js';
30
+ export { normalizeBackendURL, validateBackendURL } from './normalize-url.js';
31
+ export type { FetchSSRDataOptions, FetchSSRDataOptionsBase, FetchSSRDataResult, } from './types.js';
@@ -1,2 +1,2 @@
1
- export * from './style-keys';
2
- export * from './style-types';
1
+ export * from './style-keys.js';
2
+ export * from './style-types.js';
@@ -1,6 +1,6 @@
1
1
  import type { ClassNameStyle as BaseClassNameStyle, Theme as BaseTheme } from '@c15t/ui/theme';
2
2
  import type { CSSProperties } from 'react';
3
- import type { AllThemeKeys } from './style-keys';
3
+ import type { AllThemeKeys } from './style-keys.js';
4
4
  export type { ColorTokens, ComponentSlots, CSSVariables, MotionTokens, RadiusTokens, ShadowTokens, SlotStyle, SpacingTokens, TypographyTokens, } from '@c15t/ui/theme';
5
5
  /**
6
6
  * Represents CSS properties with optional CSS variables.
@@ -1,4 +1,4 @@
1
- import type { ClassNameStyle, ThemeValue } from '../types/theme';
1
+ import type { ClassNameStyle, ThemeValue } from '../types/theme/index.js';
2
2
  /**
3
3
  * Merges two styles objects, handling theme values and style properties.
4
4
  * This React version uses React-specific types but uses the core logic from @c15t/ui.
@@ -1,5 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
- import type { ThemeValue } from '../types/theme';
2
+ import type { ThemeValue } from '../types/theme/index.js';
3
3
  interface ComponentStyles {
4
4
  component: ReactNode;
5
5
  testCases: {
@@ -3,7 +3,7 @@
3
3
  * Handles token-to-CSS variable conversion and dark mode overrides.
4
4
  */
5
5
  import type { ThemeCSSVariables } from '@c15t/ui/theme';
6
- import type { Theme } from '../types/theme/style-types';
6
+ import type { Theme } from '../types/theme/style-types.js';
7
7
  /**
8
8
  * Default design tokens for the v2 theme system.
9
9
  */
@@ -1 +1 @@
1
- export declare const version = "2.2.1";
1
+ export declare const version = "2.3.0";
package/docs/README.md CHANGED
@@ -37,9 +37,9 @@ Install and configure c15t in JavaScript, React, and Next.js applications.
37
37
  - [useSSRStatus](./frameworks/react/hooks/use-ssr-status.md): Check whether server-side rendered consent data was used during initialization.
38
38
  - [useTextDirection](./frameworks/react/hooks/use-text-direction.md): Manage RTL/LTR text direction based on the active language for consent UI.
39
39
  - [useTranslations](./frameworks/react/hooks/use-translations.md): Access the current language's translations for building custom consent UI.
40
- - [IABConsentBanner](./frameworks/react/iab/consent-banner.md): An IAB TCF 2.3 compliant consent banner that displays partner count, purpose summaries, and legitimate interest notices.
41
- - [IABConsentDialog](./frameworks/react/iab/consent-dialog.md): An IAB TCF 2.3 compliant preference center with tabbed purpose and vendor management.
42
- - [IAB TCF 2.3](./frameworks/react/iab/overview.md): Implement IAB Transparency & Consent Framework 2.3 compliance for programmatic advertising in EU/EEA jurisdictions.
40
+ - [IABConsentBanner](./frameworks/react/iab/consent-banner.md): An IAB TCF 2.4 compliant consent banner that displays partner count, purpose summaries, and legitimate interest notices.
41
+ - [IABConsentDialog](./frameworks/react/iab/consent-dialog.md): An IAB TCF 2.4 compliant preference center with tabbed purpose and vendor management.
42
+ - [IAB TCF 2.4](./frameworks/react/iab/overview.md): Implement IAB Transparency & Consent Framework 2.4 compliance for programmatic advertising in EU/EEA jurisdictions.
43
43
  - [useGVLData (Internal)](./frameworks/react/iab/use-gvl-data.md): Status note for the internal GVL hook used by the built-in IAB dialog.
44
44
  - [Iframe Blocking](./frameworks/react/iframe-blocking.md): Block embedded content (YouTube, social widgets, maps) until users grant consent for the appropriate category.
45
45
  - [Internationalization](./frameworks/react/internationalization.md): Translate consent UI into 30+ languages with built-in translations, custom overrides, and automatic browser language detection.
@@ -71,6 +71,7 @@ Connect analytics, advertising, maps, media, and other third-party tools behind
71
71
  - [Crisp](./integrations/crisp.md): Load Crisp live chat with website ID, runtime, cookie, and session options.
72
72
  - [Databuddy](./integrations/databuddy.md): Databuddy is a privacy-focused analytics platform that helps you understand user behavior and track events. It supports cookieless tracking and manages consent automatically through c15t's consent state synchronization.
73
73
  - [Fathom Analytics](./integrations/fathom-analytics.md): Privacy-friendly cookieless analytics with a prebuilt helper that maps Fathom's data attributes into a c15t-managed script.
74
+ - [Front Chat](./integrations/front-chat.md): Load Front Chat after functionality consent and initialize the widget when its SDK is ready.
74
75
  - [Google Maps](./integrations/google-maps.md): Render Google Maps only after consent with one shared Maps JavaScript API loader and independently managed map instances.
75
76
  - [GA4 + Google Ads (gtag.js)](./integrations/google-tag.md): Send data to Google Analytics 4 and Google Ads with automatic Consent Mode v2 support.
76
77
  - [Google Tag Manager](./integrations/google-tag-manager.md): Deploy and manage marketing tags centrally with automatic consent state synchronization.
@@ -85,7 +86,9 @@ Connect analytics, advertising, maps, media, and other third-party tools behind
85
86
  - [Microsoft Clarity](./integrations/microsoft-clarity.md): Session replay and behavior analytics with a prebuilt helper that keeps Clarity consent synchronized with c15t measurement state.
86
87
  - [Microsoft UET](./integrations/microsoft-uet.md): Track conversions and measure performance for Microsoft Advertising and Bing Ads.
87
88
  - [Mixpanel Analytics](./integrations/mixpanel-analytics.md): Load Mixpanel with c15t and let Mixpanel's own opt-in and opt-out APIs follow measurement consent.
89
+ - [OneDollarStats](./integrations/one-dollar-stats.md): Load OneDollarStats after measurement consent with optional tracker data attributes.
88
90
  - [Integrations](./integrations/overview.md): Load analytics, pixels, tag managers, and widgets through c15t so consent state controls when they run, update, and appear in your consent UI.
91
+ - [Pinterest Tag](./integrations/pinterest-tag.md): Track conversions and build audiences for Pinterest advertising campaigns.
89
92
  - [Pirsch](./integrations/pirsch.md): Privacy-friendly, cookieless analytics loaded with Pirsch's fixed script id and identification-code attributes.
90
93
  - [Plausible Analytics](./integrations/plausible-analytics.md): Privacy-friendly cookieless analytics with a prebuilt helper that preserves Plausible's queue bootstrap and loader attributes.
91
94
  - [PostHog](./integrations/posthog.md): PostHog is an open-source product analytics platform for tracking user behavior, session replays, feature flags, and A/B testing. It supports cookieless tracking, allowing analytics to continue even without cookie consent.
@@ -6,7 +6,7 @@ group: frameworks
6
6
  ---
7
7
  c15t supports three client modes that determine how consent data is stored and synchronized. Choose the mode that matches your infrastructure:
8
8
 
9
- * **Hosted mode** - Recommended for production. Backend-backed consent with geolocation, centralized policy resolution, audit history, and offline fallback.
9
+ * **Hosted mode** - Recommended for production. Backend-backed consent with geolocation, centralized policy resolution, audit history, and a temporary fallback when the backend is unreachable.
10
10
  * **Offline mode** - Browser-only storage with no network requests. Best for local development, demos, static deployments, or controlled fallback scenarios.
11
11
  * **Custom mode** - Bring your own backend with custom endpoint handlers
12
12
 
@@ -26,7 +26,9 @@ The default mode. Connects to a c15t backend for full consent lifecycle manageme
26
26
 
27
27
  1. On page load, the client calls `/init` to fetch geolocation, jurisdiction, localized translation strings
28
28
  2. When the user grants or changes consent, it is saved locally before being synced to the backend.
29
- 3. If the backend is unreachable, it falls back to Offline mode and re-syncs with the backend when it's available
29
+ 3. If `/init` fails after retries, c15t uses a temporary opt-in fallback. Optional categories are denied during fallback, while the saved choice and its hosted policy fingerprint remain in browser storage.
30
+
31
+ A saved rejection survives an outage and recovery, including recovery to an opt-out or no-banner policy. A rejection saved during fallback also survives recovery. Grants saved during fallback are not sent to the backend and need fresh confirmation under the hosted policy. Previously valid grants can resume on a later load if the original hosted policy returns and the user has not changed their choice.
30
32
 
31
33
  **Configuration:**
32
34
 
@@ -37,7 +39,7 @@ The default mode. Connects to a c15t backend for full consent lifecycle manageme
37
39
  * The backend stays the source of truth for policy, translations, and jurisdiction logic
38
40
  * Consent decisions can be stored beyond the current browser session for audit and support workflows
39
41
  * Server-side systems can preload consent-aware behavior instead of waiting for client-only storage
40
- * If the backend is temporarily unavailable, c15t can fall back locally and re-sync later
42
+ * If the backend is temporarily unavailable, c15t falls back locally and re-syncs rejections later. Grants made during the outage wait for fresh confirmation.
41
43
 
42
44
  **Best for:** Production apps that need geolocation-based jurisdiction detection, consent record storage, and compliance audit trails.
43
45