@c15t/react 3.0.0-alpha.0 → 3.0.0-alpha.10

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 (405) hide show
  1. package/AGENTS.md +96 -69
  2. package/README.md +21 -17
  3. package/SKILL.md +34 -0
  4. package/dist/aggregate-components.js +1 -1
  5. package/dist/chunk-warming.js +1 -1
  6. package/dist/component-hooks/use-headless-consent-ui.js +1 -1
  7. package/dist/component-hooks/use-headless-iab-consent-ui.js +1 -1
  8. package/dist/component-hooks/use-panel-trigger.js +1 -1
  9. package/dist/components/consent-gate/atoms.js +1 -0
  10. package/dist/components/consent-gate/consent-gate.js +2 -0
  11. package/dist/components/consent-gate/frame.js +2 -0
  12. package/dist/components/consent-gate/index.js +2 -0
  13. package/dist/components/consent-preferences-link/consent-preferences-link.js +1 -1
  14. package/dist/components/iab-panel/atoms/card.js +1 -1
  15. package/dist/components/iab-panel/atoms/feature-item.js +2 -0
  16. package/dist/components/iab-panel/atoms/header.js +1 -1
  17. package/dist/components/iab-panel/atoms/purpose-item.js +1 -1
  18. package/dist/components/iab-panel/atoms/root.js +1 -1
  19. package/dist/components/iab-panel/atoms/stack-item.js +1 -1
  20. package/dist/components/iab-panel/atoms/vendor-list.js +1 -1
  21. package/dist/components/iab-panel/hooks/use-gvl-data.js +1 -1
  22. package/dist/components/iab-panel/iab-panel.js +1 -1
  23. package/dist/components/iab-panel/index.js +1 -1
  24. package/dist/components/iab-prompt/atoms/overlay.js +1 -1
  25. package/dist/components/iab-prompt/atoms/root.js +1 -1
  26. package/dist/components/panel/atoms/card.js +1 -1
  27. package/dist/components/panel/atoms/overlay.js +1 -1
  28. package/dist/components/panel/atoms/root.js +1 -1
  29. package/dist/components/panel/panel.js +1 -1
  30. package/dist/components/panel-trigger/atoms/button.js +1 -1
  31. package/dist/components/panel-trigger/atoms/icon.js +1 -1
  32. package/dist/components/panel-trigger/atoms/root.js +1 -1
  33. package/dist/components/panel-trigger/atoms/toolbar.js +1 -1
  34. package/dist/components/panel-trigger/atoms/trigger-icons.js +1 -0
  35. package/dist/components/panel-trigger/panel-trigger-toolbar.js +1 -1
  36. package/dist/components/panel-trigger/panel-trigger.js +1 -1
  37. package/dist/components/preferences/atoms/accordion.js +1 -1
  38. package/dist/components/preferences/atoms/root.js +1 -1
  39. package/dist/components/preferences/atoms/vendor-list.js +1 -0
  40. package/dist/components/preferences/index.js +1 -1
  41. package/dist/components/prompt/atoms/early-tap-script.js +2 -0
  42. package/dist/components/prompt/atoms/overlay.js +1 -1
  43. package/dist/components/prompt/atoms/root.js +1 -1
  44. package/dist/components/prompt/components.js +1 -1
  45. package/dist/components/prompt/policy-actions.js +1 -1
  46. package/dist/components/prompt/prompt.js +1 -1
  47. package/dist/components/shared/dialog-sheets.js +1 -0
  48. package/dist/components/shared/first-paint-sheets.js +1 -0
  49. package/dist/components/shared/iab-dialog-sheets.js +1 -0
  50. package/dist/components/shared/iab-first-paint-sheets.js +1 -0
  51. package/dist/components/shared/libs/compose-refs.js +1 -0
  52. package/dist/components/shared/libs/slot.js +1 -1
  53. package/dist/components/shared/primitives/button.js +1 -1
  54. package/dist/components/shared/primitives/legal-links/index.js +1 -1
  55. package/dist/components/shared/streamed-surface.js +2 -0
  56. package/dist/components/shared/surface-styles.js +2 -0
  57. package/dist/components/shared/ui/dialog/dialog.js +1 -1
  58. package/dist/components/shared/ui/icon.js +1 -1
  59. package/dist/components/shared/ui/logo.js +1 -1
  60. package/dist/components/shared/ui/preference-item/preference-item.js +1 -1
  61. package/dist/consent-gate.js +2 -0
  62. package/dist/consent-theme.js +1 -0
  63. package/dist/context/consent-tracking-context.js +1 -1
  64. package/dist/context/index.js +1 -1
  65. package/dist/context.js +1 -1
  66. package/dist/devtools-launcher.js +2 -0
  67. package/dist/devtools.js +1 -1
  68. package/dist/draft-context.js +2 -0
  69. package/dist/draft.js +1 -1
  70. package/dist/external-iab-context.js +1 -1
  71. package/dist/gpp.js +2 -0
  72. package/dist/headless.js +1 -1
  73. package/dist/hooks/use-color-scheme.js +1 -1
  74. package/dist/hooks/use-committed-ref.js +2 -0
  75. package/dist/hooks/use-focus-trap.js +1 -1
  76. package/dist/hooks/use-headless-iab-consent-ui.js +1 -1
  77. package/dist/hooks/use-iab-policy-guard.js +1 -0
  78. package/dist/hooks/use-late-entry.js +2 -0
  79. package/dist/hooks.js +1 -1
  80. package/dist/iab/styles.tw3.css +5 -151
  81. package/dist/iab-context.js +1 -1
  82. package/dist/index-parts/consent-banner.js +1 -0
  83. package/dist/index-parts/consent-dialog-link.js +1 -0
  84. package/dist/index-parts/consent-dialog-trigger.js +1 -0
  85. package/dist/index-parts/consent-dialog.js +1 -0
  86. package/dist/index-parts/consent-gate.js +1 -0
  87. package/dist/index-parts/core.js +1 -0
  88. package/dist/index-parts/draft.js +1 -0
  89. package/dist/index-parts/frame.js +1 -0
  90. package/dist/index-parts/hooks.js +1 -0
  91. package/dist/index-parts/hosted.js +1 -0
  92. package/dist/index-parts/module-hooks.js +1 -0
  93. package/dist/index-parts/offline.js +1 -0
  94. package/dist/index-parts/presets.js +1 -0
  95. package/dist/index-parts/provider.js +1 -0
  96. package/dist/index-parts/theme.js +1 -0
  97. package/dist/index-parts/translations.js +1 -0
  98. package/dist/index.js +1 -1
  99. package/dist/kernel-selector.js +1 -0
  100. package/dist/modes.js +1 -0
  101. package/dist/module-hooks/iframe-blocker.js +1 -1
  102. package/dist/module-hooks/network-blocker.js +1 -1
  103. package/dist/module-hooks/network-hold.js +2 -0
  104. package/dist/module-hooks/persistence.js +1 -1
  105. package/dist/panel-link.js +1 -1
  106. package/dist/panel-trigger.js +1 -1
  107. package/dist/panel.js +1 -1
  108. package/dist/postcss-tailwind3.js +1 -0
  109. package/dist/preferences.js +1 -2
  110. package/dist/provider.js +1 -1
  111. package/dist/server/fetch-ssr-data.js +1 -1
  112. package/dist/server/headers.js +1 -1
  113. package/dist/server/normalize-url.js +1 -1
  114. package/dist/styles.tw3.css +35 -159
  115. package/dist/transports/hosted.js +1 -0
  116. package/dist/transports/manifest.js +1 -0
  117. package/dist/transports/offline.js +1 -1
  118. package/dist/utils/deferred-module.js +2 -0
  119. package/dist/utils/merge-slot-props.js +1 -1
  120. package/dist/utils/theme-utils.js +1 -1
  121. package/dist/version.js +1 -1
  122. package/dist-types/aggregate-components.d.ts +2 -2
  123. package/dist-types/chunk-warming.d.ts +45 -8
  124. package/dist-types/component-hooks/use-headless-consent-ui.d.ts +5 -5
  125. package/dist-types/component-hooks/use-headless-iab-consent-ui.d.ts +2 -2
  126. package/dist-types/components/consent-gate/atoms.d.ts +11 -0
  127. package/dist-types/components/consent-gate/consent-gate.d.ts +2 -0
  128. package/dist-types/components/consent-gate/frame.d.ts +19 -0
  129. package/dist-types/components/consent-gate/index.d.ts +25 -0
  130. package/dist-types/components/{frame → consent-gate}/types.d.ts +7 -7
  131. package/dist-types/components/consent-preferences-link/consent-preferences-link.d.ts +1 -1
  132. package/dist-types/components/consent-preferences-link/index.d.ts +1 -1
  133. package/dist-types/components/iab-panel/atoms/feature-item.d.ts +28 -0
  134. package/dist-types/components/iab-panel/atoms/purpose-item.d.ts +5 -2
  135. package/dist-types/components/iab-panel/atoms/stack-item.d.ts +7 -2
  136. package/dist-types/components/iab-panel/atoms/vendor-list.d.ts +1 -1
  137. package/dist-types/components/iab-panel/iab-panel.d.ts +3 -3
  138. package/dist-types/components/iab-panel/index.d.ts +29 -26
  139. package/dist-types/components/iab-panel/use-iab-translations.d.ts +4 -0
  140. package/dist-types/components/iab-prompt/iab-prompt.d.ts +3 -3
  141. package/dist-types/components/iab-prompt/index.d.ts +19 -19
  142. package/dist-types/components/panel/atoms/card.d.ts +5 -4
  143. package/dist-types/components/panel/atoms/overlay.d.ts +1 -1
  144. package/dist-types/components/panel/index.d.ts +8 -8
  145. package/dist-types/components/panel/panel.d.ts +3 -3
  146. package/dist-types/components/panel-link/index.d.ts +1 -1
  147. package/dist-types/components/panel-trigger/atoms/button.d.ts +1 -1
  148. package/dist-types/components/panel-trigger/atoms/icon.d.ts +1 -1
  149. package/dist-types/components/panel-trigger/atoms/root.d.ts +2 -2
  150. package/dist-types/components/panel-trigger/atoms/toolbar.d.ts +2 -2
  151. package/dist-types/components/panel-trigger/atoms/trigger-icons.d.ts +25 -0
  152. package/dist-types/components/panel-trigger/index.d.ts +4 -4
  153. package/dist-types/components/panel-trigger/panel-trigger-toolbar.d.ts +1 -1
  154. package/dist-types/components/panel-trigger/panel-trigger.d.ts +9 -17
  155. package/dist-types/components/panel-trigger/types.d.ts +1 -1
  156. package/dist-types/components/preferences/atoms/accordion.d.ts +6 -4
  157. package/dist-types/components/preferences/atoms/button.d.ts +1 -1
  158. package/dist-types/components/preferences/atoms/footer.d.ts +1 -1
  159. package/dist-types/components/preferences/atoms/root.d.ts +1 -1
  160. package/dist-types/components/preferences/atoms/vendor-list.d.ts +23 -0
  161. package/dist-types/components/preferences/index.d.ts +14 -12
  162. package/dist-types/components/preferences/policy-actions.d.ts +2 -2
  163. package/dist-types/components/preferences/preferences.d.ts +1 -1
  164. package/dist-types/components/preferences/types.d.ts +1 -1
  165. package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
  166. package/dist-types/components/prompt/atoms/root.d.ts +4 -0
  167. package/dist-types/components/prompt/components.d.ts +9 -3
  168. package/dist-types/components/prompt/index.d.ts +12 -12
  169. package/dist-types/components/prompt/policy-actions.d.ts +2 -2
  170. package/dist-types/components/prompt/prompt.d.ts +5 -1
  171. package/dist-types/components/shared/dialog-sheets.d.ts +9 -0
  172. package/dist-types/components/shared/first-paint-sheets.d.ts +8 -0
  173. package/dist-types/components/shared/iab-dialog-sheets.d.ts +3 -0
  174. package/dist-types/components/shared/iab-first-paint-sheets.d.ts +3 -0
  175. package/dist-types/components/shared/libs/compose-refs.d.ts +20 -0
  176. package/dist-types/components/shared/policy-actions.d.ts +2 -2
  177. package/dist-types/components/shared/primitives/box.d.ts +1 -1
  178. package/dist-types/components/shared/primitives/button.d.ts +2 -2
  179. package/dist-types/components/shared/primitives/button.types.d.ts +1 -1
  180. package/dist-types/components/shared/streamed-surface.d.ts +23 -0
  181. package/dist-types/components/shared/surface-styles.d.ts +36 -0
  182. package/dist-types/components/shared/ui/accordion/accordion.d.ts +2 -2
  183. package/dist-types/components/shared/ui/accordion/index.d.ts +2 -2
  184. package/dist-types/components/shared/ui/animated-collapse/index.d.ts +2 -2
  185. package/dist-types/components/shared/ui/branding.d.ts +1 -1
  186. package/dist-types/components/shared/ui/button/button.d.ts +1 -1
  187. package/dist-types/components/shared/ui/button/index.d.ts +2 -2
  188. package/dist-types/components/shared/ui/collapsible/index.d.ts +1 -1
  189. package/dist-types/components/shared/ui/dialog/index.d.ts +1 -1
  190. package/dist-types/components/shared/ui/icon.d.ts +2 -1
  191. package/dist-types/components/shared/ui/logo.d.ts +0 -10
  192. package/dist-types/components/shared/ui/preference-item/index.d.ts +1 -1
  193. package/dist-types/components/shared/ui/preference-item/preference-item.d.ts +13 -0
  194. package/dist-types/components/shared/ui/switch/index.d.ts +2 -2
  195. package/dist-types/components/shared/ui/switch/switch.d.ts +1 -1
  196. package/dist-types/components/shared/ui/tabs/index.d.ts +1 -1
  197. package/dist-types/consent-gate.d.ts +1 -0
  198. package/dist-types/consent-theme.d.ts +38 -0
  199. package/dist-types/context/consent-tracking-context.d.ts +10 -0
  200. package/dist-types/context/index.d.ts +3 -3
  201. package/dist-types/context/theme-context.d.ts +3 -3
  202. package/dist-types/context.d.ts +25 -1
  203. package/dist-types/devtools-launcher.d.ts +29 -0
  204. package/dist-types/devtools.d.ts +13 -2
  205. package/dist-types/draft-context.d.ts +31 -0
  206. package/dist-types/draft.d.ts +81 -9
  207. package/dist-types/gpp.d.ts +27 -0
  208. package/dist-types/headless.d.ts +6 -7
  209. package/dist-types/hooks/use-committed-ref.d.ts +24 -0
  210. package/dist-types/hooks/use-focus-trap.d.ts +3 -1
  211. package/dist-types/hooks/use-headless-iab-consent-ui.d.ts +1 -1
  212. package/dist-types/hooks/use-iab-manager.d.ts +5 -5
  213. package/dist-types/hooks/use-iab-policy-guard.d.ts +35 -0
  214. package/dist-types/hooks/use-late-entry.d.ts +14 -0
  215. package/dist-types/hooks/use-theme.d.ts +1 -1
  216. package/dist-types/hooks.d.ts +106 -11
  217. package/dist-types/iab.d.ts +7 -7
  218. package/dist-types/index-parts/consent-banner.d.ts +7 -0
  219. package/dist-types/index-parts/consent-dialog-link.d.ts +7 -0
  220. package/dist-types/index-parts/consent-dialog-trigger.d.ts +7 -0
  221. package/dist-types/index-parts/consent-dialog.d.ts +7 -0
  222. package/dist-types/index-parts/consent-gate.d.ts +7 -0
  223. package/dist-types/index-parts/core.d.ts +7 -0
  224. package/dist-types/index-parts/draft.d.ts +7 -0
  225. package/dist-types/index-parts/frame.d.ts +7 -0
  226. package/dist-types/index-parts/hooks.d.ts +7 -0
  227. package/dist-types/index-parts/hosted.d.ts +7 -0
  228. package/dist-types/index-parts/module-hooks.d.ts +7 -0
  229. package/dist-types/index-parts/offline.d.ts +7 -0
  230. package/dist-types/index-parts/presets.d.ts +7 -0
  231. package/dist-types/index-parts/provider.d.ts +7 -0
  232. package/dist-types/index-parts/theme.d.ts +8 -0
  233. package/dist-types/index-parts/translations.d.ts +7 -0
  234. package/dist-types/index.d.ts +32 -28
  235. package/dist-types/kernel-selector.d.ts +68 -0
  236. package/dist-types/modes.d.ts +26 -0
  237. package/dist-types/module-hooks/iframe-blocker.d.ts +33 -1
  238. package/dist-types/module-hooks/network-blocker.d.ts +23 -0
  239. package/dist-types/module-hooks/network-hold.d.ts +47 -0
  240. package/dist-types/module-hooks.d.ts +4 -4
  241. package/dist-types/panel-link.d.ts +1 -1
  242. package/dist-types/panel-trigger.d.ts +1 -1
  243. package/dist-types/panel.d.ts +13 -1
  244. package/dist-types/postcss-tailwind3.d.ts +21 -0
  245. package/dist-types/preferences.d.ts +12 -1
  246. package/dist-types/primitives/accordion.d.ts +1 -1
  247. package/dist-types/primitives/button.d.ts +1 -1
  248. package/dist-types/primitives/collapsible.d.ts +1 -1
  249. package/dist-types/primitives/dialog.d.ts +1 -1
  250. package/dist-types/primitives/preference-item.d.ts +1 -1
  251. package/dist-types/primitives/switch.d.ts +1 -1
  252. package/dist-types/primitives/tabs.d.ts +1 -1
  253. package/dist-types/primitives.d.ts +7 -7
  254. package/dist-types/prompt.d.ts +1 -1
  255. package/dist-types/provider.d.ts +174 -28
  256. package/dist-types/server/fetch-ssr-data.d.ts +1 -1
  257. package/dist-types/server/headers.d.ts +14 -4
  258. package/dist-types/server/index.d.ts +5 -5
  259. package/dist-types/server/normalize-url.d.ts +14 -7
  260. package/dist-types/server/types.d.ts +12 -1
  261. package/dist-types/theme-provider.d.ts +2 -2
  262. package/dist-types/transports/hosted.d.ts +36 -0
  263. package/dist-types/transports/manifest.d.ts +48 -0
  264. package/dist-types/transports/offline.d.ts +7 -16
  265. package/dist-types/types/index.d.ts +3 -3
  266. package/dist-types/types/manager.d.ts +1 -1
  267. package/dist-types/types/theme/index.d.ts +1 -1
  268. package/dist-types/ui-config-context.d.ts +14 -2
  269. package/dist-types/utils/deferred-module.d.ts +13 -0
  270. package/dist-types/utils/index.d.ts +4 -4
  271. package/dist-types/utils/merge-slot-props.d.ts +17 -3
  272. package/dist-types/utils/merge-styles.d.ts +1 -1
  273. package/dist-types/utils/theme-utils.d.ts +18 -3
  274. package/dist-types/version.d.ts +1 -1
  275. package/docs/README.md +96 -69
  276. package/docs/assets/v3/bottom-bar.png +0 -0
  277. package/docs/assets/v3/brand-card.png +0 -0
  278. package/docs/assets/v3/brand-preferences.png +0 -0
  279. package/docs/assets/v3/choice-wall.png +0 -0
  280. package/docs/assets/v3/headless-bar-html.png +0 -0
  281. package/docs/assets/v3/headless-bar-mobile.png +0 -0
  282. package/docs/assets/v3/headless-bar.png +0 -0
  283. package/docs/assets/v3/slim-bar.png +0 -0
  284. package/docs/concepts/choose-your-setup.md +138 -0
  285. package/docs/concepts/consent-categories.md +84 -0
  286. package/docs/concepts/consent-state.md +421 -0
  287. package/docs/concepts/data-fetching.md +270 -0
  288. package/docs/concepts/how-consent-works.md +123 -0
  289. package/docs/concepts/modes.md +278 -0
  290. package/docs/{frameworks/react/concepts/policy-presets.md → concepts/policies.md} +8 -60
  291. package/docs/customization/class-names.md +202 -0
  292. package/docs/customization/dark-mode.md +157 -0
  293. package/docs/customization/motion.md +128 -0
  294. package/docs/customization/overview.md +68 -33
  295. package/docs/customization/recipes.md +838 -47
  296. package/docs/customization/slots.md +217 -35
  297. package/docs/customization/stylesheets.md +248 -0
  298. package/docs/customization/tailwind.md +863 -0
  299. package/docs/customization/tokens.md +167 -36
  300. package/docs/customization/translations.md +87 -3
  301. package/docs/frameworks/react/callbacks.md +118 -0
  302. package/docs/frameworks/react/clear-on-revocation.md +106 -0
  303. package/docs/frameworks/react/components/consent-banner.md +48 -27
  304. package/docs/frameworks/react/components/consent-dialog-link.md +13 -11
  305. package/docs/frameworks/react/components/consent-dialog-trigger.md +86 -76
  306. package/docs/frameworks/react/components/consent-dialog.md +111 -58
  307. package/docs/frameworks/react/components/{frame.md → consent-gate.md} +70 -49
  308. package/docs/frameworks/react/components/consent-provider.md +140 -0
  309. package/docs/frameworks/react/components/consent-widget.md +69 -24
  310. package/docs/frameworks/react/components/dev-tools.md +76 -85
  311. package/docs/frameworks/react/components.md +113 -0
  312. package/docs/frameworks/react/compose.md +354 -0
  313. package/docs/frameworks/react/content-security-policy.md +143 -0
  314. package/docs/frameworks/react/customize.md +258 -0
  315. package/docs/frameworks/react/embeds.md +89 -0
  316. package/docs/frameworks/react/gpp.md +163 -0
  317. package/docs/frameworks/react/headless.md +4 -4
  318. package/docs/frameworks/react/hooks.md +70 -0
  319. package/docs/frameworks/react/iab.md +259 -0
  320. package/docs/frameworks/react/network-blocker.md +140 -0
  321. package/docs/frameworks/react/quickstart.md +220 -102
  322. package/docs/frameworks/react/rendering.md +263 -0
  323. package/docs/frameworks/react/scripts.md +114 -0
  324. package/docs/frameworks/react/translations.md +155 -0
  325. package/docs/frameworks/react/troubleshooting.md +188 -61
  326. package/docs/frameworks/react/upgrade-v3.md +651 -0
  327. package/docs/frameworks/react/vendor-consent.md +188 -0
  328. package/docs/guides/banner-experiments.md +672 -0
  329. package/docs/guides/troubleshooting.md +192 -54
  330. package/docs/guides/verify-consent.md +96 -49
  331. package/docs/integrations/adobe-analytics.md +177 -183
  332. package/docs/integrations/ahrefs-analytics.md +162 -178
  333. package/docs/integrations/amplitude.md +172 -180
  334. package/docs/integrations/building-integrations.md +137 -33
  335. package/docs/integrations/clearbit.md +164 -178
  336. package/docs/integrations/cloudflare-web-analytics.md +166 -180
  337. package/docs/integrations/cloudflare-zaraz.md +333 -0
  338. package/docs/integrations/crisp.md +174 -182
  339. package/docs/integrations/databuddy.md +167 -197
  340. package/docs/integrations/fathom-analytics.md +168 -180
  341. package/docs/integrations/front-chat.md +308 -0
  342. package/docs/integrations/google-maps.md +142 -108
  343. package/docs/integrations/google-tag-manager.md +258 -185
  344. package/docs/integrations/google-tag.md +226 -182
  345. package/docs/integrations/heap.md +173 -179
  346. package/docs/integrations/hightouch.md +171 -181
  347. package/docs/integrations/hotjar.md +169 -179
  348. package/docs/integrations/intercom.md +193 -177
  349. package/docs/integrations/klaviyo.md +473 -0
  350. package/docs/integrations/linkedin-insights.md +184 -174
  351. package/docs/integrations/logrocket.md +170 -180
  352. package/docs/integrations/matomo-analytics.md +198 -202
  353. package/docs/integrations/meta-pixel.md +198 -174
  354. package/docs/integrations/microsoft-clarity.md +173 -179
  355. package/docs/integrations/microsoft-uet.md +158 -178
  356. package/docs/integrations/mixpanel-analytics.md +165 -184
  357. package/docs/integrations/one-dollar-stats.md +292 -0
  358. package/docs/integrations/openai-pixel.md +214 -325
  359. package/docs/integrations/overview.md +152 -83
  360. package/docs/integrations/pinterest-tag.md +315 -0
  361. package/docs/integrations/pirsch.md +179 -183
  362. package/docs/integrations/plausible-analytics.md +182 -182
  363. package/docs/integrations/posthog.md +323 -264
  364. package/docs/integrations/promptwatch.md +164 -178
  365. package/docs/integrations/reddit-pixel.md +195 -181
  366. package/docs/integrations/rudderstack.md +211 -210
  367. package/docs/integrations/rybbit-analytics.md +181 -184
  368. package/docs/integrations/segment.md +192 -178
  369. package/docs/integrations/sentry.md +402 -0
  370. package/docs/integrations/snapchat-pixel.md +196 -180
  371. package/docs/integrations/tiktok-pixel.md +181 -174
  372. package/docs/integrations/umami-analytics.md +173 -182
  373. package/docs/integrations/vercel-analytics.md +176 -181
  374. package/docs/integrations/x-pixel.md +186 -174
  375. package/docs/integrations/youtube.md +150 -111
  376. package/package.json +48 -17
  377. package/dist/component-hooks/use-manager.js +0 -2
  378. package/dist/components/frame/atoms.js +0 -1
  379. package/dist/components/frame/frame.js +0 -2
  380. package/dist/components/frame/index.js +0 -2
  381. package/dist/frame.js +0 -2
  382. package/dist/ui-save.js +0 -1
  383. package/dist-types/component-hooks/use-manager.d.ts +0 -40
  384. package/dist-types/components/frame/atoms.d.ts +0 -11
  385. package/dist-types/components/frame/frame.d.ts +0 -2
  386. package/dist-types/components/frame/index.d.ts +0 -24
  387. package/dist-types/frame.d.ts +0 -1
  388. package/dist-types/ui-save.d.ts +0 -5
  389. package/docs/assets/v3/brand-bar.png +0 -0
  390. package/docs/assets/v3/mobile-card.png +0 -0
  391. package/docs/assets/v3/preferences.png +0 -0
  392. package/docs/frameworks/react/components/consent-manager-provider.md +0 -62
  393. package/docs/frameworks/react/concepts/consent-categories.md +0 -33
  394. package/docs/frameworks/react/hooks/use-consent-manager/overview.md +0 -58
  395. package/docs/frameworks/react/iab/overview.md +0 -53
  396. package/docs/frameworks/react/script-loader.md +0 -55
  397. package/docs/frameworks/react/styling/overview.md +0 -207
  398. package/docs/guides/consent-state.md +0 -60
  399. package/docs/guides/data-fetching.md +0 -163
  400. package/docs/guides/deployment-modes.md +0 -63
  401. package/docs/upgrade-v3.md +0 -334
  402. package/readme.json +0 -48
  403. package/src/iab/styles.css +0 -11
  404. package/src/styles.css +0 -10
  405. /package/dist/components/{frame → consent-gate}/types.js +0 -0
