(e.g. react-dom)
const child = childRef.current
if (child) console.log(child)
}, [])
// A child element, can live deep down another component
return
}
```
### useNearestParent
Returns the nearest react-reconciler parent instance or the node created from `Reconciler.createInstance`.
In react-dom, this would be a DOM element; in react-three-fiber this would be an instance descriptor.
```tsx
import * as React from 'react'
import { useNearestParent } from 'its-fine'
function Component() {
// Returns a React Ref which points to the nearest parent
element.
// Omit the element type to match the nearest element of any kind
const parentRef: React.MutableRefObject
= useNearestParent('div')
// Access parent Ref on mount
React.useEffect(() => {
// (e.g. react-dom)
const parent = parentRef.current
if (parent) console.log(parent)
}, [])
}
// A parent element wrapping Component, can live deep up another component
;
```
### useContextMap
Returns a map of all contexts and their values.
```tsx
import * as React from 'react'
import { useContextMap } from 'its-fine'
const SomeContext = React.createContext
(null!)
function Component() {
const contextMap = useContextMap()
return contextMap.get(SomeContext)
}
```
### useContextBridge
React Context currently cannot be shared across [React renderers](https://reactjs.org/docs/codebase-overview.html#renderers) but explicitly forwarded between providers (see [react#17275](https://github.com/facebook/react/issues/17275)). This hook returns a `ContextBridge` of live context providers to pierce Context across renderers.
Pass `ContextBridge` as a component to a secondary renderer to enable context-sharing within its children.
```tsx
import * as React from 'react'
// react-nil is a secondary renderer that is usually used for testing.
// This also includes Fabric, react-three-fiber, etc
import * as ReactNil from 'react-nil'
// react-dom is a primary renderer that works on top of a secondary renderer.
// This also includes react-native, react-pixi, etc.
import * as ReactDOM from 'react-dom/client'
import { type ContextBridge, useContextBridge, FiberProvider } from 'its-fine'
function Canvas(props: { children: React.ReactNode }) {
// Returns a bridged context provider that forwards context
const Bridge: ContextBridge = useContextBridge()
// Renders children with bridged context into a secondary renderer
ReactNil.render({props.children})
}
// A React Context whose provider lives in react-dom
const DOMContext = React.createContext(null!)
// A component that reads from DOMContext
function Component() {
// "Hello from react-dom"
console.log(React.useContext(DOMContext))
}
// Renders into a primary renderer like react-dom or react-native,
// DOMContext wraps Canvas and is bridged into Component
ReactDOM.createRoot(document.getElementById('root')!).render(
,
)
```
### useActivityBridge
Returns a stable `ActivityBridge` that forwards ancestor `` visibility into another React root while preserving child state. Requires React 19.2+ and an Activity capable renderer.
```tsx
import * as React from 'react'
import * as ReactDOM from 'react-dom/client'
import { useActivityBridge, FiberProvider } from 'its-fine'
// The application owns the destination root and its cleanup
const destination = ReactDOM.createRoot(document.getElementById('destination')!)
function Canvas(props: { children: React.ReactNode }) {
// Forwards Activity visibility. Use useContextBridge separately for context
const Bridge = useActivityBridge()
// Render after the source commits. Removing Canvas hides the destination
React.useLayoutEffect(() => {
destination.render({props.children})
})
return null
}
ReactDOM.createRoot(document.getElementById('source')!).render(
{/* Set mode to "hidden" to hide both roots' children while preserving state */}
,
)
```
If the source shows a Suspense loading fallback, the destination stays visible unless an ancestor Activity is hidden.
## Utils
Additional exported utility functions for raw handling of Fibers.
### traverseFiber
Traverses up or down a `Fiber`, return `true` to stop and select a node.
```ts
import { type Fiber, traverseFiber } from 'its-fine'
// Traverses through the Fiber tree, returns the current node when `true` is passed via selector
const parentDiv: Fiber | undefined = traverseFiber(
// Input Fiber to traverse
fiber as Fiber,
// Whether to ascend and walk up the tree. Will walk down if `false`
true,
// A Fiber node selector, returns the first match when `true` is passed
(node: Fiber) => node.type === 'div',
)
```