@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
@@ -1,6 +1,9 @@
1
1
  ---
2
2
  title: Google Maps
3
- description: Prevent a map iframe from mounting before the required permission.
3
+ description: Gate a Google Maps iframe embed with c15t v3 so the map loads only
4
+ after the visitor allows its consent category, in Next.js, TanStack Start,
5
+ React, Nuxt, Vue, Astro, Svelte, SvelteKit, HTML or JavaScript.
6
+ icon: google-maps
4
7
  group: integrations
5
8
  ---
6
9
 
@@ -11,7 +14,8 @@ application; this example uses functionality permission.
11
14
 
12
15
  ```ts title="src/embed-config.ts"
13
16
  export const embedCategory = 'functionality' as const;
14
- export const embedURL = 'https://www.google.com/maps/embed?pb=YOUR_EMBED_PARAMETERS';
17
+ export const embedURL =
18
+ 'https://www.google.com/maps/embed?pb=YOUR_EMBED_PARAMETERS';
15
19
  export const embedTitle = 'Map showing our office location';
16
20
  export const embedAspectRatio = '4 / 3';
17
21
  ```
@@ -22,7 +26,7 @@ address and a directions link outside the consent-gated embed.
22
26
  ## Add the embed to your framework
23
27
 
24
28
  Create `src/embed-config.ts` using the configuration on this page, then select