@@ -17,7 +17,8 @@
17
17
  * observed through the selector hooks, whose subscription model handles
18
18
  * invalidation correctly.
19
19
  */
20
- import type { AllConsentNames, ConsentKernel, PromptPresentation, PreferencesPresentation, ConsentSnapshot, ConsentState, KernelActiveUI, KernelBranding, KernelIABState, KernelModel, KernelOverrides, KernelTranslations, KernelUser, LocationResponse, PolicyScopeMode } from '@c15t/core';
20
+ import type { AllConsentNames, ConsentKernel, ConsentPresentation, ExperimentAssignment, PromptPresentation, PreferencesPresentation, ConsentSnapshot, ConsentState, KernelActiveUI, KernelBranding, KernelIABState, KernelModel, KernelOverrides, KernelTranslations, KernelUser, LocationResponse, PolicyScopeMode, ResolvedVendor, VendorChoice } from '@c15t/core';
21
+ import type { Theme } from './types/theme/index.js';
21
22
  /**
22
23
  * Full snapshot accessor. Escape hatch for consumers that genuinely need
23
24
  * multiple slices. Prefer narrow hooks for re-render isolation.
@@ -65,6 +66,8 @@ export declare const useHasConsentPolicy: () => boolean;
65
66
  * {@link useHasConsentPolicy}.
66
67
  */
