Skip to content

Commit 5f42eee

Browse files
glowcloudAllanOcelotebrannin-bw
authored
feat: add dark mode (#10653)
Closes #5327, #9964, #10089 --------- Co-authored-by: Allan <[email protected]> Co-authored-by: Ed Brannin (BW) <[email protected]>
1 parent 199761a commit 5f42eee

File tree

10 files changed

+791
-2
lines changed

10 files changed

+791
-2
lines changed

config/jest/jest.unit.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ module.exports = {
1616
'<rootDir>/test/unit/setup.js',
1717
],
1818
moduleNameMapper: {
19-
'^.+\\.svg$': 'jest-transform-stub'
19+
'^.+\\.svg$': 'jest-transform-stub',
20+
'^standalone/(.*)$': '<rootDir>/src/standalone/$1',
2021
},
2122
transformIgnorePatterns: ['/node_modules/(?!(sinon|react-syntax-highlighter|@asamuzakjp/css-color)/)'],
2223
silent: true, // set to `false` to allow console.* calls to be printed
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* @prettier
3+
*/
4+
import React, { Component } from "react"
5+
6+
import LightBulb from "../assets/lightbulb.svg"
7+
import LightBulbOff from "../assets/lightbulb-off.svg"
8+
9+
class DarkModeToggle extends Component {
10+
constructor(props) {
11+
super(props)
12+
this.state = {
13+
isDarkMode: false,
14+
}
15+
this.toggleIsDarkMode = this.toggleIsDarkMode.bind(this)
16+
}
17+
18+
componentDidMount() {
19+
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
20+
document.documentElement.classList.add("dark-mode")
21+
this.setState({ isDarkMode: true })
22+
}
23+
}
24+
25+
toggleIsDarkMode() {
26+
document.documentElement.classList.toggle("dark-mode")
27+
this.setState((prevState) => ({ isDarkMode: !prevState.isDarkMode }))
28+
}
29+
30+
render() {
31+
const { isDarkMode } = this.state
32+
33+
return (
34+
<div className="dark-mode-toggle">
35+
<button onClick={this.toggleIsDarkMode}>
36+
{!isDarkMode ? (
37+
<LightBulbOff height="24" />
38+
) : (
39+
<LightBulb height="24" />
40+
)}
41+
</button>
42+
</div>
43+
)
44+
}
45+
}
46+
47+
export default DarkModeToggle

src/standalone/plugins/top-bar/components/TopBar.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class TopBar extends React.Component {
113113
const Button = getComponent("Button")
114114
const Link = getComponent("Link")
115115
const Logo = getComponent("Logo")
116+
const DarkModeToggle = getComponent("DarkModeToggle")
116117

117118
let isLoading = specSelectors.loadingStatus() === "loading"
118119
let isFailed = specSelectors.loadingStatus() === "failed"
@@ -164,6 +165,7 @@ class TopBar extends React.Component {
164165
<form className="download-url-wrapper" onSubmit={formOnSubmit}>
165166
{control.map((el, i) => cloneElement(el, { key: i }))}
166167
</form>
168+
<DarkModeToggle />
167169
</div>
168170
</div>
169171
</div>

src/standalone/plugins/top-bar/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
*/
44
import TopBar from "./components/TopBar"
55
import Logo from "./components/Logo"
6+
import DarkModeToggle from "./components/DarkModeToggle"
67

78
const TopBarPlugin = () => ({
8-
components: { Topbar: TopBar, Logo },
9+
components: { Topbar: TopBar, Logo, DarkModeToggle },
910
})
1011

1112
export default TopBarPlugin

0 commit comments

Comments
 (0)