Skip to content

Commit b7e5c2b

Browse files
committed
🌙 Dark Mode Added
1 parent 1bfe874 commit b7e5c2b

7 files changed

+73
-20
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "markdown-editor",
3-
"version": "1.6.4",
3+
"version": "1.7.0",
44
"description": "A react app to preview and edit Markdown",
55
"private": true,
66
"author": {

src/App.scss

+24-5
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ body {
1616
--body-accent-color: #e1e4e8;
1717
--alternate-table-color: #eaecef;
1818
--primary-text-color: #24292e;
19+
--link-color:var(--primary-color);
1920
--table-border-color: #ddd;
2021
--source-code-font: "Source Code Pro", monospace;
2122
--open-sans-font: "Open Sans", sans-serif;
23+
--color-transition : .5s ease;
2224
background-color: var(--body-color);
25+
transition: background-color var(--color-transition);
2326
margin: 0;
2427
color: var(--primary-text-color);
2528
font-family: var(--open-sans-font);
@@ -45,6 +48,7 @@ body {
4548
border-radius: 0.2rem;
4649
color: var(--nav-item-color);
4750
background-color: var(--primary-color);
51+
transition: color,background-color var(--color-transition);
4852
border: none;
4953
transition: filter 200ms ease;
5054
margin: 0 0.5rem;
@@ -60,15 +64,18 @@ body {
6064
.navbar {
6165
margin: 0;
6266
background-color: var(--primary-color);
67+
transition: background-color var(--color-transition);
6368
color: var(--nav-item-color);
6469
height: 3.75rem;
6570
padding-left: 1.5rem;
6671
padding-right: 1.5rem;
6772
display: flex;
6873
align-items: center;
6974
justify-content: space-between;
70-
.title {
75+
*{
7176
user-select: none;
77+
}
78+
.title {
7279
margin: 0;
7380
line-height: 30px;
7481
display: flex;
@@ -103,8 +110,7 @@ body {
103110
width: 2rem;
104111
height: 2rem;
105112
border-radius: 50%;
106-
border: 0.18rem solid white;
107-
background-color: var(--primary-color);
113+
border: 0.15rem solid white;
108114
display: flex;
109115
align-items: center;
110116
justify-content: center;
@@ -122,6 +128,7 @@ body {
122128
width: 15.625rem;
123129
height: 18.75rem;
124130
background-color: var(--primary-color);
131+
transition: background-color,border var(--color-transition);
125132
border: 0.1rem solid var(--accent-color);
126133
padding: 1rem 1.5rem;
127134
border-radius: 0.6rem;
@@ -134,6 +141,9 @@ body {
134141
padding-bottom: 1rem;
135142
border-bottom: 0.1rem solid var(--accent-color);
136143
}
144+
h4{
145+
margin-bottom: 0em;
146+
}
137147
}
138148
.theme-btn {
139149
display: flex;
@@ -188,9 +198,9 @@ body {
188198
height: 2.5rem;
189199
width: 100%;
190200
background-color: var(--accent-color);
201+
transition: background-color var(--color-transition);
191202
color: var(--nav-section-text-color);
192203
text-transform: uppercase;
193-
user-select: none;
194204
h3 {
195205
font-weight: 600;
196206
margin: 0;
@@ -210,6 +220,7 @@ body {
210220
color: var(--primary-text-color);
211221
border: none;
212222
background-color: var(--body-color);
223+
transition: background-color var(--color-transition);
213224
font-size: 1rem;
214225
font-weight: 400;
215226
margin-top: 2rem;
@@ -227,6 +238,7 @@ body {
227238
width: 100%;
228239
.html-div {
229240
background-color: var(--body-color);
241+
transition: background-color var(--color-transition);
230242
margin-top: 2rem;
231243
overflow-y: scroll;
232244
}
@@ -246,7 +258,7 @@ body {
246258
line-height: 1.5;
247259
}
248260
a {
249-
color: var(--primary-color);
261+
color: var(--link-color);
250262
&:hover {
251263
filter: brightness(1.2);
252264
}
@@ -256,6 +268,7 @@ body {
256268
height: 0.187rem;
257269
margin: 1.5rem 0;
258270
background-color: var(--body-accent-color);
271+
transition: background-color var(--color-transition);
259272
}
260273
pre {
261274
padding: 1rem;
@@ -273,6 +286,7 @@ body {
273286
}
274287
blockquote {
275288
border-left: 0.312em solid var(--body-accent-color);
289+
transition: border-color var(--color-transition);
276290
padding-left: 1rem;
277291
}
278292
img {
@@ -283,12 +297,14 @@ body {
283297
line-height: 1.33;
284298
padding-bottom: 0.3em;
285299
border-bottom: 1px solid var(--body-accent-color);
300+
transition: border-color var(--color-transition);
286301
}
287302
h2 {
288303
margin: 1.5rem 0 1rem;
289304
line-height: 1.33;
290305
padding-bottom: 0.3em;
291306
border-bottom: 1px solid var(--body-accent-color);
307+
transition: border-color var(--color-transition);
292308
}
293309
h3 {
294310
margin: 1.5rem 0 1rem;
@@ -306,17 +322,20 @@ body {
306322
th,
307323
td {
308324
border: 0.08rem solid var(--table-border-color);
325+
transition: border-color var(--color-transition);
309326
text-align: left;
310327
text-align: center;
311328
padding: 0.5rem 1.25rem;
312329
}
313330

314331
tr:nth-child(even) {
315332
background-color: var(--alternate-table-color);
333+
transition: background-color var(--color-transition);
316334
}
317335

318336
th {
319337
background-color: var(--primary-color);
338+
transition: background-color var(--color-transition);
320339
color: white;
321340
}
322341
summary:focus{

src/components/DarkModeToggle.jsx

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import React, { useEffect } from "react";
2+
import Switch from "@material-ui/core/Switch";
3+
import useLocalStorage from "../hooks/useLocalStorage";
4+
5+
function DarkModeToggle() {
6+
const [darkMode, setDarkMode] = useLocalStorage("darkMode", false);
7+
8+
useEffect(() => {
9+
if (darkMode) {
10+
document.body.classList.add("dark");
11+
} else {
12+
document.body.classList.remove("dark");
13+
}
14+
}, [darkMode]);
15+
16+
const handleSwitchToggle = (e) => {
17+
setDarkMode(e.target.checked);
18+
};
19+
20+
return (
21+
<>
22+
<h4>Dark Mode</h4>
23+
<Switch checked={darkMode} onChange={handleSwitchToggle} />
24+
</>
25+
);
26+
}
27+
28+
export default DarkModeToggle;

src/components/MarkdownPreview.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React, { useState, useEffect } from "react";
22
import * as marked from "marked";
33
import Prism from 'prismjs';
4-
import '../styles/github.css';
54
import '../utils/prism-imports';
5+
//css for Prism is imported in ThemeSelector
66

77
function MarkdownPreview({ content }) {
88
const [html, setHtml] = useState(getHtml(content));

src/components/ThemeSelector.jsx

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
import React, { useEffect, useRef } from "react";
22
import themeData from "../data/theme";
33
import tickIcon from "../icons/tick.svg";
4+
import DarkModeToggle from "./DarkModeToggle";
5+
6+
require("prismjs/themes/prism-okaidia.css");
47

58
function ThemeSelector({ isVisible, setVisible, activeTheme, setActiveTheme }) {
9+
610
const themeSelectorRef = useRef(null);
711

812
const handleThemeButtonClick = (theme) => {
9-
setVisible(false);
1013
setActiveTheme(theme);
1114
};
1215

1316
useEffect(() => {
1417
const hideDropDown = (e) => {
1518
if (
1619
themeSelectorRef.current &&
20+
!themeSelectorRef.current.parentElement.contains(e.target) &&
1721
!themeSelectorRef.current.contains(e.target)
1822
) {
1923
setVisible(false);
@@ -23,7 +27,7 @@ function ThemeSelector({ isVisible, setVisible, activeTheme, setActiveTheme }) {
2327
return () => {
2428
document.removeEventListener("click", hideDropDown);
2529
};
26-
}, [themeSelectorRef, setVisible]);
30+
}, [themeSelectorRef]);
2731

2832
const themeButtons = themeData.map((theme) => {
2933
return (
@@ -39,13 +43,16 @@ function ThemeSelector({ isVisible, setVisible, activeTheme, setActiveTheme }) {
3943
);
4044
});
4145

42-
return isVisible ? (
43-
<div className="all-theme-wrapper" ref={themeSelectorRef}>
46+
return (
47+
48+
<div
49+
className="all-theme-wrapper"
50+
ref={themeSelectorRef}
51+
style={{ display: isVisible ? "block" : "none" }}>
4452
<h3>Change Theme</h3>
4553
<div className="theme-btn">{themeButtons}</div>
54+
<DarkModeToggle />
4655
</div>
47-
) : (
48-
<></>
4956
);
5057
}
5158

src/components/ThemeToggle.jsx

+2-5
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,21 @@ function ThemeToggle() {
2121
<div className="theme-icon" onClick={handleToggleClick}>
2222
<img src={themeIcon} alt="Theme Icon" />
2323
</div>
24-
{dropDownVisible && (
2524
<ThemeSelector
2625
isVisible={dropDownVisible}
2726
setVisible={setDropDownVisible}
2827
activeTheme={activeTheme}
2928
setActiveTheme={setActiveTheme}
3029
/>
31-
)}
3230
</div>
3331
);
3432
}
3533

3634
const changeTheme = (theme) => {
3735
document.body.style.setProperty("--primary-color", theme.primaryColor);
3836
document.body.style.setProperty("--accent-color", theme.accentColor);
39-
if (theme.textColor) {
40-
document.body.style.setProperty("--text-color", theme.textColor);
41-
}
37+
document.body.style.setProperty("--link-color", theme.linkColor ? theme.linkColor : theme.primaryColor);
38+
theme.textColor && document.body.style.setProperty("--nav-section-text-color", theme.textColor);
4239
};
4340

4441
export default ThemeToggle;

src/data/theme.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ const themeData = [
99
name: "Dessert",
1010
primaryColor: "#46211a",
1111
accentColor: "#693d3d",
12-
textColor: "#e0e0e0"
12+
textColor: "#eaecef",
13+
linkColor:"#693d3d"
1314
}, {
1415
name: "Red",
1516
primaryColor: "#f44336",
@@ -40,7 +41,8 @@ const themeData = [
4041
name: "Github",
4142
primaryColor: "#24292E",
4243
accentColor: "#3F4448",
43-
textColor: "#CFD0D1"
44+
textColor: "#CFD0D1",
45+
linkColor:"#eaecef"
4446
},{
4547
name: "lightGreen",
4648
primaryColor: "#4caf50",

0 commit comments

Comments
 (0)