Iframe embed
Koval UI provides a utility component Iframe
which adds improvements on top of HTMLIFrameElement
.
Features
- Responsive.
Iframe
respects parent element's size and collapses if needed. Developers have to providewidth
andheight
props required to renderHTMLIFrameElement
; - Flexible permissions config. Developers can use
sandboxConfig
andpermissionsConfig
props, which allow better modification thansandbox
andallow
html attributes. See below.
Demo
function Example(props) { const permissionsConfig = { accelerometer: true, autoplay: true, 'clipboard-write': true, 'encrypted-media': true, gyroscope: true, 'picture-in-picture': true, 'web-share': true, }; const sandboxConfig = { 'allow-downloads': true, 'allow-downloads-without-user-activation': true, 'allow-forms': true, 'allow-modals': true, 'allow-orientation-lock': true, 'allow-pointer-lock': true, 'allow-popups': true, 'allow-popups-to-escape-sandbox': true, 'allow-presentation': true, 'allow-same-origin': true, 'allow-scripts': true, 'allow-storage-access-by-user-activation': true, 'allow-top-navigation': true, 'allow-top-navigation-by-user-activation': true, 'allow-top-navigation-to-custom-protocols': true, }; return ( <Iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ?si=dFPV1emazW5GQntR" width={560} height={315} referrerPolicy="strict-origin-when-cross-origin" allowFullScreen={true} name="rickroll" title="YouTube video player" sandboxConfig={sandboxConfig} permissionsConfig={permissionsConfig} /> ); }
See Iframe
playground and full props description at the Storybook
page.
sandbox
permissions
sandboxConfig
property is responsible for managing the sandbox permissions. But instead of using flat string, Koval uses the config object.
Basic Permissions
Downloads
'allow-downloads'
: Enables downloading files viaa
orarea
elements with the download attribute, including programmatic downloads initiated without user interaction.'allow-downloads-without-user-activation'
: Allows downloads to occur without requiring any user gesture (click, tap, etc.).
Forms
'allow-forms'
: Permits form submissions and validation processes to function normally. Without this, forms will appear but not submit data or trigger validations.
Modals
'allow-modals'
: Enables the use of modal dialogs viaalert()
,confirm()
,print()
andprompt()
. Also allows receivingBeforeUnloadEvent
events.
Navigation Control
'allow-orientation-lock'
: Grants permission to lock screen orientation (portrait/landscape).'allow-pointer-lock'
: Enables the Pointer Lock API for more immersive experiences.'allow-popups'
: Allows opening pop-up windows viawindow.open()
, target="_blank", etc. Without this, popup attempts will silently fail.'allow-popups-to-escape-sandbox'
: Permits pop-ups to open outside the sandbox restrictions, useful for third-party content like ads linking to external sites.
Security Features
'allow-same-origin'
: If omitted, the resource is treated as cross-origin by default (more secure). Including this allows access to same-domain resources.'allow-scripts'
: Enables JavaScript execution within the iframe (required for interactive content). Without this, scripts will be blocked.'allow-storage-access-by-user-activation'
: Allows requesting access to unpartitioned cookies via the Storage Access API after user interaction.
Advanced Options
'allow-presentation'
: Grants control over whether the iframe can initiate presentation sessions (like slideshows).'allow-top-navigation'
: Permits navigating the top-level browsing context (the main browser tab/window). Use with caution as this weakens security.'allow-top-navigation-by-user-activation'
: Allows navigation to the top level only when initiated by a user action (more secure than fullallow-top-navigation
).'allow-top-navigation-to-custom-protocols'
: Enables navigating to non-HTTP protocols registered with the browser.
allow
permissions
permissionsConfig
property is responsible for managing the permissions policy of the iframe. We also provide a config object for this.
We're extending on top of default allow
attribute which expects configuration as a flat string. There are some keywords surrounded by quotes, though urls aren't. Semicolon used as delimiter
HTML attribute
<iframe
allow="geolocation 'self' https://a.example.com https://b.example.com; accelerometer *"></iframe>
Koval config
Koval UI makes this config more jsx friendly and easier to read.
Each permission is a config property with its own name. Developers can provide one or many values to each property.
See Iframe
playground with all supported permissions
here.
type Permission = `https://${string}` | 'self' | '*' | 'src' | 'none' | boolean;
export type PermissionsConfig = {
/**
* Controls whether the iframe is allowed
* to gather information about the acceleration of the device through the Accelerometer interface.
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Permissions-Policy/accelerometer
*/
accelerometer?: Permission | Permission[];
//...
};
Also, it is possible to set permissions as a boolean variable. It is an equivalent for <iframe allow="accelerometer" />
.
<Iframe permissionsConfig={{accelerometer: true}} />