diff --git a/app/assets/javascripts/discourse/app/components/d-styles.gjs b/app/assets/javascripts/discourse/app/components/d-styles.gjs index c8e0085cb36..efc3cca12d9 100644 --- a/app/assets/javascripts/discourse/app/components/d-styles.gjs +++ b/app/assets/javascripts/discourse/app/components/d-styles.gjs @@ -5,6 +5,7 @@ import { getURLWithCDN } from "discourse/lib/get-url"; export default class DStyles extends Component { @service session; @service site; + @service interfaceColor; get categoryColors() { return [ @@ -17,7 +18,7 @@ export default class DStyles extends Component { } get categoryBackgrounds() { - const css = []; + let css = []; const darkCss = []; this.site.categories.forEach((category) => { @@ -45,7 +46,11 @@ export default class DStyles extends Component { }); if (darkCss.length > 0) { - css.push("@media (prefers-color-scheme: dark) {", ...darkCss, "}"); + if (this.interfaceColor.darkModeForced) { + css = darkCss; + } else if (!this.interfaceColor.lightModeForced) { + css.push("@media (prefers-color-scheme: dark) {", ...darkCss, "}"); + } } return css.join("\n"); diff --git a/app/assets/javascripts/discourse/app/components/header/icons.gjs b/app/assets/javascripts/discourse/app/components/header/icons.gjs index a49b61afc03..62cc9a735f9 100644 --- a/app/assets/javascripts/discourse/app/components/header/icons.gjs +++ b/app/assets/javascripts/discourse/app/components/header/icons.gjs @@ -2,6 +2,7 @@ import Component from "@glimmer/component"; import { action } from "@ember/object"; import { service } from "@ember/service"; import { eq } from "truth-helpers"; +import InterfaceColorSelector from "discourse/components/interface-color-selector"; import DAG from "discourse/lib/dag"; import getURL from "discourse/lib/get-url"; import Dropdown from "./dropdown"; @@ -15,6 +16,7 @@ function resetHeaderIcons() { headerIcons.add("search"); headerIcons.add("hamburger", undefined, { after: "search" }); headerIcons.add("user-menu", undefined, { after: "hamburger" }); + headerIcons.add("interface-color-selector", undefined, { before: "search" }); } export function headerIconsDAG() { @@ -32,6 +34,7 @@ export default class Icons extends Component { @service sidebarState; @service header; @service search; + @service interfaceColor; get showHamburger() { // NOTE: In this scenario, we are forcing the sidebar on admin users, @@ -98,6 +101,12 @@ export default class Icons extends Component { @toggleUserMenu={{@toggleUserMenu}} /> {{/if}} + {{else if (eq entry.key "interface-color-selector")}} + {{#if this.interfaceColor.selectorAvailableInHeader}} +
  • + +
  • + {{/if}} {{else if entry.value}} {{/if}} diff --git a/app/assets/javascripts/discourse/app/components/header/logo.gjs b/app/assets/javascripts/discourse/app/components/header/logo.gjs index f801a82e4de..86b07c0aa2d 100644 --- a/app/assets/javascripts/discourse/app/components/header/logo.gjs +++ b/app/assets/javascripts/discourse/app/components/header/logo.gjs @@ -1,10 +1,34 @@ +import Component from "@glimmer/component"; +import { service } from "@ember/service"; import { and, eq, notEq } from "truth-helpers"; import getURL from "discourse/lib/get-url"; -const Logo = +} diff --git a/app/assets/javascripts/discourse/app/components/interface-color-selector.gjs b/app/assets/javascripts/discourse/app/components/interface-color-selector.gjs new file mode 100644 index 00000000000..60733f8611d --- /dev/null +++ b/app/assets/javascripts/discourse/app/components/interface-color-selector.gjs @@ -0,0 +1,85 @@ +import Component from "@glimmer/component"; +import { fn } from "@ember/helper"; +import { action } from "@ember/object"; +import { service } from "@ember/service"; +import DButton from "discourse/components/d-button"; +import DropdownMenu from "discourse/components/dropdown-menu"; +import { i18n } from "discourse-i18n"; +import DMenu from "float-kit/components/d-menu"; + +export default class InterfaceColorSelector extends Component { + @service interfaceColor; + + get selectorIcon() { + if (this.interfaceColor.lightModeForced) { + return "sun"; + } else if (this.interfaceColor.darkModeForced) { + return "moon"; + } else { + return "circle-half-stroke"; + } + } + + @action + switchToLight(dMenu) { + this.interfaceColor.forceLightMode(); + dMenu.close(); + } + + @action + switchToDark(dMenu) { + this.interfaceColor.forceDarkMode(); + dMenu.close(); + } + + @action + switchToAuto(dMenu) { + this.interfaceColor.removeColorModeOverride(); + dMenu.close(); + } + + +} diff --git a/app/assets/javascripts/discourse/app/components/light-dark-img.gjs b/app/assets/javascripts/discourse/app/components/light-dark-img.gjs index ddfc16c0272..f405497c183 100644 --- a/app/assets/javascripts/discourse/app/components/light-dark-img.gjs +++ b/app/assets/javascripts/discourse/app/components/light-dark-img.gjs @@ -5,6 +5,7 @@ import { getURLWithCDN } from "discourse/lib/get-url"; export default class LightDarkImg extends Component { @service session; + @service interfaceColor; get isDarkImageAvailable() { return ( @@ -28,6 +29,16 @@ export default class LightDarkImg extends Component { return getURLWithCDN(this.args.darkImg.url); } + get darkMediaQuery() { + if (this.interfaceColor.darkModeForced) { + return "all"; + } else if (this.interfaceColor.lightModeForced) { + return "none"; + } else { + return "(prefers-color-scheme: dark)"; + } + } +