@tamagui/use-element-layout 2.3.3 → 2.4.0-1783099846627

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.
@@ -1 +1 @@
1
- {"version":3,"names":["jsx","useIsomorphicLayoutEffect","createContext","useContext","useId","_instanceof","left","right","Symbol","hasInstance","LayoutHandlers","WeakMap","LayoutDisableKey","Nodes","Set","IntersectionState","usePretransformDimensions","globalThis","__TAMAGUI_ONLAYOUT_PRETRANSFORM","process","env","TAMAGUI_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","ensureRectFetchObserver2","rectFetchObserver","lastCallbackDelay","Math","round","performance","now","rectFetchStartTime","BoundingRects","boundingClientRect","NODE_ENV","console","warn","rectFetchResolve","updateLayoutIfChanged","onLayout","parentNode","parentElement","nodeRect","parentRect","getBoundingClientRect","cachedRect","cachedParentRect","nodeChanged","parentChanged","event","getElementLayoutEvent","log","tag","tagName","className","slice","layout","nativeEvent","first","rAF","requestAnimationFrame","userSkipVal","TAMAGUI_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","getBoundingClientRectAsync","nodeType","disconnect","measureNode","relativeTo","relativeNode","nodeDim","relativeNodeDim","all","measure","callback","out","createMeasure","measureInWindow","createMeasureInWindow","measureLayout","createMeasureLayout"],"sources":["index.native.js"],"sourcesContent":["import { jsx } from \"react/jsx-runtime\";\nimport { useIsomorphicLayoutEffect } from \"@tamagui/constants\";\nimport { createContext, useContext, useId } from \"react\";\n\nfunction _instanceof(left, right) {\n\tif (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) return !!right[Symbol.hasInstance](left);\n\telse return left instanceof right;\n}\nvar LayoutHandlers = /* @__PURE__ */ new WeakMap();\nvar LayoutDisableKey = /* @__PURE__ */ new WeakMap();\nvar Nodes = /* @__PURE__ */ new Set();\nvar IntersectionState = /* @__PURE__ */ new WeakMap();\nvar usePretransformDimensions = function() {\n\treturn globalThis.__TAMAGUI_ONLAYOUT_PRETRANSFORM === true || process.env.TAMAGUI_ONLAYOUT_PRETRANSFORM === \"1\";\n};\nvar _debugLayout;\nfunction isDebugLayout() {\n\tif (_debugLayout === void 0) _debugLayout = typeof window !== \"undefined\" && new URLSearchParams(window.location.search).has(\"__tamaDebugLayout\");\n\treturn _debugLayout;\n}\nvar DisableLayoutContextValues = {};\nvar DisableLayoutContextKey = /* @__PURE__ */ createContext(\"\");\nvar ENABLE = false;\nvar LayoutMeasurementController = function(param) {\n\tvar { disable, children } = param;\n\tvar id = useId();\n\tuseIsomorphicLayoutEffect(function() {\n\t\tDisableLayoutContextValues[id] = disable;\n\t}, [disable, id]);\n\treturn /* @__PURE__ */ jsx(DisableLayoutContextKey.Provider, {\n\t\tvalue: id,\n\t\tchildren\n\t});\n};\nvar globalIntersectionObserver = null;\nvar strategy = \"async\";\nfunction setOnLayoutStrategy(state) {\n\tstrategy = state;\n}\nvar NodeRectCache = /* @__PURE__ */ new WeakMap();\nvar avoidUpdates = true;\nvar queuedUpdates = /* @__PURE__ */ new Map();\nfunction enable() {\n\tif (avoidUpdates) {\n\t\tavoidUpdates = false;\n\t\tif (queuedUpdates) {\n\t\t\tqueuedUpdates.forEach(function(cb) {\n\t\t\t\treturn cb();\n\t\t\t});\n\t\t\tqueuedUpdates.clear();\n\t\t}\n\t}\n}\nfunction startGlobalObservers() {\n\tif (!ENABLE || globalIntersectionObserver) return;\n\tglobalIntersectionObserver = new IntersectionObserver(function(entries) {\n\t\tfor (var i = 0; i < entries.length; i++) {\n\t\t\tvar entry = entries[i];\n\t\t\tvar node = entry.target;\n\t\t\tif (IntersectionState.get(node) !== entry.isIntersecting) IntersectionState.set(node, entry.isIntersecting);\n\t\t}\n\t}, { threshold: 0 });\n}\nfunction rectsEqual(a, b) {\n\treturn a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\nif (ENABLE) {\n\tlet ensureRectFetchObserver2 = function() {\n\t\tif (rectFetchObserver) return rectFetchObserver;\n\t\trectFetchObserver = new IntersectionObserver(function(entries) {\n\t\t\tlastCallbackDelay = Math.round(performance.now() - rectFetchStartTime);\n\t\t\tfor (var i = 0; i < entries.length; i++) BoundingRects.set(entries[i].target, entries[i].boundingClientRect);\n\t\t\tif (process.env.NODE_ENV === \"development\" && isDebugLayout() && lastCallbackDelay > 50) console.warn(\"[onLayout-io-delay]\", lastCallbackDelay + \"ms\", entries.length, \"entries\");\n\t\t\tif (rectFetchResolve) {\n\t\t\t\trectFetchResolve(true);\n\t\t\t\trectFetchResolve = null;\n\t\t\t}\n\t\t}, { threshold: 0 });\n\t\treturn rectFetchObserver;\n\t};\n\tvar BoundingRects = /* @__PURE__ */ new WeakMap();\n\tvar rectFetchObserver = null;\n\tvar rectFetchResolve = null;\n\tvar rectFetchStartTime = 0;\n\tvar lastCallbackDelay = 0;\n\tasync function updateLayoutIfChanged(node) {\n\t\tvar onLayout = LayoutHandlers.get(node);\n\t\tif (typeof onLayout !== \"function\") return;\n\t\tvar parentNode = node.parentElement;\n\t\tif (!parentNode) return;\n\t\tvar nodeRect;\n\t\tvar parentRect;\n\t\tif (strategy === \"async\") {\n\t\t\tnodeRect = BoundingRects.get(node);\n\t\t\tparentRect = BoundingRects.get(parentNode);\n\t\t\tif (!nodeRect || !parentRect) return;\n\t\t} else {\n\t\t\tnodeRect = node.getBoundingClientRect();\n\t\t\tparentRect = parentNode.getBoundingClientRect();\n\t\t}\n\t\tvar cachedRect = NodeRectCache.get(node);\n\t\tvar cachedParentRect = NodeRectCache.get(parentNode);\n\t\tvar nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect);\n\t\tvar parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect);\n\t\tif (nodeChanged || parentChanged) {\n\t\t\tNodeRectCache.set(node, nodeRect);\n\t\t\tNodeRectCache.set(parentNode, parentRect);\n\t\t\tvar event = getElementLayoutEvent(nodeRect, parentRect, node);\n\t\t\tif (process.env.NODE_ENV === \"development\" && isDebugLayout()) console.log(\"[useElementLayout] change\", {\n\t\t\t\ttag: node.tagName,\n\t\t\t\tid: node.id || void 0,\n\t\t\t\tclassName: (node.className || \"\").slice(0, 60) || void 0,\n\t\t\t\tlayout: event.nativeEvent.layout,\n\t\t\t\tfirst: !cachedRect\n\t\t\t});\n\t\t\tif (avoidUpdates) queuedUpdates.set(node, function() {\n\t\t\t\treturn onLayout(event);\n\t\t\t});\n\t\t\telse onLayout(event);\n\t\t}\n\t}\n\tvar rAF = typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : void 0;\n\tvar userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP;\n\tvar BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10;\n\tvar MAX_SKIP_FRAMES = 20;\n\tvar skipFrames = BASE_SKIP_FRAMES;\n\tvar frameCount = 0;\n\tasync function layoutOnAnimationFrame() {\n\t\tif (frameCount++ % skipFrames !== 0) {\n\t\t\trAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);\n\t\t\treturn;\n\t\t}\n\t\tif (frameCount >= Number.MAX_SAFE_INTEGER) frameCount = 0;\n\t\tif (strategy !== \"off\") {\n\t\t\tvar visibleNodes = [];\n\t\t\tvar parentsToObserve = /* @__PURE__ */ new Set();\n\t\t\tvar _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n\t\t\ttry {\n\t\t\t\tfor (var _iterator = Nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t\t\t\t\tvar node = _step.value;\n\t\t\t\t\tvar parentElement = node.parentElement;\n\t\t\t\t\tif (!_instanceof(parentElement, HTMLElement)) {\n\t\t\t\t\t\tcleanupNode(node);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tvar disableKey = LayoutDisableKey.get(node);\n\t\t\t\t\tif (disableKey && DisableLayoutContextValues[disableKey] === true) continue;\n\t\t\t\t\tif (IntersectionState.get(node) === false) continue;\n\t\t\t\t\tvisibleNodes.push(node);\n\t\t\t\t\tparentsToObserve.add(parentElement);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t_didIteratorError = true;\n\t\t\t\t_iteratorError = err;\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tif (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();\n\t\t\t\t} finally {\n\t\t\t\t\tif (_didIteratorError) throw _iteratorError;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (visibleNodes.length > 0) {\n\t\t\t\tvar io = ensureRectFetchObserver2();\n\t\t\t\trectFetchStartTime = performance.now();\n\t\t\t\tfor (var i = 0; i < visibleNodes.length; i++) io.observe(visibleNodes[i]);\n\t\t\t\tvar _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;\n\t\t\t\ttry {\n\t\t\t\t\tfor (var _iterator1 = parentsToObserve[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {\n\t\t\t\t\t\tvar parent = _step1.value;\n\t\t\t\t\t\tio.observe(parent);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\t_didIteratorError1 = true;\n\t\t\t\t\t_iteratorError1 = err;\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!_iteratorNormalCompletion1 && _iterator1.return != null) _iterator1.return();\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (_didIteratorError1) throw _iteratorError1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait new Promise(function(res) {\n\t\t\t\t\trectFetchResolve = res;\n\t\t\t\t});\n\t\t\t\tfor (var i1 = 0; i1 < visibleNodes.length; i1++) io.unobserve(visibleNodes[i1]);\n\t\t\t\tvar _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;\n\t\t\t\ttry {\n\t\t\t\t\tfor (var _iterator2 = parentsToObserve[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t\t\t\t\t\tvar parent1 = _step2.value;\n\t\t\t\t\t\tio.unobserve(parent1);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\t_didIteratorError2 = true;\n\t\t\t\t\t_iteratorError2 = err;\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!_iteratorNormalCompletion2 && _iterator2.return != null) _iterator2.return();\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (_didIteratorError2) throw _iteratorError2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (lastCallbackDelay > 50) skipFrames = Math.min(skipFrames + 2, MAX_SKIP_FRAMES);\n\t\t\t\telse if (lastCallbackDelay < 20) skipFrames = Math.max(skipFrames - 1, BASE_SKIP_FRAMES);\n\t\t\t\tfor (var i2 = 0; i2 < visibleNodes.length; i2++) updateLayoutIfChanged(visibleNodes[i2]);\n\t\t\t}\n\t\t}\n\t\trAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);\n\t}\n\tlayoutOnAnimationFrame();\n}\nvar getElementLayoutEvent = function(nodeRect, parentRect, node) {\n\treturn {\n\t\tnativeEvent: {\n\t\t\tlayout: getRelativeDimensions(nodeRect, parentRect, node),\n\t\t\ttarget: nodeRect\n\t\t},\n\t\ttimeStamp: Date.now()\n\t};\n};\nvar getPreTransformDimensions = function(node) {\n\treturn {\n\t\twidth: node.offsetWidth,\n\t\theight: node.offsetHeight\n\t};\n};\nvar getRelativeDimensions = function(a, b, aNode) {\n\tvar { left, top } = a;\n\tvar x = left - b.left;\n\tvar y = top - b.top;\n\tvar { width, height } = usePretransformDimensions() && aNode ? getPreTransformDimensions(aNode) : {\n\t\twidth: a.width,\n\t\theight: a.height\n\t};\n\treturn {\n\t\tx,\n\t\ty,\n\t\twidth,\n\t\theight,\n\t\tpageX: a.left,\n\t\tpageY: a.top\n\t};\n};\nfunction registerLayoutNode(node, onChange, disableKey) {\n\tNodes.add(node);\n\tLayoutHandlers.set(node, onChange);\n\tif (disableKey) LayoutDisableKey.set(node, disableKey);\n\tstartGlobalObservers();\n\tif (globalIntersectionObserver) {\n\t\tglobalIntersectionObserver.observe(node);\n\t\tIntersectionState.set(node, true);\n\t}\n\treturn function() {\n\t\treturn cleanupNode(node);\n\t};\n}\nfunction cleanupNode(node) {\n\tNodes.delete(node);\n\tLayoutHandlers.delete(node);\n\tLayoutDisableKey.delete(node);\n\tNodeRectCache.delete(node);\n\tIntersectionState.delete(node);\n\tif (globalIntersectionObserver) globalIntersectionObserver.unobserve(node);\n}\nvar PrevHostNode = /* @__PURE__ */ new WeakMap();\nfunction useElementLayout(ref, onLayout) {\n\tvar _ref_current;\n\tvar disableKey = useContext(DisableLayoutContextKey);\n\tvar node = ensureWebElement((_ref_current = ref.current) === null || _ref_current === void 0 ? void 0 : _ref_current.host);\n\tif (node && onLayout) {\n\t\tLayoutHandlers.set(node, onLayout);\n\t\tLayoutDisableKey.set(node, disableKey);\n\t}\n\tuseIsomorphicLayoutEffect(function() {\n\t\tvar _ref_current2;\n\t\tif (!onLayout) return;\n\t\tvar nextNode = ensureWebElement((_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host);\n\t\tvar prevNode = PrevHostNode.get(ref);\n\t\tif (nextNode === prevNode) return;\n\t\tif (prevNode) cleanupNode(prevNode);\n\t\tPrevHostNode.set(ref, nextNode);\n\t\tif (!nextNode) return;\n\t\tNodes.add(nextNode);\n\t\tstartGlobalObservers();\n\t\tif (globalIntersectionObserver) {\n\t\t\tglobalIntersectionObserver.observe(nextNode);\n\t\t\tIntersectionState.set(nextNode, true);\n\t\t}\n\t\tvar handler = LayoutHandlers.get(nextNode);\n\t\tif (typeof handler !== \"function\") return;\n\t\tvar parentNode = nextNode.parentElement;\n\t\tif (!parentNode) return;\n\t\tvar nodeRect = nextNode.getBoundingClientRect();\n\t\tvar parentRect = parentNode.getBoundingClientRect();\n\t\tNodeRectCache.set(nextNode, nodeRect);\n\t\tNodeRectCache.set(parentNode, parentRect);\n\t\thandler(getElementLayoutEvent(nodeRect, parentRect, nextNode));\n\t});\n\tuseIsomorphicLayoutEffect(function() {\n\t\tvar _ref_current2;\n\t\tif (!onLayout) return;\n\t\tvar node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;\n\t\tif (!node2) return;\n\t\tNodes.add(node2);\n\t\tstartGlobalObservers();\n\t\tif (globalIntersectionObserver) {\n\t\t\tglobalIntersectionObserver.observe(node2);\n\t\t\tIntersectionState.set(node2, true);\n\t\t}\n\t\tif (process.env.NODE_ENV === \"development\" && isDebugLayout()) console.log(\"[useElementLayout] register\", {\n\t\t\ttag: node2.tagName,\n\t\t\tid: node2.id || void 0,\n\t\t\tclassName: (node2.className || \"\").slice(0, 60) || void 0,\n\t\t\ttotalNodes: Nodes.size\n\t\t});\n\t\tvar parentNode = node2.parentNode;\n\t\tif (parentNode) onLayout(getElementLayoutEvent(node2.getBoundingClientRect(), parentNode.getBoundingClientRect(), node2));\n\t\treturn function() {\n\t\t\tcleanupNode(node2);\n\t\t\tvar swappedNode = PrevHostNode.get(ref);\n\t\t\tif (swappedNode && swappedNode !== node2) cleanupNode(swappedNode);\n\t\t\tPrevHostNode.delete(ref);\n\t\t};\n\t}, [ref, !!onLayout]);\n}\nfunction ensureWebElement(x) {\n\tif (typeof HTMLElement === \"undefined\") return;\n\treturn _instanceof(x, HTMLElement) ? x : void 0;\n}\nvar getBoundingClientRectAsync = function(node) {\n\treturn new Promise(function(res) {\n\t\tif (!node || node.nodeType !== 1) return res(false);\n\t\tvar io = new IntersectionObserver(function(entries) {\n\t\t\tio.disconnect();\n\t\t\treturn res(entries[0].boundingClientRect);\n\t\t}, { threshold: 0 });\n\t\tio.observe(node);\n\t});\n};\nvar measureNode = async function(node, relativeTo) {\n\tvar relativeNode = relativeTo || (node === null || node === void 0 ? void 0 : node.parentElement);\n\tif (_instanceof(relativeNode, HTMLElement)) {\n\t\tvar [nodeDim, relativeNodeDim] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(relativeNode)]);\n\t\tif (relativeNodeDim && nodeDim) return getRelativeDimensions(nodeDim, relativeNodeDim, node);\n\t}\n\treturn null;\n};\nvar measure = async function(node, callback) {\n\tvar out = await measureNode(node, _instanceof(node.parentNode, HTMLElement) ? node.parentNode : null);\n\tif (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);\n\treturn out;\n};\nfunction createMeasure(node) {\n\treturn function(callback) {\n\t\treturn measure(node, callback);\n\t};\n}\nvar measureInWindow = async function(node, callback) {\n\tvar out = await measureNode(node, null);\n\tif (out) callback === null || callback === void 0 || callback(out.pageX, out.pageY, out.width, out.height);\n\treturn out;\n};\nvar createMeasureInWindow = function(node) {\n\treturn function(callback) {\n\t\treturn measureInWindow(node, callback);\n\t};\n};\nvar measureLayout = async function(node, relativeNode, callback) {\n\tvar out = await measureNode(node, relativeNode);\n\tif (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);\n\treturn out;\n};\nfunction createMeasureLayout(node) {\n\treturn function(relativeTo, callback) {\n\t\treturn measureLayout(node, relativeTo, callback);\n\t};\n}\n\nexport { LayoutMeasurementController, createMeasure, createMeasureInWindow, createMeasureLayout, enable, getBoundingClientRectAsync, getElementLayoutEvent, measure, measureInWindow, measureLayout, measureNode, registerLayoutNode, setOnLayoutStrategy, useElementLayout };"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["jsx","useIsomorphicLayoutEffect","createContext","useContext","useId","_instanceof","left","right","Symbol","hasInstance","LayoutHandlers","WeakMap","LayoutDisableKey","Nodes","Set","IntersectionState","usePretransformDimensions","globalThis","__TAMAGUI_ONLAYOUT_PRETRANSFORM","process","env","TAMAGUI_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","ensureRectFetchObserver2","rectFetchObserver","lastCallbackDelay","Math","round","performance","now","rectFetchStartTime","BoundingRects","boundingClientRect","NODE_ENV","console","warn","rectFetchResolve","updateLayoutIfChanged","parentNode","parentElement","nodeRect","parentRect","getBoundingClientRect","emitLayoutIfChanged","rAF","requestAnimationFrame","userSkipVal","TAMAGUI_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","getElementLayoutEvent","nativeEvent","layout","getRelativeDimensions","timeStamp","Date","getPreTransformDimensions","offsetWidth","offsetHeight","aNode","top","pageX","pageY","onLayout","cachedRect","cachedParentRect","nodeChanged","parentChanged","event","log","tag","tagName","className","slice","first","observeLayoutNode","delete","registerLayoutNode","onChange","PrevHostNode","emitLayoutFromClientRects","emitLayoutFromObserver","all","getBoundingClientRectAsync","useElementLayout","ref","_ref_current","ensureWebElement","current","host","_ref_current2","nextNode","prevNode","node2","totalNodes","size","swappedNode","nodeType","disconnect","measureNode","relativeTo","relativeNode","nodeDim","relativeNodeDim","measure","callback","out","createMeasure","measureInWindow","createMeasureInWindow","measureLayout","createMeasureLayout"],"sources":["index.native.js"],"sourcesContent":["import { jsx } from \"react/jsx-runtime\";\nimport { useIsomorphicLayoutEffect } from \"@tamagui/constants\";\nimport { createContext, useContext, useId } from \"react\";\n\nfunction _instanceof(left, right) {\n\tif (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) return !!right[Symbol.hasInstance](left);\n\telse return left instanceof right;\n}\nvar LayoutHandlers = /* @__PURE__ */ new WeakMap();\nvar LayoutDisableKey = /* @__PURE__ */ new WeakMap();\nvar Nodes = /* @__PURE__ */ new Set();\nvar IntersectionState = /* @__PURE__ */ new WeakMap();\nvar usePretransformDimensions = function() {\n\treturn globalThis.__TAMAGUI_ONLAYOUT_PRETRANSFORM === true || process.env.TAMAGUI_ONLAYOUT_PRETRANSFORM === \"1\";\n};\nvar _debugLayout;\nfunction isDebugLayout() {\n\tif (_debugLayout === void 0) _debugLayout = typeof window !== \"undefined\" && new URLSearchParams(window.location.search).has(\"__tamaDebugLayout\");\n\treturn _debugLayout;\n}\nvar DisableLayoutContextValues = {};\nvar DisableLayoutContextKey = /* @__PURE__ */ createContext(\"\");\nvar ENABLE = false;\nvar LayoutMeasurementController = function(param) {\n\tvar { disable, children } = param;\n\tvar id = useId();\n\tuseIsomorphicLayoutEffect(function() {\n\t\tDisableLayoutContextValues[id] = disable;\n\t}, [disable, id]);\n\treturn /* @__PURE__ */ jsx(DisableLayoutContextKey.Provider, {\n\t\tvalue: id,\n\t\tchildren\n\t});\n};\nvar globalIntersectionObserver = null;\nvar strategy = \"async\";\nfunction setOnLayoutStrategy(state) {\n\tstrategy = state;\n}\nvar NodeRectCache = /* @__PURE__ */ new WeakMap();\nvar avoidUpdates = true;\nvar queuedUpdates = /* @__PURE__ */ new Map();\nfunction enable() {\n\tif (avoidUpdates) {\n\t\tavoidUpdates = false;\n\t\tif (queuedUpdates) {\n\t\t\tqueuedUpdates.forEach(function(cb) {\n\t\t\t\treturn cb();\n\t\t\t});\n\t\t\tqueuedUpdates.clear();\n\t\t}\n\t}\n}\nfunction startGlobalObservers() {\n\tif (!ENABLE || globalIntersectionObserver) return;\n\tglobalIntersectionObserver = new IntersectionObserver(function(entries) {\n\t\tfor (var i = 0; i < entries.length; i++) {\n\t\t\tvar entry = entries[i];\n\t\t\tvar node = entry.target;\n\t\t\tif (IntersectionState.get(node) !== entry.isIntersecting) IntersectionState.set(node, entry.isIntersecting);\n\t\t}\n\t}, { threshold: 0 });\n}\nfunction rectsEqual(a, b) {\n\treturn a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\nif (ENABLE) {\n\tlet ensureRectFetchObserver2 = function() {\n\t\tif (rectFetchObserver) return rectFetchObserver;\n\t\trectFetchObserver = new IntersectionObserver(function(entries) {\n\t\t\tlastCallbackDelay = Math.round(performance.now() - rectFetchStartTime);\n\t\t\tfor (var i = 0; i < entries.length; i++) BoundingRects.set(entries[i].target, entries[i].boundingClientRect);\n\t\t\tif (process.env.NODE_ENV === \"development\" && isDebugLayout() && lastCallbackDelay > 50) console.warn(\"[onLayout-io-delay]\", lastCallbackDelay + \"ms\", entries.length, \"entries\");\n\t\t\tif (rectFetchResolve) {\n\t\t\t\trectFetchResolve(true);\n\t\t\t\trectFetchResolve = null;\n\t\t\t}\n\t\t}, { threshold: 0 });\n\t\treturn rectFetchObserver;\n\t};\n\tvar BoundingRects = /* @__PURE__ */ new WeakMap();\n\tvar rectFetchObserver = null;\n\tvar rectFetchResolve = null;\n\tvar rectFetchStartTime = 0;\n\tvar lastCallbackDelay = 0;\n\tasync function updateLayoutIfChanged(node) {\n\t\tif (typeof LayoutHandlers.get(node) !== \"function\") return;\n\t\tvar parentNode = node.parentElement;\n\t\tif (!parentNode) return;\n\t\tvar nodeRect;\n\t\tvar parentRect;\n\t\tif (strategy === \"async\") {\n\t\t\tnodeRect = BoundingRects.get(node);\n\t\t\tparentRect = BoundingRects.get(parentNode);\n\t\t\tif (!nodeRect || !parentRect) return;\n\t\t} else {\n\t\t\tnodeRect = node.getBoundingClientRect();\n\t\t\tparentRect = parentNode.getBoundingClientRect();\n\t\t}\n\t\temitLayoutIfChanged(node, parentNode, nodeRect, parentRect);\n\t}\n\tvar rAF = typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : void 0;\n\tvar userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP;\n\tvar BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10;\n\tvar MAX_SKIP_FRAMES = 20;\n\tvar skipFrames = BASE_SKIP_FRAMES;\n\tvar frameCount = 0;\n\tasync function layoutOnAnimationFrame() {\n\t\tif (frameCount++ % skipFrames !== 0) {\n\t\t\trAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);\n\t\t\treturn;\n\t\t}\n\t\tif (frameCount >= Number.MAX_SAFE_INTEGER) frameCount = 0;\n\t\tif (strategy !== \"off\") {\n\t\t\tvar visibleNodes = [];\n\t\t\tvar parentsToObserve = /* @__PURE__ */ new Set();\n\t\t\tvar _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n\t\t\ttry {\n\t\t\t\tfor (var _iterator = Nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t\t\t\t\tvar node = _step.value;\n\t\t\t\t\tvar parentElement = node.parentElement;\n\t\t\t\t\tif (!_instanceof(parentElement, HTMLElement)) {\n\t\t\t\t\t\tcleanupNode(node);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tvar disableKey = LayoutDisableKey.get(node);\n\t\t\t\t\tif (disableKey && DisableLayoutContextValues[disableKey] === true) continue;\n\t\t\t\t\tif (IntersectionState.get(node) === false) continue;\n\t\t\t\t\tvisibleNodes.push(node);\n\t\t\t\t\tparentsToObserve.add(parentElement);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t_didIteratorError = true;\n\t\t\t\t_iteratorError = err;\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tif (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();\n\t\t\t\t} finally {\n\t\t\t\t\tif (_didIteratorError) throw _iteratorError;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (visibleNodes.length > 0) {\n\t\t\t\tvar io = ensureRectFetchObserver2();\n\t\t\t\trectFetchStartTime = performance.now();\n\t\t\t\tfor (var i = 0; i < visibleNodes.length; i++) io.observe(visibleNodes[i]);\n\t\t\t\tvar _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;\n\t\t\t\ttry {\n\t\t\t\t\tfor (var _iterator1 = parentsToObserve[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {\n\t\t\t\t\t\tvar parent = _step1.value;\n\t\t\t\t\t\tio.observe(parent);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\t_didIteratorError1 = true;\n\t\t\t\t\t_iteratorError1 = err;\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!_iteratorNormalCompletion1 && _iterator1.return != null) _iterator1.return();\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (_didIteratorError1) throw _iteratorError1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait new Promise(function(res) {\n\t\t\t\t\trectFetchResolve = res;\n\t\t\t\t});\n\t\t\t\tfor (var i1 = 0; i1 < visibleNodes.length; i1++) io.unobserve(visibleNodes[i1]);\n\t\t\t\tvar _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;\n\t\t\t\ttry {\n\t\t\t\t\tfor (var _iterator2 = parentsToObserve[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t\t\t\t\t\tvar parent1 = _step2.value;\n\t\t\t\t\t\tio.unobserve(parent1);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\t_didIteratorError2 = true;\n\t\t\t\t\t_iteratorError2 = err;\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!_iteratorNormalCompletion2 && _iterator2.return != null) _iterator2.return();\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (_didIteratorError2) throw _iteratorError2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (lastCallbackDelay > 50) skipFrames = Math.min(skipFrames + 2, MAX_SKIP_FRAMES);\n\t\t\t\telse if (lastCallbackDelay < 20) skipFrames = Math.max(skipFrames - 1, BASE_SKIP_FRAMES);\n\t\t\t\tfor (var i2 = 0; i2 < visibleNodes.length; i2++) updateLayoutIfChanged(visibleNodes[i2]);\n\t\t\t}\n\t\t}\n\t\trAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);\n\t}\n\tlayoutOnAnimationFrame();\n}\nvar getElementLayoutEvent = function(nodeRect, parentRect, node) {\n\treturn {\n\t\tnativeEvent: {\n\t\t\tlayout: getRelativeDimensions(nodeRect, parentRect, node),\n\t\t\ttarget: nodeRect\n\t\t},\n\t\ttimeStamp: Date.now()\n\t};\n};\nvar getPreTransformDimensions = function(node) {\n\treturn {\n\t\twidth: node.offsetWidth,\n\t\theight: node.offsetHeight\n\t};\n};\nvar getRelativeDimensions = function(a, b, aNode) {\n\tvar { left, top } = a;\n\tvar x = left - b.left;\n\tvar y = top - b.top;\n\tvar { width, height } = usePretransformDimensions() && aNode ? getPreTransformDimensions(aNode) : {\n\t\twidth: a.width,\n\t\theight: a.height\n\t};\n\treturn {\n\t\tx,\n\t\ty,\n\t\twidth,\n\t\theight,\n\t\tpageX: a.left,\n\t\tpageY: a.top\n\t};\n};\nfunction emitLayoutIfChanged(node, parentNode, nodeRect, parentRect) {\n\tvar onLayout = LayoutHandlers.get(node);\n\tif (typeof onLayout !== \"function\") return;\n\tvar cachedRect = NodeRectCache.get(node);\n\tvar cachedParentRect = NodeRectCache.get(parentNode);\n\tvar nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect);\n\tvar parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect);\n\tif (!nodeChanged && !parentChanged) return;\n\tNodeRectCache.set(node, nodeRect);\n\tNodeRectCache.set(parentNode, parentRect);\n\tvar event = getElementLayoutEvent(nodeRect, parentRect, node);\n\tif (process.env.NODE_ENV === \"development\" && isDebugLayout()) console.log(\"[useElementLayout] change\", {\n\t\ttag: node.tagName,\n\t\tid: node.id || void 0,\n\t\tclassName: (node.className || \"\").slice(0, 60) || void 0,\n\t\tlayout: event.nativeEvent.layout,\n\t\tfirst: !cachedRect\n\t});\n\tif (avoidUpdates) queuedUpdates.set(node, function() {\n\t\treturn onLayout(event);\n\t});\n\telse onLayout(event);\n}\nfunction observeLayoutNode(node, disableKey) {\n\tNodes.add(node);\n\tif (disableKey) LayoutDisableKey.set(node, disableKey);\n\telse LayoutDisableKey.delete(node);\n\tstartGlobalObservers();\n\tif (globalIntersectionObserver) {\n\t\tglobalIntersectionObserver.observe(node);\n\t\tIntersectionState.set(node, true);\n\t}\n}\nfunction registerLayoutNode(node, onChange, disableKey) {\n\tLayoutHandlers.set(node, onChange);\n\tobserveLayoutNode(node, disableKey);\n\treturn function() {\n\t\treturn cleanupNode(node);\n\t};\n}\nfunction cleanupNode(node) {\n\tNodes.delete(node);\n\tLayoutHandlers.delete(node);\n\tLayoutDisableKey.delete(node);\n\tNodeRectCache.delete(node);\n\tIntersectionState.delete(node);\n\tif (globalIntersectionObserver) globalIntersectionObserver.unobserve(node);\n}\nvar PrevHostNode = /* @__PURE__ */ new WeakMap();\nfunction emitLayoutFromClientRects(node) {\n\tvar parentNode = node.parentElement;\n\tif (!parentNode) return;\n\temitLayoutIfChanged(node, parentNode, node.getBoundingClientRect(), parentNode.getBoundingClientRect());\n}\nasync function emitLayoutFromObserver(node) {\n\tif (!ENABLE || strategy !== \"async\") {\n\t\temitLayoutFromClientRects(node);\n\t\treturn;\n\t}\n\tvar parentNode = node.parentElement;\n\tif (!parentNode) return;\n\tvar [nodeRect, parentRect] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);\n\tif (!nodeRect || !parentRect) return;\n\tif (!Nodes.has(node) || node.parentElement !== parentNode) return;\n\temitLayoutIfChanged(node, parentNode, nodeRect, parentRect);\n}\nfunction useElementLayout(ref, onLayout) {\n\tvar _ref_current;\n\tvar disableKey = useContext(DisableLayoutContextKey);\n\tvar node = ensureWebElement((_ref_current = ref.current) === null || _ref_current === void 0 ? void 0 : _ref_current.host);\n\tif (node && onLayout) {\n\t\tLayoutHandlers.set(node, onLayout);\n\t\tLayoutDisableKey.set(node, disableKey);\n\t}\n\tuseIsomorphicLayoutEffect(function() {\n\t\tvar _ref_current2;\n\t\tif (!onLayout) return;\n\t\tvar nextNode = ensureWebElement((_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host);\n\t\tvar prevNode = PrevHostNode.get(ref);\n\t\tif (nextNode === prevNode) return;\n\t\tif (prevNode) cleanupNode(prevNode);\n\t\tPrevHostNode.set(ref, nextNode);\n\t\tif (!nextNode) return;\n\t\tLayoutHandlers.set(nextNode, onLayout);\n\t\tobserveLayoutNode(nextNode, disableKey);\n\t\temitLayoutFromObserver(nextNode);\n\t});\n\tuseIsomorphicLayoutEffect(function() {\n\t\tvar _ref_current2;\n\t\tif (!onLayout) return;\n\t\tvar node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;\n\t\tif (!node2) return;\n\t\tLayoutHandlers.set(node2, onLayout);\n\t\tobserveLayoutNode(node2, disableKey);\n\t\tif (process.env.NODE_ENV === \"development\" && isDebugLayout()) console.log(\"[useElementLayout] register\", {\n\t\t\ttag: node2.tagName,\n\t\t\tid: node2.id || void 0,\n\t\t\tclassName: (node2.className || \"\").slice(0, 60) || void 0,\n\t\t\ttotalNodes: Nodes.size\n\t\t});\n\t\treturn function() {\n\t\t\tcleanupNode(node2);\n\t\t\tvar swappedNode = PrevHostNode.get(ref);\n\t\t\tif (swappedNode && swappedNode !== node2) cleanupNode(swappedNode);\n\t\t\tPrevHostNode.delete(ref);\n\t\t};\n\t}, [ref, !!onLayout]);\n}\nfunction ensureWebElement(x) {\n\tif (typeof HTMLElement === \"undefined\") return;\n\treturn _instanceof(x, HTMLElement) ? x : void 0;\n}\nvar getBoundingClientRectAsync = function(node) {\n\treturn new Promise(function(res) {\n\t\tif (!node || node.nodeType !== 1) return res(false);\n\t\tvar io = new IntersectionObserver(function(entries) {\n\t\t\tio.disconnect();\n\t\t\treturn res(entries[0].boundingClientRect);\n\t\t}, { threshold: 0 });\n\t\tio.observe(node);\n\t});\n};\nvar measureNode = async function(node, relativeTo) {\n\tvar relativeNode = relativeTo || (node === null || node === void 0 ? void 0 : node.parentElement);\n\tif (_instanceof(relativeNode, HTMLElement)) {\n\t\tvar [nodeDim, relativeNodeDim] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(relativeNode)]);\n\t\tif (relativeNodeDim && nodeDim) return getRelativeDimensions(nodeDim, relativeNodeDim, node);\n\t}\n\treturn null;\n};\nvar measure = async function(node, callback) {\n\tvar out = await measureNode(node, _instanceof(node.parentNode, HTMLElement) ? node.parentNode : null);\n\tif (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);\n\treturn out;\n};\nfunction createMeasure(node) {\n\treturn function(callback) {\n\t\treturn measure(node, callback);\n\t};\n}\nvar measureInWindow = async function(node, callback) {\n\tvar out = await measureNode(node, null);\n\tif (out) callback === null || callback === void 0 || callback(out.pageX, out.pageY, out.width, out.height);\n\treturn out;\n};\nvar createMeasureInWindow = function(node) {\n\treturn function(callback) {\n\t\treturn measureInWindow(node, callback);\n\t};\n};\nvar measureLayout = async function(node, relativeNode, callback) {\n\tvar out = await measureNode(node, relativeNode);\n\tif (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);\n\treturn out;\n};\nfunction createMeasureLayout(node) {\n\treturn function(relativeTo, callback) {\n\t\treturn measureLayout(node, relativeTo, callback);\n\t};\n}\n\nexport { LayoutMeasurementController, createMeasure, createMeasureInWindow, createMeasureLayout, enable, getBoundingClientRectAsync, getElementLayoutEvent, measure, measureInWindow, measureLayout, measureNode, registerLayoutNode, setOnLayoutStrategy, useElementLayout };"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/use-element-layout",
3
- "version": "2.3.3",
3
+ "version": "2.4.0-1783099846627",
4
4
  "gitHead": "a49cc7ea6b93ba384e77a4880ae48ac4a5635c14",
5
5
  "files": [
6
6
  "src",
@@ -34,11 +34,11 @@
34
34
  "clean:build": "tamagui-build clean:build"
35
35
  },
36
36
  "dependencies": {
37
- "@tamagui/constants": "2.3.3",
38
- "@tamagui/is-equal-shallow": "2.3.3"
37
+ "@tamagui/constants": "2.4.0-1783099846627",
38
+ "@tamagui/is-equal-shallow": "2.4.0-1783099846627"
39
39
  },
40
40
  "devDependencies": {
41
- "@tamagui/build": "2.3.3",
41
+ "@tamagui/build": "2.4.0-1783099846627",
42
42
  "react": ">=19"
43
43
  },
44
44
  "peerDependencies": {
package/src/index.tsx CHANGED
@@ -86,7 +86,7 @@ export type LayoutEvent = {
86
86
  timeStamp: number
87
87
  }
88
88
 
89
- const NodeRectCache = new WeakMap<HTMLElement, DOMRect>()
89
+ const NodeRectCache = new WeakMap<HTMLElement, DOMRectReadOnly>()
90
90
 
91
91
  // prevent thrashing during first hydration (somewhat, streaming gets trickier)
92
92
  let avoidUpdates = true
@@ -196,35 +196,7 @@ if (ENABLE) {
196
196
  parentRect = parentNode.getBoundingClientRect()
197
197
  }
198
198
 
199
- const cachedRect = NodeRectCache.get(node)
200
- const cachedParentRect = NodeRectCache.get(parentNode)
201
-
202
- // optimization: inline comparison instead of isEqualShallow
203
- const nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect)
204
- const parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect)
205
-
206
- if (nodeChanged || parentChanged) {
207
- NodeRectCache.set(node, nodeRect as DOMRect)
208
- NodeRectCache.set(parentNode, parentRect as DOMRect)
209
-
210
- const event = getElementLayoutEvent(nodeRect, parentRect, node)
211
-
212
- if (process.env.NODE_ENV === 'development' && isDebugLayout()) {
213
- console.log('[useElementLayout] change', {
214
- tag: node.tagName,
215
- id: node.id || undefined,
216
- className: (node.className || '').slice(0, 60) || undefined,
217
- layout: event.nativeEvent.layout,
218
- first: !cachedRect,
219
- })
220
- }
221
-
222
- if (avoidUpdates) {
223
- queuedUpdates.set(node, () => onLayout(event))
224
- } else {
225
- onLayout(event)
226
- }
227
- }
199
+ emitLayoutIfChanged(node, parentNode, nodeRect, parentRect)
228
200
  }
229
201
 
230
202
  const rAF =
@@ -365,20 +337,67 @@ const getRelativeDimensions = (
365
337
  return { x, y, width, height, pageX: a.left, pageY: a.top }
366
338
  }
367
339
 
368
- // register an arbitrary DOM element into the measurement loop without React lifecycle
369
- export function registerLayoutNode(
340
+ function emitLayoutIfChanged(
370
341
  node: HTMLElement,
371
- onChange: () => void,
372
- disableKey?: string
373
- ): () => void {
342
+ parentNode: HTMLElement,
343
+ nodeRect: DOMRectReadOnly,
344
+ parentRect: DOMRectReadOnly
345
+ ) {
346
+ const onLayout = LayoutHandlers.get(node)
347
+ if (typeof onLayout !== 'function') return
348
+
349
+ const cachedRect = NodeRectCache.get(node)
350
+ const cachedParentRect = NodeRectCache.get(parentNode)
351
+
352
+ const nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect)
353
+ const parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect)
354
+
355
+ if (!nodeChanged && !parentChanged) return
356
+
357
+ NodeRectCache.set(node, nodeRect)
358
+ NodeRectCache.set(parentNode, parentRect)
359
+
360
+ const event = getElementLayoutEvent(nodeRect, parentRect, node)
361
+
362
+ if (process.env.NODE_ENV === 'development' && isDebugLayout()) {
363
+ console.log('[useElementLayout] change', {
364
+ tag: node.tagName,
365
+ id: node.id || undefined,
366
+ className: (node.className || '').slice(0, 60) || undefined,
367
+ layout: event.nativeEvent.layout,
368
+ first: !cachedRect,
369
+ })
370
+ }
371
+
372
+ if (avoidUpdates) {
373
+ queuedUpdates.set(node, () => onLayout(event))
374
+ } else {
375
+ onLayout(event)
376
+ }
377
+ }
378
+
379
+ function observeLayoutNode(node: HTMLElement, disableKey?: string) {
374
380
  Nodes.add(node)
375
- LayoutHandlers.set(node, onChange)
376
- if (disableKey) LayoutDisableKey.set(node, disableKey)
381
+ if (disableKey) {
382
+ LayoutDisableKey.set(node, disableKey)
383
+ } else {
384
+ LayoutDisableKey.delete(node)
385
+ }
377
386
  startGlobalObservers()
378
387
  if (globalIntersectionObserver) {
379
388
  globalIntersectionObserver.observe(node)
380
389
  IntersectionState.set(node, true)
381
390
  }
391
+ }
392
+
393
+ // register an arbitrary DOM element into the measurement loop without React lifecycle
394
+ export function registerLayoutNode(
395
+ node: HTMLElement,
396
+ onChange: () => void,
397
+ disableKey?: string
398
+ ): () => void {
399
+ LayoutHandlers.set(node, onChange)
400
+ observeLayoutNode(node, disableKey)
382
401
  return () => cleanupNode(node)
383
402
  }
