@c15t/react 2.3.0 → 2.4.0
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.
- package/dist/utils/test-helpers.cjs +1 -1
- package/dist/utils/test-helpers.js +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/dist-types/version.d.ts +1 -1
- package/docs/frameworks/react/concepts/client-modes.md +6 -0
- package/docs/shared/concepts/client-modes.md +6 -0
- package/package.json +6 -5
- package/readme.json +0 -48
- package/src/iab/styles.css +0 -11
- package/src/styles.css +0 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const __rslib_import_meta_url__="u"<typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,t,_)=>{var r=(t,_)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,[_]:t[r]})};r(t,"get"),r(_,"value")},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>test_helpers,testComponentStyles:()=>testComponentStyles});const jsx_runtime_namespaceObject=require("react/jsx-runtime"),external_vitest_namespaceObject=require("vitest"),external_vitest_browser_react_namespaceObject=require("vitest-browser-react"),consent_manager_provider_cjs_namespaceObject=require("../providers/consent-manager-provider.cjs");async function testComponentStyles({component:e,testCases:t,noStyle:_=!1,theme:r}){let{container:a}=await (0,external_vitest_browser_react_namespaceObject.render)((0,jsx_runtime_namespaceObject.jsx)(consent_manager_provider_cjs_namespaceObject.ConsentManagerProvider,{options:{mode:"offline",noStyle:_,theme:r},children:e}));for(let{testId:e,styles:r}of(await new Promise(e=>setTimeout(e,50)),t)){let t=a.querySelector(`[data-testid="${e}"]`),s=document.body.querySelector(`[data-testid="${e}"]`),c=t||s;if(!c){console.warn(`Element with testId "${e}" not found in DOM`),(0,external_vitest_namespaceObject.expect)(!0).toBe(!0);continue}(0,external_vitest_namespaceObject.expect)(c).toBeTruthy(),"string"==typeof r&&r?_?(0,external_vitest_namespaceObject.expect)(c.className).toBe(r):(0,external_vitest_namespaceObject.expect)(c.className).toContain(r):"object"==typeof r&&r?.className&&(_?(0,external_vitest_namespaceObject.expect)(c.className).toBe(r.className):(0,external_vitest_namespaceObject.expect)(c.className).toContain(r.className))}}const test_helpers=testComponentStyles;for(var __rspack_i in exports.default=__webpack_exports__.default,exports.testComponentStyles=__webpack_exports__.testComponentStyles,__webpack_exports__)-1===["default","testComponentStyles"].indexOf(__rspack_i)&&(exports[__rspack_i]=__webpack_exports__[__rspack_i]);Object.defineProperty(exports,"__esModule",{value:!0});
|
|
1
|
+
"use strict";const __rslib_import_meta_url__="u"<typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,t,_)=>{var r=(t,_)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,[_]:t[r]})};r(t,"get"),r(_,"value")},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>test_helpers,testComponentStyles:()=>testComponentStyles});const jsx_runtime_namespaceObject=require("react/jsx-runtime"),external_vitest_namespaceObject=require("vitest"),external_vitest_browser_react_namespaceObject=require("vitest-browser-react"),consent_manager_provider_cjs_namespaceObject=require("../providers/consent-manager-provider.cjs");async function testComponentStyles({component:e,testCases:t,noStyle:_=!1,theme:r}){let{container:a}=await (0,external_vitest_browser_react_namespaceObject.render)((0,jsx_runtime_namespaceObject.jsx)(consent_manager_provider_cjs_namespaceObject.ConsentManagerProvider,{options:{mode:"offline",acknowledgeNoRecords:!0,noStyle:_,theme:r},children:e}));for(let{testId:e,styles:r}of(await new Promise(e=>setTimeout(e,50)),t)){let t=a.querySelector(`[data-testid="${e}"]`),s=document.body.querySelector(`[data-testid="${e}"]`),c=t||s;if(!c){console.warn(`Element with testId "${e}" not found in DOM`),(0,external_vitest_namespaceObject.expect)(!0).toBe(!0);continue}(0,external_vitest_namespaceObject.expect)(c).toBeTruthy(),"string"==typeof r&&r?_?(0,external_vitest_namespaceObject.expect)(c.className).toBe(r):(0,external_vitest_namespaceObject.expect)(c.className).toContain(r):"object"==typeof r&&r?.className&&(_?(0,external_vitest_namespaceObject.expect)(c.className).toBe(r.className):(0,external_vitest_namespaceObject.expect)(c.className).toContain(r.className))}}const test_helpers=testComponentStyles;for(var __rspack_i in exports.default=__webpack_exports__.default,exports.testComponentStyles=__webpack_exports__.testComponentStyles,__webpack_exports__)-1===["default","testComponentStyles"].indexOf(__rspack_i)&&(exports[__rspack_i]=__webpack_exports__[__rspack_i]);Object.defineProperty(exports,"__esModule",{value:!0});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import{expect as t}from"vitest";import{render as o}from"vitest-browser-react";import{ConsentManagerProvider as s}from"../providers/consent-manager-provider.js";async function a({component:r,testCases:n,noStyle:i=!1,theme:m}){let{container:c}=await o(e(s,{options:{mode:"offline",acknowledgeNoRecords:!0,noStyle:i,theme:m},children:r}));for(let{testId:e,styles:o}of(await new Promise(e=>setTimeout(e,50)),n)){let s=c.querySelector(`[data-testid="${e}"]`),a=document.body.querySelector(`[data-testid="${e}"]`),r=s||a;if(!r){console.warn(`Element with testId "${e}" not found in DOM`),t(!0).toBe(!0);continue}t(r).toBeTruthy(),"string"==typeof o&&o?i?t(r.className).toBe(o):t(r.className).toContain(o):"object"==typeof o&&o?.className&&(i?t(r.className).toBe(o.className):t(r.className).toContain(o.className))}}export default a;export{a as testComponentStyles};
|
package/dist/version.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const __rslib_import_meta_url__="u"<typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,_,r)=>{var o=(_,r)=>{for(var o in _)__webpack_require__.o(_,o)&&!__webpack_require__.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,[r]:_[o]})};o(_,"get"),o(r,"value")},__webpack_require__.o=(e,_)=>Object.prototype.hasOwnProperty.call(e,_),__webpack_require__.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__);const version="2.
|
|
1
|
+
"use strict";const __rslib_import_meta_url__="u"<typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,_,r)=>{var o=(_,r)=>{for(var o in _)__webpack_require__.o(_,o)&&!__webpack_require__.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,[r]:_[o]})};o(_,"get"),o(r,"value")},__webpack_require__.o=(e,_)=>Object.prototype.hasOwnProperty.call(e,_),__webpack_require__.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__);const version="2.4.0";for(var __rspack_i in __webpack_require__.d(__webpack_exports__,{},{version:"2.4.0"}),exports.version=__webpack_exports__.version,__webpack_exports__)-1===["version"].indexOf(__rspack_i)&&(exports[__rspack_i]=__webpack_exports__[__rspack_i]);Object.defineProperty(exports,"__esModule",{value:!0});
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
let e="2.
|
|
1
|
+
let e="2.4.0";export{e as version};
|
package/dist-types/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "2.
|
|
1
|
+
export declare const version = "2.4.0";
|
|
@@ -96,6 +96,12 @@ If consent is not stored at all (for example, storage is blocked or frequently c
|
|
|
96
96
|
|
|
97
97
|
**Best for:** Local development, Storybook/static demos, resilience fallback, or simpler sites that explicitly accept browser-only consent storage.
|
|
98
98
|
|
|
99
|
+
### Development warning
|
|
100
|
+
|
|
101
|
+
In a development build, offline mode logs one warning per page to the browser console. It says that consent stays in this browser, that c15t keeps no server-side record of it, and that every visitor gets the same policy because offline mode has no geolocation. The warning does not block the banner or change consent, and production builds do not log it.
|
|
102
|
+
|
|
103
|
+
If you chose offline mode on purpose, for example for tests or a static demo, add `acknowledgeNoRecords: true` next to `mode: 'offline'` to hide the message.
|
|
104
|
+
|
|
99
105
|
```tsx
|
|
100
106
|
import { type ReactNode } from 'react';
|
|
101
107
|
import { ConsentManagerProvider, ConsentBanner } from '@c15t/react';
|
|
@@ -76,6 +76,12 @@ If consent is not stored at all (for example, storage is blocked or frequently c
|
|
|
76
76
|
|
|
77
77
|
**Best for:** Local development, Storybook/static demos, resilience fallback, or simpler sites that explicitly accept browser-only consent storage.
|
|
78
78
|
|
|
79
|
+
### Development warning
|
|
80
|
+
|
|
81
|
+
In a development build, offline mode logs one warning per page to the browser console. It says that consent stays in this browser, that c15t keeps no server-side record of it, and that every visitor gets the same policy because offline mode has no geolocation. The warning does not block the banner or change consent, and production builds do not log it.
|
|
82
|
+
|
|
83
|
+
If you chose offline mode on purpose, for example for tests or a static demo, add `acknowledgeNoRecords: true` next to `mode: 'offline'` to hide the message.
|
|
84
|
+
|
|
79
85
|
## Custom Mode
|
|
80
86
|
|
|
81
87
|
Bring your own backend. You provide handler functions for each consent endpoint, and c15t calls them instead of making HTTP requests.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c15t/react",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "React cookie banner, consent manager, preference center, and headless CMP components with IAB TCF and Consent Mode support.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -163,13 +163,13 @@
|
|
|
163
163
|
"not op_mini all"
|
|
164
164
|
],
|
|
165
165
|
"dependencies": {
|
|
166
|
-
"@c15t/ui": "2.2.
|
|
166
|
+
"@c15t/ui": "2.2.3",
|
|
167
167
|
"@types/google.maps": "3.65.3",
|
|
168
|
-
"c15t": "2.
|
|
168
|
+
"c15t": "2.4.0"
|
|
169
169
|
},
|
|
170
170
|
"devDependencies": {
|
|
171
171
|
"@c15t/backend": "2.3.0",
|
|
172
|
-
"@c15t/iab": "2.
|
|
172
|
+
"@c15t/iab": "2.4.0",
|
|
173
173
|
"@c15t/typescript-config": "0.0.1",
|
|
174
174
|
"@c15t/vitest-config": "1.0.0",
|
|
175
175
|
"@iabtechlabtcf/core": "^1.5.22",
|
|
@@ -181,7 +181,8 @@
|
|
|
181
181
|
"react-dom": "^19.0.0 || ^19.0.0-rc || ^18.0.0 || ^17.0.0 || ^16.8.0"
|
|
182
182
|
},
|
|
183
183
|
"publishConfig": {
|
|
184
|
-
"access": "public"
|
|
184
|
+
"access": "public",
|
|
185
|
+
"tag": "v2-legacy"
|
|
185
186
|
},
|
|
186
187
|
"msw": {
|
|
187
188
|
"workerDirectory": [
|
package/readme.json
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"title": "@c15t/react: React Consent Components",
|
|
3
|
-
"description": "React cookie banner, consent manager, preference center, and headless CMP components for modern React apps.",
|
|
4
|
-
"features": [
|
|
5
|
-
"Works with React 19, 18, 17, and 16.8",
|
|
6
|
-
"Full 'use client' support for React Server Components",
|
|
7
|
-
"Prebuilt and fully customizable cookie banner, consent dialog, and preference center UI",
|
|
8
|
-
"Headless hooks for custom consent flows",
|
|
9
|
-
"Minimal configuration with TypeScript-first design",
|
|
10
|
-
"Comprehensive Consent Management Platform (CMP)",
|
|
11
|
-
"IAB TCF 2.4 UI and hooks through the @c15t/react/iab subpath",
|
|
12
|
-
"Google Tag Manager, Google Consent Mode v2, Meta Pixel, and analytics integrations through @c15t/scripts",
|
|
13
|
-
"Built-in internationalization support",
|
|
14
|
-
"Seamless consent storage and tracking"
|
|
15
|
-
],
|
|
16
|
-
"prerequisites": [
|
|
17
|
-
"React 16.8 or later",
|
|
18
|
-
"Node.js 18.17.0 or later",
|
|
19
|
-
"A hosted [c15t instance](https://inth.com) (free sign-up), [self-hosted deployment](https://c15t.com/docs/self-host/quickstart), or offline mode for local-only storage"
|
|
20
|
-
],
|
|
21
|
-
"manualInstallation": [
|
|
22
|
-
"",
|
|
23
|
-
"```bash\npnpm add @c15t/react\n```",
|
|
24
|
-
"",
|
|
25
|
-
"Then add the prebuilt stylesheet to your app-level CSS entrypoint:",
|
|
26
|
-
"",
|
|
27
|
-
"```css\n/* src/index.css */\n@import \"@c15t/react/styles.css\";\n```",
|
|
28
|
-
"",
|
|
29
|
-
"If you use the prebuilt IAB TCF UI, also import `@c15t/react/iab/styles.css`. It is published separately so non-IAB apps do not ship those component rules.",
|
|
30
|
-
"",
|
|
31
|
-
"To manually install, follow the guide in our [docs – manual setup](https://c15t.com/docs/frameworks/react/quickstart#manual-setup)."
|
|
32
|
-
],
|
|
33
|
-
"usage": [
|
|
34
|
-
"Import `ConsentManagerProvider` in your app's root component",
|
|
35
|
-
"Add `ConsentBanner` and `ConsentDialog` components",
|
|
36
|
-
"Customize styling and behavior to fit your app",
|
|
37
|
-
"For full implementation details, see the [React quickstart docs](https://c15t.com/docs/frameworks/react/quickstart)",
|
|
38
|
-
|
|
39
|
-
"```tsx\n// App.tsx\nimport {\n ConsentManagerProvider,\n ConsentBanner,\n ConsentDialog,\n} from '@c15t/react'\n\nfunction App() {\n return (\n <ConsentManagerProvider>\n <YourApp />\n <ConsentBanner />\n <ConsentDialog />\n </ConsentManagerProvider>\n )\n}\n```"
|
|
40
|
-
],
|
|
41
|
-
"docsLink": "https://c15t.com/docs/frameworks/react/quickstart",
|
|
42
|
-
"quickStartLink": "https://c15t.com/docs/frameworks/react/quickstart",
|
|
43
|
-
"showCLIGeneration": true,
|
|
44
|
-
"customSections": {
|
|
45
|
-
"Deployment Modes": "- **Hosted on inth.com**: Hosted c15t backend for policy storage, audit history, and hosted infrastructure\n- **Self-hosted backend**: Use @c15t/backend when you need full infrastructure control\n- **Offline mode**: Browser-only consent storage for local development, demos, previews, static sites, or fallback scenarios",
|
|
46
|
-
"Popular Integrations": "- Google Tag Manager with Google Consent Mode v2\n- Google Analytics 4 and Google Ads through gtag.js\n- Meta Pixel, TikTok Pixel, LinkedIn Insights, Microsoft UET, X Pixel, Reddit Pixel, and Snapchat Pixel\n- PostHog, Segment, Mixpanel, Microsoft Clarity, Hotjar, Plausible, Fathom, Matomo, Umami, and Vercel Analytics\n- Intercom and Crisp chat widgets"
|
|
47
|
-
}
|
|
48
|
-
}
|
package/src/iab/styles.css
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @c15t/react — IAB TCF component styles.
|
|
3
|
-
*
|
|
4
|
-
* Add this stylesheet to the same global CSS entrypoint as your base c15t styles
|
|
5
|
-
* when using IAB consent components. Do not import either stylesheet from JS/TSX.
|
|
6
|
-
*
|
|
7
|
-
* Usage (src/index.css):
|
|
8
|
-
* @import "@c15t/react/styles.css";
|
|
9
|
-
* @import "@c15t/react/iab/styles.css";
|
|
10
|
-
*/
|
|
11
|
-
@import "@c15t/ui/iab/styles.css";
|
package/src/styles.css
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @c15t/react — Non-IAB prebuilt component styles.
|
|
3
|
-
*
|
|
4
|
-
* Import this stylesheet once from your app-level CSS entrypoint
|
|
5
|
-
* when using prebuilt (styled) consent components.
|
|
6
|
-
*
|
|
7
|
-
* Usage (src/index.css):
|
|
8
|
-
* @import "@c15t/react/styles.css";
|
|
9
|
-
*/
|
|
10
|
-
@import "@c15t/ui/styles.css";
|