Iframe embed
Koval UI provides a utility component Iframe which adds improvements on top of HTMLIFrameElement.
Features
- Responsive.
Iframerespects parent element's size and collapses if needed. Developers have to providewidthandheightprops required to renderHTMLIFrameElement; - Flexible permissions config. Developers can use
sandboxConfigandpermissionsConfigprops, which allow better modification thansandboxandallowhtml 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 viaaorareaelements 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 receivingBeforeUnloadEventevents.
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}} />