Environment
Setup components for a custom environment like IFrames, Shadow DOM or an Electron context.
Setup components for a custom environment like IFrames, Shadow DOM or an Electron context.
Internally, we use
Zag.js,
which uses DOM query methods like document.querySelectorAll
and
document.getElementById
to locate elements within the machine.
In custom environments like iframe, Shadow DOM, Electron, etc., the machine
might not work as expected because document
may not be available.
To provide the correct reference to root node or document, you can pass
getRootNode
function either to all Ark UI root components, or provide a
default with this Environment component.
In shadow DOM, the root node can be derived from calling
element.getRootNode()
method on any element.
When targeting a custom environment like an iframe, Shadow DOM or Electron, you can render the Environment component to provide the environment context to all Ark UI child components.
import { Environment, useEnvironmentContext } from '@ark-ui/react'
import { useCallback, type ReactNode } from 'react'
export const App = (props: { children: ReactNode }) => {
const getRootNode = useCallback(() => document, [])
return <Environment value={getRootNode}>{props.children}</Environment>
}
You can use the useEnvironmentContext
hook to consume the environment context.
It will return undefined
by default, if the Environment component is not
rendered as a parent.
const { getRootNode, getWindow, getDocument } = useEnvironmentContext()