@@ -4,9 +4,33 @@ let observer: ResizeObserver | undefined
44
55const resizeHandlers = new WeakMap < Element , Set < OnResizeCallback > > ( )
66
7+ const getBorderBoxSize = ( entry : ResizeObserverEntry ) => {
8+ // `borderBoxSize` is an array in modern browsers and a plain object in
9+ // older Firefox; both expose `inlineSize`/`blockSize`. Fall back to
10+ // `contentRect` when the entry doesn't carry border-box data.
11+ const boxSize = Array . isArray ( entry . borderBoxSize )
12+ ? entry . borderBoxSize [ 0 ]
13+ : ( entry . borderBoxSize as unknown as ResizeObserverSize | undefined )
14+
15+ if ( ! boxSize ) return entry . contentRect
16+
17+ // `contentRect` always reports visual width/height regardless of writing
18+ // mode; `inlineSize`/`blockSize` are logical, so flip them back for
19+ // vertical/sideways writing modes to keep the public shape consistent.
20+ const writingMode = getComputedStyle ( entry . target ) . writingMode
21+ const isVertical =
22+ writingMode . startsWith ( 'vertical-' ) || writingMode . startsWith ( 'sideways-' )
23+
24+ return isVertical
25+ ? { width : boxSize . blockSize , height : boxSize . inlineSize }
26+ : { width : boxSize . inlineSize , height : boxSize . blockSize }
27+ }
28+
729const handleObservation = ( entries : ResizeObserverEntry [ ] ) =>
8- entries . forEach ( ( { target, contentRect } ) => {
9- return resizeHandlers . get ( target ) ?. forEach ( handler => handler ( contentRect ) )
30+ entries . forEach ( entry => {
31+ return resizeHandlers
32+ . get ( entry . target )
33+ ?. forEach ( handler => handler ( getBorderBoxSize ( entry ) ) )
1034 } )
1135
1236export function resizeElement ( handler : OnResizeCallback , target : HTMLElement ) {
@@ -40,7 +64,7 @@ export function resizeElement(handler: OnResizeCallback, target: HTMLElement) {
4064 elementHandlers . add ( handler )
4165
4266 if ( observer ) {
43- observer . observe ( target )
67+ observer . observe ( target , { box : 'border-box' } )
4468 }
4569
4670 /**
0 commit comments