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