@c15t/react 2.0.0-rc.3 → 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.
Files changed (506) hide show
  1. package/client/components/consent-banner.js +4 -0
  2. package/client/components/consent-dialog-link.js +3 -0
  3. package/client/components/consent-dialog-trigger.js +3 -0
  4. package/client/components/consent-dialog.js +4 -0
  5. package/client/components/consent-widget.js +4 -0
  6. package/client/components/frame.js +3 -0
  7. package/client/components/iab-consent-banner.js +4 -0
  8. package/client/components/iab-consent-dialog.js +4 -0
  9. package/dist/components/consent-banner/atoms/root.cjs +1 -1
  10. package/dist/components/consent-banner/atoms/root.js +1 -1
  11. package/dist/components/consent-banner/consent-banner.cjs +1 -1
  12. package/dist/components/consent-banner/consent-banner.js +1 -1
  13. package/dist/components/consent-dialog/atoms/root.cjs +1 -1
  14. package/dist/components/consent-dialog/atoms/root.js +1 -1
  15. package/dist/components/consent-dialog/consent-dialog.cjs +1 -1
  16. package/dist/components/consent-dialog/consent-dialog.js +1 -1
  17. package/dist/components/consent-dialog-link/index.cjs +1 -0
  18. package/dist/components/consent-dialog-link/index.js +1 -0
  19. package/dist/components/consent-dialog-trigger/atoms/button.cjs +1 -1
  20. package/dist/components/consent-dialog-trigger/atoms/button.js +1 -1
  21. package/dist/components/consent-dialog-trigger/atoms/root.cjs +1 -1
  22. package/dist/components/consent-dialog-trigger/atoms/root.js +1 -1
  23. package/dist/components/consent-preferences-link/consent-preferences-link.cjs +1 -0
  24. package/dist/components/consent-preferences-link/consent-preferences-link.js +1 -0
  25. package/dist/components/consent-preferences-link/index.cjs +1 -0
  26. package/dist/components/consent-preferences-link/index.js +1 -0
  27. package/dist/components/consent-widget/atoms/button.cjs +1 -1
  28. package/dist/components/consent-widget/atoms/button.js +1 -1
  29. package/dist/components/consent-widget/consent-widget.cjs +1 -1
  30. package/dist/components/consent-widget/consent-widget.js +1 -1
  31. package/dist/components/frame/frame.cjs +1 -1
  32. package/dist/components/frame/frame.js +1 -1
  33. package/dist/components/iab-consent-banner/atoms/root.cjs +1 -1
  34. package/dist/components/iab-consent-banner/atoms/root.js +1 -1
  35. package/dist/components/iab-consent-banner/iab-consent-banner.cjs +1 -1
  36. package/dist/components/iab-consent-banner/iab-consent-banner.js +1 -1
  37. package/dist/components/iab-consent-dialog/atoms/footer.cjs +1 -1
  38. package/dist/components/iab-consent-dialog/atoms/footer.js +1 -1
  39. package/dist/components/iab-consent-dialog/atoms/root.cjs +1 -1
  40. package/dist/components/iab-consent-dialog/atoms/root.js +1 -1
  41. package/dist/components/iab-consent-dialog/iab-consent-dialog.cjs +1 -1
  42. package/dist/components/iab-consent-dialog/iab-consent-dialog.js +1 -1
  43. package/dist/components/shared/libs/policy-actions.cjs +1 -0
  44. package/dist/components/shared/libs/policy-actions.js +1 -0
  45. package/dist/components/shared/primitives/button.cjs +1 -1
  46. package/dist/components/shared/primitives/button.js +1 -1
  47. package/dist/headless.cjs +1 -1
  48. package/dist/headless.js +1 -1
  49. package/dist/hooks/index.cjs +1 -1
  50. package/dist/hooks/index.js +1 -1
  51. package/dist/hooks/use-consent-dialog-trigger.cjs +1 -0
  52. package/dist/hooks/use-consent-dialog-trigger.js +1 -0
  53. package/dist/hooks/use-consent-manager.cjs +1 -1
  54. package/dist/hooks/use-consent-manager.js +1 -1
  55. package/dist/hooks/use-headless-consent-ui.cjs +1 -0
  56. package/dist/hooks/use-headless-consent-ui.js +1 -0
  57. package/dist/hooks/use-headless-iab-consent-ui.cjs +1 -0
  58. package/dist/hooks/use-headless-iab-consent-ui.js +1 -0
  59. package/dist/index.cjs +1 -1
  60. package/dist/index.js +1 -1
  61. package/dist/providers/consent-manager-provider.cjs +1 -1
  62. package/dist/providers/consent-manager-provider.js +1 -1
  63. package/dist/server/fetch-ssr-data.cjs +1 -1
  64. package/dist/server/fetch-ssr-data.js +1 -1
  65. package/dist/server/headers.cjs +1 -1
  66. package/dist/server/headers.js +1 -1
  67. package/dist/server/index.cjs +1 -1
  68. package/dist/server/index.js +1 -1
  69. package/dist/server/init-cache-key.cjs +1 -0
  70. package/dist/server/init-cache-key.js +1 -0
  71. package/dist/version.cjs +1 -1
  72. package/dist/version.js +1 -1
  73. package/{dist → dist-types}/components/consent-banner/atoms/overlay.d.ts +0 -1
  74. package/{dist → dist-types}/components/consent-banner/atoms/root.d.ts +1 -2
  75. package/{dist → dist-types}/components/consent-banner/components.d.ts +0 -1
  76. package/{dist → dist-types}/components/consent-banner/consent-banner.d.ts +8 -7
  77. package/{dist → dist-types}/components/consent-banner/error-boundary.d.ts +0 -1
  78. package/{dist → dist-types}/components/consent-banner/index.d.ts +0 -1
  79. package/{dist → dist-types}/components/consent-dialog/atoms/card.d.ts +0 -1
  80. package/{dist → dist-types}/components/consent-dialog/atoms/overlay.d.ts +0 -1
  81. package/{dist → dist-types}/components/consent-dialog/atoms/root.d.ts +1 -2
  82. package/{dist → dist-types}/components/consent-dialog/consent-dialog.d.ts +1 -2
  83. package/{dist → dist-types}/components/consent-dialog/index.d.ts +0 -1
  84. package/dist-types/components/consent-dialog-link/index.d.ts +1 -0
  85. package/{dist → dist-types}/components/consent-dialog-trigger/atoms/button.d.ts +0 -1
  86. package/{dist → dist-types}/components/consent-dialog-trigger/atoms/icon.d.ts +0 -1
  87. package/{dist → dist-types}/components/consent-dialog-trigger/atoms/root.d.ts +0 -1
  88. package/{dist → dist-types}/components/consent-dialog-trigger/atoms/text.d.ts +0 -1
  89. package/{dist → dist-types}/components/consent-dialog-trigger/consent-dialog-trigger.d.ts +0 -1
  90. package/{dist → dist-types}/components/consent-dialog-trigger/index.d.ts +0 -1
  91. package/{dist → dist-types}/components/consent-dialog-trigger/types.d.ts +1 -2
  92. package/{dist → dist-types}/components/consent-dialog-trigger/use-draggable.d.ts +1 -2
  93. package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +15 -0
  94. package/dist-types/components/consent-preferences-link/index.d.ts +1 -0
  95. package/{dist → dist-types}/components/consent-widget/atoms/accordion.d.ts +0 -1
  96. package/{dist → dist-types}/components/consent-widget/atoms/button.d.ts +0 -1
  97. package/{dist → dist-types}/components/consent-widget/atoms/footer.d.ts +0 -1
  98. package/{dist → dist-types}/components/consent-widget/atoms/root.d.ts +0 -1
  99. package/{dist → dist-types}/components/consent-widget/consent-widget.d.ts +0 -1
  100. package/{dist → dist-types}/components/consent-widget/index.d.ts +0 -1
  101. package/{dist → dist-types}/components/consent-widget/types.d.ts +0 -1
  102. package/{dist → dist-types}/components/frame/atoms.d.ts +1 -2
  103. package/{dist → dist-types}/components/frame/frame.d.ts +0 -1
  104. package/{dist → dist-types}/components/frame/index.d.ts +0 -1
  105. package/{dist → dist-types}/components/frame/types.d.ts +1 -2
  106. package/{dist → dist-types}/components/iab-consent-banner/atoms/button-group.d.ts +0 -1
  107. package/{dist → dist-types}/components/iab-consent-banner/atoms/card.d.ts +0 -1
  108. package/{dist → dist-types}/components/iab-consent-banner/atoms/description.d.ts +0 -1
  109. package/{dist → dist-types}/components/iab-consent-banner/atoms/footer.d.ts +0 -1
  110. package/{dist → dist-types}/components/iab-consent-banner/atoms/header.d.ts +0 -1
  111. package/{dist → dist-types}/components/iab-consent-banner/atoms/overlay.d.ts +0 -1
  112. package/{dist → dist-types}/components/iab-consent-banner/atoms/root.d.ts +1 -2
  113. package/{dist → dist-types}/components/iab-consent-banner/atoms/title.d.ts +0 -1
  114. package/{dist → dist-types}/components/iab-consent-banner/iab-consent-banner.d.ts +1 -2
  115. package/{dist → dist-types}/components/iab-consent-banner/index.d.ts +0 -1
  116. package/{dist → dist-types}/components/iab-consent-dialog/atoms/card.d.ts +0 -1
  117. package/{dist → dist-types}/components/iab-consent-dialog/atoms/content.d.ts +0 -1
  118. package/{dist → dist-types}/components/iab-consent-dialog/atoms/footer.d.ts +0 -1
  119. package/{dist → dist-types}/components/iab-consent-dialog/atoms/header.d.ts +0 -1
  120. package/{dist → dist-types}/components/iab-consent-dialog/atoms/overlay.d.ts +0 -1
  121. package/{dist → dist-types}/components/iab-consent-dialog/atoms/purpose-item.d.ts +0 -1
  122. package/{dist → dist-types}/components/iab-consent-dialog/atoms/root.d.ts +1 -2
  123. package/{dist → dist-types}/components/iab-consent-dialog/atoms/stack-item.d.ts +0 -1
  124. package/{dist → dist-types}/components/iab-consent-dialog/atoms/tabs.d.ts +0 -1
  125. package/{dist → dist-types}/components/iab-consent-dialog/atoms/vendor-list.d.ts +1 -2
  126. package/{dist → dist-types}/components/iab-consent-dialog/hooks/use-gvl-data.d.ts +0 -1
  127. package/{dist → dist-types}/components/iab-consent-dialog/iab-consent-dialog.d.ts +1 -2
  128. package/{dist → dist-types}/components/iab-consent-dialog/index.d.ts +0 -1
  129. package/{dist → dist-types}/components/iab-consent-dialog/types.d.ts +0 -1
  130. package/{dist → dist-types}/components/iab-consent-dialog/use-iab-translations.d.ts +0 -1
  131. package/dist-types/components/shared/libs/policy-actions.d.ts +26 -0
  132. package/{dist → dist-types}/components/shared/libs/polymorphic.d.ts +0 -1
  133. package/{dist → dist-types}/components/shared/libs/recursive-clone-children.d.ts +0 -1
  134. package/{dist → dist-types}/components/shared/primitives/box.d.ts +0 -1
  135. package/{dist → dist-types}/components/shared/primitives/button.d.ts +5 -2
  136. package/{dist → dist-types}/components/shared/primitives/button.types.d.ts +17 -1
  137. package/{dist → dist-types}/components/shared/primitives/legal-links/index.d.ts +1 -2
  138. package/{dist → dist-types}/components/shared/ui/accordion/accordion.d.ts +1 -2
  139. package/{dist → dist-types}/components/shared/ui/accordion/accordion.types.d.ts +1 -2
  140. package/{dist → dist-types}/components/shared/ui/accordion/index.d.ts +0 -1
  141. package/{dist → dist-types}/components/shared/ui/animated-collapse/animated-collapse.d.ts +0 -1
  142. package/{dist → dist-types}/components/shared/ui/animated-collapse/index.d.ts +0 -1
  143. package/{dist → dist-types}/components/shared/ui/button/button.d.ts +1 -2
  144. package/{dist → dist-types}/components/shared/ui/button/button.types.d.ts +0 -1
  145. package/{dist → dist-types}/components/shared/ui/button/index.d.ts +0 -1
  146. package/{dist → dist-types}/components/shared/ui/icon.d.ts +0 -1
  147. package/{dist → dist-types}/components/shared/ui/logo.d.ts +0 -1
  148. package/{dist → dist-types}/components/shared/ui/switch/index.d.ts +0 -1
  149. package/{dist → dist-types}/components/shared/ui/switch/switch.d.ts +1 -2
  150. package/{dist → dist-types}/components/shared/ui/switch/switch.types.d.ts +1 -2
  151. package/{dist → dist-types}/context/consent-manager-context.d.ts +1 -2
  152. package/{dist → dist-types}/context/consent-tracking-context.d.ts +0 -1
  153. package/{dist → dist-types}/context/theme-context.d.ts +0 -1
  154. package/dist-types/headless.d.ts +10 -0
  155. package/{dist → dist-types}/hooks/index.d.ts +3 -1
  156. package/{dist → dist-types}/hooks/use-color-scheme.d.ts +0 -1
  157. package/{dist → dist-types}/hooks/use-component-config.d.ts +1 -2
  158. package/dist-types/hooks/use-consent-dialog-trigger.d.ts +10 -0
  159. package/{dist → dist-types}/hooks/use-consent-manager.d.ts +1 -2
  160. package/{dist → dist-types}/hooks/use-focus-trap.d.ts +0 -1
  161. package/dist-types/hooks/use-headless-consent-ui.d.ts +46 -0
  162. package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +41 -0
  163. package/{dist → dist-types}/hooks/use-reduced-motion.d.ts +0 -1
  164. package/{dist → dist-types}/hooks/use-scroll-lock.d.ts +0 -1
  165. package/{dist → dist-types}/hooks/use-ssr-status.d.ts +0 -1
  166. package/{dist → dist-types}/hooks/use-styles.d.ts +0 -1
  167. package/{dist → dist-types}/hooks/use-text-direction.d.ts +0 -1
  168. package/{dist → dist-types}/hooks/use-theme.d.ts +0 -1
  169. package/{dist → dist-types}/hooks/use-translations.d.ts +1 -2
  170. package/{dist → dist-types}/index.d.ts +6 -3
  171. package/{dist → dist-types}/providers/consent-manager-provider.d.ts +0 -1
  172. package/{dist → dist-types}/server/fetch-ssr-data.d.ts +1 -2
  173. package/{dist → dist-types}/server/headers.d.ts +2 -2
  174. package/{dist → dist-types}/server/index.d.ts +1 -1
  175. package/dist-types/server/init-cache-key.d.ts +21 -0
  176. package/{dist → dist-types}/server/normalize-url.d.ts +0 -1
  177. package/{dist → dist-types}/server/types.d.ts +1 -2
  178. package/{dist → dist-types}/types/consent-manager.d.ts +8 -2
  179. package/{dist → dist-types}/types/theme/index.d.ts +0 -1
  180. package/dist-types/types/theme/style-keys.d.ts +1 -0
  181. package/{dist → dist-types}/types/theme/style-types.d.ts +4 -3
  182. package/{dist → dist-types}/utils/cn.d.ts +1 -2
  183. package/{dist → dist-types}/utils/merge-styles.d.ts +0 -1
  184. package/{dist → dist-types}/utils/test-helpers.d.ts +0 -1
  185. package/{dist → dist-types}/utils/theme-utils.d.ts +1 -2
  186. package/dist-types/version.d.ts +1 -0
  187. package/docs/README.md +76 -0
  188. package/docs/building-headless-components.md +245 -0
  189. package/docs/callbacks.md +117 -0
  190. package/docs/components/consent-banner.md +174 -0
  191. package/docs/components/consent-dialog-link.md +59 -0
  192. package/docs/components/consent-dialog-trigger.md +103 -0
  193. package/docs/components/consent-dialog.md +137 -0
  194. package/docs/components/consent-manager-provider.md +422 -0
  195. package/docs/components/consent-widget.md +78 -0
  196. package/docs/components/dev-tools.md +63 -0
  197. package/docs/components/frame.md +73 -0
  198. package/docs/concepts/client-modes.md +163 -0
  199. package/docs/concepts/consent-categories.md +97 -0
  200. package/docs/concepts/consent-models.md +112 -0
  201. package/docs/concepts/cookie-management.md +122 -0
  202. package/docs/concepts/glossary.md +23 -0
  203. package/docs/concepts/initialization-flow.md +141 -0
  204. package/docs/concepts/policy-packs.md +227 -0
  205. package/docs/headless.md +184 -0
  206. package/docs/hooks/use-color-scheme.md +40 -0
  207. package/docs/hooks/use-consent-manager/checking-consent.md +94 -0
  208. package/docs/hooks/use-consent-manager/location-info.md +95 -0
  209. package/docs/hooks/use-consent-manager/overview.md +390 -0
  210. package/docs/hooks/use-consent-manager/setting-consent.md +92 -0
  211. package/docs/hooks/use-draggable.md +57 -0
  212. package/docs/hooks/use-focus-trap.md +41 -0
  213. package/docs/hooks/use-reduced-motion.md +35 -0
  214. package/docs/hooks/use-ssr-status.md +31 -0
  215. package/docs/hooks/use-text-direction.md +49 -0
  216. package/docs/hooks/use-translations.md +116 -0
  217. package/docs/iab/consent-banner.md +95 -0
  218. package/docs/iab/consent-dialog.md +135 -0
  219. package/docs/iab/overview.md +119 -0
  220. package/docs/iab/use-gvl-data.md +208 -0
  221. package/docs/iframe-blocking.md +107 -0
  222. package/docs/integrations/databuddy.md +186 -0
  223. package/docs/integrations/google-tag-manager.md +153 -0
  224. package/docs/integrations/google-tag.md +149 -0
  225. package/docs/integrations/linkedin-insights.md +109 -0
  226. package/docs/integrations/meta-pixel.md +342 -0
  227. package/docs/integrations/microsoft-uet.md +112 -0
  228. package/docs/integrations/overview.md +89 -0
  229. package/docs/integrations/posthog.md +177 -0
  230. package/docs/integrations/tiktok-pixel.md +113 -0
  231. package/docs/integrations/x-pixel.md +143 -0
  232. package/docs/internationalization.md +197 -0
  233. package/docs/network-blocker.md +178 -0
  234. package/docs/optimization.md +117 -0
  235. package/docs/policy-packs.md +240 -0
  236. package/docs/quickstart.md +136 -0
  237. package/docs/script-loader.md +300 -0
  238. package/docs/server-side.md +153 -0
  239. package/docs/styling/classnames.md +84 -0
  240. package/docs/styling/color-scheme.md +82 -0
  241. package/docs/styling/css-variables.md +92 -0
  242. package/docs/styling/overview.md +315 -0
  243. package/docs/styling/slots.md +93 -0
  244. package/docs/styling/tailwind.md +86 -0
  245. package/docs/styling/tokens.md +214 -0
  246. package/docs/troubleshooting.md +137 -0
  247. package/package.json +64 -17
  248. package/dist/components/__tests__/active-ui-transitions.e2e.test.cjs +0 -1
  249. package/dist/components/__tests__/active-ui-transitions.e2e.test.js +0 -1
  250. package/dist/components/__tests__/consent-flow.e2e.test.cjs +0 -1
  251. package/dist/components/__tests__/consent-flow.e2e.test.js +0 -1
  252. package/dist/components/__tests__/models-prop.e2e.test.cjs +0 -1
  253. package/dist/components/__tests__/models-prop.e2e.test.js +0 -1
  254. package/dist/components/__tests__/ui-source-tracking.e2e.test.cjs +0 -1
  255. package/dist/components/__tests__/ui-source-tracking.e2e.test.js +0 -1
  256. package/dist/components/consent-banner/atoms/overlay.d.ts.map +0 -1
  257. package/dist/components/consent-banner/atoms/root.d.ts.map +0 -1
  258. package/dist/components/consent-banner/components.d.ts.map +0 -1
  259. package/dist/components/consent-banner/consent-banner.d.ts.map +0 -1
  260. package/dist/components/consent-banner/error-boundary.d.ts.map +0 -1
  261. package/dist/components/consent-banner/index.d.ts.map +0 -1
  262. package/dist/components/consent-dialog/atoms/card.d.ts.map +0 -1
  263. package/dist/components/consent-dialog/atoms/overlay.d.ts.map +0 -1
  264. package/dist/components/consent-dialog/atoms/root.d.ts.map +0 -1
  265. package/dist/components/consent-dialog/consent-dialog.d.ts.map +0 -1
  266. package/dist/components/consent-dialog/index.d.ts.map +0 -1
  267. package/dist/components/consent-dialog-trigger/atoms/button.d.ts.map +0 -1
  268. package/dist/components/consent-dialog-trigger/atoms/icon.d.ts.map +0 -1
  269. package/dist/components/consent-dialog-trigger/atoms/root.d.ts.map +0 -1
  270. package/dist/components/consent-dialog-trigger/atoms/text.d.ts.map +0 -1
  271. package/dist/components/consent-dialog-trigger/consent-dialog-trigger.d.ts.map +0 -1
  272. package/dist/components/consent-dialog-trigger/index.d.ts.map +0 -1
  273. package/dist/components/consent-dialog-trigger/types.d.ts.map +0 -1
  274. package/dist/components/consent-dialog-trigger/use-draggable.d.ts.map +0 -1
  275. package/dist/components/consent-widget/atoms/accordion.d.ts.map +0 -1
  276. package/dist/components/consent-widget/atoms/button.d.ts.map +0 -1
  277. package/dist/components/consent-widget/atoms/footer.d.ts.map +0 -1
  278. package/dist/components/consent-widget/atoms/root.d.ts.map +0 -1
  279. package/dist/components/consent-widget/consent-widget.d.ts.map +0 -1
  280. package/dist/components/consent-widget/index.d.ts.map +0 -1
  281. package/dist/components/consent-widget/types.d.ts.map +0 -1
  282. package/dist/components/frame/atoms.d.ts.map +0 -1
  283. package/dist/components/frame/frame.d.ts.map +0 -1
  284. package/dist/components/frame/index.d.ts.map +0 -1
  285. package/dist/components/frame/types.d.ts.map +0 -1
  286. package/dist/components/iab/__tests__/e2e-setup.cjs +0 -1
  287. package/dist/components/iab/__tests__/e2e-setup.js +0 -1
  288. package/dist/components/iab/__tests__/fixtures/mock-consent-state.cjs +0 -1
  289. package/dist/components/iab/__tests__/fixtures/mock-consent-state.d.ts +0 -212
  290. package/dist/components/iab/__tests__/fixtures/mock-consent-state.d.ts.map +0 -1
  291. package/dist/components/iab/__tests__/fixtures/mock-consent-state.js +0 -1
  292. package/dist/components/iab/__tests__/iab-banner.e2e.test.cjs +0 -1
  293. package/dist/components/iab/__tests__/iab-banner.e2e.test.js +0 -1
  294. package/dist/components/iab/__tests__/iab-consent-flow.e2e.test.cjs +0 -1
  295. package/dist/components/iab/__tests__/iab-consent-flow.e2e.test.js +0 -1
  296. package/dist/components/iab/__tests__/iab-events.e2e.test.cjs +0 -1
  297. package/dist/components/iab/__tests__/iab-events.e2e.test.js +0 -1
  298. package/dist/components/iab/__tests__/iab-gvl.e2e.test.cjs +0 -1
  299. package/dist/components/iab/__tests__/iab-gvl.e2e.test.js +0 -1
  300. package/dist/components/iab/__tests__/iab-preference-center.e2e.test.cjs +0 -1
  301. package/dist/components/iab/__tests__/iab-preference-center.e2e.test.js +0 -1
  302. package/dist/components/iab/__tests__/iab-storage.e2e.test.cjs +0 -1
  303. package/dist/components/iab/__tests__/iab-storage.e2e.test.js +0 -1
  304. package/dist/components/iab/__tests__/iab-stub.e2e.test.cjs +0 -1
  305. package/dist/components/iab/__tests__/iab-stub.e2e.test.js +0 -1
  306. package/dist/components/iab/__tests__/iab-tcfapi.e2e.test.cjs +0 -1
  307. package/dist/components/iab/__tests__/iab-tcfapi.e2e.test.js +0 -1
  308. package/dist/components/iab/__tests__/msw-handlers.cjs +0 -1
  309. package/dist/components/iab/__tests__/msw-handlers.js +0 -1
  310. package/dist/components/iab-consent-banner/__tests__/iab-consent-banner.test.cjs +0 -1
  311. package/dist/components/iab-consent-banner/__tests__/iab-consent-banner.test.js +0 -1
  312. package/dist/components/iab-consent-banner/atoms/button-group.d.ts.map +0 -1
  313. package/dist/components/iab-consent-banner/atoms/card.d.ts.map +0 -1
  314. package/dist/components/iab-consent-banner/atoms/description.d.ts.map +0 -1
  315. package/dist/components/iab-consent-banner/atoms/footer.d.ts.map +0 -1
  316. package/dist/components/iab-consent-banner/atoms/header.d.ts.map +0 -1
  317. package/dist/components/iab-consent-banner/atoms/overlay.d.ts.map +0 -1
  318. package/dist/components/iab-consent-banner/atoms/root.d.ts.map +0 -1
  319. package/dist/components/iab-consent-banner/atoms/title.d.ts.map +0 -1
  320. package/dist/components/iab-consent-banner/iab-consent-banner.d.ts.map +0 -1
  321. package/dist/components/iab-consent-banner/index.d.ts.map +0 -1
  322. package/dist/components/iab-consent-dialog/__tests__/legitimate-interest-ui.test.cjs +0 -1
  323. package/dist/components/iab-consent-dialog/__tests__/legitimate-interest-ui.test.js +0 -1
  324. package/dist/components/iab-consent-dialog/__tests__/preference-center.test.cjs +0 -1
  325. package/dist/components/iab-consent-dialog/__tests__/preference-center.test.js +0 -1
  326. package/dist/components/iab-consent-dialog/__tests__/purposes-tab.test.cjs +0 -1
  327. package/dist/components/iab-consent-dialog/__tests__/purposes-tab.test.js +0 -1
  328. package/dist/components/iab-consent-dialog/__tests__/vendors-tab.test.cjs +0 -1
  329. package/dist/components/iab-consent-dialog/__tests__/vendors-tab.test.js +0 -1
  330. package/dist/components/iab-consent-dialog/atoms/card.d.ts.map +0 -1
  331. package/dist/components/iab-consent-dialog/atoms/content.d.ts.map +0 -1
  332. package/dist/components/iab-consent-dialog/atoms/footer.d.ts.map +0 -1
  333. package/dist/components/iab-consent-dialog/atoms/header.d.ts.map +0 -1
  334. package/dist/components/iab-consent-dialog/atoms/overlay.d.ts.map +0 -1
  335. package/dist/components/iab-consent-dialog/atoms/purpose-item.d.ts.map +0 -1
  336. package/dist/components/iab-consent-dialog/atoms/root.d.ts.map +0 -1
  337. package/dist/components/iab-consent-dialog/atoms/stack-item.d.ts.map +0 -1
  338. package/dist/components/iab-consent-dialog/atoms/tabs.d.ts.map +0 -1
  339. package/dist/components/iab-consent-dialog/atoms/vendor-list.d.ts.map +0 -1
  340. package/dist/components/iab-consent-dialog/hooks/use-gvl-data.d.ts.map +0 -1
  341. package/dist/components/iab-consent-dialog/iab-consent-dialog.d.ts.map +0 -1
  342. package/dist/components/iab-consent-dialog/index.d.ts.map +0 -1
  343. package/dist/components/iab-consent-dialog/types.d.ts.map +0 -1
  344. package/dist/components/iab-consent-dialog/use-iab-translations.d.ts.map +0 -1
  345. package/dist/components/shared/libs/polymorphic.d.ts.map +0 -1
  346. package/dist/components/shared/libs/recursive-clone-children.d.ts.map +0 -1
  347. package/dist/components/shared/primitives/box.d.ts.map +0 -1
  348. package/dist/components/shared/primitives/button.d.ts.map +0 -1
  349. package/dist/components/shared/primitives/button.types.d.ts.map +0 -1
  350. package/dist/components/shared/primitives/legal-links/index.d.ts.map +0 -1
  351. package/dist/components/shared/ui/__tests__/primitives.test.cjs +0 -1
  352. package/dist/components/shared/ui/__tests__/primitives.test.js +0 -1
  353. package/dist/components/shared/ui/accordion/accordion.d.ts.map +0 -1
  354. package/dist/components/shared/ui/accordion/accordion.types.d.ts.map +0 -1
  355. package/dist/components/shared/ui/accordion/index.d.ts.map +0 -1
  356. package/dist/components/shared/ui/animated-collapse/animated-collapse.d.ts.map +0 -1
  357. package/dist/components/shared/ui/animated-collapse/index.d.ts.map +0 -1
  358. package/dist/components/shared/ui/button/button.d.ts.map +0 -1
  359. package/dist/components/shared/ui/button/button.types.d.ts.map +0 -1
  360. package/dist/components/shared/ui/button/index.d.ts.map +0 -1
  361. package/dist/components/shared/ui/icon.d.ts.map +0 -1
  362. package/dist/components/shared/ui/logo.d.ts.map +0 -1
  363. package/dist/components/shared/ui/switch/index.d.ts.map +0 -1
  364. package/dist/components/shared/ui/switch/switch.d.ts.map +0 -1
  365. package/dist/components/shared/ui/switch/switch.types.d.ts.map +0 -1
  366. package/dist/context/consent-manager-context.d.ts.map +0 -1
  367. package/dist/context/consent-tracking-context.d.ts.map +0 -1
  368. package/dist/context/theme-context.d.ts.map +0 -1
  369. package/dist/headless.d.ts +0 -8
  370. package/dist/headless.d.ts.map +0 -1
  371. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-cleans-up-system-preference-listener-on-unmount-1.cjs +0 -1
  372. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-cleans-up-system-preference-listener-on-unmount-1.js +0 -1
  373. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-handles-default-theme-based-on-document-class-1.cjs +0 -1
  374. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-handles-default-theme-based-on-document-class-1.js +0 -1
  375. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-responds-to-system-preference-1.cjs +0 -1
  376. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-responds-to-system-preference-1.js +0 -1
  377. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-sets-dark-theme-correctly-1.cjs +0 -1
  378. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-sets-dark-theme-correctly-1.js +0 -1
  379. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-updates-theme-when-default-theme-changes-1.cjs +0 -1
  380. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-updates-theme-when-default-theme-changes-1.js +0 -1
  381. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-updates-theme-when-system-preference-changes-1.cjs +0 -1
  382. package/dist/hooks/__tests__/__screenshots__/use-color-scheme.test.tsx/useColorScheme-updates-theme-when-system-preference-changes-1.js +0 -1
  383. package/dist/hooks/__tests__/__screenshots__/use-consent-manager.test.tsx/useConsentManager-provides-manager-object-when-configured-1.cjs +0 -1
  384. package/dist/hooks/__tests__/__screenshots__/use-consent-manager.test.tsx/useConsentManager-provides-manager-object-when-configured-1.js +0 -1
  385. package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-handles-string-className-correctly-1.cjs +0 -1
  386. package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-handles-string-className-correctly-1.js +0 -1
  387. package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-merges-theme-and-component-styles-correctly-1.cjs +0 -1
  388. package/dist/hooks/__tests__/__screenshots__/use-styles.test.tsx/useStyles-merges-theme-and-component-styles-correctly-1.js +0 -1
  389. 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
  390. 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
  391. 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
  392. 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
  393. package/dist/hooks/__tests__/__screenshots__/use-theme.test.tsx/useTheme-local-theme-takes-precedence-over-global-theme-1.cjs +0 -1
  394. package/dist/hooks/__tests__/__screenshots__/use-theme.test.tsx/useTheme-local-theme-takes-precedence-over-global-theme-1.js +0 -1
  395. package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-Custom-English-instead-of-English-when-German-is-selected-1.cjs +0 -1
  396. package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-Custom-English-instead-of-English-when-German-is-selected-1.js +0 -1
  397. package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-falls-back-to-English-when-selected-language-is-not-available-1.cjs +0 -1
  398. package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-falls-back-to-English-when-selected-language-is-not-available-1.js +0 -1
  399. package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-merges-custom-translations-with-defaults-1.cjs +0 -1
  400. package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-merges-custom-translations-with-defaults-1.js +0 -1
  401. package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-returns-English-translations-by-default-1.cjs +0 -1
  402. package/dist/hooks/__tests__/__screenshots__/use-translations.test.tsx/useTranslations-returns-English-translations-by-default-1.js +0 -1
  403. package/dist/hooks/__tests__/use-color-scheme.test.cjs +0 -1
  404. package/dist/hooks/__tests__/use-color-scheme.test.js +0 -1
  405. package/dist/hooks/__tests__/use-consent-manager.test.cjs +0 -1
  406. package/dist/hooks/__tests__/use-consent-manager.test.js +0 -1
  407. package/dist/hooks/__tests__/use-focus-trap.test.cjs +0 -1
  408. package/dist/hooks/__tests__/use-focus-trap.test.js +0 -1
  409. package/dist/hooks/__tests__/use-scroll-lock.test.cjs +0 -1
  410. package/dist/hooks/__tests__/use-scroll-lock.test.js +0 -1
  411. package/dist/hooks/__tests__/use-styles.test.cjs +0 -1
  412. package/dist/hooks/__tests__/use-styles.test.js +0 -1
  413. package/dist/hooks/__tests__/use-theme.test.cjs +0 -1
  414. package/dist/hooks/__tests__/use-theme.test.js +0 -1
  415. package/dist/hooks/__tests__/use-translations.test.cjs +0 -1
  416. package/dist/hooks/__tests__/use-translations.test.js +0 -1
  417. package/dist/hooks/index.d.ts.map +0 -1
  418. package/dist/hooks/use-color-scheme.d.ts.map +0 -1
  419. package/dist/hooks/use-component-config.d.ts.map +0 -1
  420. package/dist/hooks/use-consent-manager.d.ts.map +0 -1
  421. package/dist/hooks/use-focus-trap.d.ts.map +0 -1
  422. package/dist/hooks/use-reduced-motion.d.ts.map +0 -1
  423. package/dist/hooks/use-scroll-lock.d.ts.map +0 -1
  424. package/dist/hooks/use-ssr-status.d.ts.map +0 -1
  425. package/dist/hooks/use-styles.d.ts.map +0 -1
  426. package/dist/hooks/use-text-direction.d.ts.map +0 -1
  427. package/dist/hooks/use-theme.d.ts.map +0 -1
  428. package/dist/hooks/use-translations.d.ts.map +0 -1
  429. package/dist/index.d.ts.map +0 -1
  430. package/dist/mockServiceWorker.js +0 -349
  431. 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
  432. 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
  433. 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
  434. 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
  435. 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
  436. 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
  437. package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-handle-rapid-re-renders-without-blocking-children-1.cjs +0 -1
  438. package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-handle-rapid-re-renders-without-blocking-children-1.js +0 -1
  439. 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
  440. 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
  441. package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-render-children-immediately-without-blocking-during-hydration-1.cjs +0 -1
  442. package/dist/providers/__tests__/__screenshots__/provider-hydration.test.tsx/ConsentManagerProvider-Hydration-Behavior-should-render-children-immediately-without-blocking-during-hydration-1.js +0 -1
  443. 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
  444. 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
  445. package/dist/providers/__tests__/provider-basic.test.cjs +0 -1
  446. package/dist/providers/__tests__/provider-basic.test.js +0 -1
  447. package/dist/providers/__tests__/provider-context.test.cjs +0 -1
  448. package/dist/providers/__tests__/provider-context.test.js +0 -1
  449. package/dist/providers/__tests__/provider-errors.test.cjs +0 -1
  450. package/dist/providers/__tests__/provider-errors.test.js +0 -1
  451. package/dist/providers/__tests__/provider-hydration.test.cjs +0 -1
  452. package/dist/providers/__tests__/provider-hydration.test.js +0 -1
  453. package/dist/providers/__tests__/test-helpers.cjs +0 -1
  454. package/dist/providers/__tests__/test-helpers.js +0 -1
  455. package/dist/providers/consent-manager-provider.d.ts.map +0 -1
  456. package/dist/server/fetch-ssr-data.d.ts.map +0 -1
  457. package/dist/server/headers.d.ts.map +0 -1
  458. package/dist/server/headers.test.cjs +0 -1
  459. package/dist/server/headers.test.d.ts +0 -2
  460. package/dist/server/headers.test.d.ts.map +0 -1
  461. package/dist/server/headers.test.js +0 -1
  462. package/dist/server/index.d.ts.map +0 -1
  463. package/dist/server/normalize-url.d.ts.map +0 -1
  464. package/dist/server/normalize-url.test.cjs +0 -1
  465. package/dist/server/normalize-url.test.d.ts +0 -2
  466. package/dist/server/normalize-url.test.d.ts.map +0 -1
  467. package/dist/server/normalize-url.test.js +0 -1
  468. package/dist/server/types.d.ts.map +0 -1
  469. package/dist/static/image/ConsentManagerProvider-Basic-Request-Behavior-should-make-a-new-request-when-core-options-change-1.png +0 -0
  470. 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
  471. package/dist/static/image/ConsentManagerProvider-Basic-Request-Behavior-should-only-make-one-initial-request-for-consent-banner-status-1.png +0 -0
  472. package/dist/static/image/ConsentManagerProvider-Hydration-Behavior-should-handle-rapid-re-renders-without-blocking-children-1.png +0 -0
  473. package/dist/static/image/ConsentManagerProvider-Hydration-Behavior-should-not-block-SSR-provider-content-when-SSR-provider-wraps-ConsentManager-1.png +0 -0
  474. package/dist/static/image/ConsentManagerProvider-Hydration-Behavior-should-render-children-immediately-without-blocking-during-hydration-1.png +0 -0
  475. package/dist/static/image/ConsentManagerProvider-Hydration-Behavior-should-use-startTransition-for-non-blocking-state-updates-during-hydration-1.png +0 -0
  476. package/dist/static/image/useColorScheme-cleans-up-system-preference-listener-on-unmount-1.png +0 -0
  477. package/dist/static/image/useColorScheme-handles-default-theme-based-on-document-class-1.png +0 -0
  478. package/dist/static/image/useColorScheme-responds-to-system-preference-1.png +0 -0
  479. package/dist/static/image/useColorScheme-sets-dark-theme-correctly-1.png +0 -0
  480. package/dist/static/image/useColorScheme-updates-theme-when-default-theme-changes-1.png +0 -0
  481. package/dist/static/image/useColorScheme-updates-theme-when-system-preference-changes-1.png +0 -0
  482. package/dist/static/image/useConsentManager-provides-manager-object-when-configured-1.png +0 -0
  483. package/dist/static/image/useStyles-handles-string-className-correctly-1.png +0 -0
  484. package/dist/static/image/useStyles-merges-theme-and-component-styles-correctly-1.png +0 -0
  485. package/dist/static/image/useStyles-should-remove-base-default-styles-but-keep-theme-and-component-classNames-when-noStyle--true-1.png +0 -0
  486. package/dist/static/image/useStyles-should-remove-default-styles-but-keep-custom-classNames-when-theme-object-provides-noStyle--true-1.png +0 -0
  487. package/dist/static/image/useTheme-local-theme-takes-precedence-over-global-theme-1.png +0 -0
  488. package/dist/static/image/useTranslations-Custom-English-instead-of-English-when-German-is-selected-1.png +0 -0
  489. package/dist/static/image/useTranslations-falls-back-to-English-when-selected-language-is-not-available-1.png +0 -0
  490. package/dist/static/image/useTranslations-merges-custom-translations-with-defaults-1.png +0 -0
  491. package/dist/static/image/useTranslations-returns-English-translations-by-default-1.png +0 -0
  492. package/dist/test-setup.browser.cjs +0 -1
  493. package/dist/test-setup.browser.d.ts +0 -8
  494. package/dist/test-setup.browser.d.ts.map +0 -1
  495. package/dist/test-setup.browser.js +0 -1
  496. package/dist/types/consent-manager.d.ts.map +0 -1
  497. package/dist/types/theme/index.d.ts.map +0 -1
  498. package/dist/types/theme/style-keys.d.ts +0 -2
  499. package/dist/types/theme/style-keys.d.ts.map +0 -1
  500. package/dist/types/theme/style-types.d.ts.map +0 -1
  501. package/dist/utils/cn.d.ts.map +0 -1
  502. package/dist/utils/merge-styles.d.ts.map +0 -1
  503. package/dist/utils/test-helpers.d.ts.map +0 -1
  504. package/dist/utils/theme-utils.d.ts.map +0 -1
  505. package/dist/version.d.ts +0 -2
  506. package/dist/version.d.ts.map +0 -1