67
68
  export declare const useHasConsentUI: () => boolean;
69
+ /** Whether c15t or an external CMP offers a preferences control. */
70
+ export declare const useHasConsentPreferences: () => boolean;
68
71
  /**
69
72
  * Derived consent model (opt-in / opt-out / iab), or `null` while no policy
70
73
  * rule is resolved. The kernel keeps a safe fallback rule internally; this
@@ -81,26 +84,91 @@ export declare const usePolicyScopeMode: () => PolicyScopeMode;
81
84
  export declare const useIABSnapshot: () => Readonly<KernelIABState> | null;
82
85
  /** Is IAB active? */
83
86
  export declare const useIABEnabled: () => boolean;
84
- /** Consent for a specific IAB vendor. Accepts numeric or string IDs; IAB
85
- * vendors are numeric but the kernel stores them as strings for
86
- * uniformity with custom vendors. */
87
+ /**
88
+ * The preference centre's consent selection for one IAB vendor, including
89
+ * changes the visitor has not saved yet. Use it to render a control, not to
90
+ * gate a vendor: the saved choice is the TC string that `__tcfapi` serves,
91
+ * and `useIABSnapshot()?.authority` holds its decoded signals.
92
+ *
93
+ * @param vendorId - Numeric or string ID. IAB vendors are numeric; the
94
+ * kernel stores IDs as strings so custom vendors fit the same map.
95
+ * @returns Whether the vendor is selected.
96
+ */
87
97
  export declare const useVendorConsent: (vendorId: string | number) => boolean;
