@c15t/react 3.0.0-alpha.3 → 3.0.0-alpha.4

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 (183) hide show
  1. package/AGENTS.md +91 -72
  2. package/README.md +21 -17
  3. package/SKILL.md +34 -0
  4. package/dist/component-hooks/use-headless-consent-ui.js +1 -1
  5. package/dist/components/consent-gate/atoms.js +1 -1
  6. package/dist/components/consent-gate/consent-gate.js +1 -1
  7. package/dist/components/iab-panel/atoms/card.js +1 -1
  8. package/dist/components/iab-panel/atoms/feature-item.js +2 -0
  9. package/dist/components/iab-panel/atoms/header.js +1 -1
  10. package/dist/components/iab-panel/iab-panel.js +1 -1
  11. package/dist/components/iab-panel/index.js +1 -1
  12. package/dist/components/iab-prompt/atoms/overlay.js +1 -1
  13. package/dist/components/iab-prompt/atoms/root.js +1 -1
  14. package/dist/components/panel/atoms/card.js +1 -1
  15. package/dist/components/panel/atoms/root.js +1 -1
  16. package/dist/components/panel-trigger/atoms/button.js +1 -1
  17. package/dist/components/panel-trigger/atoms/toolbar.js +1 -1
  18. package/dist/components/preferences/atoms/accordion.js +1 -1
  19. package/dist/components/prompt/atoms/overlay.js +1 -1
  20. package/dist/components/prompt/atoms/root.js +1 -1
  21. package/dist/components/prompt/components.js +1 -1
  22. package/dist/components/shared/libs/compose-refs.js +1 -0
  23. package/dist/components/shared/libs/slot.js +1 -1
  24. package/dist/components/shared/primitives/button.js +1 -1
  25. package/dist/components/shared/ui/dialog/dialog.js +1 -1
  26. package/dist/components/shared/ui/icon.js +1 -1
  27. package/dist/context/consent-tracking-context.js +1 -1
  28. package/dist/devtools.js +1 -1
  29. package/dist/draft.js +1 -1
  30. package/dist/hooks/use-focus-trap.js +1 -1
  31. package/dist/hooks.js +1 -1
  32. package/dist/iab/styles.tw3.css +4 -4
  33. package/dist/index.js +1 -1
  34. package/dist/module-hooks/iframe-blocker.js +1 -1
  35. package/dist/postcss-tailwind3.js +1 -0
  36. package/dist/provider.js +1 -1
  37. package/dist/server/fetch-ssr-data.js +1 -1
  38. package/dist/server/headers.js +1 -1
  39. package/dist/server/normalize-url.js +1 -1
  40. package/dist/styles.tw3.css +16 -16
  41. package/dist/transports/offline.js +1 -1
  42. package/dist/ui-save.js +1 -1
  43. package/dist/utils/merge-slot-props.js +1 -1
  44. package/dist/utils/theme-utils.js +1 -1
  45. package/dist/version.js +1 -1
  46. package/dist-types/component-hooks/use-headless-consent-ui.d.ts +1 -1
  47. package/dist-types/components/iab-panel/atoms/feature-item.d.ts +28 -0
  48. package/dist-types/components/iab-panel/iab-panel.d.ts +2 -2
  49. package/dist-types/components/iab-panel/index.d.ts +5 -2
  50. package/dist-types/components/iab-panel/use-iab-translations.d.ts +4 -0
  51. package/dist-types/components/iab-prompt/iab-prompt.d.ts +2 -2
  52. package/dist-types/components/iab-prompt/index.d.ts +2 -2
  53. package/dist-types/components/panel/atoms/card.d.ts +1 -0
  54. package/dist-types/components/prompt/components.d.ts +6 -0
  55. package/dist-types/components/shared/libs/compose-refs.d.ts +20 -0
  56. package/dist-types/components/shared/ui/icon.d.ts +2 -1
  57. package/dist-types/context/consent-tracking-context.d.ts +10 -0
  58. package/dist-types/context/theme-context.d.ts +2 -2
  59. package/dist-types/context.d.ts +6 -0
  60. package/dist-types/devtools.d.ts +13 -2
  61. package/dist-types/draft.d.ts +10 -4
  62. package/dist-types/hooks/use-focus-trap.d.ts +3 -1
  63. package/dist-types/hooks.d.ts +54 -13
  64. package/dist-types/iab.d.ts +1 -1
  65. package/dist-types/index.d.ts +2 -2
  66. package/dist-types/postcss-tailwind3.d.ts +21 -0
  67. package/dist-types/provider.d.ts +22 -5
  68. package/dist-types/server/headers.d.ts +14 -4
  69. package/dist-types/server/normalize-url.d.ts +14 -7
  70. package/dist-types/server/types.d.ts +12 -1
  71. package/dist-types/transports/offline.d.ts +7 -16
  72. package/dist-types/ui-config-context.d.ts +7 -1
  73. package/dist-types/utils/merge-slot-props.d.ts +15 -1
  74. package/dist-types/utils/theme-utils.d.ts +17 -2
  75. package/dist-types/version.d.ts +1 -1
  76. package/docs/README.md +91 -72
  77. package/docs/assets/v3/bottom-bar.png +0 -0
  78. package/docs/assets/v3/brand-card.png +0 -0
  79. package/docs/assets/v3/brand-preferences.png +0 -0
  80. package/docs/assets/v3/choice-wall.png +0 -0
  81. package/docs/assets/v3/headless-bar-html.png +0 -0
  82. package/docs/assets/v3/headless-bar-mobile.png +0 -0
  83. package/docs/assets/v3/headless-bar.png +0 -0
  84. package/docs/assets/v3/slim-bar.png +0 -0
  85. package/docs/concepts/choose-your-setup.md +87 -0
  86. package/docs/{frameworks/react/concepts → concepts}/consent-categories.md +22 -7
  87. package/docs/{guides → concepts}/consent-state.md +71 -101
  88. package/docs/{guides → concepts}/data-fetching.md +31 -27
  89. package/docs/concepts/how-consent-works.md +123 -0
  90. package/docs/{frameworks/react/concepts/policy-presets.md → concepts/policies.md} +7 -59
  91. package/docs/customization/class-names.md +202 -0
  92. package/docs/customization/dark-mode.md +157 -0
  93. package/docs/customization/motion.md +119 -0
  94. package/docs/customization/overview.md +67 -34
  95. package/docs/customization/recipes.md +839 -49
  96. package/docs/customization/slots.md +216 -35
  97. package/docs/customization/stylesheets.md +147 -0
  98. package/docs/customization/tailwind.md +842 -0
  99. package/docs/customization/tokens.md +163 -96
  100. package/docs/customization/translations.md +61 -3
  101. package/docs/frameworks/react/callbacks.md +118 -0
  102. package/docs/frameworks/react/clear-on-revocation.md +106 -0
  103. package/docs/frameworks/react/components/consent-banner.md +42 -28
  104. package/docs/frameworks/react/components/consent-dialog-link.md +13 -11
  105. package/docs/frameworks/react/components/consent-dialog-trigger.md +81 -76
  106. package/docs/frameworks/react/components/consent-dialog.md +56 -50
  107. package/docs/frameworks/react/components/consent-gate.md +37 -20
  108. package/docs/frameworks/react/components/consent-provider.md +126 -0
  109. package/docs/frameworks/react/components/consent-widget.md +23 -20
  110. package/docs/frameworks/react/components/dev-tools.md +52 -84
  111. package/docs/frameworks/react/components.md +105 -0
  112. package/docs/frameworks/react/compose.md +354 -0
  113. package/docs/frameworks/react/content-security-policy.md +126 -0
  114. package/docs/frameworks/react/customize.md +250 -0
  115. package/docs/frameworks/react/embeds.md +89 -0
  116. package/docs/frameworks/react/{hooks/overview.md → hooks.md} +21 -16
  117. package/docs/frameworks/react/{iab/overview.md → iab.md} +80 -31
  118. package/docs/frameworks/react/network-blocker.md +35 -41
  119. package/docs/frameworks/react/quickstart.md +139 -101
  120. package/docs/frameworks/react/rendering.md +128 -0
  121. package/docs/frameworks/react/scripts.md +115 -0
  122. package/docs/frameworks/react/translations.md +155 -0
  123. package/docs/frameworks/react/troubleshooting.md +92 -47
  124. package/docs/frameworks/react/vendor-consent.md +170 -0
  125. package/docs/guides/banner-experiments.md +654 -0
  126. package/docs/guides/troubleshooting.md +120 -47
  127. package/docs/guides/verify-consent.md +81 -49
  128. package/docs/integrations/adobe-analytics.md +167 -159
  129. package/docs/integrations/ahrefs-analytics.md +152 -154
  130. package/docs/integrations/amplitude.md +162 -156
  131. package/docs/integrations/building-integrations.md +136 -37
  132. package/docs/integrations/clearbit.md +154 -154
  133. package/docs/integrations/cloudflare-web-analytics.md +156 -156
  134. package/docs/integrations/cloudflare-zaraz.md +209 -261
  135. package/docs/integrations/crisp.md +164 -158
  136. package/docs/integrations/databuddy.md +157 -173
  137. package/docs/integrations/fathom-analytics.md +158 -156
  138. package/docs/integrations/front-chat.md +167 -167
  139. package/docs/integrations/google-maps.md +118 -83
  140. package/docs/integrations/google-tag-manager.md +178 -163
  141. package/docs/integrations/google-tag.md +163 -160
  142. package/docs/integrations/heap.md +163 -155
  143. package/docs/integrations/hightouch.md +161 -157
  144. package/docs/integrations/hotjar.md +159 -155
  145. package/docs/integrations/intercom.md +183 -153
  146. package/docs/integrations/klaviyo.md +486 -0
  147. package/docs/integrations/linkedin-insights.md +174 -150
  148. package/docs/integrations/logrocket.md +160 -156
  149. package/docs/integrations/matomo-analytics.md +188 -178
  150. package/docs/integrations/meta-pixel.md +188 -150
  151. package/docs/integrations/microsoft-clarity.md +163 -155
  152. package/docs/integrations/microsoft-uet.md +148 -154
  153. package/docs/integrations/mixpanel-analytics.md +155 -160
  154. package/docs/integrations/one-dollar-stats.md +166 -165
  155. package/docs/integrations/openai-pixel.md +204 -301
  156. package/docs/integrations/overview.md +137 -80
  157. package/docs/integrations/pinterest-tag.md +191 -183
  158. package/docs/integrations/pirsch.md +169 -159
  159. package/docs/integrations/plausible-analytics.md +172 -158
  160. package/docs/integrations/posthog.md +226 -241
  161. package/docs/integrations/promptwatch.md +154 -154
  162. package/docs/integrations/reddit-pixel.md +185 -157
  163. package/docs/integrations/rudderstack.md +201 -186
  164. package/docs/integrations/rybbit-analytics.md +171 -160
  165. package/docs/integrations/segment.md +182 -154
  166. package/docs/integrations/snapchat-pixel.md +186 -156
  167. package/docs/integrations/tiktok-pixel.md +171 -150
  168. package/docs/integrations/umami-analytics.md +163 -158
  169. package/docs/integrations/vercel-analytics.md +166 -157
  170. package/docs/integrations/x-pixel.md +176 -150
  171. package/docs/integrations/youtube.md +121 -86
  172. package/docs/upgrade-v3.md +475 -467
  173. package/package.json +15 -9
  174. package/docs/assets/v3/brand-bar.png +0 -0
  175. package/docs/assets/v3/mobile-card.png +0 -0
  176. package/docs/assets/v3/preferences.png +0 -0
  177. package/docs/frameworks/react/components/consent-manager-provider.md +0 -95
  178. package/docs/frameworks/react/script-loader.md +0 -69
  179. package/docs/frameworks/react/styling/overview.md +0 -266
  180. package/docs/guides/deployment-modes.md +0 -75
  181. package/docs/guides/shared-consent-controls.md +0 -158
  182. package/docs/integrations/clear-on-revocation.md +0 -167
  183. package/docs/integrations/granular-consent.md +0 -210
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/branding";import i from"@c15t/ui/styles/components/consent-dialog";import{forwardRef as a}from"react";import{useTranslations as n}from"../../../component-hooks/use-translations.js";import{ConsentWidget as s}from"../../preferences/preferences.js";import{Slot as r}from"../../shared/libs/slot.js";import{Box as d}from"../../shared/primitives/box.js";import{InlineLegalLinks as l}from"../../shared/primitives/legal-links/index.js";import{BrandingLink as g}from"../../shared/ui/branding.js";import{useTheme as c}from"../../../hooks/use-theme.js";import{useUIConfig as m}from"../../../ui-config-context.js";import{cnExt as p}from"../../../utils/cn.js";import{mergeSlotProps as C}from"../../../utils/merge-slot-props.js";let f=a(({children:t,...o},a)=>e(d,{ref:a,baseClassName:i.card,...o,slotKey:"dialog.card","data-testid":"consent-dialog-card",tabIndex:-1,children:t}));f.displayName="ConsentDialogCard";let h=a(({children:t,...o},a)=>e(d,{ref:a,baseClassName:i.header,...o,slotKey:"dialog.header","data-testid":"consent-dialog-header",children:t}));h.displayName="ConsentDialogHeader";let D=a(({children:t,...o},a)=>{let{consentManagerDialog:s}=n();return e(d,{ref:a,baseClassName:i.title,slotKey:"dialog.title",...o,id:"consent-dialog-title","data-testid":"consent-dialog-title",asChild:!0,children:e("h2",{children:t??s.title})})});D.displayName="ConsentDialogHeaderTitle";let y=a(({children:o,legalLinks:a,asChild:s,className:d,style:g,noStyle:p,...f},h)=>{let{consentManagerDialog:D}=n(),{components:y}=m(),{noStyle:b}=c(),u="dialog",N=C(y?.description?.[u],{baseClassName:i.description,className:d,"data-context":u,"data-testid":"consent-dialog-description",id:"consent-dialog-description",noStyle:p??b,style:g,...f});return s?e(r,{ref:h,...N,children:o??D.description}):t("div",{ref:h,...N,children:[o??D.description,e(l,{links:a,context:"dialog",testIdPrefix:"consent-dialog-legal-link"})]})});y.displayName="ConsentDialogHeaderDescription";let b=a(({children:t,...o},a)=>e(d,{ref:a,baseClassName:i.content,slotKey:"dialog.content","data-testid":"consent-dialog-content",...o,children:t}));b.displayName="ConsentDialogContent";let u=t=>e(g,{...t}),N=a(({children:t,hideBranding:a,"data-testid":n,...s},r)=>e(d,{ref:r,baseClassName:p(i.footer,null==t&&!a&&o.brandingFooter),"data-testid":n??"consent-dialog-footer",...s,slotKey:"manager.footer",children:t??e(u,{hideBranding:a??!1,variant:"dialog-tag",slotContext:"dialog","data-testid":"consent-dialog-branding"})}));N.displayName="ConsentDialogFooter";let j=({noStyle:o,legalLinks:i,hideBranding:a})=>t(f,{children:[t(h,{children:[e(D,{}),e(y,{legalLinks:i})]}),e(b,{children:e(s,{hideBranding:!0,noStyle:o,useProvider:!0})}),e(u,{hideBranding:a??!1,variant:"dialog-tag",slotContext:"dialog","data-testid":"consent-dialog-branding"})]}),x=f,H=h,k=D,v=y,K=b,B=N;export{u as Branding,x as Card,j as ConsentCustomizationCard,f as ConsentDialogCard,b as ConsentDialogContent,N as ConsentDialogFooter,h as ConsentDialogHeader,y as ConsentDialogHeaderDescription,D as ConsentDialogHeaderTitle,K as Content,B as Footer,H as Header,v as HeaderDescription,k as HeaderTitle};
2
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/branding";import i from"@c15t/ui/styles/components/consent-dialog";import{forwardRef as a,isValidElement as n}from"react";import{useTranslations as s}from"../../../component-hooks/use-translations.js";import{ConsentWidget as r}from"../../preferences/preferences.js";import{Slot as d}from"../../shared/libs/slot.js";import{Box as l}from"../../shared/primitives/box.js";import{InlineLegalLinks as g}from"../../shared/primitives/legal-links/index.js";import{BrandingLink as c}from"../../shared/ui/branding.js";import{useTheme as m}from"../../../hooks/use-theme.js";import{useUIConfig as p}from"../../../ui-config-context.js";import{cnExt as C}from"../../../utils/cn.js";import{mergeSlotProps as f}from"../../../utils/merge-slot-props.js";let h=a(({children:t,...o},a)=>e(l,{ref:a,baseClassName:i.card,...o,slotKey:"dialog.card","data-testid":"consent-dialog-card",tabIndex:-1,children:t}));h.displayName="ConsentDialogCard";let D=a(({children:t,...o},a)=>e(l,{ref:a,baseClassName:i.header,...o,slotKey:"dialog.header","data-testid":"consent-dialog-header",children:t}));D.displayName="ConsentDialogHeader";let y=a(({children:t,asChild:o,...a},r)=>{let{consentManagerDialog:d}=s();return e(l,{ref:r,baseClassName:i.title,slotKey:"dialog.title",...a,id:"consent-dialog-title","data-testid":"consent-dialog-title",asChild:!0,children:o&&n(t)?t:e("h2",{children:t??d.title})})});y.displayName="ConsentDialogHeaderTitle";let b=a(({children:o,legalLinks:a,asChild:r,className:l,style:c,noStyle:C,...h},D)=>{let{consentManagerDialog:y}=s(),{components:b}=p(),{noStyle:u}=m(),N="dialog",j=f(b?.description?.[N],{baseClassName:i.description,className:l,"data-context":N,"data-testid":"consent-dialog-description",id:"consent-dialog-description",noStyle:C??u,style:c,...h});return r&&n(o)?e(d,{ref:D,...j,children:o}):t("div",{ref:D,...j,children:[o??y.description,e(g,{links:a,context:"dialog",testIdPrefix:"consent-dialog-legal-link"})]})});b.displayName="ConsentDialogHeaderDescription";let u=a(({children:t,...o},a)=>e(l,{ref:a,baseClassName:i.content,slotKey:"dialog.content","data-testid":"consent-dialog-content",...o,children:t}));u.displayName="ConsentDialogContent";let N=t=>e(c,{...t}),j=a(({children:t,hideBranding:a,"data-testid":n,...s},r)=>e(l,{ref:r,baseClassName:C(i.footer,null==t&&!a&&o.brandingFooter),"data-testid":n??"consent-dialog-footer",...s,slotKey:"manager.footer",children:t??e(N,{hideBranding:a??!1,variant:"dialog-tag",slotContext:"dialog","data-testid":"consent-dialog-branding"})}));j.displayName="ConsentDialogFooter";let x=({noStyle:o,legalLinks:i,hideBranding:a})=>t(h,{children:[t(D,{children:[e(y,{}),e(b,{legalLinks:i})]}),e(u,{children:e(r,{hideBranding:!0,noStyle:o,useProvider:!0})}),e(N,{hideBranding:a??!1,variant:"dialog-tag",slotContext:"dialog","data-testid":"consent-dialog-branding"})]}),H=h,k=D,v=y,K=b,B=u,F=j;export{N as Branding,H as Card,x as ConsentCustomizationCard,h as ConsentDialogCard,u as ConsentDialogContent,j as ConsentDialogFooter,D as ConsentDialogHeader,b as ConsentDialogHeaderDescription,y as ConsentDialogHeaderTitle,B as Content,F as Footer,k as Header,K as HeaderDescription,v as HeaderTitle};
@@ -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 g}from"../../../hooks.js";import{useFocusTrap as k}from"../../../hooks/use-focus-trap.js";import{useIsHydrated as h}from"../../../hooks/use-is-hydrated.js";import{useScrollLock as b}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 A}from"../../../utils/cn.js";import{mergeSlotProps as F}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=g(),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=h(),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]),k(oe&&_,on),n(()=>{if(!oe)return;let o=o=>{r(o.key)&&(o.preventDefault(),W())};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[W,oe]),b(oe&&$);let oa=Y?i.root:A(i.root,ot?i.dialogVisible:i.dialogHidden),om=F(M?.dialog?.root,{baseClassName:oa,className:R,noStyle:Z,style:T,...V}),oc=F(M?.dialog?.container,{baseClassName:A(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 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};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/consent-dialog-trigger";import{forwardRef as r}from"react";import{useIdleDialogWarming as e,warmDialogChunk as i}from"../../../chunk-warming.js";import{usePolicyRule as n}from"../../../hooks.js";import{useTheme as s}from"../../../hooks/use-theme.js";import{useUIConfig as m}from"../../../ui-config-context.js";import{mergeSlotProps as g}from"../../../utils/merge-slot-props.js";import{useTriggerContext as a}from"./root.js";let l={"bottom-left":o.bottomLeft,"bottom-right":o.bottomRight,"top-left":o.topLeft,"top-right":o.topRight},p={lg:o.lg,md:o.md,sm:o.sm},c=r(({children:r,size:c="md",ariaLabel:d="Open privacy settings",className:f,"data-testid":u="consent-dialog-trigger",noStyle:h},b)=>{let j=n(),{components:y}=m(),{noStyle:k}=s(),{corner:x,isDragging:C,isSnapping:B,wasDragged:E,handlers:F,dragStyle:L,openDialog:N}=a();e(!0);let P=g(y?.trigger?.root,{baseClassName:[o.trigger,l[x],p[c],C&&o.dragging,B&&o.snapping],className:f,"data-testid":u,noStyle:h??k,style:L,...F});return t("button",{...P,ref:b,type:"button","data-c15t-trigger":"true","data-c15t-rights":j.rights.join(" "),"aria-label":d,onClick:t=>{0!==t.detail&&E()||N()},onFocus:t=>{P.onFocus?.(t),i()},onPointerEnter:t=>{P.onPointerEnter?.(t),i()},children:r})});c.displayName="ConsentDialogTrigger.Button";export{c as TriggerButton};
2
+ import{jsx as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/consent-dialog-trigger";import{forwardRef as r}from"react";import{useIdleDialogWarming as e,warmDialogChunk as i}from"../../../chunk-warming.js";import{usePolicyRule as n}from"../../../hooks.js";import{useTheme as s}from"../../../hooks/use-theme.js";import{useUIConfig as m}from"../../../ui-config-context.js";import{mergeSlotProps as g}from"../../../utils/merge-slot-props.js";import{useTriggerContext as a}from"./root.js";let l={"bottom-left":o.bottomLeft,"bottom-right":o.bottomRight,"top-left":o.topLeft,"top-right":o.topRight},p={lg:o.lg,md:o.md,sm:o.sm},d=r(({children:r,size:d="md",ariaLabel:c="Open privacy settings",className:f,"data-testid":u="consent-dialog-trigger",noStyle:h},b)=>{let j=n(),{components:y}=m(),{disableAnimation:k,noStyle:x}=s(),{corner:C,isDragging:v,isSnapping:B,wasDragged:E,handlers:F,dragStyle:L,openDialog:N}=a();e(!0);let P=g(y?.trigger?.root,{baseClassName:[o.trigger,l[C],p[d],v&&o.dragging,B&&o.snapping],className:f,"data-testid":u,noStyle:h??x,style:L,...F});return t("button",{...P,ref:b,type:"button","data-c15t-trigger":"true","data-c15t-rights":j.rights.join(" "),"data-disable-animation":k?"":void 0,"aria-label":c,onClick:t=>{0!==t.detail&&E()||N()},onFocus:t=>{P.onFocus?.(t),i()},onPointerEnter:t=>{P.onPointerEnter?.(t),i()},children:r})});d.displayName="ConsentDialogTrigger.Button";export{d as TriggerButton};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as e}from"react/jsx-runtime";import{createElement as t,useMemo as r,useRef as o,useState as i}from"react";import n from"@c15t/ui/styles/components/consent-dialog-trigger";import{useTranslations as s}from"../../../component-hooks/use-translations.js";import{usePolicyRule as a}from"../../../hooks.js";import{useTheme as l}from"../../../hooks/use-theme.js";import{useUIConfig as d}from"../../../ui-config-context.js";import{mergeSlotProps as c}from"../../../utils/merge-slot-props.js";import{TriggerIcon as g}from"./icon.js";import{useTriggerContext as m}from"./root.js";let f={"bottom-left":n.bottomLeft,"bottom-right":n.bottomRight,"top-left":n.topLeft,"top-right":n.topRight},p={lg:n.lg,md:n.md,sm:n.sm},u=function(){let e=a(),{rights:t}=s();return r(()=>{let r=e.rights.includes("opt-out")?"opt-out":"preferences";return{label:"opt-out"===r&&e.i18n?.messageProfile!=="preferences"?t?.optOut??"Do not sell or share my data":t?.preferences??"Manage preferences",right:r,rights:e.rights.join(" ")}},[e.rights,e.i18n?.messageProfile,t])},b=function(e,t,r,o,i){let n=e.map(e=>({...e,focusId:`custom:${e.id}`,kind:"custom"}));return i?[...n,{className:t.className,focusId:"preferences",icon:t.icon??"branding",id:"preferences",kind:"preferences",label:t.label??o,onSelect:t.onSelect,right:r,style:t.style}]:n},h=function(e,t,r){let o=e.find(e=>"preferences"===e.kind);if(!o)return e;let i=e.filter(e=>"custom"===e.kind);return("horizontal"===t?r.endsWith("left"):r.startsWith("top"))?[o,...i]:[...i,o]},y=({actions:s,preferences:a,size:y="md",orientation:k="horizontal",ariaLabel:I="Privacy controls",showPreferences:v=!0,className:j,style:N,noStyle:S=!1})=>{let{components:w}=d(),{noStyle:x}=l(),{label:C,right:D,rights:A}=u(),{corner:T,isDragging:L,isSnapping:P,wasDragged:R,handlers:z,dragStyle:E,openDialog:H}=m(),M=r(()=>h(b(s,a,D,C,v),k,T),[s,T,C,k,a,D,v]),W=M.find(e=>!e.disabled)?.focusId,[B,F]=i(W),K=o(new Map),O=S||x,U=c(w?.trigger?.toolbar,{baseClassName:[n.toolbar,"vertical"===k&&n.toolbarVertical,f[T],L&&n.dragging,P&&n.snapping],className:j,noStyle:O,style:N}),V=c(w?.trigger?.toolbarItem,{baseClassName:[n.toolbarItem,p[y]],noStyle:O}),$=c(w?.trigger?.toolbarIcon,{baseClassName:n.toolbarIcon,noStyle:O}),q=M.some(e=>e.focusId===B&&!e.disabled)?B:W;return e("div",{...U,"aria-label":I,"aria-orientation":k,"data-corner":T,"data-c15t-trigger-toolbar":"true","data-c15t-trigger":"true","data-dragging":L||void 0,"data-snapping":P||void 0,dir:"ltr",onKeyDown:e=>{let t,r="vertical"===k?"ArrowDown":"ArrowRight",o="vertical"===k?"ArrowUp":"ArrowLeft";if(e.key!==r&&e.key!==o&&"Home"!==e.key&&"End"!==e.key)return;let i=M.filter(e=>!e.disabled);if(0===i.length)return;e.preventDefault();let n=i.findIndex(e=>e.focusId===q);t="Home"===e.key?0:"End"===e.key?i.length-1:e.key===r?(n+1)%i.length:(n-1+i.length)%i.length;let s=i[t];s&&(F(s.focusId),K.current.get(s.focusId)?.focus())},role:"toolbar",style:{...U.style,...E},tabIndex:-1,...z,children:M.map(r=>t("button",{...V,key:r.focusId,ref:e=>{e?K.current.set(r.focusId,e):K.current.delete(r.focusId)},"aria-label":r.label,"aria-pressed":"custom"===r.kind?r.pressed:void 0,className:[V.className,r.className].filter(Boolean).join(" "),"data-c15t-rights":"preferences"===r.kind?A:void 0,"data-c15t-trigger-action":r.kind,"data-c15t-trigger-item":r.id,"data-right":"preferences"===r.kind?r.right:void 0,disabled:r.disabled,onClick:e=>{!(0!==e.detail&&R())&&(r.onSelect?.(),"preferences"===r.kind&&H())},onFocus:()=>F(r.focusId),style:{...V.style,...r.style},tabIndex:r.focusId===q?0:-1,type:"button"},e("span",{...$,"aria-hidden":"true",children:e(g,{icon:r.icon,noStyle:O})})))})};y.displayName="ConsentDialogTriggerToolbar";export{y as TriggerToolbar};
2
+ import{jsx as e}from"react/jsx-runtime";import{createElement as t,useMemo as r,useRef as o,useState as i}from"react";import n from"@c15t/ui/styles/components/consent-dialog-trigger";import{useTranslations as a}from"../../../component-hooks/use-translations.js";import{usePolicyRule as s}from"../../../hooks.js";import{useTheme as l}from"../../../hooks/use-theme.js";import{useUIConfig as d}from"../../../ui-config-context.js";import{mergeSlotProps as c}from"../../../utils/merge-slot-props.js";import{TriggerIcon as g}from"./icon.js";import{useTriggerContext as m}from"./root.js";let f={"bottom-left":n.bottomLeft,"bottom-right":n.bottomRight,"top-left":n.topLeft,"top-right":n.topRight},p={lg:n.lg,md:n.md,sm:n.sm},u=function(){let e=s(),{rights:t}=a();return r(()=>{let r=e.rights.includes("opt-out")?"opt-out":"preferences";return{label:"opt-out"===r&&e.i18n?.messageProfile!=="preferences"?t?.optOut??"Do not sell or share my data":t?.preferences??"Manage preferences",right:r,rights:e.rights.join(" ")}},[e.rights,e.i18n?.messageProfile,t])},b=function(e,t,r,o,i){let n=e.map(e=>({...e,focusId:`custom:${e.id}`,kind:"custom"}));return i?[...n,{className:t.className,focusId:"preferences",icon:t.icon??"branding",id:"preferences",kind:"preferences",label:t.label??o,onSelect:t.onSelect,right:r,style:t.style}]:n},h=function(e,t,r){let o=e.find(e=>"preferences"===e.kind);if(!o)return e;let i=e.filter(e=>"custom"===e.kind);return("horizontal"===t?r.endsWith("left"):r.startsWith("top"))?[o,...i]:[...i,o]},y=({actions:a,preferences:s,size:y="md",orientation:k="horizontal",ariaLabel:I="Privacy controls",showPreferences:v=!0,className:j,style:N,noStyle:S=!1})=>{let{components:w}=d(),{disableAnimation:x,noStyle:C}=l(),{label:D,right:A,rights:T}=u(),{corner:L,isDragging:P,isSnapping:R,wasDragged:z,handlers:E,dragStyle:H,openDialog:M}=m(),W=r(()=>h(b(a,s,A,D,v),k,L),[a,L,D,k,s,A,v]),B=W.find(e=>!e.disabled)?.focusId,[F,K]=i(B),O=o(new Map),U=S||C,V=c(w?.trigger?.toolbar,{baseClassName:[n.toolbar,"vertical"===k&&n.toolbarVertical,f[L],P&&n.dragging,R&&n.snapping],className:j,noStyle:U,style:N}),$=c(w?.trigger?.toolbarItem,{baseClassName:[n.toolbarItem,p[y]],noStyle:U}),q=c(w?.trigger?.toolbarIcon,{baseClassName:n.toolbarIcon,noStyle:U}),G=W.some(e=>e.focusId===F&&!e.disabled)?F:B;return e("div",{...V,"aria-label":I,"aria-orientation":k,"data-corner":L,"data-c15t-trigger-toolbar":"true","data-c15t-trigger":"true","data-disable-animation":x?"":void 0,"data-dragging":P||void 0,"data-snapping":R||void 0,dir:"ltr",onKeyDown:e=>{let t,r="vertical"===k?"ArrowDown":"ArrowRight",o="vertical"===k?"ArrowUp":"ArrowLeft";if(e.key!==r&&e.key!==o&&"Home"!==e.key&&"End"!==e.key)return;let i=W.filter(e=>!e.disabled);if(0===i.length)return;e.preventDefault();let n=i.findIndex(e=>e.focusId===G);t="Home"===e.key?0:"End"===e.key?i.length-1:e.key===r?(n+1)%i.length:(n-1+i.length)%i.length;let a=i[t];a&&(K(a.focusId),O.current.get(a.focusId)?.focus())},role:"toolbar",style:{...V.style,...H},tabIndex:-1,...E,children:W.map(r=>t("button",{...$,key:r.focusId,ref:e=>{e?O.current.set(r.focusId,e):O.current.delete(r.focusId)},"aria-label":r.label,"aria-pressed":"custom"===r.kind?r.pressed:void 0,className:[$.className,r.className].filter(Boolean).join(" "),"data-c15t-rights":"preferences"===r.kind?T:void 0,"data-c15t-trigger-action":r.kind,"data-c15t-trigger-item":r.id,"data-right":"preferences"===r.kind?r.right:void 0,disabled:r.disabled,onClick:e=>{!(0!==e.detail&&z())&&(r.onSelect?.(),"preferences"===r.kind&&M())},onFocus:()=>K(r.focusId),style:{...$.style,...r.style},tabIndex:r.focusId===G?0:-1,type:"button"},e("span",{...q,"aria-hidden":"true",children:e(g,{icon:r.icon,noStyle:U})})))})};y.displayName="ConsentDialogTriggerToolbar";export{y as TriggerToolbar};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/accordion";import{createContext as n,forwardRef as i,useCallback as r,useContext as a,useMemo as c}from"react";import{useTranslations as s}from"../../../component-hooks/use-translations.js";import{Box as d}from"../../shared/primitives/box.js";import{LucideIcon as l}from"../../shared/ui/icon.js";import{useConsentDraftSlice as m,useConsentDraftStore as p}from"../../../draft.js";import{useExplicitChoice as g,useRestrictions as u}from"../../../hooks.js";import{useTheme as y}from"../../../hooks/use-theme.js";import{useDisplayedCategories as h}from"../../../kernel-selector.js";import{ConsentWidgetVendorList as f}from"./vendor-list.js";import*as w from"../../shared/ui/preference-item/index.js";import*as C from"../../shared/ui/switch/index.js";let v=[{defaultValue:!0,description:"Required for basic site functionality",disabled:!0,display:!0,gdprType:1,name:"necessary"},{defaultValue:!1,description:"Enables enhanced features",display:!0,gdprType:2,name:"functionality"},{defaultValue:!1,description:"Analytics and performance measurement",display:!0,gdprType:4,name:"measurement"},{defaultValue:!1,description:"Improves your experience",display:!0,gdprType:3,name:"experience"},{defaultValue:!1,description:"Advertising and marketing",display:!0,gdprType:5,name:"marketing"}],A=n(null),S=function(){let e=a(A);if(!e)throw Error("ConsentWidgetAccordion components must be used within ConsentWidgetAccordion");return e},N=i(({children:t,...n},i)=>e(d,{ref:i,baseClassName:o.triggerRow,...n,children:t}));N.displayName="ConsentWidgetAccordionTrigger";let b=w.Trigger,T=w.Content,W=w.Leading,j=C.Root,I=({"data-testid":t,children:n,className:i,noStyle:a,onValueChange:s,style:l,type:m="multiple",value:p,...g})=>{let{noStyle:u}=y(),h=a??u,f=c(()=>Array.isArray(p)?p:p?[p]:[],[p]),w=r((e,t)=>{if("single"===m)return void s?.(t?e:"");let o=t?[...new Set([...f,e])]:f.filter(t=>t!==e);s?.(o)},[s,f,m]),C=c(()=>({noStyle:h,onToggleItem:w,openValues:f}),[h,w,f]);return e(A.Provider,{value:C,children:e(d,{className:i,"data-testid":t??"consent-widget-accordion",noStyle:a,style:l,slotKey:"accordion.root",baseClassName:o.list,...g,children:n})})},K=l({iconPath:e("path",{d:"M5 12h14M12 5v14"}),title:"Open"}),V=l({iconPath:e("path",{d:"M5 12h14"}),title:"Close"}),k=({consent:n,title:i,description:r,restricted:a,open:c,noStyle:s,onToggleItem:d})=>{let l=p(),g=m(l,e=>e.values[n.name]);return t(w.Root,{className:s?void 0:o.item,"data-testid":`consent-widget-accordion-item-${n.name}`,noStyle:!0,onOpenChange:e=>d(n.name,e),open:c,slotKey:"accordion-item.root",children:[t(N,{slotKey:"accordion.triggerRow",children:[t(b,{className:s?void 0:o.trigger,"data-testid":`consent-widget-accordion-trigger-${n.name}`,noStyle:!0,slotKey:"accordion-item.trigger",children:[e(W,{className:s?void 0:o.arrow,"data-testid":`consent-widget-accordion-arrow-${n.name}`,noStyle:!0,slotKey:"accordion.arrow",children:c?e(V,{}):e(K,{})}),e(w.Header,{noStyle:!0,slotKey:"accordion.header",children:e(w.Title,{className:s?void 0:o.title,noStyle:!0,slotKey:"accordion.title",children:i})})]}),e(w.Control,{className:s?void 0:o.control,noStyle:!0,slotKey:"accordion.control",children:e(j,{"aria-label":i,checked:g,"aria-describedby":a?`c15t-restriction-${n.name}`:void 0,onCheckedChange:e=>l.set(n.name,e),disabled:n.disabled,size:"small","data-testid":`consent-widget-switch-${n.name}`})})]}),a?e("output",{className:s?void 0:o.restriction,"data-testid":`consent-widget-restriction-${n.name}`,id:`c15t-restriction-${n.name}`,children:"Your saved choice is restricted by the current privacy settings."}):null,t(T,{className:s?void 0:o.content,"data-testid":`consent-widget-accordion-content-${n.name}`,innerClassName:s?void 0:o.contentInner,innerSlotKey:"accordion.contentInner",slotKey:"accordion-item.content",viewportClassName:s?void 0:o.contentViewport,viewportSlotKey:"accordion.contentViewport",children:[r,e(f,{category:n.name,noStyle:s})]})]})},$=()=>{let t=h(),o=g(),n=u(),i=function(e){if("necessary"===e)return!1;let t=o?.categories[e];return t?.value===!0&&(n[e]?.length??0)>0},{noStyle:r,onToggleItem:a,openValues:d}=S(),{consentTypes:l}=s();return c(()=>{let e=new Set(t);return v.filter(t=>e.has(t.name))},[t]).map(t=>e(k,{consent:t,description:l[t.name]?.description??t.description,noStyle:r,onToggleItem:a,open:d.includes(t.name),restricted:i(t.name),title:l[t.name]?.title??t.name.replace(/_/gu," ").replace(/\b\w/gu,e=>e.toUpperCase())},t.name))},x=i(({className:t,...n},i)=>e(w.Root,{ref:i,className:[o.item,t].filter(Boolean).join(" "),noStyle:!0,...n}));x.displayName="ConsentWidgetAccordionItem";let R=b,L=N,M=T,P=W,E=I,O=j,q=$,z=x,B=f;export{E as Accordion,P as AccordionArrow,M as AccordionContent,z as AccordionItem,q as AccordionItems,L as AccordionTrigger,R as AccordionTriggerInner,I as ConsentWidgetAccordion,W as ConsentWidgetAccordionArrow,T as ConsentWidgetAccordionContent,x as ConsentWidgetAccordionItem,$ as ConsentWidgetAccordionItems,N as ConsentWidgetAccordionTrigger,b as ConsentWidgetAccordionTriggerInner,j as ConsentWidgetSwitch,f as ConsentWidgetVendorList,O as Switch,B as VendorList};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import o from"@c15t/ui/styles/components/accordion";import{createContext as n,forwardRef as i,useCallback as r,useContext as a,useMemo as c}from"react";import{useTranslations as d}from"../../../component-hooks/use-translations.js";import{Box as s}from"../../shared/primitives/box.js";import{LucideIcon as l}from"../../shared/ui/icon.js";import{useConsentDraftSlice as m,useConsentDraftStore as p}from"../../../draft.js";import{useExplicitChoice as g,useRestrictions as u}from"../../../hooks.js";import{useTheme as y}from"../../../hooks/use-theme.js";import{useDisplayedCategories as h}from"../../../kernel-selector.js";import{ConsentWidgetVendorList as f}from"./vendor-list.js";import*as w from"../../shared/ui/preference-item/index.js";import*as C from"../../shared/ui/switch/index.js";let v=[{defaultValue:!0,description:"Required for basic site functionality",disabled:!0,display:!0,gdprType:1,name:"necessary"},{defaultValue:!1,description:"Enables enhanced features",display:!0,gdprType:2,name:"functionality"},{defaultValue:!1,description:"Analytics and performance measurement",display:!0,gdprType:4,name:"measurement"},{defaultValue:!1,description:"Improves your experience",display:!0,gdprType:3,name:"experience"},{defaultValue:!1,description:"Advertising and marketing",display:!0,gdprType:5,name:"marketing"}],A=n(null),S=function(){let e=a(A);if(!e)throw Error("ConsentWidgetAccordion components must be used within ConsentWidgetAccordion");return e},N=i(({children:t,...n},i)=>e(s,{ref:i,baseClassName:o.triggerRow,...n,children:t}));N.displayName="ConsentWidgetAccordionTrigger";let b=w.Trigger,T=w.Content,W=w.Leading,j=C.Root,I=({"data-testid":t,children:n,className:i,noStyle:a,onValueChange:d,style:l,type:m="multiple",value:p,...g})=>{let{noStyle:u}=y(),h=a??u,f=c(()=>Array.isArray(p)?p:p?[p]:[],[p]),w=r((e,t)=>{if("single"===m)return void d?.(t?e:"");let o=t?[...new Set([...f,e])]:f.filter(t=>t!==e);d?.(o)},[d,f,m]),C=c(()=>({noStyle:h,onToggleItem:w,openValues:f}),[h,w,f]);return e(A.Provider,{value:C,children:e(s,{className:i,"data-testid":t??"consent-widget-accordion",noStyle:a,style:l,slotKey:"accordion.root",baseClassName:o.list,...g,children:n})})},K=l({iconPath:e("path",{d:"M5 12h14M12 5v14"})}),V=l({iconPath:e("path",{d:"M5 12h14"})}),k=({consent:n,title:i,description:r,restricted:a,open:c,noStyle:d,onToggleItem:s})=>{let l=p(),g=m(l,e=>e.values[n.name]);return t(w.Root,{className:d?void 0:o.item,"data-testid":`consent-widget-accordion-item-${n.name}`,noStyle:!0,onOpenChange:e=>s(n.name,e),open:c,slotKey:"accordion-item.root",children:[t(N,{slotKey:"accordion.triggerRow",children:[t(b,{className:d?void 0:o.trigger,"data-testid":`consent-widget-accordion-trigger-${n.name}`,noStyle:!0,slotKey:"accordion-item.trigger",children:[e(W,{className:d?void 0:o.arrow,"data-testid":`consent-widget-accordion-arrow-${n.name}`,noStyle:!0,slotKey:"accordion.arrow",children:c?e(V,{"aria-hidden":"true"}):e(K,{"aria-hidden":"true"})}),e(w.Header,{noStyle:!0,slotKey:"accordion.header",children:e(w.Title,{className:d?void 0:o.title,noStyle:!0,slotKey:"accordion.title",children:i})})]}),e(w.Control,{className:d?void 0:o.control,noStyle:!0,slotKey:"accordion.control",children:e(j,{"aria-label":i,checked:g,"aria-describedby":a?`c15t-restriction-${n.name}`:void 0,onCheckedChange:e=>l.set(n.name,e),disabled:n.disabled,size:"small","data-testid":`consent-widget-switch-${n.name}`})})]}),a?e("output",{className:d?void 0:o.restriction,"data-testid":`consent-widget-restriction-${n.name}`,id:`c15t-restriction-${n.name}`,children:"Your saved choice is restricted by the current privacy settings."}):null,t(T,{className:d?void 0:o.content,"data-testid":`consent-widget-accordion-content-${n.name}`,innerClassName:d?void 0:o.contentInner,innerSlotKey:"accordion.contentInner",slotKey:"accordion-item.content",viewportClassName:d?void 0:o.contentViewport,viewportSlotKey:"accordion.contentViewport",children:[r,e(f,{category:n.name,noStyle:d})]})]})},$=()=>{let t=h(),o=g(),n=u(),i=function(e){if("necessary"===e)return!1;let t=o?.categories[e];return t?.value===!0&&(n[e]?.length??0)>0},{noStyle:r,onToggleItem:a,openValues:s}=S(),{consentTypes:l}=d();return c(()=>{let e=new Set(t);return v.filter(t=>e.has(t.name))},[t]).map(t=>e(k,{consent:t,description:l[t.name]?.description??t.description,noStyle:r,onToggleItem:a,open:s.includes(t.name),restricted:i(t.name),title:l[t.name]?.title??t.name.replace(/_/gu," ").replace(/\b\w/gu,e=>e.toUpperCase())},t.name))},x=i(({className:t,...n},i)=>e(w.Root,{ref:i,className:[o.item,t].filter(Boolean).join(" "),noStyle:!0,...n}));x.displayName="ConsentWidgetAccordionItem";let R=b,L=N,M=T,P=W,E=I,q=j,z=$,B=x,H=f;export{E as Accordion,P as AccordionArrow,M as AccordionContent,B as AccordionItem,z as AccordionItems,L as AccordionTrigger,R as AccordionTriggerInner,I as ConsentWidgetAccordion,W as ConsentWidgetAccordionArrow,T as ConsentWidgetAccordionContent,x as ConsentWidgetAccordionItem,$ as ConsentWidgetAccordionItems,N as ConsentWidgetAccordionTrigger,b as ConsentWidgetAccordionTriggerInner,j as ConsentWidgetSwitch,f as ConsentWidgetVendorList,q as Switch,H as VendorList};
@@ -1 +1 @@
1
- import{jsx as e}from"react/jsx-runtime";import t from"@c15t/ui/styles/components/consent-banner";import{forwardRef as r,useEffect as o,useState as n}from"react";import{useActiveUI as a}from"../../../hooks.js";import{useScrollLock as m}from"../../../hooks/use-scroll-lock.js";import{useTheme as i}from"../../../hooks/use-theme.js";import{useUIConfig as s}from"../../../ui-config-context.js";import{cnExt as l}from"../../../utils/cn.js";import{mergeSlotProps as u}from"../../../utils/merge-slot-props.js";let c=r(({className:r,style:c,noStyle:p,asChild:d,...y},f)=>{let v,b=a(),{disableAnimation:j,noStyle:h,scrollLock:C}=i(),{components:N}=s(),g="banner"===b,[k,A]=n(!1);o(()=>{if(g){let e=requestAnimationFrame(()=>A(!0));return()=>cancelAnimationFrame(e)}if(j){let e=requestAnimationFrame(()=>A(!1));return()=>cancelAnimationFrame(e)}let e=setTimeout(()=>{A(!1)},Number.parseInt(getComputedStyle(document.documentElement).getPropertyValue("--consent-banner-animation-duration")||"200",10));return()=>clearTimeout(e)},[g,j]);let F=u(N?.banner?.overlay,{baseClassName:t.overlay,className:r,noStyle:h||p,style:c,...y});v=h||p||j?void 0:k?t.overlayVisible:t.overlayHidden;let x=l(F.className,v);return m(!!(g&&C)),g&&C?e("div",{ref:f,...F,"aria-hidden":"true",className:x,"data-testid":"consent-banner-overlay"}):null});c.displayName="ConsentBannerOverlay";let p=c;export{c as ConsentBannerOverlay,p as Overlay};
1
+ import{jsx as e}from"react/jsx-runtime";import r from"@c15t/ui/styles/components/consent-banner";import{forwardRef as o,isValidElement as t}from"react";import{Slot as s}from"../../shared/libs/slot.js";import{useActiveUI as n}from"../../../hooks.js";import{useScrollLock as l}from"../../../hooks/use-scroll-lock.js";import{useTheme as a}from"../../../hooks/use-theme.js";import{useUIConfig as i}from"../../../ui-config-context.js";import{cnExt as m}from"../../../utils/cn.js";import{mergeSlotProps as c}from"../../../utils/merge-slot-props.js";let p=o(({className:o,style:p,noStyle:f,asChild:y,children:d,...u},v)=>{let h=n(),{disableAnimation:j,noStyle:b,scrollLock:k}=a(),{components:N}=i(),g="banner"===h,x=c(N?.banner?.overlay,{baseClassName:r.overlay,className:o,noStyle:b||f,style:p,...u}),C=b||f||j?void 0:`${r.overlayVisible} ${r.overlayEntering}`,O=m(x.className,C);if(l(!!(g&&k)),!(g&&k))return null;let B={...x,"aria-hidden":!0,className:O,"data-testid":"consent-banner-overlay"};return y&&t(d)?e(s,{ref:v,...B,children:d}):e("div",{ref:v,...B,children:d})});p.displayName="ConsentBannerOverlay";let f=p;export{p as ConsentBannerOverlay,f as Overlay};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{Fragment as e,jsx as t,jsxs as o}from"react/jsx-runtime";import n from"@c15t/ui/styles/components/consent-banner";import{forwardRef as r,useEffect as i,useMemo as a,useState as m}from"react";import{useHeadlessConsentUI as s}from"../../../component-hooks/use-headless-consent-ui.js";import{ConsentTrackingContext as l}from"../../../context/consent-tracking-context.js";import{LocalThemeContext as c}from"../../../context/theme-context.js";import{useActiveUI as u,useHasConsentUI as p,useModel as d,usePolicyRule as f,useTranslations as b}from"../../../hooks.js";import{useTextDirection as g}from"../../../hooks/use-text-direction.js";import{useUIConfig as v}from"../../../ui-config-context.js";import{defaultTranslationConfig as F}from"../../../utils/default-translation-config.js";import{mergeSlotProps as h}from"../../../utils/merge-slot-props.js";import{ConsentBannerSurfaceContext as A,mirrorDefaultPosition as j,useConsentBannerSurface as k}from"../surface-context.js";import{Overlay as x}from"./overlay.js";let N=["opt-in","opt-out"],y=r(({asChild:r,children:a,className:s,style:l,className:c,disableAnimation:A,noStyle:y,models:S=N,...q},C)=>{let P=u(),{components:T}=v(),L=p(),R=d()??"opt-in",B=f(),V=k(),$=b(),E=g($?.language??F.defaultLanguage),H=j(V.position,V.positionSource,V.variant,E),I=L&&"banner"===P&&S.includes(R),[w,z]=m(I),[D,G]=m(I),[J,K]=m(200),[M,O]=m(!0);i(()=>{let e=Number.parseInt(getComputedStyle(document.documentElement).getPropertyValue("--consent-banner-animation-duration")||"200",10),t=requestAnimationFrame(()=>{K(e)});return()=>cancelAnimationFrame(t)},[]),i(()=>{if(!M){let e=requestAnimationFrame(()=>{O(!0),z(I),I&&G(!0)});return()=>cancelAnimationFrame(e)}if(I){if(A){let e=requestAnimationFrame(()=>{z(!0),G(!0)});return()=>cancelAnimationFrame(e)}if(D){let e=requestAnimationFrame(()=>z(!0));return()=>cancelAnimationFrame(e)}let e=setTimeout(()=>{z(!0),G(!0)},10);return()=>clearTimeout(e)}if(A){let e=requestAnimationFrame(()=>{G(!1),z(!1)});return()=>cancelAnimationFrame(e)}let e=requestAnimationFrame(()=>G(!1)),t=setTimeout(()=>{z(!1)},J);return()=>{cancelAnimationFrame(e),clearTimeout(t)}},[I,A,D,J,M]);let Q=h(T?.banner?.root,{baseClassName:n.root,className:s||c,noStyle:y,style:l,...q}),U=y?Q.className||"":`${Q.className||""} ${A?"":w?n.bannerVisible:n.bannerHidden}`;return I?o(e,{children:[t(x,{}),t("div",{ref:C,...Q,className:U,"data-variant":V.variant,"data-position":H,"data-blocking":V.blocking?"true":void 0,"data-prompt":B.prompt,"data-model":B.model,"data-testid":"consent-banner-root",dir:E,children:a})]}):null}),S=({children:e,className:o,noStyle:n,disableAnimation:r,scrollLock:i,trapFocus:m,models:u,uiSource:p,variant:d,position:f,blocking:b,...g})=>{let{banner:v}=s({prompt:{blocking:b,position:f,scrollLock:i,trapFocus:m,variant:d}}),F=v.scrollLock,h=v.trapFocus,j=a(()=>({disableAnimation:r,noStyle:n,scrollLock:F,trapFocus:h}),[r,n,F,h]),k=a(()=>({blocking:v.blocking,position:v.position,positionSource:v.positionSource,variant:v.variant}),[v.blocking,v.position,v.positionSource,v.variant]),x=a(()=>({uiSource:p??"banner"}),[p]);return t(l.Provider,{value:x,children:t(c.Provider,{value:j,children:t(A.Provider,{value:k,children:t(y,{disableAnimation:r,className:o,noStyle:n,models:u,...g,children:e})})})})};y.displayName="ConsentBannerRootChildren";let q=S;export{S as ConsentBannerRoot,q 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 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{useTextDirection as f}from"../../../hooks/use-text-direction.js";import{useUIConfig as b}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{ConsentBannerSurfaceContext as h,mirrorDefaultPosition as j,useConsentBannerSurface as k}from"../surface-context.js";import{Overlay as x}from"./overlay.js";let N=["opt-in","opt-out"],S=n(({asChild:n,children:i,className:a,style:s,className:l,disableAnimation:h,noStyle:S,models:y=N,...C},$)=>{let L=c(),{components:P}=b(),R=m(),B=p()??"opt-in",F=d(),A=k(),E=u(),V=f(E?.language??v.defaultLanguage),q=j(A.position,A.positionSource,A.variant,V),w=R&&"banner"===L&&y.includes(B),z=g(P?.banner?.root,{baseClassName:r.root,className:a||l,noStyle:S,style:s,...C}),D=S?z.className||"":`${z.className||""} ${h?"":`${r.bannerVisible} ${r.bannerEntering}`}`;return w?e(o,{children:[t(x,{}),t("div",{ref:$,...z,className:D,"data-variant":A.variant,"data-position":q,"data-blocking":A.blocking?"true":void 0,"data-prompt":F.prompt,"data-model":F.model,"data-testid":"consent-banner-root",dir:V,children:i})]}):null}),y=({children:o,className:e,noStyle:r,disableAnimation:n,scrollLock:c,trapFocus:m,models:p,uiSource:d,variant:u,position:f,blocking:b,...v})=>{let{banner:g}=a({prompt:{blocking:b,position:f,scrollLock:c,trapFocus:m,variant:u}}),j=g.scrollLock,k=g.trapFocus,x=i(()=>({disableAnimation:n,noStyle:r,scrollLock:j,trapFocus:k}),[n,r,j,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(h.Provider,{value:N,children:t(S,{disableAnimation:n,className:e,noStyle:r,models:p,...v,children:o})})})})};S.displayName="ConsentBannerRootChildren";let C=y;export{y as ConsentBannerRoot,C as Root};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import n from"@c15t/ui/styles/components/consent-actions";import o from"@c15t/ui/styles/components/consent-banner";import{forwardRef as r,useRef as s}from"react";import{useHeadlessConsentUI as a}from"../../component-hooks/use-headless-consent-ui.js";import{useTranslations as i}from"../../component-hooks/use-translations.js";import{Slot as l}from"../shared/libs/slot.js";import{usePolicyRule as c,useSetActiveUI as d}from"../../hooks.js";import{useFocusTrap as m}from"../../hooks/use-focus-trap.js";import{useTheme as p}from"../../hooks/use-theme.js";import{useUIConfig as u}from"../../ui-config-context.js";import{getSlotProps as b,mergeSlotProps as h}from"../../utils/merge-slot-props.js";import{Box as f}from"../shared/primitives/box.js";import{ConsentButton as C}from"../shared/primitives/button.js";import{InlineLegalLinks as B}from"../shared/primitives/legal-links/index.js";import{useConsentBannerSurface as g}from"./surface-context.js";import{useBannerCopy as y}from"./use-banner-copy.js";let j={"opt-out":"Do not sell or share my data",preferences:"Manage preferences"},N=r(({children:t,...n},r)=>{let{title:s}=y();return e(f,{ref:r,baseClassName:o.title,"data-testid":"consent-banner-title",slotKey:"banner.title",...n,asChild:!0,children:e("h2",{children:t??s})})});N.displayName="ConsentBannerTitle";let k=r(({children:n,legalLinks:r,asChild:s,className:a,style:i,noStyle:c,...d},m)=>{let{description:b}=y(),{components:f}=u(),{noStyle:C}=p(),g="banner",j=h(f?.description?.[g],{baseClassName:o.description,className:a,"data-context":g,"data-testid":"consent-banner-description",noStyle:c??C,style:i,...d});return s?e(l,{ref:m,...j,children:n??b}):t("div",{ref:m,...j,children:[n??b,e(B,{links:r,context:"banner",testIdPrefix:"consent-banner-legal-link"})]})});k.displayName="ConsentBannerDescription";let x=r(({children:t,className:n,style:r,...s},a)=>{let{components:i}=u(),{noStyle:l}=p(),c=h(i?.banner?.actions,{baseClassName:n,noStyle:l,style:r,...s});return e(f,{ref:a,baseClassName:o.footer,"data-testid":"consent-banner-footer",slotKey:"banner.footer",...c,children:t})});x.displayName="ConsentBannerFooter";let R=r(({children:t,...n},r)=>{let{blocking:a}=g(),{title:i}=y(),l=s(null),c=r||l;return m(a,c),e(f,{ref:c,tabIndex:-1,baseClassName:o.card,"data-testid":"consent-banner-card",slotKey:"banner.card","aria-label":n["aria-label"]||i,"aria-modal":a?"true":void 0,role:a?"dialog":"region",...n,children:t})});R.displayName="ConsentBannerCard";let S=r(({children:t,...n},r)=>e(f,{ref:r,baseClassName:o.header,"data-testid":"consent-banner-header",slotKey:"banner.header",...n,children:t}));S.displayName="ConsentBannerHeader";let v=r(({children:t,...o},r)=>e(f,{ref:r,baseClassName:n.actionGroup,"data-testid":"consent-banner-footer-sub-group",slotKey:"banner.actionGroup",...o,children:t}));v.displayName="ConsentBannerFooterSubGroup";let D=r(({children:t,...n},o)=>{let{common:r}=i();return e(C,{ref:o,action:"reject-consent","data-testid":"consent-banner-reject-button",closeConsentBanner:!0,...n,children:t??r.rejectAll})});D.displayName="ConsentBannerRejectButton";let A=r(({children:t,...n},o)=>{let{common:r}=i();return e(C,{ref:o,action:"open-consent-dialog","data-testid":"consent-banner-customize-button",...n,children:t??r.customize})});A.displayName="ConsentBannerCustomizeButton";let F=r(({children:t,...n},o)=>{let{common:r}=i(),{noStyle:s}=p();return e(C,{ref:o,action:"accept-consent","data-testid":"consent-banner-accept-button",closeConsentBanner:!0,noStyle:s,...n,children:t??r.acceptAll})});F.displayName="ConsentBannerAcceptButton";let K=r(({children:t,...n},o)=>{let{common:r}=i(),{noStyle:s}=p();return e(C,{ref:o,action:"dismiss-notice",consentAction:"dismiss","data-action":"dismiss","data-testid":"consent-banner-dismiss-button",noStyle:s,...n,children:t??r.acknowledge??r.dismiss})});K.displayName="ConsentBannerDismissButton";let z=r(({right:t,children:n,asChild:r,className:s,style:a,noStyle:m,onClick:f,...C},B)=>{let{rights:g}=i(),y=c(),{components:N}=u(),{noStyle:k}=p(),x=d(),R=("opt-out"===t?g?.optOut:g?.preferences)??j[t];return e(r?l:"button",{ref:B,type:r?void 0:"button",...h(b(N,"banner.rightLink"),{baseClassName:o.rightLink,className:s,noStyle:m??k,style:a}),"data-action":"right","data-right":t,"data-c15t-rights":y.rights.join(" "),"data-testid":`consent-banner-right-link-${t}`,onClick:e=>{f?.(e),e.defaultPrevented||x("dialog")},...C,children:n??R})});z.displayName="ConsentBannerRightLink";let G=r(({rights:t,children:n,...r},s)=>{let{banner:i}=a(),l=(t??i.preferenceControls).filter(e=>"disclosure"!==e);return void 0===n&&0===l.length?null:e(f,{ref:s,baseClassName:o.rights,"data-testid":"consent-banner-rights",slotKey:"banner.rights",...r,children:n??l.map(t=>e(z,{right:t},t))})});G.displayName="ConsentBannerRights";let L=N,H=k,T=x,I=v,P=R,w=S,M=D,O=A,$=F,q=K,E=G,J=z;export{$ as AcceptButton,P as Card,F as ConsentBannerAcceptButton,R as ConsentBannerCard,A as ConsentBannerCustomizeButton,k as ConsentBannerDescription,K as ConsentBannerDismissButton,x as ConsentBannerFooter,v as ConsentBannerFooterSubGroup,S as ConsentBannerHeader,D as ConsentBannerRejectButton,z as ConsentBannerRightLink,G as ConsentBannerRights,N as ConsentBannerTitle,O as CustomizeButton,H as Description,q as DismissButton,T as Footer,I as FooterSubGroup,w as Header,M as RejectButton,J as RightLink,E as Rights,L as Title};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import n from"@c15t/ui/styles/components/consent-actions";import o from"@c15t/ui/styles/components/consent-banner";import{forwardRef as r,isValidElement as s,useRef as a}from"react";import{useHeadlessConsentUI as i}from"../../component-hooks/use-headless-consent-ui.js";import{useTranslations as l}from"../../component-hooks/use-translations.js";import{useComposedRefs as c}from"../shared/libs/compose-refs.js";import{Slot as d}from"../shared/libs/slot.js";import{usePolicyRule as m,useSetActiveUI as p}from"../../hooks.js";import{useFocusTrap as u}from"../../hooks/use-focus-trap.js";import{useTheme as b}from"../../hooks/use-theme.js";import{useUIConfig as h}from"../../ui-config-context.js";import{getSlotProps as f,mergeSlotProps as C}from"../../utils/merge-slot-props.js";import{Box as B}from"../shared/primitives/box.js";import{ConsentButton as g}from"../shared/primitives/button.js";import{InlineLegalLinks as y}from"../shared/primitives/legal-links/index.js";import{useConsentBannerSurface as j}from"./surface-context.js";import{useBannerCopy as N}from"./use-banner-copy.js";let k={"opt-out":"Do not sell or share my data",preferences:"Manage preferences"},x=r(({children:t,asChild:n,...r},a)=>{let{title:i}=N();return e(B,{ref:a,baseClassName:o.title,"data-testid":"consent-banner-title",slotKey:"banner.title",...r,asChild:!0,children:n&&s(t)?t:e("h2",{children:t??i})})});x.displayName="ConsentBannerTitle";let A=r(({children:n,legalLinks:r,asChild:a,className:i,style:l,noStyle:c,...m},p)=>{let{description:u}=N(),{components:f}=h(),{noStyle:B}=b(),g="banner",j=C(f?.description?.[g],{baseClassName:o.description,className:i,"data-context":g,"data-testid":"consent-banner-description",noStyle:c??B,style:l,...m});return a&&s(n)?e(d,{ref:p,...j,children:n}):t("div",{ref:p,...j,children:[n??u,e(y,{links:r,context:"banner",testIdPrefix:"consent-banner-legal-link"})]})});A.displayName="ConsentBannerDescription";let R=r(({children:t,className:n,style:r,...s},a)=>{let{components:i}=h(),{noStyle:l}=b(),c=C(i?.banner?.actions,{baseClassName:n,noStyle:l,style:r,...s});return e(B,{ref:a,baseClassName:o.footer,"data-testid":"consent-banner-footer",slotKey:"banner.footer",...c,children:t})});R.displayName="ConsentBannerFooter";let S=r(({children:t,...n},r)=>{let{blocking:s}=j(),{title:i}=N(),l=a(null),d=c(l,r);return u(s,l),e(B,{ref:d,tabIndex:-1,baseClassName:o.card,"data-testid":"consent-banner-card",slotKey:"banner.card","aria-label":n["aria-label"]||i,"aria-modal":s?"true":void 0,role:s?"dialog":"region",...n,children:t})});S.displayName="ConsentBannerCard";let v=r(({children:t,...n},r)=>e(B,{ref:r,baseClassName:o.header,"data-testid":"consent-banner-header",slotKey:"banner.header",...n,children:t}));v.displayName="ConsentBannerHeader";let D=r(({children:t,...o},r)=>e(B,{ref:r,baseClassName:n.actionGroup,"data-testid":"consent-banner-footer-sub-group",slotKey:"banner.actionGroup",...o,children:t}));D.displayName="ConsentBannerFooterSubGroup";let z=r(({children:t,...n},o)=>{let{common:r}=l();return e(g,{ref:o,action:"reject-consent",consentAction:"reject","data-testid":"consent-banner-reject-button",closeConsentBanner:!0,...n,children:t??r.rejectAll})});z.displayName="ConsentBannerRejectButton";let F=r(({children:t,...n},o)=>{let{common:r}=l();return e(g,{ref:o,action:"open-consent-dialog",consentAction:"customize","data-testid":"consent-banner-customize-button",...n,children:t??r.customize})});F.displayName="ConsentBannerCustomizeButton";let K=r(({children:t,...n},o)=>{let{common:r}=l(),{noStyle:s}=b();return e(g,{ref:o,action:"accept-consent",consentAction:"accept","data-testid":"consent-banner-accept-button",closeConsentBanner:!0,noStyle:s,...n,children:t??r.acceptAll})});K.displayName="ConsentBannerAcceptButton";let G=r(({children:t,...n},o)=>{let{common:r}=l(),{noStyle:s}=b();return e(g,{ref:o,action:"dismiss-notice",consentAction:"dismiss","data-action":"dismiss","data-testid":"consent-banner-dismiss-button",noStyle:s,...n,children:t??r.acknowledge??r.dismiss})});G.displayName="ConsentBannerDismissButton";let L=r(({right:t,children:n,asChild:r,className:s,style:a,noStyle:i,onClick:c,...u},B)=>{let{rights:g}=l(),y=m(),{components:j}=h(),{noStyle:N}=b(),x=p(),A=("opt-out"===t?g?.optOut:g?.preferences)??k[t];return e(r?d:"button",{ref:B,type:r?void 0:"button",...C(f(j,"banner.rightLink"),{baseClassName:o.rightLink,className:s,noStyle:i??N,style:a}),"data-action":"right","data-right":t,"data-c15t-rights":y.rights.join(" "),"data-testid":`consent-banner-right-link-${t}`,onClick:e=>{c?.(e),e.defaultPrevented||x("dialog")},...u,children:n??A})});L.displayName="ConsentBannerRightLink";let H=r(({rights:t,children:n,...r},s)=>{let{banner:a}=i(),l=(t??a.preferenceControls).filter(e=>"disclosure"!==e);return void 0===n&&0===l.length?null:e(B,{ref:s,baseClassName:o.rights,"data-testid":"consent-banner-rights",slotKey:"banner.rights",...r,children:n??l.map(t=>e(L,{right:t},t))})});H.displayName="ConsentBannerRights";let T=x,I=A,P=R,w=D,M=S,O=v,$=z,q=F,E=K,J=G,Q=H,U=L;export{E as AcceptButton,M as Card,K as ConsentBannerAcceptButton,S as ConsentBannerCard,F as ConsentBannerCustomizeButton,A as ConsentBannerDescription,G as ConsentBannerDismissButton,R as ConsentBannerFooter,D as ConsentBannerFooterSubGroup,v as ConsentBannerHeader,z as ConsentBannerRejectButton,L as ConsentBannerRightLink,H as ConsentBannerRights,x as ConsentBannerTitle,q as CustomizeButton,I as Description,J as DismissButton,P as Footer,w as FooterSubGroup,O as Header,$ as RejectButton,U as RightLink,Q as Rights,T as Title};
@@ -0,0 +1 @@
1
+ import{useMemo as e}from"react";let o=function(...e){return o=>{for(let s of e){if("function"==typeof s){s(o);continue}s&&"current"in s&&(s.current=o)}}},s=function(s,r){return e(()=>o(s,r),[s,r])};export{o as composeRefs,s as useComposedRefs};
@@ -1 +1 @@
1
- import{createElement as e,forwardRef as t,isValidElement as r}from"react";let n=function(e,t){return"function"!=typeof e?t:"function"!=typeof t?e:r=>{t(r),e(r)}},o=function(e,t){let r=Object.getOwnPropertyDescriptor(e,t)?.get;return"function"==typeof r&&!0===r.isReactWarning},f=t(({children:t,...f},i)=>{if(!r(t))return null;let c=t.props,l=o(t.props,"ref")?t.ref:o(t,"ref")?t.props.ref:t.props.ref??t.ref,p={...f,...c,className:[f.className,c.className].filter(Boolean).join(" "),ref:function(...e){return t=>{for(let r of e){if("function"==typeof r){r(t);continue}r&&"current"in r&&(r.current=t)}}}(i,l),style:{...f.style,...c.style}};for(let[e,t]of Object.entries(f))/^on[A-Z]/u.test(e)&&(p[e]=n(t,c[e]));return e(t.type,{key:t.key??void 0,...p})});f.displayName="Slot";export{f as Slot};
1
+ import{createElement as e,forwardRef as t,isValidElement as r}from"react";import{composeRefs as o}from"./compose-refs.js";let f=function(e,t){return"function"!=typeof e?t:"function"!=typeof t?e:r=>{t(r),e(r)}},n=function(e,t){let r=Object.getOwnPropertyDescriptor(e,t)?.get;return"function"==typeof r&&!0===r.isReactWarning},s=t(({children:t,...s},p)=>{if(!r(t))return null;let l=t.props,i=n(t.props,"ref")?t.ref:n(t,"ref")?t.props.ref:t.props.ref??t.ref,c={...s,...l,className:[s.className,l.className].filter(Boolean).join(" "),ref:o(p,i),style:{...s.style,...l.style}};for(let[e,t]of Object.entries(s))/^on[A-Z]/u.test(e)&&(c[e]=f(t,l[e]));return e(t.type,{key:t.key??void 0,...c})});s.displayName="Slot";export{s as Slot};
@@ -1 +1 @@
1
- import{jsx as t}from"react/jsx-runtime";import{forwardRef as o,useCallback as e}from"react";import{useIdleDialogWarming as n,warmDialogChunk as r}from"../../../chunk-warming.js";import{useConsentSaveAction as a}from"../../../draft.js";import{useDismissNotice as i,useSetActiveUI as s}from"../../../hooks.js";import{useTheme as c}from"../../../hooks/use-theme.js";import{useUIConfig as m}from"../../../ui-config-context.js";import{getSlotProps as d,mergeSlotProps as l}from"../../../utils/merge-slot-props.js";import{Slot as u}from"../libs/slot.js";import*as f from"../ui/button/index.js";let p=["primary","secondary","neutral","consentAction","isPrimary","performDefaultAction"],v=function(t){if(t.variant||t.mode)return{mode:t.mode??"stroke",variant:t.variant??"neutral"};let o=t.theme?.consentActions,e=[t.consentAction&&"save"!==t.consentAction?o?.[t.consentAction]:void 0,t.isPrimary?o?.primary:void 0,o?.default,{mode:"stroke",variant:t.isPrimary?"primary":"neutral"}];return{mode:e.find(t=>t?.mode)?.mode??"stroke",variant:e.find(t=>t?.variant)?.variant??"neutral"}},y=o(({asChild:o,className:y,style:b,noStyle:j,action:k,slotKey:g,baseClassName:h,variant:C,mode:P,size:A="small",consentAction:E,isPrimary:w,onClick:x,onFocus:N,onPointerEnter:F,closeConsentBanner:q=!1,closeConsentDialog:B=!1,performDefaultAction:O=!0,category:S,...z},D)=>{let V=a(),G=s(),H=i(),{noStyle:I,theme:J}=c(),{components:K}=m(),L=v({consentAction:E,isPrimary:w,mode:P,theme:J,variant:C}),M="primary"===L.variant?"button.primary":"button.secondary",Q=l(d(K,g??M),{baseClassName:[f.buttonVariants({mode:L.mode,size:A,variant:L.variant}).root(),h],className:y,noStyle:I||j,style:{...b}});if(!S&&"set-consent"===k)throw Error("Category is required for set-consent action");let R=e(t=>{if(x?.(t),t.defaultPrevented)return;let o="accept-consent"===k||"reject-consent"===k||"custom-consent"===k;if((q||B)&&!o&&G("none"),"open-consent-dialog"===k&&G("dialog"),O&&"open-consent-dialog"!==k)switch(k){case"accept-consent":V("all");break;case"reject-consent":V("none");break;case"custom-consent":V();break;case"dismiss-notice":H();break;case"set-consent":if(!S)throw Error("Category is required for set-consent action");V({[S]:!0})}},[q,B,x,V,G,k,S,H,O]),T="open-consent-dialog"===k;n(T);let U=N??Q.onFocus,W=F??Q.onPointerEnter,X=e(t=>{U?.(t),T&&r()},[U,T]),Y=e(t=>{W?.(t),T&&r()},[W,T]),Z=Object.fromEntries(Object.entries(z).filter(([t])=>!p.includes(t))),$=!(I||j);return t(o?u:"button",{ref:D,type:o?void 0:"button","data-variant":$?L.variant:void 0,"data-mode":$?L.mode:void 0,"data-size":$?A:void 0,"data-action":E,...Q,onClick:R,onFocus:X,onPointerEnter:Y,...Z})});y.displayName="ConsentButton";export{y as ConsentButton};
1
+ import{jsx as t}from"react/jsx-runtime";import{forwardRef as o,useCallback as e}from"react";import{useIdleDialogWarming as n,warmDialogChunk as r}from"../../../chunk-warming.js";import{toSaveUISource as i,useConsentTracking as a}from"../../../context/consent-tracking-context.js";import{useConsentSaveAction as s}from"../../../draft.js";import{useDismissNotice as c,useSetActiveUI as m}from"../../../hooks.js";import{useTheme as d}from"../../../hooks/use-theme.js";import{useUIConfig as l}from"../../../ui-config-context.js";import{getSlotProps as u,mergeSlotProps as f}from"../../../utils/merge-slot-props.js";import{Slot as p}from"../libs/slot.js";import*as v from"../ui/button/index.js";let y=["primary","secondary","neutral","consentAction","isPrimary","performDefaultAction"],b=function(t){if(t.variant||t.mode)return{mode:t.mode??"stroke",variant:t.variant??"neutral"};let o=t.theme?.consentActions,e=[t.consentAction&&"save"!==t.consentAction?o?.[t.consentAction]:void 0,t.isPrimary?o?.primary:void 0,o?.default,{mode:"stroke",variant:t.isPrimary?"primary":"neutral"}];return{mode:e.find(t=>t?.mode)?.mode??"stroke",variant:e.find(t=>t?.variant)?.variant??"neutral"}},j=o(({asChild:o,className:j,style:k,noStyle:g,action:h,slotKey:C,baseClassName:P,variant:x,mode:A,size:E="small",consentAction:w,isPrimary:N,onClick:F,onFocus:S,onPointerEnter:q,closeConsentBanner:B=!1,closeConsentDialog:O=!1,performDefaultAction:z=!0,category:D,...V},G)=>{let H=s(),{uiSource:I}=a(),J=e(t=>H(t,i(I)),[H,I]),K=m(),L=c(),{noStyle:M,theme:Q}=d(),{components:R}=l(),T=b({consentAction:w,isPrimary:N,mode:A,theme:Q,variant:x}),U="primary"===T.variant?"button.primary":"button.secondary",W=f(u(R,C??U),{baseClassName:[v.buttonVariants({mode:T.mode,size:E,variant:T.variant}).root(),P],className:j,noStyle:M||g,style:{...k}});if(!D&&"set-consent"===h)throw Error("Category is required for set-consent action");let X=e(t=>{if(F?.(t),t.defaultPrevented)return;let o="accept-consent"===h||"reject-consent"===h||"custom-consent"===h;if((B||O)&&!o&&K("none"),"open-consent-dialog"===h&&K("dialog"),z&&"open-consent-dialog"!==h)switch(h){case"accept-consent":J("all");break;case"reject-consent":J("none");break;case"custom-consent":J();break;case"dismiss-notice":L();break;case"set-consent":if(!D)throw Error("Category is required for set-consent action");J({[D]:!0})}},[B,O,F,J,K,h,D,L,z]),Y="open-consent-dialog"===h;n(Y);let Z=S??W.onFocus,$=q??W.onPointerEnter,_=e(t=>{Z?.(t),Y&&r()},[Z,Y]),tt=e(t=>{$?.(t),Y&&r()},[$,Y]),to=Object.fromEntries(Object.entries(V).filter(([t])=>!y.includes(t))),te=!(M||g);return t(o?p:"button",{ref:G,type:o?void 0:"button","data-variant":te?T.variant:void 0,"data-mode":te?T.mode:void 0,"data-size":te?E:void 0,"data-action":w,...W,onClick:X,onFocus:_,onPointerEnter:tt,...to})});j.displayName="ConsentButton";export{j as ConsentButton};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as t}from"react/jsx-runtime";import{getDataDisabled as e}from"@c15t/ui/primitives/data-state";import{getDialogState as o,isDialogDismissKey as a}from"@c15t/ui/primitives/dialog";import{createContext as l,forwardRef as r,useContext as i,useEffect as n,useId as s,useMemo as d,useRef as u}from"react";import{createPortal as c}from"react-dom";import{Slot as g}from"../../libs/slot.js";import{useControllableState as p}from"../../libs/use-controllable-state.js";import{useFocusTrap as m}from"../../../../hooks/use-focus-trap.js";import{useScrollLock as f}from"../../../../hooks/use-scroll-lock.js";let D=l(null),y=function(){let t=i(D);if(!t)throw Error("Dialog components must be used within DialogRoot");return t},b=({children:e,defaultOpen:o=!1,onOpenChange:a,open:l})=>{let r=s().replace(/:/gu,""),i=u(null),[c,g]=p({defaultValue:o,onChange:a,value:l});n(()=>{if("u">typeof document){if(c){i.current=document.activeElement;return}i.current?.focus()}},[c]);let m=d(()=>({contentId:`c15t-dialog-content-${r}`,descriptionId:`c15t-dialog-description-${r}`,open:c,restoreFocusRef:i,setOpen:g,titleId:`c15t-dialog-title-${r}`}),[c,r,i,g]);return t(D.Provider,{value:m,children:e})},h=r(({asChild:e,children:a,onClick:l,...r},i)=>{let{open:n,setOpen:s}=y();return t(e?g:"button",{"aria-expanded":n,"data-slot":"dialog-trigger","data-state":o(n),onClick:t=>{s(!0),l?.(t)},ref:i,...e?r:{type:"button",...r},children:a})});h.displayName="DialogTrigger";let v=({children:t})=>"u"<typeof document?null:c(t,document.body),C=r(({children:e,onClick:a,...l},r)=>{let{open:i,setOpen:n}=y();return i?t("button",{"aria-label":"Dismiss dialog","data-slot":"dialog-overlay","data-state":o(i),onClick:t=>{n(!1),a?.(t)},ref:r,tabIndex:-1,type:"button",...l,children:e}):null});C.displayName="DialogOverlay";let k=r(({children:e,closeOnOutsideClick:l=!0,initialFocusRef:r,onKeyDown:i,onMouseDown:s,...d},c)=>{let{contentId:g,descriptionId:p,open:D,setOpen:b,titleId:h}=y(),v=u(null);return(m(D,v),f(D),n(()=>{D&&(r?.current?.focus(),r?.current||v.current?.focus())},[r,D]),D)?t("dialog",{"aria-describedby":p,"aria-labelledby":h,"aria-modal":"true","data-slot":"dialog-content","data-state":o(D),id:g,...{onKeyDown:t=>{a(t.key)&&(t.preventDefault(),b(!1)),i?.(t)},onMouseDown:t=>{l&&t.target===t.currentTarget&&b(!1),s?.(t)}},ref:t=>{v.current=t,"function"==typeof c?c(t):c&&(c.current=t)},open:D,tabIndex:-1,...d,children:e}):null});k.displayName="DialogContent";let T=r(({children:e,...o},a)=>{let{titleId:l}=y();return t("h2",{ref:a,id:l,"data-slot":"dialog-title",...o,children:e})});T.displayName="DialogTitle";let N=r((e,o)=>{let{descriptionId:a}=y();return t("p",{ref:o,id:a,"data-slot":"dialog-description",...e})});N.displayName="DialogDescription";let j=r(({asChild:a,children:l,disabled:r,onClick:i,...n},s)=>{let{open:d,setOpen:u}=y();return t(a?g:"button",{"data-disabled":e(r),"data-slot":"dialog-close","data-state":o(d),disabled:r,onClick:t=>{r||u(!1),i?.(t)},ref:s,...a?n:{type:"button",...n},children:l})});j.displayName="DialogClose";export{j as Close,k as Content,N as Description,C as Overlay,v as Portal,b as Root,T as Title,h as Trigger};
2
+ import{jsx as t}from"react/jsx-runtime";import{getDataDisabled as e}from"@c15t/ui/primitives/data-state";import{getDialogState as o,isDialogDismissKey as a}from"@c15t/ui/primitives/dialog";import{firstTabbable as l}from"@c15t/ui/utils/dom";import{createContext as i,forwardRef as r,useContext as n,useEffect as s,useId as d,useMemo as u,useRef as c}from"react";import{createPortal as g}from"react-dom";import{Slot as m}from"../../libs/slot.js";import{useControllableState as p}from"../../libs/use-controllable-state.js";import{useFocusTrap as f}from"../../../../hooks/use-focus-trap.js";import{useScrollLock as b}from"../../../../hooks/use-scroll-lock.js";let D=i(null),y=function(){let t=n(D);if(!t)throw Error("Dialog components must be used within DialogRoot");return t},h=({children:e,defaultOpen:o=!1,onOpenChange:a,open:l})=>{let i=d().replace(/:/gu,""),r=c(null),[n,g]=p({defaultValue:o,onChange:a,value:l});s(()=>{if("u">typeof document){if(n){r.current=document.activeElement;return}r.current?.focus()}},[n]);let m=u(()=>({contentId:`c15t-dialog-content-${i}`,descriptionId:`c15t-dialog-description-${i}`,open:n,restoreFocusRef:r,setOpen:g,titleId:`c15t-dialog-title-${i}`}),[n,i,r,g]);return t(D.Provider,{value:m,children:e})},v=r(({asChild:e,children:a,onClick:l,...i},r)=>{let{open:n,setOpen:s}=y();return t(e?m:"button",{"aria-expanded":n,"data-slot":"dialog-trigger","data-state":o(n),onClick:t=>{s(!0),l?.(t)},ref:r,...e?i:{type:"button",...i},children:a})});v.displayName="DialogTrigger";let C=({children:t})=>"u"<typeof document?null:g(t,document.body),k=r(({children:e,onClick:a,...l},i)=>{let{open:r,setOpen:n}=y();return r?t("button",{"aria-label":"Dismiss dialog","data-slot":"dialog-overlay","data-state":o(r),onClick:t=>{n(!1),a?.(t)},ref:i,tabIndex:-1,type:"button",...l,children:e}):null});k.displayName="DialogOverlay";let T=r(({children:e,closeOnOutsideClick:i=!0,initialFocusRef:r,onKeyDown:n,onMouseDown:d,...u},g)=>{let{contentId:m,descriptionId:p,open:D,setOpen:h,titleId:v}=y(),C=c(null);return(f(D,C,{initialFocus:"first-tabbable"}),b(D),s(()=>{if(D){let t=C.current,e=r?.current??(t?l(t):void 0)??t;e?.focus()}},[r,D]),D)?t("dialog",{"aria-describedby":p,"aria-labelledby":v,"aria-modal":"true","data-slot":"dialog-content","data-state":o(D),id:m,...{onKeyDown:t=>{a(t.key)&&(t.preventDefault(),h(!1)),n?.(t)},onMouseDown:t=>{i&&t.target===t.currentTarget&&h(!1),d?.(t)}},ref:t=>{C.current=t,"function"==typeof g?g(t):g&&(g.current=t)},open:D,tabIndex:-1,...u,children:e}):null});T.displayName="DialogContent";let N=r(({children:e,...o},a)=>{let{titleId:l}=y();return t("h2",{ref:a,id:l,"data-slot":"dialog-title",...o,children:e})});N.displayName="DialogTitle";let j=r((e,o)=>{let{descriptionId:a}=y();return t("p",{ref:o,id:a,"data-slot":"dialog-description",...e})});j.displayName="DialogDescription";let x=r(({asChild:a,children:l,disabled:i,onClick:r,...n},s)=>{let{open:d,setOpen:u}=y();return t(a?m:"button",{"data-disabled":e(i),"data-slot":"dialog-close","data-state":o(d),disabled:i,onClick:t=>{i||u(!1),r?.(t)},ref:s,...a?n:{type:"button",...n},children:l})});x.displayName="DialogClose";export{x as Close,T as Content,j as Description,k as Overlay,C as Portal,h as Root,N as Title,v as Trigger};
@@ -1 +1 @@
1
- import{jsx as r,jsxs as e}from"react/jsx-runtime";import{forwardRef as o}from"react";let t=({title:t,iconPath:n})=>{let i=o((o,i)=>e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,ref:i,...o,children:[r("title",{children:t}),n]}));return i.displayName=`${t}Icon`,i};export{t as LucideIcon};
1
+ import{jsx as e,jsxs as r}from"react/jsx-runtime";import{forwardRef as o}from"react";let t=({title:t,iconPath:n})=>{let i=o((o,i)=>r("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,ref:i,...o,children:[t?e("title",{children:t}):null,n]}));return i.displayName=`${t??"Decorative"}Icon`,i};export{t as LucideIcon};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{createContext as t,useContext as e}from"react";let n=t({}),o=()=>e(n);export{n as ConsentTrackingContext,o as useConsentTracking};
2
+ import{createContext as n,useContext as e}from"react";let t=n({}),o=()=>e(t),r=function(n){return"banner"===n||"dialog"===n||"widget"===n||"none"===n?n:void 0};export{t as ConsentTrackingContext,r as toSaveUISource,o as useConsentTracking};
package/dist/devtools.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as e}from"react/jsx-runtime";import{createDevTools as t}from"@c15t/dev-tools";import{createElement as r,forwardRef as o,useCallback as n,useContext as s,useEffect as l,useLayoutEffect as i,useMemo as u,useRef as c}from"react";import{KernelContext as d,ProviderServicesContext as a}from"./context.js";import{useIsHydrated as f}from"./hooks/use-is-hydrated.js";let v=e=>{if(!e)throw Error("c15t: DevTools must be rendered inside <ConsentProvider> from @c15t/react.");return e},g=(e,t)=>{let r=f(),o=c(e);i(()=>{o.current=e},[e]);let n=r&&!t&&e?JSON.stringify([...new Set(e())].sort()):void 0;return u(()=>{if(void 0===n)return;let e=JSON.parse(n);return()=>o.current?.()??e},[n])},m=(e,t)=>{let r=c({clearRecords:e,getPresentation:t});i(()=>{r.current={clearRecords:e,getPresentation:t}},[e,t]);let o=void 0!==e,n=void 0!==t;return u(()=>({clearRecords:o?()=>r.current.clearRecords?.():void 0,getPresentation:n?()=>r.current.getPresentation?.():void 0}),[o,n])},C=({disabled:e=!1,clearRecords:r,getPresentation:o,defaultOpen:n,defaultTab:i,getConsentCategories:u,maxEvents:c,position:f})=>{let C=s(a),p=m(r??C?.clearRecords,o??C?.getPresentation),D=s(d),P=e?null:v(D),h=g(u??C?.getConsentCategories,e);return l(()=>{if(!P)return;let e=t({...p,defaultOpen:n,defaultTab:i,getConsentCategories:h,kernel:P,maxEvents:c,position:f});return()=>e.destroy()},[n,i,h,p,P,c,f]),null},p=C,D=C,P={height:"100%",minHeight:0,width:"100%"},h=o(function({disabled:r=!1,clearRecords:o,getPresentation:l,defaultTab:u,getConsentCategories:f,maxEvents:C,style:p,...D},h){let y=s(a),T=m(o??y?.clearRecords,l??y?.getPresentation),S=s(d),R=r?null:v(S),j=g(f??y?.getConsentCategories,r),k=c(null),w=n(e=>{k.current=e;let t=((e,t)=>{if("function"==typeof e)return e(t);e&&(e.current=t)})(h,e);if("function"==typeof t)return()=>{k.current=null,t()}},[h]);return i(()=>{let e=k.current;if(!R||!e)return;let r=t({...T,container:e,defaultOpen:!0,defaultTab:u,getConsentCategories:j,kernel:R,maxEvents:C});return r.element?.classList.add("c15t-dev-tools--embedded"),()=>r.destroy()},[u,j,T,R,C]),e("div",{...D,ref:w,style:{...P,...p}})}),y=(e={})=>{let{id:t="c15t",name:o="c15t",defaultOpen:n=!1,...s}=e;return{defaultOpen:n,id:t,name:o,render:r(h,s)}},T=y;export{D as C15TDevTools,C as ConsentDevTools,p as DevTools,y as c15tDevtools,T as c15tDevtoolsPlugin,h as C15tTanStackDevtoolsPanel};
2
+ import{jsx as e}from"react/jsx-runtime";import{createDevTools as t}from"@c15t/dev-tools";import{createElement as r,forwardRef as o,useCallback as n,useContext as s,useEffect as i,useLayoutEffect as l,useMemo as c,useRef as u}from"react";import{KernelContext as d,ProviderServicesContext as a}from"./context.js";import{useIsHydrated as f}from"./hooks/use-is-hydrated.js";let v=e=>{if(!e)throw Error("c15t: DevTools must be rendered inside <ConsentProvider> from @c15t/react.");return e},m=(e,t)=>{let r=f(),o=u(e);l(()=>{o.current=e},[e]);let n=r&&!t&&e?JSON.stringify([...new Set(e())].sort()):void 0;return c(()=>{if(void 0===n)return;let e=JSON.parse(n);return()=>o.current?.()??e},[n])},g=(e,t)=>{let r=u({clearRecords:e,getPresentation:t});l(()=>{r.current={clearRecords:e,getPresentation:t}},[e,t]);let o=void 0!==e,n=void 0!==t;return c(()=>({clearRecords:o?()=>r.current.clearRecords?.():void 0,getPresentation:n?()=>r.current.getPresentation?.():void 0}),[o,n])},C=({disabled:e=!1,clearRecords:r,getPresentation:o,defaultOpen:n,defaultTab:l,getConsentCategories:c,maxEvents:u,position:f,shadow:C})=>{let h=s(a),p=g(r??h?.clearRecords,o??h?.getPresentation),y=s(d),D=e?null:v(y),P=m(c??h?.getConsentCategories,e);return i(()=>{if(!D)return;let e=t({...p,defaultOpen:n,defaultTab:l,getConsentCategories:P,kernel:D,maxEvents:u,position:f,shadow:C});return()=>e.destroy()},[n,l,P,p,D,u,f,C]),null},h=C,p=C,y={height:"100%",minHeight:0,width:"100%"},D=o(function({disabled:r=!1,clearRecords:o,getPresentation:i,defaultTab:c,getConsentCategories:f,maxEvents:C,style:h,theme:p,...D},P){let T=s(a),S=g(o??T?.clearRecords,i??T?.getPresentation),R=s(d),j=r?null:v(R),k=m(f??T?.getConsentCategories,r),w=u(null),x=n(e=>{w.current=e;let t=((e,t)=>{if("function"==typeof e)return e(t);e&&(e.current=t)})(P,e);if("function"==typeof t)return()=>{w.current=null,t()}},[P]);return l(()=>{let e=w.current;if(!j||!e)return;let r=t({...S,container:e,defaultTab:c,embedded:!0,getConsentCategories:k,kernel:j,maxEvents:C});return()=>r.destroy()},[c,k,S,j,C]),e("div",{...D,ref:x,style:{...y,...p?{"--c15t-dev-tools-color-scheme":p}:void 0,...h}})}),P=(e={})=>{let{id:t="c15t",name:o="c15t",defaultOpen:n=!1,...s}=e;return{defaultOpen:n,id:t,name:o,render:(e,t)=>r(D,{...s,theme:("string"==typeof t?t:t?.theme)??s.theme})}},T=P;export{p as C15TDevTools,C as ConsentDevTools,h as DevTools,P as c15tDevtools,T as c15tDevtoolsPlugin,D as C15tTanStackDevtoolsPanel};
package/dist/draft.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as e}from"react/jsx-runtime";import{deniedVendorIds as t,vendorRenders as r}from"@c15t/core";import{createContext as o,useCallback as n,useContext as i,useEffect as s,useMemo as l,useState as a,useSyncExternalStore as c}from"react";import{KernelContext as u,ProviderServicesContext as f}from"./context.js";import{useCommittedRef as d}from"./hooks/use-committed-ref.js";import{useUIConfig as p}from"./ui-config-context.js";import{saveConsentUI as y}from"./ui-save.js";let v=function(e,t,r){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0})},m=function(e){let r={};if("iab"===e.model)return r;let o=t(e)??new Set;for(let t of e.vendors?.declared??[])v(r,t.id,!o.has(t.id));return r},g=function(e){return"iab"===e.model?"":JSON.stringify((e.vendors?.declared??[]).filter(r).map(e=>[e.id,!0===e.disabled,e.category]).sort(([e],[t])=>String(e).localeCompare(String(t))))},h=function(e){let t=new Set;if("iab"===e.model)return t;for(let r of e.vendors?.declared??[])!0!==r.disabled&&t.add(r.id);return t},S=function(e,t){let r=Object.keys(e);return r.length===Object.keys(t).length&&r.every(r=>e[r]===t[r])},C=function(e,t){let r={experience:!1,functionality:!1,marketing:!1,measurement:!1,necessary:!0};for(let o of e.evaluationPolicy.choiceScope??e.policyRule.scope)r[o]=e.explicitChoice?.categories[o]?.value??t?.[o]??("opt-out"===e.policyRule.model||e.policyRule.preselectedCategories.includes(o));return r},b=function(e,t){let r=0,o=0,n=e.getSnapshot(),i=C(n,t),s=m(n),l=h(n),a=g(n),{fingerprint:c}=n.evaluationPolicy.choice,u={displayedCategories:["necessary",...n.evaluationPolicy.choiceScope??n.policyRule.scope],isDirty:!1,isStale:!1,values:i,vendors:s},f=new Set,d=e=>{for(let t of(u=e,f))t()},p=(e,t)=>u.displayedCategories.some(t=>e[t]!==i[t])||!S(t,s),y=()=>{r+=1,i=C(n=e.getSnapshot(),t),s=m(n),l=h(n),a=g(n),({fingerprint:c}=n.evaluationPolicy.choice),d({displayedCategories:["necessary",...n.evaluationPolicy.choiceScope??n.policyRule.scope],isDirty:!1,isStale:!1,values:i,vendors:s})},b=e=>{let t={...u.values},o=!1;for(let r of u.displayedCategories)"necessary"!==r&&"boolean"==typeof e[r]&&t[r]!==e[r]&&(t[r]=e[r],o=!0);o&&(r+=1,d({...u,isDirty:p(t,u.vendors),values:t}))},j=e=>{let t={...u.vendors},o=!1;for(let[r,n]of Object.entries(e))l.has(r)&&"boolean"==typeof n&&t[r]!==n&&(v(t,r,n),o=!0);o&&(r+=1,d({...u,isDirty:p(u.values,t),vendors:t}))},P=()=>{let e={};for(let t of Object.keys(s))v(e,t,!0);return e},D=()=>{let t=e.getSnapshot();if(n.explicitChoice===t.explicitChoice&&n.policyRule===t.policyRule&&n.evaluationPolicy===t.evaluationPolicy&&n.vendors===t.vendors&&n.vendorChoice===t.vendorChoice&&n.model===t.model)return;let r=t.evaluationPolicy.choiceScope??t.policyRule.scope,o=u.displayedCategories.length!==r.length+1||r.some(e=>!u.displayedCategories.includes(e)),i=g(t)!==a,s=c!==t.evaluationPolicy.choice.fingerprint||o||i;n=t,u.isDirty?s&&!u.isStale&&d({...u,isStale:!0}):y()};return{acceptAll(){b(Object.fromEntries(u.displayedCategories.map(e=>[e,!0]))),j(P())},connect:()=>(D(),e.subscribe(D)),getSnapshot:()=>u,kernel:e,rejectAll(){b(Object.fromEntries(u.displayedCategories.map(e=>[e,!1]))),j(P())},reset:y,async save(t,n,i){if(c!==e.getSnapshot().evaluationPolicy.choice.fingerprint||u.isStale)return d({...u,isStale:!0}),{ok:!1};let l={},a=new Set(n??u.displayedCategories);for(let e of u.displayedCategories)"necessary"!==e&&a.has(e)&&(l[e]=u.values[e]);let f=o+=1,p={};if("all"!==t&&"none"!==t)for(let[e,t]of Object.entries(u.vendors))s[e]!==t&&v(p,e,t);let m=e.commands.save(t??l,{categories:n,...Object.keys(p).length>0&&{vendors:p}}),g=r,h=await m;return h.ok&&f===o&&r===g&&!u.isStale&&c===e.getSnapshot().evaluationPolicy.choice.fingerprint&&(y(),i?.()),h},set(e,t){b({[e]:t})},setVendor(e,t){j({[e]:t})},subscribe:e=>(f.add(e),()=>{f.delete(e)}),update:b}},j=o(null),P=function(){let e=i(u);if(!e)throw Error("Consent drafts require a ConsentProvider.");return e},D=function(e,t){let[r,o]=a(()=>({kernel:e,store:b(e,t)}));if(r.kernel===e)return r.store;let n={kernel:e,store:b(e,t)};return o(n),n.store},k=({children:t,initial:r})=>{let o=P(),n=i(j),{presentation:l}=p(),a=D(o,r??l?.preferences?.defaults),c=n&&!r&&n.kernel===o?n:a;return s(()=>c.connect(),[c]),e(j.Provider,{value:c,children:t})},O=function(){let e=P(),t=i(j),{presentation:r}=p(),o=D(e,r?.preferences?.defaults),n=t?.kernel===e?t:o;return s(()=>n===t?void 0:n.connect(),[t,n]),n},x=function(e){let t=d(P());return n(()=>t.current===e.kernel,[t,e])},A={ok:!1},R=function(e){let t=P(),r=i(f),o=x(e);return n(n=>{if(!o())return Promise.resolve(A);let i=!1;return y(t,()=>e.save(n,r?.getConsentCategories(),()=>{i=!0}),()=>i)},[o,t,e,r])},w=function(e){let t=c(e.subscribe,e.getSnapshot,e.getSnapshot),r=x(e);return l(()=>{let o=e=>(...t)=>{r()&&e(...t)};return{...t,acceptAll:o(e.acceptAll),rejectAll:o(e.rejectAll),reset:o(e.reset),save:(...t)=>r()?e.save(...t):Promise.resolve(A),set:o(e.set),setVendor:o(e.setVendor),update:o(e.update)}},[r,t,e])},V=function(){return R(O())},_=function(){return O()},E=function(e,t){let r=()=>t(e.getSnapshot());return c(e.subscribe,r,r)},q=function(){return w(O())},J=function(){let{isDirty:e,isStale:t,reset:r,save:o,setVendor:n,vendors:i}=w(O());return l(()=>({isDirty:e,isStale:t,reset:r,save:o,setVendor:n,vendors:i}),[e,t,r,o,n,i])};export{k as ConsentDraftProvider,q as useConsentDraft,E as useConsentDraftSlice,_ as useConsentDraftStore,V as useConsentSaveAction,J as useVendorDraft};
2
+ import{jsx as e}from"react/jsx-runtime";import{deniedVendorIds as t,vendorRenders as r}from"@c15t/core";import{createContext as o,useCallback as n,useContext as i,useEffect as s,useMemo as l,useState as a,useSyncExternalStore as c}from"react";import{KernelContext as u,ProviderServicesContext as f}from"./context.js";import{useResolvedPresentation as d}from"./hooks.js";import{useCommittedRef as p}from"./hooks/use-committed-ref.js";import{saveConsentUI as y}from"./ui-save.js";let v=function(e,t,r){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0})},m=function(e){let r={};if("iab"===e.model)return r;let o=t(e)??new Set;for(let t of e.vendors?.declared??[])v(r,t.id,!o.has(t.id));return r},g=function(e){return"iab"===e.model?"":JSON.stringify((e.vendors?.declared??[]).filter(r).map(e=>[e.id,!0===e.disabled,e.category]).sort(([e],[t])=>String(e).localeCompare(String(t))))},h=function(e){let t=new Set;if("iab"===e.model)return t;for(let r of e.vendors?.declared??[])!0!==r.disabled&&t.add(r.id);return t},S=function(e,t){let r=Object.keys(e);return r.length===Object.keys(t).length&&r.every(r=>e[r]===t[r])},C=function(e,t){let r={experience:!1,functionality:!1,marketing:!1,measurement:!1,necessary:!0};for(let o of e.evaluationPolicy.choiceScope??e.policyRule.scope)r[o]=e.explicitChoice?.categories[o]?.value??t?.[o]??("opt-out"===e.policyRule.model||e.policyRule.preselectedCategories.includes(o));return r},b=function(e,t){if(e===t)return!0;if(!e||!t)return!1;for(let r of new Set([...Object.keys(e),...Object.keys(t)]))if(e[r]!==t[r])return!1;return!0},j=function(e,t){let r=t,o=0,n=0,i=e.getSnapshot(),s=C(i,r),l=m(i),a=h(i),c=g(i),{fingerprint:u}=i.evaluationPolicy.choice,f={displayedCategories:["necessary",...i.evaluationPolicy.choiceScope??i.policyRule.scope],isDirty:!1,isStale:!1,values:s,vendors:l},d=new Set,p=e=>{for(let t of(f=e,d))t()},y=(e,t)=>f.displayedCategories.some(t=>e[t]!==s[t])||!S(t,l),j=()=>{o+=1,s=C(i=e.getSnapshot(),r),l=m(i),a=h(i),c=g(i),({fingerprint:u}=i.evaluationPolicy.choice),p({displayedCategories:["necessary",...i.evaluationPolicy.choiceScope??i.policyRule.scope],isDirty:!1,isStale:!1,values:s,vendors:l})},D=e=>{let t={...f.values},r=!1;for(let o of f.displayedCategories)"necessary"!==o&&"boolean"==typeof e[o]&&t[o]!==e[o]&&(t[o]=e[o],r=!0);r&&(o+=1,p({...f,isDirty:y(t,f.vendors),values:t}))},P=e=>{let t={...f.vendors},r=!1;for(let[o,n]of Object.entries(e))a.has(o)&&"boolean"==typeof n&&t[o]!==n&&(v(t,o,n),r=!0);r&&(o+=1,p({...f,isDirty:y(f.values,t),vendors:t}))},k=()=>{let e={};for(let t of Object.keys(l))v(e,t,!0);return e},O=()=>{let t=e.getSnapshot();if(i.explicitChoice===t.explicitChoice&&i.policyRule===t.policyRule&&i.evaluationPolicy===t.evaluationPolicy&&i.vendors===t.vendors&&i.vendorChoice===t.vendorChoice&&i.model===t.model)return;let r=t.evaluationPolicy.choiceScope??t.policyRule.scope,o=f.displayedCategories.length!==r.length+1||r.some(e=>!f.displayedCategories.includes(e)),n=g(t)!==c,s=u!==t.evaluationPolicy.choice.fingerprint||o||n;i=t,f.isDirty?s&&!f.isStale&&p({...f,isStale:!0}):j()};return{acceptAll(){D(Object.fromEntries(f.displayedCategories.map(e=>[e,!0]))),P(k())},connect:()=>(O(),e.subscribe(O)),getSnapshot:()=>f,kernel:e,rejectAll(){D(Object.fromEntries(f.displayedCategories.map(e=>[e,!1]))),P(k())},reset:j,async save(t,r,i,s){if(u!==e.getSnapshot().evaluationPolicy.choice.fingerprint||f.isStale)return p({...f,isStale:!0}),{ok:!1};let a={},c=new Set(r??f.displayedCategories);for(let e of f.displayedCategories)"necessary"!==e&&c.has(e)&&(a[e]=f.values[e]);let d=n+=1,y={};if("all"!==t&&"none"!==t)for(let[e,t]of Object.entries(f.vendors))l[e]!==t&&v(y,e,t);let m=e.commands.save(t??a,{categories:r,...Object.keys(y).length>0&&{vendors:y},...void 0!==s&&{uiSource:s}}),g=o,h=await m;return h.ok&&d===n&&o===g&&!f.isStale&&u===e.getSnapshot().evaluationPolicy.choice.fingerprint&&(j(),i?.()),h},set(e,t){D({[e]:t})},setDefaults(e){!b(r,e)&&(r=e,f.isDirty||j())},setVendor(e,t){P({[e]:t})},subscribe:e=>(d.add(e),()=>{d.delete(e)}),update:D}},D=o(null),P=function(){let e=i(u);if(!e)throw Error("Consent drafts require a ConsentProvider.");return e},k=function(e,t){let[r,o]=a(()=>({kernel:e,store:j(e,t)}));if(r.kernel===e)return r.store;let n={kernel:e,store:j(e,t)};return o(n),n.store},O=({children:t,initial:r})=>{let o=P(),n=i(D),l=d(),a=r??l?.preferences?.defaults,c=k(o,a),u=n&&!r&&n.kernel===o?n:c;return s(()=>u.connect(),[u]),s(()=>{c.setDefaults(a)},[c,a]),e(D.Provider,{value:u,children:t})},w=function(){let e=P(),t=i(D),r=d(),o=r?.preferences?.defaults,n=k(e,o),l=t?.kernel===e?t:n;return s(()=>l===t?void 0:l.connect(),[t,l]),s(()=>{n.setDefaults(o)},[n,o]),l},A=function(e){let t=p(P());return n(()=>t.current===e.kernel,[t,e])},R={ok:!1},x=function(e){let t=P(),r=i(f),o=A(e);return n((n,i)=>{if(!o())return Promise.resolve(R);let s=!1;return y(t,()=>e.save(n,r?.getConsentCategories(),()=>{s=!0},i),()=>s)},[o,t,e,r])},V=function(e){let t=c(e.subscribe,e.getSnapshot,e.getSnapshot),r=A(e);return l(()=>{let o=e=>(...t)=>{r()&&e(...t)};return{...t,acceptAll:o(e.acceptAll),rejectAll:o(e.rejectAll),reset:o(e.reset),save:(...t)=>r()?e.save(...t):Promise.resolve(R),set:o(e.set),setVendor:o(e.setVendor),update:o(e.update)}},[r,t,e])},_=function(){return x(w())},E=function(){return w()},q=function(e,t){let r=()=>t(e.getSnapshot());return c(e.subscribe,r,r)},J=function(){return V(w())},N=function(){let{isDirty:e,isStale:t,reset:r,save:o,setVendor:n,vendors:i}=V(w());return l(()=>({isDirty:e,isStale:t,reset:r,save:o,setVendor:n,vendors:i}),[e,t,r,o,n,i])};export{O as ConsentDraftProvider,J as useConsentDraft,q as useConsentDraftSlice,E as useConsentDraftStore,_ as useConsentSaveAction,N as useVendorDraft};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{setupFocusTrap as r}from"@c15t/ui/utils/dom";import{useEffect as t}from"react";let u=function(u,o){t(()=>{if(u&&o&&o.current)return r(o.current)},[u,o])};export{u as useFocusTrap};
2
+ import{setupFocusTrap as r}from"@c15t/ui/utils/dom";import{useEffect as t}from"react";let u=function(u,o,e){let c=e?.initialFocus;t(()=>{if(u&&o&&o.current)return r(o.current,{initialFocus:c})},[u,o,c])};export{u as useFocusTrap};
package/dist/hooks.js CHANGED
@@ -1 +1 @@
1
- import{evaluateConsent as e,isVendorDenied as s}from"@c15t/core";import{useCallback as o,useSyncExternalStore as n}from"react";import{useGateSelector as t,useKernel as r,useKernelSelector as u}from"./kernel-selector.js";import{useUIConfig as i}from"./ui-config-context.js";import{invalidateConsentUIAction as a}from"./ui-save.js";let c=function(){let e=r();return n(s=>e.subscribe(s),()=>e.getSnapshot(),()=>e.getServerSnapshot())},l=function(e){return u(s=>s.effectivePermissions[e])},f=function(){return u(e=>e.effectivePermissions)},h=function(){return u(e=>e.overrides)},p=function(){return u(e=>e.user)},d=function(){return u(e=>e.location)},m=function(){return u(e=>e.translations)},k=function(){return u(e=>e.branding)},_=function(){return u(e=>"matched"===e.resolution.status)},C=function(){return u(e=>!e.externalPermissions&&"matched"===e.resolution.status&&("none"!==e.policyRule.prompt||e.policyRule.rights.length>0))},g=function(){return u(e=>!!e.externalPermissions||"matched"===e.resolution.status&&("none"!==e.policyRule.prompt||e.policyRule.rights.length>0))},v=function(){return u(e=>"matched"===e.resolution.status?e.model:null)},P=function(){return u(e=>e.activeUI)},S=function(){return u(e=>e.policyRule.scope)},y=function(){return u(e=>e.policyRule.scopeMode)},I=function(){return u(e=>e.iab)},b=function(){return u(e=>e.iab?.enabled??!1)},R=function(e){let s=String(e);return u(e=>e.iab?.vendorConsents[s]??!1)},O=function(e){return u(s=>s.iab?.purposeConsents[e]??!1)},A=function(e){return u(s=>s.iab?.specialFeatureOptIns[e]??!1)},D=function(){return u(e=>e.iab?.tcString??null)},U=[],V=function(){return u(e=>"iab"===e.model?U:e.vendors?.declared??U)},x=function(){return u(e=>e.vendorChoice)},B=function(o){return t((n,t)=>{let r=n.vendors?.declared.find(e=>e.id===o);if(!r)return!0;if("iab"!==n.model&&s(n,o))return!1;try{return e({category:r.category},n,t)}catch{return!1}})},E=function(){return r().set.registerConsentCategories},H=function(){return r().set.overrides},T=function(){return r().set.language},M=function(){let e=r();return o(s=>{a(e),e.set.activeUI(s)},[e])},N=function(){return r().commands.save},L=function(){let e=r();return o(s=>e.events.on("permissions:changed",({snapshot:e})=>s(e.effectivePermissions)),[e])},j=function(){return r().commands.identify},q=function(){return r().commands.init},F=function(){return u(e=>e.explicitChoice)},w=function(){return u(e=>e.effectivePermissions)},z=function(){return u(e=>e.promptRequirement)},G=function(){return u(e=>e.noticeDismissal)},J=function(){return u(e=>e.privacySignals)},K=function(){return u(e=>e.optOutDirectives)},Q=function(){return u(e=>e.resolution)},W=function(){return u(e=>e.policyRule)},X=function(){return u(e=>e.restrictions)},Y=function(){return r().commands.dismissNotice},Z={},$={},ee=function(){return i().presentation?.prompt??Z},es=function(){return i().presentation?.preferences??$};export{P as useActiveUI,k as useBranding,l as useConsent,f as useConsents,V as useDeclaredVendors,Y as useDismissNotice,w as useEffectivePermissions,F as useExplicitChoice,_ as useHasConsentPolicy,g as useHasConsentPreferences,C as useHasConsentUI,b as useIABEnabled,I as useIABSnapshot,j as useIdentify,q as useInit,d as useLocation,v as useModel,G as useNoticeDismissal,K as useOptOutDirectives,h as useOverrides,S as usePolicyCategories,Q as usePolicyResolution,W as usePolicyRule,y as usePolicyScopeMode,es as usePreferencesPresentation,J as usePrivacySignals,ee as usePromptPresentation,z as usePromptRequirement,O as usePurposeConsent,E as useRegisterConsentCategories,X as useRestrictions,N as useSaveConsents,M as useSetActiveUI,T as useSetLanguage,H as useSetOverrides,c as useSnapshot,A as useSpecialFeatureOptIn,L as useSubscribeToConsentChanges,D as useTCString,m as useTranslations,p as useUser,B as useVendorAllowed,x as useVendorChoice,R as useVendorConsent};
1
+ import{applyExperimentAssignment as e,applyExperimentTheme as s,isVendorAllowed as o}from"@c15t/core";import{useCallback as n,useContext as t,useMemo as u,useSyncExternalStore as r}from"react";import{ProviderServicesContext as i}from"./context.js";import{useGateSelector as a,useKernel as c,useKernelSelector as l}from"./kernel-selector.js";import{useUIConfig as f}from"./ui-config-context.js";import{invalidateConsentUIAction as h}from"./ui-save.js";let m=function(){let e=c();return r(s=>e.subscribe(s),()=>e.getSnapshot(),()=>e.getServerSnapshot())},p=function(e){return l(s=>s.effectivePermissions[e])},d=function(){return l(e=>e.effectivePermissions)},k=function(){return l(e=>e.overrides)},_=function(){return l(e=>e.user)},g=function(){return l(e=>e.location)},C=function(){return l(e=>e.translations)},P=function(){return l(e=>e.branding)},v=function(){return l(e=>"matched"===e.resolution.status)},S=function(){return l(e=>!e.externalPermissions&&"matched"===e.resolution.status&&("none"!==e.policyRule.prompt||e.policyRule.rights.length>0))},y=function(){return l(e=>!!e.externalPermissions||"matched"===e.resolution.status&&("none"!==e.policyRule.prompt||e.policyRule.rights.length>0))},R=function(){return l(e=>"matched"===e.resolution.status?e.model:null)},I=function(){return l(e=>e.activeUI)},b=function(){return l(e=>e.policyRule.scope)},x=function(){return l(e=>e.policyRule.scopeMode)},A=function(){return l(e=>e.iab)},U=function(){return l(e=>e.iab?.enabled??!1)},E=function(e){let s=String(e);return l(e=>e.iab?.vendorConsents[s]??!1)},T=function(e){return l(s=>s.iab?.purposeConsents[e]??!1)},V=function(e){return l(s=>s.iab?.specialFeatureOptIns[e]??!1)},D=function(){return l(e=>e.iab?.tcString??null)},O=[],B=function(){return l(e=>"iab"===e.model?O:e.vendors?.declared??O)},H=function(){return l(e=>e.vendorChoice)},L=function(e){return a((s,n)=>o(s,e,n))},M=function(){return c().set.registerConsentCategories},N=function(){return c().set.overrides},j=function(){let e=c(),s=t(i);return n(o=>{s?s.setLanguage(o):o!==e.getSnapshot().overrides.language&&(e.set.language(o),e.commands.init())},[e,s])},q=function(){let e=c();return n(s=>{h(e),e.set.activeUI(s)},[e])},F=function(){return c().commands.save},w=function(){let e=c();return n(s=>e.events.on("permissions:changed",({snapshot:e})=>s(e.effectivePermissions)),[e])},z=function(){return c().commands.identify},G=function(){return c().commands.init},J=function(){return l(e=>e.explicitChoice)},K=function(){return l(e=>e.effectivePermissions)},Q=function(){return l(e=>e.promptRequirement)},W=function(){return l(e=>e.noticeDismissal)},X=function(){return l(e=>e.privacySignals)},Y=function(){return l(e=>e.resolution)},Z=function(){return l(e=>e.policyRule)},$=function(){return l(e=>e.restrictions)},ee=function(){return c().commands.dismissNotice},es=function(){return l(e=>e.experiment)},eo=function(){let{experiment:s,presentation:o}=f(),n=es();return u(()=>e(o,s,n),[o,s,n])},en=function(){let{experiment:e,theme:o}=f(),n=es();return u(()=>s(o,e,n),[o,e,n])},et={},eu={},er=function(){return eo()?.prompt??et},ei=function(){return eo()?.preferences??eu};export{I as useActiveUI,P as useBranding,p as useConsent,d as useConsents,B as useDeclaredVendors,ee as useDismissNotice,K as useEffectivePermissions,es as useExperiment,J as useExplicitChoice,v as useHasConsentPolicy,y as useHasConsentPreferences,S as useHasConsentUI,U as useIABEnabled,A as useIABSnapshot,z as useIdentify,G as useInit,g as useLocation,R as useModel,W as useNoticeDismissal,k as useOverrides,b as usePolicyCategories,Y as usePolicyResolution,Z as usePolicyRule,x as usePolicyScopeMode,ei as usePreferencesPresentation,X as usePrivacySignals,er as usePromptPresentation,Q as usePromptRequirement,T as usePurposeConsent,M as useRegisterConsentCategories,eo as useResolvedPresentation,en as useResolvedTheme,$ as useRestrictions,F as useSaveConsents,q as useSetActiveUI,j as useSetLanguage,N as useSetOverrides,m as useSnapshot,V as useSpecialFeatureOptIn,w as useSubscribeToConsentChanges,D as useTCString,C as useTranslations,_ as useUser,L as useVendorAllowed,H as useVendorChoice,E as useVendorConsent};
@@ -9,17 +9,17 @@
9
9
  /* components/iab-panel vars */
