@tamagui/core 1.92.0 → 1.93.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/hooks/useElementLayout.js +39 -18
- package/dist/cjs/hooks/useElementLayout.js.map +1 -1
- package/dist/cjs/hooks/useElementLayout.native.js +177 -25
- package/dist/cjs/hooks/useElementLayout.native.js.map +2 -2
- package/dist/esm/hooks/useElementLayout.js +39 -18
- package/dist/esm/hooks/useElementLayout.js.map +1 -1
- package/dist/esm/hooks/useElementLayout.mjs +32 -11
- package/dist/esm/hooks/useElementLayout.native.js +176 -25
- package/dist/esm/hooks/useElementLayout.native.js.map +2 -2
- package/dist/native.js +192 -131
- package/dist/native.js.map +2 -2
- package/dist/test.native.js +182 -121
- package/dist/test.native.js.map +2 -2
- package/package.json +6 -6
- package/reset.css +1 -0
- package/src/hooks/useElementLayout.tsx +45 -12
- package/types/hooks/useElementLayout.d.ts +2 -1
- package/types/hooks/useElementLayout.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.93.0",
|
|
4
4
|
"source": "src/index.tsx",
|
|
5
5
|
"main": "dist/cjs",
|
|
6
6
|
"module": "dist/esm",
|
|
@@ -35,16 +35,16 @@
|
|
|
35
35
|
"native-test.d.ts"
|
|
36
36
|
],
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@tamagui/react-native-use-pressable": "1.
|
|
39
|
-
"@tamagui/react-native-use-responder-events": "1.
|
|
40
|
-
"@tamagui/use-event": "1.
|
|
41
|
-
"@tamagui/web": "1.
|
|
38
|
+
"@tamagui/react-native-use-pressable": "1.93.0",
|
|
39
|
+
"@tamagui/react-native-use-responder-events": "1.93.0",
|
|
40
|
+
"@tamagui/use-event": "1.93.0",
|
|
41
|
+
"@tamagui/web": "1.93.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"react": "*"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@tamagui/build": "1.
|
|
47
|
+
"@tamagui/build": "1.93.0",
|
|
48
48
|
"@testing-library/react": "^14.0.0",
|
|
49
49
|
"csstype": "^3.0.10",
|
|
50
50
|
"react": "^18.2.0",
|
package/reset.css
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useIsomorphicLayoutEffect } from '@tamagui/constants'
|
|
2
|
-
import type
|
|
2
|
+
import { type RefObject } from 'react'
|
|
3
3
|
import { getBoundingClientRect } from '../helpers/getBoundingClientRect'
|
|
4
4
|
|
|
5
5
|
const LayoutHandlers = new WeakMap<Element, Function>()
|
|
6
|
-
const
|
|
6
|
+
const resizeListeners = new Set<Function>()
|
|
7
7
|
|
|
8
8
|
export type LayoutValue = {
|
|
9
9
|
x: number
|
|
@@ -25,21 +25,41 @@ export type LayoutEvent = {
|
|
|
25
25
|
let resizeObserver: ResizeObserver | null = null
|
|
26
26
|
|
|
27
27
|
if (typeof window !== 'undefined' && 'ResizeObserver' in window) {
|
|
28
|
+
// node resize/move
|
|
28
29
|
resizeObserver = new ResizeObserver((entries) => {
|
|
29
30
|
for (const { target } of entries) {
|
|
30
31
|
const onLayout = LayoutHandlers.get(target)
|
|
31
32
|
if (typeof onLayout !== 'function') return
|
|
32
|
-
|
|
33
|
-
onLayout(
|
|
34
|
-
nativeEvent: {
|
|
35
|
-
layout: { x, y, width, height, left, top },
|
|
36
|
-
target,
|
|
37
|
-
},
|
|
38
|
-
timeStamp: Date.now(),
|
|
39
|
-
})
|
|
33
|
+
measureElement(target as HTMLElement).then((event) => {
|
|
34
|
+
onLayout(event)
|
|
40
35
|
})
|
|
41
36
|
}
|
|
42
37
|
})
|
|
38
|
+
|
|
39
|
+
// window resize
|
|
40
|
+
if (typeof window.addEventListener === 'function') {
|
|
41
|
+
let tm
|
|
42
|
+
window.addEventListener('resize', () => {
|
|
43
|
+
clearTimeout(tm)
|
|
44
|
+
tm = setTimeout(() => {
|
|
45
|
+
resizeListeners.forEach((cb) => cb())
|
|
46
|
+
}, 4)
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const measureElement = async (target: HTMLElement): Promise<LayoutEvent> => {
|
|
52
|
+
return new Promise((res) => {
|
|
53
|
+
measureLayout(target, null, (x, y, width, height, left, top) => {
|
|
54
|
+
res({
|
|
55
|
+
nativeEvent: {
|
|
56
|
+
layout: { x, y, width, height, left, top },
|
|
57
|
+
target,
|
|
58
|
+
},
|
|
59
|
+
timeStamp: Date.now(),
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
})
|
|
43
63
|
}
|
|
44
64
|
|
|
45
65
|
const cache = new WeakMap()
|
|
@@ -108,14 +128,27 @@ export function useElementLayout(
|
|
|
108
128
|
ref: RefObject<Element>,
|
|
109
129
|
onLayout?: ((e: LayoutEvent) => void) | null
|
|
110
130
|
) {
|
|
131
|
+
// two effects because expensive to re-run on every change of onLayout
|
|
111
132
|
useIsomorphicLayoutEffect(() => {
|
|
112
|
-
if (!
|
|
133
|
+
if (!onLayout) return
|
|
113
134
|
const node = ref.current
|
|
114
135
|
if (!node) return
|
|
115
136
|
LayoutHandlers.set(node, onLayout)
|
|
137
|
+
}, [ref, onLayout])
|
|
138
|
+
|
|
139
|
+
useIsomorphicLayoutEffect(() => {
|
|
140
|
+
if (!resizeObserver) return
|
|
141
|
+
const node = ref.current
|
|
142
|
+
if (!node) return
|
|
143
|
+
if (!LayoutHandlers.has(node)) return
|
|
144
|
+
const onResize = () => {
|
|
145
|
+
measureElement(node as HTMLElement).then(onLayout)
|
|
146
|
+
}
|
|
147
|
+
resizeListeners.add(onResize)
|
|
116
148
|
resizeObserver.observe(node)
|
|
117
149
|
return () => {
|
|
150
|
+
resizeListeners.delete(onResize)
|
|
118
151
|
resizeObserver?.unobserve(node)
|
|
119
152
|
}
|
|
120
|
-
}, [ref
|
|
153
|
+
}, [ref])
|
|
121
154
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
2
|
export type LayoutValue = {
|
|
3
3
|
x: number;
|
|
4
4
|
y: number;
|
|
@@ -14,6 +14,7 @@ export type LayoutEvent = {
|
|
|
14
14
|
};
|
|
15
15
|
timeStamp: number;
|
|
16
16
|
};
|
|
17
|
+
export declare const measureElement: (target: HTMLElement) => Promise<LayoutEvent>;
|
|
17
18
|
export declare const measureLayout: (node: HTMLElement, relativeTo: HTMLElement | null, callback: (x: number, y: number, width: number, height: number, left: number, top: number) => void) => void;
|
|
18
19
|
export declare function useElementLayout(ref: RefObject<Element>, onLayout?: ((e: LayoutEvent) => void) | null): void;
|
|
19
20
|
//# sourceMappingURL=useElementLayout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useElementLayout.d.ts","sourceRoot":"","sources":["../../src/hooks/useElementLayout.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"useElementLayout.d.ts","sourceRoot":"","sources":["../../src/hooks/useElementLayout.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE;QACX,MAAM,EAAE,WAAW,CAAA;QACnB,MAAM,EAAE,GAAG,CAAA;KACZ,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AA4BD,eAAO,MAAM,cAAc,WAAkB,WAAW,KAAG,QAAQ,WAAW,CAY7E,CAAA;AAID,eAAO,MAAM,aAAa,SAClB,WAAW,cACL,WAAW,GAAG,IAAI,gBAEzB,MAAM,KACN,MAAM,SACF,MAAM,UACL,MAAM,QACR,MAAM,OACP,MAAM,KACR,IAAI,SAmBV,CAAA;AA+BD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,EACvB,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,IAAI,QAyB7C"}
|