88
- /** Consent for a specific IAB purpose (1–11). */
98
+ /**
99
+ * The preference centre's consent selection for one IAB purpose (1-11),
100
+ * including changes the visitor has not saved yet. Use it to render a
101
+ * control, not to gate a vendor: see {@link useVendorConsent}.
102
+ *
103
+ * @param purposeId - IAB purpose ID.
104
+ * @returns Whether the purpose is selected.
105
+ */
89
106
  export declare const usePurposeConsent: (purposeId: number) => boolean;
90
- /** Opt-in for a special feature (1 = geolocation, 2 = device ID). */
107
+ /**
108
+ * The preference centre's opt-in selection for one special feature
109
+ * (1 = geolocation, 2 = device ID), including changes the visitor has not
110
+ * saved yet. Use it to render a control, not to gate a vendor: see
111
+ * {@link useVendorConsent}.
112
+ *
113
+ * @param featureId - IAB special feature ID.
114
+ * @returns Whether the special feature is selected.
115
+ */
91
116
  export declare const useSpecialFeatureOptIn: (featureId: number) => boolean;
92
117
  /** Latest TCF string. `null` until the IAB module encodes one. */
93
118
  export declare const useTCString: () => string | null;
119
+ /**
120
+ * Vendors declared for vendor-level consent outside IAB, merged from the
121
+ * provider's `vendors` option, the backend and script slugs. Empty under an
122
+ * `iab` policy, where the TC string decides and vendor rows are not shown.
123
+ */
124
+ export declare const useDeclaredVendors: () => readonly ResolvedVendor[];
125
+ /**
126
+ * The visitor's recorded vendor decision.
127
+ *
128
+ * @returns The decision, whose `denied` list may be empty after a bulk
129
+ * action lifted every denial, or `null` when no vendor decision was ever
130
+ * recorded.
131
+ */
132
+ export declare const useVendorChoice: () => Readonly<VendorChoice> | null;
133
+ /**
134
+ * Whether one vendor may load: it is declared, its category condition
135
+ * passes, and outside IAB the visitor has not turned it off.
136
+ *
137
+ * @param vendorId - Vendor id as declared in `vendors`, on a script or by
138
+ * the backend.
139
+ * @returns `true` while the vendor may load. An id nothing declares, such
140
+ * as a typo, returns `false` and logs a development warning.
141
+ */
142
+ export declare const useVendorAllowed: (vendorId: string) => boolean;
143
+ /** Register categories used by scripts, frames, or other integrations. */
144
+ export declare const useRegisterConsentCategories: () => (categories: readonly AllConsentNames[]) => void;
94
145
  /**
95
146
  * Sync mutation: apply overrides (country, region, language, GPC).
96
147
  */