10
10
  @keyframes spin{to{transform:rotate(360deg)}}
11
11
  :root, :host{--c15t-spin-animation:spin 1s linear infinite}
12
- :root, :host{--iab-cd-font-family:var(--c15t-font-family);--iab-cd-line-height:var(--c15t-line-height-tight);--iab-cd-title-font-size:1.125rem;--iab-cd-title-font-weight:var(--c15t-font-weight-semibold);--iab-cd-description-font-size:.75rem;--iab-cd-description-line-height:var(--c15t-line-height-normal);--iab-cd-background-color:var(--c15t-surface);--iab-cd-background-color-dark:var(--c15t-surface);--iab-cd-text-color:var(--c15t-text);--iab-cd-text-color-dark:var(--c15t-text);--iab-cd-text-muted-color:var(--c15t-text-muted);--iab-cd-text-muted-color-dark:var(--c15t-text-muted);--iab-cd-border-color:var(--c15t-border);--iab-cd-border-color-dark:var(--c15t-border);--iab-cd-overlay-background:var(--c15t-overlay);--iab-cd-overlay-background-dark:var(--c15t-overlay);--iab-cd-primary-color:var(--c15t-primary);--iab-cd-primary-color-dark:var(--c15t-primary);--iab-cd-surface-hover:var(--c15t-surface-hover);--iab-cd-surface-hover-dark:var(--c15t-surface-hover);--iab-cd-max-width:48rem;--iab-cd-max-height:85vh;--iab-cd-border-radius:var(--c15t-radius-lg);--iab-cd-z-index:999999;--iab-cd-overlay-z-index:999998;--iab-cd-padding:var(--c15t-space-md);--iab-cd-padding-sm:var(--c15t-space-sm);--iab-cd-gap:var(--c15t-space-sm);--iab-cd-animation-duration:var(--c15t-duration-normal);--iab-cd-animation-timing:ease-out;--iab-cd-shadow:var(--c15t-shadow-xl)}
12
+ :root, :host{--iab-cd-font-family:var(--c15t-font-family);--iab-cd-line-height:var(--c15t-line-height-tight);--iab-cd-title-font-size:var(--c15t-font-size-lg);--iab-cd-title-font-weight:var(--c15t-font-weight-semibold);--iab-cd-description-font-size:.75rem;--iab-cd-description-line-height:var(--c15t-line-height-normal);--iab-cd-background-color:var(--c15t-surface);--iab-cd-background-color-dark:var(--c15t-surface);--iab-cd-text-color:var(--c15t-text);--iab-cd-text-color-dark:var(--c15t-text);--iab-cd-text-muted-color:var(--c15t-text-muted);--iab-cd-text-muted-color-dark:var(--c15t-text-muted);--iab-cd-border-color:var(--c15t-border);--iab-cd-border-color-dark:var(--c15t-border);--iab-cd-overlay-background:var(--c15t-overlay);--iab-cd-overlay-background-dark:var(--c15t-overlay);--iab-cd-primary-color:var(--c15t-primary);--iab-cd-primary-color-dark:var(--c15t-primary);--iab-cd-surface-hover:var(--c15t-surface-hover);--iab-cd-surface-hover-dark:var(--c15t-surface-hover);--iab-cd-max-width:48rem;--iab-cd-max-height:85vh;--iab-cd-border-radius:var(--c15t-radius-lg);--iab-cd-z-index:999999;--iab-cd-overlay-z-index:999998;--iab-cd-padding:var(--c15t-space-md);--iab-cd-padding-sm:var(--c15t-space-sm);--iab-cd-gap:var(--c15t-space-sm);--iab-cd-animation-duration:var(--c15t-duration-normal);--iab-cd-animation-timing:var(--c15t-easing-out);--iab-cd-shadow:var(--c15t-shadow-sm)}
13
13
 
