c15t
Version:
Headless JavaScript consent management platform for cookie banners, privacy preferences, consent storage, and script gating.
122 lines (96 loc) • 4.77 kB
Markdown
---
title: Consent Widget
description: Reference page for consent widget.
group: reference
---
`ConsentWidget` is a standalone, inline consent management widget. Unlike `ConsentDialog` (which is a modal), the widget embeds directly in your page layout - ideal for privacy settings pages, account preferences, or any page where users should be able to manage consent without a modal overlay.
## Configuration
```tsx
<ConsentWidget
hideBranding
legalLinks={['privacyPolicy', 'cookiePolicy']}
noStyle={false}
disableAnimation={false}
/>
```
## Accordion Behavior
Each consent category is rendered as an expandable accordion item. Clicking the category header expands it to show a description and any associated services. Users can toggle individual categories on or off using the switch control. The `necessary` category is always enabled and cannot be toggled.
## Styling First
> ℹ️ **Info:**
> Most widget customization should stay in the stock component. Use theme tokens and slots such as consentWidgetAccordion, consentWidgetFooter, consentWidgetFooterSubGroup, and toggle before reaching for compound components. See Styling Overview.
```tsx
<ConsentManagerProvider
options={{
theme: {
colors: {
surface: '#fffdf8',
surfaceHover: '#f6f3ee',
},
slots: {
consentWidgetAccordion: 'rounded-3xl border border-black/10',
consentWidgetFooter: 'border-t border-black/10 px-6',
consentWidgetFooterSubGroup: 'gap-3',
toggle: 'shadow-sm',
},
},
}}
>
<ConsentWidget />
</ConsentManagerProvider>
```
Use `consentWidgetFooter` for styling the whole action area, such as border and padding. Use `consentWidgetFooterSubGroup` for spacing or alignment inside nested button groups.
Widget copy should be changed through `ConsentManagerProvider.options.i18n` so the inline UI stays aligned with the rest of the consent experience.
## Advanced: Compound Components
Use compound components only when you need to rearrange the widget's existing primitives while keeping policy-aware action grouping:
```tsx
<ConsentWidget.Root>
<ConsentWidget.Accordion type="multiple">
<ConsentWidget.AccordionItems />
</ConsentWidget.Accordion>
<ConsentWidget.PolicyActions />
</ConsentWidget.Root>
```
* `ConsentWidget.Root` — Theme context provider
* `ConsentWidget.Accordion` — Radix-based accordion root
* `ConsentWidget.AccordionItems` — Auto-generates toggle items from consent config
* `ConsentWidget.AccordionItem` — Individual category item
* `ConsentWidget.AccordionTrigger` — Clickable header for each item
* `ConsentWidget.AccordionContent` — Collapsible content area
* `ConsentWidget.AccordionArrow` — Expand/collapse indicator
* `ConsentWidget.Switch` — Category toggle switch
* `ConsentWidget.PolicyActions` — Renders grouped policy-aware actions
* `ConsentWidget.Footer` — Footer container
* `ConsentWidget.FooterSubGroup` — Groups related buttons
* `ConsentWidget.AcceptAllButton` — Accepts all consent
* `ConsentWidget.RejectButton` — Rejects all consent
* `ConsentWidget.SaveButton` — Saves custom selections
## Using `renderAction` with c15t Defaults
`ConsentWidget.PolicyActions` renders stock c15t buttons and translations by default.
```tsx
<ConsentWidget.PolicyActions />
```
`renderAction` is optional. Return the stock button compounds when you want custom mapping while preserving built-in c15t behavior and copy:
```tsx
<ConsentWidget.PolicyActions
renderAction={(action, props) => {
const { key, ...buttonProps } = props
switch (action) {
case 'accept':
return <ConsentWidget.AcceptAllButton key={key} {...buttonProps} />
case 'reject':
return <ConsentWidget.RejectButton key={key} {...buttonProps} />
case 'customize':
return <ConsentWidget.SaveButton key={key} {...buttonProps} />
}
}}
/>
```
`renderAction` is still meant for stock button compounds. If you want completely custom button elements and handlers, use `useHeadlessConsentUI()` and render `dialog.actionGroups` manually instead of `ConsentWidget.PolicyActions`.
For a fixed footer layout, render `ConsentWidget.Footer` and `ConsentWidget.FooterSubGroup` manually instead of using `ConsentWidget.PolicyActions`.
If the stock widget structure is already correct, stay with tokens and slots instead of rebuilding the layout.
## Props
|Property|Value|
|:--|:--|
|Type Name|\`ConsentWidgetProps\`|
|Source Path|\`./packages/react/src/components/consent-widget/types.ts\`|
\*ExtractedTypeTable: Could not extract "ConsentWidgetProps" from "./packages/react/src/components/consent-widget/types.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*