97
148
  export declare const useSetOverrides: () => (input: KernelOverrides) => void;
98
149
  /**
99
- * Sync mutation: switch active language.
150
+ * Switch the consent language and load its copy.
151
+ *
152
+ * Stores the language override and runs init again, so the banner and
153
+ * dialog show copy in that language: a hosted backend returns it, and
154
+ * offline mode takes it from the bundled translations and `i18n.messages`.
155
+ * Setting the current language does nothing. A disabled provider stores
156
+ * the language without running init.
157
+ *
158
+ * @returns A setter that takes a language code such as `'de'`.
159
+ *
160
+ * @example
161
+ * ```tsx
162
+ * const setLanguage = useSetLanguage();
163
+ * <button onClick={() => setLanguage('de')}>Deutsch</button>
164
+ * ```
100
165
  */
101
166
  export declare const useSetLanguage: () => (code: string) => void;
102
167
  /**
103
168
  * Sync mutation: set the active UI surface (banner/dialog/none).
169
+ *
170
+ * Explicit navigation: a pending save on this kernel can no longer close or
171
+ * restore a surface once the visitor navigated.
104
172
  */
105
173
  export declare const useSetActiveUI: () => (ui: KernelActiveUI) => void;
106
174
  /**
@@ -132,8 +200,6 @@ export declare const usePromptRequirement: () => ConsentSnapshot['promptRequirem
132
200
  export declare const useNoticeDismissal: () => ConsentSnapshot['noticeDismissal'];
133
201
  /** Read privacySignals from the kernel without a competing projection. */
134
202
  export declare const usePrivacySignals: () => ConsentSnapshot['privacySignals'];
135
- /** Read optOutDirectives from the kernel without a competing projection. */
136
- export declare const useOptOutDirectives: () => ConsentSnapshot['optOutDirectives'];
137
203
  /** Read resolution from the kernel without a competing projection. */
138
204
  export declare const usePolicyResolution: () => ConsentSnapshot['resolution'];
139
205
  /** Read policyRule from the kernel without a competing projection. */
@@ -142,7 +208,36 @@ export declare const usePolicyRule: () => ConsentSnapshot['policyRule'];
142
208
  export declare const useRestrictions: () => ConsentSnapshot['restrictions'];
143
209
  /** Dismiss the current local notice without recording a category choice. */
144
210
  export declare const useDismissNotice: () => ConsentKernel['commands']['dismissNotice'];
145
- /** Host first-layer presentation. */
211
+ /**
212
+ * The presentation experiment arm this visitor runs. Built-in assignment
213
+ * lands after mount; a host-resolved `variant` is known at once.
214
+ *
215
+ * @returns The assignment, or `null` while no experiment is configured, the
216
+ * arm is not assigned yet, or the visitor's policy rejects it.
217
+ *
218
+ * @example
219
+ * ```tsx
220
+ * const arm = useExperiment();
221
+ * return arm ? <p>{arm.id}: {arm.variant}</p> : null;
222
+ * ```
223
+ */
224
+ export declare const useExperiment: () => Readonly<ExperimentAssignment> | null;
225
+ /**
226
+ * The host presentation with the assigned experiment arm merged over it.
227
+ *
228
+ * @returns The presentation to render: `options.presentation` itself while
229
+ * no arm is assigned.
230
+ */
231
+ export declare const useResolvedPresentation: () => ConsentPresentation | undefined;
232
+ /**
233
+ * The host theme with the assigned experiment arm's `theme` merged over it.
234
+ * Render its tokens with `<ConsentTheme theme={useResolvedTheme()} />`.
235
+ *
236
+ * @returns The theme to render: `options.theme` itself while no arm is
237
+ * assigned or the arm has no theme.
238
+ */
239
+ export declare const useResolvedTheme: () => Theme | undefined;
240
+ /** Host first-layer presentation, with the experiment arm applied. */
146
241
  export declare const usePromptPresentation: () => PromptPresentation;
147
- /** Host persistent preferences presentation. */
242
+ /** Host persistent preferences presentation, with the experiment arm applied. */
148
243
  export declare const usePreferencesPresentation: () => PreferencesPresentation;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * IAB TCF 2.3 React components and hooks.
2
+ * IAB TCF 2.4 React components and hooks.
3
3
  *
