@tamagui/core 1.126.13 → 1.126.15

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.
@@ -25,10 +25,12 @@ __export(index_exports, {
25
25
  Stack: () => Stack,
26
26
  Text: () => Text,
27
27
  View: () => View,
28
- createTamagui: () => createTamagui
28
+ createTamagui: () => createTamagui,
29
+ getElementLayoutEvent: () => import_useElementLayout2.getElementLayoutEvent,
30
+ setOnLayoutStrategy: () => import_useElementLayout2.setOnLayoutStrategy
29
31
  });
30
32
  module.exports = __toCommonJS(index_exports);
31
- var import_react_native_media_driver = require("@tamagui/react-native-media-driver"), import_react_native_use_responder_events = require("@tamagui/react-native-use-responder-events"), import_web = require("@tamagui/web"), import_react = __toESM(require("react")), import_createOptimizedView = require("./createOptimizedView"), import_getBaseViews = require("./getBaseViews"), import_getRect = require("./helpers/getRect"), import_useElementLayout = require("./hooks/useElementLayout"), import_Pressability = require("./vendor/Pressability"), import_addNativeValidStyles = require("./addNativeValidStyles");
33
+ var import_react_native_media_driver = require("@tamagui/react-native-media-driver"), import_react_native_use_responder_events = require("@tamagui/react-native-use-responder-events"), import_web = require("@tamagui/web"), import_react = __toESM(require("react")), import_addNativeValidStyles = require("./addNativeValidStyles"), import_createOptimizedView = require("./createOptimizedView"), import_getBaseViews = require("./getBaseViews"), import_getRect = require("./helpers/getRect"), import_useElementLayout = require("./hooks/useElementLayout"), import_Pressability = require("./vendor/Pressability"), import_useElementLayout2 = require("./hooks/useElementLayout");
32
34
  __reExport(index_exports, require("@tamagui/web"), module.exports);
33
35
  __reExport(index_exports, require("./reactNativeTypes"), module.exports);
34
36
  (0, import_addNativeValidStyles.addNativeValidStyles)();
