@c15t/react 2.0.0-rc.4 → 2.0.0-rc.6

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 (527) hide show
  1. package/dist/components/consent-banner/atoms/overlay.cjs +1 -1
  2. package/dist/components/consent-banner/atoms/root.cjs +1 -1
  3. package/dist/components/consent-banner/atoms/root.js +1 -1
  4. package/dist/components/consent-banner/components.cjs +1 -1
  5. package/dist/components/consent-banner/components.js +1 -1
  6. package/dist/components/consent-banner/consent-banner.cjs +1 -1
  7. package/dist/components/consent-banner/consent-banner.js +1 -1
  8. package/dist/components/consent-banner/error-boundary.cjs +1 -1
  9. package/dist/components/consent-banner/index.cjs +1 -1
  10. package/dist/components/consent-banner/index.js +1 -1
  11. package/dist/components/consent-dialog/atoms/card.cjs +1 -1
  12. package/dist/components/consent-dialog/atoms/card.js +1 -1
  13. package/dist/components/consent-dialog/atoms/overlay.cjs +1 -1
  14. package/dist/components/consent-dialog/atoms/overlay.js +1 -1
  15. package/dist/components/consent-dialog/atoms/root.cjs +1 -1
  16. package/dist/components/consent-dialog/atoms/root.js +1 -1
  17. package/dist/components/consent-dialog/consent-dialog.cjs +1 -1
  18. package/dist/components/consent-dialog/consent-dialog.js +1 -1
  19. package/dist/components/consent-dialog/index.cjs +1 -1
  20. package/dist/components/consent-dialog/index.js +1 -1
  21. package/dist/components/consent-dialog-link/index.cjs +1 -1
  22. package/dist/components/consent-dialog-link/index.js +1 -1
  23. package/dist/components/consent-dialog-trigger/atoms/button.cjs +1 -1
  24. package/dist/components/consent-dialog-trigger/atoms/icon.cjs +1 -1
  25. package/dist/components/consent-dialog-trigger/atoms/icon.js +1 -1
  26. package/dist/components/consent-dialog-trigger/atoms/root.cjs +1 -1
  27. package/dist/components/consent-dialog-trigger/atoms/root.js +1 -1
  28. package/dist/components/consent-dialog-trigger/atoms/text.cjs +1 -1
  29. package/dist/components/consent-dialog-trigger/atoms/text.js +1 -1
  30. package/dist/components/consent-dialog-trigger/consent-dialog-trigger.cjs +1 -1
  31. package/dist/components/consent-dialog-trigger/consent-dialog-trigger.js +1 -1
  32. package/dist/components/consent-dialog-trigger/index.cjs +1 -1
  33. package/dist/components/consent-dialog-trigger/index.js +1 -1
  34. package/dist/components/consent-dialog-trigger/types.cjs +1 -1
  35. package/dist/components/consent-dialog-trigger/use-draggable.cjs +1 -1
  36. package/dist/components/consent-dialog-trigger/use-draggable.js +1 -1
  37. package/dist/components/consent-preferences-link/consent-preferences-link.cjs +1 -1
  38. package/dist/components/consent-preferences-link/index.cjs +1 -1
  39. package/dist/components/consent-preferences-link/index.js +1 -1
  40. package/dist/components/consent-widget/atoms/accordion.cjs +1 -1
  41. package/dist/components/consent-widget/atoms/accordion.js +1 -1
  42. package/dist/components/consent-widget/atoms/button.cjs +1 -1
  43. package/dist/components/consent-widget/atoms/button.js +1 -1
  44. package/dist/components/consent-widget/atoms/footer.cjs +1 -1
  45. package/dist/components/consent-widget/atoms/root.cjs +1 -1
  46. package/dist/components/consent-widget/consent-widget.cjs +1 -1
  47. package/dist/components/consent-widget/consent-widget.js +1 -1
  48. package/dist/components/consent-widget/index.cjs +1 -1
  49. package/dist/components/consent-widget/index.js +1 -1
  50. package/dist/components/consent-widget/types.cjs +1 -1
  51. package/dist/components/frame/atoms.cjs +1 -1
  52. package/dist/components/frame/frame.cjs +1 -1
  53. package/dist/components/frame/frame.js +1 -1
  54. package/dist/components/frame/index.cjs +1 -1
  55. package/dist/components/frame/index.js +1 -1
  56. package/dist/components/frame/types.cjs +1 -1
  57. package/dist/components/iab-consent-banner/atoms/button-group.cjs +1 -1
  58. package/dist/components/iab-consent-banner/atoms/card.cjs +1 -1
  59. package/dist/components/iab-consent-banner/atoms/description.cjs +1 -1
  60. package/dist/components/iab-consent-banner/atoms/footer.cjs +1 -1
  61. package/dist/components/iab-consent-banner/atoms/header.cjs +1 -1
  62. package/dist/components/iab-consent-banner/atoms/overlay.cjs +1 -1
  63. package/dist/components/iab-consent-banner/atoms/root.cjs +1 -1
  64. package/dist/components/iab-consent-banner/atoms/root.js +1 -1
  65. package/dist/components/iab-consent-banner/atoms/title.cjs +1 -1
  66. package/dist/components/iab-consent-banner/iab-consent-banner.cjs +1 -1
  67. package/dist/components/iab-consent-banner/iab-consent-banner.js +1 -1
  68. package/dist/components/iab-consent-banner/index.cjs +1 -1
  69. package/dist/components/iab-consent-banner/index.js +1 -1
  70. package/dist/components/iab-consent-dialog/atoms/card.cjs +1 -1
  71. package/dist/components/iab-consent-dialog/atoms/content.cjs +1 -1
  72. package/dist/components/iab-consent-dialog/atoms/footer.cjs +1 -1
  73. package/dist/components/iab-consent-dialog/atoms/footer.js +1 -1
  74. package/dist/components/iab-consent-dialog/atoms/header.cjs +1 -1
  75. package/dist/components/iab-consent-dialog/atoms/header.js +1 -1
  76. package/dist/components/iab-consent-dialog/atoms/overlay.cjs +1 -1
  77. package/dist/components/iab-consent-dialog/atoms/purpose-item.cjs +1 -1
  78. package/dist/components/iab-consent-dialog/atoms/purpose-item.js +1 -1
  79. package/dist/components/iab-consent-dialog/atoms/root.cjs +1 -1
  80. package/dist/components/iab-consent-dialog/atoms/root.js +1 -1
  81. package/dist/components/iab-consent-dialog/atoms/stack-item.cjs +1 -1
  82. package/dist/components/iab-consent-dialog/atoms/stack-item.js +1 -1
  83. package/dist/components/iab-consent-dialog/atoms/tabs.cjs +1 -1
  84. package/dist/components/iab-consent-dialog/atoms/tabs.js +1 -1
  85. package/dist/components/iab-consent-dialog/atoms/vendor-list.cjs +1 -1
  86. package/dist/components/iab-consent-dialog/atoms/vendor-list.js +1 -1
  87. package/dist/components/iab-consent-dialog/hooks/use-gvl-data.cjs +1 -1
  88. package/dist/components/iab-consent-dialog/iab-consent-dialog.cjs +1 -1
  89. package/dist/components/iab-consent-dialog/iab-consent-dialog.js +1 -1
  90. package/dist/components/iab-consent-dialog/index.cjs +1 -1
  91. package/dist/components/iab-consent-dialog/index.js +1 -1
  92. package/dist/components/iab-consent-dialog/types.cjs +1 -1
  93. package/dist/components/iab-consent-dialog/use-iab-translations.cjs +1 -1
  94. package/dist/components/shared/libs/policy-actions.cjs +1 -0
  95. package/dist/components/shared/libs/policy-actions.js +1 -0
  96. package/dist/components/shared/libs/polymorphic.cjs +1 -1
  97. package/dist/components/shared/libs/recursive-clone-children.cjs +1 -1
  98. package/dist/components/shared/libs/slot.cjs +1 -0
  99. package/dist/components/shared/libs/slot.js +1 -0
  100. package/dist/components/shared/libs/use-controllable-state.cjs +1 -0
  101. package/dist/components/shared/libs/use-controllable-state.js +1 -0
  102. package/dist/components/shared/primitives/box.cjs +1 -1
  103. package/dist/components/shared/primitives/box.js +1 -1
  104. package/dist/components/shared/primitives/button.cjs +1 -1
  105. package/dist/components/shared/primitives/button.js +1 -1
  106. package/dist/components/shared/primitives/button.types.cjs +1 -1
  107. package/dist/components/shared/primitives/legal-links/index.cjs +1 -1
  108. package/dist/components/shared/primitives/legal-links/index.js +1 -1
  109. package/dist/components/shared/ui/accordion/accordion.cjs +1 -1
  110. package/dist/components/shared/ui/accordion/accordion.js +1 -1
  111. package/dist/components/shared/ui/accordion/accordion.types.cjs +1 -1
  112. package/dist/components/shared/ui/accordion/index.cjs +1 -1
  113. package/dist/components/shared/ui/animated-collapse/animated-collapse.cjs +1 -1
  114. package/dist/components/shared/ui/animated-collapse/index.cjs +1 -1
  115. package/dist/components/shared/ui/animated-collapse/index.js +1 -1
  116. package/dist/components/shared/ui/button/button.cjs +1 -1
  117. package/dist/components/shared/ui/button/button.js +1 -1
  118. package/dist/components/shared/ui/button/button.types.cjs +1 -1
  119. package/dist/components/shared/ui/button/index.cjs +1 -1
  120. package/dist/components/shared/ui/collapsible/collapsible.cjs +1 -0
  121. package/dist/components/shared/ui/collapsible/collapsible.js +1 -0
  122. package/dist/components/shared/ui/collapsible/index.cjs +1 -0
  123. package/dist/components/shared/ui/collapsible/index.js +1 -0
  124. package/dist/components/shared/ui/dialog/dialog.cjs +1 -0
  125. package/dist/components/shared/ui/dialog/dialog.js +1 -0
  126. package/dist/components/shared/ui/dialog/index.cjs +1 -0
  127. package/dist/components/shared/ui/dialog/index.js +1 -0
  128. package/dist/components/shared/ui/icon.cjs +1 -1
  129. package/dist/components/shared/ui/logo.cjs +1 -1
  130. package/dist/components/shared/ui/preference-item/index.cjs +1 -0
  131. package/dist/components/shared/ui/preference-item/index.js +1 -0
  132. package/dist/components/shared/ui/preference-item/preference-item.cjs +1 -0
  133. package/dist/components/shared/ui/preference-item/preference-item.js +1 -0
  134. package/dist/components/shared/ui/switch/index.cjs +1 -1
  135. package/dist/components/shared/ui/switch/switch.cjs +1 -1
  136. package/dist/components/shared/ui/switch/switch.js +1 -1
  137. package/dist/components/shared/ui/switch/switch.types.cjs +1 -1
  138. package/dist/components/shared/ui/tabs/index.cjs +1 -0
  139. package/dist/components/shared/ui/tabs/index.js +1 -0
  140. package/dist/components/shared/ui/tabs/tabs.cjs +1 -0
  141. package/dist/components/shared/ui/tabs/tabs.js +1 -0
  142. package/dist/context/consent-manager-context.cjs +1 -1
  143. package/dist/context/consent-tracking-context.cjs +1 -1
  144. package/dist/context/theme-context.cjs +1 -1
  145. package/dist/headless.cjs +1 -1
  146. package/dist/headless.js +1 -1
  147. package/dist/hooks/index.cjs +1 -1
  148. package/dist/hooks/index.js +1 -1
  149. package/dist/hooks/use-color-scheme.cjs +1 -1
  150. package/dist/hooks/use-component-config.cjs +1 -1
  151. package/dist/hooks/use-consent-dialog-trigger.cjs +1 -0
  152. package/dist/hooks/use-consent-dialog-trigger.js +1 -0
  153. package/dist/hooks/use-consent-manager.cjs +1 -1
  154. package/dist/hooks/use-consent-manager.js +1 -1
  155. package/dist/hooks/use-focus-trap.cjs +1 -1
  156. package/dist/hooks/use-focus-trap.js +1 -1
  157. package/dist/hooks/use-headless-consent-ui.cjs +1 -0
  158. package/dist/hooks/use-headless-consent-ui.js +1 -0
  159. package/dist/hooks/use-headless-iab-consent-ui.cjs +1 -0
  160. package/dist/hooks/use-headless-iab-consent-ui.js +1 -0
  161. package/dist/hooks/use-reduced-motion.cjs +1 -1
  162. package/dist/hooks/use-reduced-motion.js +1 -1
  163. package/dist/hooks/use-scroll-lock.cjs +1 -1
  164. package/dist/hooks/use-scroll-lock.js +1 -1
  165. package/dist/hooks/use-ssr-status.cjs +1 -1
  166. package/dist/hooks/use-styles.cjs +1 -1
  167. package/dist/hooks/use-text-direction.cjs +1 -1
  168. package/dist/hooks/use-theme.cjs +1 -1
  169. package/dist/hooks/use-theme.js +1 -1
  170. package/dist/hooks/use-translations.cjs +1 -1
  171. package/dist/iab/styles.css +1 -0
  172. package/dist/iab.cjs +1 -0
  173. package/dist/iab.js +1 -0
  174. package/dist/index.cjs +1 -1
  175. package/dist/index.js +1 -1
  176. package/dist/primitives/accordion.cjs +1 -0
  177. package/dist/primitives/accordion.js +1 -0
  178. package/dist/primitives/button.cjs +1 -0
  179. package/dist/primitives/button.js +1 -0
  180. package/dist/primitives/collapsible.cjs +1 -0
  181. package/dist/primitives/collapsible.js +1 -0
  182. package/dist/primitives/dialog.cjs +1 -0
  183. package/dist/primitives/dialog.js +1 -0
  184. package/dist/primitives/preference-item.cjs +1 -0
  185. package/dist/primitives/preference-item.js +1 -0
  186. package/dist/primitives/switch.cjs +1 -0
  187. package/dist/primitives/switch.js +1 -0
  188. package/dist/primitives/tabs.cjs +1 -0
  189. package/dist/primitives/tabs.js +1 -0
  190. package/dist/primitives.cjs +1 -0
  191. package/dist/primitives.js +1 -0
  192. package/dist/providers/consent-manager-provider.cjs +1 -1
  193. package/dist/providers/consent-manager-provider.js +1 -1
  194. package/dist/server/fetch-ssr-data.cjs +1 -1
  195. package/dist/server/fetch-ssr-data.js +1 -1
  196. package/dist/server/headers.cjs +1 -1
  197. package/dist/server/headers.js +1 -1
  198. package/dist/server/index.cjs +1 -1
  199. package/dist/server/index.js +1 -1
  200. package/dist/server/init-cache-key.cjs +1 -0
  201. package/dist/server/init-cache-key.js +1 -0
  202. package/dist/server/normalize-url.cjs +1 -1
  203. package/dist/server/types.cjs +1 -1
  204. package/dist/styles.css +1 -0
  205. package/dist/types/consent-manager.cjs +1 -1
  206. package/dist/types/theme/index.cjs +1 -1
  207. package/dist/types/theme/style-keys.cjs +1 -1
  208. package/dist/types/theme/style-types.cjs +1 -1
  209. package/dist/utils/cn.cjs +1 -1
  210. package/dist/utils/merge-styles.cjs +1 -1
  211. package/dist/utils/test-helpers.cjs +1 -1
  212. package/dist/utils/test-helpers.js +1 -1
  213. package/dist/utils/theme-utils.cjs +1 -1
  214. package/dist/version.cjs +1 -1
  215. package/dist/version.js +1 -1
  216. package/{dist → dist-types}/components/consent-banner/atoms/overlay.d.ts +1 -2
  217. package/{dist → dist-types}/components/consent-banner/atoms/root.d.ts +2 -3
  218. package/{dist → dist-types}/components/consent-banner/components.d.ts +1 -2
  219. package/{dist → dist-types}/components/consent-banner/consent-banner.d.ts +8 -7
  220. package/{dist → dist-types}/components/consent-banner/error-boundary.d.ts +0 -1
  221. package/{dist → dist-types}/components/consent-banner/index.d.ts +1 -2
  222. package/{dist → dist-types}/components/consent-dialog/atoms/card.d.ts +1 -2
  223. package/{dist → dist-types}/components/consent-dialog/atoms/overlay.d.ts +1 -2
  224. package/{dist → dist-types}/components/consent-dialog/atoms/root.d.ts +2 -3
  225. package/{dist → dist-types}/components/consent-dialog/consent-dialog.d.ts +1 -2
  226. package/{dist → dist-types}/components/consent-dialog/index.d.ts +1 -2
  227. package/{dist → dist-types}/components/consent-dialog-link/index.d.ts +0 -1
  228. package/{dist → dist-types}/components/consent-dialog-trigger/atoms/button.d.ts +0 -1
  229. package/{dist → dist-types}/components/consent-dialog-trigger/atoms/icon.d.ts +0 -1
  230. package/{dist → dist-types}/components/consent-dialog-trigger/atoms/root.d.ts +0 -1
  231. package/{dist → dist-types}/components/consent-dialog-trigger/atoms/text.d.ts +0 -1
  232. package/{dist → dist-types}/components/consent-dialog-trigger/consent-dialog-trigger.d.ts +2 -3
  233. package/{dist → dist-types}/components/consent-dialog-trigger/index.d.ts +0 -1
  234. package/{dist → dist-types}/components/consent-dialog-trigger/types.d.ts +1 -2
  235. package/{dist → dist-types}/components/consent-dialog-trigger/use-draggable.d.ts +1 -2
  236. package/{dist → dist-types}/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
  237. package/{dist → dist-types}/components/consent-preferences-link/index.d.ts +0 -1
  238. package/dist-types/components/consent-widget/atoms/accordion.d.ts +27 -0
  239. package/{dist → dist-types}/components/consent-widget/atoms/button.d.ts +1 -2
  240. package/{dist → dist-types}/components/consent-widget/atoms/footer.d.ts +0 -1
  241. package/{dist → dist-types}/components/consent-widget/atoms/root.d.ts +1 -2
  242. package/{dist → dist-types}/components/consent-widget/consent-widget.d.ts +0 -1
  243. package/{dist → dist-types}/components/consent-widget/index.d.ts +1 -2
  244. package/{dist → dist-types}/components/consent-widget/types.d.ts +0 -1
  245. package/{dist → dist-types}/components/frame/atoms.d.ts +2 -3
  246. package/{dist → dist-types}/components/frame/frame.d.ts +0 -1
  247. package/{dist → dist-types}/components/frame/index.d.ts +1 -2
  248. package/{dist → dist-types}/components/frame/types.d.ts +1 -2
  249. package/{dist → dist-types}/components/iab-consent-banner/atoms/button-group.d.ts +0 -1
  250. package/{dist → dist-types}/components/iab-consent-banner/atoms/card.d.ts +0 -1
  251. package/{dist → dist-types}/components/iab-consent-banner/atoms/description.d.ts +0 -1
  252. package/{dist → dist-types}/components/iab-consent-banner/atoms/footer.d.ts +0 -1
  253. package/{dist → dist-types}/components/iab-consent-banner/atoms/header.d.ts +0 -1
  254. package/{dist → dist-types}/components/iab-consent-banner/atoms/overlay.d.ts +0 -1
  255. package/{dist → dist-types}/components/iab-consent-banner/atoms/root.d.ts +1 -2
  256. package/{dist → dist-types}/components/iab-consent-banner/atoms/title.d.ts +0 -1
  257. package/{dist → dist-types}/components/iab-consent-banner/iab-consent-banner.d.ts +1 -2
  258. package/{dist → dist-types}/components/iab-consent-banner/index.d.ts +1 -2
  259. package/{dist → dist-types}/components/iab-consent-dialog/atoms/card.d.ts +0 -1
  260. package/{dist → dist-types}/components/iab-consent-dialog/atoms/content.d.ts +0 -1
  261. package/{dist → dist-types}/components/iab-consent-dialog/atoms/footer.d.ts +0 -1
  262. package/{dist → dist-types}/components/iab-consent-dialog/atoms/header.d.ts +0 -1
  263. package/{dist → dist-types}/components/iab-consent-dialog/atoms/overlay.d.ts +0 -1
  264. package/{dist → dist-types}/components/iab-consent-dialog/atoms/purpose-item.d.ts +0 -1
  265. package/{dist → dist-types}/components/iab-consent-dialog/atoms/root.d.ts +1 -2
  266. package/{dist → dist-types}/components/iab-consent-dialog/atoms/stack-item.d.ts +0 -1
  267. package/dist-types/components/iab-consent-dialog/atoms/tabs.d.ts +12 -0
  268. package/{dist → dist-types}/components/iab-consent-dialog/atoms/vendor-list.d.ts +1 -2
  269. package/{dist → dist-types}/components/iab-consent-dialog/hooks/use-gvl-data.d.ts +0 -1
  270. package/{dist → dist-types}/components/iab-consent-dialog/iab-consent-dialog.d.ts +1 -2
  271. package/{dist → dist-types}/components/iab-consent-dialog/index.d.ts +1 -2
  272. package/{dist → dist-types}/components/iab-consent-dialog/types.d.ts +0 -1
  273. package/{dist → dist-types}/components/iab-consent-dialog/use-iab-translations.d.ts +0 -1
  274. package/dist-types/components/shared/libs/policy-actions.d.ts +26 -0
  275. package/{dist → dist-types}/components/shared/libs/polymorphic.d.ts +0 -1
  276. package/{dist → dist-types}/components/shared/libs/recursive-clone-children.d.ts +0 -1
  277. package/dist-types/components/shared/libs/slot.d.ts +6 -0
  278. package/dist-types/components/shared/libs/use-controllable-state.d.ts +7 -0
  279. package/{dist → dist-types}/components/shared/primitives/box.d.ts +0 -1
  280. package/{dist → dist-types}/components/shared/primitives/button.d.ts +5 -2
  281. package/{dist → dist-types}/components/shared/primitives/button.types.d.ts +17 -1
  282. package/{dist → dist-types}/components/shared/primitives/legal-links/index.d.ts +1 -2
  283. package/dist-types/components/shared/ui/accordion/accordion.d.ts +74 -0
  284. package/{dist → dist-types}/components/shared/ui/accordion/accordion.types.d.ts +1 -2
  285. package/{dist → dist-types}/components/shared/ui/accordion/index.d.ts +0 -1
  286. package/{dist → dist-types}/components/shared/ui/animated-collapse/animated-collapse.d.ts +0 -1
  287. package/{dist → dist-types}/components/shared/ui/animated-collapse/index.d.ts +0 -1
  288. package/{dist → dist-types}/components/shared/ui/button/button.d.ts +2 -3
  289. package/{dist → dist-types}/components/shared/ui/button/button.types.d.ts +0 -1
  290. package/{dist → dist-types}/components/shared/ui/button/index.d.ts +0 -1
  291. package/dist-types/components/shared/ui/collapsible/collapsible.d.ts +20 -0
  292. package/dist-types/components/shared/ui/collapsible/index.d.ts +1 -0
  293. package/dist-types/components/shared/ui/dialog/dialog.d.ts +29 -0
  294. package/dist-types/components/shared/ui/dialog/index.d.ts +1 -0
  295. package/{dist → dist-types}/components/shared/ui/icon.d.ts +0 -1
  296. package/{dist → dist-types}/components/shared/ui/logo.d.ts +0 -1
  297. package/dist-types/components/shared/ui/preference-item/index.d.ts +1 -0
  298. package/dist-types/components/shared/ui/preference-item/preference-item.d.ts +33 -0
  299. package/{dist → dist-types}/components/shared/ui/switch/index.d.ts +0 -1
  300. package/dist-types/components/shared/ui/switch/switch.d.ts +20 -0
  301. package/{dist → dist-types}/components/shared/ui/switch/switch.types.d.ts +1 -2
  302. package/dist-types/components/shared/ui/tabs/index.d.ts +1 -0
  303. package/dist-types/components/shared/ui/tabs/tabs.d.ts +28 -0
  304. package/{dist → dist-types}/context/consent-manager-context.d.ts +1 -2
  305. package/{dist → dist-types}/context/consent-tracking-context.d.ts +0 -1
  306. package/{dist → dist-types}/context/theme-context.d.ts +0 -1
  307. package/dist-types/headless.d.ts +9 -0
  308. package/{dist → dist-types}/hooks/index.d.ts +3 -1
  309. package/{dist → dist-types}/hooks/use-color-scheme.d.ts +0 -1
  310. package/{dist → dist-types}/hooks/use-component-config.d.ts +1 -2
  311. package/dist-types/hooks/use-consent-dialog-trigger.d.ts +10 -0
  312. package/{dist → dist-types}/hooks/use-consent-manager.d.ts +1 -2
  313. package/{dist → dist-types}/hooks/use-focus-trap.d.ts +0 -1
  314. package/dist-types/hooks/use-headless-consent-ui.d.ts +46 -0
  315. package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +41 -0
  316. package/{dist → dist-types}/hooks/use-reduced-motion.d.ts +0 -1
  317. package/{dist → dist-types}/hooks/use-scroll-lock.d.ts +0 -1
  318. package/{dist → dist-types}/hooks/use-ssr-status.d.ts +0 -1
  319. package/{dist → dist-types}/hooks/use-styles.d.ts +0 -1
  320. package/{dist → dist-types}/hooks/use-text-direction.d.ts +0 -1
  321. package/{dist → dist-types}/hooks/use-theme.d.ts +0 -1
  322. package/{dist → dist-types}/hooks/use-translations.d.ts +1 -2
  323. package/dist-types/iab.d.ts +24 -0
  324. package/{dist → dist-types}/index.d.ts +4 -5
  325. package/dist-types/primitives/accordion.d.ts +1 -0
  326. package/dist-types/primitives/button.d.ts +1 -0
  327. package/dist-types/primitives/collapsible.d.ts +1 -0
  328. package/dist-types/primitives/dialog.d.ts +1 -0
  329. package/dist-types/primitives/preference-item.d.ts +1 -0
  330. package/dist-types/primitives/switch.d.ts +1 -0
  331. package/dist-types/primitives/tabs.d.ts +1 -0
  332. package/dist-types/primitives.d.ts +7 -0
  333. package/{dist → dist-types}/providers/consent-manager-provider.d.ts +0 -1
  334. package/{dist → dist-types}/server/fetch-ssr-data.d.ts +1 -2
  335. package/{dist → dist-types}/server/headers.d.ts +2 -2
  336. package/{dist → dist-types}/server/index.d.ts +1 -1
  337. package/dist-types/server/init-cache-key.d.ts +21 -0
  338. package/{dist → dist-types}/server/normalize-url.d.ts +0 -1
  339. package/{dist → dist-types}/server/types.d.ts +1 -2
  340. package/{dist → dist-types}/types/consent-manager.d.ts +8 -2
  341. package/{dist → dist-types}/types/theme/index.d.ts +0 -1
  342. package/dist-types/types/theme/style-keys.d.ts +1 -0
  343. package/{dist → dist-types}/types/theme/style-types.d.ts +4 -3
  344. package/{dist → dist-types}/utils/cn.d.ts +1 -2
  345. package/{dist → dist-types}/utils/merge-styles.d.ts +0 -1
  346. package/{dist → dist-types}/utils/test-helpers.d.ts +0 -1
  347. package/{dist → dist-types}/utils/theme-utils.d.ts +1 -2
  348. package/dist-types/version.d.ts +1 -0
  349. package/docs/README.md +76 -0
  350. package/docs/building-headless-components.md +245 -0
  351. package/docs/callbacks.md +117 -0
  352. package/docs/components/consent-banner.md +174 -0
  353. package/docs/components/consent-dialog-link.md +59 -0
  354. package/docs/components/consent-dialog-trigger.md +103 -0
  355. package/docs/components/consent-dialog.md +137 -0
  356. package/docs/components/consent-manager-provider.md +423 -0
  357. package/docs/components/consent-widget.md +78 -0
  358. package/docs/components/dev-tools.md +63 -0
  359. package/docs/components/frame.md +73 -0
  360. package/docs/concepts/client-modes.md +163 -0
  361. package/docs/concepts/consent-categories.md +97 -0
  362. package/docs/concepts/consent-models.md +112 -0
  363. package/docs/concepts/cookie-management.md +122 -0
  364. package/docs/concepts/glossary.md +23 -0
  365. package/docs/concepts/initialization-flow.md +141 -0
  366. package/docs/concepts/policy-packs.md +227 -0
  367. package/docs/headless.md +184 -0
  368. package/docs/hooks/use-color-scheme.md +40 -0
  369. package/docs/hooks/use-consent-manager/checking-consent.md +94 -0
  370. package/docs/hooks/use-consent-manager/location-info.md +95 -0
  371. package/docs/hooks/use-consent-manager/overview.md +390 -0
  372. package/docs/hooks/use-consent-manager/setting-consent.md +92 -0
  373. package/docs/hooks/use-draggable.md +57 -0
  374. package/docs/hooks/use-focus-trap.md +41 -0
  375. package/docs/hooks/use-reduced-motion.md +35 -0
  376. package/docs/hooks/use-ssr-status.md +31 -0
  377. package/docs/hooks/use-text-direction.md +49 -0
  378. package/docs/hooks/use-translations.md +117 -0
  379. package/docs/iab/consent-banner.md +95 -0
  380. package/docs/iab/consent-dialog.md +135 -0
  381. package/docs/iab/overview.md +119 -0
  382. package/docs/iab/use-gvl-data.md +208 -0
  383. package/docs/iframe-blocking.md +107 -0
  384. package/docs/integrations/databuddy.md +186 -0
  385. package/docs/integrations/google-tag-manager.md +153 -0
  386. package/docs/integrations/google-tag.md +149 -0
  387. package/docs/integrations/linkedin-insights.md +109 -0
  388. package/docs/integrations/meta-pixel.md +342 -0
  389. package/docs/integrations/microsoft-uet.md +112 -0
  390. package/docs/integrations/overview.md +89 -0
  391. package/docs/integrations/posthog.md +177 -0
  392. package/docs/integrations/tiktok-pixel.md +113 -0
  393. package/docs/integrations/x-pixel.md +143 -0
  394. package/docs/internationalization.md +197 -0
  395. package/docs/network-blocker.md +178 -0
  396. package/docs/optimization.md +117 -0
  397. package/docs/policy-packs.md +240 -0
  398. package/docs/quickstart.md +146 -0
  399. package/docs/script-loader.md +300 -0
  400. package/docs/server-side.md +153 -0
  401. package/docs/styling/classnames.md +84 -0
  402. package/docs/styling/color-scheme.md +82 -0
  403. package/docs/styling/css-variables.md +92 -0
  404. package/docs/styling/overview.md +315 -0
  405. package/docs/styling/slots.md +93 -0
  406. package/docs/styling/tailwind.md +115 -0
  407. package/docs/styling/tokens.md +214 -0
  408. package/docs/troubleshooting.md +137 -0
  409. package/package.json +48 -36
  410. package/client/components/iab-consent-banner.js +0 -4
  411. package/client/components/iab-consent-dialog.js +0 -4
  412. package/dist/components/consent-banner/atoms/overlay.d.ts.map +0 -1
  413. package/dist/components/consent-banner/atoms/root.d.ts.map +0 -1
  414. package/dist/components/consent-banner/components.d.ts.map +0 -1
  415. package/dist/components/consent-banner/consent-banner.d.ts.map +0 -1
  416. package/dist/components/consent-banner/error-boundary.d.ts.map +0 -1
  417. package/dist/components/consent-banner/index.d.ts.map +0 -1
  418. package/dist/components/consent-dialog/atoms/card.d.ts.map +0 -1
  419. package/dist/components/consent-dialog/atoms/overlay.d.ts.map +0 -1
  420. package/dist/components/consent-dialog/atoms/root.d.ts.map +0 -1
  421. package/dist/components/consent-dialog/consent-dialog.d.ts.map +0 -1
  422. package/dist/components/consent-dialog/index.d.ts.map +0 -1
  423. package/dist/components/consent-dialog-link/index.d.ts.map +0 -1
  424. package/dist/components/consent-dialog-trigger/atoms/button.d.ts.map +0 -1
  425. package/dist/components/consent-dialog-trigger/atoms/icon.d.ts.map +0 -1
  426. package/dist/components/consent-dialog-trigger/atoms/root.d.ts.map +0 -1
  427. package/dist/components/consent-dialog-trigger/atoms/text.d.ts.map +0 -1
  428. package/dist/components/consent-dialog-trigger/consent-dialog-trigger.d.ts.map +0 -1
  429. package/dist/components/consent-dialog-trigger/index.d.ts.map +0 -1
  430. package/dist/components/consent-dialog-trigger/types.d.ts.map +0 -1
  431. package/dist/components/consent-dialog-trigger/use-draggable.d.ts.map +0 -1
  432. package/dist/components/consent-preferences-link/consent-preferences-link.d.ts.map +0 -1
  433. package/dist/components/consent-preferences-link/index.d.ts.map +0 -1
  434. package/dist/components/consent-widget/atoms/accordion.d.ts +0 -46
  435. package/dist/components/consent-widget/atoms/accordion.d.ts.map +0 -1
  436. package/dist/components/consent-widget/atoms/button.d.ts.map +0 -1
  437. package/dist/components/consent-widget/atoms/footer.d.ts.map +0 -1
  438. package/dist/components/consent-widget/atoms/root.d.ts.map +0 -1
  439. package/dist/components/consent-widget/consent-widget.d.ts.map +0 -1
  440. package/dist/components/consent-widget/index.d.ts.map +0 -1
  441. package/dist/components/consent-widget/types.d.ts.map +0 -1
  442. package/dist/components/frame/atoms.d.ts.map +0 -1
  443. package/dist/components/frame/frame.d.ts.map +0 -1
  444. package/dist/components/frame/index.d.ts.map +0 -1
  445. package/dist/components/frame/types.d.ts.map +0 -1
  446. package/dist/components/iab-consent-banner/atoms/button-group.d.ts.map +0 -1
  447. package/dist/components/iab-consent-banner/atoms/card.d.ts.map +0 -1
  448. package/dist/components/iab-consent-banner/atoms/description.d.ts.map +0 -1
  449. package/dist/components/iab-consent-banner/atoms/footer.d.ts.map +0 -1
  450. package/dist/components/iab-consent-banner/atoms/header.d.ts.map +0 -1
  451. package/dist/components/iab-consent-banner/atoms/overlay.d.ts.map +0 -1
  452. package/dist/components/iab-consent-banner/atoms/root.d.ts.map +0 -1
  453. package/dist/components/iab-consent-banner/atoms/title.d.ts.map +0 -1
  454. package/dist/components/iab-consent-banner/iab-consent-banner.d.ts.map +0 -1
  455. package/dist/components/iab-consent-banner/index.d.ts.map +0 -1
  456. package/dist/components/iab-consent-dialog/atoms/card.d.ts.map +0 -1
  457. package/dist/components/iab-consent-dialog/atoms/content.d.ts.map +0 -1
  458. package/dist/components/iab-consent-dialog/atoms/footer.d.ts.map +0 -1
  459. package/dist/components/iab-consent-dialog/atoms/header.d.ts.map +0 -1
  460. package/dist/components/iab-consent-dialog/atoms/overlay.d.ts.map +0 -1
  461. package/dist/components/iab-consent-dialog/atoms/purpose-item.d.ts.map +0 -1
  462. package/dist/components/iab-consent-dialog/atoms/root.d.ts.map +0 -1
  463. package/dist/components/iab-consent-dialog/atoms/stack-item.d.ts.map +0 -1
  464. package/dist/components/iab-consent-dialog/atoms/tabs.d.ts +0 -40
  465. package/dist/components/iab-consent-dialog/atoms/tabs.d.ts.map +0 -1
  466. package/dist/components/iab-consent-dialog/atoms/vendor-list.d.ts.map +0 -1
  467. package/dist/components/iab-consent-dialog/hooks/use-gvl-data.d.ts.map +0 -1
  468. package/dist/components/iab-consent-dialog/iab-consent-dialog.d.ts.map +0 -1
  469. package/dist/components/iab-consent-dialog/index.d.ts.map +0 -1
  470. package/dist/components/iab-consent-dialog/types.d.ts.map +0 -1
  471. package/dist/components/iab-consent-dialog/use-iab-translations.d.ts.map +0 -1
  472. package/dist/components/shared/libs/polymorphic.d.ts.map +0 -1
  473. package/dist/components/shared/libs/recursive-clone-children.d.ts.map +0 -1
  474. package/dist/components/shared/primitives/box.d.ts.map +0 -1
  475. package/dist/components/shared/primitives/button.d.ts.map +0 -1
  476. package/dist/components/shared/primitives/button.types.d.ts.map +0 -1
  477. package/dist/components/shared/primitives/legal-links/index.d.ts.map +0 -1
  478. package/dist/components/shared/ui/accordion/accordion.d.ts +0 -110
  479. package/dist/components/shared/ui/accordion/accordion.d.ts.map +0 -1
  480. package/dist/components/shared/ui/accordion/accordion.types.d.ts.map +0 -1
  481. package/dist/components/shared/ui/accordion/index.d.ts.map +0 -1
  482. package/dist/components/shared/ui/animated-collapse/animated-collapse.d.ts.map +0 -1
  483. package/dist/components/shared/ui/animated-collapse/index.d.ts.map +0 -1
  484. package/dist/components/shared/ui/button/button.d.ts.map +0 -1
  485. package/dist/components/shared/ui/button/button.types.d.ts.map +0 -1
  486. package/dist/components/shared/ui/button/index.d.ts.map +0 -1
  487. package/dist/components/shared/ui/icon.d.ts.map +0 -1
  488. package/dist/components/shared/ui/logo.d.ts.map +0 -1
  489. package/dist/components/shared/ui/switch/index.d.ts.map +0 -1
  490. package/dist/components/shared/ui/switch/switch.d.ts +0 -45
  491. package/dist/components/shared/ui/switch/switch.d.ts.map +0 -1
  492. package/dist/components/shared/ui/switch/switch.types.d.ts.map +0 -1
  493. package/dist/context/consent-manager-context.d.ts.map +0 -1
  494. package/dist/context/consent-tracking-context.d.ts.map +0 -1
  495. package/dist/context/theme-context.d.ts.map +0 -1
  496. package/dist/headless.d.ts +0 -8
  497. package/dist/headless.d.ts.map +0 -1
  498. package/dist/hooks/index.d.ts.map +0 -1
  499. package/dist/hooks/use-color-scheme.d.ts.map +0 -1
  500. package/dist/hooks/use-component-config.d.ts.map +0 -1
  501. package/dist/hooks/use-consent-manager.d.ts.map +0 -1
  502. package/dist/hooks/use-focus-trap.d.ts.map +0 -1
  503. package/dist/hooks/use-reduced-motion.d.ts.map +0 -1
  504. package/dist/hooks/use-scroll-lock.d.ts.map +0 -1
  505. package/dist/hooks/use-ssr-status.d.ts.map +0 -1
  506. package/dist/hooks/use-styles.d.ts.map +0 -1
  507. package/dist/hooks/use-text-direction.d.ts.map +0 -1
  508. package/dist/hooks/use-theme.d.ts.map +0 -1
  509. package/dist/hooks/use-translations.d.ts.map +0 -1
  510. package/dist/index.d.ts.map +0 -1
  511. package/dist/providers/consent-manager-provider.d.ts.map +0 -1
  512. package/dist/server/fetch-ssr-data.d.ts.map +0 -1
  513. package/dist/server/headers.d.ts.map +0 -1
  514. package/dist/server/index.d.ts.map +0 -1
  515. package/dist/server/normalize-url.d.ts.map +0 -1
  516. package/dist/server/types.d.ts.map +0 -1
  517. package/dist/types/consent-manager.d.ts.map +0 -1
  518. package/dist/types/theme/index.d.ts.map +0 -1
  519. package/dist/types/theme/style-keys.d.ts +0 -2
  520. package/dist/types/theme/style-keys.d.ts.map +0 -1
  521. package/dist/types/theme/style-types.d.ts.map +0 -1
  522. package/dist/utils/cn.d.ts.map +0 -1
  523. package/dist/utils/merge-styles.d.ts.map +0 -1
  524. package/dist/utils/test-helpers.d.ts.map +0 -1
  525. package/dist/utils/theme-utils.d.ts.map +0 -1
  526. package/dist/version.d.ts +0 -2
  527. package/dist/version.d.ts.map +0 -1
