Skip to content
This repository was archived by the owner on Feb 7, 2025. It is now read-only.

Commit ff16d80

Browse files
committed
FIX: Render the correct logo for the active scheme when logo is minimized
1 parent 2da8ecc commit ff16d80

File tree

3 files changed

+112
-11
lines changed

3 files changed

+112
-11
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import Component from "@glimmer/component";
2+
import { action } from "@ember/object";
3+
import didUpdate from "@ember/render-modifiers/modifiers/did-update";
4+
import { service } from "@ember/service";
5+
import {
6+
changeHomeLogo,
7+
COLOR_SCHEME_OVERRIDE_KEY,
8+
} from "../../lib/color-scheme-override";
9+
10+
export default class MinimizedHook extends Component {
11+
@service keyValueStore;
12+
13+
@action
14+
onMinimizedChange() {
15+
const storedOverride = this.keyValueStore.getItem(
16+
COLOR_SCHEME_OVERRIDE_KEY
17+
);
18+
if (storedOverride) {
19+
changeHomeLogo(storedOverride);
20+
}
21+
}
22+
23+
<template>
24+
<span
25+
class="hidden color-toggler-minimized-hook"
26+
{{didUpdate this.onMinimizedChange @outletArgs.minimized}}
27+
/>
28+
</template>
29+
}

javascripts/discourse/lib/color-scheme-override.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,18 @@ export function colorSchemeOverride(type) {
1010
return;
1111
}
1212

13-
const logoDarkSrc = document.querySelector(".title picture source");
14-
1513
switch (type) {
1614
case "dark":
1715
lightScheme.origMedia = lightScheme.media;
1816
lightScheme.media = "none";
1917
darkScheme.origMedia = darkScheme.media;
2018
darkScheme.media = "all";
21-
if (logoDarkSrc) {
22-
logoDarkSrc.origMedia = logoDarkSrc.media;
23-
logoDarkSrc.media = "all";
24-
}
2519
break;
2620
case "light":
2721
lightScheme.origMedia = lightScheme.media;
2822
lightScheme.media = "all";
2923
darkScheme.origMedia = darkScheme.media;
3024
darkScheme.media = "none";
31-
if (logoDarkSrc) {
32-
logoDarkSrc.origMedia = logoDarkSrc.media;
33-
logoDarkSrc.media = "none";
34-
}
3525
break;
3626
default:
3727
if (lightScheme.origMedia) {
@@ -42,7 +32,29 @@ export function colorSchemeOverride(type) {
4232
darkScheme.media = darkScheme.origMedia;
4333
darkScheme.removeAttribute("origMedia");
4434
}
45-
if (logoDarkSrc?.origMedia) {
35+
break;
36+
}
37+
changeHomeLogo(type);
38+
}
39+
40+
export function changeHomeLogo(type) {
41+
const logoDarkSrc = document.querySelector(".title picture source");
42+
43+
if (!logoDarkSrc) {
44+
return;
45+
}
46+
47+
switch (type) {
48+
case "dark":
49+
logoDarkSrc.origMedia = logoDarkSrc.media;
50+
logoDarkSrc.media = "all";
51+
break;
52+
case "light":
53+
logoDarkSrc.origMedia = logoDarkSrc.media;
54+
logoDarkSrc.media = "none";
55+
break;
56+
default:
57+
if (logoDarkSrc.origMedia) {
4658
logoDarkSrc.media = logoDarkSrc.origMedia;
4759
}
4860
break;
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# frozen_string_literal: true
2+
3+
RSpec.describe "", system: true do
4+
fab!(:topic) { Fabricate(:post).topic }
5+
fab!(:user)
6+
fab!(:post) { Fabricate(:post, topic:, raw: <<~POST * 20) }
7+
Very lengthy post with lots of height for testing logo change when scrolling
8+
9+
Here's another paragraph to make the post take very large vertical space\n
10+
POST
11+
12+
fab!(:dark_mode_image) { Fabricate(:image_upload, color: "white", width: 400, height: 120) }
13+
fab!(:light_mode_image) { Fabricate(:image_upload, color: "black", width: 400, height: 120) }
14+
15+
fab!(:small_dark_mode_image) { Fabricate(:image_upload, color: "white", width: 120, height: 120) }
16+
fab!(:small_light_mode_image) do
17+
Fabricate(:image_upload, color: "black", width: 120, height: 120)
18+
end
19+
20+
let!(:theme_component) { upload_theme_component }
21+
22+
let(:topic_page) { PageObjects::Pages::Topic.new }
23+
24+
before do
25+
SiteSetting.logo = light_mode_image
26+
SiteSetting.logo_small = small_light_mode_image
27+
SiteSetting.logo_dark = dark_mode_image
28+
SiteSetting.logo_small_dark = small_dark_mode_image
29+
sign_in(user)
30+
end
31+
32+
it "applies the correct `media` attribute on the source element when the logo is minimized upon scrolling" do
33+
topic_page.visit_topic(topic)
34+
35+
dark_logo_source =
36+
find(
37+
".title picture source[media=\"(prefers-color-scheme: dark)\"][srcset*=\"#{dark_mode_image.url}\"]",
38+
visible: false,
39+
)
40+
expect(dark_logo_source).to be_present
41+
42+
find(".color-scheme-toggler").click
43+
44+
dark_logo_source =
45+
find(
46+
".title picture source[media=\"all\"][srcset*=\"#{dark_mode_image.url}\"]",
47+
visible: false,
48+
)
49+
expect(dark_logo_source).to be_present
50+
51+
page.scroll_to(find(".topic-footer-main-buttons .create"))
52+
53+
dark_logo_source =
54+
find(
55+
".title picture source[media=\"all\"][srcset*=\"#{small_dark_mode_image.url}\"]",
56+
visible: false,
57+
)
58+
expect(dark_logo_source).to be_present
59+
end
60+
end

0 commit comments

Comments
 (0)