@@ -97,6 +99,8 @@ var dontComposePressabilityKeys = {
97
99
  Text,
98
100
  View,
99
101
  createTamagui,
102
+ getElementLayoutEvent,
103
+ setOnLayoutStrategy,
100
104
  ...require("@tamagui/web"),
101
105
  ...require("./reactNativeTypes")
102
106
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.tsx"],
4
- "mappings": "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",
5
- "names": ["addNativeValidStyles", "createTamagui", "conf", "media", "createMedia", "createTamaguiWeb", "baseViews", "getBaseViews", "setupHooks", "setElementProps", "node", "measure", "callback", "measureLayout", "relativeToNode", "success", "measureInWindow", "setTimeout", "height", "left", "top", "width", "getRect", "usePropsTransform", "elementType", "propsIn", "stateRef", "willHydrate", "process", "isDOM", "onMoveShouldSetResponder", "onMoveShouldSetResponderCapture", "onResponderEnd", "onResponderGrant", "onResponderMove", "onResponderReject", "onResponderRelease", "onResponderStart", "onResponderTerminate", "onResponderTerminationRequest", "onScrollShouldSetResponder", "onScrollShouldSetResponderCapture", "onSelectionChangeShouldSetResponder", "onSelectionChangeShouldSetResponderCapture", "onStartShouldSetResponder", "onStartShouldSetResponderCapture", "collapsable", "focusable", "accessible", "accessibilityDisabled", "onLayout", "hrefAttrs", "plainDOMProps", "href", "download", "rel", "target", "useEvents", "viewProps", "events", "setStateShallow", "staticConfig", "pseudos", "onFocus", "onBlur", "isInput", "onPressIn", "onPressOut", "onPress", "inputEvents", "composeEventHandlers", "Object", "assign", "hitSlop", "pressability", "usePressability", "env", "NODE_ENV", "console", "info", "keys", "key", "og", "val", "dontComposePressabilityKeys", "useChildren", "children", "View", "createOptimizedView", "TAMAGUI_OPTIMIZE_NATIVE_VIEWS", "Text", "React", "createElement", "onClick", "WebView", "Stack", "WebStack", "WebText"]
4
+ "mappings": "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",
5
+ "names": ["import_useElementLayout", "addNativeValidStyles", "createTamagui", "conf", "media", "createMedia", "createTamaguiWeb", "baseViews", "getBaseViews", "setupHooks", "setElementProps", "node", "measure", "callback", "measureLayout", "relativeToNode", "success", "measureInWindow", "setTimeout", "height", "left", "top", "width", "getRect", "usePropsTransform", "elementType", "propsIn", "stateRef", "willHydrate", "process", "isDOM", "onMoveShouldSetResponder", "onMoveShouldSetResponderCapture", "onResponderEnd", "onResponderGrant", "onResponderMove", "onResponderReject", "onResponderRelease", "onResponderStart", "onResponderTerminate", "onResponderTerminationRequest", "onScrollShouldSetResponder", "onScrollShouldSetResponderCapture", "onSelectionChangeShouldSetResponder", "onSelectionChangeShouldSetResponderCapture", "onStartShouldSetResponder", "onStartShouldSetResponderCapture", "collapsable", "focusable", "accessible", "accessibilityDisabled", "onLayout", "hrefAttrs", "plainDOMProps", "href", "download", "rel", "target", "useEvents", "viewProps", "events", "setStateShallow", "staticConfig", "pseudos", "onFocus", "onBlur", "isInput", "onPressIn", "onPressOut", "onPress", "inputEvents", "composeEventHandlers", "Object", "assign", "hitSlop", "pressability", "usePressability", "env", "NODE_ENV", "console", "info", "keys", "key", "og", "val", "dontComposePressabilityKeys", "useChildren", "children", "View", "createOptimizedView", "TAMAGUI_OPTIMIZE_NATIVE_VIEWS", "Text", "React", "createElement", "onClick", "WebView", "Stack", "WebStack", "WebText"]
6
6
  }