@@ -0,0 +1,197 @@
1
+ ---
2
+ title: Internationalization
3
+ description: Translate consent UI into 30+ languages with built-in translations, custom overrides, and automatic browser language detection.
4
+ ---
5
+ c15t ships with built-in translations for 30+ languages via the `@c15t/translations` package. Language detection happens automatically based on the browser's language preference, and you can override or extend translations for any language.
6
+
7
+ In c15t v2, the preferred config shape is `i18n` with `locale`, `detectBrowserLanguage`, and `messages`.
8
+
9
+ There are two ways c15t can load translations: client-side or server-side.
10
+
11
+ |Server-side|Client-side|
12
+ |--|--|
13
+ |The best way to reduce bundle size and improve performance. We can detect the user's language based on the browser's language settings, allowing for the most accurate translations. By default, when using a [consent.io](https://consent.io) hosted instance, [these languages](https://github.com/c15t/c15t/tree/main/packages/translations/src/translations) are supported.|Bundled with the application allowing for multiple languages to be supported without the need for a backend. The more translations you have, the larger the bundle size will be, which may impact the performance of your application.|
14
+
15
+ ## Basic Configuration
16
+
17
+ Pass custom translations via the `i18n` option:
18
+
19
+ ```tsx
20
+ import { type ReactNode } from 'react';
21
+ import { ConsentManagerProvider } from '@c15t/react';
22
+
23
+ export default function ConsentManager({ children }: { children: ReactNode }) {
24
+ return (
25
+ <ConsentManagerProvider
26
+ options={{
27
+ mode: 'hosted',
28
+ backendURL: 'https://your-instance.c15t.dev',
29
+ i18n: {
30
+ locale: 'en',
31
+ messages: {
32
+ de: {
33
+ cookieBanner: {
34
+ title: 'Datenschutzeinstellungen',
35
+ description: 'Wir verwenden Cookies, um Ihnen das beste Erlebnis zu bieten.',
36
+ },
37
+ common: {
38
+ acceptAll: 'Alle akzeptieren',
39
+ rejectAll: 'Alle ablehnen',
40
+ customize: 'Anpassen',
41
+ save: 'Speichern',
42
+ },
43
+ },
44
+ },
45
+ },
46
+ }}
47
+ >
48
+ {children}
49
+ </ConsentManagerProvider>
50
+ );
51
+ }
52
+ ```
53
+
54
+ Custom translations are deep-merged with built-in defaults - you only need to override the keys you want to change.
55
+
56
+ ## Translation Package Imports
57
+
58
+ Use the import path that matches your use case:
59
+
60
+ * `@c15t/translations`: types, utilities, and `enTranslations` only (smallest client bundle)
61
+ * `@c15t/translations/en`: English-only translation object
62
+ * `@c15t/translations/all`: full `baseTranslations` map for all bundled locales
63
+
64
+ If you bundle translations client-side and need multiple languages, import from `@c15t/translations/all` explicitly:
65
+
66
+ ```tsx
67
+ import { baseTranslations } from '@c15t/translations/all';
68
+
69
+ const translations = {
70
+ en: baseTranslations.en,
71
+ de: baseTranslations.de,
72
+ fr: baseTranslations.fr,
73
+ };
74
+ ```
75
+
76
+ ## Translation Sections
77
+
78
+ The `Translations` object is organized into sections:
79
+
80
+ |Section|Controls|
81
+ |--|--|
82
+ |`common`|Shared button labels: acceptAll, rejectAll, customize, save|
83
+ |`cookieBanner`|Banner title and description|
84
+ |`consentManagerDialog`|Dialog title and description|
85
+ |`consentTypes`|Per-category title and description (keyed by AllConsentNames)|
86
+ |`frame`|Frame placeholder title and button text (supports `{category}` placeholder)|
87
+ |`legalLinks`|Privacy policy, cookie policy, terms of service link text|
88
+ |`iab`|IAB TCF banner, preference center, vendor list translations|
89
+
90
+ ## Reading Translations
91
+
92
+ Use the `useTranslations()` hook to access the current language's translations:
93
+
94
+ ```tsx
95
+ import { useTranslations } from '@c15t/react';
96
+
97
+ function CustomBanner() {
98
+ const translations = useTranslations();
99
+
100
+ return (
101
+ <div>
102
+ <h2>{translations.cookieBanner.title}</h2>
103
+ <p>{translations.cookieBanner.description}</p>
104
+ </div>
105
+ );
106
+ }
107
+ ```
108
+
109
+ ## Changing Language
110
+
111
+ Switch the active language at runtime with `setLanguage()`:
112
+
113
+ ```tsx
114
+ import { useConsentManager } from '@c15t/react';
115
+
116
+ function LanguageSwitcher() {
117
+ const { setLanguage } = useConsentManager();
118
+
119
+ return (
120
+ <select onChange={(e) => setLanguage(e.target.value)}>
121
+ <option value="en">English</option>
122
+ <option value="de">Deutsch</option>
123
+ <option value="fr">Fran&ccedil;ais</option>
124
+ <option value="es">Espa&ntilde;ol</option>
125
+ </select>
126
+ );
127
+ }
128
+ ```
129
+
130
+ `setLanguage()` re-fetches the consent banner to get server-resolved translations for the new language.
131
+
132
+ ## Automatic Language Detection
133
+
134
+ By default, c15t detects the browser's language (`navigator.language`) and selects the closest matching translation. If custom `messages` are configured, fallback stays within your configured languages before using `locale` (or `'en'`) as the preferred fallback language.
135
+
136
+ When backend policy packs use `i18n.messageProfile`, the active language pool comes only from that resolved profile.
137
+
138
+ Example: if your Europe profile defines `en`, `fr`, and `de`, and your default profile defines `en`, `es`, and `pt`, a Europe visitor can resolve to `en`, `fr`, or `de`, but not `es`, `pt`, or `zh`.
139
+
140
+ Use profile-local `fallbackLanguage` inside backend `i18n.messages` to choose which configured language a policy profile should fall back to when the browser asks for an unsupported locale.
141
+
142
+ Disable auto-detection to always use `locale`:
143
+
144
+ ```tsx
145
+ i18n: {
146
+ locale: 'de',
147
+ detectBrowserLanguage: false,
148
+ messages: { ... },
149
+ }
150
+ ```
151
+
152
+ If you need a policy to always use one specific language regardless of browser preference, set `policy.i18n.language` on the backend policy pack.
153
+
154
+ ## Custom Consent Type Labels
155
+
156
+ Override the title and description for individual consent categories:
157
+
158
+ ```tsx
159
+ i18n: {
160
+ messages: {
161
+ en: {
162
+ consentTypes: {
163
+ measurement: {
164
+ title: 'Analytics & Performance',
165
+ description: 'Help us understand how visitors interact with our site.',
166
+ },
167
+ marketing: {
168
+ title: 'Advertising',
169
+ description: 'Used to deliver relevant ads and measure campaign effectiveness.',
170
+ },
171
+ },
172
+ },
173
+ },
174
+ }
175
+ ```
176
+
177
+ ## Legacy `translations` Compatibility
178
+
179
+ The legacy syntax is still supported in 2.0 for RC compatibility:
180
+
181
+ ```tsx
182
+ // Legacy (still supported)
183
+ translations: {
184
+ defaultLanguage: 'en',
185
+ disableAutoLanguageSwitch: true,
186
+ translations: { ... },
187
+ }
188
+
189
+ // Preferred in v2
190
+ i18n: {
191
+ locale: 'en',
192
+ detectBrowserLanguage: false,
193
+ messages: { ... },
194
+ }
195
+ ```
196
+
197
+ If both are provided, `i18n` takes precedence.
@@ -0,0 +1,178 @@
1
+ ---
2
+ title: Network Blocker
3
+ description: Block outgoing network requests to third-party domains until the user grants consent for the appropriate category.
4
+ ---
5
+ The network blocker intercepts outgoing `fetch` and `XMLHttpRequest` calls and blocks them based on consent state and domain rules. This catches tracking requests that happen outside of script loading - for example, beacon calls, API requests to analytics endpoints, or pixel fires from already-loaded scripts.
6
+
7
+ ## Configuration
8
+
9
+ Add `networkBlocker` to your provider options:
10
+
11
+ ```tsx
12
+ import { type ReactNode } from 'react';
13
+ import { ConsentManagerProvider } from '@c15t/react';
14
+
15
+ export function ConsentManager({ children }: { children: ReactNode }) {
16
+ return (
17
+ <ConsentManagerProvider
18
+ options={{
19
+ mode: 'hosted',
20
+ backendURL: 'https://your-instance.c15t.dev',
21
+ networkBlocker: {
22
+ rules: [
23
+ {
24
+ id: 'google-analytics',
25
+ domain: 'google-analytics.com',
26
+ category: 'measurement',
27
+ },
28
+ {
29
+ id: 'facebook-pixel',
30
+ domain: 'facebook.com',
31
+ pathIncludes: '/tr',
32
+ category: 'marketing',
33
+ },
34
+ {
35
+ id: 'analytics-post',
36
+ domain: 'analytics.example.com',
37
+ methods: ['POST'],
38
+ category: 'measurement',
39
+ },
40
+ ],
41
+ },
42
+ }}
43
+ >
44
+ {children}
45
+ </ConsentManagerProvider>
46
+ );
47
+ }
48
+ ```
49
+
50
+ ## Rule Matching
51
+
52
+ Rules match requests using three criteria:
53
+
54
+ ### Domain matching
55
+
56
+ The `domain` field matches the request hostname. Subdomains are automatically included - a rule for `google-analytics.com` also matches `www.google-analytics.com` and `stats.google-analytics.com`.
57
+
58
+ ### Path matching
59
+
60
+ The optional `pathIncludes` field requires the request URL path to contain the specified substring. This lets you target specific endpoints without blocking the entire domain.
61
+
62
+ ### Method matching
63
+
64
+ The optional `methods` array restricts the rule to specific HTTP methods. If omitted, the rule applies to all methods.
65
+
66
+ ## Consent Conditions
67
+
68
+ Like the script loader, `category` accepts a `HasCondition`:
69
+
70
+ ```tsx
71
+ // Simple
72
+ { category: 'measurement' }
73
+
74
+ // Must have both
75
+ { category: { and: ['measurement', 'marketing'] } }
76
+
77
+ // Must have either
78
+ { category: { or: ['measurement', 'marketing'] } }
79
+ ```
80
+
81
+ ## Monitoring Blocked Requests
82
+
83
+ ### Console logging
84
+
85
+ Blocked requests are logged to the console by default. Disable with `logBlockedRequests: false`.
86
+
87
+ ### Callback
88
+
89
+ Use `onRequestBlocked` to handle blocked requests programmatically:
90
+
91
+ ```tsx
92
+ networkBlocker: {
93
+ rules: [...],
94
+ onRequestBlocked: ({ method, url, rule }) => {
95
+ console.log(`Blocked ${method} ${url} (rule: ${rule?.id})`);
96
+ },
97
+ }
98
+ ```
99
+
100
+ ## Runtime Updates
101
+
102
+ Update the network blocker configuration at runtime:
103
+
104
+ ```tsx
105
+ import { useConsentManager } from '@c15t/react';
106
+
107
+ function NetworkBlockerManager() {
108
+ const { setNetworkBlocker } = useConsentManager();
109
+
110
+ const addRule = () => {
111
+ setNetworkBlocker({
112
+ rules: [
113
+ {
114
+ id: 'new-tracker',
115
+ domain: 'tracker.example.com',
116
+ category: 'marketing',
117
+ },
118
+ ],
119
+ });
120
+ };
121
+ }
122
+ ```
123
+
124
+ ## API Reference
125
+
126
+ ### NetworkBlockerRule
127
+
128
+ |Property|Type|Description|Default|Required|
129
+ |:--|:--|:--|:--|:--:|
130
+ |id|string \|undefined|Optional identifier for the rule. Useful for debugging and logging.|-|Optional|
131
+ |domain|string|Domain that this rule applies to.|-|✅ Required|
132
+ |pathIncludes|string \|undefined|Optional path substring that must be present in the request path for the rule to apply.|-|Optional|
133
+ |methods|string\[] \|undefined|Optional list of HTTP methods that this rule applies to. If omitted, the rule applies to all methods.|-|Optional|
134
+ |category|HasCondition\<AllConsentNames>|Consent condition that must be satisfied to allow the request. When this condition is not satisfied, matching requests will be blocked.|-|✅ Required|
135
+
136
+ ### NetworkBlockerConfig
137
+
138
+ |Property|Type|Description|Default|Required|
139
+ |:--|:--|:--|:--|:--:|
140
+ |enabled|boolean \|undefined|Whether the network blocker is enabled.|-|Optional|
141
+ |initialConsents|ConsentState \|undefined|The consent state snapshot that is currently used for blocking logic.|-|Optional|
142
+ |logBlockedRequests|boolean \|undefined|Whether to automatically log blocked requests to the console.|-|Optional|
143
+ |onRequestBlocked|Object \|undefined|Callback invoked whenever a request is blocked.|-|Optional|
144
+ |rules|NetworkBlockerRule|Domain rules that determine which requests should be blocked.|-|✅ Required|
145
+
146
+ #### `initialConsents` ConsentState
147
+
148
+ The consent state snapshot that is currently used for blocking logic.
149
+
150
+ |Property|Type|Description|Default|Required|
151
+ |:--|:--|:--|:--|:--:|
152
+ |experience|boolean|-|-|✅ Required|
153
+ |functionality|boolean|-|-|✅ Required|
154
+ |marketing|boolean|-|-|✅ Required|
155
+ |measurement|boolean|-|-|✅ Required|
156
+ |necessary|boolean|-|-|✅ Required|
157
+
158
+ #### `onRequestBlocked`
159
+
160
+ Callback invoked whenever a request is blocked.
161
+
162
+ |Property|Type|Description|Default|Required|
163
+ |:--|:--|:--|:--|:--:|
164
+ |method|string|The HTTP method of the blocked request (e.g. GET, POST).|-|✅ Required|
165
+ |url|string|The URL of the blocked request.|-|✅ Required|
166
+ |rule|NetworkBlockerRule \|undefined|The rule that caused the request to be blocked, if available. Can be undefined when the blocker configuration changed between evaluation and logging.|-|Optional|
167
+
168
+ #### `rules` NetworkBlockerRule
169
+
170
+ Domain rules that determine which requests should be blocked.
171
+
172
+ |Property|Type|Description|Default|Required|
173
+ |:--|:--|:--|:--|:--:|
174
+ |id|string \|undefined|Optional identifier for the rule. Useful for debugging and logging.|-|Optional|
175
+ |domain|string|Domain that this rule applies to.|-|✅ Required|
176
+ |pathIncludes|string \|undefined|Optional path substring that must be present in the request path for the rule to apply.|-|Optional|
177
+ |methods|string\[] \|undefined|Optional list of HTTP methods that this rule applies to. If omitted, the rule applies to all methods.|-|Optional|
178
+ |category|HasCondition\<AllConsentNames>|Consent condition that must be satisfied to allow the request. When this condition is not satisfied, matching requests will be blocked.|-|✅ Required|
@@ -0,0 +1,117 @@
1
+ ---
2
+ title: Optimization
3
+ description: Improve c15t startup performance in React with prefetching, proxy rewrites, and rendering tradeoffs.
4
+ lastModified: 2026-03-17
5
+ ---
6
+ Use this guide when you care about banner visibility speed, route static-ness, and reducing backend round-trip cost.
7
+
8
+ ## 1) Prefer Same-Origin Proxy
9
+
10
+ Proxy c15t requests through your app server so the browser calls your own origin instead of a third-party domain.
11
+
12
+ How you configure this depends on your framework — Vite has `server.proxy`, Remix has resource routes, and most deployment platforms support rewrite rules.
13
+
14
+ Then use:
15
+
16
+ ```tsx
17
+ <ConsentManagerProvider options={{ backendURL: '/api/c15t', mode: 'hosted' }}>
18
+ ```
19
+
20
+ Why this helps:
21
+
22
+ * Same-origin requests avoid extra DNS/TLS setup in many deployments
23
+ * Ad blockers are less likely to block your init endpoint
24
+ * You can change backend infrastructure without touching client code
25
+
26
+ ## 2) Prefetch Init Data Early
27
+
28
+ Use `buildPrefetchScript()` from the `c15t` core package to start the `/init` request before your app hydrates. Inject the script as early as possible in your HTML `<head>`.
29
+
30
+ In production benchmarks with a same-origin rewrite, prefetching strategies show measurable improvement over client-only init:
31
+
32
+ |Strategy|Scripts loaded|Data request starts|Banner visible|
33
+ |--|--|--|--|
34
+ |Client-only (no prefetch)|baseline|baseline|baseline|
35
+ |Browser prefetch|\~1.3x faster|\~2.6x earlier|\~1.25x faster|
36
+ |Server prefetch|\~2x faster|before page loads|\~1.9x faster|
37
+
38
+ ### Inline Script Prefetch
39
+
40
+ ```tsx
41
+ import { buildPrefetchScript } from 'c15t';
42
+
43
+ const prefetchScript = buildPrefetchScript({
44
+ backendURL: '/api/c15t',
45
+ });
46
+
47
+ // In your HTML template or root component:
48
+ <head>
49
+ <script dangerouslySetInnerHTML={{ __html: prefetchScript }} />
50
+ </head>
51
+ ```
52
+
53
+ Then consume the prefetched data in your provider:
54
+
55
+ ```tsx
56
+ import {
57
+ ConsentManagerProvider,
58
+ ConsentBanner,
59
+ ConsentDialog,
60
+ } from '@c15t/react';
61
+ import { getPrefetchedInitialData } from 'c15t';
62
+
63
+ export default function App({ children }: { children: React.ReactNode }) {
64
+ return (
65
+ <ConsentManagerProvider
66
+ options={{
67
+ mode: 'hosted',
68
+ backendURL: '/api/c15t',
69
+ ssrData: getPrefetchedInitialData({
70
+ backendURL: '/api/c15t',
71
+ }),
72
+ }}
73
+ >
74
+ <ConsentBanner />
75
+ <ConsentDialog />
76
+ {children}
77
+ </ConsentManagerProvider>
78
+ );
79
+ }
80
+ ```
81
+
82
+ > ℹ️ **Info:**
83
+ > If you use overrides or custom credentials in buildPrefetchScript, pass the same values to getPrefetchedInitialData(...) so it resolves the matching prefetched request.
84
+
85
+ ## Keep The Provider Mounted Across Navigation
86
+
87
+ Mount the consent provider at the app root so route transitions do not remount it.
88
+
89
+ Why this helps:
90
+
91
+ * Avoids re-running init work on client-side navigation
92
+ * Prevents extra callback churn from remount cycles
93
+ * Keeps banner/dialog state stable between route transitions
94
+
95
+ ## Animation Performance
96
+
97
+ The default motion tokens are tuned for speed-first product UI:
98
+
99
+ |Token|Duration|Used for|
100
+ |--|--|--|
101
+ |`fast`|80ms|Banner slide + overlay, card scale, button hover, widget entry/exit|
102
+ |`normal`|150ms|Accordion, switch toggle|
103
+ |`slow`|200ms|Dialog trigger snap, tab indicator|
104
+
105
+ These defaults follow the principle that product UI should be fast and purposeful — animations exist for spatial continuity, not decoration. In benchmarks, animation duration contributes a constant floor to "data fetched → banner visible" timing. The default tokens sit at the lower end of standard UI ranges (80-200ms) to minimize that floor.
106
+
107
+ To customize motion durations and easing, see [Styling](/docs/frameworks/react/styling/overview).
108
+
109
+ ## Reduce Network Overhead
110
+
111
+ If you must use a cross-origin backend URL, add preconnect so the browser starts DNS/TLS early:
112
+
113
+ ```tsx
114
+ <head>
115
+ <link rel="preconnect" href="https://your-instance.c15t.dev" crossOrigin="" />
116
+ </head>
117
+ ```