@hanzogui/use-element-layout 3.0.5 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +284 -154
- package/dist/cjs/index.native.js +353 -226
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/esm/index.js +269 -141
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +269 -141
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +338 -213
- package/dist/esm/index.native.js.map +1 -1
- package/package.json +4 -4
- package/src/index.tsx +4 -4
- package/types/index.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["jsx","_jsx","useIsomorphicLayoutEffect","createContext","useContext","useId","_instanceof","left","right","Symbol","hasInstance","LayoutHandlers","WeakMap","LayoutDisableKey","Nodes","Set","IntersectionState","usePretransformDimensions","globalThis","__HANZO_GUI_ONLAYOUT_PRETRANSFORM","process","env","HANZO_GUI_ONLAYOUT_PRETRANSFORM","_debugLayout","isDebugLayout","window","URLSearchParams","location","search","has","DisableLayoutContextValues","DisableLayoutContextKey","ENABLE","LayoutMeasurementController","param","disable","children","id","Provider","value","globalIntersectionObserver","strategy","setOnLayoutStrategy","state","NodeRectCache","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","startGlobalObservers","IntersectionObserver","entries","i","length","entry","node","target","get","isIntersecting","set","threshold","rectsEqual","a","b","x","y","width","height","ensureRectFetchObserver","rectFetchObserver","lastCallbackDelay","Math","round","performance","now","rectFetchStartTime","BoundingRects","boundingClientRect","NODE_ENV","console","warn","rectFetchResolve","ensureRectFetchObserver2","updateLayoutIfChanged","onLayout","parentNode","parentElement","nodeRect","parentRect","getBoundingClientRect","cachedRect","cachedParentRect","nodeChanged","parentChanged","event","getElementLayoutEvent","log","tag","tagName","className","slice","layout","nativeEvent","first","rAF","requestAnimationFrame","userSkipVal","HANZO_GUI_LAYOUT_FRAME_SKIP","BASE_SKIP_FRAMES","MAX_SKIP_FRAMES","skipFrames","frameCount","layoutOnAnimationFrame","setTimeout","Number","MAX_SAFE_INTEGER","visibleNodes","parentsToObserve","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","iterator","_step","next","done","HTMLElement","cleanupNode","disableKey","push","add","err","return","io","observe","_iteratorNormalCompletion1","_didIteratorError1","_iteratorError1","_iterator1","_step1","parent","Promise","res","i1","unobserve","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","parent1","min","max","i2","getRelativeDimensions","timeStamp","Date","getPreTransformDimensions","offsetWidth","offsetHeight","aNode","top","pageX","pageY","registerLayoutNode","onChange","delete","PrevHostNode","useElementLayout","ref","_ref_current","ensureWebElement","current","host","_ref_current2","nextNode","prevNode","handler","node2","totalNodes","size"],"sources":["../../src/index.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","useIsomorphicLayoutEffect","createContext","useContext","useId","_instanceof","left","right","Symbol","hasInstance","LayoutHandlers","WeakMap","LayoutDisableKey","Nodes","Set","IntersectionState","usePretransformDimensions","globalThis","__GUI_ONLAYOUT_PRETRANSFORM","process","env","GUI_ONLAYOUT_PRETRANSFORM","_debugLayout","isDebugLayout","window","URLSearchParams","location","search","has","DisableLayoutContextValues","DisableLayoutContextKey","ENABLE","LayoutMeasurementController","param","disable","children","id","Provider","value","globalIntersectionObserver","strategy","setOnLayoutStrategy","state","NodeRectCache","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","startGlobalObservers","IntersectionObserver","entries","i","length","entry","node","target","get","isIntersecting","set","threshold","rectsEqual","a","b","x","y","width","height","ensureRectFetchObserver","rectFetchObserver","lastCallbackDelay","Math","round","performance","now","rectFetchStartTime","BoundingRects","boundingClientRect","NODE_ENV","console","warn","rectFetchResolve","ensureRectFetchObserver2","updateLayoutIfChanged","onLayout","parentNode","parentElement","nodeRect","parentRect","getBoundingClientRect","cachedRect","cachedParentRect","nodeChanged","parentChanged","event","getElementLayoutEvent","log","tag","tagName","className","slice","layout","nativeEvent","first","rAF","requestAnimationFrame","userSkipVal","GUI_LAYOUT_FRAME_SKIP","BASE_SKIP_FRAMES","MAX_SKIP_FRAMES","skipFrames","frameCount","layoutOnAnimationFrame","setTimeout","Number","MAX_SAFE_INTEGER","visibleNodes","parentsToObserve","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","iterator","_step","next","done","HTMLElement","cleanupNode","disableKey","push","add","err","return","io","observe","_iteratorNormalCompletion1","_didIteratorError1","_iteratorError1","_iterator1","_step1","parent","Promise","res","i1","unobserve","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","parent1","min","max","i2","getRelativeDimensions","timeStamp","Date","getPreTransformDimensions","offsetWidth","offsetHeight","aNode","top","pageX","pageY","registerLayoutNode","onChange","delete","PrevHostNode","useElementLayout","ref","_ref_current","ensureWebElement","current","host","_ref_current2","nextNode","prevNode","handler","node2","totalNodes","size","swappedNode"],"sources":["../../src/index.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hanzogui/use-element-layout",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "4.3.1",
|
|
4
4
|
"gitHead": "a49cc7ea6b93ba384e77a4880ae48ac4a5635c14",
|
|
5
5
|
"files": [
|
|
6
6
|
"src",
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"clean:build": "hanzo-gui-build clean:build"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@hanzogui/constants": "3.0.
|
|
38
|
-
"@hanzogui/is-equal-shallow": "3.0.
|
|
37
|
+
"@hanzogui/constants": "3.0.6",
|
|
38
|
+
"@hanzogui/is-equal-shallow": "3.0.6"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@hanzogui/build": "3.0.
|
|
41
|
+
"@hanzogui/build": "3.0.6",
|
|
42
42
|
"react": ">=19"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
package/src/index.tsx
CHANGED
|
@@ -10,8 +10,8 @@ const IntersectionState = new WeakMap<HTMLElement, boolean>()
|
|
|
10
10
|
// can be set via env var at build time or runtime global for testing
|
|
11
11
|
// see: https://github.com/hanzoai/gui/pull/2329
|
|
12
12
|
const usePretransformDimensions = () =>
|
|
13
|
-
(globalThis as any).
|
|
14
|
-
process.env.
|
|
13
|
+
(globalThis as any).__GUI_ONLAYOUT_PRETRANSFORM === true ||
|
|
14
|
+
process.env.GUI_ONLAYOUT_PRETRANSFORM === '1'
|
|
15
15
|
|
|
16
16
|
let _debugLayout: boolean | undefined
|
|
17
17
|
|
|
@@ -29,7 +29,7 @@ const DisableLayoutContextValues: Record<string, boolean> = {}
|
|
|
29
29
|
const DisableLayoutContextKey = createContext<string>('')
|
|
30
30
|
|
|
31
31
|
const ENABLE =
|
|
32
|
-
process.env.
|
|
32
|
+
process.env.GUI_TARGET === 'web' && typeof IntersectionObserver !== 'undefined'
|
|
33
33
|
|
|
34
34
|
// internal testing - advanced helper to turn off layout measurement for extra performance
|
|
35
35
|
// TODO document!
|
|
@@ -231,7 +231,7 @@ if (ENABLE) {
|
|
|
231
231
|
typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : undefined
|
|
232
232
|
|
|
233
233
|
// adaptive frame skipping with backoff
|
|
234
|
-
const userSkipVal = process.env.
|
|
234
|
+
const userSkipVal = process.env.GUI_LAYOUT_FRAME_SKIP
|
|
235
235
|
const BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10
|
|
236
236
|
const MAX_SKIP_FRAMES = 20
|
|
237
237
|
let skipFrames = BASE_SKIP_FRAMES
|
package/types/index.d.ts.map
CHANGED
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
],
|
|
7
7
|
"version": 3,
|
|
8
8
|
"sourcesContent": [
|
|
9
|
-
"import { useIsomorphicLayoutEffect } from '@hanzogui/constants'\nimport { createContext, useContext, useId, type ReactNode, type RefObject } from 'react'\n\nconst LayoutHandlers = new WeakMap<HTMLElement, Function>()\nconst LayoutDisableKey = new WeakMap<HTMLElement, string>()\nconst Nodes = new Set<HTMLElement>()\nconst IntersectionState = new WeakMap<HTMLElement, boolean>()\n\n// feature flag to enable pre-transform dimension reporting (matches RN behavior)\n// can be set via env var at build time or runtime global for testing\n// see: https://github.com/hanzoai/gui/pull/2329\nconst usePretransformDimensions = () =>\n (globalThis as any).__HANZO_GUI_ONLAYOUT_PRETRANSFORM === true ||\n process.env.HANZO_GUI_ONLAYOUT_PRETRANSFORM === '1'\n\nlet _debugLayout: boolean | undefined\n\nfunction isDebugLayout() {\n if (_debugLayout === undefined) {\n _debugLayout =\n typeof window !== 'undefined' &&\n new URLSearchParams(window.location.search).has('__tamaDebugLayout')\n }\n return _debugLayout\n}\n\n// separating to avoid all re-rendering\nconst DisableLayoutContextValues: Record<string, boolean> = {}\nconst DisableLayoutContextKey = createContext<string>('')\n\nconst ENABLE =\n process.env.HANZO_GUI_TARGET === 'web' && typeof IntersectionObserver !== 'undefined'\n\n// internal testing - advanced helper to turn off layout measurement for extra performance\n// TODO document!\n// TODO could add frame skip control here\nexport const LayoutMeasurementController = ({\n disable,\n children,\n}: {\n disable: boolean\n children: ReactNode\n}): ReactNode => {\n const id = useId()\n\n useIsomorphicLayoutEffect(() => {\n DisableLayoutContextValues[id] = disable\n }, [disable, id])\n\n return (\n <DisableLayoutContextKey.Provider value={id}>\n {children}\n </DisableLayoutContextKey.Provider>\n )\n}\n\n// Single persistent IntersectionObserver for visibility tracking\nlet globalIntersectionObserver: IntersectionObserver | null = null\n\ntype GuiComponentStatePartial = {\n host?: any\n}\n\ntype LayoutMeasurementStrategy = 'off' | 'sync' | 'async'\n\nlet strategy: LayoutMeasurementStrategy = 'async'\n\nexport function setOnLayoutStrategy(state: LayoutMeasurementStrategy): void {\n strategy = state\n}\n\nexport type LayoutValue = {\n x: number\n y: number\n width: number\n height: number\n pageX: number\n pageY: number\n}\n\nexport type LayoutEvent = {\n nativeEvent: {\n layout: LayoutValue\n target: any\n }\n timeStamp: number\n}\n\nconst NodeRectCache = new WeakMap<HTMLElement, DOMRect>()\n\n// prevent thrashing during first hydration (somewhat, streaming gets trickier)\nlet avoidUpdates = true\nconst queuedUpdates = new Map<HTMLElement, Function>()\n\nexport function enable(): void {\n if (avoidUpdates) {\n avoidUpdates = false\n if (queuedUpdates) {\n queuedUpdates.forEach((cb) => cb())\n queuedUpdates.clear()\n }\n }\n}\n\nfunction startGlobalObservers() {\n if (!ENABLE || globalIntersectionObserver) return\n\n globalIntersectionObserver = new IntersectionObserver(\n (entries) => {\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const node = entry.target as HTMLElement\n if (IntersectionState.get(node) !== entry.isIntersecting) {\n IntersectionState.set(node, entry.isIntersecting)\n }\n }\n },\n {\n threshold: 0,\n }\n )\n}\n\n// optimization: inline rect comparison to avoid function call overhead on hot path\nfunction rectsEqual(a: DOMRectReadOnly, b: DOMRectReadOnly): boolean {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n}\n\nif (ENABLE) {\n const BoundingRects = new WeakMap<Element, DOMRectReadOnly>()\n\n // optimization: persistent IO for rect fetching, reused across cycles\n let rectFetchObserver: IntersectionObserver | null = null\n let rectFetchResolve: ((value: boolean) => void) | null = null\n let rectFetchStartTime = 0\n let lastCallbackDelay = 0\n\n function ensureRectFetchObserver() {\n if (rectFetchObserver) return rectFetchObserver\n\n rectFetchObserver = new IntersectionObserver(\n (entries) => {\n lastCallbackDelay = Math.round(performance.now() - rectFetchStartTime)\n\n // store all rects\n for (let i = 0; i < entries.length; i++) {\n BoundingRects.set(entries[i].target, entries[i].boundingClientRect)\n }\n\n if (\n process.env.NODE_ENV === 'development' &&\n isDebugLayout() &&\n lastCallbackDelay > 50\n ) {\n console.warn(\n '[onLayout-io-delay]',\n lastCallbackDelay + 'ms',\n entries.length,\n 'entries'\n )\n }\n\n if (rectFetchResolve) {\n rectFetchResolve(true)\n rectFetchResolve = null\n }\n },\n {\n threshold: 0,\n }\n )\n\n return rectFetchObserver\n }\n\n async function updateLayoutIfChanged(node: HTMLElement) {\n const onLayout = LayoutHandlers.get(node)\n if (typeof onLayout !== 'function') return\n\n const parentNode = node.parentElement\n if (!parentNode) return\n\n let nodeRect: DOMRectReadOnly | undefined\n let parentRect: DOMRectReadOnly | undefined\n\n // respect the strategy contract\n if (strategy === 'async') {\n nodeRect = BoundingRects.get(node)\n parentRect = BoundingRects.get(parentNode)\n\n if (!nodeRect || !parentRect) {\n return\n }\n } else {\n nodeRect = node.getBoundingClientRect()\n parentRect = parentNode.getBoundingClientRect()\n }\n\n const cachedRect = NodeRectCache.get(node)\n const cachedParentRect = NodeRectCache.get(parentNode)\n\n // optimization: inline comparison instead of isEqualShallow\n const nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect)\n const parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect)\n\n if (nodeChanged || parentChanged) {\n NodeRectCache.set(node, nodeRect as DOMRect)\n NodeRectCache.set(parentNode, parentRect as DOMRect)\n\n const event = getElementLayoutEvent(nodeRect, parentRect, node)\n\n if (process.env.NODE_ENV === 'development' && isDebugLayout()) {\n console.log('[useElementLayout] change', {\n tag: node.tagName,\n id: node.id || undefined,\n className: (node.className || '').slice(0, 60) || undefined,\n layout: event.nativeEvent.layout,\n first: !cachedRect,\n })\n }\n\n if (avoidUpdates) {\n queuedUpdates.set(node, () => onLayout(event))\n } else {\n onLayout(event)\n }\n }\n }\n\n const rAF =\n typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : undefined\n\n // adaptive frame skipping with backoff\n const userSkipVal = process.env.HANZO_GUI_LAYOUT_FRAME_SKIP\n const BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10\n const MAX_SKIP_FRAMES = 20\n let skipFrames = BASE_SKIP_FRAMES\n let frameCount = 0\n\n async function layoutOnAnimationFrame() {\n // skip frames based on adaptive rate\n if (frameCount++ % skipFrames !== 0) {\n rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16)\n return\n }\n\n // reset frame count to avoid overflow\n if (frameCount >= Number.MAX_SAFE_INTEGER) {\n frameCount = 0\n }\n\n if (strategy !== 'off') {\n const visibleNodes: HTMLElement[] = []\n // optimization: deduplicate parent observations\n const parentsToObserve = new Set<HTMLElement>()\n\n // collect visible nodes and their unique parents\n for (const node of Nodes) {\n const parentElement = node.parentElement\n if (!(parentElement instanceof HTMLElement)) {\n cleanupNode(node)\n continue\n }\n const disableKey = LayoutDisableKey.get(node)\n if (disableKey && DisableLayoutContextValues[disableKey] === true) continue\n if (IntersectionState.get(node) === false) continue\n\n visibleNodes.push(node)\n parentsToObserve.add(parentElement)\n }\n\n if (visibleNodes.length > 0) {\n const io = ensureRectFetchObserver()\n rectFetchStartTime = performance.now()\n\n // observe all nodes\n for (let i = 0; i < visibleNodes.length; i++) {\n io.observe(visibleNodes[i])\n }\n // optimization: observe unique parents only (not N times for N children)\n for (const parent of parentsToObserve) {\n io.observe(parent)\n }\n\n // wait for callback\n await new Promise<boolean>((res) => {\n rectFetchResolve = res\n })\n\n // unobserve all to reset for next cycle\n for (let i = 0; i < visibleNodes.length; i++) {\n io.unobserve(visibleNodes[i])\n }\n for (const parent of parentsToObserve) {\n io.unobserve(parent)\n }\n\n // adaptive backoff: if IO was slow, skip more frames next cycle\n if (lastCallbackDelay > 50) {\n skipFrames = Math.min(skipFrames + 2, MAX_SKIP_FRAMES)\n } else if (lastCallbackDelay < 20) {\n // recover back to base rate when things are fast\n skipFrames = Math.max(skipFrames - 1, BASE_SKIP_FRAMES)\n }\n\n // process updates\n for (let i = 0; i < visibleNodes.length; i++) {\n updateLayoutIfChanged(visibleNodes[i])\n }\n }\n }\n\n // schedule next frame\n rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16)\n }\n\n layoutOnAnimationFrame()\n}\n\nexport const getElementLayoutEvent = (\n nodeRect: DOMRectReadOnly,\n parentRect: DOMRectReadOnly,\n node?: HTMLElement\n): LayoutEvent => {\n return {\n nativeEvent: {\n layout: getRelativeDimensions(nodeRect, parentRect, node),\n target: nodeRect,\n },\n timeStamp: Date.now(),\n }\n}\n\n/**\n * get pre-transform dimensions for a node.\n * uses offsetWidth/offsetHeight which report CSS layout dimensions\n * unaffected by transforms - this matches React Native's onLayout behavior.\n *\n * see: https://github.com/hanzoai/gui/pull/2329\n */\nconst getPreTransformDimensions = (\n node: HTMLElement\n): { width: number; height: number } => {\n return {\n width: node.offsetWidth,\n height: node.offsetHeight,\n }\n}\n\nconst getRelativeDimensions = (\n a: DOMRectReadOnly,\n b: DOMRectReadOnly,\n aNode?: HTMLElement\n) => {\n const { left, top } = a\n const x = left - b.left\n const y = top - b.top\n\n // get pre-transform dimensions when flag is enabled and node is available\n const { width, height } =\n usePretransformDimensions() && aNode\n ? getPreTransformDimensions(aNode)\n : { width: a.width, height: a.height }\n\n return { x, y, width, height, pageX: a.left, pageY: a.top }\n}\n\n// register an arbitrary DOM element into the measurement loop without React lifecycle\nexport function registerLayoutNode(\n node: HTMLElement,\n onChange: () => void,\n disableKey?: string\n): () => void {\n Nodes.add(node)\n LayoutHandlers.set(node, onChange)\n if (disableKey) LayoutDisableKey.set(node, disableKey)\n startGlobalObservers()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(node)\n IntersectionState.set(node, true)\n }\n return () => cleanupNode(node)\n}\n\nfunction cleanupNode(node: HTMLElement) {\n Nodes.delete(node)\n LayoutHandlers.delete(node)\n LayoutDisableKey.delete(node)\n NodeRectCache.delete(node)\n IntersectionState.delete(node)\n if (globalIntersectionObserver) {\n globalIntersectionObserver.unobserve(node)\n }\n}\n\nconst PrevHostNode = new WeakMap<object, HTMLElement | undefined>()\n\nexport function useElementLayout(\n ref: RefObject<GuiComponentStatePartial>,\n onLayout?: ((e: LayoutEvent) => void) | null\n): void {\n const disableKey = useContext(DisableLayoutContextKey)\n\n // keep handlers up to date so polling always calls the latest callback\n const node = ensureWebElement(ref.current?.host)\n if (node && onLayout) {\n LayoutHandlers.set(node, onLayout)\n LayoutDisableKey.set(node, disableKey)\n }\n\n // detect host swaps after commit and fire immediate sync layout\n useIsomorphicLayoutEffect(() => {\n if (!onLayout) return\n const nextNode = ensureWebElement(ref.current?.host)\n const prevNode = PrevHostNode.get(ref)\n if (nextNode === prevNode) return\n\n if (prevNode) cleanupNode(prevNode)\n PrevHostNode.set(ref, nextNode)\n if (!nextNode) return\n\n Nodes.add(nextNode)\n startGlobalObservers()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(nextNode)\n IntersectionState.set(nextNode, true)\n }\n\n const handler = LayoutHandlers.get(nextNode)\n if (typeof handler !== 'function') return\n const parentNode = nextNode.parentElement\n if (!parentNode) return\n\n const nodeRect = nextNode.getBoundingClientRect()\n const parentRect = parentNode.getBoundingClientRect()\n NodeRectCache.set(nextNode, nodeRect)\n NodeRectCache.set(parentNode, parentRect)\n handler(getElementLayoutEvent(nodeRect, parentRect, nextNode))\n })\n\n useIsomorphicLayoutEffect(() => {\n if (!onLayout) return\n const node = ref.current?.host\n if (!node) return\n\n Nodes.add(node)\n\n startGlobalObservers()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(node)\n IntersectionState.set(node, true)\n }\n\n if (process.env.NODE_ENV === 'development' && isDebugLayout()) {\n console.log('[useElementLayout] register', {\n tag: node.tagName,\n id: node.id || undefined,\n className: (node.className || '').slice(0, 60) || undefined,\n totalNodes: Nodes.size,\n })\n }\n\n // always do one immediate sync layout event for accuracy\n const parentNode = node.parentNode as HTMLElement | null\n if (parentNode) {\n onLayout(\n getElementLayoutEvent(\n node.getBoundingClientRect(),\n parentNode.getBoundingClientRect(),\n node\n )\n )\n }\n\n return () => {\n cleanupNode(node)\n\n // also clean up any node from a mid-lifecycle host swap\n const swappedNode = PrevHostNode.get(ref)\n if (swappedNode && swappedNode !== node) {\n cleanupNode(swappedNode)\n }\n PrevHostNode.delete(ref)\n }\n }, [ref, !!onLayout])\n}\n\nfunction ensureWebElement<X>(x: X): HTMLElement | undefined {\n if (typeof HTMLElement === 'undefined') {\n return undefined\n }\n return x instanceof HTMLElement ? x : undefined\n}\n\nexport const getBoundingClientRectAsync = (\n node: HTMLElement | null\n): Promise<DOMRectReadOnly | false> => {\n return new Promise<DOMRectReadOnly | false>((res) => {\n if (!node || node.nodeType !== 1) return res(false)\n\n const io = new IntersectionObserver(\n (entries) => {\n io.disconnect()\n return res(entries[0].boundingClientRect)\n },\n {\n threshold: 0,\n }\n )\n io.observe(node)\n })\n}\n\nexport const measureNode = async (\n node: HTMLElement,\n relativeTo?: HTMLElement | null\n): Promise<null | LayoutValue> => {\n const relativeNode = relativeTo || node?.parentElement\n if (relativeNode instanceof HTMLElement) {\n const [nodeDim, relativeNodeDim] = await Promise.all([\n getBoundingClientRectAsync(node),\n getBoundingClientRectAsync(relativeNode),\n ])\n if (relativeNodeDim && nodeDim) {\n return getRelativeDimensions(nodeDim, relativeNodeDim, node)\n }\n }\n return null\n}\n\ntype MeasureInWindowCb = (x: number, y: number, width: number, height: number) => void\n\ntype MeasureCb = (\n x: number,\n y: number,\n width: number,\n height: number,\n pageX: number,\n pageY: number\n) => void\n\nexport const measure = async (\n node: HTMLElement,\n callback: MeasureCb\n): Promise<LayoutValue | null> => {\n const out = await measureNode(\n node,\n node.parentNode instanceof HTMLElement ? node.parentNode : null\n )\n if (out) {\n callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY)\n }\n return out\n}\n\nexport function createMeasure(\n node: HTMLElement\n): (callback: MeasureCb) => Promise<LayoutValue | null> {\n return (callback) => measure(node, callback)\n}\n\ntype WindowLayout = { pageX: number; pageY: number; width: number; height: number }\n\nexport const measureInWindow = async (\n node: HTMLElement,\n callback: MeasureInWindowCb\n): Promise<WindowLayout | null> => {\n const out = await measureNode(node, null)\n if (out) {\n callback?.(out.pageX, out.pageY, out.width, out.height)\n }\n return out\n}\n\nexport const createMeasureInWindow = (\n node: HTMLElement\n): ((callback: MeasureInWindowCb) => Promise<WindowLayout | null>) => {\n return (callback) => measureInWindow(node, callback)\n}\n\nexport const measureLayout = async (\n node: HTMLElement,\n relativeNode: HTMLElement,\n callback: MeasureCb\n): Promise<LayoutValue | null> => {\n const out = await measureNode(node, relativeNode)\n if (out) {\n callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY)\n }\n return out\n}\n\nexport function createMeasureLayout(\n node: HTMLElement\n): (relativeTo: HTMLElement, callback: MeasureCb) => Promise<LayoutValue | null> {\n return (relativeTo, callback) => measureLayout(node, relativeTo, callback)\n}\n"
|
|
9
|
+
"import { useIsomorphicLayoutEffect } from '@hanzogui/constants'\nimport { createContext, useContext, useId, type ReactNode, type RefObject } from 'react'\n\nconst LayoutHandlers = new WeakMap<HTMLElement, Function>()\nconst LayoutDisableKey = new WeakMap<HTMLElement, string>()\nconst Nodes = new Set<HTMLElement>()\nconst IntersectionState = new WeakMap<HTMLElement, boolean>()\n\n// feature flag to enable pre-transform dimension reporting (matches RN behavior)\n// can be set via env var at build time or runtime global for testing\n// see: https://github.com/hanzoai/gui/pull/2329\nconst usePretransformDimensions = () =>\n (globalThis as any).__GUI_ONLAYOUT_PRETRANSFORM === true ||\n process.env.GUI_ONLAYOUT_PRETRANSFORM === '1'\n\nlet _debugLayout: boolean | undefined\n\nfunction isDebugLayout() {\n if (_debugLayout === undefined) {\n _debugLayout =\n typeof window !== 'undefined' &&\n new URLSearchParams(window.location.search).has('__tamaDebugLayout')\n }\n return _debugLayout\n}\n\n// separating to avoid all re-rendering\nconst DisableLayoutContextValues: Record<string, boolean> = {}\nconst DisableLayoutContextKey = createContext<string>('')\n\nconst ENABLE =\n process.env.GUI_TARGET === 'web' && typeof IntersectionObserver !== 'undefined'\n\n// internal testing - advanced helper to turn off layout measurement for extra performance\n// TODO document!\n// TODO could add frame skip control here\nexport const LayoutMeasurementController = ({\n disable,\n children,\n}: {\n disable: boolean\n children: ReactNode\n}): ReactNode => {\n const id = useId()\n\n useIsomorphicLayoutEffect(() => {\n DisableLayoutContextValues[id] = disable\n }, [disable, id])\n\n return (\n <DisableLayoutContextKey.Provider value={id}>\n {children}\n </DisableLayoutContextKey.Provider>\n )\n}\n\n// Single persistent IntersectionObserver for visibility tracking\nlet globalIntersectionObserver: IntersectionObserver | null = null\n\ntype GuiComponentStatePartial = {\n host?: any\n}\n\ntype LayoutMeasurementStrategy = 'off' | 'sync' | 'async'\n\nlet strategy: LayoutMeasurementStrategy = 'async'\n\nexport function setOnLayoutStrategy(state: LayoutMeasurementStrategy): void {\n strategy = state\n}\n\nexport type LayoutValue = {\n x: number\n y: number\n width: number\n height: number\n pageX: number\n pageY: number\n}\n\nexport type LayoutEvent = {\n nativeEvent: {\n layout: LayoutValue\n target: any\n }\n timeStamp: number\n}\n\nconst NodeRectCache = new WeakMap<HTMLElement, DOMRect>()\n\n// prevent thrashing during first hydration (somewhat, streaming gets trickier)\nlet avoidUpdates = true\nconst queuedUpdates = new Map<HTMLElement, Function>()\n\nexport function enable(): void {\n if (avoidUpdates) {\n avoidUpdates = false\n if (queuedUpdates) {\n queuedUpdates.forEach((cb) => cb())\n queuedUpdates.clear()\n }\n }\n}\n\nfunction startGlobalObservers() {\n if (!ENABLE || globalIntersectionObserver) return\n\n globalIntersectionObserver = new IntersectionObserver(\n (entries) => {\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const node = entry.target as HTMLElement\n if (IntersectionState.get(node) !== entry.isIntersecting) {\n IntersectionState.set(node, entry.isIntersecting)\n }\n }\n },\n {\n threshold: 0,\n }\n )\n}\n\n// optimization: inline rect comparison to avoid function call overhead on hot path\nfunction rectsEqual(a: DOMRectReadOnly, b: DOMRectReadOnly): boolean {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n}\n\nif (ENABLE) {\n const BoundingRects = new WeakMap<Element, DOMRectReadOnly>()\n\n // optimization: persistent IO for rect fetching, reused across cycles\n let rectFetchObserver: IntersectionObserver | null = null\n let rectFetchResolve: ((value: boolean) => void) | null = null\n let rectFetchStartTime = 0\n let lastCallbackDelay = 0\n\n function ensureRectFetchObserver() {\n if (rectFetchObserver) return rectFetchObserver\n\n rectFetchObserver = new IntersectionObserver(\n (entries) => {\n lastCallbackDelay = Math.round(performance.now() - rectFetchStartTime)\n\n // store all rects\n for (let i = 0; i < entries.length; i++) {\n BoundingRects.set(entries[i].target, entries[i].boundingClientRect)\n }\n\n if (\n process.env.NODE_ENV === 'development' &&\n isDebugLayout() &&\n lastCallbackDelay > 50\n ) {\n console.warn(\n '[onLayout-io-delay]',\n lastCallbackDelay + 'ms',\n entries.length,\n 'entries'\n )\n }\n\n if (rectFetchResolve) {\n rectFetchResolve(true)\n rectFetchResolve = null\n }\n },\n {\n threshold: 0,\n }\n )\n\n return rectFetchObserver\n }\n\n async function updateLayoutIfChanged(node: HTMLElement) {\n const onLayout = LayoutHandlers.get(node)\n if (typeof onLayout !== 'function') return\n\n const parentNode = node.parentElement\n if (!parentNode) return\n\n let nodeRect: DOMRectReadOnly | undefined\n let parentRect: DOMRectReadOnly | undefined\n\n // respect the strategy contract\n if (strategy === 'async') {\n nodeRect = BoundingRects.get(node)\n parentRect = BoundingRects.get(parentNode)\n\n if (!nodeRect || !parentRect) {\n return\n }\n } else {\n nodeRect = node.getBoundingClientRect()\n parentRect = parentNode.getBoundingClientRect()\n }\n\n const cachedRect = NodeRectCache.get(node)\n const cachedParentRect = NodeRectCache.get(parentNode)\n\n // optimization: inline comparison instead of isEqualShallow\n const nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect)\n const parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect)\n\n if (nodeChanged || parentChanged) {\n NodeRectCache.set(node, nodeRect as DOMRect)\n NodeRectCache.set(parentNode, parentRect as DOMRect)\n\n const event = getElementLayoutEvent(nodeRect, parentRect, node)\n\n if (process.env.NODE_ENV === 'development' && isDebugLayout()) {\n console.log('[useElementLayout] change', {\n tag: node.tagName,\n id: node.id || undefined,\n className: (node.className || '').slice(0, 60) || undefined,\n layout: event.nativeEvent.layout,\n first: !cachedRect,\n })\n }\n\n if (avoidUpdates) {\n queuedUpdates.set(node, () => onLayout(event))\n } else {\n onLayout(event)\n }\n }\n }\n\n const rAF =\n typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : undefined\n\n // adaptive frame skipping with backoff\n const userSkipVal = process.env.GUI_LAYOUT_FRAME_SKIP\n const BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10\n const MAX_SKIP_FRAMES = 20\n let skipFrames = BASE_SKIP_FRAMES\n let frameCount = 0\n\n async function layoutOnAnimationFrame() {\n // skip frames based on adaptive rate\n if (frameCount++ % skipFrames !== 0) {\n rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16)\n return\n }\n\n // reset frame count to avoid overflow\n if (frameCount >= Number.MAX_SAFE_INTEGER) {\n frameCount = 0\n }\n\n if (strategy !== 'off') {\n const visibleNodes: HTMLElement[] = []\n // optimization: deduplicate parent observations\n const parentsToObserve = new Set<HTMLElement>()\n\n // collect visible nodes and their unique parents\n for (const node of Nodes) {\n const parentElement = node.parentElement\n if (!(parentElement instanceof HTMLElement)) {\n cleanupNode(node)\n continue\n }\n const disableKey = LayoutDisableKey.get(node)\n if (disableKey && DisableLayoutContextValues[disableKey] === true) continue\n if (IntersectionState.get(node) === false) continue\n\n visibleNodes.push(node)\n parentsToObserve.add(parentElement)\n }\n\n if (visibleNodes.length > 0) {\n const io = ensureRectFetchObserver()\n rectFetchStartTime = performance.now()\n\n // observe all nodes\n for (let i = 0; i < visibleNodes.length; i++) {\n io.observe(visibleNodes[i])\n }\n // optimization: observe unique parents only (not N times for N children)\n for (const parent of parentsToObserve) {\n io.observe(parent)\n }\n\n // wait for callback\n await new Promise<boolean>((res) => {\n rectFetchResolve = res\n })\n\n // unobserve all to reset for next cycle\n for (let i = 0; i < visibleNodes.length; i++) {\n io.unobserve(visibleNodes[i])\n }\n for (const parent of parentsToObserve) {\n io.unobserve(parent)\n }\n\n // adaptive backoff: if IO was slow, skip more frames next cycle\n if (lastCallbackDelay > 50) {\n skipFrames = Math.min(skipFrames + 2, MAX_SKIP_FRAMES)\n } else if (lastCallbackDelay < 20) {\n // recover back to base rate when things are fast\n skipFrames = Math.max(skipFrames - 1, BASE_SKIP_FRAMES)\n }\n\n // process updates\n for (let i = 0; i < visibleNodes.length; i++) {\n updateLayoutIfChanged(visibleNodes[i])\n }\n }\n }\n\n // schedule next frame\n rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16)\n }\n\n layoutOnAnimationFrame()\n}\n\nexport const getElementLayoutEvent = (\n nodeRect: DOMRectReadOnly,\n parentRect: DOMRectReadOnly,\n node?: HTMLElement\n): LayoutEvent => {\n return {\n nativeEvent: {\n layout: getRelativeDimensions(nodeRect, parentRect, node),\n target: nodeRect,\n },\n timeStamp: Date.now(),\n }\n}\n\n/**\n * get pre-transform dimensions for a node.\n * uses offsetWidth/offsetHeight which report CSS layout dimensions\n * unaffected by transforms - this matches React Native's onLayout behavior.\n *\n * see: https://github.com/hanzoai/gui/pull/2329\n */\nconst getPreTransformDimensions = (\n node: HTMLElement\n): { width: number; height: number } => {\n return {\n width: node.offsetWidth,\n height: node.offsetHeight,\n }\n}\n\nconst getRelativeDimensions = (\n a: DOMRectReadOnly,\n b: DOMRectReadOnly,\n aNode?: HTMLElement\n) => {\n const { left, top } = a\n const x = left - b.left\n const y = top - b.top\n\n // get pre-transform dimensions when flag is enabled and node is available\n const { width, height } =\n usePretransformDimensions() && aNode\n ? getPreTransformDimensions(aNode)\n : { width: a.width, height: a.height }\n\n return { x, y, width, height, pageX: a.left, pageY: a.top }\n}\n\n// register an arbitrary DOM element into the measurement loop without React lifecycle\nexport function registerLayoutNode(\n node: HTMLElement,\n onChange: () => void,\n disableKey?: string\n): () => void {\n Nodes.add(node)\n LayoutHandlers.set(node, onChange)\n if (disableKey) LayoutDisableKey.set(node, disableKey)\n startGlobalObservers()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(node)\n IntersectionState.set(node, true)\n }\n return () => cleanupNode(node)\n}\n\nfunction cleanupNode(node: HTMLElement) {\n Nodes.delete(node)\n LayoutHandlers.delete(node)\n LayoutDisableKey.delete(node)\n NodeRectCache.delete(node)\n IntersectionState.delete(node)\n if (globalIntersectionObserver) {\n globalIntersectionObserver.unobserve(node)\n }\n}\n\nconst PrevHostNode = new WeakMap<object, HTMLElement | undefined>()\n\nexport function useElementLayout(\n ref: RefObject<GuiComponentStatePartial>,\n onLayout?: ((e: LayoutEvent) => void) | null\n): void {\n const disableKey = useContext(DisableLayoutContextKey)\n\n // keep handlers up to date so polling always calls the latest callback\n const node = ensureWebElement(ref.current?.host)\n if (node && onLayout) {\n LayoutHandlers.set(node, onLayout)\n LayoutDisableKey.set(node, disableKey)\n }\n\n // detect host swaps after commit and fire immediate sync layout\n useIsomorphicLayoutEffect(() => {\n if (!onLayout) return\n const nextNode = ensureWebElement(ref.current?.host)\n const prevNode = PrevHostNode.get(ref)\n if (nextNode === prevNode) return\n\n if (prevNode) cleanupNode(prevNode)\n PrevHostNode.set(ref, nextNode)\n if (!nextNode) return\n\n Nodes.add(nextNode)\n startGlobalObservers()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(nextNode)\n IntersectionState.set(nextNode, true)\n }\n\n const handler = LayoutHandlers.get(nextNode)\n if (typeof handler !== 'function') return\n const parentNode = nextNode.parentElement\n if (!parentNode) return\n\n const nodeRect = nextNode.getBoundingClientRect()\n const parentRect = parentNode.getBoundingClientRect()\n NodeRectCache.set(nextNode, nodeRect)\n NodeRectCache.set(parentNode, parentRect)\n handler(getElementLayoutEvent(nodeRect, parentRect, nextNode))\n })\n\n useIsomorphicLayoutEffect(() => {\n if (!onLayout) return\n const node = ref.current?.host\n if (!node) return\n\n Nodes.add(node)\n\n startGlobalObservers()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(node)\n IntersectionState.set(node, true)\n }\n\n if (process.env.NODE_ENV === 'development' && isDebugLayout()) {\n console.log('[useElementLayout] register', {\n tag: node.tagName,\n id: node.id || undefined,\n className: (node.className || '').slice(0, 60) || undefined,\n totalNodes: Nodes.size,\n })\n }\n\n // always do one immediate sync layout event for accuracy\n const parentNode = node.parentNode as HTMLElement | null\n if (parentNode) {\n onLayout(\n getElementLayoutEvent(\n node.getBoundingClientRect(),\n parentNode.getBoundingClientRect(),\n node\n )\n )\n }\n\n return () => {\n cleanupNode(node)\n\n // also clean up any node from a mid-lifecycle host swap\n const swappedNode = PrevHostNode.get(ref)\n if (swappedNode && swappedNode !== node) {\n cleanupNode(swappedNode)\n }\n PrevHostNode.delete(ref)\n }\n }, [ref, !!onLayout])\n}\n\nfunction ensureWebElement<X>(x: X): HTMLElement | undefined {\n if (typeof HTMLElement === 'undefined') {\n return undefined\n }\n return x instanceof HTMLElement ? x : undefined\n}\n\nexport const getBoundingClientRectAsync = (\n node: HTMLElement | null\n): Promise<DOMRectReadOnly | false> => {\n return new Promise<DOMRectReadOnly | false>((res) => {\n if (!node || node.nodeType !== 1) return res(false)\n\n const io = new IntersectionObserver(\n (entries) => {\n io.disconnect()\n return res(entries[0].boundingClientRect)\n },\n {\n threshold: 0,\n }\n )\n io.observe(node)\n })\n}\n\nexport const measureNode = async (\n node: HTMLElement,\n relativeTo?: HTMLElement | null\n): Promise<null | LayoutValue> => {\n const relativeNode = relativeTo || node?.parentElement\n if (relativeNode instanceof HTMLElement) {\n const [nodeDim, relativeNodeDim] = await Promise.all([\n getBoundingClientRectAsync(node),\n getBoundingClientRectAsync(relativeNode),\n ])\n if (relativeNodeDim && nodeDim) {\n return getRelativeDimensions(nodeDim, relativeNodeDim, node)\n }\n }\n return null\n}\n\ntype MeasureInWindowCb = (x: number, y: number, width: number, height: number) => void\n\ntype MeasureCb = (\n x: number,\n y: number,\n width: number,\n height: number,\n pageX: number,\n pageY: number\n) => void\n\nexport const measure = async (\n node: HTMLElement,\n callback: MeasureCb\n): Promise<LayoutValue | null> => {\n const out = await measureNode(\n node,\n node.parentNode instanceof HTMLElement ? node.parentNode : null\n )\n if (out) {\n callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY)\n }\n return out\n}\n\nexport function createMeasure(\n node: HTMLElement\n): (callback: MeasureCb) => Promise<LayoutValue | null> {\n return (callback) => measure(node, callback)\n}\n\ntype WindowLayout = { pageX: number; pageY: number; width: number; height: number }\n\nexport const measureInWindow = async (\n node: HTMLElement,\n callback: MeasureInWindowCb\n): Promise<WindowLayout | null> => {\n const out = await measureNode(node, null)\n if (out) {\n callback?.(out.pageX, out.pageY, out.width, out.height)\n }\n return out\n}\n\nexport const createMeasureInWindow = (\n node: HTMLElement\n): ((callback: MeasureInWindowCb) => Promise<WindowLayout | null>) => {\n return (callback) => measureInWindow(node, callback)\n}\n\nexport const measureLayout = async (\n node: HTMLElement,\n relativeNode: HTMLElement,\n callback: MeasureCb\n): Promise<LayoutValue | null> => {\n const out = await measureNode(node, relativeNode)\n if (out) {\n callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY)\n }\n return out\n}\n\nexport function createMeasureLayout(\n node: HTMLElement\n): (relativeTo: HTMLElement, callback: MeasureCb) => Promise<LayoutValue | null> {\n return (relativeTo, callback) => measureLayout(node, relativeTo, callback)\n}\n"
|
|
10
10
|
]
|
|
11
11
|
}
|