@@ -1,85 +1,81 @@
1
- import { useIsomorphicLayoutEffect } from "@tamagui/constants";
2
- import { getBoundingClientRect } from "../helpers/getBoundingClientRect";
3
- const LayoutHandlers = /* @__PURE__ */ new WeakMap(), resizeListeners = /* @__PURE__ */ new Set();
4
- let resizeObserver = null;
5
- if (typeof window < "u" && "ResizeObserver" in window && (resizeObserver = new ResizeObserver((entries) => {
6
- for (const { target } of entries) {
7
- const onLayout = LayoutHandlers.get(target);
8
- if (typeof onLayout != "function") return;
9
- measureElement(target).then((event) => {
10
- onLayout(event);
11
- });
12
- }
13
- }), typeof window.addEventListener == "function")) {
14
- let tm;
15
- window.addEventListener("resize", () => {
16
- clearTimeout(tm), tm = setTimeout(() => {
17
- resizeListeners.forEach((cb) => cb());
18
- }, 4);
19
- });
1
+ import { isClient, useIsomorphicLayoutEffect } from "@tamagui/constants";
2
+ import {
3
+ isEqualShallow,
4
+ ___onDidFinishClientRender
5
+ } from "@tamagui/web";
6
+ const LayoutHandlers = /* @__PURE__ */ new WeakMap(), Nodes = /* @__PURE__ */ new Set();
7
+ let status = "active";
8
+ function setOnLayoutStrategy(state) {
9
+ status = state;
20
10
  }
21
- const measureElement = async (target) => new Promise((res) => {
22
- measureLayout(target, null, (x, y, width, height, left, top) => {
23
- res({
11
+ const NodeRectCache = /* @__PURE__ */ new WeakMap(), ParentRectCache = /* @__PURE__ */ new WeakMap(), rAF = typeof window < "u" ? window.requestAnimationFrame : void 0;
12
+ if (isClient)
13
+ if (rAF) {
14
+ let updateLayoutIfChanged = function(node) {
15
+ const nodeRect = node.getBoundingClientRect(), parentNode = node.parentElement, parentRect = parentNode?.getBoundingClientRect(), onLayout = LayoutHandlers.get(node);
16
+ if (typeof onLayout != "function") return;
17
+ const cachedRect = NodeRectCache.get(node), cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
18
+ if (!cachedRect || // has changed one rect
19
+ !isEqualShallow(cachedRect, nodeRect) && (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect))) {
20
+ NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect);
21
+ const event = getElementLayoutEvent(node);
22
+ avoidUpdates ? queuedUpdates.set(node, () => onLayout(event)) : onLayout(event);
23
+ }
24
+ }, layoutOnAnimationFrame = function() {
25
+ status !== "inactive" && Nodes.forEach(updateLayoutIfChanged), rAF(layoutOnAnimationFrame);
26
+ }, avoidUpdates = !0;
27
+ const queuedUpdates = /* @__PURE__ */ new Map();
28
+ ___onDidFinishClientRender(() => {
29
+ avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach((cb) => cb()), queuedUpdates.clear());
30
+ }), rAF(layoutOnAnimationFrame);
31
+ } else
32
+ process.env.NODE_ENV === "development" && console.warn(
33
+ "No requestAnimationFrame - please polyfill for onLayout to work correctly"
34
+ );
35
+ const getElementLayoutEvent = (target) => {
36
+ let res = null;
37
+ if (measureLayout(target, null, (x, y, width, height, left, top) => {
38
+ res = {
24
39
  nativeEvent: {
25
40
  layout: { x, y, width, height, left, top },
26
41
  target
27
42
  },
28
43
  timeStamp: Date.now()
29
- });
30
- });
31
- }), cache = /* @__PURE__ */ new WeakMap(), measureLayout = (node, relativeTo, callback) => {
32
- const relativeNode = relativeTo || node?.parentNode;
44
+ };
45
+ }), !res)
46
+ throw new Error("\u203C\uFE0F");
47
+ return res;
48
+ }, measureLayout = (node, relativeTo, callback) => {
49
+ const relativeNode = relativeTo || node?.parentElement;
33
50
  if (relativeNode instanceof HTMLElement) {
34
- const now = Date.now();
35
- cache.set(node, now), Promise.all([
36
- getBoundingClientRectAsync(node),
37
- getBoundingClientRectAsync(relativeNode)
38
- ]).then(([nodeDim, relativeNodeDim]) => {
39
- if (relativeNodeDim && nodeDim && cache.get(node) === now) {
40
- const { x, y, width, height, left, top } = getRelativeDimensions(
41
- nodeDim,
42
- relativeNodeDim
43
- );
44
- callback(x, y, width, height, left, top);
45
- }
46
- });
51
+ const nodeDim = node.getBoundingClientRect(), relativeNodeDim = relativeNode.getBoundingClientRect();
52
+ if (relativeNodeDim && nodeDim) {
53
+ const { x, y, width, height, left, top } = getRelativeDimensions(
54
+ nodeDim,
55
+ relativeNodeDim
56
+ );
57
+ callback(x, y, width, height, left, top);
58
+ }
47
59
  }
48
60
  }, getRelativeDimensions = (a, b) => {
49
61
  const { height, left, top, width } = a, x = left - b.left, y = top - b.top;
50
62
  return { x, y, width, height, left, top };
51
- }, getBoundingClientRectAsync = (element) => new Promise((resolve) => {
52
- function fallbackToSync() {
53
- resolve(getBoundingClientRect(element));
54
- }
55
- const tm = setTimeout(fallbackToSync, 10);
56
- new IntersectionObserver(
57
- (entries, ob) => {
58
- clearTimeout(tm), ob.disconnect(), resolve(entries[0]?.boundingClientRect);
59
- },
60
- {
61
- threshold: 1e-4
62
- }
63
- ).observe(element);
64
- });
63
+ };
65
64
  function useElementLayout(ref, onLayout) {
66
65
  const node = ref.current?.host;
67
66
  node && onLayout && LayoutHandlers.set(node, onLayout), useIsomorphicLayoutEffect(() => {
68
- if (!resizeObserver || !onLayout) return;
67
+ if (!onLayout) return;
69
68
  const node2 = ref.current?.host;
70
- if (!node2) return;
71
- LayoutHandlers.set(node2, onLayout);
72
- const onResize = () => {
73
- measureElement(node2).then(onLayout);
74
- };
75
- return resizeListeners.add(onResize), resizeObserver.observe(node2), () => {
76
- LayoutHandlers.delete(node2), resizeListeners.delete(onResize), resizeObserver?.unobserve(node2);
77
- };
69
+ if (node2)
70
+ return LayoutHandlers.set(node2, onLayout), Nodes.add(node2), onLayout(getElementLayoutEvent(node2)), () => {
71
+ Nodes.delete(node2), LayoutHandlers.delete(node2), NodeRectCache.delete(node2);
72
+ };
78
73
  }, [ref, !!onLayout]);
79
74
  }