25
- your framework. Keep the existing [consent setup](https://c15t.com/docs/frameworks), its policy
29
+ your framework. Keep the existing [consent setup](https://v3.c15t.com/docs/frameworks), its policy
26
30
  and preferences UI. These examples do not create a second consent provider.
27
31
 
28
32
  **Next.js**
@@ -32,12 +36,12 @@ Render this component inside your existing consent boundary or provider.
32
36
  ```tsx title="src/consent-embed.tsx"
33
37
  'use client';
34
38
 
35
- import { Frame } from 'c15t/next';
39
+ import { ConsentGate } from 'c15t/next';
36
40
  import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
37
41
 
38
42
  export function ConsentEmbed() {
39
43
  return (
40
- <Frame category={embedCategory}>
44
+ <ConsentGate category={embedCategory}>
41
45
  <iframe
42
46
  src={embedURL}
43
47
  title={embedTitle}
@@ -45,12 +49,12 @@ export function ConsentEmbed() {
45
49
  allowFullScreen
46
50
  style={{ width: '100%', aspectRatio: embedAspectRatio, minHeight: 200, border: 0 }}
47
51
  />
48
- </Frame>
52
+ </ConsentGate>
49
53
  );
50
54
  }
51
55
  ```
52
56
 
53
- `Frame` keeps the iframe absent while permission is denied and removes it
57
+ `ConsentGate` keeps the iframe absent while permission is denied and removes it
54
58
  on revocation. Keep your existing consent styles and preferences dialog.
55
59
 
56
60
  **TanStack Start**
@@ -58,12 +62,12 @@ on revocation. Keep your existing consent styles and preferences dialog.
58
62
  Render this component inside your existing consent boundary or provider.
59
63
 
60
64
  ```tsx title="src/consent-embed.tsx"
61
- import { Frame } from 'c15t/tanstack-start';
65
+ import { ConsentGate } from 'c15t/tanstack-start';
62
66
  import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
63
67
 
64
68
  export function ConsentEmbed() {
65
69
  return (
66
- <Frame category={embedCategory}>
70
+ <ConsentGate category={embedCategory}>
67
71
  <iframe
68
72
  src={embedURL}
69
73
  title={embedTitle}
@@ -71,12 +75,12 @@ export function ConsentEmbed() {
71
75
  allowFullScreen
72
76
  style={{ width: '100%', aspectRatio: embedAspectRatio, minHeight: 200, border: 0 }}
73
77
  />
74
- </Frame>
78
+ </ConsentGate>
75
79
  );
76
80
  }
77
81
  ```
78
82
 
79
- `Frame` keeps the iframe absent while permission is denied and removes it
83
+ `ConsentGate` keeps the iframe absent while permission is denied and removes it
80
84
  on revocation. Keep your existing consent styles and preferences dialog.
81
85
 
82
86
  **React**
@@ -84,12 +88,12 @@ on revocation. Keep your existing consent styles and preferences dialog.
84
88
  Render this component inside your existing consent boundary or provider.
85
89
 
86
90
  ```tsx title="src/consent-embed.tsx"
87
- import { Frame } from 'c15t/react';
91
+ import { ConsentGate } from 'c15t/react';
88
92
  import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
89
93
 
90
94
  export function ConsentEmbed() {
91
95
  return (
92
- <Frame category={embedCategory}>
96
+ <ConsentGate category={embedCategory}>
93
97
  <iframe
94
98
  src={embedURL}
95
99
  title={embedTitle}
@@ -97,74 +101,75 @@ export function ConsentEmbed() {
97
101
  allowFullScreen
98
102
  style={{ width: '100%', aspectRatio: embedAspectRatio, minHeight: 200, border: 0 }}
99
103
  />
100
- </Frame>
104
+ </ConsentGate>
101
105
  );
102
106
  }
103
107
  ```
104
108
 
105
- `Frame` keeps the iframe absent while permission is denied and removes it
109
+ `ConsentGate` keeps the iframe absent while permission is denied and removes it
106
110
  on revocation. Keep your existing consent styles and preferences dialog.
107
111
 
108
112
  **Nuxt**
109
113
 
110
- Use the reactive snapshot from the existing consent runtime. The Nuxt module auto-imports the consent composables.
114
+ The Nuxt module registers `ConsentGate` and `ConsentDialogLink`, so
115
+ this component imports only the embed configuration.
111
116
 
112
117
  ```vue title="app/components/ConsentEmbed.vue"
113
118
  <script setup lang="ts">
114
119
  import { embedCategory, embedURL, embedTitle, embedAspectRatio } from '../../src/embed-config';
115
-
116
- const snapshot = useConsentSnapshot();
117
- const activeUI = useConsentActiveUI();
118
120
  </script>
119
121
 
120
122
  <template>
121
- <iframe
122
- v-if="snapshot.effectivePermissions[embedCategory]"
123
- :src="embedURL"
124
- :title="embedTitle"
125
- loading="lazy"
126
- allowfullscreen
127
- :style="{ width: '100%', aspectRatio: embedAspectRatio, minHeight: '200px', border: 0 }"
128
- />
129
- <button v-else type="button" @click="activeUI = 'manager'">
130
- Open privacy settings to view this content
131
- </button>
123
+ <ConsentGate :category="embedCategory">
124
+ <iframe
125
+ :src="embedURL"
126
+ :title="embedTitle"
127
+ loading="lazy"
128
+ allowfullscreen
129
+ :style="{ width: '100%', aspectRatio: embedAspectRatio, minHeight: '200px', border: 0 }"
130
+ />
131
+ <template #placeholder>
132
+ <p>Allow {{ embedCategory }} to load this content.</p>
133
+ <ConsentDialogLink>Open privacy settings</ConsentDialogLink>
134
+ </template>
135
+ </ConsentGate>
132
136
  </template>
133
137
  ```
134
138
 
135
- Use `v-if` so a denied iframe is removed from the DOM. Hiding an existing
136
- iframe with `v-show` or CSS does not prevent its requests.
139
+ `ConsentGate` keeps the iframe out of the server HTML and the DOM while
140
+ permission is denied, and removes it on revocation. See
141
+ [Nuxt scripts and embeds](https://v3.c15t.com/docs/frameworks/nuxt/scripts).
137
142
 
138
143
  **Vue**
139
144
 
140
- Use the reactive snapshot from the existing consent runtime. The c15t Vue plugin must already be installed on this app.
145
+ Render this component inside the app that installed the c15t Vue plugin.
141
146
 
142
147
  ```vue title="src/ConsentEmbed.vue"
143
148
  <script setup lang="ts">
144
- import { useConsentSnapshot, useConsentActiveUI } from 'c15t/vue/vue-plugin';
149
+ import { ConsentDialogLink, ConsentGate } from 'c15t/vue/vue-plugin';
145
150
  import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
146
-
147
- const snapshot = useConsentSnapshot();
148
- const activeUI = useConsentActiveUI();
149
151
  </script>
150
152
 
151
153
  <template>
152
- <iframe
153
- v-if="snapshot.effectivePermissions[embedCategory]"
154
- :src="embedURL"
155
- :title="embedTitle"
156
- loading="lazy"
157
- allowfullscreen
158
- :style="{ width: '100%', aspectRatio: embedAspectRatio, minHeight: '200px', border: 0 }"
159
- />
160
- <button v-else type="button" @click="activeUI = 'manager'">
161
- Open privacy settings to view this content
162
- </button>
154
+ <ConsentGate :category="embedCategory">
155
+ <iframe
156
+ :src="embedURL"
157
+ :title="embedTitle"
158
+ loading="lazy"
159
+ allowfullscreen
160
+ :style="{ width: '100%', aspectRatio: embedAspectRatio, minHeight: '200px', border: 0 }"
161
+ />
162
+ <template #placeholder>
163
+ <p>Allow {{ embedCategory }} to load this content.</p>
164
+ <ConsentDialogLink>Open privacy settings</ConsentDialogLink>
165
+ </template>
166
+ </ConsentGate>
163
167
  </template>
164
168
  ```
165
169
 
166
- Use `v-if` so a denied iframe is removed from the DOM. Hiding an existing
167
- iframe with `v-show` or CSS does not prevent its requests.
170
+ `ConsentGate` keeps the iframe out of the DOM while permission is denied,
171
+ and removes it on revocation. See
172
+ [Vue scripts and embeds](https://v3.c15t.com/docs/frameworks/vue/scripts).
168
173
 
169
174
  **Astro**
170
175
 
@@ -175,7 +180,7 @@ Add this component to pages using your consent-enabled base layout:
175
180
  <c15t-consent-embed style="display: block"></c15t-consent-embed>
176
181
 
177
182
  <script>
178
- import { getConsentClient } from '@c15t/astro/client';
183
+ import { getConsentClient } from 'c15t/astro/client';
179
184
  import { mountConsentEmbed } from '../consent-embed';
180
185
 
181
186
  class ConsentEmbed extends HTMLElement {
@@ -217,16 +222,16 @@ runtime for this embed.
217
222
 
218
223
  **Svelte**
219
224
 
220
- Render this component inside the existing `ConsentManagerProvider`.
225
+ Render this component inside the existing `ConsentProvider`.
221
226
  The provider from your quickstart supplies its consent state.
222
227
 
223
228
  ```svelte title="src/ConsentEmbed.svelte"
224
229
  <script lang="ts">
225
- import { Frame } from '@c15t/svelte';
230
+ import { ConsentGate } from '@c15t/svelte';
226
231
  import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
227
232
  </script>
228
233
 
229
- <Frame category={embedCategory}>
234
+ <ConsentGate category={embedCategory}>
230
235
  <iframe
231
236
  src={embedURL}
232
237
  title={embedTitle}
@@ -237,25 +242,25 @@ The provider from your quickstart supplies its consent state.
237
242
  style:min-height="200px"
238
243
  style:border="0"
239
244
  ></iframe>
240
- </Frame>
245
+ </ConsentGate>
241
246
  ```
242
247
 
243
- The Svelte `Frame` waits until the browser is mounted and the category is
248
+ The Svelte `ConsentGate` waits until the browser is mounted and the category is
244
249
  allowed. Its default placeholder opens preferences. Revocation removes the
245
250
  iframe.
246
251
 
247
252
  **SvelteKit**
248
253
 
249
- Render this component inside the existing `ConsentManagerProvider`.
250
- Keep the SvelteKit root provider and its server prefetch unchanged.
254
+ Render this component inside the existing `ConsentRoot`.
255
+ Keep the SvelteKit root and its server-resolved state unchanged.
251
256
 
252
257
  ```svelte title="src/lib/ConsentEmbed.svelte"
253
258
  <script lang="ts">
254
- import { Frame } from '@c15t/svelte';
259
+ import { ConsentGate } from '@c15t/svelte';
255
260
  import { embedCategory, embedURL, embedTitle, embedAspectRatio } from '../embed-config';
256
261
  </script>
257
262
 
258
- <Frame category={embedCategory}>
263
+ <ConsentGate category={embedCategory}>
259
264
  <iframe
260
265
  src={embedURL}
261
266
  title={embedTitle}
@@ -266,23 +271,44 @@ Keep the SvelteKit root provider and its server prefetch unchanged.
266
271
  style:min-height="200px"
267
272
  style:border="0"
268
273
  ></iframe>
269
- </Frame>
274
+ </ConsentGate>
270
275
  ```
271
276
 
272
- The Svelte `Frame` waits until the browser is mounted and the category is
277
+ The Svelte `ConsentGate` waits until the browser is mounted and the category is
273
278
  allowed. Its default placeholder opens preferences. Revocation removes the
274
279
  iframe.
275
280
 
281
+ **HTML**
282
+
283
+ The c15t script tag gates iframes that name a category. Put the embed's URL
284
+ in `data-src` instead of `src`, using the values from the configuration on
285
+ this page:
286
+
287
+ ```html
288
+ <iframe
289
+ data-src="https://www.youtube-nocookie.com/embed/VIDEO_ID?playsinline=1"
290
+ data-category="measurement"
291
+ title="Product video"
292
+ loading="lazy"
293
+ allowfullscreen
294
+ ></iframe>
295
+ ```
296
+
297
+ c15t sets `src` once the category is allowed and removes it on revocation.
298
+ Without `src` the iframe loads nothing, so hide it with CSS and show a link
299
+ to `#c15t-preferences` in its place. See
300
+ [HTML embeds](https://v3.c15t.com/docs/frameworks/html/embeds).
301
+
276
302
  **JavaScript**
277
303
 
278
- Use the shared browser helper below with your existing kernel. Put an
304
+ Use the shared browser helper below with your existing client. Put an
279
305
  empty container where the embed should appear:
280
306
 
281
307
  ```html
282
308
  <div id="consent-embed"></div>
283
309
  ```
284
310
 
285
- In your browser entry point, after creating the kernel:
311
+ In your browser entry point, after `init()`:
286
312
 
287
313
  ```ts
288
314
  import { mountConsentEmbed } from './consent-embed';
@@ -290,13 +316,16 @@ import { mountConsentEmbed } from './consent-embed';
290
316
  const container = document.querySelector<HTMLElement>('#consent-embed');
291
317
  if (!container) throw new Error('Missing consent embed container');
292
318
 
293
- const disposeEmbed = mountConsentEmbed(container, kernel, openPreferences);
319
+ const disposeEmbed = mountConsentEmbed(container, consent.kernel, () =>
320
+ consent.openDialog(),
321
+ );
294
322
  ```
295
323
 
296
- `kernel` is the instance from your quickstart. `openPreferences` is your
297
- application's function for showing its consent preferences UI. Call
298
- `disposeEmbed()` when the page or component is destroyed. The helper observes
299
- both the current snapshot and later changes.
324
+ `consent` is the client from `init()` in your quickstart. With
325
+ `createConsentRuntime`, pass `runtime.kernel` and your own function that
326
+ opens preferences. Call `disposeEmbed()` when the page or component is
327
+ destroyed. Iframe markup with `data-src` and `data-category` also works
328
+ without the helper, because both setups gate iframes by default.
300
329
 
301
330
  ## Browser helper for Astro and JavaScript
302
331
 
@@ -305,51 +334,56 @@ when permission allows it, keeps an existing player mounted across unrelated
305
334
  snapshot updates, and removes it on revocation.
306
335
 
307
336
  ```ts title="src/consent-embed.ts"
308
- import { embedCategory, embedURL, embedTitle, embedAspectRatio } from './embed-config';
337
+ import {
338
+ embedCategory,
339
+ embedURL,
340
+ embedTitle,
341
+ embedAspectRatio,
342
+ } from './embed-config';
309
343
 
310
344
  type EmbedKernel = {
311
- getSnapshot: () => {
312
- effectivePermissions: Record<typeof embedCategory, boolean>;
313
- };
314
- subscribe: (listener: () => void) => () => void;
345
+ getSnapshot: () => {
346
+ effectivePermissions: Record<typeof embedCategory, boolean>;
347
+ };
348
+ subscribe: (listener: () => void) => () => void;
315
349
  };
316
350
 
317
351
  export function mountConsentEmbed(
318
- container: HTMLElement,
319
- kernel: EmbedKernel,
320
- openPreferences: () => void,
352
+ container: HTMLElement,
353
+ kernel: EmbedKernel,
354
+ openPreferences: () => void
321
355
  ) {
322
- const render = () => {
323
- if (kernel.getSnapshot().effectivePermissions[embedCategory]) {
324
- if (container.querySelector('iframe')) return;
325
- const frame = document.createElement('iframe');
326
- frame.src = embedURL;
327
- frame.title = embedTitle;
328
- frame.loading = 'lazy';
329
- frame.allowFullscreen = true;
330
- Object.assign(frame.style, {
331
- width: '100%',
332
- aspectRatio: embedAspectRatio,
333
- minHeight: '200px',
334
- border: '0',
335
- });
336
- container.replaceChildren(frame);
337
- } else {
338
- if (container.querySelector('button')) return;
339
- const button = document.createElement('button');
340
- button.type = 'button';
341
- button.textContent = 'Open privacy settings to view this content';
342
- button.onclick = openPreferences;
343
- container.replaceChildren(button);
344
- }
345
- };
346
-
347
- render();
348
- const unsubscribe = kernel.subscribe(render);
349
- return () => {
350
- unsubscribe();
351
- container.replaceChildren();
352
- };
356
+ const render = () => {
357
+ if (kernel.getSnapshot().effectivePermissions[embedCategory]) {
358
+ if (container.querySelector('iframe')) return;
359
+ const frame = document.createElement('iframe');
360
+ frame.src = embedURL;
361
+ frame.title = embedTitle;
362
+ frame.loading = 'lazy';
363
+ frame.allowFullscreen = true;
364
+ Object.assign(frame.style, {
365
+ width: '100%',
366
+ aspectRatio: embedAspectRatio,
367
+ minHeight: '200px',
368
+ border: '0',
369
+ });
370
+ container.replaceChildren(frame);
371
+ } else {
372
+ if (container.querySelector('button')) return;
373
+ const button = document.createElement('button');
374
+ button.type = 'button';
375
+ button.textContent = 'Open privacy settings to view this content';
376
+ button.onclick = openPreferences;
377
+ container.replaceChildren(button);
378
+ }
379
+ };
380
+
381
+ render();
382
+ const unsubscribe = kernel.subscribe(render);
383
+ return () => {
384
+ unsubscribe();
385
+ container.replaceChildren();
386
+ };
353
387
  }
354
388
  ```
355
389