@@ -8,7 +8,7 @@ import Docking from "discourse/mixins/docking";
8
8
import MountWidget from "discourse/components/mount-widget" ;
9
9
import ItsATrap from "@discourse/itsatrap" ;
10
10
import 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" ;
12
12
import { topicTitleDecorators } from "discourse/components/topic-title" ;
13
13
import { isTesting } from "discourse-common/config/environment" ;
14
14
import { DEBUG } from "@glimmer/env" ;
@@ -425,46 +425,69 @@ export default SiteHeaderComponent.extend({
425
425
426
426
init ( ) {
427
427
this . _super ( ...arguments ) ;
428
-
429
428
this . _resizeObserver = null ;
430
429
} ,
431
430
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
+
432
458
didInsertElement ( ) {
433
459
this . _super ( ...arguments ) ;
434
460
435
461
this . appEvents . on ( "site-header:force-refresh" , this , "queueRerender" ) ;
436
462
437
463
this . headerWrap = document . querySelector ( ".d-header-wrap" ) ;
464
+
438
465
if ( this . headerWrap ) {
439
466
schedule ( "afterRender" , ( ) => {
440
467
this . header = this . headerWrap . querySelector ( "header.d-header" ) ;
441
- const headerOffset = this . headerWrap . offsetHeight ;
468
+ this . updateHeaderOffset ( ) ;
442
469
const headerTop = this . header . offsetTop ;
443
- document . documentElement . style . setProperty (
444
- "--header-offset" ,
445
- `${ headerOffset } px`
446
- ) ;
447
470
document . documentElement . style . setProperty (
448
471
"--header-top" ,
449
472
`${ headerTop } px`
450
473
) ;
451
474
} ) ;
475
+
476
+ window . addEventListener ( "scroll" , this . onScroll , {
477
+ passive : true ,
478
+ } ) ;
452
479
}
453
480
454
481
if ( "ResizeObserver" in window ) {
455
482
this . _resizeObserver = new ResizeObserver ( ( entries ) => {
456
483
for ( let entry of entries ) {
457
484
if ( entry . contentRect ) {
458
- const headerOffset = entry . contentRect . height ;
459
485
const headerTop = this . header . offsetTop ;
460
- document . documentElement . style . setProperty (
461
- "--header-offset" ,
462
- `${ headerOffset } px`
463
- ) ;
464
486
document . documentElement . style . setProperty (
465
487
"--header-top" ,
466
488
`${ headerTop } px`
467
489
) ;
490
+ this . updateHeaderOffset ( ) ;
468
491
}
469
492
}
470
493
} ) ;
@@ -475,7 +498,7 @@ export default SiteHeaderComponent.extend({
475
498
476
499
willDestroyElement ( ) {
477
500
this . _super ( ...arguments ) ;
478
-
501
+ window . removeEventListener ( "scroll" , this . onScroll ) ;
479
502
this . _resizeObserver ?. disconnect ( ) ;
480
503
this . appEvents . off ( "site-header:force-refresh" , this , "queueRerender" ) ;
481
504
} ,
0 commit comments