80
75
  export {
81
- measureElement,
76
+ getElementLayoutEvent,
82
77
  measureLayout,
78
+ setOnLayoutStrategy,
83
79
  useElementLayout
84
80
  };
85
81
  //# sourceMappingURL=useElementLayout.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/useElementLayout.tsx"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["node"]
6
6
  }
@@ -1,29 +1,44 @@
1
- import { useIsomorphicLayoutEffect } from "@tamagui/constants";
2
- import { getBoundingClientRect } from "../helpers/getBoundingClientRect.mjs";
1
+ import { isClient, useIsomorphicLayoutEffect } from "@tamagui/constants";
2
+ import { isEqualShallow, ___onDidFinishClientRender } from "@tamagui/web";
3
3
  const LayoutHandlers = /* @__PURE__ */new WeakMap(),
4
- resizeListeners = /* @__PURE__ */new Set();
5
- let resizeObserver = null;
6
- if (typeof window < "u" && "ResizeObserver" in window && (resizeObserver = new ResizeObserver(entries => {
7
- for (const {
8
- target
9
- } of entries) {
10
- const onLayout = LayoutHandlers.get(target);
11
- if (typeof onLayout != "function") return;
12
- measureElement(target).then(event => {
13
- onLayout(event);
14
- });
15
- }
16
- }), typeof window.addEventListener == "function")) {
17
- let tm;
18
- window.addEventListener("resize", () => {
19
- clearTimeout(tm), tm = setTimeout(() => {
20
- resizeListeners.forEach(cb => cb());
21
- }, 4);
22
- });
4
+ Nodes = /* @__PURE__ */new Set();
5
+ let status = "active";
6
+ function setOnLayoutStrategy(state) {
7
+ status = state;
23
8
  }
24
- const measureElement = async target => new Promise(res => {
25
- measureLayout(target, null, (x, y, width, height, left, top) => {
26
- res({
9
+ const NodeRectCache = /* @__PURE__ */new WeakMap(),
10
+ ParentRectCache = /* @__PURE__ */new WeakMap(),
11
+ rAF = typeof window < "u" ? window.requestAnimationFrame : void 0;
12
+ if (isClient) if (rAF) {
13
+ let updateLayoutIfChanged = function (node) {
14
+ const nodeRect = node.getBoundingClientRect(),
15
+ parentNode = node.parentElement,
16
+ parentRect = parentNode?.getBoundingClientRect(),
17
+ onLayout = LayoutHandlers.get(node);
18
+ if (typeof onLayout != "function") return;
19
+ const cachedRect = NodeRectCache.get(node),
20
+ cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
21
+ if (!cachedRect ||
22
+ // has changed one rect
23
+ !isEqualShallow(cachedRect, nodeRect) && (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect))) {
24
+ NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect);
25
+ const event = getElementLayoutEvent(node);
26
+ avoidUpdates ? queuedUpdates.set(node, () => onLayout(event)) : onLayout(event);
27
+ }
28
+ },
29
+ layoutOnAnimationFrame = function () {
30
+ status !== "inactive" && Nodes.forEach(updateLayoutIfChanged), rAF(layoutOnAnimationFrame);
31
+ },
32
+ avoidUpdates = !0;
33
+ const queuedUpdates = /* @__PURE__ */new Map();
34
+ ___onDidFinishClientRender(() => {
35
+ avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(cb => cb()), queuedUpdates.clear());
36
+ }), rAF(layoutOnAnimationFrame);
37
+ } else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
38
+ const getElementLayoutEvent = target => {
39
+ let res = null;
40
+ if (measureLayout(target, null, (x, y, width, height, left, top) => {
41
+ res = {
27
42
  nativeEvent: {
28
43
  layout: {
29
44
  x,
@@ -36,27 +51,26 @@ const measureElement = async target => new Promise(res => {
36
51
  target
37
52
  },
38
53
  timeStamp: Date.now()
39
- });
40
- });
41
- }),
42
- cache = /* @__PURE__ */new WeakMap(),
54
+ };
55
+ }), !res) throw new Error("\u203C\uFE0F");
56
+ return res;
57
+ },
43
58
  measureLayout = (node, relativeTo, callback) => {
44
- const relativeNode = relativeTo || node?.parentNode;
59
+ const relativeNode = relativeTo || node?.parentElement;
45
60
  if (relativeNode instanceof HTMLElement) {
46
- const now = Date.now();
47
- cache.set(node, now), Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(relativeNode)]).then(([nodeDim, relativeNodeDim]) => {
48
- if (relativeNodeDim && nodeDim && cache.get(node) === now) {
49
- const {
50
- x,
51
- y,
52
- width,
53
- height,
54
- left,
55
- top
56
- } = getRelativeDimensions(nodeDim, relativeNodeDim);
57
- callback(x, y, width, height, left, top);
58
- }
59
- });
61
+ const nodeDim = node.getBoundingClientRect(),
62
+ relativeNodeDim = relativeNode.getBoundingClientRect();
63
+ if (relativeNodeDim && nodeDim) {
64
+ const {
65
+ x,
66
+ y,
67
+ width,
68
+ height,
69
+ left,
70
+ top
71
+ } = getRelativeDimensions(nodeDim, relativeNodeDim);
72
+ callback(x, y, width, height, left, top);
73
+ }
60
74
  }
