Skip to content

Commit 14ad0b3

Browse files
authored
UX: include custom headers in --header-offset (discourse#21059)
1 parent d2516f3 commit 14ad0b3

File tree

2 files changed

+39
-14
lines changed

2 files changed

+39
-14
lines changed

app/assets/javascripts/discourse/app/components/site-header.js

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Docking from "discourse/mixins/docking";
88
import MountWidget from "discourse/components/mount-widget";
99
import ItsATrap from "@discourse/itsatrap";
1010
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";
1212
import { topicTitleDecorators } from "discourse/components/topic-title";
1313
import { isTesting } from "discourse-common/config/environment";
1414
import { 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
},

app/assets/javascripts/discourse/tests/integration/components/site-header-test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ module("Integration | Component | site-header", function (hooks) {
6666
await render(hbs`<SiteHeader />`);
6767

6868
function getProperty() {
69-
return getComputedStyle(document.body).getPropertyValue(
69+
const rawValue = getComputedStyle(document.body).getPropertyValue(
7070
"--header-offset"
7171
);
72+
const roundedValue = Math.floor(parseFloat(rawValue));
73+
return roundedValue + "px";
7274
}
7375

7476
document.querySelector(".d-header").style.height = 90 + "px";

0 commit comments

Comments
 (0)