14
14
  /* components/iab-prompt vars */
15
15
  @keyframes iabConsentBannerEnter{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}
16
16
  @keyframes iabConsentBannerExit{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}
17
17
  :root, :host{--c15t-iab-consent-banner-enter-animation:iabConsentBannerEnter var(--c15t-duration-fast) var(--c15t-easing);--c15t-iab-consent-banner-exit-animation:iabConsentBannerExit var(--c15t-duration-fast) var(--c15t-easing)}
18
- :root, :host{--iab-consent-banner-font-family:var(--c15t-font-family);--iab-consent-banner-line-height:var(--c15t-line-height-normal);--iab-consent-banner-text-size-adjust:100%;--iab-consent-banner-tab-size:4;--iab-consent-banner-border-radius-sm:var(--c15t-radius-sm);--iab-consent-banner-border-radius:var(--c15t-radius-lg);--iab-consent-banner-max-width:560px;--iab-consent-banner-animation-duration:var(--c15t-duration-fast);--iab-consent-banner-animation-timing:var(--c15t-easing);--iab-consent-banner-entry-animation:var(--c15t-iab-consent-banner-enter-animation);--iab-consent-banner-exit-animation:var(--c15t-iab-consent-banner-exit-animation);--iab-consent-banner-border-width:1px;--iab-consent-banner-border-width-hairline:1px;--iab-consent-banner-shadow:var(--c15t-shadow-lg);--iab-consent-banner-shadow-dark:var(--c15t-shadow-lg);--iab-consent-banner-background-color:var(--c15t-surface);--iab-consent-banner-background-color-dark:var(--c15t-surface);--iab-consent-banner-footer-background-color:var(--c15t-surface-hover);--iab-consent-banner-footer-background-color-dark:var(--c15t-surface-hover);--iab-consent-banner-text-color:var(--c15t-text);--iab-consent-banner-text-color-dark:var(--c15t-text);--iab-consent-banner-border-color:var(--c15t-border);--iab-consent-banner-border-color-dark:var(--c15t-border);--iab-consent-banner-title-color:var(--c15t-text);--iab-consent-banner-title-color-dark:var(--c15t-text);--iab-consent-banner-description-color:var(--c15t-text-muted);--iab-consent-banner-description-color-dark:var(--c15t-text-muted);--iab-consent-banner-overlay-background-color:var(--c15t-overlay);--iab-consent-banner-overlay-background-color-dark:var(--c15t-overlay);--iab-consent-banner-link-color:var(--c15t-primary);--iab-consent-banner-link-color-dark:var(--c15t-primary)}
18
+ :root, :host{--iab-consent-banner-font-family:var(--c15t-font-family);--iab-consent-banner-line-height:var(--c15t-line-height-normal);--iab-consent-banner-text-size-adjust:100%;--iab-consent-banner-tab-size:4;--iab-consent-banner-border-radius-sm:var(--c15t-radius-sm);--iab-consent-banner-border-radius:var(--c15t-radius-lg);--iab-consent-banner-max-width:560px;--iab-consent-banner-animation-duration:var(--c15t-duration-fast);--iab-consent-banner-animation-timing:var(--c15t-easing);--iab-consent-banner-border-width:1px;--iab-consent-banner-border-width-hairline:1px;--iab-consent-banner-shadow:var(--c15t-shadow-lg);--iab-consent-banner-shadow-dark:var(--c15t-shadow-lg);--iab-consent-banner-background-color:var(--c15t-surface);--iab-consent-banner-background-color-dark:var(--c15t-surface);--iab-consent-banner-footer-background-color:var(--c15t-surface-hover);--iab-consent-banner-footer-background-color-dark:var(--c15t-surface-hover);--iab-consent-banner-text-color:var(--c15t-text);--iab-consent-banner-text-color-dark:var(--c15t-text);--iab-consent-banner-border-color:var(--c15t-border);--iab-consent-banner-border-color-dark:var(--c15t-border);--iab-consent-banner-title-color:var(--c15t-text);--iab-consent-banner-title-color-dark:var(--c15t-text);--iab-consent-banner-description-color:var(--c15t-text-muted);--iab-consent-banner-description-color-dark:var(--c15t-text-muted);--iab-consent-banner-overlay-background-color:var(--c15t-overlay);--iab-consent-banner-overlay-background-color-dark:var(--c15t-overlay);--iab-consent-banner-link-color:var(--c15t-primary);--iab-consent-banner-link-color-dark:var(--c15t-primary)}
19
19
  @media only screen and (resolution>=192dpi){:root, :host{--iab-consent-banner-border-width-hairline:.5px}}