61
75
  },
62
76
  getRelativeDimensions = (a, b) => {
@@ -76,32 +90,16 @@ const measureElement = async target => new Promise(res => {
76
90
  left,
77
91
  top
78
92
  };
79
- },
80
- getBoundingClientRectAsync = element => new Promise(resolve => {
81
- function fallbackToSync() {
82
- resolve(getBoundingClientRect(element));
83
- }
84
- const tm = setTimeout(fallbackToSync, 10);
85
- new IntersectionObserver((entries, ob) => {
86
- clearTimeout(tm), ob.disconnect(), resolve(entries[0]?.boundingClientRect);
87
- }, {
88
- threshold: 1e-4
89
- }).observe(element);
90
- });
93
+ };
91
94
  function useElementLayout(ref, onLayout) {
92
95
  const node = ref.current?.host;
93
96
  node && onLayout && LayoutHandlers.set(node, onLayout), useIsomorphicLayoutEffect(() => {
94
- if (!resizeObserver || !onLayout) return;
97
+ if (!onLayout) return;
95
98
  const node2 = ref.current?.host;
96
- if (!node2) return;
97
- LayoutHandlers.set(node2, onLayout);
98
- const onResize = () => {
99
- measureElement(node2).then(onLayout);
100
- };
101
- return resizeListeners.add(onResize), resizeObserver.observe(node2), () => {
102
- LayoutHandlers.delete(node2), resizeListeners.delete(onResize), resizeObserver?.unobserve(node2);
99
+ if (node2) return LayoutHandlers.set(node2, onLayout), Nodes.add(node2), onLayout(getElementLayoutEvent(node2)), () => {
100
+ Nodes.delete(node2), LayoutHandlers.delete(node2), NodeRectCache.delete(node2);
103
101
  };
104
102
  }, [ref, !!onLayout]);
105
103
  }
106
- export { measureElement, measureLayout, useElementLayout };
104
+ export { getElementLayoutEvent, measureLayout, setOnLayoutStrategy, useElementLayout };
107
105
  //# sourceMappingURL=useElementLayout.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["useIsomorphicLayoutEffect","getBoundingClientRect","LayoutHandlers","WeakMap","resizeListeners","Set","resizeObserver","window","ResizeObserver","entries","target","onLayout","get","measureElement","then","event","addEventListener","tm","clearTimeout","setTimeout","forEach","cb","Promise","res","measureLayout","x","y","width","height","left","top","nativeEvent","layout","timeStamp","Date","now","cache","node","relativeTo","callback","relativeNode","parentNode","HTMLElement","set","all","getBoundingClientRectAsync","nodeDim","relativeNodeDim","getRelativeDimensions","a","b","element","resolve","fallbackToSync","IntersectionObserver","ob","disconnect","boundingClientRect","threshold","observe","useElementLayout","ref","current","host","node2","onResize","add","delete","unobserve"],"sources":["../../../src/hooks/useElementLayout.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","___onDidFinishClientRender","LayoutHandlers","WeakMap","Nodes","Set","status","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","rAF","window","requestAnimationFrame","updateLayoutIfChanged","node","nodeRect","getBoundingClientRect","parentNode","parentElement","parentRect","onLayout","get","cachedRect","cachedParentRect","set","event","getElementLayoutEvent","avoidUpdates","queuedUpdates","layoutOnAnimationFrame","forEach","Map","cb","clear","process","env","NODE_ENV","console","warn","target","res","measureLayout","x","y","width","height","left","top","nativeEvent","layout","timeStamp","Date","now","Error","relativeTo","callback","relativeNode","HTMLElement","nodeDim","relativeNodeDim","getRelativeDimensions","a","b","useElementLayout","ref","current","host","node2","add","delete"],"sources":["../../../src/hooks/useElementLayout.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,91 +1,83 @@
1
- import { useIsomorphicLayoutEffect } from "@tamagui/constants";
2
- import { getBoundingClientRect } from "../helpers/getBoundingClientRect.native.js";
3
- function _type_of(obj) {
4
- "@swc/helpers - typeof";
5
-
6
- return obj && typeof Symbol < "u" && obj.constructor === Symbol ? "symbol" : typeof obj;
7
- }
1
+ import { isClient, useIsomorphicLayoutEffect } from "@tamagui/constants";
2
+ import { isEqualShallow, ___onDidFinishClientRender } from "@tamagui/web";
8
3
  var LayoutHandlers = /* @__PURE__ */new WeakMap(),
9
- resizeListeners = /* @__PURE__ */new Set(),
10
- resizeObserver = null;
11
- if (typeof window < "u" && "ResizeObserver" in window && (resizeObserver = new ResizeObserver(function (entries) {
12
- var _iteratorNormalCompletion = !0,
13
- _didIteratorError = !1,
14
- _iteratorError = void 0;
15
- try {
16
- for (var _loop = function () {
17
- var {
18
- target
19
- } = _step.value,
20
- onLayout = LayoutHandlers.get(target);
21
- if (typeof onLayout != "function") return {
22
- v: void 0
23
- };
24
- measureElement(target).then(function (event) {
25
- onLayout(event);
26
- });
27
- }, _iterator = entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
28
- var _ret = _loop();
29
- if (_type_of(_ret) === "object") return _ret.v;
30
- }
31
- } catch (err) {
32
- _didIteratorError = !0, _iteratorError = err;
33
- } finally {
34
- try {
35
- !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
36
- } finally {
37
- if (_didIteratorError) throw _iteratorError;
38
- }
39
- }
40
- }), typeof window.addEventListener == "function")) {
41
- var tm;
42
- window.addEventListener("resize", function () {
43
- clearTimeout(tm), tm = setTimeout(function () {
44
- resizeListeners.forEach(function (cb) {
45
- return cb();
46
- });
47
- }, 4);
48
- });
4
+ Nodes = /* @__PURE__ */new Set(),
5
+ status = "active";
6
+ function setOnLayoutStrategy(state) {
7
+ status = state;
49
8
  }
50
- var measureElement = async function (target) {
51
- return new Promise(function (res) {
52
- measureLayout(target, null, function (x, y, width, height, left, top) {
53
- res({
54
- nativeEvent: {
55
- layout: {
56
- x,
57
- y,
58
- width,
59
- height,
60
- left,
61
- top
62
- },
63
- target
64
- },
65
- timeStamp: Date.now()
66
- });
67
- });
68
- });
69
- },
70
- cache = /* @__PURE__ */new WeakMap(),
71
- measureLayout = function (node, relativeTo, callback) {
72
- var relativeNode = relativeTo || node?.parentNode;
73
- if (relativeNode instanceof HTMLElement) {
74
- var now = Date.now();
75
- cache.set(node, now), Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(relativeNode)]).then(function (param) {
76
- var [nodeDim, relativeNodeDim] = param;
77
- if (relativeNodeDim && nodeDim && cache.get(node) === now) {
78
- var {
9
+ var NodeRectCache = /* @__PURE__ */new WeakMap(),
10
+ ParentRectCache = /* @__PURE__ */new WeakMap(),
11
+ rAF = typeof window < "u" ? window.requestAnimationFrame : void 0;
12
+ if (isClient) if (rAF) {
13
+ let updateLayoutIfChanged = function (node) {
14
+ var nodeRect = node.getBoundingClientRect(),
15
+ parentNode = node.parentElement,
16
+ parentRect = parentNode?.getBoundingClientRect(),
17
+ onLayout = LayoutHandlers.get(node);
18
+ if (typeof onLayout == "function") {
19
+ var cachedRect = NodeRectCache.get(node),
20
+ cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
21
+ if (!cachedRect ||
22
+ // has changed one rect
23
+ !isEqualShallow(cachedRect, nodeRect) && (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect))) {
24
+ NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect);
25
+ var event = getElementLayoutEvent(node);
26
+ avoidUpdates ? queuedUpdates.set(node, function () {
27
+ return onLayout(event);
28
+ }) : onLayout(event);
29
+ }
30
+ }
31
+ },
32
+ layoutOnAnimationFrame = function () {
33
+ status !== "inactive" && Nodes.forEach(updateLayoutIfChanged), rAF(layoutOnAnimationFrame);
34
+ };
35
+ var updateLayoutIfChanged2 = updateLayoutIfChanged,
36
+ layoutOnAnimationFrame2 = layoutOnAnimationFrame,
37
+ avoidUpdates = !0,
38
+ queuedUpdates = /* @__PURE__ */new Map();
39
+ ___onDidFinishClientRender(function () {
40
+ avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(function (cb) {
41
+ return cb();
42
+ }), queuedUpdates.clear());
43
+ }), rAF(layoutOnAnimationFrame);
44
+ } else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
45
+ var getElementLayoutEvent = function (target) {
46
+ var res = null;
47
+ if (measureLayout(target, null, function (x, y, width, height, left, top) {
48
+ res = {
49
+ nativeEvent: {
50
+ layout: {
79
51
  x,
80
52
  y,
81
53
  width,
82
54
  height,
83
55
  left,
84
56
  top
85
- } = getRelativeDimensions(nodeDim, relativeNodeDim);
86
- callback(x, y, width, height, left, top);
87
- }
88
- });
57
+ },
58
+ target
59
+ },
60
+ timeStamp: Date.now()
61
+ };
62
+ }), !res) throw new Error("\u203C\uFE0F");
63
+ return res;
64
+ },
65
+ measureLayout = function (node, relativeTo, callback) {
66
+ var relativeNode = relativeTo || node?.parentElement;
67
+ if (relativeNode instanceof HTMLElement) {
68
+ var nodeDim = node.getBoundingClientRect(),
69
+ relativeNodeDim = relativeNode.getBoundingClientRect();
70
+ if (relativeNodeDim && nodeDim) {
71
+ var {
72
+ x,
73
+ y,
74
+ width,
75
+ height,
76
+ left,
77
+ top
78
+ } = getRelativeDimensions(nodeDim, relativeNodeDim);
79
+ callback(x, y, width, height, left, top);
80
+ }
89
81
  }
90
82
  },