@@ -2,7 +2,7 @@
2
2
  * Utility functions for processing the v2 theme system.
3
3
  * Handles token-to-CSS variable conversion and dark mode overrides.
4
4
  */
5
- import type { ThemeCSSVariables } from '@c15t/ui/theme';
5
+ import type { ThemeCSSVariables } from '../../../ui/dist-types/theme/index.d.ts';
6
6
  import type { Theme } from '../types/theme/style-types';
7
7
  /**
8
8
  * Default design tokens for the v2 theme system.
@@ -16,4 +16,3 @@ export declare function themeToVars(theme: Theme, isDark?: boolean): ThemeCSSVar
16
16
  * Generates a CSS string for the theme variables.
17
17
  */
18
18
  export declare function generateThemeCSS(theme: Theme): string;
19
- //# sourceMappingURL=theme-utils.d.ts.map
@@ -0,0 +1 @@
1
+ export declare const version = "2.0.0-rc.5";
package/docs/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # c15t React Docs
2
+
3
+ React-focused c15t docs for consent UI, hooks, headless flows, and script integrations.
4
+
5
+ If you are changing consent flows, consent UI, script loading, server-side setup, or backend configuration in an app that uses this package, start here before editing code.
6
+
7
+ ## Start Here
8
+
9
+ - [Quickstart](./quickstart.md)
10
+ - [Headless](./headless.md)
11
+ - [Building Headless Components](./building-headless-components.md)
12
+ - [Callbacks](./callbacks.md)
13
+ - [Google Tag Manager](./integrations/google-tag-manager.md)
14
+
15
+ ## Workflow Rules
16
+
17
+ ### Styling
18
+
19
+ Use this when:
20
+ - customizing component appearance
21
+ - adapting c15t components to a design system
22
+ - deciding how far to override the default UI
23
+
24
+ Prefer:
25
+ - Prefer design tokens first.
26
+ - If tokens are not enough, use component slots.
27
+ - Then use CSS variables or `className` for targeted overrides.
28
+
29
+ If that is not enough:
30
+ - Use `noStyle` or a full headless rebuild only when the design system cannot be expressed through the supported styling layers.
31
+
32
+ Avoid:
33
+ - Do not rebuild the consent UI from scratch if tokens, slots, or scoped overrides are sufficient.
34
+
35
+ Read next:
36
+ - [Overview](./styling/overview.md)
37
+ - [Tokens](./styling/tokens.md)
38
+ - [Slots](./styling/slots.md)
39
+ - [Css Variables](./styling/css-variables.md)
40
+
41
+ ### Consent UI Customization
42
+
43
+ Use this when:
44
+ - changing banners, dialogs, or preference centers
45
+ - deciding between built-in components and headless APIs
46
+
47
+ Prefer:
48
+ - Prefer the built-in components and their documented customization surfaces first.
49
+ - If the UI requirements diverge significantly, use the headless APIs.
50
+
51
+ Avoid:
52
+ - Do not rebuild the full consent flow if a token, slot, or component override is enough.
53
+
54
+ Read next:
55
+ - [Quickstart](./quickstart.md)
56
+ - [Consent Banner](./components/consent-banner.md)
57
+ - [Headless](./headless.md)
58
+ - [Building Headless Components](./building-headless-components.md)
59
+
60
+ ### Scripts & Integrations
61
+
62
+ Use this when:
63
+ - adding third-party scripts in React components or providers
64
+ - wiring analytics or advertising behind consent
65
+
66
+ Prefer:
67
+ - Prefer premade scripts from `@c15t/scripts/*`.
68
+ - Start from the integration docs before implementing custom script wiring in React components.
69
+
70
+ Avoid:
71
+ - Do not duplicate consent-sync logic in React effects when the integration already handles it.
72
+
73
+ Read next:
74
+ - [Script Loader](./script-loader.md)
75
+ - [Google Tag Manager](./integrations/google-tag-manager.md)
76
+ - [Meta Pixel](./integrations/meta-pixel.md)
@@ -0,0 +1,245 @@
1
+ ---
2
+ title: Building Headless Components
3
+ description: Build policy-aware custom consent components in React using the headless hooks and policy-pack tooling.
4
+ ---
5
+ Building headless components is easier now because c15t exposes policy-aware primitives instead of forcing you to reconstruct banner rules by hand.
6
+
7
+ The headless stack is:
8
+
9
+ * `useHeadlessConsentUI()` for policy-aware banner/dialog actions, ordering, layout, and primary action hints
10
+ * `useConsentManager()` for runtime state, categories, selected consent state, and policy metadata
11
+ * `useTranslations()` for the resolved copy
12
+ * `offlinePolicy.policyPacks` for offline previews that behave like backend policy resolution
13
+
14
+ > ℹ️ **Info:**
15
+ > This guide is about building your own components while still respecting resolved policy-pack behavior. For the general headless overview, see Headless Mode.
16
+
17
+ ## What the Headless Tooling Gives You
18
+
19
+ The main win is that your custom UI can stay aligned with policy packs without duplicating policy logic in your components.
20
+
21
+ `useHeadlessConsentUI()` already resolves:
22
+
23
+ * which actions are allowed
24
+ * the order those actions should render in
25
+ * grouped actions from policy `layout`
26
+ * layout `direction` (`row` or `column`)
27
+ * the primary action
28
+ * UI profile and scroll-lock hints
29
+ * whether the banner or dialog should currently be visible
30
+
31
+ That means your component mostly focuses on markup and design-system concerns instead of re-implementing policy interpretation.
32
+
33
+ ## Provider Setup for Local Policy Testing
34
+
35
+ ```tsx
36
+ import type { ReactNode } from 'react';
37
+ import {
38
+ ConsentManagerProvider,
39
+ policyPackPresets,
40
+ } from '@c15t/react';
41
+
42
+ export function ConsentManager({ children }: { children: ReactNode }) {
43
+ return (
44
+ <ConsentManagerProvider
45
+ options={{
46
+ mode: 'offline',
47
+ offlinePolicy: {
48
+ policyPacks: [
49
+ policyPackPresets.californiaOptOut(),
50
+ policyPackPresets.europeOptIn(),
51
+ policyPackPresets.worldNoBanner(),
52
+ ],
53
+ },
54
+ overrides: {
55
+ country: 'US',
56
+ region: 'CA',
57
+ },
58
+ }}
59
+ >
60
+ {children}
61
+ </ConsentManagerProvider>
62
+ );
63
+ }
64
+ ```
65
+
66
+ ## Policy-Aware Banner Example
67
+
68
+ ```tsx
69
+ import { useHeadlessConsentUI, useTranslations } from '@c15t/react/headless';
70
+
71
+ export function CustomConsentBanner() {
72
+ const { banner, openDialog, performAction } = useHeadlessConsentUI();
73
+ const translations = useTranslations();
74
+
75
+ if (!banner.isVisible) return null;
76
+
77
+ return (
78
+ <aside className="rounded-xl border bg-white p-6 shadow-lg">
79
+ <h2 className="text-lg font-semibold">{translations.cookieBanner.title}</h2>
80
+ <p className="mt-2 text-sm text-gray-600">
81
+ {translations.cookieBanner.description}
82
+ </p>
83
+
84
+ <div className="mt-4 space-y-2">
85
+ {banner.actionGroups.map((group, index) => (
86
+ <div key={`${group.join('-')}-${index}`} className="flex gap-2">
87
+ {group.map((action) => (
88
+ <button
89
+ key={action}
90
+ type="button"
91
+ className={action === banner.primaryAction ? 'btn-primary' : 'btn-secondary'}
92
+ onClick={() => {
93
+ if (action === 'customize') {
94
+ openDialog();
95
+ return;
96
+ }
97
+ void performAction(action, { surface: 'banner' });
98
+ }}
99
+ >
100
+ {action === 'accept'
101
+ ? translations.common.acceptAll
102
+ : action === 'reject'
103
+ ? translations.common.rejectAll
104
+ : translations.common.customize}
105
+ </button>
106
+ ))}
107
+ </div>
108
+ ))}
109
+ </div>
110
+ </aside>
111
+ );
112
+ }
113
+ ```
114
+
115
+ ## Category List That Respects the Resolved Policy
116
+
117
+ ```tsx
118
+ import {
119
+ useConsentManager,
120
+ useHeadlessConsentUI,
121
+ useTranslations,
122
+ } from '@c15t/react/headless';
123
+
124
+ export function CustomConsentDialog() {
125
+ const { dialog, performDialogAction, saveCustomPreferences } = useHeadlessConsentUI();
126
+ const {
127
+ consentTypes,
128
+ consentCategories,
129
+ consents,
130
+ selectedConsents,
131
+ setSelectedConsent,
132
+ } = useConsentManager();
133
+ const translations = useTranslations();
134
+
135
+ if (!dialog.isVisible) return null;
136
+
137
+ const displayedTypes = consentTypes.filter(
138
+ (type) => type.display && consentCategories.includes(type.name)
139
+ );
140
+
141
+ return (
142
+ <section className="rounded-xl border bg-white p-6 shadow-xl">
143
+ <h2 className="text-lg font-semibold">
144
+ {translations.consentManagerDialog.title}
145
+ </h2>
146
+
147
+ <div className="mt-4 space-y-3">
148
+ {displayedTypes.map((type) => (
149
+ <label key={type.name} className="flex items-start justify-between gap-4">
150
+ <div>
151
+ <p className="font-medium">
152
+ {translations.consentTypes[type.name]?.title ?? type.name}
153
+ </p>
154
+ <p className="text-sm text-gray-600">{type.description}</p>
155
+ </div>
156
+ <input
157
+ type="checkbox"
158
+ checked={selectedConsents[type.name] ?? consents[type.name] ?? false}
159
+ disabled={type.disabled}
160
+ onChange={(event) =>
161
+ setSelectedConsent(type.name, event.target.checked)
162
+ }
163
+ />
164
+ </label>
165
+ ))}
166
+ </div>
167
+
168
+ <div className="mt-4 flex gap-2">
169
+ {dialog.orderedActions.map((action) => (
170
+ <button
171
+ key={action}
172
+ type="button"
173
+ onClick={() => {
174
+ if (action === 'customize') {
175
+ void saveCustomPreferences();
176
+ return;
177
+ }
178
+ void performDialogAction(action);
179
+ }}
180
+ >
181
+ {action === 'accept'
182
+ ? translations.common.acceptAll
183
+ : action === 'reject'
184
+ ? translations.common.rejectAll
185
+ : translations.common.save}
186
+ </button>
187
+ ))}
188
+ </div>
189
+ </section>
190
+ );
191
+ }
192
+ ```
193
+
194
+ ## What a Policy-Aware Headless Component Should Respect
195
+
196
+ When you build custom banner or dialog components, make sure they use:
197
+
198
+ * `activeUI` or `banner.isVisible` / `dialog.isVisible` for visibility
199
+ * `allowedActions`, `orderedActions`, or `actionGroups` instead of hard-coding buttons
200
+ * `primaryAction` for visual emphasis
201
+ * `consentCategories` when deciding which category toggles to render
202
+ * `policyDecision` when you want to debug why a specific UI state was chosen
203
+
204
+ If you ignore those values, your custom UI can drift away from the resolved policy pack even though the underlying consent engine is configured correctly.
205
+
206
+ ## Test Custom UI Against the Resolved Policy
207
+
208
+ ```ts
209
+ import {
210
+ getEffectivePolicy,
211
+ type PolicyUIState,
212
+ validateUIAgainstPolicy,
213
+ } from 'c15t';
214
+
215
+ const policy = getEffectivePolicy(initData);
216
+
217
+ const bannerState: PolicyUIState = {
218
+ mode: 'banner',
219
+ actions: ['accept', 'reject', 'customize'],
220
+ layout: 'split',
221
+ uiProfile: 'compact',
222
+ scrollLock: false,
223
+ };
224
+
225
+ const issues = validateUIAgainstPolicy({
226
+ policy,
227
+ state: bannerState,
228
+ });
229
+
230
+ expect(issues).toEqual([]);
231
+ ```
232
+
233
+ ## Validation and Testing
234
+
235
+ If you are building a reusable headless component library, validate your rendered UI against the resolved runtime policy in tests.
236
+
237
+ The core package exposes:
238
+
239
+ * `getEffectivePolicy(initData)` to read the resolved policy from `/init`
240
+ * `validateUIAgainstPolicy({ policy, state })` to detect mismatches such as wrong actions, layout, or mode
241
+
242
+ This is useful when your design system renders custom button arrangements and you want tests to catch policy drift early.
243
+
244
+ > ℹ️ **Info:**
245
+ > Use this together with Policy Packs when you want to preview multiple regional experiences locally.
@@ -0,0 +1,117 @@
1
+ ---
2
+ title: Callbacks
3
+ description: React to consent lifecycle events - initialization, consent changes, errors, and revocation reloads.
4
+ ---
5
+ Callbacks let you run custom code at key points in the consent lifecycle. Define them in the provider's `callbacks` option, or register them dynamically via `useConsentManager()`.
6
+
7
+ ## Configuration
8
+
9
+ ```tsx
10
+ import { type ReactNode } from 'react';
11
+ import { ConsentManagerProvider } from '@c15t/react';
12
+
13
+ export function ConsentManager({ children }: { children: ReactNode }) {
14
+ return (
15
+ <ConsentManagerProvider
16
+ options={{
17
+ mode: 'hosted',
18
+ backendURL: 'https://your-instance.c15t.dev',
19
+ callbacks: {
20
+ onBannerFetched: ({ jurisdiction, location, translations }) => {
21
+ console.log('Jurisdiction:', jurisdiction);
22
+ console.log('Country:', location.countryCode);
23
+ console.log('Language:', translations.language);
24
+ },
25
+ onConsentSet: ({ preferences }) => {
26
+ // Fire analytics event
27
+ analytics.track('consent_updated', { preferences });
28
+ },
29
+ onError: ({ error }) => {
30
+ errorReporter.captureMessage(error);
31
+ },
32
+ onBeforeConsentRevocationReload: ({ preferences }) => {
33
+ // Flush pending analytics before page reloads
34
+ analytics.flush();
35
+ },
36
+ },
37
+ }}
38
+ >
39
+ {children}
40
+ </ConsentManagerProvider>
41
+ );
42
+ }
43
+ ```
44
+
45
+ ## Available Callbacks
46
+
47
+ ### `onBannerFetched`
48
+
49
+ Called when the consent banner data is fetched from the backend (or loaded from SSR data). The payload includes jurisdiction info, location data, and resolved translations.
50
+
51
+ ```tsx
52
+ onBannerFetched: ({ jurisdiction, location, translations }) => {
53
+ // jurisdiction: 'GDPR' | 'CCPA' | { code: 'GDPR', message: '...' } | ...
54
+ // location: { countryCode: 'DE', regionCode: 'BY' }
55
+ // translations: { language: 'de', translations: {...} }
56
+ }
57
+ ```
58
+
59
+ ### `onConsentSet`
60
+
61
+ Called whenever consent preferences are saved - whether by user action (`saveConsents()`), automatic defaults, or on initialization when no jurisdiction is detected.
62
+
63
+ ```tsx
64
+ onConsentSet: ({ preferences }) => {
65
+ // preferences: { necessary: true, measurement: true, marketing: false, ... }
66
+ if (preferences.measurement) {
67
+ loadAnalytics();
68
+ }
69
+ }
70
+ ```
71
+
72
+ ### `onError`
73
+
74
+ Called when an error occurs during consent operations (e.g., API request failure). If no `onError` callback is provided, errors are logged to `console.error`.
75
+
76
+ ```tsx
77
+ onError: ({ error }) => {
78
+ // error: string describing what went wrong
79
+ Sentry.captureMessage(`Consent error: ${error}`);
80
+ }
81
+ ```
82
+
83
+ ### `onBeforeConsentRevocationReload`
84
+
85
+ Called synchronously before the page reloads due to consent revocation. This is your last chance to run cleanup before the reload. Keep this callback fast - avoid async operations.
86
+
87
+ ```tsx
88
+ onBeforeConsentRevocationReload: ({ preferences }) => {
89
+ // Flush any pending data
90
+ navigator.sendBeacon('/api/flush', JSON.stringify({ session: sessionId }));
91
+ }
92
+ ```
93
+
94
+ ## Dynamic Registration
95
+
96
+ Register or update callbacks at runtime using `setCallback()`:
97
+
98
+ ```tsx
99
+ import { useEffect } from 'react';
100
+ import { useConsentManager } from '@c15t/react';
101
+
102
+ function ConsentAnalytics() {
103
+ const { setCallback } = useConsentManager();
104
+
105
+ useEffect(() => {
106
+ setCallback('onConsentSet', ({ preferences }) => {
107
+ analytics.track('consent_changed', preferences);
108
+ });
109
+
110
+ return () => {
111
+ setCallback('onConsentSet', undefined);
112
+ };
113
+ }, [setCallback]);
114
+
115
+ return null;
116
+ }
117
+ ```
@@ -0,0 +1,174 @@
1
+ ---
2
+ title: ConsentBanner
3
+ description: A pre-built consent banner that appears when user consent is needed. Supports custom layout, button arrangement, and full compound component composition.
4
+ ---
5
+ `ConsentBanner` is a ready-to-use consent banner that appears automatically in **opt-in jurisdictions** (like GDPR) where explicit consent is required before tracking. In opt-out jurisdictions (like CCPA), the banner won't appear — users get an opt-out mechanism instead. It includes reject, accept, and customize buttons with configurable layout.
6
+
7
+ ## Basic Usage
8
+
9
+ ```tsx
10
+ import { ConsentManagerProvider, ConsentBanner } from '@c15t/react';
11
+
12
+ export function ConsentManager() {
13
+ return (
14
+ <ConsentManagerProvider options={{ mode: 'hosted', backendURL: 'https://your-instance.c15t.dev' }}>
15
+ <ConsentBanner />
16
+ </ConsentManagerProvider>
17
+ );
18
+ }
19
+ ```
20
+
21
+ ## Customizing Content
22
+
23
+ Override the default title, description, and button labels:
24
+
25
+ ```tsx
26
+ <ConsentBanner
27
+ title="We value your privacy"
28
+ description="We use cookies to enhance your browsing experience and analyze site traffic."
29
+ acceptButtonText="Accept all"
30
+ rejectButtonText="Reject all"
31
+ customizeButtonText="Manage preferences"
32
+ />
33
+ ```
34
+
35
+ ## Button Layout
36
+
37
+ The `layout` prop controls button arrangement. Each item is either a button ID or an array of button IDs (which groups them together):
38
+
39
+ ```tsx
40
+ {/* Default: reject and accept grouped, customize separate */}
41
+ <ConsentBanner layout={[['reject', 'accept'], 'customize']} />
42
+
43
+ {/* All buttons in one group */}
44
+ <ConsentBanner layout={[['reject', 'customize', 'accept']]} />
45
+
46
+ {/* Accept first, then reject and customize grouped */}
47
+ <ConsentBanner layout={['accept', ['reject', 'customize']]} />
48
+ ```
49
+
50
+ To stack groups vertically, pair the same grouped layout with `direction="column"`:
51
+
52
+ ```tsx
53
+ <ConsentBanner
54
+ layout={['customize', ['reject', 'accept']]}
55
+ direction="column"
56
+ />
57
+ ```
58
+
59
+ ## Policy-Driven UI Profile
60
+
61
+ When using backend runtime policies, `policy.ui.uiProfile` can control banner action presentation:
62
+
63
+ * `compact` — default desktop sizing
64
+ * `balanced` — auto-fills compact and grouped layouts with moderate emphasis
65
+ * `strict` — always fills action controls for explicit, high-clarity layouts
66
+
67
+ ## Theme-Level Button Styling
68
+
69
+ Use the provider `theme` prop to control how stock consent actions look:
70
+
71
+ ```tsx
72
+ <ConsentManagerProvider
73
+ options={{
74
+ theme: {
75
+ consentActions: {
76
+ default: { mode: 'stroke' },
77
+ accept: { variant: 'primary', mode: 'stroke' },
78
+ customize: { variant: 'neutral', mode: 'ghost' },
79
+ },
80
+ },
81
+ }}
82
+ >
83
+ <ConsentBanner />
84
+ </ConsentManagerProvider>
85
+ ```
86
+
87
+ Policy packs control grouping, ordering, and direction. The theme controls button appearance.
88
+
89
+ ### Primary Button
90
+
91
+ Highlight specific button(s) as the primary action:
92
+
93
+ ```tsx
94
+ {/* Single primary */}
95
+ <ConsentBanner primaryButton="accept" />
96
+
97
+ {/* Multiple primaries */}
98
+ <ConsentBanner primaryButton={['accept', 'customize']} />
99
+ ```
100
+
101
+ ## Legal Links
102
+
103
+ Control which legal links appear in the banner description:
104
+
105
+ ```tsx
106
+ {/* Show all configured links (default) */}
107
+ <ConsentBanner legalLinks={undefined} />
108
+
109
+ {/* Show no links */}
110
+ <ConsentBanner legalLinks={null} />
111
+
112
+ {/* Show specific links */}
113
+ <ConsentBanner legalLinks={['privacyPolicy', 'cookiePolicy']} />
114
+ ```
115
+
116
+ > ℹ️ **Info:**
117
+ > Legal link URLs are configured in the ConsentManagerProvider options via the legalLinks prop, not on the banner itself.
118
+
119
+ ## Compound Components
120
+
121
+ Build fully custom banner layouts using sub-components:
122
+
123
+ ```tsx
124
+ <ConsentBanner.Root>
125
+ <ConsentBanner.Overlay />
126
+ <ConsentBanner.Card>
127
+ <ConsentBanner.Header>
128
+ <ConsentBanner.Title />
129
+ <ConsentBanner.Description />
130
+ </ConsentBanner.Header>
131
+ <ConsentBanner.Footer>
132
+ <ConsentBanner.FooterSubGroup>
133
+ <ConsentBanner.RejectButton />
134
+ <ConsentBanner.AcceptButton />
135
+ </ConsentBanner.FooterSubGroup>
136
+ <ConsentBanner.CustomizeButton />
137
+ </ConsentBanner.Footer>
138
+ </ConsentBanner.Card>
139
+ </ConsentBanner.Root>
140
+ ```
141
+
142
+ * `ConsentBanner.Root` — Outermost container, provides theme context
143
+ * `ConsentBanner.Card` — Main content card with optional focus trapping
144
+ * `ConsentBanner.Header` — Contains title and description
145
+ * `ConsentBanner.Title` — Heading, defaults to translation `consentBanner.title`
146
+ * `ConsentBanner.Description` — Description text, supports `legalLinks` prop
147
+ * `ConsentBanner.Footer` — Action buttons container
148
+ * `ConsentBanner.FooterSubGroup` — Groups related buttons together
149
+ * `ConsentBanner.RejectButton` — Rejects all consent
150
+ * `ConsentBanner.CustomizeButton` — Opens the consent dialog
151
+ * `ConsentBanner.AcceptButton` — Accepts all consent
152
+ * `ConsentBanner.Overlay` — Optional backdrop overlay
153
+
154
+ ## Props
155
+
156
+ ### ConsentBannerProps
157
+
158
+ |Property|Type|Description|Default|Required|
159
+ |:--|:--|:--|:--|:--:|
160
+ |noStyle|boolean \|undefined|When true, removes all default styling from the component|false|Optional|
161
+ |title|ReactNode|Content to display as the banner's title|undefined|Optional|
162
+ |description|ReactNode|Content to display as the banner's description|undefined|Optional|
163
+ |rejectButtonText|ReactNode|Content to display on the reject button|undefined|Optional|
164
+ |customizeButtonText|ReactNode|Content to display on the customize button|undefined|Optional|
165
+ |acceptButtonText|ReactNode|Content to display on the accept button|undefined|Optional|
166
+ |scrollLock|boolean \|undefined|When true, the consent banner will lock the scroll of the page|false|Optional|
167
+ |trapFocus|boolean \|undefined|When true, the consent banner will trap focus|true|Optional|
168
+ |disableAnimation|boolean \|undefined|When true, disables the entrance/exit animations|false|Optional|
169
+ |legalLinks|(keyof LegalLinksTranslations)\[] \|null \|undefined|Controls which legal links to display. Options: \`undefined\` (default): Shows all available legal links; \`null\`: Explicitly hides all legal links; Array of keys: Shows only the specified legal links|-|Optional|
170
+ |layout|ConsentBannerLayout \|undefined|Defines the layout of buttons in the footer. Allows reordering and grouping of buttons.|-|Optional|
171
+ |direction|PolicyUiActionDirection \|undefined|Defines how footer button groups flow.|-|Optional|
172
+ |primaryButton|ConsentBannerButton \|undefined|Specifies which button(s) should be highlighted as the primary action.|-|Optional|
173
+ |models|Model \|undefined|Which consent models this banner responds to.|\['opt-in']|Optional|
174
+ |uiSource|string \|undefined|Override the UI source identifier sent with consent API calls.|'banner'|Optional|
@@ -0,0 +1,59 @@
1
+ ---
2
+ title: ConsentDialogLink
3
+ description: An inline trigger for opening the consent dialog from footers, legal pages, and account settings.
4
+ ---
5
+ `ConsentDialogLink` is an inline trigger for opening the consent dialog from places like site footers, legal pages, or account settings. It is unstyled by default, so it inherits your app's typography and link/button styles.
6
+
7
+ ## Basic Usage
8
+
9
+ ```tsx
10
+ import { ConsentDialogLink } from '@c15t/react/components/consent-dialog-link';
11
+
12
+ export function SiteFooter() {
13
+ return (
14
+ <footer>
15
+ <ConsentDialogLink>
16
+ Your privacy settings
17
+ </ConsentDialogLink>
18
+ </footer>
19
+ );
20
+ }
21
+ ```
22
+
23
+ ## Footer Link (unstyled by default)
24
+
25
+ ```tsx
26
+ <footer>
27
+ <ConsentDialogLink>
28
+ Your privacy settings
29
+ </ConsentDialogLink>
30
+ </footer>
31
+ ```
32
+
33
+ ## Render as an Anchor
34
+
35
+ Use `asChild` to keep semantic anchor markup while still opening the dialog:
36
+
37
+ ```tsx
38
+ <ConsentDialogLink asChild>
39
+ <a href="#privacy-settings">Manage Preferences</a>
40
+ </ConsentDialogLink>
41
+ ```
42
+
43
+ ## Optional Styling Control
44
+
45
+ The component defaults to `noStyle={true}`. Set it to `false` if you want c15t button styles:
46
+
47
+ ```tsx
48
+ <ConsentDialogLink noStyle={false}>
49
+ Privacy Settings
50
+ </ConsentDialogLink>
51
+ ```
52
+
53
+ ## Props
54
+
55
+ ### ConsentDialogLinkProps
56
+
57
+ |Property|Type|Description|Default|Required|
58
+ |:--|:--|:--|:--|:--:|
59
+ |children|ReactNode|Custom trigger content, for example "Your privacy settings" or "Manage preferences".|-|✅ Required|