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

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 (219) hide show
  1. package/AGENTS.md +92 -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/component-hooks/use-headless-iab-consent-ui.js +1 -1
  6. package/dist/components/consent-gate/atoms.js +1 -1
  7. package/dist/components/consent-gate/consent-gate.js +1 -1
  8. package/dist/components/iab-panel/atoms/card.js +1 -1
  9. package/dist/components/iab-panel/atoms/feature-item.js +2 -0
  10. package/dist/components/iab-panel/atoms/header.js +1 -1
  11. package/dist/components/iab-panel/iab-panel.js +1 -1
  12. package/dist/components/iab-panel/index.js +1 -1
  13. package/dist/components/iab-prompt/atoms/overlay.js +1 -1
  14. package/dist/components/iab-prompt/atoms/root.js +1 -1
  15. package/dist/components/panel/atoms/card.js +1 -1
  16. package/dist/components/panel/atoms/root.js +1 -1
  17. package/dist/components/panel-trigger/atoms/button.js +1 -1
  18. package/dist/components/panel-trigger/atoms/toolbar.js +1 -1
  19. package/dist/components/preferences/atoms/accordion.js +1 -1
  20. package/dist/components/prompt/atoms/overlay.js +1 -1
  21. package/dist/components/prompt/atoms/root.js +1 -1
  22. package/dist/components/prompt/components.js +1 -1
  23. package/dist/components/shared/libs/compose-refs.js +1 -0
  24. package/dist/components/shared/libs/slot.js +1 -1
  25. package/dist/components/shared/primitives/button.js +1 -1
  26. package/dist/components/shared/ui/dialog/dialog.js +1 -1
  27. package/dist/components/shared/ui/icon.js +1 -1
  28. package/dist/context/consent-tracking-context.js +1 -1
  29. package/dist/devtools.js +1 -1
  30. package/dist/draft-context.js +2 -0
  31. package/dist/draft.js +1 -1
  32. package/dist/external-iab-context.js +1 -1
  33. package/dist/gpp.js +2 -0
  34. package/dist/hooks/use-color-scheme.js +1 -1
  35. package/dist/hooks/use-focus-trap.js +1 -1
  36. package/dist/hooks.js +1 -1
  37. package/dist/iab/styles.tw3.css +4 -4
  38. package/dist/index-parts/consent-banner.js +1 -0
  39. package/dist/index-parts/consent-dialog-link.js +1 -0
  40. package/dist/index-parts/consent-dialog-trigger.js +1 -0
  41. package/dist/index-parts/consent-dialog.js +1 -0
  42. package/dist/index-parts/consent-gate.js +1 -0
  43. package/dist/index-parts/core.js +1 -0
  44. package/dist/index-parts/draft.js +1 -0
  45. package/dist/index-parts/hooks.js +1 -0
  46. package/dist/index-parts/module-hooks.js +1 -0
  47. package/dist/index-parts/provider.js +1 -0
  48. package/dist/index-parts/theme.js +1 -0
  49. package/dist/index-parts/translations.js +1 -0
  50. package/dist/index.js +1 -1
  51. package/dist/kernel-selector.js +1 -1
  52. package/dist/module-hooks/iframe-blocker.js +1 -1
  53. package/dist/postcss-tailwind3.js +1 -0
  54. package/dist/provider.js +1 -1
  55. package/dist/server/fetch-ssr-data.js +1 -1
  56. package/dist/server/headers.js +1 -1
  57. package/dist/server/normalize-url.js +1 -1
  58. package/dist/styles.tw3.css +16 -16
  59. package/dist/transports/offline.js +1 -1
  60. package/dist/utils/merge-slot-props.js +1 -1
  61. package/dist/utils/theme-utils.js +1 -1
  62. package/dist/version.js +1 -1
  63. package/dist-types/component-hooks/use-headless-consent-ui.d.ts +1 -1
  64. package/dist-types/components/iab-panel/atoms/feature-item.d.ts +28 -0
  65. package/dist-types/components/iab-panel/iab-panel.d.ts +2 -2
  66. package/dist-types/components/iab-panel/index.d.ts +5 -2
  67. package/dist-types/components/iab-panel/use-iab-translations.d.ts +4 -0
  68. package/dist-types/components/iab-prompt/iab-prompt.d.ts +2 -2
  69. package/dist-types/components/iab-prompt/index.d.ts +2 -2
  70. package/dist-types/components/panel/atoms/card.d.ts +1 -0
  71. package/dist-types/components/prompt/components.d.ts +6 -0
  72. package/dist-types/components/shared/libs/compose-refs.d.ts +20 -0
  73. package/dist-types/components/shared/ui/icon.d.ts +2 -1
  74. package/dist-types/context/consent-tracking-context.d.ts +10 -0
  75. package/dist-types/context/theme-context.d.ts +2 -2
  76. package/dist-types/context.d.ts +6 -0
  77. package/dist-types/devtools.d.ts +13 -2
  78. package/dist-types/draft-context.d.ts +31 -0
  79. package/dist-types/draft.d.ts +13 -30
  80. package/dist-types/gpp.d.ts +27 -0
  81. package/dist-types/hooks/use-focus-trap.d.ts +3 -1
  82. package/dist-types/hooks.d.ts +57 -13
  83. package/dist-types/iab.d.ts +1 -1
  84. package/dist-types/index-parts/consent-banner.d.ts +7 -0
  85. package/dist-types/index-parts/consent-dialog-link.d.ts +7 -0
  86. package/dist-types/index-parts/consent-dialog-trigger.d.ts +7 -0
  87. package/dist-types/index-parts/consent-dialog.d.ts +7 -0
  88. package/dist-types/index-parts/consent-gate.d.ts +7 -0
  89. package/dist-types/index-parts/core.d.ts +8 -0
  90. package/dist-types/index-parts/draft.d.ts +7 -0
  91. package/dist-types/index-parts/hooks.d.ts +7 -0
  92. package/dist-types/index-parts/module-hooks.d.ts +7 -0
  93. package/dist-types/index-parts/provider.d.ts +7 -0
  94. package/dist-types/index-parts/theme.d.ts +8 -0
  95. package/dist-types/index-parts/translations.d.ts +7 -0
  96. package/dist-types/index.d.ts +14 -15
  97. package/dist-types/kernel-selector.d.ts +0 -8
  98. package/dist-types/module-hooks/iframe-blocker.d.ts +12 -7
  99. package/dist-types/postcss-tailwind3.d.ts +21 -0
  100. package/dist-types/provider.d.ts +57 -17
  101. package/dist-types/server/headers.d.ts +14 -4
  102. package/dist-types/server/normalize-url.d.ts +14 -7
  103. package/dist-types/server/types.d.ts +12 -1
  104. package/dist-types/transports/offline.d.ts +7 -16
  105. package/dist-types/ui-config-context.d.ts +7 -1
  106. package/dist-types/utils/merge-slot-props.d.ts +15 -1
  107. package/dist-types/utils/theme-utils.d.ts +17 -2
  108. package/dist-types/version.d.ts +1 -1
  109. package/docs/README.md +92 -72
  110. package/docs/assets/v3/bottom-bar.png +0 -0
  111. package/docs/assets/v3/brand-card.png +0 -0
  112. package/docs/assets/v3/brand-preferences.png +0 -0
  113. package/docs/assets/v3/choice-wall.png +0 -0
  114. package/docs/assets/v3/headless-bar-html.png +0 -0
  115. package/docs/assets/v3/headless-bar-mobile.png +0 -0
  116. package/docs/assets/v3/headless-bar.png +0 -0
  117. package/docs/assets/v3/slim-bar.png +0 -0
  118. package/docs/concepts/choose-your-setup.md +87 -0
  119. package/docs/{frameworks/react/concepts → concepts}/consent-categories.md +22 -7
  120. package/docs/{guides → concepts}/consent-state.md +89 -105
  121. package/docs/{guides → concepts}/data-fetching.md +31 -27
  122. package/docs/concepts/how-consent-works.md +123 -0
  123. package/docs/{frameworks/react/concepts/policy-presets.md → concepts/policies.md} +7 -59
  124. package/docs/customization/class-names.md +202 -0
  125. package/docs/customization/dark-mode.md +157 -0
  126. package/docs/customization/motion.md +119 -0
  127. package/docs/customization/overview.md +67 -34
  128. package/docs/customization/recipes.md +839 -49
  129. package/docs/customization/slots.md +216 -35
  130. package/docs/customization/stylesheets.md +147 -0
  131. package/docs/customization/tailwind.md +842 -0
  132. package/docs/customization/tokens.md +163 -96
  133. package/docs/customization/translations.md +60 -3
  134. package/docs/frameworks/react/callbacks.md +118 -0
  135. package/docs/frameworks/react/clear-on-revocation.md +106 -0
  136. package/docs/frameworks/react/components/consent-banner.md +42 -28
  137. package/docs/frameworks/react/components/consent-dialog-link.md +13 -11
  138. package/docs/frameworks/react/components/consent-dialog-trigger.md +81 -76
  139. package/docs/frameworks/react/components/consent-dialog.md +56 -50
  140. package/docs/frameworks/react/components/consent-gate.md +37 -20
  141. package/docs/frameworks/react/components/consent-provider.md +130 -0
  142. package/docs/frameworks/react/components/consent-widget.md +23 -20
  143. package/docs/frameworks/react/components/dev-tools.md +53 -85
  144. package/docs/frameworks/react/components.md +105 -0
  145. package/docs/frameworks/react/compose.md +354 -0
  146. package/docs/frameworks/react/content-security-policy.md +126 -0
  147. package/docs/frameworks/react/customize.md +250 -0
  148. package/docs/frameworks/react/embeds.md +89 -0
  149. package/docs/frameworks/react/gpp.md +163 -0
  150. package/docs/frameworks/react/{hooks/overview.md → hooks.md} +21 -16
  151. package/docs/frameworks/react/{iab/overview.md → iab.md} +80 -31
  152. package/docs/frameworks/react/network-blocker.md +35 -41
  153. package/docs/frameworks/react/quickstart.md +139 -101
  154. package/docs/frameworks/react/rendering.md +128 -0
  155. package/docs/frameworks/react/scripts.md +115 -0
  156. package/docs/frameworks/react/translations.md +155 -0
  157. package/docs/frameworks/react/troubleshooting.md +92 -47
  158. package/docs/frameworks/react/vendor-consent.md +170 -0
  159. package/docs/guides/banner-experiments.md +654 -0
  160. package/docs/guides/troubleshooting.md +120 -47
  161. package/docs/guides/verify-consent.md +81 -49
  162. package/docs/integrations/adobe-analytics.md +167 -159
  163. package/docs/integrations/ahrefs-analytics.md +152 -154
  164. package/docs/integrations/amplitude.md +162 -156
  165. package/docs/integrations/building-integrations.md +136 -37
  166. package/docs/integrations/clearbit.md +154 -154
  167. package/docs/integrations/cloudflare-web-analytics.md +156 -156
  168. package/docs/integrations/cloudflare-zaraz.md +209 -261
  169. package/docs/integrations/crisp.md +164 -158
  170. package/docs/integrations/databuddy.md +157 -173
  171. package/docs/integrations/fathom-analytics.md +158 -156
  172. package/docs/integrations/front-chat.md +167 -167
  173. package/docs/integrations/google-maps.md +118 -83
  174. package/docs/integrations/google-tag-manager.md +178 -163
  175. package/docs/integrations/google-tag.md +163 -160
  176. package/docs/integrations/heap.md +163 -155
  177. package/docs/integrations/hightouch.md +161 -157
  178. package/docs/integrations/hotjar.md +159 -155
  179. package/docs/integrations/intercom.md +183 -153
  180. package/docs/integrations/klaviyo.md +486 -0
  181. package/docs/integrations/linkedin-insights.md +174 -150
  182. package/docs/integrations/logrocket.md +160 -156
  183. package/docs/integrations/matomo-analytics.md +188 -178
  184. package/docs/integrations/meta-pixel.md +188 -150
  185. package/docs/integrations/microsoft-clarity.md +163 -155
  186. package/docs/integrations/microsoft-uet.md +148 -154
  187. package/docs/integrations/mixpanel-analytics.md +155 -160
  188. package/docs/integrations/one-dollar-stats.md +166 -165
  189. package/docs/integrations/openai-pixel.md +204 -301
  190. package/docs/integrations/overview.md +137 -80
  191. package/docs/integrations/pinterest-tag.md +191 -183
  192. package/docs/integrations/pirsch.md +169 -159
  193. package/docs/integrations/plausible-analytics.md +172 -158
  194. package/docs/integrations/posthog.md +313 -240
  195. package/docs/integrations/promptwatch.md +154 -154
  196. package/docs/integrations/reddit-pixel.md +185 -157
  197. package/docs/integrations/rudderstack.md +201 -186
  198. package/docs/integrations/rybbit-analytics.md +171 -160
  199. package/docs/integrations/segment.md +182 -154
  200. package/docs/integrations/snapchat-pixel.md +186 -156
  201. package/docs/integrations/tiktok-pixel.md +171 -150
  202. package/docs/integrations/umami-analytics.md +163 -158
  203. package/docs/integrations/vercel-analytics.md +166 -157
  204. package/docs/integrations/x-pixel.md +176 -150
  205. package/docs/integrations/youtube.md +121 -86
  206. package/docs/upgrade-v3.md +496 -467
  207. package/package.json +20 -9
  208. package/dist/ui-save.js +0 -1
  209. package/dist-types/ui-save.d.ts +0 -25
  210. package/docs/assets/v3/brand-bar.png +0 -0
  211. package/docs/assets/v3/mobile-card.png +0 -0
  212. package/docs/assets/v3/preferences.png +0 -0
  213. package/docs/frameworks/react/components/consent-manager-provider.md +0 -95
  214. package/docs/frameworks/react/script-loader.md +0 -69
  215. package/docs/frameworks/react/styling/overview.md +0 -266
  216. package/docs/guides/deployment-modes.md +0 -75
  217. package/docs/guides/shared-consent-controls.md +0 -158
  218. package/docs/integrations/clear-on-revocation.md +0 -167
  219. 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{ConsentWidgetVendorList as h}from"./vendor-list.js";import*as f from"../../shared/ui/preference-item/index.js";import*as w from"../../shared/ui/switch/index.js";let C=[{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"}],v=n(null),A=function(){let e=a(v);if(!e)throw Error("ConsentWidgetAccordion components must be used within ConsentWidgetAccordion");return e},S=i(({children:t,...n},i)=>e(s,{ref:i,baseClassName:o.triggerRow,...n,children:t}));S.displayName="ConsentWidgetAccordionTrigger";let N=f.Trigger,b=f.Content,T=f.Leading,W=w.Root,j=({"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(v.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})})},I=l({iconPath:e("path",{d:"M5 12h14M12 5v14"})}),K=l({iconPath:e("path",{d:"M5 12h14"})}),V=({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(f.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(S,{slotKey:"accordion.triggerRow",children:[t(N,{className:d?void 0:o.trigger,"data-testid":`consent-widget-accordion-trigger-${n.name}`,noStyle:!0,slotKey:"accordion-item.trigger",children:[e(T,{className:d?void 0:o.arrow,"data-testid":`consent-widget-accordion-arrow-${n.name}`,noStyle:!0,slotKey:"accordion.arrow",children:c?e(K,{"aria-hidden":"true"}):e(I,{"aria-hidden":"true"})}),e(f.Header,{noStyle:!0,slotKey:"accordion.header",children:e(f.Title,{className:d?void 0:o.title,noStyle:!0,slotKey:"accordion.title",children:i})})]}),e(f.Control,{className:d?void 0:o.control,noStyle:!0,slotKey:"accordion.control",children:e(W,{"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(b,{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(h,{category:n.name,noStyle:d})]})]})},$=()=>{let t=m(p(),e=>e.displayedCategories),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}=A(),{consentTypes:l}=d();return c(()=>t.flatMap(e=>C.filter(t=>t.name===e)),[t]).map(t=>e(V,{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))},k=i(({className:t,...n},i)=>e(f.Root,{ref:i,className:[o.item,t].filter(Boolean).join(" "),noStyle:!0,...n}));k.displayName="ConsentWidgetAccordionItem";let x=N,R=S,M=b,L=T,P=j,E=W,q=$,z=k,B=h;export{P as Accordion,L as AccordionArrow,M as AccordionContent,z as AccordionItem,q as AccordionItems,R as AccordionTrigger,x as AccordionTriggerInner,j as ConsentWidgetAccordion,T as ConsentWidgetAccordionArrow,b as ConsentWidgetAccordionContent,k as ConsentWidgetAccordionItem,$ as ConsentWidgetAccordionItems,S as ConsentWidgetAccordionTrigger,N as ConsentWidgetAccordionTriggerInner,W as ConsentWidgetSwitch,h as ConsentWidgetVendorList,E as Switch,B 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-context.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:x,baseClassName:C,variant:P,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:P}),U="primary"===T.variant?"button.primary":"button.secondary",W=f(u(R,x??U),{baseClassName:[v.buttonVariants({mode:T.mode,size:E,variant:T.variant}).root(),C],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};
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{saveConsentSurface as e}from"@c15t/core/surface-actions";import{createContext as t,useCallback as r,useContext as o}from"react";import{KernelContext as n,ProviderServicesContext as s}from"./context.js";import{useResolvedPresentation as a}from"./hooks.js";import{useCommittedRef as i}from"./hooks/use-committed-ref.js";let u=t(null),f={ok:!1},c=function(){let e=o(n);if(!e)throw Error("Consent drafts require a ConsentProvider.");return e},l=function(e){let t=i(c());return r(()=>t.current===e,[t,e])},d=async function(e,t,r,o){let{createPreferenceDraft:n}=await import("@c15t/core/preference-draft");return n(e,{defaults:t}).save({categories:r,uiSource:o})},m=function(){let t=c(),n=o(s),i=o(u),m=i?.kernel===t?i:null,v=a()?.preferences?.defaults,p=l(t);return r((r,o)=>{if(!p())return Promise.resolve(f);let s=n?.getConsentCategories(),a="all"===r||"none"===r;return e(t,()=>m&&(a||void 0===r)?m.save({categories:s,input:r,uiSource:o}):void 0===r?d(t,v,s,o):t.commands.save(r,{...void 0!==s&&{categories:s},...void 0!==o&&{uiSource:o}}),()=>void 0!==r||!m?.getState().isDirty)},[v,m,p,t,n])};export{u as DraftContext,f as REFUSED,m as useConsentSaveAction,c as useDraftKernel,l as useKernelGuard};
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{createPreferenceDraft as t}from"@c15t/core/preference-draft";import{useContext as r,useEffect as n,useMemo as s,useState as a,useSyncExternalStore as f}from"react";import{DraftContext as o,REFUSED as u,useDraftKernel as l,useKernelGuard as c}from"./draft-context.js";import{useResolvedPresentation as d}from"./hooks.js";let i=function(e,r){let[s,f]=a(()=>({draft:t(e,{defaults:r}),kernel:e}));if(n(()=>{s.draft.setDefaults(r)},[s.draft,r]),s.kernel===e)return s.draft;let o={draft:t(e,{defaults:r}),kernel:e};return f(o),o.draft},p=({children:t,initial:n})=>{let s=l(),a=r(o),f=d(),u=i(s,n??f?.preferences?.defaults),c=a&&!n&&a.kernel===s?a:u;return e(o.Provider,{value:c,children:t})},m=function(){let e=l(),t=r(o),n=i(e,d()?.preferences?.defaults);return t?.kernel===e?t:n},D=function(e){let t=f(e.subscribe,e.getState,e.getState),r=c(e.kernel);return s(()=>{let n=e=>(...t)=>{r()&&e(...t)};return{...t,acceptAll:n(e.acceptAll),rejectAll:n(e.rejectAll),reset:n(e.reset),save:()=>r()?e.save():Promise.resolve(u),set:n(e.set),setVendor:n(e.setVendor),update:n(e.update)}},[e,r,t])},C=function(){return m()},S=function(e,t){let r=()=>t(e.getState());return f(e.subscribe,r,r)},v=function(){return D(m())},j=function(){let{isDirty:e,isStale:t,reset:r,save:n,setVendor:a,vendors:f}=D(m());return s(()=>({isDirty:e,isStale:t,reset:r,save:n,setVendor:a,vendors:f}),[e,t,r,n,a,f])};export{p as ConsentDraftProvider,v as useConsentDraft,S as useConsentDraftSlice,C as useConsentDraftStore,j as useVendorDraft};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{jsx as e}from"react/jsx-runtime";import{useCallback as t,useEffect as r,useMemo as i,useState as o,useSyncExternalStore as n}from"react";import{IABContext as a}from"./context/iab-context-value.js";import{useCommittedRef as c}from"./hooks/use-committed-ref.js";let u=function(){return null},l=({runtime:l,children:s})=>{let[m,d]=o("purposes"),f=n(e=>l.onIABChange(e),()=>l.iab,u),p=i(()=>{let e,t,r;return e=!1,t=!1,{actions:r=[],activate:()=>{e=!0,t=!1},deactivate:()=>{e=!1,queueMicrotask(()=>{if(!e)for(let e of(t=!0,r.splice(0)))e.cancel()})},isClosed:()=>t,runtime:l}},[l]),v=c(p);r(()=>{p.activate();let e=()=>{let e=p.runtime.iab;if(e)for(let t of p.actions.splice(0))t.run(e)},t=p.runtime.onIABChange(e);return e(),()=>{t(),p.deactivate()}},[p]);let h=t(e=>{let t=new Promise((t,r)=>{let i=()=>r(new DOMException("External IAB provider unmounted or changed runtimes.","AbortError"));if(p.isClosed()||v.current!==p)return void i();let o=async i=>{try{await e(i),t()}catch(e){r(e)}},n=p.runtime.iab;n?o(n):p.actions.push({cancel:i,run:o})});return t.catch(()=>void 0),t},[v,p]),x=i(()=>({handle:f,run:h,setTab:d,tab:m}),[f,h,m]);return e(a.Provider,{value:x,children:s})};export{l as ExternalIABProvider};
2
+ import{jsx as e}from"react/jsx-runtime";import{useCallback as r,useEffect as t,useMemo as i,useState as o,useSyncExternalStore as n}from"react";import{IABContext as a}from"./context/iab-context-value.js";import{useCommittedRef as c}from"./hooks/use-committed-ref.js";let u=function(){return null},s=({runtime:s,children:l})=>{let[m,d]=o("purposes"),f=n(e=>s.subscribe(e),()=>s.iab,u),p=i(()=>{let e,r,t;return e=!1,r=!1,{actions:t=[],activate:()=>{e=!0,r=!1},deactivate:()=>{e=!1,queueMicrotask(()=>{if(!e)for(let e of(r=!0,t.splice(0)))e.cancel()})},isClosed:()=>r,runtime:s}},[s]),v=c(p);t(()=>{p.activate();let e=()=>{let e=p.runtime.iab;if(e)for(let r of p.actions.splice(0))r.run(e)},r=p.runtime.subscribe(e);return e(),()=>{r(),p.deactivate()}},[p]);let b=r(e=>{let r=new Promise((r,t)=>{let i=()=>t(new DOMException("External IAB provider unmounted or changed runtimes.","AbortError"));if(p.isClosed()||v.current!==p)return void i();let o=async i=>{try{await e(i),r()}catch(e){t(e)}},n=p.runtime.iab;n?o(n):p.actions.push({cancel:i,run:o})});return r.catch(()=>void 0),r},[v,p]),x=i(()=>({handle:f,run:b,setTab:d,tab:m}),[f,b,m]);return e(a.Provider,{value:x,children:l})};export{s as ExternalIABProvider};
package/dist/gpp.js ADDED
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{createGPP as t}from"@c15t/iab/gpp";import{useContext as r,useEffect as e}from"react";import{KernelContext as o}from"./context.js";let n=({cmpId:n,mspaMode:i,optOutCategories:s,tcf:l,usApproach:c,usFallback:p})=>{let m=r(o);if(!m)throw Error("c15t: ConsentGPP must be rendered inside <ConsentProvider> from @c15t/react.");let a=s?.join(",");return e(()=>{let r=null;try{r=t({cmpId:n,kernel:m,mspaMode:i,optOutCategories:a?.split(","),tcf:l,usApproach:c,usFallback:p})}catch(t){console.error("c15t: GPP was not installed.",t)}return()=>r?.dispose()},[a,n,m,i,l,c,p]),null};export{n as ConsentGPP};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{setupColorScheme as e}from"@c15t/ui/utils";import{useEffect as o}from"react";let r=function(r){o(()=>{if(null!==r)return e(r)},[r])};export{r as useColorScheme};
2
+ import{setupColorScheme as e}from"@c15t/ui/utils/color-scheme";import{useEffect as o}from"react";let r=function(r){o(()=>{if(null!==r)return e(r)},[r])};export{r as useColorScheme};
@@ -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{hasConsentPreferences as n,hasConsentUI as t,showConsentSurface as u}from"@c15t/core/surface-actions";import{useCallback as r,useContext as i,useMemo as a,useSyncExternalStore as c}from"react";import{ProviderServicesContext as f}from"./context.js";import{useGateSelector as l,useKernel as h,useKernelSelector as d}from"./kernel-selector.js";import{useUIConfig as m}from"./ui-config-context.js";let p=function(){let e=h();return c(s=>e.subscribe(s),()=>e.getSnapshot(),()=>e.getServerSnapshot())},k=function(e){return d(s=>s.effectivePermissions[e])},_=function(){return d(e=>e.effectivePermissions)},C=function(){return d(e=>e.overrides)},g=function(){return d(e=>e.user)},P=function(){return d(e=>e.location)},v=function(){return d(e=>e.translations)},S=function(){return d(e=>e.branding)},y=function(){return d(e=>"matched"===e.resolution.status)},I=function(){return d(t)},R=function(){return d(n)},b=function(){return d(e=>"matched"===e.resolution.status?e.model:null)},A=function(){return d(e=>e.activeUI)},x=function(){return d(e=>e.policyRule.scope)},U=function(){return d(e=>e.policyRule.scopeMode)},E=function(){return d(e=>e.iab)},T=function(){return d(e=>e.iab?.enabled??!1)},V=function(e){let s=String(e);return d(e=>e.iab?.vendorConsents[s]??!1)},D=function(e){return d(s=>s.iab?.purposeConsents[e]??!1)},O=function(e){return d(s=>s.iab?.specialFeatureOptIns[e]??!1)},B=function(){return d(e=>e.iab?.tcString??null)},H=[],L=function(){return d(e=>"iab"===e.model?H:e.vendors?.declared??H)},M=function(){return d(e=>e.vendorChoice)},N=function(e){return l((s,n)=>o(s,e,n))},j=function(){return h().set.registerConsentCategories},q=function(){return h().set.overrides},F=function(){let e=h(),s=i(f);return r(o=>{s?s.setLanguage(o):o!==e.getSnapshot().overrides.language&&(e.set.language(o),e.commands.init())},[e,s])},w=function(){let e=h();return r(s=>u(e,s),[e])},z=function(){return h().commands.save},G=function(){let e=h();return r(s=>e.events.on("permissions:changed",({snapshot:e})=>s(e.effectivePermissions)),[e])},J=function(){return h().commands.identify},K=function(){return h().commands.init},Q=function(){return d(e=>e.explicitChoice)},W=function(){return d(e=>e.effectivePermissions)},X=function(){return d(e=>e.promptRequirement)},Y=function(){return d(e=>e.noticeDismissal)},Z=function(){return d(e=>e.privacySignals)},$=function(){return d(e=>e.resolution)},ee=function(){return d(e=>e.policyRule)},es=function(){return d(e=>e.restrictions)},eo=function(){return h().commands.dismissNotice},en=function(){return d(e=>e.experiment)},et=function(){let{experiment:s,presentation:o}=m(),n=en();return a(()=>e(o,s,n),[o,s,n])},eu=function(){let{experiment:e,theme:o}=m(),n=en();return a(()=>s(o,e,n),[o,e,n])},er={},ei={},ea=function(){return et()?.prompt??er},ec=function(){return et()?.preferences??ei};export{A as useActiveUI,S as useBranding,k as useConsent,_ as useConsents,L as useDeclaredVendors,eo as useDismissNotice,W as useEffectivePermissions,en as useExperiment,Q as useExplicitChoice,y as useHasConsentPolicy,R as useHasConsentPreferences,I as useHasConsentUI,T as useIABEnabled,E as useIABSnapshot,J as useIdentify,K as useInit,P as useLocation,b as useModel,Y as useNoticeDismissal,C as useOverrides,x as usePolicyCategories,$ as usePolicyResolution,ee as usePolicyRule,U as usePolicyScopeMode,ec as usePreferencesPresentation,Z as usePrivacySignals,ea as usePromptPresentation,X as usePromptRequirement,D as usePurposeConsent,j as useRegisterConsentCategories,et as useResolvedPresentation,eu as useResolvedTheme,es as useRestrictions,z as useSaveConsents,w as useSetActiveUI,F as useSetLanguage,q as useSetOverrides,p as useSnapshot,O as useSpecialFeatureOptIn,G as useSubscribeToConsentChanges,B as useTCString,v as useTranslations,g as useUser,N as useVendorAllowed,M as useVendorChoice,V as useVendorConsent};