CSP Provider
Configures CSP-related behavior for inline tags rendered by Base UI components.
Components can attach a nonce to the styles they generate.
Scroll this content to see the custom scrollbar.
Disable style elements to supply these rules in your own stylesheet.
Nested providers configure their own subtree.
Anatomy
Import the component and wrap it around your app:
Some Base UI components render inline <style> or <script> tags for functionality such as removing scrollbars or pre-hydration behavior. Under a strict Content Security Policy (CSP), these tags may be blocked unless they include a matching nonce attribute.
CSPProvider allows configuring this behavior globally for all Base UI components within its tree.
Supplying a nonce
If you enforce a CSP that blocks inline tags by default, configure your server to:
- Generate a random nonce per request
- Include it in your CSP header (via
style-src-elem/script-src) - Pass the same nonce into
CSPProviderduring rendering
Then:
This will ensure that all inline <style> and <script> tags rendered by Base UI components include the correct nonce attribute, allowing them to function under your CSP.
Disable inline style elements
You can avoid supplying a nonce if you disable inline <style> elements entirely and rely on external stylesheets only. The relevant components are <ScrollArea.Viewport> and <Select.Popup> or <Select.List> when alignItemWithTrigger is enabled, which inject a style tag to disable native scrollbars.
Specify disableStyleElements to remove these tags:
<script> tags across all components are opt-in, so they are not affected by this prop and don’t have their own disable flag. A nonce is required if any component uses inline scripts.
Inline style attributes
CSPProvider covers inline <style> and <script> tags rendered as elements, but it does not cover inline style attributes (for example, <div style="...">). The style-src-attr directive in CSP governs inline style attributes encountered when parsing HTML from server pre-rendered components (it does not affect client-side JavaScript that sets styles).
In CSP, style-src applies to both <style> elements and style="" attributes. If you only want to control <style> elements, use style-src-elem instead.
If your CSP blocks inline style attributes in addition to elements, you have a few options:
- Relax your CSP by adding
'unsafe-inline'to thestyle-src-attrdirective (or using onlystyle-src-eleminstead ofstyle-src). Style attributes specifically pose a less severe security risk than style elements, but this approach may not be acceptable in high-security environments. - Render the affected components only on the client, so that no inline styles are present in the initial HTML.
- Manually unset inline styles and specify them in your CSS instead. Any component can have its inline styles unset, such as
<ScrollArea.Viewport style={{ overflow: undefined }}>. Note that you’ll need to ensure you vet upgrades for any new inline styles added by Base UI components.
Stencil API
The Stencil provider is fs-csp-provider-root. Import the automatic registration entry, or call defineCustomElements() from finesoft-components/define-custom-elements before using the elements.
Property | HTML attribute | Default |
|---|---|---|
nonce | nonce | undefined |
disableStyleElements | disable-style-elements | false |
The nearest provider replaces the complete configuration. A nested provider with no props enables style elements without inheriting the outer nonce. Portals retain their declaration scope. useCSPContext(element) reads the current configuration for custom consumers.
Like the frozen React style resource, the scrollbar stylesheet is emitted once per document or shadow root and remains after its consumers unmount. The first emission determines its nonce. disableStyleElements prevents emission; changing it later does not remove an existing shared stylesheet. Set the request nonce and disable flag before mounting consumers.
This provider configures the optional scrollbar <style> tags in Scroll Area and Select and the opt-in Tabs Indicator prehydration script. It leaves native style attributes unchanged. When disabling these tags, put the .base-ui-disable-scrollbar rules above in an external stylesheet.
Stencil also installs global component layout styles. Configure their nonce separately, before registration, with <meta name="csp-nonce" content="request-nonce"> or setNonce(requestNonce) from finesoft-components/define-custom-elements. Use the same request nonce in your CSP response header. A nested provider does not change the document-wide Stencil runtime nonce.
API reference
disableStyleElementsbooleanfalse
- Description
Whether inline
<style>elements created by Base UI components should not be rendered. Instead, components must specify the CSS styles via custom class names or other methods.- Type
- Default
false
noncestring—
- Name
- Description
The nonce value to apply to inline
<style>and<script>tags.- Type
childrenReact.ReactNode—
- Name
- Type
CSPProvider.PropsHide
Re-Export of CSPProvider props as CSPProviderProps