@@ -8,7 +8,7 @@ import Docking from "discourse/mixins/docking";
88import MountWidget from "discourse/components/mount-widget" ;
99import ItsATrap from "@discourse/itsatrap" ;
1010import RerenderOnDoNotDisturbChange from "discourse/mixins/rerender-on-do-not-disturb-change" ;
11- import { observes } from "discourse-common/utils/decorators" ;
11+ import { bind , observes } from "discourse-common/utils/decorators" ;
1212import { topicTitleDecorators } from "discourse/components/topic-title" ;
1313import { isTesting } from "discourse-common/config/environment" ;
1414import { DEBUG } from "@glimmer/env" ;
@@ -425,46 +425,69 @@ export default SiteHeaderComponent.extend({
425425
426426 init ( ) {
427427 this . _super ( ...arguments ) ;
428-
429428 this . _resizeObserver = null ;
430429 } ,
431430
431+ @bind
432+ updateHeaderOffset ( ) {
433+ let headerWrapTop = this . headerWrap . getBoundingClientRect ( ) . top ;
434+
435+ if ( DEBUG && isTesting ( ) ) {
436+ headerWrapTop -= document
437+ . getElementById ( "ember-testing-container" )
438+ . getBoundingClientRect ( ) . top ;
439+
440+ headerWrapTop -= 1 ; // For 1px border on testing container
441+ }
442+
443+ const documentStyle = document . documentElement . style ;
444+
445+ const currentValue = documentStyle . getPropertyValue ( "--header-offset" ) ;
446+ const newValue = `${ this . headerWrap . offsetHeight + headerWrapTop } px` ;
447+
448+ if ( currentValue !== newValue ) {
449+ documentStyle . setProperty ( "--header-offset" , newValue ) ;
450+ }
451+ } ,
452+
453+ @bind
454+ onScroll ( ) {
455+ schedule ( "afterRender" , this . updateHeaderOffset ) ;
456+ } ,
457+
432458 didInsertElement ( ) {
433459 this . _super ( ...arguments ) ;
434460
435461 this . appEvents . on ( "site-header:force-refresh" , this , "queueRerender" ) ;
436462
437463 this . headerWrap = document . querySelector ( ".d-header-wrap" ) ;
464+
438465 if ( this . headerWrap ) {
439466 schedule ( "afterRender" , ( ) => {
440467 this . header = this . headerWrap . querySelector ( "header.d-header" ) ;
441- const headerOffset = this . headerWrap . offsetHeight ;
468+ this . updateHeaderOffset ( ) ;
442469 const headerTop = this . header . offsetTop ;
443- document . documentElement . style . setProperty (
444- "--header-offset" ,
445- `${ headerOffset } px`
446- ) ;
447470 document . documentElement . style . setProperty (
448471 "--header-top" ,
449472 `${ headerTop } px`
450473 ) ;
451474 } ) ;
475+
476+ window . addEventListener ( "scroll" , this . onScroll , {
477+ passive : true ,
478+ } ) ;
452479 }
453480
454481 if ( "ResizeObserver" in window ) {
455482 this . _resizeObserver = new ResizeObserver ( ( entries ) => {
456483 for ( let entry of entries ) {
457484 if ( entry . contentRect ) {
458- const headerOffset = entry . contentRect . height ;
459485 const headerTop = this . header . offsetTop ;
460- document . documentElement . style . setProperty (
461- "--header-offset" ,
462- `${ headerOffset } px`
463- ) ;
464486 document . documentElement . style . setProperty (
465487 "--header-top" ,
466488 `${ headerTop } px`
467489 ) ;
490+ this . updateHeaderOffset ( ) ;
468491 }
469492 }
470493 } ) ;
@@ -475,7 +498,7 @@ export default SiteHeaderComponent.extend({
475498
476499 willDestroyElement ( ) {
477500 this . _super ( ...arguments ) ;
478-
501+ window . removeEventListener ( "scroll" , this . onScroll ) ;
479502 this . _resizeObserver ?. disconnect ( ) ;
480503 this . appEvents . off ( "site-header:force-refresh" , this , "queueRerender" ) ;
481504 } ,
0 commit comments