Environment Provider
Used to render components in iframes, Shadow DOM, or Electron.
We use Zag.js internally, which relies on DOM query methods like document.querySelectorAll
and document.getElementById
. In custom environments like iframes, Shadow DOM, or Electron, these methods might not work as expected.
To handle this, Ark UI includes the EnvironmentProvider
, allowing you to set the appropriate root node or document, ensuring correct DOM queries.
Usage
import { EnvironmentProvider } from "@chakra-ui/react"
<EnvironmentProvider>{/* Your App */}</EnvironmentProvider>
Examples
iframe
Here's an example that uses react-frame-component
to set the EnvironmentProvider
's value with the iframe environment.
import { EnvironmentProvider } from "@chakra-ui/react" import Frame, { FrameContextConsumer } from "react-frame-component" export const Demo = () => ( <Frame> <FrameContextConsumer> {({ document }) => ( <EnvironmentProvider value={() => document}> {/* Your App */} </EnvironmentProvider> )} </FrameContextConsumer> </Frame> )
Shadow DOM
Here's an example that uses react-shadow
to set the EnvironmentProvider
's value with Shadow DOM environment.
import { EnvironmentProvider } from "@chakra-ui/react" import { useRef } from "react" import root from "react-shadow" export const Demo = () => { const portalRef = useRef() return ( <root.div ref={portalRef}> <EnvironmentProvider value={() => portalRef?.current?.shadowRoot ?? document} > {/* Your App */} </EnvironmentProvider> </root.div> ) }
Accessing Context
Use the useEnvironmentContext
hook to access the RootNode
, Document
, and Window
context.
import { useEnvironmentContext } from "@chakra-ui/react" export const Demo = () => { const { getRootNode } = useEnvironmentContext() return <pre>{JSON.stringify(getRootNode(), null, 2)}</pre> }
Props
Prop | Default | Type |
---|---|---|
value | RootNode | (() => RootNode) |