@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,153 @@
1
+ ---
2
+ title: Server-Side Utilities
3
+ description: Fetch consent data on the server for SSR hydration — eliminate the loading flash and improve performance.
4
+ ---
5
+ The `@c15t/react/server` module provides utilities for fetching consent data on the server before rendering. This enables SSR hydration — consent state is available immediately on page load without a client-side fetch, eliminating the consent banner flash.
6
+
7
+ > ℹ️ **Info:**
8
+ > SSR hydration is part of the initialization flow. When SSR data is available, the client skips the API fetch entirely.
9
+
10
+ ```ts
11
+ import {
12
+ fetchSSRData,
13
+ extractRelevantHeaders,
14
+ normalizeBackendURL,
15
+ validateBackendURL,
16
+ } from '@c15t/react/server';
17
+ ```
18
+
19
+ > ℹ️ **Info:**
20
+ > If you're using Next.js, the @c15t/nextjs package wraps these utilities with automatic header resolution. See the Next.js docs for framework-specific usage.
21
+
22
+ ## fetchSSRData
23
+
24
+ The primary function for fetching consent data on the server. It calls the c15t backend's `/init` endpoint with the user's request headers and returns the initial consent data.
25
+
26
+ ```ts
27
+ import { fetchSSRData } from '@c15t/react/server';
28
+
29
+ // In your server handler / page loader
30
+ const ssrData = await fetchSSRData({
31
+ backendURL: 'https://your-instance.c15t.dev',
32
+ headers: request.headers,
33
+ debug: true,
34
+ });
35
+ ```
36
+
37
+ ### Options
38
+
39
+ |Property|Type|Description|Default|Required|
40
+ |:--|:--|:--|:--|:--:|
41
+ |headers|Headers|Request headers from the framework. These should be the incoming request headers that contain geo-location information (cf-ipcountry, x-vercel-ip-country, etc.)|-|✅ Required|
42
+
43
+ ### Return Value
44
+
45
+ Returns `SSRInitialData | undefined`. The data includes the init response (jurisdiction, translations, consent model) and GVL data when IAB is configured.
46
+
47
+ ### Passing SSR Data to the Provider
48
+
49
+ Pass the result as a Promise to the provider's `ssrData` option:
50
+
51
+ ```tsx
52
+ import { type ReactNode } from 'react';
53
+ import { ConsentManagerProvider, ConsentBanner, ConsentDialog } from '@c15t/react';
54
+ import { fetchSSRData } from '@c15t/react/server';
55
+
56
+ // Server component or page loader
57
+ async function getSSRData(headers: Headers) {
58
+ return fetchSSRData({
59
+ backendURL: 'https://your-instance.c15t.dev',
60
+ headers,
61
+ });
62
+ }
63
+
64
+ export default function ConsentManager({
65
+ children,
66
+ ssrData,
67
+ }: {
68
+ children: ReactNode;
69
+ ssrData: Promise<any>;
70
+ }) {
71
+ return (
72
+ <ConsentManagerProvider
73
+ options={{
74
+ mode: 'hosted',
75
+ backendURL: 'https://your-instance.c15t.dev',
76
+ ssrData,
77
+ }}
78
+ >
79
+ <ConsentBanner />
80
+ <ConsentDialog />
81
+ {children}
82
+ </ConsentManagerProvider>
83
+ );
84
+ }
85
+ ```
86
+
87
+ ## extractRelevantHeaders
88
+
89
+ Extracts geo-location and forwarding headers from the incoming request. Supports headers from Cloudflare, Vercel, AWS CloudFront, and generic proxies.
90
+
91
+ ```ts
92
+ import { extractRelevantHeaders } from '@c15t/react/server';
93
+
94
+ const relevant = extractRelevantHeaders(request.headers);
95
+ // Returns: { 'cf-ipcountry': 'DE', 'accept-language': 'de-DE', ... }
96
+ ```
97
+
98
+ ### Recognized Headers
99
+
100
+ |Header|Source|Contains|
101
+ |--|--|--|
102
+ |`cf-ipcountry`|Cloudflare|Country code|
103
+ |`x-vercel-ip-country`|Vercel|Country code|
104
+ |`x-amz-cf-ipcountry`|AWS CloudFront|Country code|
105
+ |`x-vercel-ip-country-region`|Vercel|Region code|
106
+ |`accept-language`|Browser|Language preference|
107
+ |`x-forwarded-host`|Proxy|Original host|
108
+ |`x-forwarded-for`|Proxy|Client IP|
109
+
110
+ ## normalizeBackendURL
111
+
112
+ Resolves a backend URL to an absolute URL. Absolute URLs are returned as-is. Relative URLs (starting with `/`) are resolved using the request's `Host` or `Referer` headers.
113
+
114
+ ```ts
115
+ import { normalizeBackendURL } from '@c15t/react/server';
116
+
117
+ // Absolute — returned as-is
118
+ normalizeBackendURL('https://api.example.com/', headers);
119
+ // → 'https://api.example.com'
120
+
121
+ // Relative — resolved from headers
122
+ normalizeBackendURL('/api/consent', headers);
123
+ // → 'https://example.com/api/consent'
124
+ ```
125
+
126
+ ## validateBackendURL
127
+
128
+ Validates and normalizes a URL without resolving relative paths. Useful for configuration validation.
129
+
130
+ ```ts
131
+ import { validateBackendURL } from '@c15t/react/server';
132
+
133
+ validateBackendURL('https://api.example.com/');
134
+ // → { isAbsolute: true, normalizedURL: 'https://api.example.com' }
135
+
136
+ validateBackendURL('/api/consent/');
137
+ // → { isAbsolute: false, normalizedURL: '/api/consent' }
138
+ ```
139
+
140
+ ## Debugging SSR
141
+
142
+ Use the [useSSRStatus](/docs/frameworks/react/hooks/use-ssr-status) hook on the client to verify SSR data was consumed:
143
+
144
+ ```tsx
145
+ import { useSSRStatus } from '@c15t/react';
146
+
147
+ function DebugSSR() {
148
+ const { ssrDataUsed, ssrSkippedReason } = useSSRStatus();
149
+
150
+ if (ssrDataUsed) return <span>SSR hydration successful</span>;
151
+ return <span>SSR skipped: {ssrSkippedReason ?? 'unknown'}</span>;
152
+ }
153
+ ```
@@ -0,0 +1,84 @@
1
+ ---
2
+ title: Class Names
3
+ description: Style consent components using className props and per-slot className targeting via the theme.
4
+ ---
5
+ ## Component className
6
+
7
+ All consent components accept a `className` prop:
8
+
9
+ ```tsx
10
+ <ConsentBanner className="my-banner" />
11
+ <ConsentDialog className="my-dialog" />
12
+ <ConsentWidget className="my-widget" />
13
+ ```
14
+
15
+ ## Per-Slot className
16
+
17
+ Target individual component parts via the theme's `slots` object. Each slot accepts a string (className) or an object with `className` and `style`:
18
+
19
+ ```tsx
20
+ const theme = {
21
+ slots: {
22
+ consentBannerTitle: 'text-xl font-semibold',
23
+ consentBannerDescription: 'text-sm text-gray-600',
24
+ consentBannerFooter: 'flex gap-3',
25
+ buttonPrimary: 'rounded-full px-6',
26
+ },
27
+ } satisfies Theme;
28
+ ```
29
+
30
+ ## Combining with CSS Modules
31
+
32
+ ```tsx
33
+ import styles from './consent.module.css';
34
+
35
+ const theme = {
36
+ slots: {
37
+ consentBannerCard: styles.bannerCard,
38
+ consentBannerTitle: styles.bannerTitle,
39
+ buttonPrimary: styles.primaryButton,
40
+ },
41
+ } satisfies Theme;
42
+ ```
43
+
44
+ ```css title="consent.module.css"
45
+ .bannerCard {
46
+ backdrop-filter: blur(12px);
47
+ background: rgba(255, 255, 255, 0.9);
48
+ }
49
+
50
+ .bannerTitle {
51
+ font-size: 1.25rem;
52
+ font-weight: 700;
53
+ }
54
+
55
+ .primaryButton {
56
+ border-radius: 9999px;
57
+ text-transform: uppercase;
58
+ letter-spacing: 0.05em;
59
+ }
60
+ ```
61
+
62
+ ## noStyle Mode
63
+
64
+ Use `noStyle` when you want to remove defaults and style from scratch:
65
+
66
+ ```tsx
67
+ {/* Remove all styles from a specific component */}
68
+ <ConsentBanner noStyle />
69
+
70
+ {/* Remove all styles globally */}
71
+ <ConsentManagerProvider options={{ noStyle: true, ... }}>
72
+ ```
73
+
74
+ You can also set `noStyle` per-slot:
75
+
76
+ ```tsx
77
+ const theme = {
78
+ slots: {
79
+ consentBannerCard: { noStyle: true, className: 'my-custom-card' },
80
+ },
81
+ } satisfies Theme;
82
+ ```
83
+
84
+ For full custom markup and behavior, continue to [Headless Mode](../headless).
@@ -0,0 +1,82 @@
1
+ ---
2
+ title: Color Scheme
3
+ description: Support light mode, dark mode, and system preference detection in consent components.
4
+ ---
5
+ c15t supports light and dark mode through the theme's `colors` and `dark` token groups. The active color scheme is determined by one of three methods:
6
+
7
+ 1. **Explicit setting** via the `colorScheme` option
8
+ 2. **CSS class detection** - c15t checks for `.dark` on the document element
9
+ 3. **System preference** - matches `prefers-color-scheme` media query
10
+
11
+ ## Configuration
12
+
13
+ Set the color scheme on the provider:
14
+
15
+ ```tsx
16
+ import { type ReactNode } from 'react';
17
+ import { ConsentManagerProvider } from '@c15t/react';
18
+
19
+ function ConsentManager({ children }: { children: ReactNode }) {
20
+ return (
21
+ <ConsentManagerProvider
22
+ options={{
23
+ mode: 'hosted',
24
+ backendURL: 'https://your-instance.c15t.dev',
25
+ colorScheme: 'system', // 'light' | 'dark' | 'system'
26
+ theme: {
27
+ colors: {
28
+ primary: '#6366f1',
29
+ surface: '#ffffff',
30
+ text: '#1f2937',
31
+ },
32
+ dark: {
33
+ primary: '#818cf8',
34
+ surface: '#1f2937',
35
+ text: '#f9fafb',
36
+ },
37
+ },
38
+ }}
39
+ >
40
+ {children}
41
+ </ConsentManagerProvider>
42
+ );
43
+ }
44
+ ```
45
+
46
+ ## useColorScheme Hook
47
+
48
+ For programmatic control over the color scheme:
49
+
50
+ ```tsx
51
+ import { useColorScheme } from '@c15t/react';
52
+
53
+ function ThemeToggle() {
54
+ // Pass the desired scheme - 'light', 'dark', 'system', or null (disable)
55
+ useColorScheme('system');
56
+ }
57
+ ```
58
+
59
+ |Value|Behavior|
60
+ |--|--|
61
+ |`'light'`|Force light mode|
62
+ |`'dark'`|Force dark mode|
63
+ |`'system'`|Follow `prefers-color-scheme` media query|
64
+ |`null`|Disable - c15t won't manage color scheme|
65
+
66
+ ## How Dark Mode Works
67
+
68
+ When dark mode is active, c15t applies the `dark` token values as CSS variable overrides. Only tokens specified in `dark` are overridden - unset tokens fall back to the `colors` values.
69
+
70
+ ```tsx
71
+ const theme = {
72
+ colors: {
73
+ surface: '#ffffff', // Light mode
74
+ text: '#1f2937', // Light mode
75
+ },
76
+ dark: {
77
+ surface: '#1f2937', // Dark mode override
78
+ text: '#f9fafb', // Dark mode override
79
+ // primary is NOT set - inherits from colors.primary
80
+ },
81
+ } satisfies Theme;
82
+ ```
@@ -0,0 +1,92 @@
1
+ ---
2
+ title: CSS Variables
3
+ description: Reference for all --c15t-* CSS custom properties generated by the theme system.
4
+ ---
5
+ Every theme token is converted to a `--c15t-*` CSS custom property at runtime. You can override these variables in your stylesheet without using the JavaScript theme API.
6
+
7
+ ## Variable Reference
8
+
9
+ ### ThemeCSSVariables
10
+
11
+ |Property|Type|Description|Default|Required|
12
+ |:--|:--|:--|:--|:--:|
13
+ |--c15t-primary|string \|undefined|\`colors.primary\` (default: \`hsl(228, 100%, 60%)\`)|-|Optional|
14
+ |--c15t-primary-hover|string \|undefined|\`colors.primaryHover\` (default: \`hsl(228, 100%, 55%)\`)|-|Optional|
15
+ |--c15t-surface|string \|undefined|\`colors.surface\` (default: \`hsl(0, 0%, 100%)\`)|-|Optional|
16
+ |--c15t-surface-hover|string \|undefined|\`colors.surfaceHover\` (default: \`hsl(0, 0%, 98%)\`)|-|Optional|
17
+ |--c15t-border|string \|undefined|\`colors.border\` (default: \`hsl(0, 0%, 90%)\`)|-|Optional|
18
+ |--c15t-border-hover|string \|undefined|\`colors.borderHover\` (default: \`hsl(0, 0%, 85%)\`)|-|Optional|
19
+ |--c15t-text|string \|undefined|\`colors.text\` (default: \`hsl(0, 0%, 10%)\`)|-|Optional|
20
+ |--c15t-text-muted|string \|undefined|\`colors.textMuted\` (default: \`hsl(0, 0%, 40%)\`)|-|Optional|
21
+ |--c15t-text-on-primary|string \|undefined|\`colors.textOnPrimary\` (default: \`hsl(0, 0%, 100%)\`)|-|Optional|
22
+ |--c15t-overlay|string \|undefined|\`colors.overlay\` (default: \`hsla(0, 0%, 0%, 0.5)\`)|-|Optional|
23
+ |--c15t-switch-track|string \|undefined|\`colors.switchTrack\` (default: \`hsl(0, 0%, 85%)\`)|-|Optional|
24
+ |--c15t-switch-track-active|string \|undefined|\`colors.switchTrackActive\` (default: \`hsl(228, 100%, 60%)\`)|-|Optional|
25
+ |--c15t-switch-thumb|string \|undefined|\`colors.switchThumb\` (default: \`hsl(0, 0%, 100%)\`)|-|Optional|
26
+ |--c15t-font-family|string \|undefined|\`typography.fontFamily\` (default: \`system-ui, -apple-system, sans-serif\`)|-|Optional|
27
+ |--c15t-font-size-sm|string \|undefined|\`typography.fontSize.sm\` (default: \`0.875rem\`)|-|Optional|
28
+ |--c15t-font-size-base|string \|undefined|\`typography.fontSize.base\` (default: \`1rem\`)|-|Optional|
29
+ |--c15t-font-size-lg|string \|undefined|\`typography.fontSize.lg\` (default: \`1.125rem\`)|-|Optional|
30
+ |--c15t-font-weight-normal|string \|undefined|\`typography.fontWeight.normal\` (default: \`400\`)|-|Optional|
31
+ |--c15t-font-weight-medium|string \|undefined|\`typography.fontWeight.medium\` (default: \`500\`)|-|Optional|
32
+ |--c15t-font-weight-semibold|string \|undefined|\`typography.fontWeight.semibold\` (default: \`600\`)|-|Optional|
33
+ |--c15t-line-height-tight|string \|undefined|\`typography.lineHeight.tight\` (default: \`1.25\`)|-|Optional|
34
+ |--c15t-line-height-normal|string \|undefined|\`typography.lineHeight.normal\` (default: \`1.5\`)|-|Optional|
35
+ |--c15t-line-height-relaxed|string \|undefined|\`typography.lineHeight.relaxed\` (default: \`1.75\`)|-|Optional|
36
+ |--c15t-space-xs|string \|undefined|\`spacing.xs\` (default: \`0.25rem\`)|-|Optional|
37
+ |--c15t-space-sm|string \|undefined|\`spacing.sm\` (default: \`0.5rem\`)|-|Optional|
38
+ |--c15t-space-md|string \|undefined|\`spacing.md\` (default: \`1rem\`)|-|Optional|
39
+ |--c15t-space-lg|string \|undefined|\`spacing.lg\` (default: \`1.5rem\`)|-|Optional|
40
+ |--c15t-space-xl|string \|undefined|\`spacing.xl\` (default: \`2rem\`)|-|Optional|
41
+ |--c15t-radius-sm|string \|undefined|\`radius.sm\` (default: \`0.25rem\`)|-|Optional|
42
+ |--c15t-radius-md|string \|undefined|\`radius.md\` (default: \`0.5rem\`)|-|Optional|
43
+ |--c15t-radius-lg|string \|undefined|\`radius.lg\` (default: \`0.75rem\`)|-|Optional|
44
+ |--c15t-radius-full|string \|undefined|\`radius.full\` (default: \`9999px\`)|-|Optional|
45
+ |--c15t-shadow-sm|string \|undefined|\`shadows.sm\` (default: \`0 1px 2px hsla(0, 0%, 0%, 0.05)\`)|-|Optional|
46
+ |--c15t-shadow-md|string \|undefined|\`shadows.md\` (default: \`0 4px 12px hsla(0, 0%, 0%, 0.08)\`)|-|Optional|
47
+ |--c15t-shadow-lg|string \|undefined|\`shadows.lg\` (default: \`0 8px 24px hsla(0, 0%, 0%, 0.12)\`)|-|Optional|
48
+ |--c15t-duration-fast|string \|undefined|\`motion.duration.fast\` (default: \`100ms\`)|-|Optional|
49
+ |--c15t-duration-normal|string \|undefined|\`motion.duration.normal\` (default: \`200ms\`)|-|Optional|
50
+ |--c15t-duration-slow|string \|undefined|\`motion.duration.slow\` (default: \`300ms\`)|-|Optional|
51
+ |--c15t-easing|string \|undefined|\`motion.easing\` (default: \`cubic-bezier(0.4, 0, 0.2, 1)\`)|-|Optional|
52
+ |--c15t-easing-out|string \|undefined|\`motion.easingOut\` (default: \`cubic-bezier(0.215, 0.61, 0.355, 1)\`)|-|Optional|
53
+ |--c15t-easing-in-out|string \|undefined|\`motion.easingInOut\` (default: \`cubic-bezier(0.645, 0.045, 0.355, 1)\`)|-|Optional|
54
+ |--c15t-easing-spring|string \|undefined|\`motion.easingSpring\` (default: \`cubic-bezier(0.34, 1.56, 0.64, 1)\`)|-|Optional|
55
+
56
+ ## Overriding Variables
57
+
58
+ Override in your stylesheet:
59
+
60
+ ```css
61
+ :root {
62
+ --c15t-primary: #8b5cf6;
63
+ --c15t-surface: #fafafa;
64
+ --c15t-radius-md: 1rem;
65
+ }
66
+
67
+ /* Dark mode overrides */
68
+ .dark,
69
+ .c15t-dark {
70
+ --c15t-primary: #a78bfa;
71
+ --c15t-surface: #18181b;
72
+ --c15t-text: #fafafa;
73
+ }
74
+ ```
75
+
76
+ ## Scoped Overrides
77
+
78
+ Target specific components by scoping variables:
79
+
80
+ ```tsx
81
+ <div className="checkout-consent">
82
+ <ConsentBanner />
83
+ </div>
84
+ ```
85
+
86
+ ```css
87
+ /* Only affect c15t components inside .checkout-consent */
88
+ .checkout-consent {
89
+ --c15t-surface: #f0f9ff;
90
+ --c15t-radius-lg: 1.5rem;
91
+ }
92
+ ```