4
4
  * This subpath export contains all IAB-specific React UI. It is only
5
5
  * loaded when explicitly imported from '@c15t/react/iab'.
@@ -12,7 +12,7 @@
12
12
  * import { IABProvider, IABConsentBanner, IABConsentDialog } from '@c15t/react/iab';
13
13
  *
14
14
  * <ConsentProvider
15
- * options={{ mode: hosted({ url: '/api/c15t' }) }}
15
+ * options={{ mode: hosted({ backendURL: '/api/c15t' }) }}
16
16
  * >
17
17
  * <IABProvider cmpId={28}>
18
18
  * <IABConsentBanner />
@@ -23,8 +23,8 @@
23
23
  *
24
24
  * @packageDocumentation
25
25
  */
26
- export { IABConsentBanner, type IABConsentBannerProps, } from './components/iab-prompt';
27
- export { IABConsentDialog, type IABConsentDialogProps, } from './components/iab-panel';
28
- export { type HeadlessIABBannerAction, type HeadlessIABBannerState, type HeadlessIABDialogAction, type HeadlessIABDialogState, type HeadlessIABPreferenceTab, type UseHeadlessIABConsentUIResult, useHeadlessIABConsentUI, } from './hooks/use-headless-iab-consent-ui';
29
- export { IABProvider } from './iab-context';
30
- export type { IABProviderProps } from './iab-context';
26
+ export { IABConsentBanner, type IABConsentBannerProps, } from './components/iab-prompt/index.js';
27
+ export { IABConsentDialog, type IABConsentDialogProps, } from './components/iab-panel/index.js';
28
+ export { type HeadlessIABBannerAction, type HeadlessIABBannerState, type HeadlessIABDialogAction, type HeadlessIABDialogState, type HeadlessIABPreferenceTab, type UseHeadlessIABConsentUIResult, useHeadlessIABConsentUI, } from './hooks/use-headless-iab-consent-ui.js';
29
+ export { IABProvider } from './iab-context.js';
30
+ export type { IABProviderProps } from './iab-context.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { ConsentBanner, useConsentBannerSurface } from '../components/prompt/index.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { ConsentDialogLink } from '../components/panel-link/index.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { ConsentDialogTrigger, ConsentDialogTriggerToolbar, } from '../components/panel-trigger/index.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { ConsentDialog, ConsentWidget } from '../aggregate-components.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { ConsentGate } from '../components/consent-gate/index.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { createConsentKernel, custom } from '@c15t/core';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { ConsentDraftProvider, useConsentDraft, useVendorDraft, } from '../draft.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { Frame } from '../components/consent-gate/frame.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { useActiveUI, useBranding, useConsent, useConsents, useDeclaredVendors, useDismissNotice, useEffectivePermissions, useExperiment, useExplicitChoice, useHasConsentPolicy, useHasConsentPreferences, useHasConsentUI, useIABEnabled, useIABSnapshot, useIdentify, useInit, useLocation, useModel, useNoticeDismissal, useOverrides, usePolicyCategories, usePolicyResolution, usePolicyRule, usePolicyScopeMode, usePreferencesPresentation, usePrivacySignals, usePromptPresentation, usePromptRequirement, usePurposeConsent, useRegisterConsentCategories, useResolvedPresentation, useResolvedTheme, useRestrictions, useSaveConsents, useSetActiveUI, useSetLanguage, useSetOverrides, useSnapshot, useSpecialFeatureOptIn, useSubscribeToConsentChanges, useTCString, useUser, useVendorAllowed, useVendorChoice, useVendorConsent, } from '../hooks.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { hosted } from '@c15t/core';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { useIframeBlocker, useNetworkBlocker, usePersistence, useScriptLoader, } from '../module-hooks.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { offline } from '../transports/offline.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { policyRulePresets } from '@c15t/core';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { ConsentProvider } from '../provider.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { ConsentTheme } from '../consent-theme.js';
8
+ export { defineTheme } from '../types/theme/index.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * One group of `@c15t/react`'s public exports. The package index re-exports
3
+ * each group with `export *`, so a bundler that splits code by reachability
4
+ * (esbuild) does not treat every module the index names as part of an app
5
+ * that imports one hook: only the groups it uses are live.
6
+ */
7
+ export { useTranslations } from '../component-hooks/use-translations.js';
@@ -11,7 +11,7 @@
11
11
  *
