@c15t/react 3.0.0-alpha.7 → 3.0.0-alpha.9

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 (63) hide show
  1. package/AGENTS.md +3 -3
  2. package/dist/components/consent-gate/atoms.js +1 -1
  3. package/dist/components/iab-panel/atoms/root.js +1 -1
  4. package/dist/components/iab-panel/iab-panel.js +1 -1
  5. package/dist/components/iab-prompt/atoms/root.js +1 -1
  6. package/dist/components/panel/atoms/root.js +1 -1
  7. package/dist/components/panel-trigger/atoms/root.js +1 -1
  8. package/dist/components/preferences/atoms/root.js +1 -1
  9. package/dist/components/prompt/atoms/root.js +1 -1
  10. package/dist/components/prompt/prompt.js +1 -1
  11. package/dist/components/shared/dialog-sheets.js +1 -0
  12. package/dist/components/shared/first-paint-sheets.js +1 -0
  13. package/dist/components/shared/iab-dialog-sheets.js +1 -0
  14. package/dist/components/shared/iab-first-paint-sheets.js +1 -0
  15. package/dist/components/shared/primitives/legal-links/index.js +1 -1
  16. package/dist/components/shared/streamed-surface.js +2 -0
  17. package/dist/components/shared/surface-styles.js +2 -0
  18. package/dist/context.js +1 -1
  19. package/dist/hooks/use-iab-policy-guard.js +1 -0
  20. package/dist/hooks.js +1 -1
  21. package/dist/iab/styles.tw3.css +1 -1
  22. package/dist/iab-context.js +1 -1
  23. package/dist/kernel-selector.js +1 -1
  24. package/dist/provider.js +1 -1
  25. package/dist/version.js +1 -1
  26. package/dist-types/components/prompt/atoms/root.d.ts +4 -0
  27. package/dist-types/components/prompt/prompt.d.ts +4 -0
  28. package/dist-types/components/shared/dialog-sheets.d.ts +9 -0
  29. package/dist-types/components/shared/first-paint-sheets.d.ts +8 -0
  30. package/dist-types/components/shared/iab-dialog-sheets.d.ts +3 -0
  31. package/dist-types/components/shared/iab-first-paint-sheets.d.ts +3 -0
  32. package/dist-types/components/shared/streamed-surface.d.ts +23 -0
  33. package/dist-types/components/shared/surface-styles.d.ts +36 -0
  34. package/dist-types/context.d.ts +17 -1
  35. package/dist-types/hooks/use-iab-policy-guard.d.ts +35 -0
  36. package/dist-types/kernel-selector.d.ts +10 -0
  37. package/dist-types/provider.d.ts +36 -4
  38. package/dist-types/ui-config-context.d.ts +4 -0
  39. package/dist-types/version.d.ts +1 -1
  40. package/docs/README.md +3 -3
  41. package/docs/concepts/choose-your-setup.md +4 -2
  42. package/docs/concepts/data-fetching.md +3 -1
  43. package/docs/customization/overview.md +3 -2
  44. package/docs/customization/stylesheets.md +163 -50
  45. package/docs/customization/tailwind.md +59 -44
  46. package/docs/customization/tokens.md +6 -6
  47. package/docs/frameworks/react/components/consent-banner.md +7 -4
  48. package/docs/frameworks/react/components/consent-dialog.md +8 -5
  49. package/docs/frameworks/react/components/consent-provider.md +41 -36
  50. package/docs/frameworks/react/components.md +9 -5
  51. package/docs/frameworks/react/compose.md +3 -3
  52. package/docs/frameworks/react/content-security-policy.md +22 -8
  53. package/docs/frameworks/react/customize.md +21 -13
  54. package/docs/frameworks/react/iab.md +36 -4
  55. package/docs/frameworks/react/quickstart.md +84 -85
  56. package/docs/frameworks/react/rendering.md +24 -12
  57. package/docs/frameworks/react/scripts.md +7 -4
  58. package/docs/frameworks/react/troubleshooting.md +70 -19
  59. package/docs/frameworks/react/upgrade-v3.md +23 -17
  60. package/docs/frameworks/react/vendor-consent.md +19 -7
  61. package/docs/guides/banner-experiments.md +2 -4
  62. package/docs/guides/troubleshooting.md +9 -9
  63. package/package.json +7 -7
package/AGENTS.md CHANGED
@@ -36,7 +36,7 @@ These docs describe c15t v3. Find your app's row in Choose your setup, then foll
36
36
  - [DevTools](./docs/frameworks/react/components/dev-tools.md): Inspect consent state, location, loaded scripts and consent events in a React app during development with the c15t DevTools panel.
37
37
  - [Compose your own banner](./docs/frameworks/react/compose.md): Build a React consent banner from the ConsentBanner parts in c15t/react, with your own markup and buttons, while the policy still decides which actions appear.
38
38
  - [Content Security Policy](./docs/frameworks/react/content-security-policy.md): Run c15t in a React app under a Content Security Policy, allow the consent backend and vendor hosts, and pass a nonce to ConsentProvider and ConsentTheme.
39
- - [Customize](./docs/frameworks/react/customize.md): Change the colors, fonts, layout, button styles and copy of the c15t banner and dialog in a React app with the stylesheet, theme tokens, provider options and slots.
39
+ - [Customize](./docs/frameworks/react/customize.md): Change the colors, fonts, layout, button styles and copy of the c15t banner and dialog in a React app with theme tokens, provider options and slots, and load the stylesheet yourself when you need to.
40
40
  - [Embeds](./docs/frameworks/react/embeds.md): Keep YouTube videos, maps and other iframes out of a React page until their consent category is allowed, with ConsentGate or the iframe blocker in ConsentProvider.
41
41
  - [IAB GPP](./docs/frameworks/react/gpp.md): Add the IAB Global Privacy Platform API (__gpp) to a React app with ConsentGPP from @c15t/react/gpp, so ad tech can read US state opt-outs and the TCF EU consent string.
42
42
  - [Headless](./docs/frameworks/react/headless.md): Build a custom consent banner in React with the c15t/react/headless hooks inside your ConsentProvider.
@@ -74,8 +74,8 @@ These docs describe c15t v3. Find your app's row in Choose your setup, then foll
74
74
  - [Customize the interface](./docs/customization/overview.md): Change c15t's consent banner and dialog one step at a time, from a prop to your own markup, and find where each step lives in your framework.
75
75
  - [Banner designs](./docs/customization/recipes.md): Five consent banner designs built with c15t, from one prop to your own markup, with tested code for React, Vue, Svelte, Astro and plain HTML.
76
76
  - [Component parts](./docs/customization/slots.md): Find every part of c15t's banner, dialog, widget, trigger and ConsentGate placeholder, its key in your framework's part API, and the data attributes to select on.
77
- - [Stylesheets and CSS layers](./docs/customization/stylesheets.md): Load the right c15t stylesheet for your framework, see which file holds the dialog's rules, order c15t's cascade layer against your own, and run c15t without its styles.
78
- - [Tailwind CSS](./docs/customization/tailwind.md): Load c15t's styles next to Tailwind CSS 4 or 3 in every framework, put utilities on c15t component parts, and use Tailwind's dark variant with c15t.
77
+ - [Stylesheets and CSS layers](./docs/customization/stylesheets.md): See how c15t delivers its styles in each framework without a render-blocking stylesheet, when to import styles.css yourself with styles false, which file holds the dialog's rules, and how c15t's cascade layer meets your own.
78
+ - [Tailwind CSS](./docs/customization/tailwind.md): Use c15t's styles with Tailwind CSS 4 or 3 in every framework, put utilities on c15t component parts, and use Tailwind's dark variant with c15t.
79
79
  - [Theme tokens](./docs/customization/tokens.md): Change c15t's colors, type, radius, spacing, shadows and motion with theme tokens, and see every --c15t-* variable with its default.
80
80
  - [Copy and translations](./docs/customization/translations.md): Change consent wording through i18n and test the complete prompt and preferences flow.
81
81
 
