@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
package/dist/provider.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{Fragment as e,jsx as r,jsxs as n}from"react/jsx-runtime";import{createConsentKernel as t,kernelConfigToInitResponse as i}from"@c15t/core";import{createWindowDebug as o,resolveWindowDebugMode as l}from"@c15t/core/modules/window-debug";import{resolvePolicyRules as s}from"@c15t/schema/types";import{deepMergeTranslations as c}from"@c15t/translations";import{Suspense as u,lazy as a,useContext as d,useEffect as p,useMemo as m,useRef as f,useState as g}from"react";import{KernelContext as v,ProviderServicesContext as h}from"./context.js";import{useColorScheme as y}from"./hooks/use-color-scheme.js";import{usePersistence as k}from"./module-hooks/persistence.js";import{V3ThemeProvider as b}from"./theme-provider.js";import{defaultTranslationConfig as R}from"./utils/default-translation-config.js";let P=a(async()=>({default:(await import("./external-iab-context.js")).ExternalIABProvider})),S=s({countryCode:null,regionCode:null,rules:[{id:"disabled",match:{fallback:!0},model:"opt-out",prompt:"none"}]}),w={language:"en",translations:R.translations.en},C=function(e){if(e)return"externalId"in e?e:{externalId:e.id,identityProvider:e.identityProvider}},O=function(e){if(!e?.messages)return;let r=e.locale??R.defaultLanguage??"en",n=R.translations.en,t=e.messages[r]??e.messages.en??n,i=R.translations[r]??n;return{language:r,translations:c(i,t)}},x=function(e){return e.enabled??!0},j=function(e,r){let n=!1;return{...e,async init(t){if(n)return e.init?.(t)??{};n=!0;let i=await r(t);return i.response?i.response:e.init?.(i.context??t)??{}}}},E=function(e){return"function"==typeof e?.then},L=function(e){let{prefetch:r}=e;return!r||E(r)?{}:r},K=function(e){return void 0!==e&&Object.keys(e).length>0},N=function(e){"production"!==globalThis.process?.env?.NODE_ENV&&console.warn("c15t ConsentProvider: the `prefetch` promise rejected; falling back to the transport init.",e)},D=function(e,r,n,t){let i={...r.initialOverrides??{},...n??{}};K(i)&&e.set.overrides(i),r.initialRecords&&e.getRecordsGeneration()===t&&e.hydrate(r.initialRecords)},q=function(e,r,n){var t,o;let{prefetch:l}=r;return E(l)?j(e,(t=Promise.resolve(l),o=r.overrides,async e=>{let r,l=n()?.getRecordsGeneration();try{r=await t??{}}catch(e){return N(e),{}}let s=i(r);if(s){let e={...s.resolvedOverrides??{},...o??{}};return K(e)&&(s.resolvedOverrides=e),{response:s}}let c=n();return c&&D(c,r,o,l),{context:{overrides:{...e.overrides,...r.initialOverrides??{},...o??{}},user:e.user}}})):e},_=function(e){if("function"!=typeof e.mode)throw Error("c15t ConsentProvider: `mode` is required. Use hosted(), offline(), or custom().");return e.mode},A=function(e){let r=x(e),n=L(e),i=O(e.i18n)??w,o={consentCategories:e.consentCategories,prefetch:n,translations:i},l=_(e)(o),s={current:null},c=q(l,e,()=>s.current),u=t({...n,initialRecords:r?n.initialRecords:void 0,initialPrivacySignals:r?n.initialPrivacySignals:void 0,now:n.now??n.initialRecords?.now??(n.initialRecords?void 0:0),transport:c,initialPolicyResolution:r?n.initialPolicyResolution:S,initialOverrides:{...n.initialOverrides??{},...e.overrides??{}},initialUser:C(e.user)??n.initialUser,initialTranslations:n.initialTranslations??i,initialPolicyPending:n.initialPolicyPending??(r&&!n.initialPolicyResolution)});return s.current=u,u},B=function(e){if(e instanceof Error)return e.message;if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}},I=function(e,r){let n=f(r);p(()=>{n.current=r},[r]),p(()=>{let r=[e.events.on("choice:recorded",({snapshot:e,confirmed:r,actionAt:t})=>{n.current?.onChoiceRecorded?.({actionAt:t,confirmed:r,snapshot:e})}),e.events.on("permissions:changed",({snapshot:e,previous:r})=>{n.current?.onPermissionsChanged?.({previous:r,snapshot:e})}),e.events.on("command:error",e=>{n.current?.onError?.({error:B(e.error)})})];return()=>{for(let e of r)e()}},[e])},T=function(e,r,n,t){let i=f(n),o=f(null),l=f(null),s=f(null);p(()=>{if(!t)return;let n=C(r.user),i=JSON.stringify(n??null);if(null===o.current){o.current=i;return}o.current!==i&&(o.current=i,n&&(async()=>{try{await e.commands.identify(n)}catch{}})())},[e,r.user,t]),p(()=>{if(!t)return;let i=JSON.stringify(r.overrides??{});if(null===l.current){l.current=i;return}l.current!==i&&(l.current=i,e.set.overrides(r.overrides??{}),n&&e.commands.init())},[n,e,r.overrides,t]),p(()=>{!t||i.current===n||(i.current=n,n||e.set.activeUI("none"))},[n,e,t]),p(()=>{if("production"===globalThis.process?.env?.NODE_ENV)return;let e=JSON.stringify({i18n:r.i18n,mode:r.mode?.kind});if(null===s.current){s.current=e;return}s.current!==e&&(s.current=e,console.warn("c15t ConsentProvider: mode and i18n are initial-only options. Remount the provider to apply changes."))},[r])},H=({kernel:e,callbacks:r})=>(I(e,r),null),J=({enabled:e,kernel:r,prepared:n})=>{let t=f(!1),i=f(!1);return p(()=>{if(!e){t.current=!1;return}if(!t.current)if(t.current=!0,n){r.hydrate({now:i.current?Date.now():r.getServerSnapshot().evaluatedAt}),i.current=!0;let{gpc:e}=r.getSnapshot().privacySignals;e.detected&&e.active&&r.set.privacySignals({gpc:!0})}else r.commands.init()},[e,r,n]),null},U=({nonce:e,options:r,scripts:n})=>{let t=d(v),i=f(null),o=f(n),l=f(r),s=f(e);return p(()=>{o.current=n,l.current=r,s.current=e},[e,r,n]),p(()=>{if(!t)return;let e=!1;return(async()=>{let{createScriptLoader:r}=await import("@c15t/core/modules/script-loader");e||(i.current=r({kernel:t,nonce:s.current,onDebug:l.current?.onDebug,scripts:o.current}))})(),()=>{e=!0,i.current?.dispose(),i.current=null}},[t]),p(()=>{i.current?.updateScripts(n)},[n]),null},F=({options:e})=>{let r=d(v),n=f(null),t=f(e);return p(()=>{t.current=e},[e]),p(()=>{if(!r)return;let e=!1;return(async()=>{let{createNetworkBlocker:i}=await import("@c15t/core/modules/network-blocker");if(e)return;let o=t.current;n.current=i({enabled:o.enabled,kernel:r,logBlockedRequests:o.logBlockedRequests,onRequestBlocked:o.onRequestBlocked,rules:o.rules})})(),()=>{e=!0,n.current?.dispose(),n.current=null}},[r]),p(()=>{n.current?.updateRules(e.rules)},[e.rules]),p(()=>{void 0!==e.enabled&&n.current?.setEnabled(e.enabled)},[e.enabled]),null},G=({options:e,clearRef:r})=>{let n=k(e);return p(()=>(r.current=n.clear,()=>{r.current=null}),[n,r]),null},M=({pkg:e,mode:r})=>(p(()=>{let n=o({mode:r,pkg:e});return()=>n.dispose()},[r,e]),null),V=({kernel:e})=>(p(()=>{let r=window,n=r.c15tKernel;return r.c15tKernel=e,()=>{if(r.c15tKernel===e){if(n){r.c15tKernel=n;return}delete r.c15tKernel}}},[e]),null),z=({nonce:e,theme:n})=>{let[t,i]=g("");return(p(()=>{let e=!1;return(async()=>{let{defaultTheme:r,generateThemeCSS:t}=await import("@c15t/ui/theme");e||i(t(n??r))})(),()=>{e=!0}},[n]),t)?r("style",{id:"c15t-theme",nonce:e,dangerouslySetInnerHTML:{__html:t}}):null},Q=function(e){if(!1===e.persistence)return!1;let{storageConfig:r}=e,n=!!L(e).initialRecords;return!0===e.persistence||void 0===e.persistence?{skipHydration:n,storageConfig:r}:{...e.persistence,skipHydration:e.persistence.skipHydration??n,storageConfig:e.persistence.storageConfig??r}},W=t=>{let{children:i}=t,o=t.options??{},s=x(o),[c,a]=g(()=>({disabledKernel:t.runtime?void 0:A({...o,enabled:!1}),external:t.runtime,kernel:t.runtime?.kernel??A({...o,enabled:!0})})),{external:d}=c,k=s?c.kernel:c.disabledKernel??c.kernel,R=void 0===d,S=f(null),w=m(()=>({clearRecords:()=>{d?d.clearRecords():S.current?S.current():(k.hydrate({choice:null,noticeDismissal:null,optOutDirectives:[],subject:null}),k.events.emit({type:"records:cleared"}))},getConsentCategories:()=>{let{scope:e}=k.getSnapshot().policyRule,r=o.consentCategories;return["necessary",...e.filter(e=>!r?.length||r.includes(e))]},getPresentation:()=>o.presentation}),[k,o.consentCategories,o.presentation,d]),C=Q(o),{scripts:O,networkBlocker:j}=o,E=o.__debugPkg??"@c15t/react",K=R?l(o.mode):"hosted";T(c.kernel,o,s,R);let N=f(0);p(()=>{if(!R)return;N.current+=1;let e=N.current;return()=>{queueMicrotask(()=>{N.current===e&&(c.kernel.dispose(),c.disabledKernel?.dispose())})}},[c,R]);let D=o.theme,q=m(()=>({colorScheme:o.colorScheme,disableAnimation:o.disableAnimation,noStyle:o.noStyle,scrollLock:o.scrollLock,theme:D,trapFocus:o.trapFocus}),[D,o.noStyle,o.disableAnimation,o.scrollLock,o.trapFocus,o.colorScheme]),_=m(()=>({components:o.components,legalLinks:o.legalLinks,presentation:o.presentation}),[o.components,o.legalLinks,o.presentation]);y(o.colorScheme);let B=n(e,{children:[R?n(e,{children:[r(H,{kernel:k,callbacks:o.callbacks}),r(M,{pkg:E,mode:K}),r(V,{kernel:k}),s&&C?r(G,{options:C,clearRef:S}):null,r(J,{enabled:s,prepared:!!L(o).initialPolicyResolution,kernel:k}),O&&O.length>0?r(U,{nonce:o.nonce,options:o.scriptLoader,scripts:O}):null,s&&j?r(F,{options:j}):null]}):null,d?r(u,{fallback:i,children:r(P,{runtime:d,children:i})}):i]});return r(v.Provider,{value:k,children:r(h.Provider,{value:w,children:n(b,{themeConfig:q,uiConfig:_,children:[r(z,{nonce:o.nonce,theme:D}),B]})})})};export{W as ConsentProvider};
2
+ let e,t;import{jsx as o,jsxs as r}from"react/jsx-runtime";import{applyExperimentAssignment as n,applyExperimentTheme as i,hostExperiment as s,watchRevocationReload as c}from"@c15t/core";import{createPersistence as l,readStoredRecords as a}from"@c15t/core/modules/persistence";import{createWindowDebug as d}from"@c15t/core/modules/window-debug";import{claimEarlyJourney as u,createConsentProviderRuntime as m,earlyInitModes as p,lazyRuntimeModule as h,lazyStreamPrefetch as f,readHostedMode as g,streamPrefetchWith as v}from"@c15t/core/runtime/provider";import{applyThemeSlots as y}from"@c15t/ui/utils";import{useCallback as k,useEffect as S,useLayoutEffect as b,useMemo as w,useReducer as C,useState as x,useSyncExternalStore as j}from"react";import{KernelContext as L,ProviderServicesContext as N,StreamedPrefetchContext as O}from"./context.js";import{ExternalIABProvider as P}from"./external-iab-context.js";import{useColorScheme as D}from"./hooks/use-color-scheme.js";import{useIsHydrated as R}from"./hooks/use-is-hydrated.js";import{createIframeBlockerOnDemand as _}from"./module-hooks/iframe-blocker.js";import{UNCOMMITTED_HOLD_MS as T}from"./module-hooks/network-hold.js";import{V3ThemeProvider as E}from"./theme-provider.js";let q=(e,t)=>{let o,r=!1;return(async()=>{try{let{connectConsentSource:n}=await import("@c15t/core/runtime/controls");r||(o=n(e,t))}catch{}})(),()=>{r=!0,o?.()}},B=async()=>(await import("@c15t/core/modules/script-loader")).createScriptLoader,A=function(e){let t=e.__resolveStreamedInit;return{connectConsentSource:q,createClearOnRevocation:h(async()=>(await import("@c15t/core/modules/clear-on-revocation")).createClearOnRevocation),createIframeBlocker:_,createNetworkBlocker:h(async()=>(await import("@c15t/core/modules/network-blocker")).createNetworkBlocker),createPersistence:l,createScriptLoader:h(B),createWindowDebug:d,preloadScriptLoader:e.__preloadScriptLoader?.(B),streamPrefetch:t?v(t):f,watchRevocationReload:c}},I=new WeakMap,J=new Set,K=(e,t)=>{if("hosted"in e){let o,r;return"hosted"in t&&(o=e.hosted,r=t.hosted,o.fetch===r.fetch&&o.initialData===r.initialData&&JSON.stringify(o)===JSON.stringify(r))}return"mode"in t&&e.fetch===t.fetch&&(e.mode===t.mode||e.mode.sameAs(t.mode))},F=function(o){if("function"!=typeof o)return o;let r=I.get(o);return r||(r=Object.assign(r=>e=(t=()=>o(Object.create(r,{iabEnabled:{value:void 0}})))(),{kind:o.kind}),I.set(o,r)),r},M=function(e){return{...e,mode:F(e.mode),pkg:e.__debugPkg??"@c15t/react"}},V=function(e){let{persistence:t}=e;if(!1===t||e.consentSource)return!1;let o="object"==typeof t?t:{};if(o.skipHydration)return!1;let r=o.now?o.now():Date.now(),{records:n}=a(o.storageConfig??e.storageConfig,r);return!!(n.choice||n.noticeDismissal)},W=function(e){let{journey:t}=e;return JSON.stringify({journey:t?[t.id,t.scope,t.storedChoice]:null,overrides:e.overrides,user:e.user})},z=function(e,t,o){if(!(o&&t.policyPending)||e.prefetch||e.experiment)return;let r=g(e.mode);if(r)return{source:{hosted:{...r,fetch:r.fetch??globalThis.fetch}},storedChoice:V(e)};let n=p.get(e.mode);if(!(!n||V(e))&&n.requestsInit(t.overrides))return{source:{fetch:globalThis.fetch,mode:n},storedChoice:!1}},H=new Set,G=0,Q=function(o,r){let n,i,s,{networkBlocker:c}=o,l=m(M(o),A(o)),a=o,d=!1,p=!1,h=0,f=e;G+=1;let g={expire(){J.delete(s),H.delete(g),clearTimeout(n),d=!0,l.dispose()},holdKey:!1!==o.enabled&&c&&!1!==c.enabled?JSON.stringify(c.rules):null,sequence:G};if("u"<typeof window)p=!0;else{H.add(g),n=setTimeout(g.expire,T);let e=l.kernel.getSnapshot(),c=z(o,e,r);if(c){let{source:r,storedChoice:n}=c,l=u({option:o.journey,storedChoice:n}),a=l?{journey:l,overrides:e.overrides,user:e.user}:{overrides:e.overrides,user:e.user},d=W(a);for(let e of J)e.key===d&&K(e.source,r)&&(i=e);if(!i){let e=t(),o=e.init,n=o(a);n.catch(()=>void 0);let c=!1;e.init=e=>{let t=!c&&W(e)===d;return c=!0,t?n:o(e)},i=s={key:d,source:r,transport:e},J.add(s)}}}let v=function(){if(d)return!1;if(p)return!0;if(p=!0,J.delete(i)&&Object.assign(f,i?.transport),H.delete(g),clearTimeout(n),null!==g.holdKey)for(let e of H)e.sequence<g.sequence&&e.holdKey===g.holdKey&&e.expire();return!0};return{apply(e){e!==a&&(a=e,l.update(M(e)).catch(()=>void 0))},mount(){if(!v())return null;let e=h+=1;return l.start(),()=>{queueMicrotask(()=>{h===e&&l.dispose()})}},runtime:l}},U=function(){let e=null;return{get:(t,o)=>e??=Q(t,o),reset(){e=null}}},X=e=>e+1,Y=()=>()=>void 0,Z=function(e){let[t]=x(U),[,o]=C(X,0),r=R(),n=k(()=>{t.reset(),o()},[t]);return e?{entry:t.get(e,r),rebuild:n}:void 0},$="u"<typeof document?S:b,ee=({entry:e,options:t,rebuild:o})=>($(()=>e.apply(t),[e,t]),S(()=>{let t=e.mount();return t||void o()},[e,o]),null),et=e=>{let{children:t}=e,c=e.options??{},[l]=x(()=>e.runtime),a=Z(l?void 0:c),d=a?.entry.runtime,u=l?e.runtime??l:void 0,m=d??u,p=j(d?d.subscribe:Y,()=>m.kernel,()=>m.kernel),[h]=x(()=>{var e;return l?l.experiment??s(c.experiment,(e=c.prefetch,"function"==typeof e?.then)?void 0:c.prefetch):void 0}),f=d?d.experiment:h,g=u?c.consentCategories:void 0;S(()=>{u&&void 0!==g&&u.setConsentCategories(g)},[u,g]);let{presentation:v}=c,k=w(()=>({clearRecords:()=>m.clearRecords(),getConsentCategories:()=>m.consentCategories,getPresentation:()=>n(v,f,p.getSnapshot().experiment),isStarted:()=>m.started,setLanguage:e=>m.setLanguage(e)}),[f,p,v,m]),b=!!u&&void 0!==c.callbacks;S(()=>{"production"!==process.env.NODE_ENV&&b&&console.warn("c15t ConsentProvider: `options.callbacks` is ignored when you pass `runtime`. Pass them to createConsentRuntime({ callbacks }) instead.")},[b]);let C=j(e=>p.subscribe(e),()=>p.getSnapshot().experiment,()=>p.getServerSnapshot().experiment),R=w(()=>i(c.theme,f,C),[c.theme,f,C]);S(()=>{"production"===process.env.NODE_ENV||!R||!["colors","dark","motion","radius","shadows","spacing","typography"].some(e=>e in R)||document.getElementById("c15t-theme")||console.warn("c15t: `theme` tokens are no longer turned into CSS in the browser. Render <ConsentTheme theme={theme} /> on the server, or put the CSS from generateThemeCSS() in your stylesheet. See https://c15t.com/docs/frameworks/react/customize")},[R]);let _=w(()=>({colorScheme:c.colorScheme,disableAnimation:c.disableAnimation,noStyle:c.noStyle,scrollLock:c.scrollLock,theme:R,trapFocus:c.trapFocus}),[R,c.noStyle,c.disableAnimation,c.scrollLock,c.trapFocus,c.colorScheme]),T=w(()=>({components:y(R?.slots,c.components,"className"),experiment:f,legalLinks:c.legalLinks,nonce:c.nonce,preloadDialog:c.preloadDialog,presentation:c.presentation,styles:c.styles,theme:c.theme}),[R?.slots,c.components,f,c.legalLinks,c.nonce,c.preloadDialog,c.presentation,c.styles,c.theme]);return D(c.colorScheme),o(L.Provider,{value:p,children:o(N.Provider,{value:k,children:r(E,{themeConfig:_,uiConfig:T,children:[a?o(ee,{entry:a.entry,options:c,rebuild:a.rebuild}):null,u?o(P,{runtime:u,children:t}):o(O.Provider,{value:!1===c.streamBanner?void 0:d?.streamed,children:t})]})})})};export{et as ConsentProvider};
@@ -1 +1 @@
1
- import{C15T_VERSION_HEADER as e}from"@c15t/core";import{version as t}from"../version.js";import{extractRelevantHeaders as r}from"./headers.js";import{normalizeBackendURL as o}from"./normalize-url.js";let c=function(){return"u">typeof performance&&"function"==typeof performance.now?performance.now():Date.now()},n=function(e){let t=null,r=!1;for(let o of["x-vercel-cache","cf-cache-status","x-cache","cache-status"]){let c=e.get(o);if(c){t=`${o}=${c}`,r=/\b(?:hit|stale|revalidated|updating)\b/iu.test(c);break}}let o=e.get("age"),c=o?Number.parseInt(o,10):NaN,n=Number.isFinite(c)&&c>0,a=n?`age=${c}`:null;return{detail:t&&a?`${t}, ${a}`:t??a,isHit:r||n}},a=function(e,t){if(!t)return;let r=Object.keys(e);console.log(`[c15t/server] Detected headers: [${r.join(", ")}]`);let o=e["cf-ipcountry"],c=e["x-vercel-ip-country"];o?console.log(`[c15t/server] Country from cf-ipcountry: ${o}`):c&&console.log(`[c15t/server] Country from x-vercel-ip-country: ${c}`)},s=async function(e,t,r,o){let a=c();try{let s=await fetch(`${e}/init`,{cache:"no-store",headers:t,method:"GET"}),l=Math.max(0,Math.round(c()-a)),i=n(s.headers),u={cache:i,requestContext:r,requestDurationMs:l};if(s.ok){let e={init:await s.json(),metadata:u};return o&&(console.log(`[c15t/server] SSR fetch succeeded in ${e.metadata?.requestDurationMs??0}ms`),e.metadata?.cache?.detail&&console.log(`[c15t/server] SSR cache status: ${e.metadata.cache.detail}`)),e}return o&&(console.log(`[c15t/server] SSR fetch failed with status: ${s.status}`),i.detail&&console.log(`[c15t/server] SSR cache status: ${i.detail}`)),{metadata:u}}catch(e){if(o){let t=e instanceof Error?e.message:"Unknown error";console.log(`[c15t/server] SSR fetch error: ${t}`)}return{}}},l=async function(c){var n;let{backendURL:l,headers:i,overrides:u,debug:g}=c;g&&console.log("[c15t/server] SSR fetch starting...");let f=r(i);if(a(f,g),0===Object.keys(f).length){g&&console.log("[c15t/server] No relevant headers found, skipping SSR fetch");return}let d=o(l,i);if(!d){g&&console.log("[c15t/server] Failed to normalize URL, skipping SSR fetch");return}g&&console.log(`[c15t/server] Fetching from: ${d}/init`);let h={[e]:t,...f};u?.country&&(h["x-c15t-country"]=u.country,g&&console.log(`[c15t/server] Country override: ${u.country}`)),u?.region&&(h["x-c15t-region"]=u.region,g&&console.log(`[c15t/server] Region override: ${u.region}`)),u?.language&&(h["accept-language"]=u.language,g&&console.log(`[c15t/server] Language override: ${u.language}`));let v=await s(d,h,{backendURL:(n={backendURL:d,headers:h,overrides:u}).backendURL,country:n.overrides?.country??n.headers["x-c15t-country"]??null,gpc:"1"===n.headers["sec-gpc"],language:n.overrides?.language??n.headers["accept-language"]??null,region:n.overrides?.region??n.headers["x-c15t-region"]??null},g),{init:m}=v;if(!m){g&&console.log("[c15t/server] SSR fetch returned no data");return}return{gvl:m.gvl,init:m,metadata:v.metadata}};export{l as fetchSSRData};
1
+ import{C15T_VERSION_HEADER as e}from"@c15t/core";import{version as r}from"../version.js";import{CLIENT_FORWARDING_HEADERS as t,extractRelevantHeaders as o}from"./headers.js";import{normalizeBackendURL as a}from"./normalize-url.js";let c=function(){return"u">typeof performance&&"function"==typeof performance.now?performance.now():Date.now()},n=function(e){let r=null,t=!1;for(let o of["x-vercel-cache","cf-cache-status","x-cache","cache-status"]){let a=e.get(o);if(a){r=`${o}=${a}`,t=/\b(?:hit|stale|revalidated|updating)\b/iu.test(a);break}}let o=e.get("age"),a=o?Number.parseInt(o,10):NaN,c=Number.isFinite(a)&&a>0,n=c?`age=${a}`:null;return{detail:r&&n?`${r}, ${n}`:r??n,isHit:t||c}},s=function(e,r){if(!r)return;let t=Object.keys(e);console.log(`[c15t/server] Detected headers: [${t.join(", ")}]`);let o=e["cf-ipcountry"],a=e["x-vercel-ip-country"];o?console.log(`[c15t/server] Country from cf-ipcountry: ${o}`):a&&console.log(`[c15t/server] Country from x-vercel-ip-country: ${a}`)},l=async function(e,r,t,o){let a=c();try{let s=await fetch(`${e}/init`,{cache:"no-store",headers:r,method:"GET"}),l=Math.max(0,Math.round(c()-a)),i=n(s.headers),u={cache:i,requestContext:t,requestDurationMs:l};if(s.ok){let e={init:await s.json(),metadata:u};return o&&(console.log(`[c15t/server] SSR fetch succeeded in ${e.metadata?.requestDurationMs??0}ms`),e.metadata?.cache?.detail&&console.log(`[c15t/server] SSR cache status: ${e.metadata.cache.detail}`)),e}return o&&(console.log(`[c15t/server] SSR fetch failed with status: ${s.status}`),i.detail&&console.log(`[c15t/server] SSR cache status: ${i.detail}`)),{metadata:u}}catch(e){if(o){let r=e instanceof Error?e.message:"Unknown error";console.log(`[c15t/server] SSR fetch error: ${r}`)}return{}}},i=async function(c){var n;let{backendURL:i,headers:u,overrides:d,debug:g}=c;g&&console.log("[c15t/server] SSR fetch starting...");let f=o(u,{trustForwardedHeaders:c.trustForwardedHeaders});if(s(f,g),!(Object.keys(f).length>0||t.some(e=>u.has(e)))){g&&console.log("[c15t/server] No relevant headers found, skipping SSR fetch");return}let h=a(i,u,{trustForwardedHeaders:c.trustForwardedHeaders});if(!h){g&&console.log("[c15t/server] Failed to normalize URL, skipping SSR fetch");return}g&&console.log(`[c15t/server] Fetching from: ${h}/init`);let v={[e]:r,...f};d?.country&&(v["x-c15t-country"]=d.country,g&&console.log(`[c15t/server] Country override: ${d.country}`)),d?.region&&(v["x-c15t-region"]=d.region,g&&console.log(`[c15t/server] Region override: ${d.region}`)),d?.language&&(v["accept-language"]=d.language,g&&console.log(`[c15t/server] Language override: ${d.language}`));let m=await l(h,v,{backendURL:(n={backendURL:h,headers:v,overrides:d}).backendURL,country:n.overrides?.country??n.headers["x-c15t-country"]??null,gpc:"1"===n.headers["sec-gpc"],language:n.overrides?.language??n.headers["accept-language"]??null,region:n.overrides?.region??n.headers["x-c15t-region"]??null},g),{init:p}=m;if(!p){g&&console.log("[c15t/server] SSR fetch returned no data");return}return{gvl:p.gvl,init:p,metadata:m.metadata}};export{i as fetchSSRData};
@@ -1 +1 @@
1
- import{CONSENT_REQUEST_HEADER_NAMES as e,extractConsentRequestInputs as r}from"@c15t/schema/types";let t=[...e,"x-c15t-version","user-agent","x-forwarded-host","x-forwarded-for","purpose","sec-purpose","next-router-prefetch","x-middleware-prefetch"],o=function(e){let o={};for(let r of t){let t=e.get(r);t&&(o[r]=t)}let c=r(e);return c.country&&(o["x-c15t-country"]=c.country),c.region&&(o["x-c15t-region"]=c.region),o};export{o as extractRelevantHeaders};
1
+ import{CONSENT_REQUEST_HEADER_NAMES as e,extractConsentRequestInputs as r}from"@c15t/schema/types";let t=[...e,"x-c15t-version","user-agent","x-forwarded-for","purpose","sec-purpose","next-router-prefetch","x-middleware-prefetch"],o=["forwarded","x-forwarded-host","x-forwarded-proto"],a=function(e,a={}){let d={};for(let r of a.trustForwardedHeaders?[...t,...o]:t){let t=e.get(r);t&&(d[r]=t)}let c=r(e);return c.country&&(d["x-c15t-country"]=c.country),c.region&&(d["x-c15t-region"]=c.region),d};export{o as CLIENT_FORWARDING_HEADERS,a as extractRelevantHeaders};
@@ -1 +1 @@
1
- import{resolveBackendURL as t}from"@c15t/schema/types";let e=/^https?:\/\//u,r=function(t){return"/"===t?t:t.endsWith("/")?t.slice(0,-1):t},n=function(t){if(e.test(t))return String(new URL(t)),{isAbsolute:!0,normalizedURL:r(t)};if(t.startsWith("/"))return{isAbsolute:!1,normalizedURL:r(t)};throw Error(`Invalid URL format: ${t}. URL must be absolute (https://...) or relative starting with (/)`)},i=function(e,r){return t(e,r)};export{i as normalizeBackendURL,n as validateBackendURL};
1
+ import{resolveRequestBackendURL as r}from"@c15t/core/server";let e=/^https?:\/\//u,t=function(r){return"/"===r?r:r.endsWith("/")?r.slice(0,-1):r},a=function(r){if(e.test(r))return String(new URL(r)),{isAbsolute:!0,normalizedURL:t(r)};if(r.startsWith("/"))return{isAbsolute:!1,normalizedURL:t(r)};throw Error(`Invalid URL format: ${r}. URL must be absolute (https://...) or relative starting with (/)`)},n=function(e,t,a={}){return r(e,{headers:t,trustForwardedHeaders:a.trustForwardedHeaders})};export{n as normalizeBackendURL,a as validateBackendURL};