91
83
  getRelativeDimensions = function (a, b) {
@@ -105,40 +97,19 @@ var measureElement = async function (target) {
105
97
  left,
106
98
  top
107
99
  };
108
- },
109
- getBoundingClientRectAsync = function (element) {
110
- return new Promise(function (resolve) {
111
- function fallbackToSync() {
112
- resolve(getBoundingClientRect(element));
113
- }
114
- var tm = setTimeout(fallbackToSync, 10),
115
- observer = new IntersectionObserver(function (entries, ob) {
116
- var _entries_;
117
- clearTimeout(tm), ob.disconnect(), resolve((_entries_ = entries[0]) === null || _entries_ === void 0 ? void 0 : _entries_.boundingClientRect);
118
- }, {
119
- threshold: 1e-4
120
- });
121
- observer.observe(element);
122
- });
123
100
  };
124
101
  function useElementLayout(ref, onLayout) {
125
102
  var _ref_current,
126
103
  node = (_ref_current = ref.current) === null || _ref_current === void 0 ? void 0 : _ref_current.host;
127
104
  node && onLayout && LayoutHandlers.set(node, onLayout), useIsomorphicLayoutEffect(function () {
128
105
  var _ref_current2;
129
- if (!(!resizeObserver || !onLayout)) {
106
+ if (onLayout) {
130
107
  var node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;
131
- if (node2) {
132
- LayoutHandlers.set(node2, onLayout);
133
- var onResize = function () {
134
- measureElement(node2).then(onLayout);
135
- };
136
- return resizeListeners.add(onResize), resizeObserver.observe(node2), function () {
137
- LayoutHandlers.delete(node2), resizeListeners.delete(onResize), resizeObserver?.unobserve(node2);
138
- };
139
- }
108
+ if (node2) return LayoutHandlers.set(node2, onLayout), Nodes.add(node2), onLayout(getElementLayoutEvent(node2)), function () {
109
+ Nodes.delete(node2), LayoutHandlers.delete(node2), NodeRectCache.delete(node2);
110
+ };
140
111
  }
141
112
  }, [ref, !!onLayout]);
142
113
  }
143
- export { measureElement, measureLayout, useElementLayout };
114
+ export { getElementLayoutEvent, measureLayout, setOnLayoutStrategy, useElementLayout };
144
115
  //# sourceMappingURL=useElementLayout.native.js.map