@@ -1 +1 @@
1
- import{jsx as t}from"react/jsx-runtime";import e from"@c15t/ui/styles/components/consent-gate";import{forwardRef as o}from"react";import{useTranslations as n}from"../../component-hooks/use-translations.js";import{useUIConfig as a}from"../../ui-config-context.js";import{getSlotProps as s,mergeSlotProps as r}from"../../utils/merge-slot-props.js";import{Box as i}from"../shared/primitives/box.js";import{ConsentButton as l}from"../shared/primitives/button.js";let m=o(({children:o,...n},a)=>t(i,{ref:a,baseClassName:e.placeholder,"data-testid":"consent-gate-placeholder",slotKey:"consent-gate.root",...n,children:o})),c=o(({children:o,category:a,...s},r)=>{let{consentGate:l,consentTypes:m}=n(),c=a&&l?.title?l.title.replace("{category}",m?.[a]?.title??a):void 0;return t(i,{ref:r,baseClassName:e.title,"data-testid":"consent-gate-title",slotKey:"consent-gate.title",...s,children:o??c})}),p=o(({children:e,category:o,className:i,style:m,...c},p)=>{let{consentGate:d,consentTypes:g}=n(),{components:u}=a(),f=r(s(u,"consent-gate.button"),{className:i,style:m}),y=g?.[o]?.title??o,h=d?.actionButton?.replace("{category}",y);return t(l,{mode:"stroke",size:"small",variant:"primary",...f,...c,ref:p,action:"open-consent-dialog",category:o,"data-testid":"consent-gate-button",children:e??h})});m.displayName="ConsentGateRoot",c.displayName="ConsentGateTitle",p.displayName="ConsentGateButton";export{p as ConsentGateButton,m as ConsentGateRoot,c as ConsentGateTitle};
1
+ import{Fragment as t,jsx as e,jsxs as o}from"react/jsx-runtime";import s from"@c15t/ui/styles/components/consent-gate";import{forwardRef as r}from"react";import{useTranslations as n}from"../../component-hooks/use-translations.js";import{useUIConfig as a}from"../../ui-config-context.js";import{getSlotProps as i,mergeSlotProps as l}from"../../utils/merge-slot-props.js";import{FIRST_PAINT_SHEETS as m}from"../shared/first-paint-sheets.js";import{Box as c}from"../shared/primitives/box.js";import{ConsentButton as p}from"../shared/primitives/button.js";import{SurfaceStyles as d}from"../shared/surface-styles.js";let f=r(({children:r,...n},a)=>o(t,{children:[e(d,{sheets:m,noStyle:n.noStyle}),e(c,{ref:a,baseClassName:s.placeholder,"data-testid":"consent-gate-placeholder",slotKey:"consent-gate.root",...n,children:r})]})),u=r(({children:t,category:o,...r},a)=>{let{consentGate:i,consentTypes:l}=n(),m=o&&i?.title?i.title.replace("{category}",l?.[o]?.title??o):void 0;return e(c,{ref:a,baseClassName:s.title,"data-testid":"consent-gate-title",slotKey:"consent-gate.title",...r,children:t??m})}),g=r(({children:t,category:o,className:s,style:r,...m},c)=>{let{consentGate:d,consentTypes:f}=n(),{components:u}=a(),g=l(i(u,"consent-gate.button"),{className:s,style:r}),h=f?.[o]?.title??o,y=d?.actionButton?.replace("{category}",h);return e(p,{mode:"stroke",size:"small",variant:"primary",...g,...m,ref:c,action:"open-consent-dialog",category:o,"data-testid":"consent-gate-button",children:t??y})});f.displayName="ConsentGateRoot",u.displayName="ConsentGateTitle",g.displayName="ConsentGateButton";export{g as ConsentGateButton,f as ConsentGateRoot,u as ConsentGateTitle};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as o,jsxs as e}from"react/jsx-runtime";import{isDialogDismissKey as t}from"@c15t/ui/primitives/dialog";import r from"@c15t/ui/styles/components/iab-consent-dialog";import{useEffect as i,useMemo as n,useState as m}from"react";import{createPortal as a}from"react-dom";import{ConsentTrackingContext as s}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as l}from"../../../context/theme-context.js";import{useSetActiveUI as c}from"../../../hooks.js";import{useIABConsentManager as d}from"../../../hooks/use-iab-manager.js";import{useIsHydrated as u}from"../../../hooks/use-is-hydrated.js";import{useScrollLock as p}from"../../../hooks/use-scroll-lock.js";import{useTextDirection as f}from"../../../hooks/use-text-direction.js";import{useUIConfig as g}from"../../../ui-config-context.js";import{cnExt as b}from"../../../utils/cn.js";import{mergeSlotProps as j}from"../../../utils/merge-slot-props.js";import{IABConsentDialogOverlay as k}from"./overlay.js";let v=["iab"],h=({children:h,open:x,models:y=v,noStyle:A,disableAnimation:F,scrollLock:L,trapFocus:C,uiSource:D})=>{let{activeUI:q,translationConfig:w,iab:B,policyDialog:E,model:I}=d({preferences:{scrollLock:L,trapFocus:C}}),N=c(),{components:P}=g(),R=f(w.defaultLanguage),T=u(),[H,O]=m(!1),S=null!==I&&y.includes(I)&&(x??"dialog"===q),V=E.blocking,_=n(()=>({disableAnimation:F,noStyle:A,scrollLock:V,trapFocus:V}),[F,A,V]);p(!!(S&&V)),i(()=>{if(!S)return;let o=o=>{t(o.key)&&(o.preventDefault(),N("none"))};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[S,N]),i(()=>{if(S){let o=requestAnimationFrame(()=>O(!0));return()=>cancelAnimationFrame(o)}if(F){let o=requestAnimationFrame(()=>O(!1));return()=>cancelAnimationFrame(o)}let o=setTimeout(()=>{O(!1)},150);return()=>clearTimeout(o)},[S,F]);let z=j(P?.["iab-dialog"]?.root,{baseClassName:b(r.root,F?void 0:H?r.dialogVisible:r.dialogHidden)}),G=n(()=>({uiSource:D??"iab_dialog"}),[D]);return T&&B?.config.enabled&&(S||H)?a(o(s.Provider,{value:G,children:e(l.Provider,{value:_,children:[o(k,{isOpen:S}),o("div",{...z,"data-testid":"iab-consent-dialog-root",dir:R,children:h})]})}),document.body):null};h.displayName="IABConsentDialogRoot";export{h as IABConsentDialogRoot};
2
+ import{jsx as o,jsxs as e}from"react/jsx-runtime";import{isDialogDismissKey as t}from"@c15t/ui/primitives/dialog";import r from"@c15t/ui/styles/components/iab-consent-dialog";import{useEffect as i,useMemo as n,useState as s}from"react";import{createPortal as m}from"react-dom";import{ConsentTrackingContext as a}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as l}from"../../../context/theme-context.js";import{useSetActiveUI as c}from"../../../hooks.js";import{useIABConsentManager as d}from"../../../hooks/use-iab-manager.js";import{useIsHydrated as u}from"../../../hooks/use-is-hydrated.js";import{useScrollLock as p}from"../../../hooks/use-scroll-lock.js";import{useTextDirection as f}from"../../../hooks/use-text-direction.js";import{useUIConfig as g}from"../../../ui-config-context.js";import{cnExt as h}from"../../../utils/cn.js";import{mergeSlotProps as j}from"../../../utils/merge-slot-props.js";import{IAB_DIALOG_SHEETS as b}from"../../shared/iab-dialog-sheets.js";import{SurfaceStyles as k}from"../../shared/surface-styles.js";import{IABConsentDialogOverlay as v}from"./overlay.js";let y=["iab"],x=({children:x,open:A,models:F=y,noStyle:L,disableAnimation:C,scrollLock:D,trapFocus:q,uiSource:w})=>{let{activeUI:B,translationConfig:E,iab:I,policyDialog:N,model:P}=d({preferences:{scrollLock:D,trapFocus:q}}),R=c(),{components:S}=g(),T=f(E.defaultLanguage),H=u(),[O,V]=s(!1),_=null!==P&&F.includes(P)&&(A??"dialog"===B),z=N.blocking,G=n(()=>({disableAnimation:C,noStyle:L,scrollLock:z,trapFocus:z}),[C,L,z]);p(!!(_&&z)),i(()=>{if(!_)return;let o=o=>{t(o.key)&&(o.preventDefault(),R("none"))};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[_,R]),i(()=>{if(_){let o=requestAnimationFrame(()=>V(!0));return()=>cancelAnimationFrame(o)}if(C){let o=requestAnimationFrame(()=>V(!1));return()=>cancelAnimationFrame(o)}let o=setTimeout(()=>{V(!1)},150);return()=>clearTimeout(o)},[_,C]);let J=j(S?.["iab-dialog"]?.root,{baseClassName:h(r.root,C?void 0:O?r.dialogVisible:r.dialogHidden)}),K=n(()=>({uiSource:w??"iab_dialog"}),[w]);return H&&I?.config.enabled&&(_||O)?m(o(a.Provider,{value:K,children:e(l.Provider,{value:G,children:[o(k,{sheets:b,noStyle:L}),o(v,{isOpen:_}),o("div",{...J,"data-testid":"iab-consent-dialog-root",dir:T,children:x})]})}),document.body):null};x.displayName="IABConsentDialogRoot";export{x as IABConsentDialogRoot};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{Fragment as e,jsx as t,jsxs as o}from"react/jsx-runtime";import{applyPublisherRestrictionsToGVL as n}from"@c15t/iab/headless";import{isDialogDismissKey as i}from"@c15t/ui/primitives/dialog";import r from"@c15t/ui/styles/components/consent-actions";import a from"@c15t/ui/styles/components/iab-consent-dialog";import{useCallback as s,useEffect as l,useLayoutEffect as d,useMemo as c,useRef as m,useState as u}from"react";import{createPortal as p}from"react-dom";import{useHeadlessIABConsentUI as g}from"../../component-hooks/use-headless-iab-consent-ui.js";import{useTranslations as h}from"../../component-hooks/use-translations.js";import{ConsentDialogTrigger as b}from"../panel-trigger/index.js";import{Branding as y}from"../panel/atoms/card.js";import{ConsentTrackingContext as f}from"../../context/consent-tracking-context.js";import{LocalThemeContext as v}from"../../context/theme-context.js";import{useComponentConfig as C}from"../../hooks/use-component-config.js";import{useFocusTrap as S}from"../../hooks/use-focus-trap.js";import{useIABConsentManager as k}from"../../hooks/use-iab-manager.js";import{useScrollLock as N}from"../../hooks/use-scroll-lock.js";import{useTextDirection as I}from"../../hooks/use-text-direction.js";import{useUIConfig as x}from"../../ui-config-context.js";import{mergeSlotProps as L}from"../../utils/merge-slot-props.js";import{FeatureItem as j}from"./atoms/feature-item.js";import{IABConsentDialogOverlay as T}from"./atoms/overlay.js";import{PurposeItem as A}from"./atoms/purpose-item.js";import{StackItem as F}from"./atoms/stack-item.js";import{VendorList as V}from"./atoms/vendor-list.js";import{useIABDisplayModel as w}from"./hooks/use-display-model.js";import{useIABTranslations as P}from"./use-iab-translations.js";import*as B from"../shared/ui/button/index.js";import*as R from"../shared/ui/tabs/index.js";let $=["iab"],M={tabIndex:-1},q=({open:q,noStyle:z,disableAnimation:E,scrollLock:H,trapFocus:D,hideBranding:W,initialTab:G,showTrigger:O=!1,models:_=$,uiSource:J})=>{let K=P(),{common:Q}=h(),{components:U}=x(),{iab:X,activeUI:Y,policyDialog:Z,translationConfig:ee,model:et}=k({preferences:{scrollLock:H,trapFocus:D}}),{banner:eo,closeUI:en,openDialog:ei,performDialogAction:er}=g(),ea=Z.blocking,es=I(ee.defaultLanguage),el=m(null),ed=m(null),ec=m(null),[em,eu]=u(G??X?.preferenceCenterTab??"purposes"),[ep,eg]=u(null),[eh,eb]=u(!1),[ey,ef]=u(!1),[ev,eC]=u(!1),eS=null!==et&&_.includes(et)&&(q??"dialog"===Y),ek=C({disableAnimation:E,noStyle:z,scrollLock:ea,trapFocus:Z.blocking}),{consentRows:eN,essentialRows:eI,essentialPartnerCount:ex,featureRows:eL,featuresStandardText:ej,purposeTabCount:eT,vendorTabCount:eA,data:{purposes:eF}}=w(),eV=X?.gvl??null,ew=X?.publisherRestrictions,eP=c(()=>eV?n(eV,ew):null,[eV,ew]),eB=s((e,t)=>{X?.setPurposeConsent(e,t)},[X]),eR=s((e,t)=>{X?.setSpecialFeatureOptIn(e,t)},[X]),e$=s((e,t)=>{X?.setVendorConsent(e,t)},[X]),eM=s((e,t)=>{X?.setVendorLegitimateInterest(e,t)},[X]),eq=s((e,t)=>{X?.setPurposeLegitimateInterest(e,t)},[X]),ez=async()=>{try{await er("accept")}catch{}},eE=async()=>{try{await er("reject")}catch{}},eH=async()=>{try{await er("customize")}catch{}},eD=s(()=>{en()},[en]),eW=e=>{eg(e),eu("vendors"),ei({tab:"vendors"})};S(!!(ey&&eS&&ek.trapFocus),el,{initialFocus:"first-tabbable"}),N(!!(eS&&ek.scrollLock)),l(()=>{if(!eS)return;let e=e=>{i(e.key)&&(e.preventDefault(),eD())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[eD,eS]),l(()=>{let e=requestAnimationFrame(()=>ef(!0));return()=>cancelAnimationFrame(e)},[]),l(()=>{if(eS){let e=requestAnimationFrame(()=>eC(!0));return()=>cancelAnimationFrame(e)}if(ek.disableAnimation){let e=requestAnimationFrame(()=>eC(!1));return()=>cancelAnimationFrame(e)}let e=setTimeout(()=>{eC(!1)},150);return()=>clearTimeout(e)},[eS,ek.disableAnimation]);let eG=m(!!G);l(()=>{let e=X?.preferenceCenterTab;if(!(eS&&e))return;if(eG.current){eG.current=!1;return}let t=requestAnimationFrame(()=>{eu(e)});return()=>cancelAnimationFrame(t)},[eS,X?.preferenceCenterTab]),d(()=>{let e,t;if("purposes"!==em&&"vendors"!==em)return;let o=ed.current;if(!o||null===ec.current)return;let n=ec.current;if(ec.current=null,!window.matchMedia("(prefers-reduced-motion: reduce)").matches)return o.style.height=`${n}px`,o.style.overflow="hidden",o.style.transition="none",e=requestAnimationFrame(()=>{t=requestAnimationFrame(()=>{if(!o)return;o.style.height="auto";let e=o.getBoundingClientRect().height;if(o.style.height=`${n}px`,1>Math.abs(n-e)){o.style.height="",o.style.overflow="",o.style.transition="";return}o.getBoundingClientRect(),o.style.transition="height 180ms cubic-bezier(0.33, 1, 0.68, 1)",o.style.height=`${e}px`,o.addEventListener("transitionend",e=>{"height"===e.propertyName&&(o.style.height="",o.style.overflow="",o.style.transition="")},{once:!0})})}),()=>{cancelAnimationFrame(e),cancelAnimationFrame(t)}},[em]);let eO=s(e=>{ed.current&&(ec.current=ed.current.offsetHeight),eu(e),ei({tab:e})},[ei]),e_=c(()=>({uiSource:J??"iab_dialog"}),[J]);if(!ey||!X?.config.enabled)return null;let eJ=X.isLoadingGVL||!X.gvl,eK=L(U?.["iab-dialog"]?.root,{baseClassName:`${a.root} ${ev?a.dialogVisible:a.dialogHidden}`,noStyle:ek.noStyle}),eQ=L(U?.["iab-dialog"]?.card,{baseClassName:`${a.card} ${ev?a.contentVisible:a.contentHidden}`,noStyle:ek.noStyle}),eU=L(U?.["iab-dialog"]?.header,{baseClassName:a.header,noStyle:ek.noStyle}),eX=L(U?.["iab-dialog"]?.headerContent,{baseClassName:a.headerContent,noStyle:ek.noStyle}),eY=L(U?.["iab-dialog"]?.title,{baseClassName:a.title,noStyle:ek.noStyle}),eZ=L(U?.["iab-dialog"]?.description,{baseClassName:a.description,noStyle:ek.noStyle}),e1=L(U?.["iab-dialog"]?.closeButton,{baseClassName:a.closeButton,noStyle:ek.noStyle}),e0=L(U?.["iab-dialog"]?.body,{baseClassName:a.body,noStyle:ek.noStyle}),e2=L(U?.["iab-dialog"]?.tabs,{baseClassName:a.tabsContainer,noStyle:ek.noStyle}),e7=L(U?.["iab-dialog"]?.tabsList,{baseClassName:a.tabsList,noStyle:ek.noStyle}),e4=L(U?.["iab-dialog"]?.tabTrigger,{baseClassName:a.tabButton,noStyle:ek.noStyle}),e5=L(U?.["iab-dialog"]?.tabIndicator,{baseClassName:a.tabIndicator,noStyle:ek.noStyle}),e8=L(U?.["iab-dialog"]?.content,{baseClassName:a.content,noStyle:ek.noStyle}),e6=L(U?.["iab-dialog"]?.loading,{baseClassName:a.loadingContainer,noStyle:ek.noStyle}),e3=L(U?.["iab-dialog"]?.tabPanel,{baseClassName:a.tabPanel,noStyle:ek.noStyle}),e9=L(U?.["iab-dialog"]?.specialPurposes,{baseClassName:a.specialPurposesSection,noStyle:ek.noStyle}),te=L(U?.["iab-dialog"]?.consentNotice,{baseClassName:a.consentNotice,noStyle:ek.noStyle}),tt=L(U?.["iab-dialog"]?.actions,{baseClassName:r.actionRoot,noStyle:ek.noStyle}),to=L(U?.["iab-dialog"]?.footer,{baseClassName:a.footer,noStyle:ek.noStyle,...tt}),tn=L(U?.["iab-dialog"]?.actionGroup,{baseClassName:r.actionGroup,"data-direction":"row",noStyle:ek.noStyle}),ti=t(f.Provider,{value:e_,children:o(v.Provider,{value:ek,children:[t(T,{isOpen:eS}),t("div",{...eK,"data-testid":"iab-consent-dialog-root",dir:es,children:o("div",{"aria-describedby":"iab-consent-dialog-description",...eQ,ref:el,"aria-label":K.preferenceCenter.title,"aria-modal":ek.trapFocus?"true":void 0,role:"dialog",...M,"data-testid":"iab-consent-dialog-card",children:[o("div",{...eU,children:[o("div",{...eX,children:[t("h2",{...eY,children:K.preferenceCenter.title}),t("p",{...eZ,id:"iab-consent-dialog-description",children:K.preferenceCenter.description})]}),t("button",{...e1,type:"button","data-testid":"iab-consent-dialog-close",onClick:eD,"aria-label":Q.close,children:o("svg",{"aria-hidden":"true",style:{height:"1rem",width:"1rem"},viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),t("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),o(R.Root,{...e0,noStyle:!0,onValueChange:e=>eO(e),value:em,children:[t("div",{...e2,children:o(R.List,{...e7,noStyle:!0,children:[o(R.Trigger,{...e4,noStyle:!0,value:"purposes",children:[K.preferenceCenter.tabs.purposes,!eJ&&` (${eT})`]}),o(R.Trigger,{...e4,noStyle:!0,value:"vendors",children:[K.preferenceCenter.tabs.vendors,!eJ&&` (${eA})`]}),t("div",{...e5,"aria-hidden":"true","data-active-tab":em})]})}),t("div",{...e8,ref:ed,children:eJ?o("div",{...e6,children:[t("div",{className:a.loadingSpinner}),t("p",{className:a.loadingText,children:K.common.loading})]}):o(e,{children:[o(R.Content,{...e3,forceMount:!0,noStyle:!0,value:"purposes",children:[eN.map(e=>"stack"===e.kind?t(F,{stack:e,consents:X.purposeConsents,onToggle:eB,vendorConsents:X.vendorConsents,onVendorToggle:e$,onVendorClick:eW,vendorLegitimateInterests:X.vendorLegitimateInterests,onVendorLegitimateInterestToggle:eM,purposeLegitimateInterests:X.purposeLegitimateInterests,onPurposeLegitimateInterestToggle:eq},e.testId):t(A,{purpose:e,testId:e.testId,isEnabled:"special-feature"===e.toggle?X.specialFeatureOptIns[e.id]??!1:X.purposeConsents[e.id]??!1,onToggle:t=>{"special-feature"===e.toggle?eR(e.id,t):eB(e.id,t)},vendorConsents:X.vendorConsents,onVendorToggle:e$,onVendorClick:eW,vendorLegitimateInterests:X.vendorLegitimateInterests,onVendorLegitimateInterestToggle:eM,purposeLegitimateInterests:"purpose"===e.kind?X.purposeLegitimateInterests:void 0,onPurposeLegitimateInterestToggle:"purpose"===e.kind?eq:void 0},e.testId)),eI.length>0&&o("div",{...e9,children:[o("div",{className:a.specialPurposesHeader,children:[o("button",{type:"button","aria-expanded":eh,onClick:()=>eb(!eh),className:a.purposeTrigger,children:[t("svg",{"aria-hidden":"true",className:a.purposeArrow,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:eh?t("path",{d:"M19 9l-7 7-7-7"}):t("path",{d:"M9 5l7 7-7 7"})}),o("div",{className:a.purposeInfo,children:[o("h3",{className:a.specialPurposesTitle,children:[K.preferenceCenter.specialPurposes.title,o("svg",{"aria-hidden":"true",className:a.lockIcon,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),t("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]})]}),o("p",{className:a.purposeMeta,children:[ex," ",1===ex?K.preferenceCenter.vendorList.partnerSingular:K.preferenceCenter.vendorList.partnerPlural]})]})]}),t("div",{style:{position:"relative"},children:o("svg",{className:a.infoIcon,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-label":K.preferenceCenter.specialPurposes.tooltip,children:[t("circle",{cx:"12",cy:"12",r:"10"}),t("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),t("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]})})]}),eh&&t("div",{style:{padding:"0.75rem"},children:eI.map(e=>t(A,{purpose:e,testId:e.testId,isEnabled:!0,onToggle:()=>{},vendorConsents:X.vendorConsents,onVendorToggle:e$,onVendorClick:eW,isLocked:!0},e.testId))})]}),eL.length>0&&o("section",{"aria-label":K.preferenceCenter.features.title,className:ek.noStyle?void 0:a.featuresSection,"data-testid":"iab-consent-dialog-features",children:[o("div",{className:ek.noStyle?void 0:a.featuresHeader,children:[t("h3",{className:ek.noStyle?void 0:a.featuresTitle,children:K.preferenceCenter.features.title}),t("p",{className:ek.noStyle?void 0:a.featuresDescription,children:ej??K.preferenceCenter.features.description})]}),t("div",{className:ek.noStyle?void 0:a.featuresList,children:eL.map(e=>t(j,{feature:e,testId:e.testId},e.testId))})]}),t("div",{...te,children:t("p",{className:a.consentNoticeText,children:K.preferenceCenter.footer.consentStorage})})]}),t(R.Content,{...e3,forceMount:!0,noStyle:!0,value:"vendors",children:t(V,{vendorData:eP,purposes:eF,vendorConsents:X.vendorConsents,onVendorToggle:e$,selectedVendorId:ep,onClearSelection:()=>eg(null),customVendors:X.nonIABVendors,vendorLegitimateInterests:X.vendorLegitimateInterests,onVendorLegitimateInterestToggle:eM})})]})})]}),o("div",{...to,children:[o("div",{...tn,children:[t(B.Root,{variant:"neutral",mode:"stroke",size:"small",onClick:eE,disabled:!eo.isReady,"data-action":"reject",children:K.common.rejectAll}),t(B.Root,{variant:"neutral",mode:"stroke",size:"small",onClick:ez,disabled:!eo.isReady,"data-action":"accept",children:K.common.acceptAll})]}),t("div",{...tn,children:t(B.Root,{variant:"primary",mode:"filled",size:"small",onClick:eH,disabled:eJ,"data-action":"customize",children:K.common.saveSettings})})]}),t(y,{hideBranding:W??!1,variant:"dialog-tag",slotContext:"iab-dialog","data-testid":"iab-consent-dialog-branding"})]})})]})}),tr=!0===O?{}:!1===O?null:O,ta=tr?t(b,{...tr}):null;return eS||ev?o(e,{children:[ta,p(ti,document.body)]}):ta};export{q as IABConsentDialog};
2
+ import{Fragment as e,jsx as t,jsxs as o}from"react/jsx-runtime";import{applyPublisherRestrictionsToGVL as n}from"@c15t/iab/headless";import{isDialogDismissKey as i}from"@c15t/ui/primitives/dialog";import r from"@c15t/ui/styles/components/consent-actions";import a from"@c15t/ui/styles/components/iab-consent-dialog";import{useCallback as s,useEffect as l,useLayoutEffect as d,useMemo as c,useRef as m,useState as p}from"react";import{createPortal as u}from"react-dom";import{useHeadlessIABConsentUI as g}from"../../component-hooks/use-headless-iab-consent-ui.js";import{useTranslations as h}from"../../component-hooks/use-translations.js";import{ConsentDialogTrigger as b}from"../panel-trigger/index.js";import{Branding as y}from"../panel/atoms/card.js";import{ConsentTrackingContext as f}from"../../context/consent-tracking-context.js";import{LocalThemeContext as v}from"../../context/theme-context.js";import{useComponentConfig as C}from"../../hooks/use-component-config.js";import{useFocusTrap as S}from"../../hooks/use-focus-trap.js";import{useIABConsentManager as k}from"../../hooks/use-iab-manager.js";import{useScrollLock as N}from"../../hooks/use-scroll-lock.js";import{useTextDirection as I}from"../../hooks/use-text-direction.js";import{useUIConfig as x}from"../../ui-config-context.js";import{mergeSlotProps as L}from"../../utils/merge-slot-props.js";import{IAB_DIALOG_SHEETS as j}from"../shared/iab-dialog-sheets.js";import{SurfaceStyles as T}from"../shared/surface-styles.js";import{FeatureItem as A}from"./atoms/feature-item.js";import{IABConsentDialogOverlay as F}from"./atoms/overlay.js";import{PurposeItem as V}from"./atoms/purpose-item.js";import{StackItem as w}from"./atoms/stack-item.js";import{VendorList as P}from"./atoms/vendor-list.js";import{useIABDisplayModel as B}from"./hooks/use-display-model.js";import{useIABTranslations as R}from"./use-iab-translations.js";import*as $ from"../shared/ui/button/index.js";import*as M from"../shared/ui/tabs/index.js";let q=["iab"],z={tabIndex:-1},E=({open:E,noStyle:H,disableAnimation:D,scrollLock:W,trapFocus:G,hideBranding:O,initialTab:_,showTrigger:J=!1,models:K=q,uiSource:Q})=>{let U=R(),{common:X}=h(),{components:Y}=x(),{iab:Z,activeUI:ee,policyDialog:et,translationConfig:eo,model:en}=k({preferences:{scrollLock:W,trapFocus:G}}),{banner:ei,closeUI:er,openDialog:ea,performDialogAction:es}=g(),el=et.blocking,ed=I(eo.defaultLanguage),ec=m(null),em=m(null),ep=m(null),[eu,eg]=p(_??Z?.preferenceCenterTab??"purposes"),[eh,eb]=p(null),[ey,ef]=p(!1),[ev,eC]=p(!1),[eS,ek]=p(!1),eN=null!==en&&K.includes(en)&&(E??"dialog"===ee),eI=C({disableAnimation:D,noStyle:H,scrollLock:el,trapFocus:et.blocking}),{consentRows:ex,essentialRows:eL,essentialPartnerCount:ej,featureRows:eT,featuresStandardText:eA,purposeTabCount:eF,vendorTabCount:eV,data:{purposes:ew}}=B(),eP=Z?.gvl??null,eB=Z?.publisherRestrictions,eR=c(()=>eP?n(eP,eB):null,[eP,eB]),e$=s((e,t)=>{Z?.setPurposeConsent(e,t)},[Z]),eM=s((e,t)=>{Z?.setSpecialFeatureOptIn(e,t)},[Z]),eq=s((e,t)=>{Z?.setVendorConsent(e,t)},[Z]),ez=s((e,t)=>{Z?.setVendorLegitimateInterest(e,t)},[Z]),eE=s((e,t)=>{Z?.setPurposeLegitimateInterest(e,t)},[Z]),eH=async()=>{try{await es("accept")}catch{}},eD=async()=>{try{await es("reject")}catch{}},eW=async()=>{try{await es("customize")}catch{}},eG=s(()=>{er()},[er]),eO=e=>{eb(e),eg("vendors"),ea({tab:"vendors"})};S(!!(ev&&eN&&eI.trapFocus),ec,{initialFocus:"first-tabbable"}),N(!!(eN&&eI.scrollLock)),l(()=>{if(!eN)return;let e=e=>{i(e.key)&&(e.preventDefault(),eG())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[eG,eN]),l(()=>{let e=requestAnimationFrame(()=>eC(!0));return()=>cancelAnimationFrame(e)},[]),l(()=>{if(eN){let e=requestAnimationFrame(()=>ek(!0));return()=>cancelAnimationFrame(e)}if(eI.disableAnimation){let e=requestAnimationFrame(()=>ek(!1));return()=>cancelAnimationFrame(e)}let e=setTimeout(()=>{ek(!1)},150);return()=>clearTimeout(e)},[eN,eI.disableAnimation]);let e_=m(!!_);l(()=>{let e=Z?.preferenceCenterTab;if(!(eN&&e))return;if(e_.current){e_.current=!1;return}let t=requestAnimationFrame(()=>{eg(e)});return()=>cancelAnimationFrame(t)},[eN,Z?.preferenceCenterTab]),d(()=>{let e,t;if("purposes"!==eu&&"vendors"!==eu)return;let o=em.current;if(!o||null===ep.current)return;let n=ep.current;if(ep.current=null,!window.matchMedia("(prefers-reduced-motion: reduce)").matches)return o.style.height=`${n}px`,o.style.overflow="hidden",o.style.transition="none",e=requestAnimationFrame(()=>{t=requestAnimationFrame(()=>{if(!o)return;o.style.height="auto";let e=o.getBoundingClientRect().height;if(o.style.height=`${n}px`,1>Math.abs(n-e)){o.style.height="",o.style.overflow="",o.style.transition="";return}o.getBoundingClientRect(),o.style.transition="height 180ms cubic-bezier(0.33, 1, 0.68, 1)",o.style.height=`${e}px`,o.addEventListener("transitionend",e=>{"height"===e.propertyName&&(o.style.height="",o.style.overflow="",o.style.transition="")},{once:!0})})}),()=>{cancelAnimationFrame(e),cancelAnimationFrame(t)}},[eu]);let eJ=s(e=>{em.current&&(ep.current=em.current.offsetHeight),eg(e),ea({tab:e})},[ea]),eK=c(()=>({uiSource:Q??"iab_dialog"}),[Q]);if(!ev||!Z?.config.enabled)return null;let eQ=Z.isLoadingGVL||!Z.gvl,eU=L(Y?.["iab-dialog"]?.root,{baseClassName:`${a.root} ${eS?a.dialogVisible:a.dialogHidden}`,noStyle:eI.noStyle}),eX=L(Y?.["iab-dialog"]?.card,{baseClassName:`${a.card} ${eS?a.contentVisible:a.contentHidden}`,noStyle:eI.noStyle}),eY=L(Y?.["iab-dialog"]?.header,{baseClassName:a.header,noStyle:eI.noStyle}),eZ=L(Y?.["iab-dialog"]?.headerContent,{baseClassName:a.headerContent,noStyle:eI.noStyle}),e1=L(Y?.["iab-dialog"]?.title,{baseClassName:a.title,noStyle:eI.noStyle}),e0=L(Y?.["iab-dialog"]?.description,{baseClassName:a.description,noStyle:eI.noStyle}),e2=L(Y?.["iab-dialog"]?.closeButton,{baseClassName:a.closeButton,noStyle:eI.noStyle}),e7=L(Y?.["iab-dialog"]?.body,{baseClassName:a.body,noStyle:eI.noStyle}),e4=L(Y?.["iab-dialog"]?.tabs,{baseClassName:a.tabsContainer,noStyle:eI.noStyle}),e5=L(Y?.["iab-dialog"]?.tabsList,{baseClassName:a.tabsList,noStyle:eI.noStyle}),e8=L(Y?.["iab-dialog"]?.tabTrigger,{baseClassName:a.tabButton,noStyle:eI.noStyle}),e6=L(Y?.["iab-dialog"]?.tabIndicator,{baseClassName:a.tabIndicator,noStyle:eI.noStyle}),e3=L(Y?.["iab-dialog"]?.content,{baseClassName:a.content,noStyle:eI.noStyle}),e9=L(Y?.["iab-dialog"]?.loading,{baseClassName:a.loadingContainer,noStyle:eI.noStyle}),te=L(Y?.["iab-dialog"]?.tabPanel,{baseClassName:a.tabPanel,noStyle:eI.noStyle}),tt=L(Y?.["iab-dialog"]?.specialPurposes,{baseClassName:a.specialPurposesSection,noStyle:eI.noStyle}),to=L(Y?.["iab-dialog"]?.consentNotice,{baseClassName:a.consentNotice,noStyle:eI.noStyle}),tn=L(Y?.["iab-dialog"]?.actions,{baseClassName:r.actionRoot,noStyle:eI.noStyle}),ti=L(Y?.["iab-dialog"]?.footer,{baseClassName:a.footer,noStyle:eI.noStyle,...tn}),tr=L(Y?.["iab-dialog"]?.actionGroup,{baseClassName:r.actionGroup,"data-direction":"row",noStyle:eI.noStyle}),ta=t(f.Provider,{value:eK,children:o(v.Provider,{value:eI,children:[t(T,{sheets:j,noStyle:eI.noStyle}),t(F,{isOpen:eN}),t("div",{...eU,"data-testid":"iab-consent-dialog-root",dir:ed,children:o("div",{"aria-describedby":"iab-consent-dialog-description",...eX,ref:ec,"aria-label":U.preferenceCenter.title,"aria-modal":eI.trapFocus?"true":void 0,role:"dialog",...z,"data-testid":"iab-consent-dialog-card",children:[o("div",{...eY,children:[o("div",{...eZ,children:[t("h2",{...e1,children:U.preferenceCenter.title}),t("p",{...e0,id:"iab-consent-dialog-description",children:U.preferenceCenter.description})]}),t("button",{...e2,type:"button","data-testid":"iab-consent-dialog-close",onClick:eG,"aria-label":X.close,children:o("svg",{"aria-hidden":"true",style:{height:"1rem",width:"1rem"},viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),t("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),o(M.Root,{...e7,noStyle:!0,onValueChange:e=>eJ(e),value:eu,children:[t("div",{...e4,children:o(M.List,{...e5,noStyle:!0,children:[o(M.Trigger,{...e8,noStyle:!0,value:"purposes",children:[U.preferenceCenter.tabs.purposes,!eQ&&` (${eF})`]}),o(M.Trigger,{...e8,noStyle:!0,value:"vendors",children:[U.preferenceCenter.tabs.vendors,!eQ&&` (${eV})`]}),t("div",{...e6,"aria-hidden":"true","data-active-tab":eu})]})}),t("div",{...e3,ref:em,children:eQ?o("div",{...e9,children:[t("div",{className:a.loadingSpinner}),t("p",{className:a.loadingText,children:U.common.loading})]}):o(e,{children:[o(M.Content,{...te,forceMount:!0,noStyle:!0,value:"purposes",children:[ex.map(e=>"stack"===e.kind?t(w,{stack:e,consents:Z.purposeConsents,onToggle:e$,vendorConsents:Z.vendorConsents,onVendorToggle:eq,onVendorClick:eO,vendorLegitimateInterests:Z.vendorLegitimateInterests,onVendorLegitimateInterestToggle:ez,purposeLegitimateInterests:Z.purposeLegitimateInterests,onPurposeLegitimateInterestToggle:eE},e.testId):t(V,{purpose:e,testId:e.testId,isEnabled:"special-feature"===e.toggle?Z.specialFeatureOptIns[e.id]??!1:Z.purposeConsents[e.id]??!1,onToggle:t=>{"special-feature"===e.toggle?eM(e.id,t):e$(e.id,t)},vendorConsents:Z.vendorConsents,onVendorToggle:eq,onVendorClick:eO,vendorLegitimateInterests:Z.vendorLegitimateInterests,onVendorLegitimateInterestToggle:ez,purposeLegitimateInterests:"purpose"===e.kind?Z.purposeLegitimateInterests:void 0,onPurposeLegitimateInterestToggle:"purpose"===e.kind?eE:void 0},e.testId)),eL.length>0&&o("div",{...tt,children:[o("div",{className:a.specialPurposesHeader,children:[o("button",{type:"button","aria-expanded":ey,onClick:()=>ef(!ey),className:a.purposeTrigger,children:[t("svg",{"aria-hidden":"true",className:a.purposeArrow,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:ey?t("path",{d:"M19 9l-7 7-7-7"}):t("path",{d:"M9 5l7 7-7 7"})}),o("div",{className:a.purposeInfo,children:[o("h3",{className:a.specialPurposesTitle,children:[U.preferenceCenter.specialPurposes.title,o("svg",{"aria-hidden":"true",className:a.lockIcon,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),t("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]})]}),o("p",{className:a.purposeMeta,children:[ej," ",1===ej?U.preferenceCenter.vendorList.partnerSingular:U.preferenceCenter.vendorList.partnerPlural]})]})]}),t("div",{style:{position:"relative"},children:o("svg",{className:a.infoIcon,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-label":U.preferenceCenter.specialPurposes.tooltip,children:[t("circle",{cx:"12",cy:"12",r:"10"}),t("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),t("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]})})]}),ey&&t("div",{style:{padding:"0.75rem"},children:eL.map(e=>t(V,{purpose:e,testId:e.testId,isEnabled:!0,onToggle:()=>{},vendorConsents:Z.vendorConsents,onVendorToggle:eq,onVendorClick:eO,isLocked:!0},e.testId))})]}),eT.length>0&&o("section",{"aria-label":U.preferenceCenter.features.title,className:eI.noStyle?void 0:a.featuresSection,"data-testid":"iab-consent-dialog-features",children:[o("div",{className:eI.noStyle?void 0:a.featuresHeader,children:[t("h3",{className:eI.noStyle?void 0:a.featuresTitle,children:U.preferenceCenter.features.title}),t("p",{className:eI.noStyle?void 0:a.featuresDescription,children:eA??U.preferenceCenter.features.description})]}),t("div",{className:eI.noStyle?void 0:a.featuresList,children:eT.map(e=>t(A,{feature:e,testId:e.testId},e.testId))})]}),t("div",{...to,children:t("p",{className:a.consentNoticeText,children:U.preferenceCenter.footer.consentStorage})})]}),t(M.Content,{...te,forceMount:!0,noStyle:!0,value:"vendors",children:t(P,{vendorData:eR,purposes:ew,vendorConsents:Z.vendorConsents,onVendorToggle:eq,selectedVendorId:eh,onClearSelection:()=>eb(null),customVendors:Z.nonIABVendors,vendorLegitimateInterests:Z.vendorLegitimateInterests,onVendorLegitimateInterestToggle:ez})})]})})]}),o("div",{...ti,children:[o("div",{...tr,children:[t($.Root,{variant:"neutral",mode:"stroke",size:"small",onClick:eD,disabled:!ei.isReady,"data-action":"reject",children:U.common.rejectAll}),t($.Root,{variant:"neutral",mode:"stroke",size:"small",onClick:eH,disabled:!ei.isReady,"data-action":"accept",children:U.common.acceptAll})]}),t("div",{...tr,children:t($.Root,{variant:"primary",mode:"filled",size:"small",onClick:eW,disabled:eQ,"data-action":"customize",children:U.common.saveSettings})})]}),t(y,{hideBranding:O??!1,variant:"dialog-tag",slotContext:"iab-dialog","data-testid":"iab-consent-dialog-branding"})]})})]})}),ts=!0===J?{}:!1===J?null:J,tl=ts?t(b,{...ts}):null;return eN||eS?o(e,{children:[tl,u(ta,document.body)]}):tl};export{E as IABConsentDialog};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{Fragment as e,jsx as o,jsxs as t}from"react/jsx-runtime";import r from"@c15t/ui/styles/components/iab-consent-banner";import{forwardRef as n,useMemo as a}from"react";import{ConsentTrackingContext as s}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as i}from"../../../context/theme-context.js";import{useActiveUI as m,useModel as l,useTranslations as c}from"../../../hooks.js";import{useIABConsentManager as d}from"../../../hooks/use-iab-manager.js";import{useLateEntry as p}from"../../../hooks/use-late-entry.js";import{useTextDirection as b}from"../../../hooks/use-text-direction.js";import{useUIConfig as u}from"../../../ui-config-context.js";import{mergeSlotProps as f}from"../../../utils/merge-slot-props.js";import{IABConsentBannerOverlay as h}from"./overlay.js";let j=["iab"],g=n(({children:n,className:a,style:s,className:i,disableAnimation:d,noStyle:g,models:x=j,...N},k)=>{let v=m(),{components:y}=u(),B=l(),C=c(),$=b(C?.language??"en"),A=null!==B&&"banner"===v&&x.includes(B),I=p(A)&&!d,P=f(y?.["iab-banner"]?.root,{baseClassName:[r.root],className:a||i,noStyle:g,style:s,...N}),R=g?P.className||"":`${P.className||""} ${r.bannerVisible}${d?"":` ${r.bannerEntering}`}`;return A?t(e,{children:[o(h,{}),o("div",{ref:k,...P,className:R,"data-position":"ltr"===$?"bottom-left":"bottom-right","data-entry":I?"late":void 0,"data-testid":"iab-consent-banner-root",dir:$,tabIndex:-1,children:n})]}):null}),x=({children:e,className:t,noStyle:r,disableAnimation:n,scrollLock:m,trapFocus:l,models:c,uiSource:p,...b})=>{let{policyBanner:u}=d({prompt:{scrollLock:m,trapFocus:l}}),f=u.blocking,h=a(()=>({disableAnimation:n,noStyle:r,scrollLock:f,trapFocus:f}),[n,r,f]),j=a(()=>({uiSource:p??"iab_banner"}),[p]);return o(s.Provider,{value:j,children:o(i.Provider,{value:h,children:o(g,{disableAnimation:n,className:t,noStyle:r,models:c,...b,children:e})})})};g.displayName="IABConsentBannerRootChildren";export{x as IABConsentBannerRoot};
2
+ import{Fragment as e,jsx as t,jsxs as o}from"react/jsx-runtime";import r from"@c15t/ui/styles/components/iab-consent-banner";import{forwardRef as n,useMemo as s}from"react";import{ConsentTrackingContext as a}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as i}from"../../../context/theme-context.js";import{useActiveUI as m,useModel as l,useTranslations as c}from"../../../hooks.js";import{useIABConsentManager as d}from"../../../hooks/use-iab-manager.js";import{useLateEntry as p}from"../../../hooks/use-late-entry.js";import{useTextDirection as b}from"../../../hooks/use-text-direction.js";import{useUIConfig as f}from"../../../ui-config-context.js";import{mergeSlotProps as u}from"../../../utils/merge-slot-props.js";import{IAB_FIRST_PAINT_SHEETS as h}from"../../shared/iab-first-paint-sheets.js";import{SurfaceStyles as j}from"../../shared/surface-styles.js";import{IABConsentBannerOverlay as g}from"./overlay.js";let x=["iab"],y=n(({children:n,className:s,style:a,className:i,disableAnimation:d,noStyle:y,models:N=x,...k},v)=>{let B=m(),{components:C}=f(),$=l(),A=c(),I=b(A?.language??"en"),S=null!==$&&"banner"===B&&N.includes($),P=p(S)&&!d,R=u(C?.["iab-banner"]?.root,{baseClassName:[r.root],className:s||i,noStyle:y,style:a,...k}),E=y?R.className||"":`${R.className||""} ${r.bannerVisible}${d?"":` ${r.bannerEntering}`}`;return S?o(e,{children:[t(j,{sheets:h,noStyle:y}),t(g,{}),o("div",{ref:v,...R,className:E,"data-position":"ltr"===I?"bottom-left":"bottom-right","data-entry":P?"late":void 0,"data-testid":"iab-consent-banner-root","data-c15t-streamed":"",dir:I,tabIndex:-1,children:[n,t("span",{"data-c15t-stream-end":"",hidden:!0})]})]}):null}),N=({children:e,className:o,noStyle:r,disableAnimation:n,scrollLock:m,trapFocus:l,models:c,uiSource:p,...b})=>{let{policyBanner:f}=d({prompt:{scrollLock:m,trapFocus:l}}),u=f.blocking,h=s(()=>({disableAnimation:n,noStyle:r,scrollLock:u,trapFocus:u}),[n,r,u]),j=s(()=>({uiSource:p??"iab_banner"}),[p]);return t(a.Provider,{value:j,children:t(i.Provider,{value:h,children:t(y,{disableAnimation:n,className:o,noStyle:r,models:c,...b,children:e})})})};y.displayName="IABConsentBannerRootChildren";export{N as IABConsentBannerRoot};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{Fragment as o,jsx as e,jsxs as t}from"react/jsx-runtime";import{isDialogDismissKey as r}from"@c15t/ui/primitives/dialog";import i from"@c15t/ui/styles/components/consent-dialog";import{useEffect as n,useMemo as s,useRef as l,useState as a}from"react";import{createPortal as m}from"react-dom";import{useHeadlessConsentUI as c}from"../../../component-hooks/use-headless-consent-ui.js";import{ConsentTrackingContext as d}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as u}from"../../../context/theme-context.js";import{useActiveUI as p,useHasConsentUI as f,useModel as b}from"../../../hooks.js";import{useFocusTrap as g}from"../../../hooks/use-focus-trap.js";import{useIsHydrated as k}from"../../../hooks/use-is-hydrated.js";import{useScrollLock as h}from"../../../hooks/use-scroll-lock.js";import{useTextDirection as j}from"../../../hooks/use-text-direction.js";import{useTheme as v}from"../../../hooks/use-theme.js";import{useTranslationLanguage as y}from"../../../kernel-selector.js";import{useUIConfig as x}from"../../../ui-config-context.js";import{cnExt as F}from"../../../utils/cn.js";import{mergeSlotProps as A}from"../../../utils/merge-slot-props.js";import{Overlay as L}from"./overlay.js";let N=["opt-in","opt-out","none"],S=({children:S,open:C,models:q=N,noStyle:w,disableAnimation:D,scrollLock:E,trapFocus:H,overlay:I,uiSource:P,className:R,style:T,...V})=>{var z;let B,G,J,K=v(),{components:M}=x(),O=p(),Q=b(),U=y(),{closeUI:W,dialog:X}=c({preferences:{scrollLock:E,trapFocus:H}}),{disableAnimation:Y,noStyle:Z,scrollLock:$,trapFocus:_}=(B=K.disableAnimation,G=K.noStyle,{disableAnimation:D??B??!1,noStyle:w??G??!1,scrollLock:J=X.blocking,trapFocus:J}),oo=j(U),oe=(z=f(),!!z&&!!q.includes(Q??"opt-in")&&(C??"dialog"===O)),[ot,or]=a(!1),oi=l(null),on=l(null),os=k(),ol=K.theme?.motion?.duration?.normal;n(()=>{if(oe){let o=requestAnimationFrame(()=>or(!0));return()=>cancelAnimationFrame(o)}if(Y){let o=requestAnimationFrame(()=>or(!1));return()=>cancelAnimationFrame(o)}let o=setTimeout(()=>or(!1),Number.parseInt((ol||"200ms").replace("ms",""),10));return()=>clearTimeout(o)},[oe,Y,ol]),g(oe&&_,on,{initialFocus:"first-tabbable"}),n(()=>{if(!oe)return;let o=o=>{r(o.key)&&(o.preventDefault(),W())};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[W,oe]),h(oe&&$);let oa=Y?i.root:F(i.root,ot?i.dialogVisible:i.dialogHidden),om=A(M?.dialog?.root,{baseClassName:oa,className:R,noStyle:Z,style:T,...V}),oc=A(M?.dialog?.container,{baseClassName:F(i.container,!Y&&(ot?i.contentVisible:i.contentHidden)),noStyle:Z}),od=s(()=>({disableAnimation:Y,noStyle:Z,scrollLock:$,theme:K.theme,trapFocus:_}),[Y,K.theme,Z,$,_]),ou=s(()=>({uiSource:P??"dialog"}),[P]),op=X.blocking?"true":void 0,of=e(d.Provider,{value:ou,children:e(u.Provider,{value:od,children:oe&&t(o,{children:[X.blocking&&!1!==I?I??e(L,{open:oe}):null,e("div",{ref:oi,"data-slot":"dialog-positioner","data-blocking":op,...om,className:om.className,children:e("div",{ref:on,...oc,"aria-describedby":"consent-dialog-description","aria-labelledby":"consent-dialog-title","aria-modal":_?"true":void 0,"data-blocking":op,"data-testid":"consent-dialog-root",dir:oo,role:"dialog",tabIndex:-1,children:S})})]})})});return os?m(of,document.body):null},C=S;export{S as ConsentDialogRoot,C as Root};
2
+ import{Fragment as o,jsx as e,jsxs as t}from"react/jsx-runtime";import{isDialogDismissKey as r}from"@c15t/ui/primitives/dialog";import i from"@c15t/ui/styles/components/consent-dialog";import{useEffect as n,useMemo as s,useRef as l,useState as a}from"react";import{createPortal as m}from"react-dom";import{useHeadlessConsentUI as c}from"../../../component-hooks/use-headless-consent-ui.js";import{ConsentTrackingContext as d}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as u}from"../../../context/theme-context.js";import{useActiveUI as p,useHasConsentUI as f,useModel as h}from"../../../hooks.js";import{useFocusTrap as g}from"../../../hooks/use-focus-trap.js";import{useIABPolicyGuard as b}from"../../../hooks/use-iab-policy-guard.js";import{useIsHydrated as k}from"../../../hooks/use-is-hydrated.js";import{useScrollLock as j}from"../../../hooks/use-scroll-lock.js";import{useTextDirection as y}from"../../../hooks/use-text-direction.js";import{useTheme as v}from"../../../hooks/use-theme.js";import{useTranslationLanguage as x}from"../../../kernel-selector.js";import{useUIConfig as F}from"../../../ui-config-context.js";import{cnExt as A}from"../../../utils/cn.js";import{mergeSlotProps as L}from"../../../utils/merge-slot-props.js";import{DIALOG_SHEETS as N}from"../../shared/dialog-sheets.js";import{SurfaceStyles as S}from"../../shared/surface-styles.js";import{Overlay as C}from"./overlay.js";let q=["opt-in","opt-out","none"],w=({children:w,open:D,models:E=q,noStyle:H,disableAnimation:I,scrollLock:P,trapFocus:R,overlay:T,uiSource:V,className:z,style:B,...G})=>{var J;let K,M,O;b();let Q=v(),{components:U}=F(),W=p(),X=h(),Y=x(),{closeUI:Z,dialog:$}=c({preferences:{scrollLock:P,trapFocus:R}}),{disableAnimation:_,noStyle:oo,scrollLock:oe,trapFocus:ot}=(K=Q.disableAnimation,M=Q.noStyle,{disableAnimation:I??K??!1,noStyle:H??M??!1,scrollLock:O=$.blocking,trapFocus:O}),or=y(Y),oi=(J=f(),!!J&&!!E.includes(X??"opt-in")&&(D??"dialog"===W)),[on,os]=a(!1),ol=l(null),oa=l(null),om=k(),oc=Q.theme?.motion?.duration?.normal;n(()=>{if(oi){let o=requestAnimationFrame(()=>os(!0));return()=>cancelAnimationFrame(o)}if(_){let o=requestAnimationFrame(()=>os(!1));return()=>cancelAnimationFrame(o)}let o=setTimeout(()=>os(!1),Number.parseInt((oc||"200ms").replace("ms",""),10));return()=>clearTimeout(o)},[oi,_,oc]),g(oi&&ot,oa,{initialFocus:"first-tabbable"}),n(()=>{if(!oi)return;let o=o=>{r(o.key)&&(o.preventDefault(),Z())};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[Z,oi]),j(oi&&oe);let od=_?i.root:A(i.root,on?i.dialogVisible:i.dialogHidden),ou=L(U?.dialog?.root,{baseClassName:od,className:z,noStyle:oo,style:B,...G}),op=L(U?.dialog?.container,{baseClassName:A(i.container,!_&&(on?i.contentVisible:i.contentHidden)),noStyle:oo}),of=s(()=>({disableAnimation:_,noStyle:oo,scrollLock:oe,theme:Q.theme,trapFocus:ot}),[_,Q.theme,oo,oe,ot]),oh=s(()=>({uiSource:V??"dialog"}),[V]),og=$.blocking?"true":void 0,ob=e(d.Provider,{value:oh,children:e(u.Provider,{value:of,children:oi&&t(o,{children:[e(S,{sheets:N,noStyle:oo}),$.blocking&&!1!==T?T??e(C,{open:oi}):null,e("div",{ref:ol,"data-slot":"dialog-positioner","data-blocking":og,...ou,className:ou.className,children:e("div",{ref:oa,...op,"aria-describedby":"consent-dialog-description","aria-labelledby":"consent-dialog-title","aria-modal":ot?"true":void 0,"data-blocking":og,"data-testid":"consent-dialog-root",dir:or,role:"dialog",tabIndex:-1,children:w})})]})})});return om?m(ob,document.body):null},D=w;export{w as ConsentDialogRoot,D as Root};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as o}from"react/jsx-runtime";import{createContext as r,useContext as t,useMemo as e}from"react";import{createPortal as i}from"react-dom";import{useConsentDialogTrigger as s}from"../../../component-hooks/use-panel-trigger.js";import{useBranding as n}from"../../../hooks.js";import{useIsHydrated as g}from"../../../hooks/use-is-hydrated.js";import{useDraggable as m}from"../use-draggable.js";let a=r(null),l=function(){let o=t(a);if(!o)throw Error("ConsentDialogTrigger components must be used within a ConsentDialogTrigger.Root");return o},u=({children:r,defaultPosition:t="bottom-right",persistPosition:l=!0,showWhen:u="always",visible:p,onPositionChange:d,onClick:c})=>{let f=n()??"c15t",{isVisible:h,openDialog:T}=s({onClick:c,showWhen:u}),C=p??h,{corner:b,isDragging:j,isSnapping:x,wasDragged:y,handlers:k,dragStyle:w}=m({defaultPosition:t,onPositionChange:d,persistPosition:l}),D=g(),P=e(()=>({branding:f,corner:b,dragStyle:w,handlers:k,isDragging:j,isSnapping:x,isVisible:C,openDialog:T,wasDragged:y}),[f,b,w,k,j,x,C,T,y]);return D&&C?i(o(a.Provider,{value:P,children:r}),document.body):null};u.displayName="ConsentDialogTrigger.Root";export{a as TriggerContext,u as TriggerRoot,l as useTriggerContext};
2
+ import{jsx as r,jsxs as o}from"react/jsx-runtime";import{createContext as t,useContext as e,useMemo as s}from"react";import{createPortal as i}from"react-dom";import{useConsentDialogTrigger as n}from"../../../component-hooks/use-panel-trigger.js";import{useBranding as m}from"../../../hooks.js";import{useIsHydrated as g}from"../../../hooks/use-is-hydrated.js";import{FIRST_PAINT_SHEETS as a}from"../../shared/first-paint-sheets.js";import{SurfaceStyles as l}from"../../shared/surface-styles.js";import{useDraggable as p}from"../use-draggable.js";let u=t(null),f=function(){let r=e(u);if(!r)throw Error("ConsentDialogTrigger components must be used within a ConsentDialogTrigger.Root");return r},d=({children:t,defaultPosition:e="bottom-right",persistPosition:f=!0,showWhen:d="always",visible:h,onPositionChange:c,onClick:j})=>{let T=m()??"c15t",{isVisible:C,openDialog:b}=n({onClick:j,showWhen:d}),x=h??C,{corner:y,isDragging:k,isSnapping:w,wasDragged:D,handlers:P,dragStyle:R}=p({defaultPosition:e,onPositionChange:c,persistPosition:f}),v=g(),E=s(()=>({branding:T,corner:y,dragStyle:R,handlers:P,isDragging:k,isSnapping:w,isVisible:x,openDialog:b,wasDragged:D}),[T,y,R,P,k,w,x,b,D]);return v&&x?i(o(u.Provider,{value:E,children:[r(l,{sheets:a}),t]}),document.body):null};d.displayName="ConsentDialogTrigger.Root";export{u as TriggerContext,d as TriggerRoot,f as useTriggerContext};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as r}from"react/jsx-runtime";import e from"@c15t/ui/styles/components/consent-manager";import{useMemo as t}from"react";import{Box as o}from"../../shared/primitives/box.js";import{ConsentTrackingContext as i,useConsentTracking as n}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as m}from"../../../context/theme-context.js";import{ConsentDraftProvider as s}from"../../../draft.js";import{useHasConsentUI as c}from"../../../hooks.js";import{useTextDirection as a}from"../../../hooks/use-text-direction.js";import{useTranslationLanguage as l}from"../../../kernel-selector.js";let d=({children:d,noStyle:p=!1,disableAnimation:u=!1,useProvider:f=!0,uiSource:h})=>{let j=a(l()),x=n(),g=t(()=>({disableAnimation:u,noStyle:p}),[u,p]),v=h??x.uiSource??"widget",k=t(()=>({uiSource:v}),[v]);if(!c())return null;let P=r(o,{baseClassName:e.manager,"data-testid":"consent-widget-root",slotKey:"manager.root",dir:j,children:d});return f?r(i.Provider,{value:k,children:r(m.Provider,{value:g,children:r(s,{children:P})})}):r(i.Provider,{value:k,children:r(s,{children:P})})},p=d;export{d as ConsentWidgetRoot,p as Root};
2
+ import{Fragment as e,jsx as r,jsxs as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/consent-manager";import{useMemo as i}from"react";import{DIALOG_SHEETS as s}from"../../shared/dialog-sheets.js";import{Box as m}from"../../shared/primitives/box.js";import{SurfaceStyles as n}from"../../shared/surface-styles.js";import{ConsentTrackingContext as c,useConsentTracking as a}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as l}from"../../../context/theme-context.js";import{ConsentDraftProvider as d}from"../../../draft.js";import{useHasConsentUI as f}from"../../../hooks.js";import{useTextDirection as h}from"../../../hooks/use-text-direction.js";import{useTranslationLanguage as p}from"../../../kernel-selector.js";let u=({children:u,noStyle:j=!1,disableAnimation:g=!1,useProvider:x=!0,uiSource:v})=>{let k=h(p()),y=a(),P=i(()=>({disableAnimation:g,noStyle:j}),[g,j]),S=v??y.uiSource??"widget",b=i(()=>({uiSource:S}),[S]);if(!f())return null;let w=t(e,{children:[r(n,{sheets:s,noStyle:j}),r(m,{baseClassName:o.manager,"data-testid":"consent-widget-root",slotKey:"manager.root",dir:k,children:u})]});return x?r(c.Provider,{value:b,children:r(l.Provider,{value:P,children:r(d,{children:w})})}):r(c.Provider,{value:b,children:r(d,{children:w})})},j=u;export{u as ConsentWidgetRoot,j as Root};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{Fragment as o,jsx as t,jsxs as e}from"react/jsx-runtime";import r from"@c15t/ui/styles/components/consent-banner";import{forwardRef as n,useMemo as i}from"react";import{useHeadlessConsentUI as a}from"../../../component-hooks/use-headless-consent-ui.js";import{ConsentTrackingContext as s}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as l}from"../../../context/theme-context.js";import{useActiveUI as c,useHasConsentUI as m,useModel as p,usePolicyRule as d,useTranslations as u}from"../../../hooks.js";import{useLateEntry as f}from"../../../hooks/use-late-entry.js";import{useTextDirection as v}from"../../../hooks/use-text-direction.js";import{useUIConfig as b}from"../../../ui-config-context.js";import{defaultTranslationConfig as g}from"../../../utils/default-translation-config.js";import{mergeSlotProps as h}from"../../../utils/merge-slot-props.js";import{ConsentBannerSurfaceContext as j,mirrorDefaultPosition as k,useConsentBannerSurface as x}from"../surface-context.js";import{Overlay as N}from"./overlay.js";let y=["opt-in","opt-out"],S=n(({asChild:n,children:i,className:a,style:s,className:l,disableAnimation:j,noStyle:S,models:C=y,...$},L)=>{let P=c(),{components:R}=b(),B=m(),F=p()??"opt-in",A=d(),E=x(),V=u(),q=v(V?.language??g.defaultLanguage),w=k(E.position,E.positionSource,E.variant,q),z=B&&"banner"===P&&C.includes(F),D=f(z)&&!j,G=h(R?.banner?.root,{baseClassName:r.root,className:a||l,noStyle:S,style:s,...$}),H=S?G.className||"":`${G.className||""} ${j?"":`${r.bannerVisible} ${r.bannerEntering}`}`;return z?e(o,{children:[t(N,{}),t("div",{ref:L,...G,className:H,"data-variant":E.variant,"data-position":w,"data-blocking":E.blocking?"true":void 0,"data-prompt":A.prompt,"data-model":A.model,"data-entry":D?"late":void 0,"data-testid":"consent-banner-root",dir:q,children:i})]}):null}),C=({children:o,className:e,noStyle:r,disableAnimation:n,scrollLock:c,trapFocus:m,models:p,uiSource:d,variant:u,position:f,blocking:v,...b})=>{let{banner:g}=a({prompt:{blocking:v,position:f,scrollLock:c,trapFocus:m,variant:u}}),h=g.scrollLock,k=g.trapFocus,x=i(()=>({disableAnimation:n,noStyle:r,scrollLock:h,trapFocus:k}),[n,r,h,k]),N=i(()=>({blocking:g.blocking,position:g.position,positionSource:g.positionSource,variant:g.variant}),[g.blocking,g.position,g.positionSource,g.variant]),y=i(()=>({uiSource:d??"banner"}),[d]);return t(s.Provider,{value:y,children:t(l.Provider,{value:x,children:t(j.Provider,{value:N,children:t(S,{disableAnimation:n,className:e,noStyle:r,models:p,...b,children:o})})})})};S.displayName="ConsentBannerRootChildren";let $=C;export{C as ConsentBannerRoot,$ as Root};
2
+ import{Fragment as o,jsx as t,jsxs as e}from"react/jsx-runtime";import r from"@c15t/ui/styles/components/consent-banner";import{forwardRef as n,useMemo as i}from"react";import{useHeadlessConsentUI as s}from"../../../component-hooks/use-headless-consent-ui.js";import{ConsentTrackingContext as a}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as l}from"../../../context/theme-context.js";import{useActiveUI as m,useHasConsentUI as c,useModel as p,usePolicyRule as d,useTranslations as u}from"../../../hooks.js";import{useIABPolicyGuard as f}from"../../../hooks/use-iab-policy-guard.js";import{useLateEntry as h}from"../../../hooks/use-late-entry.js";import{useTextDirection as b}from"../../../hooks/use-text-direction.js";import{useUIConfig as j}from"../../../ui-config-context.js";import{defaultTranslationConfig as v}from"../../../utils/default-translation-config.js";import{mergeSlotProps as g}from"../../../utils/merge-slot-props.js";import{FIRST_PAINT_SHEETS as k}from"../../shared/first-paint-sheets.js";import{StreamedSurface as y}from"../../shared/streamed-surface.js";import{SurfaceStyles as x}from"../../shared/surface-styles.js";import{ConsentBannerSurfaceContext as N,mirrorDefaultPosition as S,useConsentBannerSurface as C}from"../surface-context.js";import{Overlay as $}from"./overlay.js";let L=["opt-in","opt-out"],P=n(({asChild:n,children:i,className:s,style:a,className:l,disableAnimation:y,noStyle:N,models:P=L,...R},B)=>{f();let F=m(),{components:A}=j(),E=c(),V=p()??"opt-in",q=d(),w=C(),z=u(),D=b(z?.language??v.defaultLanguage),G=S(w.position,w.positionSource,w.variant,D),H=E&&"banner"===F&&P.includes(V),I=h(H)&&!y,J=g(A?.banner?.root,{baseClassName:r.root,className:s||l,noStyle:N,style:a,...R}),K=N?J.className||"":`${J.className||""} ${y?"":`${r.bannerVisible} ${r.bannerEntering}`}`;return H?e(o,{children:[t(x,{sheets:k,noStyle:N}),t($,{}),t("div",{ref:B,...J,className:K,"data-variant":w.variant,"data-position":G,"data-blocking":w.blocking?"true":void 0,"data-prompt":q.prompt,"data-model":q.model,"data-entry":I?"late":void 0,"data-testid":"consent-banner-root",dir:D,children:i})]}):null}),R=({children:o,className:e,noStyle:r,disableAnimation:n,scrollLock:m,trapFocus:c,models:p,uiSource:d,variant:u,position:f,blocking:h,...b})=>{let{banner:j}=s({prompt:{blocking:h,position:f,scrollLock:m,trapFocus:c,variant:u}}),v=j.scrollLock,g=j.trapFocus,k=i(()=>({disableAnimation:n,noStyle:r,scrollLock:v,trapFocus:g}),[n,r,v,g]),y=i(()=>({blocking:j.blocking,position:j.position,positionSource:j.positionSource,variant:j.variant}),[j.blocking,j.position,j.positionSource,j.variant]),x=i(()=>({uiSource:d??"banner"}),[d]);return t(a.Provider,{value:x,children:t(l.Provider,{value:k,children:t(N.Provider,{value:y,children:t(P,{disableAnimation:n,className:e,noStyle:r,models:p,...b,children:o})})})})};P.displayName="ConsentBannerRootChildren";let B=o=>t(y,{children:t(R,{...o})}),F=B;export{B as ConsentBannerRoot,F as Root};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as t,jsxs as n}from"react/jsx-runtime";import e from"@c15t/ui/styles/components/consent-actions";import r from"@c15t/ui/styles/components/consent-banner";import{Fragment as o}from"react";import{useHeadlessConsentUI as i}from"../../component-hooks/use-headless-consent-ui.js";import{Box as a}from"../shared/primitives/box.js";import{BrandingLink as s}from"../shared/ui/branding.js";import{useComponentConfig as c}from"../../hooks/use-component-config.js";import{ConsentBannerRoot as l}from"./atoms/root.js";import{ConsentBannerAcceptButton as d,ConsentBannerCard as m,ConsentBannerCustomizeButton as p,ConsentBannerDescription as u,ConsentBannerDismissButton as h,ConsentBannerFooter as b,ConsentBannerFooterSubGroup as f,ConsentBannerHeader as y,ConsentBannerRejectButton as g,ConsentBannerRights as j,ConsentBannerTitle as A}from"./components.js";import{ErrorBoundary as k}from"./error-boundary.js";import{resolveBannerPrimaryActions as v}from"./resolve-banner-primary-actions.js";let N=({noStyle:N,disableAnimation:S,scrollLock:w,trapFocus:C,title:L,description:x,rejectButtonText:z,customizeButtonText:F,acceptButtonText:P,dismissButtonText:B,legalLinks:$,hideBranding:G=!1,layout:E,direction:K,primaryButton:R,models:U,uiSource:q,variant:D,position:H,blocking:I})=>{let{banner:J}=i({prompt:{blocking:I,direction:K,layout:E,position:H,primaryActions:"string"==typeof R?[R]:R,scrollLock:w,trapFocus:C,variant:D}}),M=c({disableAnimation:S,noStyle:N,scrollLock:J.scrollLock,trapFocus:J.trapFocus}),{orderedActions:O}=J,Q=new Set(O),T=v(J.primaryActions,O),V=J.actionGroups,W=J.direction,{shouldFillActions:X}=J,Y=(n,e)=>{if(!Q.has(n))return null;let r=T.includes(n);switch(n){case"reject":return t(g,{consentAction:"reject",isPrimary:r,className:e,"data-action":"reject","data-testid":"consent-banner-reject-button",children:z});case"accept":return t(d,{consentAction:"accept",isPrimary:r,className:e,"data-action":"accept","data-testid":"consent-banner-accept-button",children:P});case"customize":return t(p,{consentAction:"customize",isPrimary:r,className:e,"data-action":"customize","data-testid":"consent-banner-customize-button",children:F});case"dismiss":return t(h,{consentAction:"dismiss",isPrimary:r,className:e,"data-action":"dismiss","data-testid":"consent-banner-dismiss-button",children:B});case"save":return null;default:throw Error(`Unhandled consent banner button type: ${n}`)}};return t(k,{fallback:t("div",{children:"Something went wrong with the Consent Banner."}),children:t(l,{...M,models:U,uiSource:q,variant:D,position:H,blocking:I,children:n(a,{baseClassName:r.cardShell,slotKey:"banner.cardShell",children:[t(s,{hideBranding:G,variant:"banner-tag",slotContext:"banner","data-testid":"consent-banner-branding"}),n(m,{children:[n(y,{children:[t(A,{children:L}),t(u,{legalLinks:$,children:x})]}),n(b,{className:e.actionRoot,"data-direction":W,"data-fill":!!X||void 0,"data-split":V.length>1&&!X||void 0,children:[t(j,{rights:J.preferenceControls}),V.map((n,r)=>{if(Array.isArray(n)){let i=n.filter(t=>Q.has(t));if(0===i.length)return null;let a=n.join("-");return t(f,{className:e.actionGroup,"data-direction":W,"data-fill":!!X||void 0,children:i.map(n=>t(o,{children:Y(n)},n))},a?`group-${a}`:`group-${r}`)}return Q.has(n)?t(o,{children:Y(n)},n):null})]})]})]})})})};export{N as ConsentBanner};
2
+ import{jsx as t,jsxs as n}from"react/jsx-runtime";import e from"@c15t/ui/styles/components/consent-actions";import r from"@c15t/ui/styles/components/consent-banner";import{Fragment as o}from"react";import{useHeadlessConsentUI as i}from"../../component-hooks/use-headless-consent-ui.js";import{Box as s}from"../shared/primitives/box.js";import{BrandingLink as a}from"../shared/ui/branding.js";import{useComponentConfig as c}from"../../hooks/use-component-config.js";import{useIABPolicyGuard as l}from"../../hooks/use-iab-policy-guard.js";import{StreamedSurface as d}from"../shared/streamed-surface.js";import{ConsentBannerRoot as m}from"./atoms/root.js";import{ConsentBannerAcceptButton as p,ConsentBannerCard as u,ConsentBannerCustomizeButton as h,ConsentBannerDescription as b,ConsentBannerDismissButton as f,ConsentBannerFooter as y,ConsentBannerFooterSubGroup as g,ConsentBannerHeader as j,ConsentBannerRejectButton as k,ConsentBannerRights as A,ConsentBannerTitle as v}from"./components.js";import{ErrorBoundary as N}from"./error-boundary.js";import{resolveBannerPrimaryActions as S}from"./resolve-banner-primary-actions.js";let w=({noStyle:d,disableAnimation:w,scrollLock:C,trapFocus:L,title:x,description:z,rejectButtonText:F,customizeButtonText:P,acceptButtonText:B,dismissButtonText:$,legalLinks:G,hideBranding:E=!1,layout:K,direction:R,primaryButton:U,models:q,uiSource:D,variant:H,position:I,blocking:J})=>{l();let{banner:M}=i({prompt:{blocking:J,direction:R,layout:K,position:I,primaryActions:"string"==typeof U?[U]:U,scrollLock:C,trapFocus:L,variant:H}}),O=c({disableAnimation:w,noStyle:d,scrollLock:M.scrollLock,trapFocus:M.trapFocus}),{orderedActions:Q}=M,T=new Set(Q),V=S(M.primaryActions,Q),W=M.actionGroups,X=M.direction,{shouldFillActions:Y}=M,Z=(n,e)=>{if(!T.has(n))return null;let r=V.includes(n);switch(n){case"reject":return t(k,{consentAction:"reject",isPrimary:r,className:e,"data-action":"reject","data-testid":"consent-banner-reject-button",children:F});case"accept":return t(p,{consentAction:"accept",isPrimary:r,className:e,"data-action":"accept","data-testid":"consent-banner-accept-button",children:B});case"customize":return t(h,{consentAction:"customize",isPrimary:r,className:e,"data-action":"customize","data-testid":"consent-banner-customize-button",children:P});case"dismiss":return t(f,{consentAction:"dismiss",isPrimary:r,className:e,"data-action":"dismiss","data-testid":"consent-banner-dismiss-button",children:$});case"save":return null;default:throw Error(`Unhandled consent banner button type: ${n}`)}};return t(N,{fallback:t("div",{children:"Something went wrong with the Consent Banner."}),children:t(m,{...O,models:q,uiSource:D,variant:H,position:I,blocking:J,children:n(s,{baseClassName:r.cardShell,slotKey:"banner.cardShell",children:[t(a,{hideBranding:E,variant:"banner-tag",slotContext:"banner","data-testid":"consent-banner-branding"}),n(u,{children:[n(j,{children:[t(v,{children:x}),t(b,{legalLinks:G,children:z})]}),n(y,{className:e.actionRoot,"data-direction":X,"data-fill":!!Y||void 0,"data-split":W.length>1&&!Y||void 0,children:[t(A,{rights:M.preferenceControls}),W.map((n,r)=>{if(Array.isArray(n)){let i=n.filter(t=>T.has(t));if(0===i.length)return null;let s=n.join("-");return t(g,{className:e.actionGroup,"data-direction":X,"data-fill":!!Y||void 0,children:i.map(n=>t(o,{children:Z(n)},n))},s?`group-${s}`:`group-${r}`)}return T.has(n)?t(o,{children:Z(n)},n):null})]})]})]})})})},C=n=>t(d,{children:t(w,{...n})});export{C as ConsentBanner};
@@ -0,0 +1 @@
1
+ import*as t from"@c15t/ui/styles/sheets/dialog";import*as s from"@c15t/ui/styles/sheets/first-paint";let e=[s,t];export{e as DIALOG_SHEETS};
@@ -0,0 +1 @@
1
+ import*as t from"@c15t/ui/styles/sheets/first-paint";let s=[t];export{s as FIRST_PAINT_SHEETS};
@@ -0,0 +1 @@
1
+ import*as s from"@c15t/ui/styles/sheets/dialog";import*as t from"@c15t/ui/styles/sheets/iab-dialog";import{IAB_FIRST_PAINT_SHEETS as i}from"./iab-first-paint-sheets.js";let e=[...i,s,t];export{e as IAB_DIALOG_SHEETS};
@@ -0,0 +1 @@
1
+ import*as t from"@c15t/ui/styles/sheets/iab-first-paint";import{FIRST_PAINT_SHEETS as s}from"./first-paint-sheets.js";let i=[...s,t];export{i as IAB_FIRST_PAINT_SHEETS};
@@ -1 +1 @@
1
- import{jsxs as e}from"react/jsx-runtime";import t from"@c15t/ui/styles/components/legal-links";import{resolveTranslations as l}from"@c15t/ui/utils";import{useContext as n,useMemo as r,useSyncExternalStore as i}from"react";import{KernelContext as s}from"../../../../context.js";import{V3UIConfigContext as o,useUIConfig as a}from"../../../../ui-config-context.js";import{defaultTranslationConfig as u}from"../../../../utils/default-translation-config.js";import{mergeSlotProps as g}from"../../../../utils/merge-slot-props.js";let m=()=>()=>void 0,c=function(){let e=n(s),t=i(e?t=>e.subscribe(t):m,()=>e?.getSnapshot().translations??null,()=>e?.getServerSnapshot().translations??null);return r(()=>t?.translations?t.translations.legalLinks:l({},u).legalLinks,[t])},f=function(e){let t=n(o).legalLinks;return null==e?null:Object.fromEntries(Object.entries(t??{}).filter(([t])=>e.includes(t)))},p=({links:l,context:n,testIdPrefix:r})=>{let i=f(l),s=c(),{components:o}=a(),u=g(o?.["legal-links"]?.root,{}),m=g(o?.link?.[n],{baseClassName:t.legalLink});return i&&0!==Object.keys(i).length?e("span",{...u,children:[" ",Object.entries(i).map(([t,l],n,i)=>l?e("span",{children:[e("a",{href:l.href,target:l.target||"_blank",rel:l.rel||("_blank"===l.target?"noopener noreferrer":void 0),...m,"data-testid":r?`${r}-${t}`:void 0,children:[l.label??s?.[t],n<i.length-1&&","]}),n<i.length-1&&" "]},String(t)):null)]}):null};export{p as InlineLegalLinks,f as useFilteredLegalLinks};
1
+ import{jsxs as e}from"react/jsx-runtime";import t from"@c15t/ui/styles/components/legal-links";import{resolveTranslations as l}from"@c15t/ui/utils";import{useContext as n,useMemo as r,useSyncExternalStore as i}from"react";import{KernelContext as s}from"../../../../context.js";import{useServerSnapshot as o}from"../../../../kernel-selector.js";import{V3UIConfigContext as a,useUIConfig as m}from"../../../../ui-config-context.js";import{defaultTranslationConfig as u}from"../../../../utils/default-translation-config.js";import{mergeSlotProps as c}from"../../../../utils/merge-slot-props.js";let g=()=>()=>void 0,f=function(){let e=n(s),t=o(e),a=i(e?t=>e.subscribe(t):g,()=>e?.getSnapshot().translations??null,()=>t()?.translations??null);return r(()=>a?.translations?a.translations.legalLinks:l({},u).legalLinks,[a])},p=function(e){let t=n(a).legalLinks;return null==e?null:Object.fromEntries(Object.entries(t??{}).filter(([t])=>e.includes(t)))},k=({links:l,context:n,testIdPrefix:r})=>{let i=p(l),s=f(),{components:o}=m(),a=c(o?.["legal-links"]?.root,{}),u=c(o?.link?.[n],{baseClassName:t.legalLink});return i&&0!==Object.keys(i).length?e("span",{...a,children:[" ",Object.entries(i).map(([t,l],n,i)=>l?e("span",{children:[e("a",{href:l.href,target:l.target||"_blank",rel:l.rel||("_blank"===l.target?"noopener noreferrer":void 0),...u,"data-testid":r?`${r}-${t}`:void 0,children:[l.label??s?.[t],n<i.length-1&&","]}),n<i.length-1&&" "]},String(t)):null)]}):null};export{k as InlineLegalLinks,p as useFilteredLegalLinks};
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{jsx as e}from"react/jsx-runtime";import{HydrationSnapshotContext as r,StreamedPrefetchContext as t}from"../../context.js";import{useKernel as o}from"../../kernel-selector.js";import*as l from"react";let u="u"<typeof document?l.useEffect:l.useLayoutEffect,n=function(e){if("fulfilled"===e.status)return e.value;throw e},a=function(e){let{use:r}=l;return r?r(e):n(e)},d=({children:l,streamed:n})=>{let d=o(),s=a(n.settled),c=n.snapshotFor(s);return u(()=>{n.adopt(s)},[n,s]),e(r.Provider,{value:c===d.getServerSnapshot()?null:c,children:e(t.Provider,{value:void 0,children:l})})},s=({children:r})=>{let o=(0,l.useContext)(t);return o?e(l.Suspense,{fallback:null,children:e(d,{streamed:o,children:r})}):r};export{s as StreamedSurface,n as readRecorded};
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{jsx as e}from"react/jsx-runtime";import{useContext as t,version as r}from"react";import{GlobalThemeContext as n}from"../../context/theme-context.js";import{useUIConfig as o}from"../../ui-config-context.js";let c=Number.parseInt(r,10)>=19,s=({sheets:r,noStyle:s})=>{let{nonce:m,styles:i}=o(),l=t(n);return!1===i||s||l.noStyle?null:r.map(t=>c&&!m?e("style",{href:t.id,precedence:"c15t",children:t.css},t.id):e("style",{"data-c15t-styles":t.id,nonce:m,dangerouslySetInnerHTML:{__html:t.css}},t.id))};export{s as SurfaceStyles};
package/dist/context.js CHANGED
@@ -1 +1 @@
1
- import{createContext as e}from"react";let t=e(null);t.displayName="C15tKernelContext";let l=e(null);export{t as KernelContext,l as ProviderServicesContext};
1
+ import{createContext as e}from"react";let t=e(null);t.displayName="C15tKernelContext";let n=e(null),o=e(void 0),r=e(null);export{r as HydrationSnapshotContext,t as KernelContext,n as ProviderServicesContext,o as StreamedPrefetchContext};
@@ -0,0 +1 @@
1
+ import{IABUnavailableError as r,policyNeedsIAB as o}from"@c15t/core";import{useContext as i}from"react";import{IABContext as e}from"../context/iab-context-value.js";import{useKernelSelector as a}from"../kernel-selector.js";let t=Symbol.for("c15t.react.iab-provider"),c=function(){globalThis[t]=!0},n=function(){return new r("no <IABProvider> is mounted","Wrap your IAB consent UI in <IABProvider> from '@c15t/react/iab' (or 'c15t/react/iab')")},s=function(){let r=i(e);if(a(o)&&null===r&&!0!==globalThis[t])throw n()};export{c as markIABProviderLoaded,n as missingIABProviderError,s as useIABPolicyGuard};
package/dist/hooks.js CHANGED
@@ -1 +1 @@
1
- import{applyExperimentAssignment as e,applyExperimentTheme as s,isVendorAllowed as o}from"@c15t/core";import{hasConsentPreferences as n,hasConsentUI as t,showConsentSurface as u}from"@c15t/core/surface-actions";import{useCallback as r,useContext as i,useMemo as a,useSyncExternalStore as c}from"react";import{ProviderServicesContext as f}from"./context.js";import{useGateSelector as l,useKernel as h,useKernelSelector as d}from"./kernel-selector.js";import{useUIConfig as m}from"./ui-config-context.js";let p=function(){let e=h();return c(s=>e.subscribe(s),()=>e.getSnapshot(),()=>e.getServerSnapshot())},k=function(e){return d(s=>s.effectivePermissions[e])},_=function(){return d(e=>e.effectivePermissions)},C=function(){return d(e=>e.overrides)},g=function(){return d(e=>e.user)},P=function(){return d(e=>e.location)},v=function(){return d(e=>e.translations)},S=function(){return d(e=>e.branding)},y=function(){return d(e=>"matched"===e.resolution.status)},I=function(){return d(t)},R=function(){return d(n)},b=function(){return d(e=>"matched"===e.resolution.status?e.model:null)},A=function(){return d(e=>e.activeUI)},x=function(){return d(e=>e.policyRule.scope)},U=function(){return d(e=>e.policyRule.scopeMode)},E=function(){return d(e=>e.iab)},T=function(){return d(e=>e.iab?.enabled??!1)},V=function(e){let s=String(e);return d(e=>e.iab?.vendorConsents[s]??!1)},D=function(e){return d(s=>s.iab?.purposeConsents[e]??!1)},O=function(e){return d(s=>s.iab?.specialFeatureOptIns[e]??!1)},B=function(){return d(e=>e.iab?.tcString??null)},H=[],L=function(){return d(e=>"iab"===e.model?H:e.vendors?.declared??H)},M=function(){return d(e=>e.vendorChoice)},N=function(e){return l((s,n)=>o(s,e,n))},j=function(){return h().set.registerConsentCategories},q=function(){return h().set.overrides},F=function(){let e=h(),s=i(f);return r(o=>{s?s.setLanguage(o):o!==e.getSnapshot().overrides.language&&(e.set.language(o),e.commands.init())},[e,s])},w=function(){let e=h();return r(s=>u(e,s),[e])},z=function(){return h().commands.save},G=function(){let e=h();return r(s=>e.events.on("permissions:changed",({snapshot:e})=>s(e.effectivePermissions)),[e])},J=function(){return h().commands.identify},K=function(){return h().commands.init},Q=function(){return d(e=>e.explicitChoice)},W=function(){return d(e=>e.effectivePermissions)},X=function(){return d(e=>e.promptRequirement)},Y=function(){return d(e=>e.noticeDismissal)},Z=function(){return d(e=>e.privacySignals)},$=function(){return d(e=>e.resolution)},ee=function(){return d(e=>e.policyRule)},es=function(){return d(e=>e.restrictions)},eo=function(){return h().commands.dismissNotice},en=function(){return d(e=>e.experiment)},et=function(){let{experiment:s,presentation:o}=m(),n=en();return a(()=>e(o,s,n),[o,s,n])},eu=function(){let{experiment:e,theme:o}=m(),n=en();return a(()=>s(o,e,n),[o,e,n])},er={},ei={},ea=function(){return et()?.prompt??er},ec=function(){return et()?.preferences??ei};export{A as useActiveUI,S as useBranding,k as useConsent,_ as useConsents,L as useDeclaredVendors,eo as useDismissNotice,W as useEffectivePermissions,en as useExperiment,Q as useExplicitChoice,y as useHasConsentPolicy,R as useHasConsentPreferences,I as useHasConsentUI,T as useIABEnabled,E as useIABSnapshot,J as useIdentify,K as useInit,P as useLocation,b as useModel,Y as useNoticeDismissal,C as useOverrides,x as usePolicyCategories,$ as usePolicyResolution,ee as usePolicyRule,U as usePolicyScopeMode,ec as usePreferencesPresentation,Z as usePrivacySignals,ea as usePromptPresentation,X as usePromptRequirement,D as usePurposeConsent,j as useRegisterConsentCategories,et as useResolvedPresentation,eu as useResolvedTheme,es as useRestrictions,z as useSaveConsents,w as useSetActiveUI,F as useSetLanguage,q as useSetOverrides,p as useSnapshot,O as useSpecialFeatureOptIn,G as useSubscribeToConsentChanges,B as useTCString,v as useTranslations,g as useUser,N as useVendorAllowed,M as useVendorChoice,V as useVendorConsent};
1
+ import{applyExperimentAssignment as e,applyExperimentTheme as s,isVendorAllowed as o}from"@c15t/core";import{hasConsentPreferences as n,hasConsentUI as t,showConsentSurface as u}from"@c15t/core/surface-actions";import{useCallback as r,useContext as i,useMemo as a,useSyncExternalStore as c}from"react";import{ProviderServicesContext as f}from"./context.js";import{useGateSelector as l,useKernel as h,useKernelSelector as d,useServerSnapshot as m}from"./kernel-selector.js";import{useUIConfig as k}from"./ui-config-context.js";let p=function(){let e=h();return c(s=>e.subscribe(s),()=>e.getSnapshot(),m(e))},_=function(e){return d(s=>s.effectivePermissions[e])},C=function(){return d(e=>e.effectivePermissions)},g=function(){return d(e=>e.overrides)},P=function(){return d(e=>e.user)},v=function(){return d(e=>e.location)},S=function(){return d(e=>e.translations)},y=function(){return d(e=>e.branding)},I=function(){return d(e=>"matched"===e.resolution.status)},R=function(){return d(t)},b=function(){return d(n)},A=function(){return d(e=>"matched"===e.resolution.status?e.model:null)},x=function(){return d(e=>e.activeUI)},U=function(){return d(e=>e.policyRule.scope)},E=function(){return d(e=>e.policyRule.scopeMode)},T=function(){return d(e=>e.iab)},V=function(){return d(e=>e.iab?.enabled??!1)},D=function(e){let s=String(e);return d(e=>e.iab?.vendorConsents[s]??!1)},O=function(e){return d(s=>s.iab?.purposeConsents[e]??!1)},B=function(e){return d(s=>s.iab?.specialFeatureOptIns[e]??!1)},H=function(){return d(e=>e.iab?.tcString??null)},L=[],M=function(){return d(e=>"iab"===e.model?L:e.vendors?.declared??L)},N=function(){return d(e=>e.vendorChoice)},j=function(e){return l((s,n)=>o(s,e,n))},q=function(){return h().set.registerConsentCategories},F=function(){return h().set.overrides},w=function(){let e=h(),s=i(f);return r(o=>{s?s.setLanguage(o):o!==e.getSnapshot().overrides.language&&(e.set.language(o),e.commands.init())},[e,s])},z=function(){let e=h();return r(s=>u(e,s),[e])},G=function(){return h().commands.save},J=function(){let e=h();return r(s=>e.events.on("permissions:changed",({snapshot:e})=>s(e.effectivePermissions)),[e])},K=function(){return h().commands.identify},Q=function(){return h().commands.init},W=function(){return d(e=>e.explicitChoice)},X=function(){return d(e=>e.effectivePermissions)},Y=function(){return d(e=>e.promptRequirement)},Z=function(){return d(e=>e.noticeDismissal)},$=function(){return d(e=>e.privacySignals)},ee=function(){return d(e=>e.resolution)},es=function(){return d(e=>e.policyRule)},eo=function(){return d(e=>e.restrictions)},en=function(){return h().commands.dismissNotice},et=function(){return d(e=>e.experiment)},eu=function(){let{experiment:s,presentation:o}=k(),n=et();return a(()=>e(o,s,n),[o,s,n])},er=function(){let{experiment:e,theme:o}=k(),n=et();return a(()=>s(o,e,n),[o,e,n])},ei={},ea={},ec=function(){return eu()?.prompt??ei},ef=function(){return eu()?.preferences??ea};export{x as useActiveUI,y as useBranding,_ as useConsent,C as useConsents,M as useDeclaredVendors,en as useDismissNotice,X as useEffectivePermissions,et as useExperiment,W as useExplicitChoice,I as useHasConsentPolicy,b as useHasConsentPreferences,R as useHasConsentUI,V as useIABEnabled,T as useIABSnapshot,K as useIdentify,Q as useInit,v as useLocation,A as useModel,Z as useNoticeDismissal,g as useOverrides,U as usePolicyCategories,ee as usePolicyResolution,es as usePolicyRule,E as usePolicyScopeMode,ef as usePreferencesPresentation,$ as usePrivacySignals,ec as usePromptPresentation,Y as usePromptRequirement,O as usePurposeConsent,q as useRegisterConsentCategories,eu as useResolvedPresentation,er as useResolvedTheme,eo as useRestrictions,G as useSaveConsents,z as useSetActiveUI,w as useSetLanguage,F as useSetOverrides,p as useSnapshot,B as useSpecialFeatureOptIn,J as useSubscribeToConsentChanges,H as useTCString,S as useTranslations,P as useUser,j as useVendorAllowed,N as useVendorChoice,D as useVendorConsent};
@@ -22,4 +22,4 @@
22
22
  .c15t-ui-root-pWvoN{box-sizing:border-box;isolation:isolate;font-family:var(--iab-cd-font-family);line-height:var(--iab-cd-line-height);-webkit-text-size-adjust:100%;tab-size:4;padding:var(--iab-cd-padding);z-index:var(--iab-cd-z-index);background:0 0;border:0;justify-content:center;align-items:center;margin:0;display:flex;position:fixed;inset:0}.c15t-ui-dialogVisible-ZcQux{opacity:1;transition:opacity var(--iab-cd-animation-duration) var(--iab-cd-animation-timing)}.c15t-ui-dialogHidden-QOLab{opacity:0;transition:opacity var(--iab-cd-animation-duration) var(--iab-cd-animation-timing)}.c15t-ui-contentVisible-oIYEE{opacity:1;transition:opacity var(--iab-cd-animation-duration) var(--iab-cd-animation-timing), transform var(--iab-cd-animation-duration) var(--c15t-easing-spring);transform:scale(1)}.c15t-ui-contentHidden-dppgu{opacity:0;transition:opacity var(--iab-cd-animation-duration) var(--iab-cd-animation-timing), transform var(--iab-cd-animation-duration) var(--iab-cd-animation-timing);transform:scale(.95)}.c15t-ui-overlay-LyBwJ{background-color:var(--iab-cd-overlay-background);z-index:var(--iab-cd-overlay-z-index);position:fixed;inset:0}.c15t-ui-overlayVisible-HyYf_{opacity:1;transition:opacity var(--iab-cd-animation-duration) var(--iab-cd-animation-timing)}.c15t-ui-overlayHidden-G8kpl{opacity:0;transition:opacity var(--iab-cd-animation-duration) var(--iab-cd-animation-timing)}@starting-style{.c15t-ui-overlayEntering-hcqOQ{opacity:0}}.c15t-dark .c15t-ui-overlay-LyBwJ{background-color:var(--iab-cd-overlay-background-dark)}.c15t-ui-card-DTFr5{width:min(100%, var(--iab-cd-max-width));max-height:var(--iab-cd-max-height);border-radius:var(--iab-cd-border-radius);border:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-background-color);min-height:0;box-shadow:var(--iab-cd-shadow);flex-direction:column;display:flex;position:relative;overflow:visible}.c15t-dark .c15t-ui-card-DTFr5{background-color:var(--iab-cd-background-color-dark);border-color:var(--iab-cd-border-color-dark)}.c15t-ui-header-wVNlq{border-bottom:1px solid var(--iab-cd-border-color);flex-shrink:0;justify-content:space-between;align-items:center;padding:.75rem 1rem;display:flex}.c15t-dark .c15t-ui-header-wVNlq{border-color:var(--iab-cd-border-color-dark)}@media (width>=768px){.c15t-ui-header-wVNlq{padding:1rem}}.c15t-ui-headerContent-djclo{flex:1}.c15t-ui-title-PNS3O{font-size:var(--iab-cd-title-font-size);font-weight:var(--iab-cd-title-font-weight);color:var(--iab-cd-text-color);margin:0;line-height:1.25}.c15t-dark .c15t-ui-title-PNS3O{color:var(--iab-cd-text-color-dark)}.c15t-ui-description-kGL5G{font-size:var(--iab-cd-description-font-size);color:var(--iab-cd-text-muted-color);line-height:var(--iab-cd-description-line-height);margin:.25rem 0 0}.c15t-dark .c15t-ui-description-kGL5G{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-closeButton-LDT86{border-radius:var(--c15t-radius-md);cursor:pointer;color:var(--iab-cd-text-muted-color);background:0 0;border:none;justify-content:center;align-items:center;padding:.375rem;transition:background-color .15s;display:flex}.c15t-ui-closeButton-LDT86:hover{background-color:var(--iab-cd-surface-hover)}.c15t-dark .c15t-ui-closeButton-LDT86{color:var(--iab-cd-text-muted-color-dark)}.c15t-dark .c15t-ui-closeButton-LDT86:hover{background-color:var(--iab-cd-surface-hover-dark)}.c15t-ui-body-IFzVC{flex-direction:column;flex:auto;min-height:0;display:flex;overflow:hidden}.c15t-ui-tabsContainer-CGMHA{flex-shrink:0;padding:.75rem .75rem 0}@media (width>=768px){.c15t-ui-tabsContainer-CGMHA{padding:1rem 1rem 0}}.c15t-ui-tabsList-w5OMX{isolation:isolate;border-radius:var(--c15t-radius-lg,.625rem);background-color:var(--iab-cd-surface-hover);grid-auto-columns:1fr;grid-auto-flow:column;gap:.25rem;padding:.25rem;display:grid;position:relative}.c15t-dark .c15t-ui-tabsList-w5OMX{background-color:var(--iab-cd-surface-hover-dark)}.c15t-ui-tabButton-TaxQK{z-index:10;white-space:nowrap;border-radius:var(--c15t-radius-md,.375rem);height:2rem;color:var(--iab-cd-text-muted-color);cursor:pointer;background:0 0;border:none;outline:none;justify-content:center;align-items:center;gap:.375rem;padding:0 .75rem;font-size:.8125rem;font-weight:500;transition:color .15s cubic-bezier(.33,1,.68,1),background-color .15s cubic-bezier(.33,1,.68,1);display:flex;position:relative}.c15t-ui-tabButton-TaxQK:hover{color:var(--iab-cd-text-color)}.c15t-ui-tabButton-TaxQK:focus-visible{outline:2px solid var(--iab-cd-primary-color);outline-offset:2px}.c15t-ui-tabButton-TaxQK[data-state=active]{color:var(--iab-cd-text-color)}.c15t-dark .c15t-ui-tabButton-TaxQK{color:var(--iab-cd-text-muted-color-dark)}.c15t-dark .c15t-ui-tabButton-TaxQK:hover,.c15t-dark .c15t-ui-tabButton-TaxQK[data-state=active]{color:var(--iab-cd-text-color-dark)}.c15t-ui-tabIndicator-ipeu4{z-index:0;border-radius:var(--c15t-radius-md,.375rem);background-color:var(--iab-cd-background-color);transition:transform var(--c15t-duration-slow) cubic-bezier(.33, 1, .68, 1), width var(--c15t-duration-slow) cubic-bezier(.33, 1, .68, 1);position:absolute;inset-block:.25rem;box-shadow:0 1px 2px #0000000f,0 1px 3px #0000001a}.c15t-dark .c15t-ui-tabIndicator-ipeu4{background-color:var(--iab-cd-background-color-dark);box-shadow:0 1px 2px #0003,0 1px 3px #0000004d}.c15t-ui-tabIndicator-ipeu4[data-active-tab=purposes]{width:calc(50% - .125rem);left:.25rem;transform:translate(0)}.c15t-ui-tabIndicator-ipeu4[data-active-tab=vendors]{width:calc(50% - .125rem);left:.125rem;transform:translate(100%)}.c15t-ui-content-tpKyG{flex:auto;min-height:0;padding:.75rem;overflow:hidden auto}@media (width>=768px){.c15t-ui-content-tpKyG{padding:1rem}}.c15t-ui-purposeItem-ycHg8{border-radius:var(--c15t-radius-md);border:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-background-color);margin-bottom:.5rem}.c15t-dark .c15t-ui-purposeItem-ycHg8{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-background-color-dark)}.c15t-ui-purposeHeader-dtjf3{justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.75rem;display:flex}.c15t-ui-purposeTrigger-RYEFG{text-align:left;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;gap:.5rem;min-width:0;padding:0;display:flex}.c15t-ui-purposeArrow-O8n8H{width:1rem;height:1rem;color:var(--iab-cd-text-muted-color);flex-shrink:0}.c15t-dark .c15t-ui-purposeArrow-O8n8H{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-purposeInfo-wahTP{flex:1;min-width:0}.c15t-ui-purposeName-QJMF_{color:var(--iab-cd-text-color);align-items:center;gap:.5rem;margin:0;font-size:.875rem;font-weight:500;display:flex}.c15t-dark .c15t-ui-purposeName-QJMF_{color:var(--iab-cd-text-color-dark)}.c15t-ui-lockIcon-i8SD3{width:.75rem;height:.75rem;color:var(--iab-cd-text-muted-color)}.c15t-dark .c15t-ui-lockIcon-i8SD3{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-purposeMeta-OC9IY{color:var(--iab-cd-text-muted-color);margin:.125rem 0 0;font-size:.75rem}.c15t-dark .c15t-ui-purposeMeta-OC9IY{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-legitimateInterestBadge-t0cqx{color:var(--iab-cd-text-muted-color);align-items:center;gap:.25rem;margin-top:.25rem;font-size:.625rem;font-weight:500;display:inline-flex}.c15t-ui-legitimateInterestIcon-Pvt34{width:.75rem;height:.75rem}.c15t-ui-srOnly-n1PBG{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.c15t-ui-purposeContent-teoEc{border-top:1px solid var(--iab-cd-border-color);margin-top:.75rem;padding:.75rem}.c15t-dark .c15t-ui-purposeContent-teoEc{border-color:var(--iab-cd-border-color-dark)}.c15t-ui-purposeDescription-eLaj6{color:var(--iab-cd-text-muted-color);margin:0;font-size:.75rem;line-height:1.5}.c15t-dark .c15t-ui-purposeDescription-eLaj6{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-examplesToggle-UKJ4l{color:var(--iab-cd-text-color);cursor:pointer;background:0 0;border:none;align-items:center;gap:.25rem;margin-top:.75rem;padding:0;font-size:.75rem;font-weight:500;display:flex}.c15t-ui-examplesToggle-UKJ4l:hover{color:var(--iab-cd-primary-color)}.c15t-dark .c15t-ui-examplesToggle-UKJ4l{color:var(--iab-cd-text-color-dark)}.c15t-dark .c15t-ui-examplesToggle-UKJ4l:hover{color:var(--iab-cd-primary-color-dark)}.c15t-ui-examplesList-Jgu0V{margin:.375rem 0 0;padding-left:1rem;list-style-type:disc}.c15t-ui-examplesList-Jgu0V li{color:var(--iab-cd-text-muted-color);font-size:.75rem;line-height:1.5}.c15t-dark .c15t-ui-examplesList-Jgu0V li{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-vendorsToggle-iiROe{color:var(--iab-cd-text-color);cursor:pointer;background:0 0;border:none;align-items:center;gap:.25rem;margin-top:.75rem;padding:0;font-size:.75rem;font-weight:500;display:flex}.c15t-ui-vendorsToggle-iiROe:hover{color:var(--iab-cd-primary-color)}.c15t-dark .c15t-ui-vendorsToggle-iiROe{color:var(--iab-cd-text-color-dark)}.c15t-ui-vendorSection-Xotxt{z-index:1;margin-top:.375rem;position:relative}.c15t-ui-vendorSectionTitle-fDzFC{color:var(--iab-cd-text-muted-color);text-transform:uppercase;letter-spacing:.05em;margin:.5rem 0 .375rem;font-size:.625rem;font-weight:500}.c15t-dark .c15t-ui-vendorSectionTitle-fDzFC{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-vendorSectionTitleLi-_EU2B{color:var(--iab-cd-text-muted-color);align-items:center;gap:.25rem;display:flex}.c15t-ui-vendorRow-MdJwv{border-radius:var(--c15t-radius-sm);background-color:var(--iab-cd-surface-hover);justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:.375rem;padding:.5rem;display:flex}.c15t-dark .c15t-ui-vendorRow-MdJwv{background-color:var(--iab-cd-surface-hover-dark)}.c15t-ui-vendorRowLi-TR3to{background-color:var(--iab-cd-surface-hover);border:1px solid var(--iab-cd-border-color)}.c15t-ui-vendorInfo-cLXjo{flex:1;min-width:0}.c15t-ui-vendorName-U5tbA{color:var(--iab-cd-text-color);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:.375rem;padding:0;font-size:.75rem;font-weight:500;display:flex}.c15t-ui-vendorName-U5tbA:hover{color:var(--iab-cd-primary-color)}.c15t-dark .c15t-ui-vendorName-U5tbA{color:var(--iab-cd-text-color-dark)}.c15t-ui-customVendorIcon-xE8uf{width:.75rem;height:.75rem;color:var(--iab-cd-primary-color)}.c15t-dark .c15t-ui-customVendorIcon-xE8uf{color:var(--iab-cd-primary-color-dark)}.c15t-ui-vendorDetails-nJLMH{flex-wrap:wrap;gap:.5rem;margin-top:.125rem;display:flex}.c15t-ui-vendorDetail-qWyPR{color:var(--iab-cd-text-muted-color);font-size:.625rem}.c15t-dark .c15t-ui-vendorDetail-qWyPR{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-vendorDetailLi-HiywZ{color:var(--iab-cd-text-muted-color);font-weight:500}.c15t-ui-stackItem-Z6dCC{border-radius:var(--c15t-radius-md);border:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-background-color);margin-bottom:.5rem}.c15t-dark .c15t-ui-stackItem-Z6dCC{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-background-color-dark)}.c15t-ui-stackHeader-TkNdL{justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.75rem;display:flex}.c15t-ui-stackTrigger-Kqeyy{text-align:left;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;gap:.5rem;min-width:0;padding:0;display:flex}.c15t-ui-stackInfo-JH0ue{flex:1;min-width:0}.c15t-ui-stackName-yNHhd{color:var(--iab-cd-text-color);margin:0;font-size:.875rem;font-weight:500;line-height:1.25}.c15t-dark .c15t-ui-stackName-yNHhd{color:var(--iab-cd-text-color-dark)}.c15t-ui-stackMeta-Il_rX{color:var(--iab-cd-text-muted-color);margin:.25rem 0 0;font-size:.75rem}.c15t-dark .c15t-ui-stackMeta-Il_rX{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-stackControls-kBZON{flex-shrink:0;align-items:center;gap:.5rem;display:flex}.c15t-ui-partialIndicator-U9dt6{background-color:var(--iab-cd-primary-color);border-radius:50%;width:.375rem;height:.375rem}.c15t-ui-stackDescription-occgV{color:var(--iab-cd-text-muted-color);margin:0 0 0 1.5rem;padding-bottom:.75rem;font-size:.75rem}.c15t-ui-stackDescription-occgV p{margin:0}.c15t-ui-stackDescription-occgV p+p{margin-top:.25rem}.c15t-dark .c15t-ui-stackDescription-occgV{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-stackContent-wu6FF{border-top:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-surface-hover);padding:.5rem}.c15t-dark .c15t-ui-stackContent-wu6FF{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-surface-hover-dark)}.c15t-ui-specialPurposesSection-y9Pqu{border-radius:var(--c15t-radius-md);border:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-background-color);margin-bottom:.5rem}.c15t-dark .c15t-ui-specialPurposesSection-y9Pqu{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-background-color-dark)}.c15t-ui-specialPurposesHeader-Rq1Tg{justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.75rem;display:flex}.c15t-ui-specialPurposesTitle-tcftu{color:var(--iab-cd-text-color);align-items:center;gap:.5rem;margin:0;font-size:.875rem;font-weight:500;display:flex}.c15t-dark .c15t-ui-specialPurposesTitle-tcftu{color:var(--iab-cd-text-color-dark)}.c15t-ui-featuresSection-TmXU3{border-radius:var(--c15t-radius-md);border:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-background-color);margin-bottom:var(--c15t-space-sm)}.c15t-dark .c15t-ui-featuresSection-TmXU3{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-background-color-dark)}.c15t-ui-featuresHeader-VSBo2{padding:calc(var(--c15t-space-md) * .75)}.c15t-ui-featuresTitle-BpbiP{font-size:var(--c15t-font-size-sm);font-weight:var(--c15t-font-weight-medium);color:var(--iab-cd-text-color);margin:0}.c15t-dark .c15t-ui-featuresTitle-BpbiP{color:var(--iab-cd-text-color-dark)}.c15t-ui-featuresDescription-QfBHO{font-size:calc(var(--c15t-font-size-base) * .75);line-height:var(--c15t-line-height-normal);color:var(--iab-cd-text-muted-color);margin:var(--c15t-space-xs) 0 0}.c15t-dark .c15t-ui-featuresDescription-QfBHO{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-featuresList-Y5lNt{padding:0 calc(var(--c15t-space-md) * .75) calc(var(--c15t-space-md) * .75)}.c15t-ui-infoIcon-Egw87{width:.875rem;height:.875rem;color:var(--iab-cd-text-muted-color);cursor:help}.c15t-dark .c15t-ui-infoIcon-Egw87{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-tooltip-XjaZq{background-color:var(--iab-cd-background-color);border:1px solid var(--iab-cd-border-color);border-radius:var(--c15t-radius-md);width:16rem;box-shadow:var(--c15t-shadow-lg);color:var(--iab-cd-text-color);z-index:10;opacity:0;visibility:hidden;padding:.5rem;font-size:.75rem;transition:opacity .15s,visibility .15s;position:absolute;top:1.5rem;right:0}.c15t-ui-tooltipVisible-saaoQ{opacity:1;visibility:visible}.c15t-dark .c15t-ui-tooltip-XjaZq{background-color:var(--iab-cd-background-color-dark);border-color:var(--iab-cd-border-color-dark);color:var(--iab-cd-text-color-dark)}.c15t-ui-vendorListHeader-Hfxxu{background-color:var(--iab-cd-background-color);z-index:10;margin-top:0;padding-top:0;padding-bottom:.375rem;position:sticky;top:0}@media (width>=768px){.c15t-ui-vendorListHeader-Hfxxu{margin-top:0;padding-top:0;top:0}}.c15t-dark .c15t-ui-vendorListHeader-Hfxxu{background-color:var(--iab-cd-background-color-dark)}.c15t-ui-searchContainer-uyKJB{position:relative}.c15t-ui-searchIcon-NhyW4{width:.875rem;height:.875rem;color:var(--iab-cd-text-muted-color);position:absolute;top:50%;left:.625rem;transform:translateY(-50%)}.c15t-dark .c15t-ui-searchIcon-NhyW4{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-searchInput-cLLuO{border-radius:var(--c15t-radius-md);border:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-background-color);width:100%;color:var(--iab-cd-text-color);padding:.5rem .75rem .5rem 2rem;font-size:.875rem}.c15t-ui-searchInput-cLLuO:focus{border-color:var(--iab-cd-primary-color);box-shadow:0 0 0 2px color-mix(in srgb, var(--iab-cd-primary-color) 20%, transparent);outline:none}.c15t-dark .c15t-ui-searchInput-cLLuO{background-color:var(--iab-cd-background-color-dark);border-color:var(--iab-cd-border-color-dark);color:var(--iab-cd-text-color-dark)}.c15t-ui-vendorCount-s4d6i{color:var(--iab-cd-text-muted-color);margin-top:.25rem;font-size:.75rem}.c15t-dark .c15t-ui-vendorCount-s4d6i{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-selectedVendorBanner-S6KCv{background-color:color-mix(in srgb, var(--iab-cd-primary-color) 14%, var(--c15t-surface));border:1px solid color-mix(in srgb, var(--iab-cd-primary-color) 30%, transparent);border-radius:var(--c15t-radius-md);z-index:100;isolation:isolate;box-shadow:var(--c15t-shadow-sm);align-items:center;gap:.5rem;margin-bottom:.5rem;padding:.5rem .625rem;display:flex;position:sticky;top:0}.c15t-ui-selectedVendorText-jjIQi{color:var(--iab-cd-primary-color);flex:1;font-size:.75rem}.c15t-ui-clearSelectionButton-yz3Zx{color:var(--iab-cd-primary-color);cursor:pointer;background:0 0;border:none;align-items:center;gap:.25rem;padding:0;font-size:.75rem;display:flex}.c15t-ui-clearSelectionButton-yz3Zx:hover{opacity:.8}.c15t-ui-clearIcon-sTZC2{width:.75rem;height:.75rem}.c15t-ui-vendorListItem-NwBiX{z-index:1;border:1px solid var(--iab-cd-border-color);border-radius:var(--c15t-radius-md);margin-bottom:.375rem;scroll-margin-top:6rem;position:relative;overflow:hidden}.c15t-dark .c15t-ui-vendorListItem-NwBiX{border-color:var(--iab-cd-border-color-dark)}.c15t-ui-vendorListItemHeader-fBe_O{align-items:center;gap:.5rem;padding:.625rem;display:flex}.c15t-ui-vendorConsentControl-VC70A{border-radius:var(--c15t-radius-sm);flex-shrink:0;justify-content:center;align-items:center;min-width:2.25rem;min-height:2.25rem;padding:.375rem;display:inline-flex}.c15t-ui-vendorConsentControl-VC70A:hover{background-color:var(--iab-cd-surface-hover)}.c15t-dark .c15t-ui-vendorConsentControl-VC70A:hover{background-color:var(--iab-cd-surface-hover-dark)}.c15t-ui-vendorConsentSwitch-wEFf8{flex-shrink:0;display:block}.c15t-ui-vendorListTrigger-TG_0F{text-align:left;cursor:pointer;background:0 0;border:none;flex:1;justify-content:space-between;align-items:center;min-width:0;padding:0;display:flex}.c15t-ui-vendorListTrigger-TG_0F:hover{color:var(--iab-cd-primary-color)}.c15t-ui-vendorListInfo-BSgBB{flex:1;min-width:0}.c15t-ui-vendorListName-II_BV{color:var(--iab-cd-text-color);align-items:center;gap:.5rem;margin:0;font-size:.875rem;font-weight:500;display:flex}.c15t-dark .c15t-ui-vendorListName-II_BV{color:var(--iab-cd-text-color-dark)}.c15t-ui-vendorListMeta-wa6UC{flex-wrap:wrap;align-items:center;gap:.375rem;margin-top:.125rem;display:flex}.c15t-ui-vendorListMetaText-MS_cF{color:var(--iab-cd-text-muted-color);font-size:.75rem}.c15t-dark .c15t-ui-vendorListMetaText-MS_cF{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-vendorListLiBadge-_Uq0L{color:var(--iab-cd-text-muted-color);align-items:center;gap:.125rem;font-size:.625rem;font-weight:500;display:inline-flex}.c15t-ui-vendorListContent-CtRTw{border-top:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-surface-hover);padding:0 .625rem .625rem}.c15t-dark .c15t-ui-vendorListContent-CtRTw{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-surface-hover-dark)}.c15t-ui-vendorLinks-pxq9Z{padding-top:.5rem}.c15t-ui-tabPanel-PJKhk{min-width:0;overflow-x:hidden}.c15t-ui-vendorLink-htHQn{color:var(--iab-cd-primary-color);align-items:center;gap:.25rem;margin-right:.75rem;font-size:.75rem;text-decoration:none;display:inline-flex}.c15t-ui-vendorLink-htHQn:hover{text-decoration:underline}.c15t-ui-vendorLinkIcon-UjIy5{width:.75rem;height:.75rem}.c15t-ui-vendorBadges-SED5E{flex-wrap:wrap;gap:.5rem;margin-top:.375rem;display:flex}.c15t-ui-vendorBadge-Pu0Hs{border-radius:var(--c15t-radius-sm);background-color:var(--iab-cd-surface-hover);color:var(--iab-cd-text-muted-color);padding:.125rem .375rem;font-size:.625rem}.c15t-dark .c15t-ui-vendorBadge-Pu0Hs{background-color:var(--iab-cd-surface-hover-dark);color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-vendorPurposesList-CtEFC{margin-top:.5rem}.c15t-ui-vendorPurposesTitle-2hGY4{color:var(--iab-cd-text-color);align-items:center;gap:.5rem;margin:0 0 .25rem;font-size:.75rem;font-weight:500;display:flex}.c15t-dark .c15t-ui-vendorPurposesTitle-2hGY4{color:var(--iab-cd-text-color-dark)}.c15t-ui-vendorPurposesItems-VKo31{margin:0;padding:0;list-style:none}.c15t-ui-vendorPurposeItem-TmnWw{color:var(--iab-cd-text-muted-color);border-left:2px solid var(--iab-cd-border-color);justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:.125rem;padding-left:.5rem;font-size:.75rem;display:flex}.c15t-dark .c15t-ui-vendorPurposeItem-TmnWw{color:var(--iab-cd-text-muted-color-dark);border-color:var(--iab-cd-border-color-dark)}.c15t-ui-vendorPurposeItemLi-rO_6B{border-color:var(--iab-cd-text-muted-color);color:var(--iab-cd-text-muted-color)}.c15t-ui-vendorRetention-TTJ2U{opacity:.7;font-size:.625rem}.c15t-ui-footer-YF32K{border-top:1px solid var(--iab-cd-border-color);background-color:var(--iab-cd-surface-hover);flex-shrink:0;justify-content:space-between;align-items:center;padding:.75rem 1rem;display:flex}.c15t-dark .c15t-ui-footer-YF32K{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-surface-hover-dark)}.c15t-ui-consentNotice-PEEG3{text-align:center;padding-top:1.5rem}.c15t-dark .c15t-ui-consentNotice-PEEG3{border-color:var(--iab-cd-border-color-dark)}.c15t-ui-consentNoticeText-MhMCM{color:var(--iab-cd-text-muted-color);margin-block:0;font-size:.625rem}.c15t-dark .c15t-ui-consentNoticeText-MhMCM{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-loadingContainer-iW124{flex-direction:column;justify-content:center;align-items:center;gap:.75rem;height:100%;display:flex}.c15t-ui-loadingSpinner-W8iiY{border:2px solid var(--iab-cd-border-color);border-top-color:var(--iab-cd-primary-color);width:1.75rem;height:1.75rem;animation:var(--c15t-spin-animation);border-radius:50%}.c15t-ui-loadingText-o2XqJ{color:var(--iab-cd-text-muted-color);font-size:.875rem}.c15t-dark .c15t-ui-loadingText-o2XqJ{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-emptyState-nmTzy{text-align:center;padding:var(--c15t-space-xl)}.c15t-ui-emptyStateText-HuJtF{color:var(--iab-cd-text-muted-color);margin:0;font-size:.875rem}.c15t-dark .c15t-ui-emptyStateText-HuJtF{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-vendorSection-Xotxt{z-index:1;margin-top:.25rem;margin-bottom:1rem;position:relative}.c15t-ui-vendorSectionHeading-s4i73{text-transform:uppercase;letter-spacing:.05em;color:var(--iab-cd-text-muted-color);background:var(--iab-cd-surface-hover-color);border-bottom:1px solid var(--iab-cd-border-color);align-items:center;gap:.5rem;margin:0;padding:.375rem 0 .25rem;font-size:.75rem;font-weight:600;display:flex}.c15t-dark .c15t-ui-vendorSectionHeading-s4i73{color:var(--iab-cd-text-muted-color-dark);background:var(--iab-cd-surface-hover-color-dark);border-color:var(--iab-cd-border-color-dark)}.c15t-ui-vendorSectionIcon-Cc99v{flex-shrink:0;width:1rem;height:1rem}.c15t-ui-iabVendorSectionHeader-YsNA5{background-color:var(--iab-cd-background-color);border-bottom:1px solid var(--iab-cd-border-color);z-index:10;padding:.25rem 0;position:relative}.c15t-dark .c15t-ui-iabVendorSectionHeader-YsNA5{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-background-color-dark)}.c15t-ui-iabVendorSectionHeader-YsNA5 .c15t-ui-vendorSectionHeading-s4i73{border-bottom:none;padding-bottom:.25rem}.c15t-ui-iabVendorNotice-WnMMx{color:var(--iab-cd-text-muted-color);margin:0;font-size:.6875rem}.c15t-dark .c15t-ui-iabVendorNotice-WnMMx{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-customVendorSectionHeader-Sy8yM{background-color:var(--iab-cd-background-color);border-bottom:1px solid var(--iab-cd-border-color);z-index:10;padding:.5rem 0;position:relative}.c15t-dark .c15t-ui-customVendorSectionHeader-Sy8yM{border-color:var(--iab-cd-border-color-dark);background-color:var(--iab-cd-background-color-dark)}.c15t-ui-customVendorSectionHeader-Sy8yM .c15t-ui-vendorSectionHeading-s4i73{background:0 0;border-bottom:none;padding-bottom:.25rem}.c15t-ui-customVendorNotice-NgBsE{color:var(--iab-cd-text-muted-color);margin:0;padding:.25rem 0 1rem;font-size:.6875rem}.c15t-dark .c15t-ui-customVendorNotice-NgBsE{color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-customVendorItem-QF5C7{border-left:3px solid var(--iab-cd-primary-color)}.c15t-dark .c15t-ui-customVendorItem-QF5C7{border-left-color:var(--iab-cd-primary-color-dark)}.c15t-ui-customVendorPurposeSection-zFEUM{border-top:1px solid var(--iab-cd-border-color);margin-top:.75rem;padding-top:.75rem}.c15t-dark .c15t-ui-customVendorPurposeSection-zFEUM{border-color:var(--iab-cd-border-color-dark)}.c15t-ui-vendorSectionTitleCustom-JjHzO{text-transform:uppercase;letter-spacing:.05em;color:var(--iab-cd-primary-color);align-items:center;gap:.375rem;margin:0 0 .5rem;font-size:.625rem;font-weight:600;display:flex}.c15t-dark .c15t-ui-vendorSectionTitleCustom-JjHzO{color:var(--iab-cd-primary-color-dark)}.c15t-ui-objectButton-S0x1H{border-radius:var(--c15t-radius-sm);border:1px solid var(--iab-cd-border-color);color:var(--iab-cd-text-muted-color);cursor:pointer;white-space:nowrap;background-color:#0000;padding:.25rem .5rem;font-size:.6875rem;font-weight:500;transition:background-color .15s,border-color .15s,color .15s}.c15t-ui-objectButton-S0x1H:hover{border-color:var(--iab-cd-text-muted-color);color:var(--iab-cd-text-color)}.c15t-ui-objectButton-S0x1H[data-active],.c15t-ui-objectButtonActive-AlNLv{background-color:var(--iab-cd-text-muted-color);border-color:var(--iab-cd-text-muted-color);color:var(--iab-cd-background-color)}.c15t-ui-objectButton-S0x1H[data-active]:hover,.c15t-ui-objectButtonActive-AlNLv:hover{opacity:.9}.c15t-dark .c15t-ui-objectButton-S0x1H{border-color:var(--iab-cd-border-color-dark);color:var(--iab-cd-text-muted-color-dark)}.c15t-dark .c15t-ui-objectButton-S0x1H:hover{border-color:var(--iab-cd-text-muted-color-dark);color:var(--iab-cd-text-color-dark)}.c15t-dark .c15t-ui-objectButton-S0x1H[data-active],.c15t-dark .c15t-ui-objectButtonActive-AlNLv{background-color:var(--iab-cd-text-muted-color-dark);border-color:var(--iab-cd-text-muted-color-dark);color:var(--iab-cd-background-color-dark)}.c15t-ui-liExplanation-_r6Zx{color:var(--iab-cd-text-muted-color);background-color:var(--iab-cd-surface-hover);font-size:.6875rem;font-style:italic}.c15t-dark .c15t-ui-liExplanation-_r6Zx{color:var(--iab-cd-text-muted-color-dark);background-color:var(--iab-cd-surface-hover-dark);border-color:var(--iab-cd-text-muted-color-dark)}.c15t-ui-vendorLiSection-sqzvi{border-top:1px solid var(--iab-cd-border-color);margin-top:.75rem;padding-top:.75rem}.c15t-dark .c15t-ui-vendorLiSection-sqzvi{border-color:var(--iab-cd-border-color-dark)}.c15t-ui-vendorLiSectionHeader-fsKUh{justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:.375rem;display:flex}.c15t-ui-vendorLiSectionHeader-fsKUh .c15t-ui-vendorPurposesTitle-2hGY4{align-items:center;margin:0;display:flex}.c15t-ui-purposeLiSection-YbwuC{background-color:var(--iab-cd-surface-hover);border-radius:var(--c15t-radius-sm);border:1px solid var(--iab-cd-border-color);margin:.75rem 0;padding:.75rem}.c15t-dark .c15t-ui-purposeLiSection-YbwuC{background-color:var(--iab-cd-surface-hover-dark);border-color:var(--iab-cd-border-color-dark)}.c15t-ui-purposeLiSectionHeader-cSbP3{justify-content:space-between;align-items:center;gap:.75rem;margin-bottom:.5rem;display:flex}.c15t-ui-purposeLiInfo-Rpryr{color:var(--iab-cd-text-color);align-items:center;gap:.375rem;font-size:.75rem;font-weight:500;display:flex}.c15t-dark .c15t-ui-purposeLiInfo-Rpryr{color:var(--iab-cd-text-color-dark)}.c15t-ui-purposeLiInfo-Rpryr .c15t-ui-legitimateInterestIcon-Pvt34{flex-shrink:0}@media (prefers-reduced-motion:reduce){.c15t-ui-dialogVisible-ZcQux,.c15t-ui-dialogHidden-QOLab,.c15t-ui-contentVisible-oIYEE,.c15t-ui-contentHidden-dppgu,.c15t-ui-overlayVisible-HyYf_,.c15t-ui-overlayHidden-G8kpl,.c15t-ui-closeButton-LDT86,.c15t-ui-tabButton-TaxQK,.c15t-ui-tooltip-XjaZq,.c15t-ui-objectButton-S0x1H,.c15t-ui-tabIndicator-ipeu4{transition:none}.c15t-ui-loadingSpinner-W8iiY{animation:none}}@media (hover:none){.c15t-ui-closeButton-LDT86:hover{background-color:#0000}.c15t-ui-tabButton-TaxQK:hover{color:var(--iab-cd-text-muted-color)}.c15t-ui-objectButton-S0x1H:hover{border-color:var(--iab-cd-border-color);color:var(--iab-cd-text-muted-color)}}
23
23
 
24
24
  /* components/iab-prompt */
25
- .c15t-ui-root-wCtZ2{box-sizing:border-box;z-index:999998;font-family:var(--iab-consent-banner-font-family);line-height:var(--iab-consent-banner-line-height);-webkit-text-size-adjust:var(--iab-consent-banner-text-size-adjust);-webkit-font-smoothing:antialiased;tab-size:var(--iab-consent-banner-tab-size);justify-content:center;align-items:center;padding:1rem;display:flex;position:fixed;inset:0}.c15t-ui-bannerEntering-Rn_SM,.c15t-ui-bannerVisible-uqQdb{opacity:1}.c15t-ui-bannerEntering-Rn_SM[data-entry=late]:not(.c15t-ui-bannerHidden-KVkXf){transition:opacity var(--iab-consent-banner-entry-duration) var(--iab-consent-banner-entry-timing)}@starting-style{.c15t-ui-bannerEntering-Rn_SM[data-entry=late]{opacity:0}}.c15t-ui-bannerHidden-KVkXf{opacity:0;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing)}@media (width>=640px){.c15t-ui-root-wCtZ2{padding:1.5rem}}.c15t-ui-cardShell-pmM71{width:min(100%, var(--iab-consent-banner-max-width));flex-direction:column;display:flex}.c15t-ui-card-lJZdN{border-radius:var(--iab-consent-banner-border-radius);border-width:var(--iab-consent-banner-border-width);border-style:solid;border-color:var(--iab-consent-banner-border-color);background-color:var(--iab-consent-banner-background-color);width:100%;box-shadow:var(--iab-consent-banner-shadow);position:relative;overflow:hidden}.c15t-dark .c15t-ui-card-lJZdN{background-color:var(--iab-consent-banner-background-color-dark);border-color:var(--iab-consent-banner-border-color-dark);box-shadow:var(--iab-consent-banner-shadow-dark)}.c15t-ui-card-lJZdN>:not([hidden])~:not([hidden]){border-top-width:var(--iab-consent-banner-border-width);border-top-style:solid;border-color:var(--iab-consent-banner-border-color)}.c15t-dark .c15t-ui-card-lJZdN>:not([hidden])~:not([hidden]){border-color:var(--iab-consent-banner-border-color-dark)}.c15t-ui-card-lJZdN:not(.headless):focus{outline:none}.c15t-ui-header-WMRYy{color:var(--iab-consent-banner-text-color);flex-direction:column;gap:.5rem;padding:1.25rem;display:flex}.c15t-dark .c15t-ui-header-WMRYy{color:var(--iab-consent-banner-text-color-dark)}@media (width>=640px){.c15t-ui-header-WMRYy{padding:1.5rem}}.c15t-ui-title-iMdl2{font-size:var(--c15t-font-size-lg);letter-spacing:-.011em;color:var(--iab-consent-banner-title-color);margin:0;font-weight:600;line-height:1.5rem}.c15t-dark .c15t-ui-title-iMdl2{color:var(--iab-consent-banner-title-color-dark)}.c15t-ui-description-_ZLiC{letter-spacing:-.006em;color:var(--iab-consent-banner-description-color);margin:0;font-size:.875rem;font-weight:400;line-height:1.5}.c15t-dark .c15t-ui-description-_ZLiC{color:var(--iab-consent-banner-description-color-dark)}.c15t-ui-partnersLink-yKsgB{color:var(--iab-consent-banner-link-color);cursor:pointer;font-weight:500;font-size:inherit;background:0 0;border:none;padding:0;text-decoration:none}.c15t-ui-partnersLink-yKsgB:hover{text-decoration:underline}.c15t-dark .c15t-ui-partnersLink-yKsgB{color:var(--iab-consent-banner-link-color-dark)}.c15t-ui-purposeList-Qz2Eo{color:var(--iab-consent-banner-description-color);margin:.5rem 0 0;padding-left:1.25rem;font-size:.875rem;line-height:1.5;list-style-type:disc}.c15t-ui-purposeList-Qz2Eo li{margin-bottom:.25rem}.c15t-ui-purposeMore-aANSf{opacity:.8;font-style:italic;list-style-type:none}.c15t-dark .c15t-ui-purposeList-Qz2Eo{color:var(--iab-consent-banner-description-color-dark)}.c15t-ui-legitimateInterestNotice-QtcwV{color:var(--iab-consent-banner-description-color);margin-top:.25rem;font-size:.8125rem;line-height:1.5}.c15t-dark .c15t-ui-legitimateInterestNotice-QtcwV{color:var(--iab-consent-banner-description-color-dark)}.c15t-ui-privacyLink-RYh_l{color:var(--iab-consent-banner-link-color);cursor:pointer;font-size:inherit;background:0 0;border:none;padding:0;text-decoration:none}.c15t-ui-privacyLink-RYh_l:hover{text-decoration:underline}.c15t-dark .c15t-ui-privacyLink-RYh_l{color:var(--iab-consent-banner-link-color-dark)}.c15t-ui-footer-danOO{background-color:var(--iab-consent-banner-footer-background-color);flex-direction:column;justify-content:space-between;gap:.5rem;padding:.75rem 1rem;display:flex}.c15t-dark .c15t-ui-footer-danOO{background-color:var(--iab-consent-banner-footer-background-color-dark)}@media (width>=640px){.c15t-ui-footer-danOO{flex-direction:row;padding:1rem}}.c15t-ui-overlay-OPamO{background-color:var(--iab-consent-banner-overlay-background-color);z-index:999997;position:fixed;inset:0}.c15t-ui-overlayEntering-MQWHm,.c15t-ui-overlayVisible-JAO1l{opacity:1}.c15t-ui-overlayEntering-MQWHm[data-entry=late]:not(.c15t-ui-overlayHidden-zfbJA){transition:opacity var(--iab-consent-banner-entry-duration) var(--iab-consent-banner-entry-timing)}@starting-style{.c15t-ui-overlayEntering-MQWHm[data-entry=late]{opacity:0}}.c15t-ui-overlayHidden-zfbJA{opacity:0;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing)}.c15t-dark .c15t-ui-overlay-OPamO{background-color:var(--iab-consent-banner-overlay-background-color-dark)}@media (prefers-reduced-motion:reduce){.c15t-ui-bannerEntering-Rn_SM[data-entry=late]:not(.c15t-ui-bannerHidden-KVkXf),.c15t-ui-overlayEntering-MQWHm[data-entry=late]:not(.c15t-ui-overlayHidden-zfbJA),.c15t-ui-bannerHidden-KVkXf,.c15t-ui-overlayHidden-zfbJA{transition:none}}
25
+ .c15t-ui-root-wCtZ2{box-sizing:border-box;z-index:999998;font-family:var(--iab-consent-banner-font-family);line-height:var(--iab-consent-banner-line-height);-webkit-text-size-adjust:var(--iab-consent-banner-text-size-adjust);-webkit-font-smoothing:antialiased;tab-size:var(--iab-consent-banner-tab-size);justify-content:center;align-items:center;padding:1rem;display:flex;position:fixed;inset:0}.c15t-ui-root-wCtZ2[data-c15t-streamed]:not(:has(>[data-c15t-stream-end])){visibility:hidden}.c15t-ui-bannerEntering-Rn_SM,.c15t-ui-bannerVisible-uqQdb{opacity:1}.c15t-ui-bannerEntering-Rn_SM[data-entry=late]:not(.c15t-ui-bannerHidden-KVkXf){transition:opacity var(--iab-consent-banner-entry-duration) var(--iab-consent-banner-entry-timing)}@starting-style{.c15t-ui-bannerEntering-Rn_SM[data-entry=late]{opacity:0}}.c15t-ui-bannerHidden-KVkXf{opacity:0;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing)}@media (width>=640px){.c15t-ui-root-wCtZ2{padding:1.5rem}}.c15t-ui-cardShell-pmM71{width:min(100%, var(--iab-consent-banner-max-width));flex-direction:column;display:flex}.c15t-ui-card-lJZdN{border-radius:var(--iab-consent-banner-border-radius);border-width:var(--iab-consent-banner-border-width);border-style:solid;border-color:var(--iab-consent-banner-border-color);background-color:var(--iab-consent-banner-background-color);width:100%;box-shadow:var(--iab-consent-banner-shadow);position:relative;overflow:hidden}.c15t-dark .c15t-ui-card-lJZdN{background-color:var(--iab-consent-banner-background-color-dark);border-color:var(--iab-consent-banner-border-color-dark);box-shadow:var(--iab-consent-banner-shadow-dark)}.c15t-ui-card-lJZdN>:not([hidden])~:not([hidden]){border-top-width:var(--iab-consent-banner-border-width);border-top-style:solid;border-color:var(--iab-consent-banner-border-color)}.c15t-dark .c15t-ui-card-lJZdN>:not([hidden])~:not([hidden]){border-color:var(--iab-consent-banner-border-color-dark)}.c15t-ui-card-lJZdN:not(.headless):focus{outline:none}.c15t-ui-header-WMRYy{color:var(--iab-consent-banner-text-color);flex-direction:column;gap:.5rem;padding:1.25rem;display:flex}.c15t-dark .c15t-ui-header-WMRYy{color:var(--iab-consent-banner-text-color-dark)}@media (width>=640px){.c15t-ui-header-WMRYy{padding:1.5rem}}.c15t-ui-title-iMdl2{font-size:var(--c15t-font-size-lg);letter-spacing:-.011em;color:var(--iab-consent-banner-title-color);margin:0;font-weight:600;line-height:1.5rem}.c15t-dark .c15t-ui-title-iMdl2{color:var(--iab-consent-banner-title-color-dark)}.c15t-ui-description-_ZLiC{letter-spacing:-.006em;color:var(--iab-consent-banner-description-color);margin:0;font-size:.875rem;font-weight:400;line-height:1.5}.c15t-dark .c15t-ui-description-_ZLiC{color:var(--iab-consent-banner-description-color-dark)}.c15t-ui-partnersLink-yKsgB{color:var(--iab-consent-banner-link-color);cursor:pointer;font-weight:500;font-size:inherit;background:0 0;border:none;padding:0;text-decoration:none}.c15t-ui-partnersLink-yKsgB:hover{text-decoration:underline}.c15t-dark .c15t-ui-partnersLink-yKsgB{color:var(--iab-consent-banner-link-color-dark)}.c15t-ui-purposeList-Qz2Eo{color:var(--iab-consent-banner-description-color);margin:.5rem 0 0;padding-left:1.25rem;font-size:.875rem;line-height:1.5;list-style-type:disc}.c15t-ui-purposeList-Qz2Eo li{margin-bottom:.25rem}.c15t-ui-purposeMore-aANSf{opacity:.8;font-style:italic;list-style-type:none}.c15t-dark .c15t-ui-purposeList-Qz2Eo{color:var(--iab-consent-banner-description-color-dark)}.c15t-ui-legitimateInterestNotice-QtcwV{color:var(--iab-consent-banner-description-color);margin-top:.25rem;font-size:.8125rem;line-height:1.5}.c15t-dark .c15t-ui-legitimateInterestNotice-QtcwV{color:var(--iab-consent-banner-description-color-dark)}.c15t-ui-privacyLink-RYh_l{color:var(--iab-consent-banner-link-color);cursor:pointer;font-size:inherit;background:0 0;border:none;padding:0;text-decoration:none}.c15t-ui-privacyLink-RYh_l:hover{text-decoration:underline}.c15t-dark .c15t-ui-privacyLink-RYh_l{color:var(--iab-consent-banner-link-color-dark)}.c15t-ui-footer-danOO{background-color:var(--iab-consent-banner-footer-background-color);flex-direction:column;justify-content:space-between;gap:.5rem;padding:.75rem 1rem;display:flex}.c15t-dark .c15t-ui-footer-danOO{background-color:var(--iab-consent-banner-footer-background-color-dark)}@media (width>=640px){.c15t-ui-footer-danOO{flex-direction:row;padding:1rem}}.c15t-ui-overlay-OPamO{background-color:var(--iab-consent-banner-overlay-background-color);z-index:999997;position:fixed;inset:0}.c15t-ui-overlayEntering-MQWHm,.c15t-ui-overlayVisible-JAO1l{opacity:1}.c15t-ui-overlayEntering-MQWHm[data-entry=late]:not(.c15t-ui-overlayHidden-zfbJA){transition:opacity var(--iab-consent-banner-entry-duration) var(--iab-consent-banner-entry-timing)}@starting-style{.c15t-ui-overlayEntering-MQWHm[data-entry=late]{opacity:0}}.c15t-ui-overlayHidden-zfbJA{opacity:0;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing)}.c15t-dark .c15t-ui-overlay-OPamO{background-color:var(--iab-consent-banner-overlay-background-color-dark)}@media (prefers-reduced-motion:reduce){.c15t-ui-bannerEntering-Rn_SM[data-entry=late]:not(.c15t-ui-bannerHidden-KVkXf),.c15t-ui-overlayEntering-MQWHm[data-entry=late]:not(.c15t-ui-overlayHidden-zfbJA),.c15t-ui-bannerHidden-KVkXf,.c15t-ui-overlayHidden-zfbJA{transition:none}}
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as e}from"react/jsx-runtime";import{createIAB as r}from"@c15t/iab";import{useCallback as t,useContext as n,useEffect as o,useMemo as s,useRef as l,useState as c,useSyncExternalStore as i}from"react";import{KernelContext as u}from"./context.js";import{IABContext as a}from"./context/iab-context-value.js";import{useCommittedRef as d}from"./hooks/use-committed-ref.js";let m=function(e){let[r,t]=c(()=>({kernel:e}));if(r.kernel===e)return r;let n={kernel:e};return t(n),n},p=({children:i,...p})=>{let f=n(u);if(!f)throw Error("IABProvider: no kernel in context. Wrap with <ConsentProvider options={...}> first.");let[h,v]=c("purposes"),g=m(f),b=d(g),[P,I]=c(null),V=P?.selection===g?P.handle:null,A=l(p),x=l(null),k=l(new WeakSet),C=l([]),w=l(!1),S=l(!1);o(()=>{A.current=p},[p]),o(()=>(w.current=!0,S.current=!1,()=>{w.current=!1,queueMicrotask(()=>{if(!w.current)for(let e of(S.current=!0,C.current.splice(0)))e.cancel()})}),[]),o(()=>{let e=k.current;if(e.delete(g),g.kernel.getSnapshot().externalPermissions)return;let t=r({...A.current,kernel:g.kernel});x.current={handle:t,selection:g},I({handle:t,selection:g});let n=C.current;for(let e of(C.current=[],n))e.selection===g?e.run(t):e.cancel();return()=>{x.current=null,e.add(g),t.dispose()}},[g]);let B=t(e=>{let r=b.current!==g,{current:t}=x;if(!r&&t?.selection===g)return Promise.resolve(e(t.handle));let n=new Promise((t,n)=>{if(g.kernel.getSnapshot().externalPermissions)return void n(Error("Consent is managed by an external CMP. Open its preferences instead."));let o=()=>n(new DOMException("IAB provider unmounted or switched to another consent kernel.","AbortError"));r||S.current||k.current.has(g)?o():C.current.push({cancel:o,run:async r=>{try{await e(r),t()}catch(e){n(e)}},selection:g})});return n.catch(()=>{}),n},[b,g]),j=s(()=>({customVendors:p.customVendors,filtered:!!p.vendors?.length,handle:V,run:B,setTab:v,tab:h}),[V,B,h,p.vendors?.length,p.customVendors]);return e(a.Provider,{value:j,children:i})},f=function(){let e=n(u),r=n(a);if(!e)throw Error("useIAB must be used within <ConsentProvider options={...}> from @c15t/react");let t=i(r=>e.subscribe(r),()=>e.getSnapshot().iab,()=>e.getServerSnapshot().iab);return s(()=>{if(!t)return null;let e=r?.handle,n=r?.run??(r=>e?Promise.resolve(r(e)):Promise.resolve()),o=e=>(...r)=>{n(t=>e(t)(...r))};return{...t,acceptAll:o(e=>e.acceptAll),config:{cmpId:t.cmpId,enabled:t.enabled},customVendors:r?.customVendors??t.customVendors,gvlReference:t.gvlReference&&r?.filtered?{...t.gvlReference,summary:void 0}:t.gvlReference,isLoadingGVL:t.enabled&&!t.gvl,nonIABVendors:r?.customVendors??t.customVendors,preferenceCenterTab:r?.tab??"purposes",rejectAll:o(e=>e.rejectAll),save:()=>n(e=>e.save()),setPreferenceCenterTab:r?.setTab??(()=>{}),setPurposeConsent:o(e=>e.setPurposeConsent),setPurposeLegitimateInterest:o(e=>e.setPurposeLegitimateInterest),setSpecialFeatureOptIn:o(e=>e.setSpecialFeatureOptIn),setVendorConsent:o(e=>e.setVendorConsent),setVendorLegitimateInterest:o(e=>e.setVendorLegitimateInterest)}},[t,r])};export{p as IABProvider,f as useIAB};
2
+ import{jsx as e}from"react/jsx-runtime";import{createIAB as r}from"@c15t/iab";import{useCallback as t,useContext as n,useEffect as o,useMemo as s,useRef as i,useState as l,useSyncExternalStore as c}from"react";import{KernelContext as u}from"./context.js";import{IABContext as a}from"./context/iab-context-value.js";import{useCommittedRef as d}from"./hooks/use-committed-ref.js";import{markIABProviderLoaded as m}from"./hooks/use-iab-policy-guard.js";m();let p=function(e){let[r,t]=l(()=>({kernel:e}));if(r.kernel===e)return r;let n={kernel:e};return t(n),n},f=({children:c,...m})=>{let f=n(u);if(!f)throw Error("IABProvider: no kernel in context. Wrap with <ConsentProvider options={...}> first.");let[h,v]=l("purposes"),g=p(f),b=d(g),[P,I]=l(null),V=P?.selection===g?P.handle:null,A=i(m),k=i(null),x=i(new WeakSet),C=i([]),w=i(!1),S=i(!1);o(()=>{A.current=m},[m]),o(()=>(w.current=!0,S.current=!1,()=>{w.current=!1,queueMicrotask(()=>{if(!w.current)for(let e of(S.current=!0,C.current.splice(0)))e.cancel()})}),[]),o(()=>{let e=x.current;if(e.delete(g),g.kernel.getSnapshot().externalPermissions)return;let t=r({...A.current,kernel:g.kernel});k.current={handle:t,selection:g},I({handle:t,selection:g});let n=C.current;for(let e of(C.current=[],n))e.selection===g?e.run(t):e.cancel();return()=>{k.current=null,e.add(g),t.dispose()}},[g]);let j=t(e=>{let r=b.current!==g,{current:t}=k;if(!r&&t?.selection===g)return Promise.resolve(e(t.handle));let n=new Promise((t,n)=>{if(g.kernel.getSnapshot().externalPermissions)return void n(Error("Consent is managed by an external CMP. Open its preferences instead."));let o=()=>n(new DOMException("IAB provider unmounted or switched to another consent kernel.","AbortError"));r||S.current||x.current.has(g)?o():C.current.push({cancel:o,run:async r=>{try{await e(r),t()}catch(e){n(e)}},selection:g})});return n.catch(()=>{}),n},[b,g]),B=s(()=>({customVendors:m.customVendors,filtered:!!m.vendors?.length,handle:V,run:j,setTab:v,tab:h}),[V,j,h,m.vendors?.length,m.customVendors]);return e(a.Provider,{value:B,children:c})},h=function(){let e=n(u),r=n(a);if(!e)throw Error("useIAB must be used within <ConsentProvider options={...}> from @c15t/react");let t=c(r=>e.subscribe(r),()=>e.getSnapshot().iab,()=>e.getServerSnapshot().iab);return s(()=>{if(!t)return null;let e=r?.handle,n=r?.run??(r=>e?Promise.resolve(r(e)):Promise.resolve()),o=e=>(...r)=>{n(t=>e(t)(...r))};return{...t,acceptAll:o(e=>e.acceptAll),config:{cmpId:t.cmpId,enabled:t.enabled},customVendors:r?.customVendors??t.customVendors,gvlReference:t.gvlReference&&r?.filtered?{...t.gvlReference,summary:void 0}:t.gvlReference,isLoadingGVL:t.enabled&&!t.gvl,nonIABVendors:r?.customVendors??t.customVendors,preferenceCenterTab:r?.tab??"purposes",rejectAll:o(e=>e.rejectAll),save:()=>n(e=>e.save()),setPreferenceCenterTab:r?.setTab??(()=>{}),setPurposeConsent:o(e=>e.setPurposeConsent),setPurposeLegitimateInterest:o(e=>e.setPurposeLegitimateInterest),setSpecialFeatureOptIn:o(e=>e.setSpecialFeatureOptIn),setVendorConsent:o(e=>e.setVendorConsent),setVendorLegitimateInterest:o(e=>e.setVendorLegitimateInterest)}},[t,r])};export{f as IABProvider,h as useIAB};
@@ -1 +1 @@
1
- import{evaluateConsent as e}from"@c15t/core";import{useContext as t,useSyncExternalStore as r}from"react";import{KernelContext as n}from"./context.js";import{defaultTranslationConfig as o}from"./utils/default-translation-config.js";let a=function(){let e=t(n);if(!e)throw Error("c15t: no kernel in context. Wrap your app with <ConsentProvider options={...}> from @c15t/react.");return e},s=function(e){let t=a();return r(e=>t.subscribe(e),()=>e(t.getSnapshot()),()=>e(t.getServerSnapshot()))},l=function(e){let t=a();return r(e=>t.subscribe(e),()=>e(t.getSnapshot(),Date.now()),()=>{let r=t.getServerSnapshot();return e(r,r.evaluatedAt)})},u=function(t){return l((r,n)=>e({category:t},r,n))},c=function(){return s(e=>e.translations?.language??o.defaultLanguage)};export{u as useCategoryAllowed,l as useGateSelector,a as useKernel,s as useKernelSelector,c as useTranslationLanguage};
1
+ import{evaluateConsent as e}from"@c15t/core";import{useContext as t,useSyncExternalStore as r}from"react";import{HydrationSnapshotContext as n,KernelContext as o}from"./context.js";import{defaultTranslationConfig as s}from"./utils/default-translation-config.js";let a=function(){let e=t(o);if(!e)throw Error("c15t: no kernel in context. Wrap your app with <ConsentProvider options={...}> from @c15t/react.");return e},l=function(e){let r=t(n);return()=>r??e?.getServerSnapshot()},u=function(e){let t=a(),n=l(t);return r(e=>t.subscribe(e),()=>e(t.getSnapshot()),()=>e(n()))},c=function(e){let t=a(),n=l(t);return r(e=>t.subscribe(e),()=>e(t.getSnapshot(),Date.now()),()=>{let t=n();return e(t,t.evaluatedAt)})},i=function(t){return c((r,n)=>e({category:t},r,n))},f=function(){return u(e=>e.translations?.language??s.defaultLanguage)};export{i as useCategoryAllowed,c as useGateSelector,a as useKernel,u as useKernelSelector,l as useServerSnapshot,f as useTranslationLanguage};
package/dist/provider.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
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 u}from"@c15t/core/modules/window-debug";import{claimEarlyJourney as d,createConsentProviderRuntime as m,hostedModes as p,lazyRuntimeModule as f,lazyStreamPrefetch as h,streamPrefetchWith as g}from"@c15t/core/runtime/provider";import{applyThemeSlots as y}from"@c15t/ui/utils";import{useCallback as v,useEffect as k,useLayoutEffect as S,useMemo as b,useReducer as w,useState as C,useSyncExternalStore as x}from"react";import{KernelContext as j,ProviderServicesContext as L}from"./context.js";import{ExternalIABProvider as N}from"./external-iab-context.js";import{useColorScheme as O}from"./hooks/use-color-scheme.js";import{useIsHydrated as D}from"./hooks/use-is-hydrated.js";import{createIframeBlockerOnDemand as P}from"./module-hooks/iframe-blocker.js";import{UNCOMMITTED_HOLD_MS as R}from"./module-hooks/network-hold.js";import{V3ThemeProvider as _}from"./theme-provider.js";let E=(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?.()}},T=async()=>(await import("@c15t/core/modules/script-loader")).createScriptLoader,q=function(e){let t=e.__resolveStreamedInit;return{connectConsentSource:E,createClearOnRevocation:f(async()=>(await import("@c15t/core/modules/clear-on-revocation")).createClearOnRevocation),createIframeBlocker:P,createNetworkBlocker:f(async()=>(await import("@c15t/core/modules/network-blocker")).createNetworkBlocker),createPersistence:l,createScriptLoader:f(T),createWindowDebug:u,preloadScriptLoader:e.__preloadScriptLoader?.(T),streamPrefetch:t?g(t):h,watchRevocationReload:c}},B=new WeakMap,J=new Set,K=(e,t)=>e.fetch===t.fetch&&e.initialData===t.initialData&&JSON.stringify(e)===JSON.stringify(t),A=function(o){if("function"!=typeof o)return o;let r=B.get(o);return r||(r=Object.assign(r=>e=(t=()=>o(Object.create(r,{iabEnabled:{value:void 0}})))(),{kind:o.kind}),B.set(o,r)),r},F=function(e){return{...e,mode:A(e.mode),pkg:e.__debugPkg??"@c15t/react"}},I=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)},M=function(e){let{journey:t}=e;return JSON.stringify({journey:t?[t.id,t.scope,t.storedChoice]:null,overrides:e.overrides,user:e.user})},V=new Set,W=0,z=function(o,r){let n,i,s,{mode:c,networkBlocker:l}=o,a=m(F(o),q(o)),u=o,f=!1,h=!1,g=0,y=e;W+=1;let v={expire(){J.delete(s),V.delete(v),clearTimeout(n),f=!0,a.dispose()},holdKey:!1!==o.enabled&&l&&!1!==l.enabled?JSON.stringify(l.rules):null,sequence:W};if("u"<typeof window)h=!0;else{V.add(v),n=setTimeout(v.expire,R);let e=a.kernel.getSnapshot(),l=p.get(c),u=l&&{...l,fetch:l.fetch??globalThis.fetch};if(r&&u&&e.policyPending&&!(o.prefetch||o.experiment)){let r=d({option:o.journey,storedChoice:I(o)}),n=r?{journey:r,overrides:e.overrides,user:e.user}:{overrides:e.overrides,user:e.user},c=M(n);for(let e of J)e.key===c&&K(e.options,u)&&(i=e);if(!i){let e=t(),o=e.init,r=o(n);r.catch(()=>void 0);let l=!1;e.init=e=>{let t=!l&&M(e)===c;return l=!0,t?r:o(e)},i=s={key:c,options:u,transport:e},J.add(s)}}}let k=function(){if(f)return!1;if(h)return!0;if(h=!0,J.delete(i)&&Object.assign(y,i?.transport),V.delete(v),clearTimeout(n),null!==v.holdKey)for(let e of V)e.sequence<v.sequence&&e.holdKey===v.holdKey&&e.expire();return!0};return{apply(e){e!==u&&(u=e,a.update(F(e)).catch(()=>void 0))},mount(){if(!k())return null;let e=g+=1;return a.start(),()=>{queueMicrotask(()=>{g===e&&a.dispose()})}},runtime:a}},H=function(){let e=null;return{get:(t,o)=>e??=z(t,o),reset(){e=null}}},G=e=>e+1,Q=()=>()=>void 0,U=function(e){let[t]=C(H),[,o]=w(G,0),r=D(),n=v(()=>{t.reset(),o()},[t]);return e?{entry:t.get(e,r),rebuild:n}:void 0},X="u"<typeof document?k:S,Y=({entry:e,options:t,rebuild:o})=>(X(()=>e.apply(t),[e,t]),k(()=>{let t=e.mount();return t||void o()},[e,o]),null),Z=e=>{let{children:t}=e,c=e.options??{},[l]=C(()=>e.runtime),a=U(l?void 0:c),u=a?.entry.runtime,d=l?e.runtime??l:void 0,m=u??d,p=x(u?u.subscribe:Q,()=>m.kernel,()=>m.kernel),[f]=C(()=>{var e;return l?l.experiment??s(c.experiment,(e=c.prefetch,"function"==typeof e?.then)?void 0:c.prefetch):void 0}),h=u?u.experiment:f,g=d?c.consentCategories:void 0;k(()=>{d&&void 0!==g&&d.setConsentCategories(g)},[d,g]);let{presentation:v}=c,S=b(()=>({clearRecords:()=>m.clearRecords(),getConsentCategories:()=>m.consentCategories,getPresentation:()=>n(v,h,p.getSnapshot().experiment),setLanguage:e=>m.setLanguage(e)}),[h,p,v,m]),w=!!d&&void 0!==c.callbacks;k(()=>{"production"!==process.env.NODE_ENV&&w&&console.warn("c15t ConsentProvider: `options.callbacks` is ignored when you pass `runtime`. Pass them to createConsentRuntime({ callbacks }) instead.")},[w]);let D=x(e=>p.subscribe(e),()=>p.getSnapshot().experiment,()=>p.getServerSnapshot().experiment),P=b(()=>i(c.theme,h,D),[c.theme,h,D]);k(()=>{"production"===process.env.NODE_ENV||!P||!["colors","dark","motion","radius","shadows","spacing","typography"].some(e=>e in P)||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")},[P]);let R=b(()=>({colorScheme:c.colorScheme,disableAnimation:c.disableAnimation,noStyle:c.noStyle,scrollLock:c.scrollLock,theme:P,trapFocus:c.trapFocus}),[P,c.noStyle,c.disableAnimation,c.scrollLock,c.trapFocus,c.colorScheme]),E=b(()=>({components:y(P?.slots,c.components,"className"),experiment:h,legalLinks:c.legalLinks,preloadDialog:c.preloadDialog,presentation:c.presentation,theme:c.theme}),[P?.slots,c.components,h,c.legalLinks,c.preloadDialog,c.presentation,c.theme]);return O(c.colorScheme),o(j.Provider,{value:p,children:o(L.Provider,{value:S,children:r(_,{themeConfig:R,uiConfig:E,children:[a?o(Y,{entry:a.entry,options:c,rebuild:a.rebuild}):null,d?o(N,{runtime:d,children:t}):t]})})})};export{Z 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 u}from"@c15t/core/modules/window-debug";import{claimEarlyJourney as d,createConsentProviderRuntime as m,hostedModes as p,lazyRuntimeModule as f,lazyStreamPrefetch as h,streamPrefetchWith as g}from"@c15t/core/runtime/provider";import{applyThemeSlots as y}from"@c15t/ui/utils";import{useCallback as v,useEffect as k,useLayoutEffect as S,useMemo as b,useReducer as w,useState as C,useSyncExternalStore as x}from"react";import{KernelContext as j,ProviderServicesContext as L,StreamedPrefetchContext as N}from"./context.js";import{ExternalIABProvider as O}from"./external-iab-context.js";import{useColorScheme as P}from"./hooks/use-color-scheme.js";import{useIsHydrated as D}from"./hooks/use-is-hydrated.js";import{createIframeBlockerOnDemand as R}from"./module-hooks/iframe-blocker.js";import{UNCOMMITTED_HOLD_MS as _}from"./module-hooks/network-hold.js";import{V3ThemeProvider as E}from"./theme-provider.js";let T=(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,q=function(e){let t=e.__resolveStreamedInit;return{connectConsentSource:T,createClearOnRevocation:f(async()=>(await import("@c15t/core/modules/clear-on-revocation")).createClearOnRevocation),createIframeBlocker:R,createNetworkBlocker:f(async()=>(await import("@c15t/core/modules/network-blocker")).createNetworkBlocker),createPersistence:l,createScriptLoader:f(B),createWindowDebug:u,preloadScriptLoader:e.__preloadScriptLoader?.(B),streamPrefetch:t?g(t):h,watchRevocationReload:c}},J=new WeakMap,K=new Set,A=(e,t)=>e.fetch===t.fetch&&e.initialData===t.initialData&&JSON.stringify(e)===JSON.stringify(t),F=function(o){if("function"!=typeof o)return o;let r=J.get(o);return r||(r=Object.assign(r=>e=(t=()=>o(Object.create(r,{iabEnabled:{value:void 0}})))(),{kind:o.kind}),J.set(o,r)),r},I=function(e){return{...e,mode:F(e.mode),pkg:e.__debugPkg??"@c15t/react"}},M=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)},V=function(e){let{journey:t}=e;return JSON.stringify({journey:t?[t.id,t.scope,t.storedChoice]:null,overrides:e.overrides,user:e.user})},W=new Set,z=0,H=function(o,r){let n,i,s,{mode:c,networkBlocker:l}=o,a=m(I(o),q(o)),u=o,f=!1,h=!1,g=0,y=e;z+=1;let v={expire(){K.delete(s),W.delete(v),clearTimeout(n),f=!0,a.dispose()},holdKey:!1!==o.enabled&&l&&!1!==l.enabled?JSON.stringify(l.rules):null,sequence:z};if("u"<typeof window)h=!0;else{W.add(v),n=setTimeout(v.expire,_);let e=a.kernel.getSnapshot(),l=p.get(c),u=l&&{...l,fetch:l.fetch??globalThis.fetch};if(r&&u&&e.policyPending&&!(o.prefetch||o.experiment)){let r=d({option:o.journey,storedChoice:M(o)}),n=r?{journey:r,overrides:e.overrides,user:e.user}:{overrides:e.overrides,user:e.user},c=V(n);for(let e of K)e.key===c&&A(e.options,u)&&(i=e);if(!i){let e=t(),o=e.init,r=o(n);r.catch(()=>void 0);let l=!1;e.init=e=>{let t=!l&&V(e)===c;return l=!0,t?r:o(e)},i=s={key:c,options:u,transport:e},K.add(s)}}}let k=function(){if(f)return!1;if(h)return!0;if(h=!0,K.delete(i)&&Object.assign(y,i?.transport),W.delete(v),clearTimeout(n),null!==v.holdKey)for(let e of W)e.sequence<v.sequence&&e.holdKey===v.holdKey&&e.expire();return!0};return{apply(e){e!==u&&(u=e,a.update(I(e)).catch(()=>void 0))},mount(){if(!k())return null;let e=g+=1;return a.start(),()=>{queueMicrotask(()=>{g===e&&a.dispose()})}},runtime:a}},G=function(){let e=null;return{get:(t,o)=>e??=H(t,o),reset(){e=null}}},Q=e=>e+1,U=()=>()=>void 0,X=function(e){let[t]=C(G),[,o]=w(Q,0),r=D(),n=v(()=>{t.reset(),o()},[t]);return e?{entry:t.get(e,r),rebuild:n}:void 0},Y="u"<typeof document?k:S,Z=({entry:e,options:t,rebuild:o})=>(Y(()=>e.apply(t),[e,t]),k(()=>{let t=e.mount();return t||void o()},[e,o]),null),$=e=>{let{children:t}=e,c=e.options??{},[l]=C(()=>e.runtime),a=X(l?void 0:c),u=a?.entry.runtime,d=l?e.runtime??l:void 0,m=u??d,p=x(u?u.subscribe:U,()=>m.kernel,()=>m.kernel),[f]=C(()=>{var e;return l?l.experiment??s(c.experiment,(e=c.prefetch,"function"==typeof e?.then)?void 0:c.prefetch):void 0}),h=u?u.experiment:f,g=d?c.consentCategories:void 0;k(()=>{d&&void 0!==g&&d.setConsentCategories(g)},[d,g]);let{presentation:v}=c,S=b(()=>({clearRecords:()=>m.clearRecords(),getConsentCategories:()=>m.consentCategories,getPresentation:()=>n(v,h,p.getSnapshot().experiment),setLanguage:e=>m.setLanguage(e)}),[h,p,v,m]),w=!!d&&void 0!==c.callbacks;k(()=>{"production"!==process.env.NODE_ENV&&w&&console.warn("c15t ConsentProvider: `options.callbacks` is ignored when you pass `runtime`. Pass them to createConsentRuntime({ callbacks }) instead.")},[w]);let D=x(e=>p.subscribe(e),()=>p.getSnapshot().experiment,()=>p.getServerSnapshot().experiment),R=b(()=>i(c.theme,h,D),[c.theme,h,D]);k(()=>{"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 _=b(()=>({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=b(()=>({components:y(R?.slots,c.components,"className"),experiment:h,legalLinks:c.legalLinks,nonce:c.nonce,preloadDialog:c.preloadDialog,presentation:c.presentation,styles:c.styles,theme:c.theme}),[R?.slots,c.components,h,c.legalLinks,c.nonce,c.preloadDialog,c.presentation,c.styles,c.theme]);return P(c.colorScheme),o(j.Provider,{value:p,children:o(L.Provider,{value:S,children:r(E,{themeConfig:_,uiConfig:T,children:[a?o(Z,{entry:a.entry,options:c,rebuild:a.rebuild}):null,d?o(O,{runtime:d,children:t}):o(N.Provider,{value:!1===c.streamBanner?void 0:u?.streamed,children:t})]})})})};export{$ as ConsentProvider};
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- let e="3.0.0-alpha.7";export{e as version};
1
+ let e="3.0.0-alpha.9";export{e as version};
@@ -73,6 +73,10 @@ interface ConsentBannerRootProps extends HTMLAttributes<HTMLDivElement> {
73
73
  */
74
74
  blocking?: boolean;
75
75
  }
76
+ /**
77
+ * The banner, rendered where the server can stream it: see
78
+ * `StreamedSurface`.
79
+ */
76
80
  declare const ConsentBannerRoot: FC<ConsentBannerRootProps>;
77
81
  declare const Root: FC<ConsentBannerRootProps>;
78
82
  export { ConsentBannerRoot, Root };
@@ -162,6 +162,10 @@ export interface ConsentBannerProps {
162
162
  */
163
163
  blocking?: boolean;
164
164
  }
165
+ /**
166
+ * The stock banner. It reads the policy to choose its buttons, so all of
167
+ * it renders where the server can stream it: see `StreamedSurface`.
168
+ */
165
169
  export declare const ConsentBanner: FC<ConsentBannerProps>;
166
170
  /**
167
171
  * Component type definition for the ConsentBanner with its compound components.
@@ -0,0 +1,9 @@
1
+ import type { SurfaceStyleSheet } from './surface-styles.js';
2
+ /**
3
+ * What the dialog and the preference widget render: the first-paint sheet,
4
+ * then the dialog and widget rules. Only their lazy chunks import this, so
5
+ * the dialog rules load with the dialog's code.
6
+ *
7
+ * @internal
8
+ */
9
+ export declare const DIALOG_SHEETS: readonly SurfaceStyleSheet[];
@@ -0,0 +1,8 @@
1
+ import type { SurfaceStyleSheet } from './surface-styles.js';
2
+ /**
3
+ * What the banner, trigger and ConsentGate render: tokens, every c15t
4
+ * variable and the first-paint rules of `styles.css`.
5
+ *
6
+ * @internal
7
+ */
8
+ export declare const FIRST_PAINT_SHEETS: readonly SurfaceStyleSheet[];
@@ -0,0 +1,3 @@
1
+ import type { SurfaceStyleSheet } from './surface-styles.js';
2
+ /** Styles for a standalone IAB dialog, loaded with its code. @internal */
3
+ export declare const IAB_DIALOG_SHEETS: readonly SurfaceStyleSheet[];
@@ -0,0 +1,3 @@
1
+ import type { SurfaceStyleSheet } from './surface-styles.js';
2
+ /** The shared tokens and IAB banner rules. @internal */
3
+ export declare const IAB_FIRST_PAINT_SHEETS: readonly SurfaceStyleSheet[];