Skip to content

Commit bc2e4eb

Browse files
fix: animate primary drawer open and close transition (#6099) (#6102)
Co-authored-by: Serhii Kulykov <iamkulykov@gmail.com>
1 parent 0e2bc63 commit bc2e4eb

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

packages/app-layout/src/vaadin-app-layout.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,8 +459,13 @@ class AppLayout extends ElementMixin(ThemableMixin(ControllerMixin(PolymerElemen
459459

460460
this._navbarSizeObserver = new ResizeObserver(() => {
461461
requestAnimationFrame(() => {
462-
this._blockAnimationUntilAfterNextRender();
463-
this._updateOffsetSize();
462+
// Prevent updating offset size multiple times
463+
// during the drawer open / close transition.
464+
if (this.__isDrawerAnimating) {
465+
this.__updateOffsetSizePending = true;
466+
} else {
467+
this._updateOffsetSize();
468+
}
464469
});
465470
});
466471
this._navbarSizeObserver.observe(this.$.navbarTop);
@@ -474,6 +479,24 @@ class AppLayout extends ElementMixin(ThemableMixin(ControllerMixin(PolymerElemen
474479
super.ready();
475480
this.addController(this.__focusTrapController);
476481
this.__setAriaExpanded();
482+
483+
this.$.drawer.addEventListener('transitionstart', () => {
484+
this.__isDrawerAnimating = true;
485+
});
486+
487+
this.$.drawer.addEventListener('transitionend', () => {
488+
// Update offset size after drawer animation.
489+
if (this.__updateOffsetSizePending) {
490+
this.__updateOffsetSizePending = false;
491+
this._updateOffsetSize();
492+
}
493+
494+
// Delay resetting the flag until animation frame
495+
// to avoid updating offset size again on resize.
496+
requestAnimationFrame(() => {
497+
this.__isDrawerAnimating = false;
498+
});
499+
});
477500
}
478501

479502
/** @protected */

packages/app-layout/test/app-layout.test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,23 @@ describe('vaadin-app-layout', () => {
274274
layout.drawerOpened = true;
275275
expect(toggle.getAttribute('aria-expanded')).to.equal('true');
276276
});
277+
278+
it('should only update offset size once during the drawer transition', async () => {
279+
layout.primarySection = 'drawer';
280+
await onceResized(layout);
281+
await nextRender();
282+
283+
layout.style.setProperty('--vaadin-app-layout-transition', '100ms');
284+
285+
const spy = sinon.spy(layout, '_updateOffsetSize');
286+
toggle.click();
287+
await oneEvent(drawer, 'transitionend');
288+
289+
expect(spy.callCount).to.be.equal(1);
290+
await nextFrame();
291+
292+
expect(spy.callCount).to.be.equal(1);
293+
});
277294
});
278295

279296
describe('mobile layout', () => {

0 commit comments

Comments
 (0)