384
403
 
@@ -395,6 +414,35 @@ function cleanupNode(node: HTMLElement) {
395
414
 
396
415
  const PrevHostNode = new WeakMap<object, HTMLElement | undefined>()
397
416
 
417
+ function emitLayoutFromClientRects(node: HTMLElement) {
418
+ const parentNode = node.parentElement
419
+ if (!parentNode) return
420
+
421
+ const nodeRect = node.getBoundingClientRect()
422
+ const parentRect = parentNode.getBoundingClientRect()
423
+ emitLayoutIfChanged(node, parentNode, nodeRect, parentRect)
424
+ }
425
+
426
+ async function emitLayoutFromObserver(node: HTMLElement) {
427
+ if (!ENABLE || strategy !== 'async') {
428
+ emitLayoutFromClientRects(node)
429
+ return
430
+ }
431
+
432
+ const parentNode = node.parentElement
433
+ if (!parentNode) return
434
+
435
+ const [nodeRect, parentRect] = await Promise.all([
436
+ getBoundingClientRectAsync(node),
437
+ getBoundingClientRectAsync(parentNode),
438
+ ])
439
+
440
+ if (!nodeRect || !parentRect) return
441
+ if (!Nodes.has(node) || node.parentElement !== parentNode) return
442
+
443
+ emitLayoutIfChanged(node, parentNode, nodeRect, parentRect)
444
+ }
445
+
398
446
  export function useElementLayout(
399
447
  ref: RefObject<TamaguiComponentStatePartial>,
400
448
  onLayout?: ((e: LayoutEvent) => void) | null
@@ -408,7 +456,7 @@ export function useElementLayout(
408
456
  LayoutDisableKey.set(node, disableKey)
409
457
  }
410
458
 
411
- // detect host swaps after commit and fire immediate sync layout
459
+ // detect host swaps after commit and seed the async layout measurement
412
460
  useIsomorphicLayoutEffect(() => {
413
461
  if (!onLayout) return
414
462
  const nextNode = ensureWebElement(ref.current?.host)
@@ -419,23 +467,9 @@ export function useElementLayout(
419
467
  PrevHostNode.set(ref, nextNode)
420
468
  if (!nextNode) return
421
469
 
422
- Nodes.add(nextNode)
423
- startGlobalObservers()
424
- if (globalIntersectionObserver) {
425
- globalIntersectionObserver.observe(nextNode)
426
- IntersectionState.set(nextNode, true)
427
- }
428
-
429
- const handler = LayoutHandlers.get(nextNode)
430
- if (typeof handler !== 'function') return
431
- const parentNode = nextNode.parentElement
432
- if (!parentNode) return
433
-
434
- const nodeRect = nextNode.getBoundingClientRect()
435
- const parentRect = parentNode.getBoundingClientRect()
436
- NodeRectCache.set(nextNode, nodeRect)
437
- NodeRectCache.set(parentNode, parentRect)
438
- handler(getElementLayoutEvent(nodeRect, parentRect, nextNode))
470
+ LayoutHandlers.set(nextNode, onLayout)
471
+ observeLayoutNode(nextNode, disableKey)
472
+ void emitLayoutFromObserver(nextNode)
439
473
  })
440
474
 
441
475
  useIsomorphicLayoutEffect(() => {
@@ -443,13 +477,8 @@ export function useElementLayout(
443
477
  const node = ref.current?.host
444
478
  if (!node) return
445
479
 
446
- Nodes.add(node)
447
-
448
- startGlobalObservers()
449
- if (globalIntersectionObserver) {
450
- globalIntersectionObserver.observe(node)
451
- IntersectionState.set(node, true)
452
- }
480
+ LayoutHandlers.set(node, onLayout)
481
+ observeLayoutNode(node, disableKey)
453
482
 
454
483
  if (process.env.NODE_ENV === 'development' && isDebugLayout()) {
455
484
  console.log('[useElementLayout] register', {
@@ -460,18 +489,6 @@ export function useElementLayout(
460
489
  })
461
490
  }
462
491
 
463
- // always do one immediate sync layout event for accuracy
464
- const parentNode = node.parentNode as HTMLElement | null
465
- if (parentNode) {
466
- onLayout(
467
- getElementLayoutEvent(
468
- node.getBoundingClientRect(),
469
- parentNode.getBoundingClientRect(),
470
- node
471
- )
472
- )
473
- }
474
-
475
492
  return () => {
476
493
  cleanupNode(node)
477
494
 
@@ -1,11 +1,11 @@
1
1
  {
2
- "mappings": "AACA,cAAgD,gBAAgB,iBAAiB;AAmCjF,OAAO,cAAM,8BAA+B,EAC1C,SACA,YACC;CACD;CACA,UAAU;MACR;KAiBC,+BAA+B;CAClC;;KAGG,4BAA4B,QAAQ,SAAS;AAIlD,OAAO,iBAAS,oBAAoB,OAAO;AAI3C,YAAY,cAAc;CACxB;CACA;CACA;CACA;CACA;CACA;;AAGF,YAAY,cAAc;CACxB,aAAa;EACX,QAAQ;EACR;;CAEF;;AASF,OAAO,iBAAS;AAiOhB,OAAO,cAAM,wBACX,UAAU,iBACV,YAAY,iBACZ,OAAO,gBACN;AA6CH,OAAO,iBAAS,mBACd,MAAM,aACN,sBACA;AA0BF,OAAO,iBAAS,iBACd,KAAK,UAAU,+BACf,aAAa,GAAG;AA+FlB,OAAO,cAAM,6BACX,MAAM,uBACL,QAAQ,kBAAkB;AAiB7B,OAAO,cAAM,cACX,MAAM,aACN,aAAa,uBACZ,eAAe;KAcb,qBAAqB,WAAW,WAAW,eAAe;KAE1D,aACH,WACA,WACA,eACA,gBACA,eACA;AAGF,OAAO,cAAM,UACX,MAAM,aACN,UAAU,cACT,QAAQ;AAWX,OAAO,iBAAS,cACd,MAAM,eACJ,UAAU,cAAc,QAAQ;KAI/B,eAAe;CAAE;CAAe;CAAe;CAAe;;AAEnE,OAAO,cAAM,kBACX,MAAM,aACN,UAAU,sBACT,QAAQ;AAQX,OAAO,cAAM,wBACX,MAAM,kBACH,UAAU,sBAAsB,QAAQ;AAI7C,OAAO,cAAM,gBACX,MAAM,aACN,cAAc,aACd,UAAU,cACT,QAAQ;AAQX,OAAO,iBAAS,oBACd,MAAM,eACJ,YAAY,aAAa,UAAU,cAAc,QAAQ",
2
+ "mappings": "AACA,cAAgD,gBAAgB,iBAAiB;AAmCjF,OAAO,cAAM,8BAA+B,EAC1C,SACA,YACC;CACD;CACA,UAAU;MACR;KAiBC,+BAA+B;CAClC;;KAGG,4BAA4B,QAAQ,SAAS;AAIlD,OAAO,iBAAS,oBAAoB,OAAO;AAI3C,YAAY,cAAc;CACxB;CACA;CACA;CACA;CACA;CACA;;AAGF,YAAY,cAAc;CACxB,aAAa;EACX,QAAQ;EACR;;CAEF;;AASF,OAAO,iBAAS;AAqMhB,OAAO,cAAM,wBACX,UAAU,iBACV,YAAY,iBACZ,OAAO,gBACN;AAkGH,OAAO,iBAAS,mBACd,MAAM,aACN,sBACA;AAiDF,OAAO,iBAAS,iBACd,KAAK,UAAU,+BACf,aAAa,GAAG;AAgElB,OAAO,cAAM,6BACX,MAAM,uBACL,QAAQ,kBAAkB;AAiB7B,OAAO,cAAM,cACX,MAAM,aACN,aAAa,uBACZ,eAAe;KAcb,qBAAqB,WAAW,WAAW,eAAe;KAE1D,aACH,WACA,WACA,eACA,gBACA,eACA;AAGF,OAAO,cAAM,UACX,MAAM,aACN,UAAU,cACT,QAAQ;AAWX,OAAO,iBAAS,cACd,MAAM,eACJ,UAAU,cAAc,QAAQ;KAI/B,eAAe;CAAE;CAAe;CAAe;CAAe;;AAEnE,OAAO,cAAM,kBACX,MAAM,aACN,UAAU,sBACT,QAAQ;AAQX,OAAO,cAAM,wBACX,MAAM,kBACH,UAAU,sBAAsB,QAAQ;AAI7C,OAAO,cAAM,gBACX,MAAM,aACN,cAAc,aACd,UAAU,cACT,QAAQ;AAQX,OAAO,iBAAS,oBACd,MAAM,eACJ,YAAY,aAAa,UAAU,cAAc,QAAQ",
3
3
  "names": [],
4
4
  "sources": [
5
5
  "src/index.tsx"
6
6
  ],
7
7
  "version": 3,
8
8
  "sourcesContent": [
9
- "import { useIsomorphicLayoutEffect } from '@tamagui/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/tamagui/tamagui/pull/2329\nconst usePretransformDimensions = () =>\n (globalThis as any).__TAMAGUI_ONLAYOUT_PRETRANSFORM === true ||\n process.env.TAMAGUI_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.TAMAGUI_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 TamaguiComponentStatePartial = {\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.TAMAGUI_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/tamagui/tamagui/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<TamaguiComponentStatePartial>,\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 '@tamagui/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/tamagui/tamagui/pull/2329\nconst usePretransformDimensions = () =>\n (globalThis as any).__TAMAGUI_ONLAYOUT_PRETRANSFORM === true ||\n process.env.TAMAGUI_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.TAMAGUI_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 TamaguiComponentStatePartial = {\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, DOMRectReadOnly>()\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 emitLayoutIfChanged(node, parentNode, nodeRect, parentRect)\n }\n\n const rAF =\n typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : undefined\n\n // adaptive frame skipping with backoff\n const userSkipVal = process.env.TAMAGUI_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/tamagui/tamagui/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\nfunction emitLayoutIfChanged(\n node: HTMLElement,\n parentNode: HTMLElement,\n nodeRect: DOMRectReadOnly,\n parentRect: DOMRectReadOnly\n) {\n const onLayout = LayoutHandlers.get(node)\n if (typeof onLayout !== 'function') return\n\n const cachedRect = NodeRectCache.get(node)\n const cachedParentRect = NodeRectCache.get(parentNode)\n\n const nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect)\n const parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect)\n\n if (!nodeChanged && !parentChanged) return\n\n NodeRectCache.set(node, nodeRect)\n NodeRectCache.set(parentNode, parentRect)\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\nfunction observeLayoutNode(node: HTMLElement, disableKey?: string) {\n Nodes.add(node)\n if (disableKey) {\n LayoutDisableKey.set(node, disableKey)\n } else {\n LayoutDisableKey.delete(node)\n }\n startGlobalObservers()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(node)\n IntersectionState.set(node, true)\n }\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 LayoutHandlers.set(node, onChange)\n observeLayoutNode(node, disableKey)\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\nfunction emitLayoutFromClientRects(node: HTMLElement) {\n const parentNode = node.parentElement\n if (!parentNode) return\n\n const nodeRect = node.getBoundingClientRect()\n const parentRect = parentNode.getBoundingClientRect()\n emitLayoutIfChanged(node, parentNode, nodeRect, parentRect)\n}\n\nasync function emitLayoutFromObserver(node: HTMLElement) {\n if (!ENABLE || strategy !== 'async') {\n emitLayoutFromClientRects(node)\n return\n }\n\n const parentNode = node.parentElement\n if (!parentNode) return\n\n const [nodeRect, parentRect] = await Promise.all([\n getBoundingClientRectAsync(node),\n getBoundingClientRectAsync(parentNode),\n ])\n\n if (!nodeRect || !parentRect) return\n if (!Nodes.has(node) || node.parentElement !== parentNode) return\n\n emitLayoutIfChanged(node, parentNode, nodeRect, parentRect)\n}\n\nexport function useElementLayout(\n ref: RefObject<TamaguiComponentStatePartial>,\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 seed the async layout measurement\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 LayoutHandlers.set(nextNode, onLayout)\n observeLayoutNode(nextNode, disableKey)\n void emitLayoutFromObserver(nextNode)\n })\n\n useIsomorphicLayoutEffect(() => {\n if (!onLayout) return\n const node = ref.current?.host\n if (!node) return\n\n LayoutHandlers.set(node, onLayout)\n observeLayoutNode(node, disableKey)\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 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
  }