20
20
 
21
21
  /* components/iab-panel */
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) cubic-bezier(.34, 1.56, .64, 1);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)}.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-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);outline:none;box-shadow:0 0 0 2px #3b82f633}.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{border-radius:var(--c15t-radius-md);z-index:100;isolation:isolate;background-color:#dbeafe;border:1px solid #3b82f64d;align-items:center;gap:.5rem;margin-bottom:.5rem;padding:.5rem .625rem;display:flex;position:sticky;top:0;box-shadow:0 2px 4px #0000000d}.c15t-dark .c15t-ui-selectedVendorBanner-S6KCv{background-color:#1e3a8a;border-color:#3b82f666}.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:2rem}.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{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)}}
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-bannerVisible-uqQdb{opacity:1;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing), transform var(--iab-consent-banner-animation-duration) cubic-bezier(.34, 1.56, .64, 1);transform:scale(1)}.c15t-ui-bannerHidden-KVkXf{opacity:0;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing), transform var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing);transform:scale(.95)}@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[data-state=open]{animation:var(--iab-consent-banner-entry-animation)}.c15t-ui-card-lJZdN[data-state=closed]{animation:var(--iab-consent-banner-exit-animation)}.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{letter-spacing:-.011em;color:var(--iab-consent-banner-title-color);margin:0;font-size:1.125rem;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-overlayVisible-JAO1l{opacity:1;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing)}.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-bannerVisible-uqQdb,.c15t-ui-bannerHidden-KVkXf,.c15t-ui-overlayVisible-JAO1l,.c15t-ui-overlayHidden-zfbJA{transition:none}.c15t-ui-card-lJZdN[data-state=open],.c15t-ui-card-lJZdN[data-state=closed]{animation: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-bannerVisible-uqQdb{opacity:1;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing), transform var(--iab-consent-banner-animation-duration) var(--c15t-easing-spring);transform:scale(1)}.c15t-ui-bannerHidden-KVkXf{opacity:0;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing), transform var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing);transform:scale(.95)}@starting-style{.c15t-ui-bannerEntering-Rn_SM{opacity:0;transform:scale(.95)}}@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-overlayVisible-JAO1l{opacity:1;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing)}.c15t-ui-overlayHidden-zfbJA{opacity:0;transition:opacity var(--iab-consent-banner-animation-duration) var(--iab-consent-banner-animation-timing)}@starting-style{.c15t-ui-overlayEntering-MQWHm{opacity:0}}.c15t-dark .c15t-ui-overlay-OPamO{background-color:var(--iab-consent-banner-overlay-background-color-dark)}@media (prefers-reduced-motion:reduce){.c15t-ui-bannerVisible-uqQdb,.c15t-ui-bannerHidden-KVkXf,.c15t-ui-overlayVisible-JAO1l,.c15t-ui-overlayHidden-zfbJA{transition:none}}