12
12
  * function App({ children }) {
13
13
  * return (
14
- * <ConsentProvider options={{ mode: hosted({ url: '/api/c15t' }) }}>
14
+ * <ConsentProvider options={{ mode: hosted({ backendURL: '/api/c15t' }) }}>
15
15
  * {children}
16
16
  * </ConsentProvider>
17
17
  * );
@@ -31,31 +31,35 @@
31
31
  * cache patching. No method rewriting. Provider boot work is explicit
32
32
  * module wiring around a single per-mount kernel.
33
33
  */
34
- export type { ConsentKernel, ConsentSnapshot, ConsentState, HostedTransportOptions, InitContext, InitResponse, InitResult, KernelConfig, KernelEvent, KernelOverrides, KernelTransport, KernelUser, Listener, HostedModeOptions, ProviderTransportContext, ProviderTransportFactory, ProviderTransportKind, SavePayload, SaveResult, Unsubscribe, } from '@c15t/core';
35
- export { createConsentKernel, custom, hosted } from '@c15t/core';
36
- export type { OfflineModeOptions } from './transports/offline';
37
- export { offline } from './transports/offline';
38
- export { ConsentDialog, ConsentWidget } from './aggregate-components';
39
- export type { ConsentBannerButton, ConsentBannerLayout, ConsentBannerProps, ConsentBannerRight, ConsentBannerRightLinkProps, ConsentBannerRightsProps, ConsentBannerSurface, } from './components/prompt';
40
- export { ConsentBanner, type ConsentBannerCompoundComponent, useConsentBannerSurface, } from './components/prompt';
41
- export type { ConsentDialogCompoundComponent, ConsentDialogProps, } from './components/panel';
42
- export type { ConsentDialogLinkProps } from './components/panel-link';
43
- export { ConsentDialogLink } from './components/panel-link';
44
- export type { ConsentDialogTriggerProps, ConsentDialogTriggerToolbarAction, ConsentDialogTriggerToolbarPreferences, ConsentDialogTriggerToolbarProps, TriggerOrientation, } from './components/panel-trigger';
45
- export { ConsentDialogTrigger, ConsentDialogTriggerToolbar, } from './components/panel-trigger';
46
- export type { ConsentWidgetCompoundComponent, ConsentWidgetProps, } from './components/preferences';
47
- export type { FrameProps } from './components/frame';
48
- export { Frame } from './components/frame';
49
- export type { ConsentDraftHandle, ConsentDraftProviderProps } from './draft';
50
- export { ConsentDraftProvider, useConsentDraft } from './draft';
51
- export { useConsentManager } from './component-hooks/use-manager';
52
- export { useTranslations } from './component-hooks/use-translations';
53
- export { useActiveUI, useBranding, useConsent, useConsents, useHasConsentPolicy, useHasConsentUI, useIABEnabled, useIABSnapshot, useIdentify, useInit, useLocation, useModel, useOverrides, usePromptPresentation, usePolicyCategories, usePreferencesPresentation, usePolicyScopeMode, usePurposeConsent, useSaveConsents, useSetActiveUI, useSetLanguage, useSetOverrides, useSnapshot, useSpecialFeatureOptIn, useTCString, useUser, useVendorConsent, } from './hooks';
54
- export type { UseIframeBlockerOptions, UseNetworkBlockerOptions, UsePersistenceOptions, UseScriptLoaderOptions, } from './module-hooks';
55
- export { useIframeBlocker, useNetworkBlocker, usePersistence, useScriptLoader, } from './module-hooks';
56
- export type { ConsentProviderOptions, ConsentProviderCallbacks, ConsentProviderPrefetch, ConsentProviderProps, ExternalRuntimeProviderOptions, ExternalRuntimeProviderProps, OwnedRuntimeProviderProps, } from './provider';
57
- export { ConsentProvider } from './provider';
58
- export type { ReactUIOptions } from './types/manager';
59
- export { defineTheme, type Theme } from './types/theme';
60
- export { useExplicitChoice, useEffectivePermissions, usePromptRequirement, useNoticeDismissal, usePrivacySignals, useOptOutDirectives, usePolicyResolution, usePolicyRule, useRestrictions, useDismissNotice, } from './hooks';
34
+ export type { AllConsentNames, ClearOnRevocationConfig, ConsentKernel, ConsentSnapshot, ConsentState, HostedTransportOptions, InitContext, InitResponse, InitResult, KernelConfig, KernelEvent, KernelOverrides, KernelTransport, KernelUser, Listener, HostedModeOptions, PolicyRule, ProviderTransportContext, ProviderTransportFactory, ProviderTransportKind, SavePayload, SaveResult, Unsubscribe, } from '@c15t/core';
35
+ export type { OfflineModeOptions } from './transports/offline.js';
36
+ export type { ConsentBannerButton, ConsentBannerLayout, ConsentBannerProps, ConsentBannerRight, ConsentBannerRightLinkProps, ConsentBannerRightsProps, ConsentBannerSurface, } from './components/prompt/index.js';
37
+ export type { ConsentDialogCompoundComponent, ConsentDialogProps, } from './components/panel/index.js';
38
+ export type { ConsentDialogLinkProps } from './components/panel-link/index.js';
39
+ export type { ConsentDialogTriggerProps, ConsentDialogTriggerToolbarAction, ConsentDialogTriggerToolbarPreferences, ConsentDialogTriggerToolbarProps, TriggerOrientation, } from './components/panel-trigger/index.js';
40
+ export type { ConsentWidgetCompoundComponent, ConsentWidgetProps, } from './components/preferences/index.js';
41
+ export type { ConsentGateProps, FrameProps } from './components/consent-gate/index.js';
42
+ export type { ConsentDraftHandle, ConsentDraftProviderProps, VendorDraftHandle, } from './draft.js';
43
+ export type { UseIframeBlockerOptions, UseNetworkBlockerOptions, UsePersistenceOptions, UseScriptLoaderOptions, } from './module-hooks.js';
44
+ export type { ConsentProviderOptions, ConsentProviderCallbacks, ConsentProviderPrefetch, ConsentProviderProps, ExternalRuntimeProviderOptions, ExternalRuntimeProviderProps, OwnedRuntimeProviderProps, } from './provider.js';
45
+ export type { ConsentThemeProps } from './consent-theme.js';
46
+ export type { Theme } from './types/theme/index.js';
47
+ export type { ConsentBannerCompoundComponent } from './components/prompt/index.js';
48
+ export type { ReactUIOptions } from './types/manager.js';
61
49
  export type { ConsentPresentation, PromptPresentation, PreferencesPresentation, PresentationAction, PromptPosition, PromptVariant, ResolvedConsentPresentation, } from '@c15t/core';
50
+ export * from './index-parts/core.js';
51
+ export * from './index-parts/hosted.js';
52
+ export * from './index-parts/offline.js';
53
+ export * from './index-parts/presets.js';
54
+ export * from './index-parts/consent-dialog.js';
55
+ export * from './index-parts/consent-banner.js';
56
+ export * from './index-parts/consent-dialog-link.js';
57
+ export * from './index-parts/consent-dialog-trigger.js';
58
+ export * from './index-parts/consent-gate.js';
59
+ export * from './index-parts/frame.js';
60
+ export * from './index-parts/draft.js';
61
+ export * from './index-parts/translations.js';
62
+ export * from './index-parts/module-hooks.js';
63
+ export * from './index-parts/provider.js';
64
+ export * from './index-parts/theme.js';
65
+ export * from './index-parts/hooks.js';
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Kernel access for the hooks and the stock components. The component
3
+ * selectors below each read a single derived value, so a component
4
+ * re-renders only when that value changes. Not exported from any package
5
+ * entry.
6
+ *
7
+ * @packageDocumentation
8
+ * @internal
9
+ */
10
+ import type { AllConsentNames, ConsentKernel, ConsentSnapshot } from '@c15t/core';
11
+ /**
12
+ * Reads the kernel from the nearest provider.
13
+ *
14
+ * @returns The provider's kernel.
15
+ * @throws {Error} When called outside a `ConsentProvider`.
16
+ * @internal
17
+ */
18
+ export declare const useKernel: () => ConsentKernel;
19
+ /**
20
+ * Reads the snapshot hydration renders: the kernel's server snapshot, or,
21
+ * inside a streamed consent surface, the snapshot the server rendered that
22
+ * surface from.
23
+ *
24
+ * @param kernel - The provider's kernel.
25
+ * @returns A `getServerSnapshot` for `useSyncExternalStore`.
26
+ * @internal
27
+ */
28
+ export declare const useServerSnapshot: (kernel: ConsentKernel | null) => () => ConsentSnapshot | undefined;
29
+ /**
30
+ * Subscribes to one slice of the kernel snapshot. React re-renders the
31
+ * caller only when the selected value `Object.is`-differs, so a selector
32
+ * must return a primitive or a reference the snapshot already holds.
33
+ *
34
+ * @param selector - Picks the slice from a snapshot.
35
+ * @returns The selected slice.
36
+ * @internal
37
+ */
38
+ export declare const useKernelSelector: <SliceType>(selector: (snap: ConsentSnapshot) => SliceType) => SliceType;
39
+ /**
40
+ * Like `useKernelSelector`, for selectors that evaluate a gate at a point in
41
+ * time. The server render and hydration evaluate at the snapshot's own
42
+ * `evaluatedAt`, so they never read the clock: a Next.js `cacheComponents`
43
+ * prerender rejects `Date.now()` in a Client Component. In the browser the
44
+ * gate is evaluated at `Date.now()`, so an expiry the kernel's deadline
45
+ * timer has not processed yet still denies.
46
+ *
47
+ * @param selector - Picks the slice from a snapshot at the given time.
48
+ * @returns The selected slice.
49
+ * @internal
50
+ */
51
+ export declare const useGateSelector: <SliceType>(selector: (snap: ConsentSnapshot, now: number) => SliceType) => SliceType;
52
+ /**
53
+ * Whether content gated on one category may render, with the kernel's gate
54
+ * semantics. Server rendering and hydration read no clock; see
55
+ * `useGateSelector`.
56
+ *
57
+ * @param category - Category the content needs.
58
+ * @returns `true` while the category is permitted.
59
+ * @internal
60
+ */
61
+ export declare const useCategoryAllowed: (category: AllConsentNames) => boolean;
62
+ /**
63
+ * Language of the active translation bundle.
64
+ *
65
+ * @returns The bundle's language, or the default language before one loads.
66
+ * @internal
67
+ */
68
+ export declare const useTranslationLanguage: () => string;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `@c15t/react/modes` — the single-page app modes, defaulting to what the
3
+ * build integration downloaded.
4
+ *
5
+ * `manifest()` and `hosted()` here read `@c15t/core/generated`, which
6
+ * `consentManifest()` from `c15t/build` fills with the policy snapshot and
7
+ * the backend URL. `c15t/react` exports these in place of the plain
8
+ * `hosted()` from `@c15t/react`.
9
+ *
10
+ * The package index does not import this module. Server-framework packages
11
+ * re-export the index, and their browser bundles must not import
12
+ * `@c15t/core/generated`: Next.js fails the build when they do.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * import { ConsentProvider, manifest } from 'c15t/react';
17
+ *
18
+ * <ConsentProvider options={{ mode: manifest() }}>{children}</ConsentProvider>;
19
+ * ```
20
+ */
21
+ export { hosted } from './transports/hosted.js';
22
+ export type { HostedOptions } from './transports/hosted.js';
23
+ export { manifest } from './transports/manifest.js';
24
+ export type { BrowserManifestModeFactory, ManifestModeOptions, } from './transports/manifest.js';
25
+ export { offline } from './transports/offline.js';
26
+ export type { OfflineModeOptions } from './transports/offline.js';
@@ -1,6 +1,38 @@
1
- import type { IframeBlockerHandle } from '@c15t/core/modules/iframe-blocker';
1
+ import type { ConsentKernel } from '@c15t/core';
2
+ import type { IframeBlockerHandle, IframeBlockerOptions } from '@c15t/core/modules/iframe-blocker';
2
3
  export interface UseIframeBlockerOptions {
3
4
  disableAutomaticBlocking?: boolean;
4
5
  }
5
6
  export declare const useIframeBlocker: (options?: UseIframeBlockerOptions) => IframeBlockerHandle;
7
+ /**
8
+ * Call `onFound` when a gated iframe is on the page: at once when one is
9
+ * there already, and again for each batch of gated frames that arrives.
10
+ *
11
+ * Until the returned stop function runs, a gated frame that arrives with a
12
+ * `src` the snapshot does not clearly allow is paused (`src` moved to
13
+ * `data-src`), as the loaded blocker would pause it. Frames on the page at
14
+ * the first call are left to the blocker, which is what happens when it
15
+ * loads with the provider.
16
+ *
17
+ * @param kernel - The kernel whose snapshot decides what is clearly allowed.
18
+ * @param onFound - Called for every sighting; the caller dedupes.
19
+ * @returns Stops watching.
20
+ * @internal
21
+ */
22
+ export declare const watchGatedIframes: (kernel: ConsentKernel, onFound: () => void) => () => void;
23
+ /**
24
+ * The provider's iframe blocker. Loads the blocker module when the first
25
+ * gated iframe (`data-category` or `data-vendor`) is on the page instead of
26
+ * on every mount, so pages without one never download it. Until then it
27
+ * pauses gated frames that arrive with a `src` consent does not allow.
28
+ *
29
+ * Passed to the provider runtime as its `createIframeBlocker` module.
30
+ *
31
+ * @param options - The kernel and blocker options. With
32
+ * `disableAutomaticBlocking` the module loads at once.
33
+ * @returns A handle; `processAllIframes()` reaches the blocker once it has
34
+ * loaded.
35
+ * @internal
36
+ */
37
+ export declare const createIframeBlockerOnDemand: ({ disableAutomaticBlocking, kernel, }: IframeBlockerOptions) => IframeBlockerHandle;
6
38
  export type { IframeBlockerHandle };
@@ -5,5 +5,28 @@ export interface UseNetworkBlockerOptions {
5
5
  logBlockedRequests?: boolean;
6
6
  onRequestBlocked?: (info: BlockedRequestInfo) => void;
7
7
  }
8
+ /**
9
+ * Block `fetch` and XHR requests that match `rules` until the visitor's
10
+ * consent allows them.
11
+ *
12
+ * Blocking starts during the first render in the browser: matching requests
13
+ * wait from then on, including ones sent from this component's children's
14
+ * mount effects and from effects that run before this component's. The
15
+ * blocker loads after mount and decides each waiting request. On the
16
+ * server the hook does nothing.
17
+ *
18
+ * Rendering has a side effect: the first render patches `fetch` and
19
+ * `XMLHttpRequest` to hold matching requests. If React discards that
20
+ * render and never commits it, the hold ends after 10 seconds. Nothing
21
+ * checked consent for the requests it held, so they fail as blocked: a 451
22
+ * response for `fetch`, a failed XHR.
23
+ *
24
+ * Prefer the provider's `networkBlocker` option. It starts blocking when
25
+ * the provider renders, so it also covers components rendered before this
26
+ * one.
27
+ *
28
+ * @param options - Rules and logging options.
29
+ * @returns A handle to update rules or toggle blocking.
30
+ */
8
31
  export declare const useNetworkBlocker: (options: UseNetworkBlockerOptions) => NetworkBlockerHandle;
9
32
  export type { BlockedRequestInfo, NetworkBlockerHandle, NetworkBlockerRule };
@@ -0,0 +1,47 @@
1
+ import type { NetworkBlockerRule } from '@c15t/core/modules/network-blocker';
2
+ import type { NetworkHold } from '@c15t/core/modules/network-hold';
3
+ /**
4
+ * How long a hold started during render waits for its component to commit.
5
+ * A render React throws away never commits, so nothing else would end its
6
+ * hold. When this runs out the hold ends, and since nothing checked consent
7
+ * for the requests it held, they get the blocker's answer for a blocked
8
+ * request instead of being sent.
9
+ * @internal
10
+ */
11
+ export declare const UNCOMMITTED_HOLD_MS = 10000;
12
+ /**
13
+ * The render-time hold behind one network blocker mount.
14
+ * @internal
15
+ */
16
+ export interface EarlyNetworkHold {
17
+ /**
18
+ * Call from the mount effect, before loading the blocker. Keeps the hold
19
+ * from expiring, starts a new one if it already ended (a StrictMode or
20
+ * kernel re-run after the blocker took over, or a commit that came after
21
+ * the expiry), and returns it for `createNetworkBlocker({ hold })`. A
22
+ * disabled blocker gets a hold that holds nothing, so it cannot end
23
+ * another caller's hold.
24
+ */
25
+ claim: (rules: readonly NetworkBlockerRule[], enabled: boolean | undefined) => NetworkHold;
26
+ /**
27
+ * Call from the mount effect's cleanup. Ends a hold no blocker took
28
+ * over, unless the effect runs again first (StrictMode, a kernel change).
29
+ * Nothing checked consent for what that hold held, so those requests get
30
+ * the blocker's answer for a blocked request instead of being sent.
31
+ */
32
+ unmount: () => void;
33
+ }
34
+ /**
35
+ * Hold requests matching `rules` from this component's first render in the
36
+ * browser, before any child renders or runs an effect. The network blocker
37
+ * loads after mount and takes the hold over.
38
+ *
39
+ * Rendering is not side-effect free: the first render patches `fetch` and
40
+ * `XMLHttpRequest`. That is safe because the hold only delays matching
41
+ * requests, a render React discards ends its hold after
42
+ * {@link UNCOMMITTED_HOLD_MS} (failing what it held as blocked), and on the
43
+ * server it does nothing.
44
+ *
45
+ * @internal
46
+ */
47
+ export declare const useEarlyNetworkHold: (rules: readonly NetworkBlockerRule[], enabled: boolean | undefined) => EarlyNetworkHold;