MCPcopy Create free account
hub / github.com/editablejs/editable / useSize

Function useSize

packages/ui/src/hooks/use-size.ts:4–54  ·  view source on GitHub ↗
(element: HTMLElement | null)

Source from the content-addressed store, hash-verified

2import { useIsomorphicLayoutEffect } from '../utils'
3
4export const useSize = (element: HTMLElement | null) => {
5 const [size, setSize] = React.useState<{ width: number; height: number } | undefined>(undefined)
6
7 useIsomorphicLayoutEffect(() => {
8 if (element) {
9 // provide size as early as possible
10 setSize({ width: element.offsetWidth, height: element.offsetHeight })
11
12 const resizeObserver = new ResizeObserver(entries => {
13 if (!Array.isArray(entries)) {
14 return
15 }
16
17 // Since we only observe the one element, we don't need to loop over the
18 // array
19 if (!entries.length) {
20 return
21 }
22
23 const entry = entries[0]
24 let width: number
25 let height: number
26
27 if ('borderBoxSize' in entry) {
28 const borderSizeEntry = entry['borderBoxSize']
29 // iron out differences between browsers
30 const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry
31 width = borderSize['inlineSize']
32 height = borderSize['blockSize']
33 } else {
34 // for browsers that don't support `borderBoxSize`
35 // we calculate it ourselves to get the correct border box.
36 width = element.offsetWidth
37 height = element.offsetHeight
38 }
39
40 setSize({ width, height })
41 })
42
43 resizeObserver.observe(element, { box: 'border-box' })
44
45 return () => resizeObserver.unobserve(element)
46 } else {
47 // We only want to reset to `undefined` when the element becomes `null`,
48 // not if it changes to another element.
49 setSize(undefined)
50 }
51 }, [element])
52
53 return size
54}

Callers 2

popper.tsxFile · 0.90
BubbleInputFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…